libxml2-2.9.1+dfsg1/0000755000175000017500000000000012154657262012566 5ustar aronaronlibxml2-2.9.1+dfsg1/testSAX.c0000644000175000017500000006571612113312343014263 0ustar aronaron/* * testSAX.c : a small tester program for parsing using the SAX API. * * See Copyright for the status of this software. * * daniel@veillard.com */ #include "libxml.h" #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_TIMEB_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef LIBXML_SAX1_ENABLED #include #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include #include #include #include /* only for xmlNewInputFromFile() */ #include #include #include static int debug = 0; static int copy = 0; static int recovery = 0; static int push = 0; static int speed = 0; static int noent = 0; static int quiet = 0; static int nonull = 0; static int sax2 = 0; static int repeat = 0; static int callbacks = 0; static int timing = 0; /* * Timing routines. */ /* * Internal timing routines to remove the necessity to have unix-specific * function calls */ #ifndef HAVE_GETTIMEOFDAY #ifdef HAVE_SYS_TIMEB_H #ifdef HAVE_SYS_TIME_H #ifdef HAVE_FTIME static int my_gettimeofday(struct timeval *tvp, void *tzp) { struct timeb timebuffer; ftime(&timebuffer); if (tvp) { tvp->tv_sec = timebuffer.time; tvp->tv_usec = timebuffer.millitm * 1000L; } return (0); } #define HAVE_GETTIMEOFDAY 1 #define gettimeofday my_gettimeofday #endif /* HAVE_FTIME */ #endif /* HAVE_SYS_TIME_H */ #endif /* HAVE_SYS_TIMEB_H */ #endif /* !HAVE_GETTIMEOFDAY */ #if defined(HAVE_GETTIMEOFDAY) static struct timeval begin, end; /* * startTimer: call where you want to start timing */ static void startTimer(void) { gettimeofday(&begin, NULL); } /* * endTimer: call where you want to stop timing and to print out a * message about the timing performed; format is a printf * type argument */ static void XMLCDECL endTimer(const char *fmt, ...) { long msec; va_list ap; gettimeofday(&end, NULL); msec = end.tv_sec - begin.tv_sec; msec *= 1000; msec += (end.tv_usec - begin.tv_usec) / 1000; #ifndef HAVE_STDARG_H #error "endTimer required stdarg functions" #endif va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, " took %ld ms\n", msec); } #elif defined(HAVE_TIME_H) /* * No gettimeofday function, so we have to make do with calling clock. * This is obviously less accurate, but there's little we can do about * that. */ #ifndef CLOCKS_PER_SEC #define CLOCKS_PER_SEC 100 #endif static clock_t begin, end; static void startTimer(void) { begin = clock(); } static void XMLCDECL endTimer(const char *fmt, ...) { long msec; va_list ap; end = clock(); msec = ((end - begin) * 1000) / CLOCKS_PER_SEC; #ifndef HAVE_STDARG_H #error "endTimer required stdarg functions" #endif va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, " took %ld ms\n", msec); } #else /* * We don't have a gettimeofday or time.h, so we just don't do timing */ static void startTimer(void) { /* * Do nothing */ } static void XMLCDECL endTimer(char *format, ...) { /* * We cannot do anything because we don't have a timing function */ #ifdef HAVE_STDARG_H va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); fprintf(stderr, " was not timed\n", msec); #else /* We don't have gettimeofday, time or stdarg.h, what crazy world is * this ?! */ #endif } #endif /* * empty SAX block */ static xmlSAXHandler emptySAXHandlerStruct = { NULL, /* internalSubset */ NULL, /* isStandalone */ NULL, /* hasInternalSubset */ NULL, /* hasExternalSubset */ NULL, /* resolveEntity */ NULL, /* getEntity */ NULL, /* entityDecl */ NULL, /* notationDecl */ NULL, /* attributeDecl */ NULL, /* elementDecl */ NULL, /* unparsedEntityDecl */ NULL, /* setDocumentLocator */ NULL, /* startDocument */ NULL, /* endDocument */ NULL, /* startElement */ NULL, /* endElement */ NULL, /* reference */ NULL, /* characters */ NULL, /* ignorableWhitespace */ NULL, /* processingInstruction */ NULL, /* comment */ NULL, /* xmlParserWarning */ NULL, /* xmlParserError */ NULL, /* xmlParserError */ NULL, /* getParameterEntity */ NULL, /* cdataBlock; */ NULL, /* externalSubset; */ 1, NULL, NULL, /* startElementNs */ NULL, /* endElementNs */ NULL /* xmlStructuredErrorFunc */ }; static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct; extern xmlSAXHandlerPtr debugSAXHandler; /************************************************************************ * * * Debug Handlers * * * ************************************************************************/ /** * isStandaloneDebug: * @ctxt: An XML parser context * * Is this document tagged standalone ? * * Returns 1 if true */ static int isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED) { callbacks++; if (quiet) return(0); fprintf(stdout, "SAX.isStandalone()\n"); return(0); } /** * hasInternalSubsetDebug: * @ctxt: An XML parser context * * Does this document has an internal subset * * Returns 1 if true */ static int hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) { callbacks++; if (quiet) return(0); fprintf(stdout, "SAX.hasInternalSubset()\n"); return(0); } /** * hasExternalSubsetDebug: * @ctxt: An XML parser context * * Does this document has an external subset * * Returns 1 if true */ static int hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) { callbacks++; if (quiet) return(0); fprintf(stdout, "SAX.hasExternalSubset()\n"); return(0); } /** * internalSubsetDebug: * @ctxt: An XML parser context * * Does this document has an internal subset */ static void internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.internalSubset(%s,", name); if (ExternalID == NULL) fprintf(stdout, " ,"); else fprintf(stdout, " %s,", ExternalID); if (SystemID == NULL) fprintf(stdout, " )\n"); else fprintf(stdout, " %s)\n", SystemID); } /** * externalSubsetDebug: * @ctxt: An XML parser context * * Does this document has an external subset */ static void externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.externalSubset(%s,", name); if (ExternalID == NULL) fprintf(stdout, " ,"); else fprintf(stdout, " %s,", ExternalID); if (SystemID == NULL) fprintf(stdout, " )\n"); else fprintf(stdout, " %s)\n", SystemID); } /** * resolveEntityDebug: * @ctxt: An XML parser context * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * Special entity resolver, better left to the parser, it has * more context than the application layer. * The default behaviour is to NOT resolve the entities, in that case * the ENTITY_REF nodes are built in the structure (and the parameter * values). * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */ static xmlParserInputPtr resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId) { callbacks++; if (quiet) return(NULL); /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ fprintf(stdout, "SAX.resolveEntity("); if (publicId != NULL) fprintf(stdout, "%s", (char *)publicId); else fprintf(stdout, " "); if (systemId != NULL) fprintf(stdout, ", %s)\n", (char *)systemId); else fprintf(stdout, ", )\n"); /********* if (systemId != NULL) { return(xmlNewInputFromFile(ctxt, (char *) systemId)); } *********/ return(NULL); } /** * getEntityDebug: * @ctxt: An XML parser context * @name: The entity name * * Get an entity by name * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */ static xmlEntityPtr getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) { callbacks++; if (quiet) return(NULL); fprintf(stdout, "SAX.getEntity(%s)\n", name); return(NULL); } /** * getParameterEntityDebug: * @ctxt: An XML parser context * @name: The entity name * * Get a parameter entity by name * * Returns the xmlParserInputPtr */ static xmlEntityPtr getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) { callbacks++; if (quiet) return(NULL); fprintf(stdout, "SAX.getParameterEntity(%s)\n", name); return(NULL); } /** * entityDeclDebug: * @ctxt: An XML parser context * @name: the entity name * @type: the entity type * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @content: the entity value (without processing). * * An entity definition has been parsed */ static void entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) { const xmlChar *nullstr = BAD_CAST "(null)"; /* not all libraries handle printing null pointers nicely */ if (publicId == NULL) publicId = nullstr; if (systemId == NULL) systemId = nullstr; if (content == NULL) content = (xmlChar *)nullstr; callbacks++; if (quiet) return; fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n", name, type, publicId, systemId, content); } /** * attributeDeclDebug: * @ctxt: An XML parser context * @name: the attribute name * @type: the attribute type * * An attribute definition has been parsed */ static void attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem, const xmlChar * name, int type, int def, const xmlChar * defaultValue, xmlEnumerationPtr tree) { callbacks++; if (quiet) return; if (defaultValue == NULL) fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n", elem, name, type, def); else fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n", elem, name, type, def, defaultValue); xmlFreeEnumeration(tree); } /** * elementDeclDebug: * @ctxt: An XML parser context * @name: the element name * @type: the element type * @content: the element value (without processing). * * An element definition has been parsed */ static void elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, xmlElementContentPtr content ATTRIBUTE_UNUSED) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n", name, type); } /** * notationDeclDebug: * @ctxt: An XML parser context * @name: The name of the notation * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * What to do when a notation declaration has been parsed. */ static void notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n", (char *) name, (char *) publicId, (char *) systemId); } /** * unparsedEntityDeclDebug: * @ctxt: An XML parser context * @name: The name of the entity * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @notationName: the name of the notation * * What to do when an unparsed entity declaration is parsed */ static void unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName) { const xmlChar *nullstr = BAD_CAST "(null)"; if (publicId == NULL) publicId = nullstr; if (systemId == NULL) systemId = nullstr; if (notationName == NULL) notationName = nullstr; callbacks++; if (quiet) return; fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n", (char *) name, (char *) publicId, (char *) systemId, (char *) notationName); } /** * setDocumentLocatorDebug: * @ctxt: An XML parser context * @loc: A SAX Locator * * Receive the document locator at startup, actually xmlDefaultSAXLocator * Everything is available on the context, so this is useless in our case. */ static void setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.setDocumentLocator()\n"); } /** * startDocumentDebug: * @ctxt: An XML parser context * * called when the document start being processed. */ static void startDocumentDebug(void *ctx ATTRIBUTE_UNUSED) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.startDocument()\n"); } /** * endDocumentDebug: * @ctxt: An XML parser context * * called when the document end has been detected. */ static void endDocumentDebug(void *ctx ATTRIBUTE_UNUSED) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.endDocument()\n"); } /** * startElementDebug: * @ctxt: An XML parser context * @name: The element name * * called when an opening tag has been processed. */ static void startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) { int i; callbacks++; if (quiet) return; fprintf(stdout, "SAX.startElement(%s", (char *) name); if (atts != NULL) { for (i = 0;(atts[i] != NULL);i++) { fprintf(stdout, ", %s='", atts[i++]); if (atts[i] != NULL) fprintf(stdout, "%s'", atts[i]); } } fprintf(stdout, ")\n"); } /** * endElementDebug: * @ctxt: An XML parser context * @name: The element name * * called when the end of an element has been detected. */ static void endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) { callbacks++; if (quiet) return; fprintf(stdout, "SAX.endElement(%s)\n", (char *) name); } /** * charactersDebug: * @ctxt: An XML parser context * @ch: a xmlChar string * @len: the number of xmlChar * * receiving some chars from the parser. * Question: how much at a time ??? */ static void charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) { char output[40]; int i; callbacks++; if (quiet) return; for (i = 0;(i 0) { ctxt = xmlCreatePushParserCtxt(emptySAXHandler, NULL, chars, ret, filename); while ((ret = fread(chars, 1, 3, f)) > 0) { xmlParseChunk(ctxt, chars, ret, 0); } xmlParseChunk(ctxt, chars, 0, 1); xmlFreeParserCtxt(ctxt); } fclose(f); } else { xmlGenericError(xmlGenericErrorContext, "Cannot read file %s\n", filename); } } /* * Debug callback */ #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) f = fopen(filename, "rb"); #else f = fopen(filename, "r"); #endif if (f != NULL) { int ret; char chars[10]; xmlParserCtxtPtr ctxt; ret = fread(chars, 1, 4, f); if (ret > 0) { if (sax2) ctxt = xmlCreatePushParserCtxt(debugSAX2Handler, NULL, chars, ret, filename); else ctxt = xmlCreatePushParserCtxt(debugSAXHandler, NULL, chars, ret, filename); while ((ret = fread(chars, 1, 3, f)) > 0) { xmlParseChunk(ctxt, chars, ret, 0); } ret = xmlParseChunk(ctxt, chars, 0, 1); xmlFreeParserCtxt(ctxt); if (ret != 0) { fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", ret); } } fclose(f); } } else { #endif /* LIBXML_PUSH_ENABLED */ if (!speed) { /* * Empty callbacks for checking */ if ((!quiet) && (!nonull)) { res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename); if (res != 0) { fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res); } } /* * Debug callback */ callbacks = 0; if (repeat) { int i; for (i = 0;i < 99;i++) { if (sax2) res = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename); else res = xmlSAXUserParseFile(debugSAXHandler, NULL, filename); } } if (sax2) res = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename); else res = xmlSAXUserParseFile(debugSAXHandler, NULL, filename); if (res != 0) { fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res); } if (quiet) fprintf(stdout, "%d callbacks generated\n", callbacks); } else { /* * test 100x the SAX parse */ int i; for (i = 0; i<100;i++) res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename); if (res != 0) { fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res); } } #ifdef LIBXML_PUSH_ENABLED } #endif } int main(int argc, char **argv) { int i; int files = 0; LIBXML_TEST_VERSION /* be safe, plus calls xmlInitParser */ for (i = 1; i < argc ; i++) { if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) debug++; else if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy"))) copy++; else if ((!strcmp(argv[i], "-recover")) || (!strcmp(argv[i], "--recover"))) recovery++; else if ((!strcmp(argv[i], "-push")) || (!strcmp(argv[i], "--push"))) #ifdef LIBXML_PUSH_ENABLED push++; #else fprintf(stderr,"'push' not enabled in library - ignoring\n"); #endif /* LIBXML_PUSH_ENABLED */ else if ((!strcmp(argv[i], "-speed")) || (!strcmp(argv[i], "--speed"))) speed++; else if ((!strcmp(argv[i], "-timing")) || (!strcmp(argv[i], "--timing"))) { nonull++; timing++; quiet++; } else if ((!strcmp(argv[i], "-repeat")) || (!strcmp(argv[i], "--repeat"))) { repeat++; quiet++; } else if ((!strcmp(argv[i], "-noent")) || (!strcmp(argv[i], "--noent"))) noent++; else if ((!strcmp(argv[i], "-quiet")) || (!strcmp(argv[i], "--quiet"))) quiet++; else if ((!strcmp(argv[i], "-sax2")) || (!strcmp(argv[i], "--sax2"))) sax2++; else if ((!strcmp(argv[i], "-nonull")) || (!strcmp(argv[i], "--nonull"))) nonull++; } if (noent != 0) xmlSubstituteEntitiesDefault(1); for (i = 1; i < argc ; i++) { if (argv[i][0] != '-') { if (timing) { startTimer(); } parseAndPrintFile(argv[i]); if (timing) { endTimer("Parsing"); } files ++; } } xmlCleanupParser(); xmlMemoryDump(); return(0); } #else int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { printf("%s : SAX1 parsing support not compiled in\n", argv[0]); return(0); } #endif /* LIBXML_SAX1_ENABLED */ libxml2-2.9.1+dfsg1/xmlwriter.c0000644000175000017500000036434612113312344014767 0ustar aronaron /* * xmlwriter.c: XML text writer implementation * * For license and disclaimer see the license and disclaimer of * libxml2. * * alfred@mickautsch.de */ #define IN_LIBXML #include "libxml.h" #include #include #include #include #include #ifdef LIBXML_WRITER_ENABLED #include #include "buf.h" #include "enc.h" #include "save.h" #define B64LINELEN 72 #define B64CRLF "\r\n" /* * The following VA_COPY was coded following an example in * the Samba project. It may not be sufficient for some * esoteric implementations of va_list (i.e. it may need * something involving a memcpy) but (hopefully) will be * sufficient for libxml2. */ #ifndef VA_COPY #ifdef HAVE_VA_COPY #define VA_COPY(dest, src) va_copy(dest, src) #else #ifdef HAVE___VA_COPY #define VA_COPY(dest,src) __va_copy(dest, src) #else #define VA_COPY(dest,src) (dest) = (src) #endif #endif #endif /* * Types are kept private */ typedef enum { XML_TEXTWRITER_NONE = 0, XML_TEXTWRITER_NAME, XML_TEXTWRITER_ATTRIBUTE, XML_TEXTWRITER_TEXT, XML_TEXTWRITER_PI, XML_TEXTWRITER_PI_TEXT, XML_TEXTWRITER_CDATA, XML_TEXTWRITER_DTD, XML_TEXTWRITER_DTD_TEXT, XML_TEXTWRITER_DTD_ELEM, XML_TEXTWRITER_DTD_ELEM_TEXT, XML_TEXTWRITER_DTD_ATTL, XML_TEXTWRITER_DTD_ATTL_TEXT, XML_TEXTWRITER_DTD_ENTY, /* entity */ XML_TEXTWRITER_DTD_ENTY_TEXT, XML_TEXTWRITER_DTD_PENT, /* parameter entity */ XML_TEXTWRITER_COMMENT } xmlTextWriterState; typedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry; struct _xmlTextWriterStackEntry { xmlChar *name; xmlTextWriterState state; }; typedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry; struct _xmlTextWriterNsStackEntry { xmlChar *prefix; xmlChar *uri; xmlLinkPtr elem; }; struct _xmlTextWriter { xmlOutputBufferPtr out; /* output buffer */ xmlListPtr nodes; /* element name stack */ xmlListPtr nsstack; /* name spaces stack */ int level; int indent; /* enable indent */ int doindent; /* internal indent flag */ xmlChar *ichar; /* indent character */ char qchar; /* character used for quoting attribute values */ xmlParserCtxtPtr ctxt; int no_doc_free; xmlDocPtr doc; }; static void xmlFreeTextWriterStackEntry(xmlLinkPtr lk); static int xmlCmpTextWriterStackEntry(const void *data0, const void *data1); static int xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer); static void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk); static int xmlCmpTextWriterNsStackEntry(const void *data0, const void *data1); static int xmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len); static int xmlTextWriterCloseDocCallback(void *context); static xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr); static int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len, const unsigned char *data); static void xmlTextWriterStartDocumentCallback(void *ctx); static int xmlTextWriterWriteIndent(xmlTextWriterPtr writer); static int xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer, xmlTextWriterStackEntry * p); /** * xmlWriterErrMsg: * @ctxt: a writer context * @error: the error number * @msg: the error message * * Handle a writer error */ static void xmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error, const char *msg) { if (ctxt != NULL) { __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt, NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); } else { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); } } /** * xmlWriterErrMsgInt: * @ctxt: a writer context * @error: the error number * @msg: the error message * @val: an int * * Handle a writer error */ static void xmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error, const char *msg, int val) { if (ctxt != NULL) { __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt, NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val); } else { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val); } } /** * xmlNewTextWriter: * @out: an xmlOutputBufferPtr * * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr * NOTE: the @out parameter will be deallocated when the writer is closed * (if the call succeed.) * * Returns the new xmlTextWriterPtr or NULL in case of error */ xmlTextWriterPtr xmlNewTextWriter(xmlOutputBufferPtr out) { xmlTextWriterPtr ret; ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter)); if (ret == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlNewTextWriter : out of memory!\n"); return NULL; } memset(ret, 0, (size_t) sizeof(xmlTextWriter)); ret->nodes = xmlListCreate((xmlListDeallocator) xmlFreeTextWriterStackEntry, (xmlListDataCompare) xmlCmpTextWriterStackEntry); if (ret->nodes == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlNewTextWriter : out of memory!\n"); xmlFree(ret); return NULL; } ret->nsstack = xmlListCreate((xmlListDeallocator) xmlFreeTextWriterNsStackEntry, (xmlListDataCompare) xmlCmpTextWriterNsStackEntry); if (ret->nsstack == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlNewTextWriter : out of memory!\n"); xmlListDelete(ret->nodes); xmlFree(ret); return NULL; } ret->out = out; ret->ichar = xmlStrdup(BAD_CAST " "); ret->qchar = '"'; if (!ret->ichar) { xmlListDelete(ret->nodes); xmlListDelete(ret->nsstack); xmlFree(ret); xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlNewTextWriter : out of memory!\n"); return NULL; } ret->doc = xmlNewDoc(NULL); ret->no_doc_free = 0; return ret; } /** * xmlNewTextWriterFilename: * @uri: the URI of the resource for the output * @compression: compress the output? * * Create a new xmlNewTextWriter structure with @uri as output * * Returns the new xmlTextWriterPtr or NULL in case of error */ xmlTextWriterPtr xmlNewTextWriterFilename(const char *uri, int compression) { xmlTextWriterPtr ret; xmlOutputBufferPtr out; out = xmlOutputBufferCreateFilename(uri, NULL, compression); if (out == NULL) { xmlWriterErrMsg(NULL, XML_IO_EIO, "xmlNewTextWriterFilename : cannot open uri\n"); return NULL; } ret = xmlNewTextWriter(out); if (ret == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlNewTextWriterFilename : out of memory!\n"); xmlOutputBufferClose(out); return NULL; } ret->indent = 0; ret->doindent = 0; return ret; } /** * xmlNewTextWriterMemory: * @buf: xmlBufferPtr * @compression: compress the output? * * Create a new xmlNewTextWriter structure with @buf as output * TODO: handle compression * * Returns the new xmlTextWriterPtr or NULL in case of error */ xmlTextWriterPtr xmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED) { xmlTextWriterPtr ret; xmlOutputBufferPtr out; /*::todo handle compression */ out = xmlOutputBufferCreateBuffer(buf, NULL); if (out == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlNewTextWriterMemory : out of memory!\n"); return NULL; } ret = xmlNewTextWriter(out); if (ret == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlNewTextWriterMemory : out of memory!\n"); xmlOutputBufferClose(out); return NULL; } return ret; } /** * xmlNewTextWriterPushParser: * @ctxt: xmlParserCtxtPtr to hold the new XML document tree * @compression: compress the output? * * Create a new xmlNewTextWriter structure with @ctxt as output * NOTE: the @ctxt context will be freed with the resulting writer * (if the call succeeds). * TODO: handle compression * * Returns the new xmlTextWriterPtr or NULL in case of error */ xmlTextWriterPtr xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt, int compression ATTRIBUTE_UNUSED) { xmlTextWriterPtr ret; xmlOutputBufferPtr out; if (ctxt == NULL) { xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterPushParser : invalid context!\n"); return NULL; } out = xmlOutputBufferCreateIO((xmlOutputWriteCallback) xmlTextWriterWriteDocCallback, (xmlOutputCloseCallback) xmlTextWriterCloseDocCallback, (void *) ctxt, NULL); if (out == NULL) { xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n"); return NULL; } ret = xmlNewTextWriter(out); if (ret == NULL) { xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n"); xmlOutputBufferClose(out); return NULL; } ret->ctxt = ctxt; return ret; } /** * xmlNewTextWriterDoc: * @doc: address of a xmlDocPtr to hold the new XML document tree * @compression: compress the output? * * Create a new xmlNewTextWriter structure with @*doc as output * * Returns the new xmlTextWriterPtr or NULL in case of error */ xmlTextWriterPtr xmlNewTextWriterDoc(xmlDocPtr * doc, int compression) { xmlTextWriterPtr ret; xmlSAXHandler saxHandler; xmlParserCtxtPtr ctxt; memset(&saxHandler, '\0', sizeof(saxHandler)); xmlSAX2InitDefaultSAXHandler(&saxHandler, 1); saxHandler.startDocument = xmlTextWriterStartDocumentCallback; saxHandler.startElement = xmlSAX2StartElement; saxHandler.endElement = xmlSAX2EndElement; ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL); if (ctxt == NULL) { xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n"); return NULL; } /* * For some reason this seems to completely break if node names * are interned. */ ctxt->dictNames = 0; ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); if (ctxt->myDoc == NULL) { xmlFreeParserCtxt(ctxt); xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterDoc : error at xmlNewDoc!\n"); return NULL; } ret = xmlNewTextWriterPushParser(ctxt, compression); if (ret == NULL) { xmlFreeDoc(ctxt->myDoc); xmlFreeParserCtxt(ctxt); xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n"); return NULL; } xmlSetDocCompressMode(ctxt->myDoc, compression); if (doc != NULL) { *doc = ctxt->myDoc; ret->no_doc_free = 1; } return ret; } /** * xmlNewTextWriterTree: * @doc: xmlDocPtr * @node: xmlNodePtr or NULL for doc->children * @compression: compress the output? * * Create a new xmlNewTextWriter structure with @doc as output * starting at @node * * Returns the new xmlTextWriterPtr or NULL in case of error */ xmlTextWriterPtr xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression) { xmlTextWriterPtr ret; xmlSAXHandler saxHandler; xmlParserCtxtPtr ctxt; if (doc == NULL) { xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterTree : invalid document tree!\n"); return NULL; } memset(&saxHandler, '\0', sizeof(saxHandler)); xmlSAX2InitDefaultSAXHandler(&saxHandler, 1); saxHandler.startDocument = xmlTextWriterStartDocumentCallback; saxHandler.startElement = xmlSAX2StartElement; saxHandler.endElement = xmlSAX2EndElement; ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL); if (ctxt == NULL) { xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n"); return NULL; } /* * For some reason this seems to completely break if node names * are interned. */ ctxt->dictNames = 0; ret = xmlNewTextWriterPushParser(ctxt, compression); if (ret == NULL) { xmlFreeParserCtxt(ctxt); xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n"); return NULL; } ctxt->myDoc = doc; ctxt->node = node; ret->no_doc_free = 1; xmlSetDocCompressMode(doc, compression); return ret; } /** * xmlFreeTextWriter: * @writer: the xmlTextWriterPtr * * Deallocate all the resources associated to the writer */ void xmlFreeTextWriter(xmlTextWriterPtr writer) { if (writer == NULL) return; if (writer->out != NULL) xmlOutputBufferClose(writer->out); if (writer->nodes != NULL) xmlListDelete(writer->nodes); if (writer->nsstack != NULL) xmlListDelete(writer->nsstack); if (writer->ctxt != NULL) { if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) { xmlFreeDoc(writer->ctxt->myDoc); writer->ctxt->myDoc = NULL; } xmlFreeParserCtxt(writer->ctxt); } if (writer->doc != NULL) xmlFreeDoc(writer->doc); if (writer->ichar != NULL) xmlFree(writer->ichar); xmlFree(writer); } /** * xmlTextWriterStartDocument: * @writer: the xmlTextWriterPtr * @version: the xml version ("1.0") or NULL for default ("1.0") * @encoding: the encoding or NULL for default * @standalone: "yes" or "no" or NULL for default * * Start a new xml document * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version, const char *encoding, const char *standalone) { int count; int sum; xmlLinkPtr lk; xmlCharEncodingHandlerPtr encoder; if ((writer == NULL) || (writer->out == NULL)) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartDocument : invalid writer!\n"); return -1; } lk = xmlListFront(writer->nodes); if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartDocument : not allowed in this context!\n"); return -1; } encoder = NULL; if (encoding != NULL) { encoder = xmlFindCharEncodingHandler(encoding); if (encoder == NULL) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDocument : out of memory!\n"); return -1; } } writer->out->encoder = encoder; if (encoder != NULL) { if (writer->out->conv == NULL) { writer->out->conv = xmlBufCreateSize(4000); } xmlCharEncOutput(writer->out, 1); if ((writer->doc != NULL) && (writer->doc->encoding == NULL)) writer->doc->encoding = xmlStrdup((xmlChar *)writer->out->encoder->name); } else writer->out->conv = NULL; sum = 0; count = xmlOutputBufferWriteString(writer->out, "out, 1, &writer->qchar); if (count < 0) return -1; sum += count; if (version != 0) count = xmlOutputBufferWriteString(writer->out, version); else count = xmlOutputBufferWriteString(writer->out, "1.0"); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; if (writer->out->encoder != 0) { count = xmlOutputBufferWriteString(writer->out, " encoding="); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, writer->out->encoder->name); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } if (standalone != 0) { count = xmlOutputBufferWriteString(writer->out, " standalone="); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, standalone); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, "?>\n"); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterEndDocument: * @writer: the xmlTextWriterPtr * * End an xml document. All open elements are closed, and * the content is flushed to the output. * * Returns the bytes written or -1 in case of error */ int xmlTextWriterEndDocument(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterEndDocument : invalid writer!\n"); return -1; } sum = 0; while ((lk = xmlListFront(writer->nodes)) != NULL) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) break; switch (p->state) { case XML_TEXTWRITER_NAME: case XML_TEXTWRITER_ATTRIBUTE: case XML_TEXTWRITER_TEXT: count = xmlTextWriterEndElement(writer); if (count < 0) return -1; sum += count; break; case XML_TEXTWRITER_PI: case XML_TEXTWRITER_PI_TEXT: count = xmlTextWriterEndPI(writer); if (count < 0) return -1; sum += count; break; case XML_TEXTWRITER_CDATA: count = xmlTextWriterEndCDATA(writer); if (count < 0) return -1; sum += count; break; case XML_TEXTWRITER_DTD: case XML_TEXTWRITER_DTD_TEXT: case XML_TEXTWRITER_DTD_ELEM: case XML_TEXTWRITER_DTD_ELEM_TEXT: case XML_TEXTWRITER_DTD_ATTL: case XML_TEXTWRITER_DTD_ATTL_TEXT: case XML_TEXTWRITER_DTD_ENTY: case XML_TEXTWRITER_DTD_ENTY_TEXT: case XML_TEXTWRITER_DTD_PENT: count = xmlTextWriterEndDTD(writer); if (count < 0) return -1; sum += count; break; case XML_TEXTWRITER_COMMENT: count = xmlTextWriterEndComment(writer); if (count < 0) return -1; sum += count; break; default: break; } } if (!writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } sum += xmlTextWriterFlush(writer); return sum; } /** * xmlTextWriterStartComment: * @writer: the xmlTextWriterPtr * * Start an xml comment. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartComment(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartComment : invalid writer!\n"); return -1; } sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_TEXT: case XML_TEXTWRITER_NONE: break; case XML_TEXTWRITER_NAME: /* Output namespace declarations */ count = xmlTextWriterOutputNSDecl(writer); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } p->state = XML_TEXTWRITER_TEXT; break; default: return -1; } } } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartElement : out of memory!\n"); return -1; } p->name = NULL; p->state = XML_TEXTWRITER_COMMENT; xmlListPushFront(writer->nodes, p); if (writer->indent) { count = xmlTextWriterWriteIndent(writer); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, ""); if (count < 0) return -1; sum += count; break; default: return -1; } if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterWriteFormatComment: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @...: extra parameters for the format * * Write an xml comment. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatComment(writer, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatComment: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write an xml comment. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteVFormatComment : invalid writer!\n"); return -1; } buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteComment(writer, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteComment: * @writer: the xmlTextWriterPtr * @content: comment string * * Write an xml comment. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content) { int count; int sum; sum = 0; count = xmlTextWriterStartComment(writer); if (count < 0) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count < 0) return -1; sum += count; count = xmlTextWriterEndComment(writer); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterStartElement: * @writer: the xmlTextWriterPtr * @name: element name * * Start an xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if ((writer == NULL) || (name == NULL) || (*name == '\0')) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_PI: case XML_TEXTWRITER_PI_TEXT: return -1; case XML_TEXTWRITER_NONE: break; case XML_TEXTWRITER_ATTRIBUTE: count = xmlTextWriterEndAttribute(writer); if (count < 0) return -1; sum += count; /* fallthrough */ case XML_TEXTWRITER_NAME: /* Output namespace declarations */ count = xmlTextWriterOutputNSDecl(writer); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; if (writer->indent) count = xmlOutputBufferWriteString(writer->out, "\n"); p->state = XML_TEXTWRITER_TEXT; break; default: break; } } } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartElement : out of memory!\n"); return -1; } p->name = xmlStrdup(name); if (p->name == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartElement : out of memory!\n"); xmlFree(p); return -1; } p->state = XML_TEXTWRITER_NAME; xmlListPushFront(writer->nodes, p); if (writer->indent) { count = xmlTextWriterWriteIndent(writer); sum += count; } count = xmlOutputBufferWriteString(writer->out, "<"); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) p->name); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterStartElementNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix or NULL * @name: element local name * @namespaceURI: namespace URI or NULL * * Start an xml element with namespace support. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI) { int count; int sum; xmlChar *buf; if ((writer == NULL) || (name == NULL) || (*name == '\0')) return -1; buf = NULL; if (prefix != 0) { buf = xmlStrdup(prefix); buf = xmlStrcat(buf, BAD_CAST ":"); } buf = xmlStrcat(buf, name); sum = 0; count = xmlTextWriterStartElement(writer, buf); xmlFree(buf); if (count < 0) return -1; sum += count; if (namespaceURI != 0) { xmlTextWriterNsStackEntry *p = (xmlTextWriterNsStackEntry *) xmlMalloc(sizeof(xmlTextWriterNsStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartElementNS : out of memory!\n"); return -1; } buf = xmlStrdup(BAD_CAST "xmlns"); if (prefix != 0) { buf = xmlStrcat(buf, BAD_CAST ":"); buf = xmlStrcat(buf, prefix); } p->prefix = buf; p->uri = xmlStrdup(namespaceURI); if (p->uri == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartElementNS : out of memory!\n"); xmlFree(p); return -1; } p->elem = xmlListFront(writer->nodes); xmlListPushFront(writer->nsstack, p); } return sum; } /** * xmlTextWriterEndElement: * @writer: the xmlTextWriterPtr * * End the current xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterEndElement(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; lk = xmlListFront(writer->nodes); if (lk == 0) { xmlListDelete(writer->nsstack); writer->nsstack = NULL; return -1; } p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) { xmlListDelete(writer->nsstack); writer->nsstack = NULL; return -1; } sum = 0; switch (p->state) { case XML_TEXTWRITER_ATTRIBUTE: count = xmlTextWriterEndAttribute(writer); if (count < 0) { xmlListDelete(writer->nsstack); writer->nsstack = NULL; return -1; } sum += count; /* fallthrough */ case XML_TEXTWRITER_NAME: /* Output namespace declarations */ count = xmlTextWriterOutputNSDecl(writer); if (count < 0) return -1; sum += count; if (writer->indent) /* next element needs indent */ writer->doindent = 1; count = xmlOutputBufferWriteString(writer->out, "/>"); if (count < 0) return -1; sum += count; break; case XML_TEXTWRITER_TEXT: if ((writer->indent) && (writer->doindent)) { count = xmlTextWriterWriteIndent(writer); sum += count; writer->doindent = 1; } else writer->doindent = 1; count = xmlOutputBufferWriteString(writer->out, "out, (const char *) p->name); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; break; default: return -1; } if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); sum += count; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterFullEndElement: * @writer: the xmlTextWriterPtr * * End the current xml element. Writes an end tag even if the element is empty * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterFullEndElement(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; lk = xmlListFront(writer->nodes); if (lk == 0) return -1; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return -1; sum = 0; switch (p->state) { case XML_TEXTWRITER_ATTRIBUTE: count = xmlTextWriterEndAttribute(writer); if (count < 0) return -1; sum += count; /* fallthrough */ case XML_TEXTWRITER_NAME: /* Output namespace declarations */ count = xmlTextWriterOutputNSDecl(writer); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; if (writer->indent) writer->doindent = 0; /* fallthrough */ case XML_TEXTWRITER_TEXT: if ((writer->indent) && (writer->doindent)) { count = xmlTextWriterWriteIndent(writer); sum += count; writer->doindent = 1; } else writer->doindent = 1; count = xmlOutputBufferWriteString(writer->out, "out, (const char *) p->name); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; break; default: return -1; } if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); sum += count; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterWriteFormatRaw: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted raw xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatRaw(writer, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatRaw: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted raw xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteRaw(writer, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteRawLen: * @writer: the xmlTextWriterPtr * @content: text string * @len: length of the text string * * Write an xml text. * TODO: what about entities and special chars?? * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content, int len) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteRawLen : invalid writer!\n"); return -1; } if ((content == NULL) || (len < 0)) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteRawLen : invalid content!\n"); return -1; } sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); count = xmlTextWriterHandleStateDependencies(writer, p); if (count < 0) return -1; sum += count; } if (writer->indent) writer->doindent = 0; if (content != NULL) { count = xmlOutputBufferWrite(writer->out, len, (const char *) content); if (count < 0) return -1; sum += count; } return sum; } /** * xmlTextWriterWriteRaw: * @writer: the xmlTextWriterPtr * @content: text string * * Write a raw xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content) { return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content)); } /** * xmlTextWriterWriteFormatString: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format, ...) { int rc; va_list ap; if ((writer == NULL) || (format == NULL)) return -1; va_start(ap, format); rc = xmlTextWriterWriteVFormatString(writer, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatString: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatString(xmlTextWriterPtr writer, const char *format, va_list argptr) { int rc; xmlChar *buf; if ((writer == NULL) || (format == NULL)) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteString(writer, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteString: * @writer: the xmlTextWriterPtr * @content: text string * * Write an xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; xmlChar *buf; if ((writer == NULL) || (content == NULL)) return -1; sum = 0; buf = (xmlChar *) content; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_NAME: case XML_TEXTWRITER_TEXT: #if 0 buf = NULL; xmlOutputBufferWriteEscape(writer->out, content, NULL); #endif buf = xmlEncodeSpecialChars(NULL, content); break; case XML_TEXTWRITER_ATTRIBUTE: buf = NULL; xmlBufAttrSerializeTxtContent(writer->out->buffer, writer->doc, NULL, content); break; default: break; } } } if (buf != NULL) { count = xmlTextWriterWriteRaw(writer, buf); if (buf != content) /* buf was allocated by us, so free it */ xmlFree(buf); if (count < 0) return -1; sum += count; } return sum; } /** * xmlOutputBufferWriteBase64: * @out: the xmlOutputBufferPtr * @data: binary data * @len: the number of bytes to encode * * Write base64 encoded data to an xmlOutputBuffer. * Adapted from John Walker's base64.c (http://www.fourmilab.ch/). * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ static int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len, const unsigned char *data) { static unsigned char dtable[64] = {'A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/'}; int i; int linelen; int count; int sum; if ((out == NULL) || (len < 0) || (data == NULL)) return(-1); linelen = 0; sum = 0; i = 0; while (1) { unsigned char igroup[3]; unsigned char ogroup[4]; int c; int n; igroup[0] = igroup[1] = igroup[2] = 0; for (n = 0; n < 3 && i < len; n++, i++) { c = data[i]; igroup[n] = (unsigned char) c; } if (n > 0) { ogroup[0] = dtable[igroup[0] >> 2]; ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; ogroup[3] = dtable[igroup[2] & 0x3F]; if (n < 3) { ogroup[3] = '='; if (n < 2) { ogroup[2] = '='; } } if (linelen >= B64LINELEN) { count = xmlOutputBufferWrite(out, 2, B64CRLF); if (count == -1) return -1; sum += count; linelen = 0; } count = xmlOutputBufferWrite(out, 4, (const char *) ogroup); if (count == -1) return -1; sum += count; linelen += 4; } if (i >= len) break; } return sum; } /** * xmlTextWriterWriteBase64: * @writer: the xmlTextWriterPtr * @data: binary data * @start: the position within the data of the first byte to encode * @len: the number of bytes to encode * * Write an base64 encoded xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data, int start, int len) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0)) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { count = xmlTextWriterHandleStateDependencies(writer, p); if (count < 0) return -1; sum += count; } } if (writer->indent) writer->doindent = 0; count = xmlOutputBufferWriteBase64(writer->out, len, (unsigned char *) data + start); if (count < 0) return -1; sum += count; return sum; } /** * xmlOutputBufferWriteBinHex: * @out: the xmlOutputBufferPtr * @data: binary data * @len: the number of bytes to encode * * Write hqx encoded data to an xmlOutputBuffer. * ::todo * * Returns the bytes written (may be 0 because of buffering) * or -1 in case of error */ static int xmlOutputBufferWriteBinHex(xmlOutputBufferPtr out, int len, const unsigned char *data) { int count; int sum; static char hex[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int i; if ((out == NULL) || (data == NULL) || (len < 0)) { return -1; } sum = 0; for (i = 0; i < len; i++) { count = xmlOutputBufferWrite(out, 1, (const char *) &hex[data[i] >> 4]); if (count == -1) return -1; sum += count; count = xmlOutputBufferWrite(out, 1, (const char *) &hex[data[i] & 0xF]); if (count == -1) return -1; sum += count; } return sum; } /** * xmlTextWriterWriteBinHex: * @writer: the xmlTextWriterPtr * @data: binary data * @start: the position within the data of the first byte to encode * @len: the number of bytes to encode * * Write a BinHex encoded xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data, int start, int len) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0)) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { count = xmlTextWriterHandleStateDependencies(writer, p); if (count < 0) return -1; sum += count; } } if (writer->indent) writer->doindent = 0; count = xmlOutputBufferWriteBinHex(writer->out, len, (unsigned char *) data + start); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterStartAttribute: * @writer: the xmlTextWriterPtr * @name: element name * * Start an xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if ((writer == NULL) || (name == NULL) || (*name == '\0')) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) return -1; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return -1; switch (p->state) { case XML_TEXTWRITER_ATTRIBUTE: count = xmlTextWriterEndAttribute(writer); if (count < 0) return -1; sum += count; /* fallthrough */ case XML_TEXTWRITER_NAME: count = xmlOutputBufferWriteString(writer->out, " "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) name); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, "="); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; p->state = XML_TEXTWRITER_ATTRIBUTE; break; default: return -1; } return sum; } /** * xmlTextWriterStartAttributeNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix or NULL * @name: element local name * @namespaceURI: namespace URI or NULL * * Start an xml attribute with namespace support. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI) { int count; int sum; xmlChar *buf; xmlTextWriterNsStackEntry *p; if ((writer == NULL) || (name == NULL) || (*name == '\0')) return -1; /* Handle namespace first in case of error */ if (namespaceURI != 0) { xmlTextWriterNsStackEntry nsentry, *curns; buf = xmlStrdup(BAD_CAST "xmlns"); if (prefix != 0) { buf = xmlStrcat(buf, BAD_CAST ":"); buf = xmlStrcat(buf, prefix); } nsentry.prefix = buf; nsentry.uri = (xmlChar *)namespaceURI; nsentry.elem = xmlListFront(writer->nodes); curns = (xmlTextWriterNsStackEntry *)xmlListSearch(writer->nsstack, (void *)&nsentry); if ((curns != NULL)) { xmlFree(buf); if (xmlStrcmp(curns->uri, namespaceURI) == 0) { /* Namespace already defined on element skip */ buf = NULL; } else { /* Prefix mismatch so error out */ return -1; } } /* Do not add namespace decl to list - it is already there */ if (buf != NULL) { p = (xmlTextWriterNsStackEntry *) xmlMalloc(sizeof(xmlTextWriterNsStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartAttributeNS : out of memory!\n"); return -1; } p->prefix = buf; p->uri = xmlStrdup(namespaceURI); if (p->uri == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartAttributeNS : out of memory!\n"); xmlFree(p); return -1; } p->elem = xmlListFront(writer->nodes); xmlListPushFront(writer->nsstack, p); } } buf = NULL; if (prefix != 0) { buf = xmlStrdup(prefix); buf = xmlStrcat(buf, BAD_CAST ":"); } buf = xmlStrcat(buf, name); sum = 0; count = xmlTextWriterStartAttribute(writer, buf); xmlFree(buf); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterEndAttribute: * @writer: the xmlTextWriterPtr * * End the current xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterEndAttribute(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; lk = xmlListFront(writer->nodes); if (lk == 0) { return -1; } p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) { return -1; } sum = 0; switch (p->state) { case XML_TEXTWRITER_ATTRIBUTE: p->state = XML_TEXTWRITER_NAME; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) { return -1; } sum += count; break; default: return -1; } return sum; } /** * xmlTextWriterWriteFormatAttribute: * @writer: the xmlTextWriterPtr * @name: attribute name * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatAttribute: * @writer: the xmlTextWriterPtr * @name: attribute name * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteAttribute(writer, name, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteAttribute: * @writer: the xmlTextWriterPtr * @name: attribute name * @content: attribute content * * Write an xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content) { int count; int sum; sum = 0; count = xmlTextWriterStartAttribute(writer, name); if (count < 0) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count < 0) return -1; sum += count; count = xmlTextWriterEndAttribute(writer); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterWriteFormatAttributeNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix * @name: attribute local name * @namespaceURI: namespace URI * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted xml attribute.with namespace support * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name, namespaceURI, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatAttributeNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix * @name: attribute local name * @namespaceURI: namespace URI * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted xml attribute.with namespace support * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteAttributeNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix * @name: attribute local name * @namespaceURI: namespace URI * @content: attribute content * * Write an xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const xmlChar * content) { int count; int sum; if ((writer == NULL) || (name == NULL) || (*name == '\0')) return -1; sum = 0; count = xmlTextWriterStartAttributeNS(writer, prefix, name, namespaceURI); if (count < 0) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count < 0) return -1; sum += count; count = xmlTextWriterEndAttribute(writer); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterWriteFormatElement: * @writer: the xmlTextWriterPtr * @name: element name * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatElement: * @writer: the xmlTextWriterPtr * @name: element name * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteElement(writer, name, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteElement: * @writer: the xmlTextWriterPtr * @name: element name * @content: element content * * Write an xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content) { int count; int sum; sum = 0; count = xmlTextWriterStartElement(writer, name); if (count == -1) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count == -1) return -1; sum += count; count = xmlTextWriterEndElement(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterWriteFormatElementNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix * @name: element local name * @namespaceURI: namespace URI * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted xml element with namespace support. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name, namespaceURI, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatElementNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix * @name: element local name * @namespaceURI: namespace URI * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted xml element with namespace support. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteElementNS: * @writer: the xmlTextWriterPtr * @prefix: namespace prefix * @name: element local name * @namespaceURI: namespace URI * @content: element content * * Write an xml element with namespace support. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const xmlChar * content) { int count; int sum; if ((writer == NULL) || (name == NULL) || (*name == '\0')) return -1; sum = 0; count = xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI); if (count < 0) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count == -1) return -1; sum += count; count = xmlTextWriterEndElement(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterStartPI: * @writer: the xmlTextWriterPtr * @target: PI target * * Start an xml PI. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if ((writer == NULL) || (target == NULL) || (*target == '\0')) return -1; if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n"); return -1; } sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_ATTRIBUTE: count = xmlTextWriterEndAttribute(writer); if (count < 0) return -1; sum += count; /* fallthrough */ case XML_TEXTWRITER_NAME: /* Output namespace declarations */ count = xmlTextWriterOutputNSDecl(writer); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; p->state = XML_TEXTWRITER_TEXT; break; case XML_TEXTWRITER_NONE: case XML_TEXTWRITER_TEXT: case XML_TEXTWRITER_DTD: break; case XML_TEXTWRITER_PI: case XML_TEXTWRITER_PI_TEXT: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartPI : nested PI!\n"); return -1; default: return -1; } } } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartPI : out of memory!\n"); return -1; } p->name = xmlStrdup(target); if (p->name == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartPI : out of memory!\n"); xmlFree(p); return -1; } p->state = XML_TEXTWRITER_PI; xmlListPushFront(writer->nodes, p); count = xmlOutputBufferWriteString(writer->out, "out, (const char *) p->name); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterEndPI: * @writer: the xmlTextWriterPtr * * End the current xml PI. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterEndPI(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; lk = xmlListFront(writer->nodes); if (lk == 0) return 0; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return 0; sum = 0; switch (p->state) { case XML_TEXTWRITER_PI: case XML_TEXTWRITER_PI_TEXT: count = xmlOutputBufferWriteString(writer->out, "?>"); if (count < 0) return -1; sum += count; break; default: return -1; } if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterWriteFormatPI: * @writer: the xmlTextWriterPtr * @target: PI target * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted PI. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatPI: * @writer: the xmlTextWriterPtr * @target: PI target * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted xml PI. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer, const xmlChar * target, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWritePI(writer, target, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWritePI: * @writer: the xmlTextWriterPtr * @target: PI target * @content: PI content * * Write an xml PI. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target, const xmlChar * content) { int count; int sum; sum = 0; count = xmlTextWriterStartPI(writer, target); if (count == -1) return -1; sum += count; if (content != 0) { count = xmlTextWriterWriteString(writer, content); if (count == -1) return -1; sum += count; } count = xmlTextWriterEndPI(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterStartCDATA: * @writer: the xmlTextWriterPtr * * Start an xml CDATA section. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartCDATA(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_NONE: case XML_TEXTWRITER_TEXT: case XML_TEXTWRITER_PI: case XML_TEXTWRITER_PI_TEXT: break; case XML_TEXTWRITER_ATTRIBUTE: count = xmlTextWriterEndAttribute(writer); if (count < 0) return -1; sum += count; /* fallthrough */ case XML_TEXTWRITER_NAME: /* Output namespace declarations */ count = xmlTextWriterOutputNSDecl(writer); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; p->state = XML_TEXTWRITER_TEXT; break; case XML_TEXTWRITER_CDATA: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n"); return -1; default: return -1; } } } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartCDATA : out of memory!\n"); return -1; } p->name = NULL; p->state = XML_TEXTWRITER_CDATA; xmlListPushFront(writer->nodes, p); count = xmlOutputBufferWriteString(writer->out, "nodes); if (lk == 0) return -1; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return -1; sum = 0; switch (p->state) { case XML_TEXTWRITER_CDATA: count = xmlOutputBufferWriteString(writer->out, "]]>"); if (count < 0) return -1; sum += count; break; default: return -1; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterWriteFormatCDATA: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted xml CDATA. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatCDATA: * @writer: the xmlTextWriterPtr * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted xml CDATA. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteCDATA(writer, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteCDATA: * @writer: the xmlTextWriterPtr * @content: CDATA content * * Write an xml CDATA. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content) { int count; int sum; sum = 0; count = xmlTextWriterStartCDATA(writer); if (count == -1) return -1; sum += count; if (content != 0) { count = xmlTextWriterWriteString(writer, content); if (count == -1) return -1; sum += count; } count = xmlTextWriterEndCDATA(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterStartDTD: * @writer: the xmlTextWriterPtr * @name: the name of the DTD * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * * Start an xml DTD. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL || name == NULL || *name == '\0') return -1; sum = 0; lk = xmlListFront(writer->nodes); if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartDTD : DTD allowed only in prolog!\n"); return -1; } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTD : out of memory!\n"); return -1; } p->name = xmlStrdup(name); if (p->name == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTD : out of memory!\n"); xmlFree(p); return -1; } p->state = XML_TEXTWRITER_DTD; xmlListPushFront(writer->nodes, p); count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); if (count < 0) return -1; sum += count; if (pubid != 0) { if (sysid == 0) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterStartDTD : system identifier needed!\n"); return -1; } if (writer->indent) count = xmlOutputBufferWrite(writer->out, 1, "\n"); else count = xmlOutputBufferWrite(writer->out, 1, " "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, "PUBLIC "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) pubid); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } if (sysid != 0) { if (pubid == 0) { if (writer->indent) count = xmlOutputBufferWrite(writer->out, 1, "\n"); else count = xmlOutputBufferWrite(writer->out, 1, " "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, "SYSTEM "); if (count < 0) return -1; sum += count; } else { if (writer->indent) count = xmlOutputBufferWriteString(writer->out, "\n "); else count = xmlOutputBufferWrite(writer->out, 1, " "); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) sysid); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } return sum; } /** * xmlTextWriterEndDTD: * @writer: the xmlTextWriterPtr * * End an xml DTD. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterEndDTD(xmlTextWriterPtr writer) { int loop; int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; sum = 0; loop = 1; while (loop) { lk = xmlListFront(writer->nodes); if (lk == NULL) break; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) break; switch (p->state) { case XML_TEXTWRITER_DTD_TEXT: count = xmlOutputBufferWriteString(writer->out, "]"); if (count < 0) return -1; sum += count; /* fallthrough */ case XML_TEXTWRITER_DTD: count = xmlOutputBufferWriteString(writer->out, ">"); if (writer->indent) { if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, "\n"); } xmlListPopFront(writer->nodes); break; case XML_TEXTWRITER_DTD_ELEM: case XML_TEXTWRITER_DTD_ELEM_TEXT: count = xmlTextWriterEndDTDElement(writer); break; case XML_TEXTWRITER_DTD_ATTL: case XML_TEXTWRITER_DTD_ATTL_TEXT: count = xmlTextWriterEndDTDAttlist(writer); break; case XML_TEXTWRITER_DTD_ENTY: case XML_TEXTWRITER_DTD_PENT: case XML_TEXTWRITER_DTD_ENTY_TEXT: count = xmlTextWriterEndDTDEntity(writer); break; case XML_TEXTWRITER_COMMENT: count = xmlTextWriterEndComment(writer); break; default: loop = 0; continue; } if (count < 0) return -1; sum += count; } return sum; } /** * xmlTextWriterWriteFormatDTD: * @writer: the xmlTextWriterPtr * @name: the name of the DTD * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * @format: format string (see printf) * @...: extra parameters for the format * * Write a DTD with a formatted markup declarations part. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatDTD: * @writer: the xmlTextWriterPtr * @name: the name of the DTD * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a DTD with a formatted markup declarations part. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteDTD: * @writer: the xmlTextWriterPtr * @name: the name of the DTD * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * @subset: string content of the DTD * * Write a DTD. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * subset) { int count; int sum; sum = 0; count = xmlTextWriterStartDTD(writer, name, pubid, sysid); if (count == -1) return -1; sum += count; if (subset != 0) { count = xmlTextWriterWriteString(writer, subset); if (count == -1) return -1; sum += count; } count = xmlTextWriterEndDTD(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterStartDTDElement: * @writer: the xmlTextWriterPtr * @name: the name of the DTD element * * Start an xml DTD element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL || name == NULL || *name == '\0') return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) { return -1; } p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_DTD: count = xmlOutputBufferWriteString(writer->out, " ["); if (count < 0) return -1; sum += count; if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } p->state = XML_TEXTWRITER_DTD_TEXT; /* fallthrough */ case XML_TEXTWRITER_DTD_TEXT: case XML_TEXTWRITER_NONE: break; default: return -1; } } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTDElement : out of memory!\n"); return -1; } p->name = xmlStrdup(name); if (p->name == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTDElement : out of memory!\n"); xmlFree(p); return -1; } p->state = XML_TEXTWRITER_DTD_ELEM; xmlListPushFront(writer->nodes, p); if (writer->indent) { count = xmlTextWriterWriteIndent(writer); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterEndDTDElement: * @writer: the xmlTextWriterPtr * * End an xml DTD element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterEndDTDElement(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) return -1; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return -1; switch (p->state) { case XML_TEXTWRITER_DTD_ELEM: case XML_TEXTWRITER_DTD_ELEM_TEXT: count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; break; default: return -1; } if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterWriteFormatDTDElement: * @writer: the xmlTextWriterPtr * @name: the name of the DTD element * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted DTD element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatDTDElement: * @writer: the xmlTextWriterPtr * @name: the name of the DTD element * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted DTD element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteDTDElement(writer, name, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteDTDElement: * @writer: the xmlTextWriterPtr * @name: the name of the DTD element * @content: content of the element * * Write a DTD element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTDElement(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content) { int count; int sum; if (content == NULL) return -1; sum = 0; count = xmlTextWriterStartDTDElement(writer, name); if (count == -1) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count == -1) return -1; sum += count; count = xmlTextWriterEndDTDElement(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterStartDTDAttlist: * @writer: the xmlTextWriterPtr * @name: the name of the DTD ATTLIST * * Start an xml DTD ATTLIST. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL || name == NULL || *name == '\0') return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) { return -1; } p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_DTD: count = xmlOutputBufferWriteString(writer->out, " ["); if (count < 0) return -1; sum += count; if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } p->state = XML_TEXTWRITER_DTD_TEXT; /* fallthrough */ case XML_TEXTWRITER_DTD_TEXT: case XML_TEXTWRITER_NONE: break; default: return -1; } } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTDAttlist : out of memory!\n"); return -1; } p->name = xmlStrdup(name); if (p->name == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTDAttlist : out of memory!\n"); xmlFree(p); return -1; } p->state = XML_TEXTWRITER_DTD_ATTL; xmlListPushFront(writer->nodes, p); if (writer->indent) { count = xmlTextWriterWriteIndent(writer); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterEndDTDAttlist: * @writer: the xmlTextWriterPtr * * End an xml DTD attribute list. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) return -1; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return -1; switch (p->state) { case XML_TEXTWRITER_DTD_ATTL: case XML_TEXTWRITER_DTD_ATTL_TEXT: count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; break; default: return -1; } if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterWriteFormatDTDAttlist: * @writer: the xmlTextWriterPtr * @name: the name of the DTD ATTLIST * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted DTD ATTLIST. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatDTDAttlist: * @writer: the xmlTextWriterPtr * @name: the name of the DTD ATTLIST * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted DTD ATTLIST. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteDTDAttlist(writer, name, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteDTDAttlist: * @writer: the xmlTextWriterPtr * @name: the name of the DTD ATTLIST * @content: content of the ATTLIST * * Write a DTD ATTLIST. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content) { int count; int sum; if (content == NULL) return -1; sum = 0; count = xmlTextWriterStartDTDAttlist(writer, name); if (count == -1) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count == -1) return -1; sum += count; count = xmlTextWriterEndDTDAttlist(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterStartDTDEntity: * @writer: the xmlTextWriterPtr * @pe: TRUE if this is a parameter entity, FALSE if not * @name: the name of the DTD ATTLIST * * Start an xml DTD ATTLIST. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL || name == NULL || *name == '\0') return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk != 0) { p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_DTD: count = xmlOutputBufferWriteString(writer->out, " ["); if (count < 0) return -1; sum += count; if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } p->state = XML_TEXTWRITER_DTD_TEXT; /* fallthrough */ case XML_TEXTWRITER_DTD_TEXT: case XML_TEXTWRITER_NONE: break; default: return -1; } } } p = (xmlTextWriterStackEntry *) xmlMalloc(sizeof(xmlTextWriterStackEntry)); if (p == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTDElement : out of memory!\n"); return -1; } p->name = xmlStrdup(name); if (p->name == 0) { xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, "xmlTextWriterStartDTDElement : out of memory!\n"); xmlFree(p); return -1; } if (pe != 0) p->state = XML_TEXTWRITER_DTD_PENT; else p->state = XML_TEXTWRITER_DTD_ENTY; xmlListPushFront(writer->nodes, p); if (writer->indent) { count = xmlTextWriterWriteIndent(writer); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, "out, "% "); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, (const char *) name); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterEndDTDEntity: * @writer: the xmlTextWriterPtr * * End an xml DTD entity. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterEndDTDEntity(xmlTextWriterPtr writer) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) return -1; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return -1; switch (p->state) { case XML_TEXTWRITER_DTD_ENTY_TEXT: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; case XML_TEXTWRITER_DTD_ENTY: case XML_TEXTWRITER_DTD_PENT: count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; break; default: return -1; } if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } xmlListPopFront(writer->nodes); return sum; } /** * xmlTextWriterWriteFormatDTDInternalEntity: * @writer: the xmlTextWriterPtr * @pe: TRUE if this is a parameter entity, FALSE if not * @name: the name of the DTD entity * @format: format string (see printf) * @...: extra parameters for the format * * Write a formatted DTD internal entity. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int XMLCDECL xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const char *format, ...) { int rc; va_list ap; va_start(ap, format); rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name, format, ap); va_end(ap); return rc; } /** * xmlTextWriterWriteVFormatDTDInternalEntity: * @writer: the xmlTextWriterPtr * @pe: TRUE if this is a parameter entity, FALSE if not * @name: the name of the DTD entity * @format: format string (see printf) * @argptr: pointer to the first member of the variable argument list. * * Write a formatted DTD internal entity. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const char *format, va_list argptr) { int rc; xmlChar *buf; if (writer == NULL) return -1; buf = xmlTextWriterVSprintf(format, argptr); if (buf == NULL) return -1; rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf); xmlFree(buf); return rc; } /** * xmlTextWriterWriteDTDEntity: * @writer: the xmlTextWriterPtr * @pe: TRUE if this is a parameter entity, FALSE if not * @name: the name of the DTD entity * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * @ndataid: the xml notation name. * @content: content of the entity * * Write a DTD entity. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * ndataid, const xmlChar * content) { if ((content == NULL) && (pubid == NULL) && (sysid == NULL)) return -1; if ((pe != 0) && (ndataid != NULL)) return -1; if ((pubid == NULL) && (sysid == NULL)) return xmlTextWriterWriteDTDInternalEntity(writer, pe, name, content); return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid, sysid, ndataid); } /** * xmlTextWriterWriteDTDInternalEntity: * @writer: the xmlTextWriterPtr * @pe: TRUE if this is a parameter entity, FALSE if not * @name: the name of the DTD entity * @content: content of the entity * * Write a DTD internal entity. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const xmlChar * content) { int count; int sum; if ((name == NULL) || (*name == '\0') || (content == NULL)) return -1; sum = 0; count = xmlTextWriterStartDTDEntity(writer, pe, name); if (count == -1) return -1; sum += count; count = xmlTextWriterWriteString(writer, content); if (count == -1) return -1; sum += count; count = xmlTextWriterEndDTDEntity(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterWriteDTDExternalEntity: * @writer: the xmlTextWriterPtr * @pe: TRUE if this is a parameter entity, FALSE if not * @name: the name of the DTD entity * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * @ndataid: the xml notation name. * * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * ndataid) { int count; int sum; if (((pubid == NULL) && (sysid == NULL))) return -1; if ((pe != 0) && (ndataid != NULL)) return -1; sum = 0; count = xmlTextWriterStartDTDEntity(writer, pe, name); if (count == -1) return -1; sum += count; count = xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid, ndataid); if (count < 0) return -1; sum += count; count = xmlTextWriterEndDTDEntity(writer); if (count == -1) return -1; sum += count; return sum; } /** * xmlTextWriterWriteDTDExternalEntityContents: * @writer: the xmlTextWriterPtr * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * @ndataid: the xml notation name. * * Write the contents of a DTD external entity. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * ndataid) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n"); return -1; } sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n"); return -1; } p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return -1; switch (p->state) { case XML_TEXTWRITER_DTD_ENTY: break; case XML_TEXTWRITER_DTD_PENT: if (ndataid != NULL) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n"); return -1; } break; default: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n"); return -1; } if (pubid != 0) { if (sysid == 0) { xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n"); return -1; } count = xmlOutputBufferWriteString(writer->out, " PUBLIC "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) pubid); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } if (sysid != 0) { if (pubid == 0) { count = xmlOutputBufferWriteString(writer->out, " SYSTEM"); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, " "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) sysid); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } if (ndataid != NULL) { count = xmlOutputBufferWriteString(writer->out, " NDATA "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) ndataid); if (count < 0) return -1; sum += count; } return sum; } /** * xmlTextWriterWriteDTDNotation: * @writer: the xmlTextWriterPtr * @name: the name of the xml notation * @pubid: the public identifier, which is an alternative to the system identifier * @sysid: the system identifier, which is the URI of the DTD * * Write a DTD entity. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid) { int count; int sum; xmlLinkPtr lk; xmlTextWriterStackEntry *p; if (writer == NULL || name == NULL || *name == '\0') return -1; sum = 0; lk = xmlListFront(writer->nodes); if (lk == 0) { return -1; } p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p != 0) { switch (p->state) { case XML_TEXTWRITER_DTD: count = xmlOutputBufferWriteString(writer->out, " ["); if (count < 0) return -1; sum += count; if (writer->indent) { count = xmlOutputBufferWriteString(writer->out, "\n"); if (count < 0) return -1; sum += count; } p->state = XML_TEXTWRITER_DTD_TEXT; /* fallthrough */ case XML_TEXTWRITER_DTD_TEXT: break; default: return -1; } } if (writer->indent) { count = xmlTextWriterWriteIndent(writer); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); if (count < 0) return -1; sum += count; if (pubid != 0) { count = xmlOutputBufferWriteString(writer->out, " PUBLIC "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) pubid); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } if (sysid != 0) { if (pubid == 0) { count = xmlOutputBufferWriteString(writer->out, " SYSTEM"); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, " "); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; count = xmlOutputBufferWriteString(writer->out, (const char *) sysid); if (count < 0) return -1; sum += count; count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); if (count < 0) return -1; sum += count; } count = xmlOutputBufferWriteString(writer->out, ">"); if (count < 0) return -1; sum += count; return sum; } /** * xmlTextWriterFlush: * @writer: the xmlTextWriterPtr * * Flush the output buffer. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */ int xmlTextWriterFlush(xmlTextWriterPtr writer) { int count; if (writer == NULL) return -1; if (writer->out == NULL) count = 0; else count = xmlOutputBufferFlush(writer->out); return count; } /** * misc */ /** * xmlFreeTextWriterStackEntry: * @lk: the xmlLinkPtr * * Free callback for the xmlList. */ static void xmlFreeTextWriterStackEntry(xmlLinkPtr lk) { xmlTextWriterStackEntry *p; p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); if (p == 0) return; if (p->name != 0) xmlFree(p->name); xmlFree(p); } /** * xmlCmpTextWriterStackEntry: * @data0: the first data * @data1: the second data * * Compare callback for the xmlList. * * Returns -1, 0, 1 */ static int xmlCmpTextWriterStackEntry(const void *data0, const void *data1) { xmlTextWriterStackEntry *p0; xmlTextWriterStackEntry *p1; if (data0 == data1) return 0; if (data0 == 0) return -1; if (data1 == 0) return 1; p0 = (xmlTextWriterStackEntry *) data0; p1 = (xmlTextWriterStackEntry *) data1; return xmlStrcmp(p0->name, p1->name); } /** * misc */ /** * xmlTextWriterOutputNSDecl: * @writer: the xmlTextWriterPtr * * Output the current namespace declarations. */ static int xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer) { xmlLinkPtr lk; xmlTextWriterNsStackEntry *np; int count; int sum; sum = 0; while (!xmlListEmpty(writer->nsstack)) { xmlChar *namespaceURI = NULL; xmlChar *prefix = NULL; lk = xmlListFront(writer->nsstack); np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk); if (np != 0) { namespaceURI = xmlStrdup(np->uri); prefix = xmlStrdup(np->prefix); } xmlListPopFront(writer->nsstack); if (np != 0) { count = xmlTextWriterWriteAttribute(writer, prefix, namespaceURI); xmlFree(namespaceURI); xmlFree(prefix); if (count < 0) { xmlListDelete(writer->nsstack); writer->nsstack = NULL; return -1; } sum += count; } } return sum; } /** * xmlFreeTextWriterNsStackEntry: * @lk: the xmlLinkPtr * * Free callback for the xmlList. */ static void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk) { xmlTextWriterNsStackEntry *p; p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk); if (p == 0) return; if (p->prefix != 0) xmlFree(p->prefix); if (p->uri != 0) xmlFree(p->uri); xmlFree(p); } /** * xmlCmpTextWriterNsStackEntry: * @data0: the first data * @data1: the second data * * Compare callback for the xmlList. * * Returns -1, 0, 1 */ static int xmlCmpTextWriterNsStackEntry(const void *data0, const void *data1) { xmlTextWriterNsStackEntry *p0; xmlTextWriterNsStackEntry *p1; int rc; if (data0 == data1) return 0; if (data0 == 0) return -1; if (data1 == 0) return 1; p0 = (xmlTextWriterNsStackEntry *) data0; p1 = (xmlTextWriterNsStackEntry *) data1; rc = xmlStrcmp(p0->prefix, p1->prefix); if ((rc != 0) || (p0->elem != p1->elem)) rc = -1; return rc; } /** * xmlTextWriterWriteDocCallback: * @context: the xmlBufferPtr * @str: the data to write * @len: the length of the data * * Write callback for the xmlOutputBuffer with target xmlBuffer * * Returns -1, 0, 1 */ static int xmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context; int rc; if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) { xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteDocCallback : XML error %d !\n", rc); return -1; } return len; } /** * xmlTextWriterCloseDocCallback: * @context: the xmlBufferPtr * * Close callback for the xmlOutputBuffer with target xmlBuffer * * Returns -1, 0, 1 */ static int xmlTextWriterCloseDocCallback(void *context) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context; int rc; if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) { xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR, "xmlTextWriterWriteDocCallback : XML error %d !\n", rc); return -1; } return 0; } /** * xmlTextWriterVSprintf: * @format: see printf * @argptr: pointer to the first member of the variable argument list. * * Utility function for formatted output * * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed. */ static xmlChar * xmlTextWriterVSprintf(const char *format, va_list argptr) { int size; int count; xmlChar *buf; va_list locarg; size = BUFSIZ; buf = (xmlChar *) xmlMalloc(size); if (buf == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlTextWriterVSprintf : out of memory!\n"); return NULL; } VA_COPY(locarg, argptr); while (((count = vsnprintf((char *) buf, size, format, locarg)) < 0) || (count == size - 1) || (count == size) || (count > size)) { va_end(locarg); xmlFree(buf); size += BUFSIZ; buf = (xmlChar *) xmlMalloc(size); if (buf == NULL) { xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, "xmlTextWriterVSprintf : out of memory!\n"); return NULL; } VA_COPY(locarg, argptr); } va_end(locarg); return buf; } /** * xmlTextWriterStartDocumentCallback: * @ctx: the user data (XML parser context) * * called at the start of document processing. */ static void xmlTextWriterStartDocumentCallback(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlDocPtr doc; if (ctxt->html) { #ifdef LIBXML_HTML_ENABLED if (ctxt->myDoc == NULL) ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); if (ctxt->myDoc == NULL) { if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) ctxt->sax->error(ctxt->userData, "SAX.startDocument(): out of memory\n"); ctxt->errNo = XML_ERR_NO_MEMORY; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; return; } #else xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, "libxml2 built without HTML support\n"); ctxt->errNo = XML_ERR_INTERNAL_ERROR; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; return; #endif } else { doc = ctxt->myDoc; if (doc == NULL) doc = ctxt->myDoc = xmlNewDoc(ctxt->version); if (doc != NULL) { if (doc->children == NULL) { if (ctxt->encoding != NULL) doc->encoding = xmlStrdup(ctxt->encoding); else doc->encoding = NULL; doc->standalone = ctxt->standalone; } } else { if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) ctxt->sax->error(ctxt->userData, "SAX.startDocument(): out of memory\n"); ctxt->errNo = XML_ERR_NO_MEMORY; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; return; } } if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) && (ctxt->input != NULL) && (ctxt->input->filename != NULL)) { ctxt->myDoc->URL = xmlCanonicPath((const xmlChar *) ctxt->input->filename); if (ctxt->myDoc->URL == NULL) ctxt->myDoc->URL = xmlStrdup((const xmlChar *) ctxt->input->filename); } } /** * xmlTextWriterSetIndent: * @writer: the xmlTextWriterPtr * @indent: do indentation? * * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation. * * Returns -1 on error or 0 otherwise. */ int xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent) { if ((writer == NULL) || (indent < 0)) return -1; writer->indent = indent; writer->doindent = 1; return 0; } /** * xmlTextWriterSetIndentString: * @writer: the xmlTextWriterPtr * @str: the xmlChar string * * Set string indentation. * * Returns -1 on error or 0 otherwise. */ int xmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str) { if ((writer == NULL) || (!str)) return -1; if (writer->ichar != NULL) xmlFree(writer->ichar); writer->ichar = xmlStrdup(str); if (!writer->ichar) return -1; else return 0; } /** * xmlTextWriterSetQuoteChar: * @writer: the xmlTextWriterPtr * @quotechar: the quote character * * Set the character used for quoting attributes. * * Returns -1 on error or 0 otherwise. */ int xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar) { if ((writer == NULL) || ((quotechar != '\'') && (quotechar != '"'))) return -1; writer->qchar = quotechar; return 0; } /** * xmlTextWriterWriteIndent: * @writer: the xmlTextWriterPtr * * Write indent string. * * Returns -1 on error or the number of strings written. */ static int xmlTextWriterWriteIndent(xmlTextWriterPtr writer) { int lksize; int i; int ret; lksize = xmlListSize(writer->nodes); if (lksize < 1) return (-1); /* list is empty */ for (i = 0; i < (lksize - 1); i++) { ret = xmlOutputBufferWriteString(writer->out, (const char *) writer->ichar); if (ret == -1) return (-1); } return (lksize - 1); } /** * xmlTextWriterHandleStateDependencies: * @writer: the xmlTextWriterPtr * @p: the xmlTextWriterStackEntry * * Write state dependent strings. * * Returns -1 on error or the number of characters written. */ static int xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer, xmlTextWriterStackEntry * p) { int count; int sum; char extra[3]; if (writer == NULL) return -1; if (p == NULL) return 0; sum = 0; extra[0] = extra[1] = extra[2] = '\0'; if (p != 0) { sum = 0; switch (p->state) { case XML_TEXTWRITER_NAME: /* Output namespace declarations */ count = xmlTextWriterOutputNSDecl(writer); if (count < 0) return -1; sum += count; extra[0] = '>'; p->state = XML_TEXTWRITER_TEXT; break; case XML_TEXTWRITER_PI: extra[0] = ' '; p->state = XML_TEXTWRITER_PI_TEXT; break; case XML_TEXTWRITER_DTD: extra[0] = ' '; extra[1] = '['; p->state = XML_TEXTWRITER_DTD_TEXT; break; case XML_TEXTWRITER_DTD_ELEM: extra[0] = ' '; p->state = XML_TEXTWRITER_DTD_ELEM_TEXT; break; case XML_TEXTWRITER_DTD_ATTL: extra[0] = ' '; p->state = XML_TEXTWRITER_DTD_ATTL_TEXT; break; case XML_TEXTWRITER_DTD_ENTY: case XML_TEXTWRITER_DTD_PENT: extra[0] = ' '; extra[1] = writer->qchar; p->state = XML_TEXTWRITER_DTD_ENTY_TEXT; break; default: break; } } if (*extra != '\0') { count = xmlOutputBufferWriteString(writer->out, extra); if (count < 0) return -1; sum += count; } return sum; } #define bottom_xmlwriter #include "elfgcchack.h" #endif libxml2-2.9.1+dfsg1/xpath.c0000644000175000017500000150300212126244144014045 0ustar aronaron/* * xpath.c: XML Path Language implementation * XPath is a language for addressing parts of an XML document, * designed to be used by both XSLT and XPointer *f * Reference: W3C Recommendation 16 November 1999 * http://www.w3.org/TR/1999/REC-xpath-19991116 * Public reference: * http://www.w3.org/TR/xpath * * See Copyright for the status of this software * * Author: daniel@veillard.com * */ #define IN_LIBXML #include "libxml.h" #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_MATH_H #include #endif #ifdef HAVE_FLOAT_H #include #endif #ifdef HAVE_CTYPE_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #include #include #include #include #include #include #include #ifdef LIBXML_XPTR_ENABLED #include #endif #ifdef LIBXML_DEBUG_ENABLED #include #endif #include #include #include #ifdef LIBXML_PATTERN_ENABLED #include #endif #include "buf.h" #ifdef LIBXML_PATTERN_ENABLED #define XPATH_STREAMING #endif #define TODO \ xmlGenericError(xmlGenericErrorContext, \ "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); /** * WITH_TIM_SORT: * * Use the Timsort algorithm provided in timsort.h to sort * nodeset as this is a great improvement over the old Shell sort * used in xmlXPathNodeSetSort() */ #define WITH_TIM_SORT /* * XP_OPTIMIZED_NON_ELEM_COMPARISON: * If defined, this will use xmlXPathCmpNodesExt() instead of * xmlXPathCmpNodes(). The new function is optimized comparison of * non-element nodes; actually it will speed up comparison only if * xmlXPathOrderDocElems() was called in order to index the elements of * a tree in document order; Libxslt does such an indexing, thus it will * benefit from this optimization. */ #define XP_OPTIMIZED_NON_ELEM_COMPARISON /* * XP_OPTIMIZED_FILTER_FIRST: * If defined, this will optimize expressions like "key('foo', 'val')[b][1]" * in a way, that it stop evaluation at the first node. */ #define XP_OPTIMIZED_FILTER_FIRST /* * XP_DEBUG_OBJ_USAGE: * Internal flag to enable tracking of how much XPath objects have been * created. */ /* #define XP_DEBUG_OBJ_USAGE */ /* * XPATH_MAX_STEPS: * when compiling an XPath expression we arbitrary limit the maximum * number of step operation in the compiled expression. 1000000 is * an insanely large value which should never be reached under normal * circumstances */ #define XPATH_MAX_STEPS 1000000 /* * XPATH_MAX_STACK_DEPTH: * when evaluating an XPath expression we arbitrary limit the maximum * number of object allowed to be pushed on the stack. 1000000 is * an insanely large value which should never be reached under normal * circumstances */ #define XPATH_MAX_STACK_DEPTH 1000000 /* * XPATH_MAX_NODESET_LENGTH: * when evaluating an XPath expression nodesets are created and we * arbitrary limit the maximum length of those node set. 10000000 is * an insanely large value which should never be reached under normal * circumstances, one would first need to construct an in memory tree * with more than 10 millions nodes. */ #define XPATH_MAX_NODESET_LENGTH 10000000 /* * TODO: * There are a few spots where some tests are done which depend upon ascii * data. These should be enhanced for full UTF8 support (see particularly * any use of the macros IS_ASCII_CHARACTER and IS_ASCII_DIGIT) */ /* * Wrapper for the Timsort argorithm from timsort.h */ #ifdef WITH_TIM_SORT #define SORT_NAME libxml_domnode #define SORT_TYPE xmlNodePtr /** * wrap_cmp: * @x: a node * @y: another node * * Comparison function for the Timsort implementation * * Returns -2 in case of error -1 if first point < second point, 0 if * it's the same node, +1 otherwise */ static int wrap_cmp( xmlNodePtr x, xmlNodePtr y ); #ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON static int xmlXPathCmpNodesExt(xmlNodePtr, xmlNodePtr); static int wrap_cmp( xmlNodePtr x, xmlNodePtr y ) { int res = xmlXPathCmpNodesExt(x, y); return res == -2 ? res : -res; } #else static int wrap_cmp( xmlNodePtr x, xmlNodePtr y ) { int res = xmlXPathCmpNodes(x, y); return res == -2 ? res : -res; } #endif #define SORT_CMP(x, y) (wrap_cmp(x, y)) #include "timsort.h" #endif /* WITH_TIM_SORT */ #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) /************************************************************************ * * * Floating point stuff * * * ************************************************************************/ #ifndef TRIO_REPLACE_STDIO #define TRIO_PUBLIC static #endif #include "trionan.c" /* * The lack of portability of this section of the libc is annoying ! */ double xmlXPathNAN = 0; double xmlXPathPINF = 1; double xmlXPathNINF = -1; static double xmlXPathNZERO = 0; /* not exported from headers */ static int xmlXPathInitialized = 0; /** * xmlXPathInit: * * Initialize the XPath environment */ void xmlXPathInit(void) { if (xmlXPathInitialized) return; xmlXPathPINF = trio_pinf(); xmlXPathNINF = trio_ninf(); xmlXPathNAN = trio_nan(); xmlXPathNZERO = trio_nzero(); xmlXPathInitialized = 1; } /** * xmlXPathIsNaN: * @val: a double value * * Provides a portable isnan() function to detect whether a double * is a NotaNumber. Based on trio code * http://sourceforge.net/projects/ctrio/ * * Returns 1 if the value is a NaN, 0 otherwise */ int xmlXPathIsNaN(double val) { return(trio_isnan(val)); } /** * xmlXPathIsInf: * @val: a double value * * Provides a portable isinf() function to detect whether a double * is a +Infinite or -Infinite. Based on trio code * http://sourceforge.net/projects/ctrio/ * * Returns 1 vi the value is +Infinite, -1 if -Infinite, 0 otherwise */ int xmlXPathIsInf(double val) { return(trio_isinf(val)); } #endif /* SCHEMAS or XPATH */ #ifdef LIBXML_XPATH_ENABLED /** * xmlXPathGetSign: * @val: a double value * * Provides a portable function to detect the sign of a double * Modified from trio code * http://sourceforge.net/projects/ctrio/ * * Returns 1 if the value is Negative, 0 if positive */ static int xmlXPathGetSign(double val) { return(trio_signbit(val)); } /* * TODO: when compatibility allows remove all "fake node libxslt" strings * the test should just be name[0] = ' ' */ #ifdef DEBUG_XPATH_EXPRESSION #define DEBUG_STEP #define DEBUG_EXPR #define DEBUG_EVAL_COUNTS #endif static xmlNs xmlXPathXMLNamespaceStruct = { NULL, XML_NAMESPACE_DECL, XML_XML_NAMESPACE, BAD_CAST "xml", NULL, NULL }; static xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct; #ifndef LIBXML_THREAD_ENABLED /* * Optimizer is disabled only when threaded apps are detected while * the library ain't compiled for thread safety. */ static int xmlXPathDisableOptimizer = 0; #endif /************************************************************************ * * * Error handling routines * * * ************************************************************************/ /** * XP_ERRORNULL: * @X: the error code * * Macro to raise an XPath error and return NULL. */ #define XP_ERRORNULL(X) \ { xmlXPathErr(ctxt, X); return(NULL); } /* * The array xmlXPathErrorMessages corresponds to the enum xmlXPathError */ static const char *xmlXPathErrorMessages[] = { "Ok\n", "Number encoding\n", "Unfinished literal\n", "Start of literal\n", "Expected $ for variable reference\n", "Undefined variable\n", "Invalid predicate\n", "Invalid expression\n", "Missing closing curly brace\n", "Unregistered function\n", "Invalid operand\n", "Invalid type\n", "Invalid number of arguments\n", "Invalid context size\n", "Invalid context position\n", "Memory allocation error\n", "Syntax error\n", "Resource error\n", "Sub resource error\n", "Undefined namespace prefix\n", "Encoding error\n", "Char out of XML range\n", "Invalid or incomplete context\n", "Stack usage errror\n", "Forbidden variable\n", "?? Unknown error ??\n" /* Must be last in the list! */ }; #define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) / \ sizeof(xmlXPathErrorMessages[0])) - 1) /** * xmlXPathErrMemory: * @ctxt: an XPath context * @extra: extra informations * * Handle a redefinition of attribute error */ static void xmlXPathErrMemory(xmlXPathContextPtr ctxt, const char *extra) { if (ctxt != NULL) { if (extra) { xmlChar buf[200]; xmlStrPrintf(buf, 200, BAD_CAST "Memory allocation failed : %s\n", extra); ctxt->lastError.message = (char *) xmlStrdup(buf); } else { ctxt->lastError.message = (char *) xmlStrdup(BAD_CAST "Memory allocation failed\n"); } ctxt->lastError.domain = XML_FROM_XPATH; ctxt->lastError.code = XML_ERR_NO_MEMORY; if (ctxt->error != NULL) ctxt->error(ctxt->userData, &ctxt->lastError); } else { if (extra) __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_XPATH, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, NULL, NULL, 0, 0, "Memory allocation failed : %s\n", extra); else __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_XPATH, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "Memory allocation failed\n"); } } /** * xmlXPathPErrMemory: * @ctxt: an XPath parser context * @extra: extra informations * * Handle a redefinition of attribute error */ static void xmlXPathPErrMemory(xmlXPathParserContextPtr ctxt, const char *extra) { if (ctxt == NULL) xmlXPathErrMemory(NULL, extra); else { ctxt->error = XPATH_MEMORY_ERROR; xmlXPathErrMemory(ctxt->context, extra); } } /** * xmlXPathErr: * @ctxt: a XPath parser context * @error: the error code * * Handle an XPath error */ void xmlXPathErr(xmlXPathParserContextPtr ctxt, int error) { if ((error < 0) || (error > MAXERRNO)) error = MAXERRNO; if (ctxt == NULL) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_XPATH, error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", xmlXPathErrorMessages[error]); return; } ctxt->error = error; if (ctxt->context == NULL) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_XPATH, error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, XML_ERR_ERROR, NULL, 0, (const char *) ctxt->base, NULL, NULL, ctxt->cur - ctxt->base, 0, "%s", xmlXPathErrorMessages[error]); return; } /* cleanup current last error */ xmlResetError(&ctxt->context->lastError); ctxt->context->lastError.domain = XML_FROM_XPATH; ctxt->context->lastError.code = error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK; ctxt->context->lastError.level = XML_ERR_ERROR; ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base); ctxt->context->lastError.int1 = ctxt->cur - ctxt->base; ctxt->context->lastError.node = ctxt->context->debugNode; if (ctxt->context->error != NULL) { ctxt->context->error(ctxt->context->userData, &ctxt->context->lastError); } else { __xmlRaiseError(NULL, NULL, NULL, NULL, ctxt->context->debugNode, XML_FROM_XPATH, error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, XML_ERR_ERROR, NULL, 0, (const char *) ctxt->base, NULL, NULL, ctxt->cur - ctxt->base, 0, "%s", xmlXPathErrorMessages[error]); } } /** * xmlXPatherror: * @ctxt: the XPath Parser context * @file: the file name * @line: the line number * @no: the error number * * Formats an error message. */ void xmlXPatherror(xmlXPathParserContextPtr ctxt, const char *file ATTRIBUTE_UNUSED, int line ATTRIBUTE_UNUSED, int no) { xmlXPathErr(ctxt, no); } /************************************************************************ * * * Utilities * * * ************************************************************************/ /** * xsltPointerList: * * Pointer-list for various purposes. */ typedef struct _xmlPointerList xmlPointerList; typedef xmlPointerList *xmlPointerListPtr; struct _xmlPointerList { void **items; int number; int size; }; /* * TODO: Since such a list-handling is used in xmlschemas.c and libxslt * and here, we should make the functions public. */ static int xmlPointerListAddSize(xmlPointerListPtr list, void *item, int initialSize) { if (list->items == NULL) { if (initialSize <= 0) initialSize = 1; list->items = (void **) xmlMalloc(initialSize * sizeof(void *)); if (list->items == NULL) { xmlXPathErrMemory(NULL, "xmlPointerListCreate: allocating item\n"); return(-1); } list->number = 0; list->size = initialSize; } else if (list->size <= list->number) { if (list->size > 50000000) { xmlXPathErrMemory(NULL, "xmlPointerListAddSize: re-allocating item\n"); return(-1); } list->size *= 2; list->items = (void **) xmlRealloc(list->items, list->size * sizeof(void *)); if (list->items == NULL) { xmlXPathErrMemory(NULL, "xmlPointerListAddSize: re-allocating item\n"); list->size = 0; return(-1); } } list->items[list->number++] = item; return(0); } /** * xsltPointerListCreate: * * Creates an xsltPointerList structure. * * Returns a xsltPointerList structure or NULL in case of an error. */ static xmlPointerListPtr xmlPointerListCreate(int initialSize) { xmlPointerListPtr ret; ret = xmlMalloc(sizeof(xmlPointerList)); if (ret == NULL) { xmlXPathErrMemory(NULL, "xmlPointerListCreate: allocating item\n"); return (NULL); } memset(ret, 0, sizeof(xmlPointerList)); if (initialSize > 0) { xmlPointerListAddSize(ret, NULL, initialSize); ret->number = 0; } return (ret); } /** * xsltPointerListFree: * * Frees the xsltPointerList structure. This does not free * the content of the list. */ static void xmlPointerListFree(xmlPointerListPtr list) { if (list == NULL) return; if (list->items != NULL) xmlFree(list->items); xmlFree(list); } /************************************************************************ * * * Parser Types * * * ************************************************************************/ /* * Types are private: */ typedef enum { XPATH_OP_END=0, XPATH_OP_AND, XPATH_OP_OR, XPATH_OP_EQUAL, XPATH_OP_CMP, XPATH_OP_PLUS, XPATH_OP_MULT, XPATH_OP_UNION, XPATH_OP_ROOT, XPATH_OP_NODE, XPATH_OP_RESET, /* 10 */ XPATH_OP_COLLECT, XPATH_OP_VALUE, /* 12 */ XPATH_OP_VARIABLE, XPATH_OP_FUNCTION, XPATH_OP_ARG, XPATH_OP_PREDICATE, XPATH_OP_FILTER, /* 17 */ XPATH_OP_SORT /* 18 */ #ifdef LIBXML_XPTR_ENABLED ,XPATH_OP_RANGETO #endif } xmlXPathOp; typedef enum { AXIS_ANCESTOR = 1, AXIS_ANCESTOR_OR_SELF, AXIS_ATTRIBUTE, AXIS_CHILD, AXIS_DESCENDANT, AXIS_DESCENDANT_OR_SELF, AXIS_FOLLOWING, AXIS_FOLLOWING_SIBLING, AXIS_NAMESPACE, AXIS_PARENT, AXIS_PRECEDING, AXIS_PRECEDING_SIBLING, AXIS_SELF } xmlXPathAxisVal; typedef enum { NODE_TEST_NONE = 0, NODE_TEST_TYPE = 1, NODE_TEST_PI = 2, NODE_TEST_ALL = 3, NODE_TEST_NS = 4, NODE_TEST_NAME = 5 } xmlXPathTestVal; typedef enum { NODE_TYPE_NODE = 0, NODE_TYPE_COMMENT = XML_COMMENT_NODE, NODE_TYPE_TEXT = XML_TEXT_NODE, NODE_TYPE_PI = XML_PI_NODE } xmlXPathTypeVal; typedef struct _xmlXPathStepOp xmlXPathStepOp; typedef xmlXPathStepOp *xmlXPathStepOpPtr; struct _xmlXPathStepOp { xmlXPathOp op; /* The identifier of the operation */ int ch1; /* First child */ int ch2; /* Second child */ int value; int value2; int value3; void *value4; void *value5; void *cache; void *cacheURI; }; struct _xmlXPathCompExpr { int nbStep; /* Number of steps in this expression */ int maxStep; /* Maximum number of steps allocated */ xmlXPathStepOp *steps; /* ops for computation of this expression */ int last; /* index of last step in expression */ xmlChar *expr; /* the expression being computed */ xmlDictPtr dict; /* the dictionnary to use if any */ #ifdef DEBUG_EVAL_COUNTS int nb; xmlChar *string; #endif #ifdef XPATH_STREAMING xmlPatternPtr stream; #endif }; /************************************************************************ * * * Forward declarations * * * ************************************************************************/ static void xmlXPathFreeValueTree(xmlNodeSetPtr obj); static void xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj); static int xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodePtr *first); static int xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, int isPredicate); /************************************************************************ * * * Parser Type functions * * * ************************************************************************/ /** * xmlXPathNewCompExpr: * * Create a new Xpath component * * Returns the newly allocated xmlXPathCompExprPtr or NULL in case of error */ static xmlXPathCompExprPtr xmlXPathNewCompExpr(void) { xmlXPathCompExprPtr cur; cur = (xmlXPathCompExprPtr) xmlMalloc(sizeof(xmlXPathCompExpr)); if (cur == NULL) { xmlXPathErrMemory(NULL, "allocating component\n"); return(NULL); } memset(cur, 0, sizeof(xmlXPathCompExpr)); cur->maxStep = 10; cur->nbStep = 0; cur->steps = (xmlXPathStepOp *) xmlMalloc(cur->maxStep * sizeof(xmlXPathStepOp)); if (cur->steps == NULL) { xmlXPathErrMemory(NULL, "allocating steps\n"); xmlFree(cur); return(NULL); } memset(cur->steps, 0, cur->maxStep * sizeof(xmlXPathStepOp)); cur->last = -1; #ifdef DEBUG_EVAL_COUNTS cur->nb = 0; #endif return(cur); } /** * xmlXPathFreeCompExpr: * @comp: an XPATH comp * * Free up the memory allocated by @comp */ void xmlXPathFreeCompExpr(xmlXPathCompExprPtr comp) { xmlXPathStepOpPtr op; int i; if (comp == NULL) return; if (comp->dict == NULL) { for (i = 0; i < comp->nbStep; i++) { op = &comp->steps[i]; if (op->value4 != NULL) { if (op->op == XPATH_OP_VALUE) xmlXPathFreeObject(op->value4); else xmlFree(op->value4); } if (op->value5 != NULL) xmlFree(op->value5); } } else { for (i = 0; i < comp->nbStep; i++) { op = &comp->steps[i]; if (op->value4 != NULL) { if (op->op == XPATH_OP_VALUE) xmlXPathFreeObject(op->value4); } } xmlDictFree(comp->dict); } if (comp->steps != NULL) { xmlFree(comp->steps); } #ifdef DEBUG_EVAL_COUNTS if (comp->string != NULL) { xmlFree(comp->string); } #endif #ifdef XPATH_STREAMING if (comp->stream != NULL) { xmlFreePatternList(comp->stream); } #endif if (comp->expr != NULL) { xmlFree(comp->expr); } xmlFree(comp); } /** * xmlXPathCompExprAdd: * @comp: the compiled expression * @ch1: first child index * @ch2: second child index * @op: an op * @value: the first int value * @value2: the second int value * @value3: the third int value * @value4: the first string value * @value5: the second string value * * Add a step to an XPath Compiled Expression * * Returns -1 in case of failure, the index otherwise */ static int xmlXPathCompExprAdd(xmlXPathCompExprPtr comp, int ch1, int ch2, xmlXPathOp op, int value, int value2, int value3, void *value4, void *value5) { if (comp->nbStep >= comp->maxStep) { xmlXPathStepOp *real; if (comp->maxStep >= XPATH_MAX_STEPS) { xmlXPathErrMemory(NULL, "adding step\n"); return(-1); } comp->maxStep *= 2; real = (xmlXPathStepOp *) xmlRealloc(comp->steps, comp->maxStep * sizeof(xmlXPathStepOp)); if (real == NULL) { comp->maxStep /= 2; xmlXPathErrMemory(NULL, "adding step\n"); return(-1); } comp->steps = real; } comp->last = comp->nbStep; comp->steps[comp->nbStep].ch1 = ch1; comp->steps[comp->nbStep].ch2 = ch2; comp->steps[comp->nbStep].op = op; comp->steps[comp->nbStep].value = value; comp->steps[comp->nbStep].value2 = value2; comp->steps[comp->nbStep].value3 = value3; if ((comp->dict != NULL) && ((op == XPATH_OP_FUNCTION) || (op == XPATH_OP_VARIABLE) || (op == XPATH_OP_COLLECT))) { if (value4 != NULL) { comp->steps[comp->nbStep].value4 = (xmlChar *) (void *)xmlDictLookup(comp->dict, value4, -1); xmlFree(value4); } else comp->steps[comp->nbStep].value4 = NULL; if (value5 != NULL) { comp->steps[comp->nbStep].value5 = (xmlChar *) (void *)xmlDictLookup(comp->dict, value5, -1); xmlFree(value5); } else comp->steps[comp->nbStep].value5 = NULL; } else { comp->steps[comp->nbStep].value4 = value4; comp->steps[comp->nbStep].value5 = value5; } comp->steps[comp->nbStep].cache = NULL; return(comp->nbStep++); } /** * xmlXPathCompSwap: * @comp: the compiled expression * @op: operation index * * Swaps 2 operations in the compiled expression */ static void xmlXPathCompSwap(xmlXPathStepOpPtr op) { int tmp; #ifndef LIBXML_THREAD_ENABLED /* * Since this manipulates possibly shared variables, this is * disabled if one detects that the library is used in a multithreaded * application */ if (xmlXPathDisableOptimizer) return; #endif tmp = op->ch1; op->ch1 = op->ch2; op->ch2 = tmp; } #define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5) \ xmlXPathCompExprAdd(ctxt->comp, (op1), (op2), \ (op), (val), (val2), (val3), (val4), (val5)) #define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5) \ xmlXPathCompExprAdd(ctxt->comp, ctxt->comp->last, -1, \ (op), (val), (val2), (val3), (val4), (val5)) #define PUSH_LEAVE_EXPR(op, val, val2) \ xmlXPathCompExprAdd(ctxt->comp, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL) #define PUSH_UNARY_EXPR(op, ch, val, val2) \ xmlXPathCompExprAdd(ctxt->comp, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL) #define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) \ xmlXPathCompExprAdd(ctxt->comp, (ch1), (ch2), (op), \ (val), (val2), 0 ,NULL ,NULL) /************************************************************************ * * * XPath object cache structures * * * ************************************************************************/ /* #define XP_DEFAULT_CACHE_ON */ #define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL)) typedef struct _xmlXPathContextCache xmlXPathContextCache; typedef xmlXPathContextCache *xmlXPathContextCachePtr; struct _xmlXPathContextCache { xmlPointerListPtr nodesetObjs; /* contains xmlXPathObjectPtr */ xmlPointerListPtr stringObjs; /* contains xmlXPathObjectPtr */ xmlPointerListPtr booleanObjs; /* contains xmlXPathObjectPtr */ xmlPointerListPtr numberObjs; /* contains xmlXPathObjectPtr */ xmlPointerListPtr miscObjs; /* contains xmlXPathObjectPtr */ int maxNodeset; int maxString; int maxBoolean; int maxNumber; int maxMisc; #ifdef XP_DEBUG_OBJ_USAGE int dbgCachedAll; int dbgCachedNodeset; int dbgCachedString; int dbgCachedBool; int dbgCachedNumber; int dbgCachedPoint; int dbgCachedRange; int dbgCachedLocset; int dbgCachedUsers; int dbgCachedXSLTTree; int dbgCachedUndefined; int dbgReusedAll; int dbgReusedNodeset; int dbgReusedString; int dbgReusedBool; int dbgReusedNumber; int dbgReusedPoint; int dbgReusedRange; int dbgReusedLocset; int dbgReusedUsers; int dbgReusedXSLTTree; int dbgReusedUndefined; #endif }; /************************************************************************ * * * Debugging related functions * * * ************************************************************************/ #define STRANGE \ xmlGenericError(xmlGenericErrorContext, \ "Internal error at %s:%d\n", \ __FILE__, __LINE__); #ifdef LIBXML_DEBUG_ENABLED static void xmlXPathDebugDumpNode(FILE *output, xmlNodePtr cur, int depth) { int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; if (cur == NULL) { fprintf(output, "%s", shift); fprintf(output, "Node is NULL !\n"); return; } if ((cur->type == XML_DOCUMENT_NODE) || (cur->type == XML_HTML_DOCUMENT_NODE)) { fprintf(output, "%s", shift); fprintf(output, " /\n"); } else if (cur->type == XML_ATTRIBUTE_NODE) xmlDebugDumpAttr(output, (xmlAttrPtr)cur, depth); else xmlDebugDumpOneNode(output, cur, depth); } static void xmlXPathDebugDumpNodeList(FILE *output, xmlNodePtr cur, int depth) { xmlNodePtr tmp; int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; if (cur == NULL) { fprintf(output, "%s", shift); fprintf(output, "Node is NULL !\n"); return; } while (cur != NULL) { tmp = cur; cur = cur->next; xmlDebugDumpOneNode(output, tmp, depth); } } static void xmlXPathDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur, int depth) { int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; if (cur == NULL) { fprintf(output, "%s", shift); fprintf(output, "NodeSet is NULL !\n"); return; } if (cur != NULL) { fprintf(output, "Set contains %d nodes:\n", cur->nodeNr); for (i = 0;i < cur->nodeNr;i++) { fprintf(output, "%s", shift); fprintf(output, "%d", i + 1); xmlXPathDebugDumpNode(output, cur->nodeTab[i], depth + 1); } } } static void xmlXPathDebugDumpValueTree(FILE *output, xmlNodeSetPtr cur, int depth) { int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; if ((cur == NULL) || (cur->nodeNr == 0) || (cur->nodeTab[0] == NULL)) { fprintf(output, "%s", shift); fprintf(output, "Value Tree is NULL !\n"); return; } fprintf(output, "%s", shift); fprintf(output, "%d", i + 1); xmlXPathDebugDumpNodeList(output, cur->nodeTab[0]->children, depth + 1); } #if defined(LIBXML_XPTR_ENABLED) static void xmlXPathDebugDumpLocationSet(FILE *output, xmlLocationSetPtr cur, int depth) { int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; if (cur == NULL) { fprintf(output, "%s", shift); fprintf(output, "LocationSet is NULL !\n"); return; } for (i = 0;i < cur->locNr;i++) { fprintf(output, "%s", shift); fprintf(output, "%d : ", i + 1); xmlXPathDebugDumpObject(output, cur->locTab[i], depth + 1); } } #endif /* LIBXML_XPTR_ENABLED */ /** * xmlXPathDebugDumpObject: * @output: the FILE * to dump the output * @cur: the object to inspect * @depth: indentation level * * Dump the content of the object for debugging purposes */ void xmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) { int i; char shift[100]; if (output == NULL) return; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; fprintf(output, "%s", shift); if (cur == NULL) { fprintf(output, "Object is empty (NULL)\n"); return; } switch(cur->type) { case XPATH_UNDEFINED: fprintf(output, "Object is uninitialized\n"); break; case XPATH_NODESET: fprintf(output, "Object is a Node Set :\n"); xmlXPathDebugDumpNodeSet(output, cur->nodesetval, depth); break; case XPATH_XSLT_TREE: fprintf(output, "Object is an XSLT value tree :\n"); xmlXPathDebugDumpValueTree(output, cur->nodesetval, depth); break; case XPATH_BOOLEAN: fprintf(output, "Object is a Boolean : "); if (cur->boolval) fprintf(output, "true\n"); else fprintf(output, "false\n"); break; case XPATH_NUMBER: switch (xmlXPathIsInf(cur->floatval)) { case 1: fprintf(output, "Object is a number : Infinity\n"); break; case -1: fprintf(output, "Object is a number : -Infinity\n"); break; default: if (xmlXPathIsNaN(cur->floatval)) { fprintf(output, "Object is a number : NaN\n"); } else if (cur->floatval == 0 && xmlXPathGetSign(cur->floatval) != 0) { fprintf(output, "Object is a number : 0\n"); } else { fprintf(output, "Object is a number : %0g\n", cur->floatval); } } break; case XPATH_STRING: fprintf(output, "Object is a string : "); xmlDebugDumpString(output, cur->stringval); fprintf(output, "\n"); break; case XPATH_POINT: fprintf(output, "Object is a point : index %d in node", cur->index); xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1); fprintf(output, "\n"); break; case XPATH_RANGE: if ((cur->user2 == NULL) || ((cur->user2 == cur->user) && (cur->index == cur->index2))) { fprintf(output, "Object is a collapsed range :\n"); fprintf(output, "%s", shift); if (cur->index >= 0) fprintf(output, "index %d in ", cur->index); fprintf(output, "node\n"); xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1); } else { fprintf(output, "Object is a range :\n"); fprintf(output, "%s", shift); fprintf(output, "From "); if (cur->index >= 0) fprintf(output, "index %d in ", cur->index); fprintf(output, "node\n"); xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1); fprintf(output, "%s", shift); fprintf(output, "To "); if (cur->index2 >= 0) fprintf(output, "index %d in ", cur->index2); fprintf(output, "node\n"); xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user2, depth + 1); fprintf(output, "\n"); } break; case XPATH_LOCATIONSET: #if defined(LIBXML_XPTR_ENABLED) fprintf(output, "Object is a Location Set:\n"); xmlXPathDebugDumpLocationSet(output, (xmlLocationSetPtr) cur->user, depth); #endif break; case XPATH_USERS: fprintf(output, "Object is user defined\n"); break; } } static void xmlXPathDebugDumpStepOp(FILE *output, xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op, int depth) { int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; fprintf(output, "%s", shift); if (op == NULL) { fprintf(output, "Step is NULL\n"); return; } switch (op->op) { case XPATH_OP_END: fprintf(output, "END"); break; case XPATH_OP_AND: fprintf(output, "AND"); break; case XPATH_OP_OR: fprintf(output, "OR"); break; case XPATH_OP_EQUAL: if (op->value) fprintf(output, "EQUAL ="); else fprintf(output, "EQUAL !="); break; case XPATH_OP_CMP: if (op->value) fprintf(output, "CMP <"); else fprintf(output, "CMP >"); if (!op->value2) fprintf(output, "="); break; case XPATH_OP_PLUS: if (op->value == 0) fprintf(output, "PLUS -"); else if (op->value == 1) fprintf(output, "PLUS +"); else if (op->value == 2) fprintf(output, "PLUS unary -"); else if (op->value == 3) fprintf(output, "PLUS unary - -"); break; case XPATH_OP_MULT: if (op->value == 0) fprintf(output, "MULT *"); else if (op->value == 1) fprintf(output, "MULT div"); else fprintf(output, "MULT mod"); break; case XPATH_OP_UNION: fprintf(output, "UNION"); break; case XPATH_OP_ROOT: fprintf(output, "ROOT"); break; case XPATH_OP_NODE: fprintf(output, "NODE"); break; case XPATH_OP_RESET: fprintf(output, "RESET"); break; case XPATH_OP_SORT: fprintf(output, "SORT"); break; case XPATH_OP_COLLECT: { xmlXPathAxisVal axis = (xmlXPathAxisVal)op->value; xmlXPathTestVal test = (xmlXPathTestVal)op->value2; xmlXPathTypeVal type = (xmlXPathTypeVal)op->value3; const xmlChar *prefix = op->value4; const xmlChar *name = op->value5; fprintf(output, "COLLECT "); switch (axis) { case AXIS_ANCESTOR: fprintf(output, " 'ancestors' "); break; case AXIS_ANCESTOR_OR_SELF: fprintf(output, " 'ancestors-or-self' "); break; case AXIS_ATTRIBUTE: fprintf(output, " 'attributes' "); break; case AXIS_CHILD: fprintf(output, " 'child' "); break; case AXIS_DESCENDANT: fprintf(output, " 'descendant' "); break; case AXIS_DESCENDANT_OR_SELF: fprintf(output, " 'descendant-or-self' "); break; case AXIS_FOLLOWING: fprintf(output, " 'following' "); break; case AXIS_FOLLOWING_SIBLING: fprintf(output, " 'following-siblings' "); break; case AXIS_NAMESPACE: fprintf(output, " 'namespace' "); break; case AXIS_PARENT: fprintf(output, " 'parent' "); break; case AXIS_PRECEDING: fprintf(output, " 'preceding' "); break; case AXIS_PRECEDING_SIBLING: fprintf(output, " 'preceding-sibling' "); break; case AXIS_SELF: fprintf(output, " 'self' "); break; } switch (test) { case NODE_TEST_NONE: fprintf(output, "'none' "); break; case NODE_TEST_TYPE: fprintf(output, "'type' "); break; case NODE_TEST_PI: fprintf(output, "'PI' "); break; case NODE_TEST_ALL: fprintf(output, "'all' "); break; case NODE_TEST_NS: fprintf(output, "'namespace' "); break; case NODE_TEST_NAME: fprintf(output, "'name' "); break; } switch (type) { case NODE_TYPE_NODE: fprintf(output, "'node' "); break; case NODE_TYPE_COMMENT: fprintf(output, "'comment' "); break; case NODE_TYPE_TEXT: fprintf(output, "'text' "); break; case NODE_TYPE_PI: fprintf(output, "'PI' "); break; } if (prefix != NULL) fprintf(output, "%s:", prefix); if (name != NULL) fprintf(output, "%s", (const char *) name); break; } case XPATH_OP_VALUE: { xmlXPathObjectPtr object = (xmlXPathObjectPtr) op->value4; fprintf(output, "ELEM "); xmlXPathDebugDumpObject(output, object, 0); goto finish; } case XPATH_OP_VARIABLE: { const xmlChar *prefix = op->value5; const xmlChar *name = op->value4; if (prefix != NULL) fprintf(output, "VARIABLE %s:%s", prefix, name); else fprintf(output, "VARIABLE %s", name); break; } case XPATH_OP_FUNCTION: { int nbargs = op->value; const xmlChar *prefix = op->value5; const xmlChar *name = op->value4; if (prefix != NULL) fprintf(output, "FUNCTION %s:%s(%d args)", prefix, name, nbargs); else fprintf(output, "FUNCTION %s(%d args)", name, nbargs); break; } case XPATH_OP_ARG: fprintf(output, "ARG"); break; case XPATH_OP_PREDICATE: fprintf(output, "PREDICATE"); break; case XPATH_OP_FILTER: fprintf(output, "FILTER"); break; #ifdef LIBXML_XPTR_ENABLED case XPATH_OP_RANGETO: fprintf(output, "RANGETO"); break; #endif default: fprintf(output, "UNKNOWN %d\n", op->op); return; } fprintf(output, "\n"); finish: if (op->ch1 >= 0) xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch1], depth + 1); if (op->ch2 >= 0) xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch2], depth + 1); } /** * xmlXPathDebugDumpCompExpr: * @output: the FILE * for the output * @comp: the precompiled XPath expression * @depth: the indentation level. * * Dumps the tree of the compiled XPath expression. */ void xmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp, int depth) { int i; char shift[100]; if ((output == NULL) || (comp == NULL)) return; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; fprintf(output, "%s", shift); fprintf(output, "Compiled Expression : %d elements\n", comp->nbStep); i = comp->last; xmlXPathDebugDumpStepOp(output, comp, &comp->steps[i], depth + 1); } #ifdef XP_DEBUG_OBJ_USAGE /* * XPath object usage related debugging variables. */ static int xmlXPathDebugObjCounterUndefined = 0; static int xmlXPathDebugObjCounterNodeset = 0; static int xmlXPathDebugObjCounterBool = 0; static int xmlXPathDebugObjCounterNumber = 0; static int xmlXPathDebugObjCounterString = 0; static int xmlXPathDebugObjCounterPoint = 0; static int xmlXPathDebugObjCounterRange = 0; static int xmlXPathDebugObjCounterLocset = 0; static int xmlXPathDebugObjCounterUsers = 0; static int xmlXPathDebugObjCounterXSLTTree = 0; static int xmlXPathDebugObjCounterAll = 0; static int xmlXPathDebugObjTotalUndefined = 0; static int xmlXPathDebugObjTotalNodeset = 0; static int xmlXPathDebugObjTotalBool = 0; static int xmlXPathDebugObjTotalNumber = 0; static int xmlXPathDebugObjTotalString = 0; static int xmlXPathDebugObjTotalPoint = 0; static int xmlXPathDebugObjTotalRange = 0; static int xmlXPathDebugObjTotalLocset = 0; static int xmlXPathDebugObjTotalUsers = 0; static int xmlXPathDebugObjTotalXSLTTree = 0; static int xmlXPathDebugObjTotalAll = 0; static int xmlXPathDebugObjMaxUndefined = 0; static int xmlXPathDebugObjMaxNodeset = 0; static int xmlXPathDebugObjMaxBool = 0; static int xmlXPathDebugObjMaxNumber = 0; static int xmlXPathDebugObjMaxString = 0; static int xmlXPathDebugObjMaxPoint = 0; static int xmlXPathDebugObjMaxRange = 0; static int xmlXPathDebugObjMaxLocset = 0; static int xmlXPathDebugObjMaxUsers = 0; static int xmlXPathDebugObjMaxXSLTTree = 0; static int xmlXPathDebugObjMaxAll = 0; /* REVISIT TODO: Make this static when committing */ static void xmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt) { if (ctxt != NULL) { if (ctxt->cache != NULL) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; cache->dbgCachedAll = 0; cache->dbgCachedNodeset = 0; cache->dbgCachedString = 0; cache->dbgCachedBool = 0; cache->dbgCachedNumber = 0; cache->dbgCachedPoint = 0; cache->dbgCachedRange = 0; cache->dbgCachedLocset = 0; cache->dbgCachedUsers = 0; cache->dbgCachedXSLTTree = 0; cache->dbgCachedUndefined = 0; cache->dbgReusedAll = 0; cache->dbgReusedNodeset = 0; cache->dbgReusedString = 0; cache->dbgReusedBool = 0; cache->dbgReusedNumber = 0; cache->dbgReusedPoint = 0; cache->dbgReusedRange = 0; cache->dbgReusedLocset = 0; cache->dbgReusedUsers = 0; cache->dbgReusedXSLTTree = 0; cache->dbgReusedUndefined = 0; } } xmlXPathDebugObjCounterUndefined = 0; xmlXPathDebugObjCounterNodeset = 0; xmlXPathDebugObjCounterBool = 0; xmlXPathDebugObjCounterNumber = 0; xmlXPathDebugObjCounterString = 0; xmlXPathDebugObjCounterPoint = 0; xmlXPathDebugObjCounterRange = 0; xmlXPathDebugObjCounterLocset = 0; xmlXPathDebugObjCounterUsers = 0; xmlXPathDebugObjCounterXSLTTree = 0; xmlXPathDebugObjCounterAll = 0; xmlXPathDebugObjTotalUndefined = 0; xmlXPathDebugObjTotalNodeset = 0; xmlXPathDebugObjTotalBool = 0; xmlXPathDebugObjTotalNumber = 0; xmlXPathDebugObjTotalString = 0; xmlXPathDebugObjTotalPoint = 0; xmlXPathDebugObjTotalRange = 0; xmlXPathDebugObjTotalLocset = 0; xmlXPathDebugObjTotalUsers = 0; xmlXPathDebugObjTotalXSLTTree = 0; xmlXPathDebugObjTotalAll = 0; xmlXPathDebugObjMaxUndefined = 0; xmlXPathDebugObjMaxNodeset = 0; xmlXPathDebugObjMaxBool = 0; xmlXPathDebugObjMaxNumber = 0; xmlXPathDebugObjMaxString = 0; xmlXPathDebugObjMaxPoint = 0; xmlXPathDebugObjMaxRange = 0; xmlXPathDebugObjMaxLocset = 0; xmlXPathDebugObjMaxUsers = 0; xmlXPathDebugObjMaxXSLTTree = 0; xmlXPathDebugObjMaxAll = 0; } static void xmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt, xmlXPathObjectType objType) { int isCached = 0; if (ctxt != NULL) { if (ctxt->cache != NULL) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; isCached = 1; cache->dbgReusedAll++; switch (objType) { case XPATH_UNDEFINED: cache->dbgReusedUndefined++; break; case XPATH_NODESET: cache->dbgReusedNodeset++; break; case XPATH_BOOLEAN: cache->dbgReusedBool++; break; case XPATH_NUMBER: cache->dbgReusedNumber++; break; case XPATH_STRING: cache->dbgReusedString++; break; case XPATH_POINT: cache->dbgReusedPoint++; break; case XPATH_RANGE: cache->dbgReusedRange++; break; case XPATH_LOCATIONSET: cache->dbgReusedLocset++; break; case XPATH_USERS: cache->dbgReusedUsers++; break; case XPATH_XSLT_TREE: cache->dbgReusedXSLTTree++; break; default: break; } } } switch (objType) { case XPATH_UNDEFINED: if (! isCached) xmlXPathDebugObjTotalUndefined++; xmlXPathDebugObjCounterUndefined++; if (xmlXPathDebugObjCounterUndefined > xmlXPathDebugObjMaxUndefined) xmlXPathDebugObjMaxUndefined = xmlXPathDebugObjCounterUndefined; break; case XPATH_NODESET: if (! isCached) xmlXPathDebugObjTotalNodeset++; xmlXPathDebugObjCounterNodeset++; if (xmlXPathDebugObjCounterNodeset > xmlXPathDebugObjMaxNodeset) xmlXPathDebugObjMaxNodeset = xmlXPathDebugObjCounterNodeset; break; case XPATH_BOOLEAN: if (! isCached) xmlXPathDebugObjTotalBool++; xmlXPathDebugObjCounterBool++; if (xmlXPathDebugObjCounterBool > xmlXPathDebugObjMaxBool) xmlXPathDebugObjMaxBool = xmlXPathDebugObjCounterBool; break; case XPATH_NUMBER: if (! isCached) xmlXPathDebugObjTotalNumber++; xmlXPathDebugObjCounterNumber++; if (xmlXPathDebugObjCounterNumber > xmlXPathDebugObjMaxNumber) xmlXPathDebugObjMaxNumber = xmlXPathDebugObjCounterNumber; break; case XPATH_STRING: if (! isCached) xmlXPathDebugObjTotalString++; xmlXPathDebugObjCounterString++; if (xmlXPathDebugObjCounterString > xmlXPathDebugObjMaxString) xmlXPathDebugObjMaxString = xmlXPathDebugObjCounterString; break; case XPATH_POINT: if (! isCached) xmlXPathDebugObjTotalPoint++; xmlXPathDebugObjCounterPoint++; if (xmlXPathDebugObjCounterPoint > xmlXPathDebugObjMaxPoint) xmlXPathDebugObjMaxPoint = xmlXPathDebugObjCounterPoint; break; case XPATH_RANGE: if (! isCached) xmlXPathDebugObjTotalRange++; xmlXPathDebugObjCounterRange++; if (xmlXPathDebugObjCounterRange > xmlXPathDebugObjMaxRange) xmlXPathDebugObjMaxRange = xmlXPathDebugObjCounterRange; break; case XPATH_LOCATIONSET: if (! isCached) xmlXPathDebugObjTotalLocset++; xmlXPathDebugObjCounterLocset++; if (xmlXPathDebugObjCounterLocset > xmlXPathDebugObjMaxLocset) xmlXPathDebugObjMaxLocset = xmlXPathDebugObjCounterLocset; break; case XPATH_USERS: if (! isCached) xmlXPathDebugObjTotalUsers++; xmlXPathDebugObjCounterUsers++; if (xmlXPathDebugObjCounterUsers > xmlXPathDebugObjMaxUsers) xmlXPathDebugObjMaxUsers = xmlXPathDebugObjCounterUsers; break; case XPATH_XSLT_TREE: if (! isCached) xmlXPathDebugObjTotalXSLTTree++; xmlXPathDebugObjCounterXSLTTree++; if (xmlXPathDebugObjCounterXSLTTree > xmlXPathDebugObjMaxXSLTTree) xmlXPathDebugObjMaxXSLTTree = xmlXPathDebugObjCounterXSLTTree; break; default: break; } if (! isCached) xmlXPathDebugObjTotalAll++; xmlXPathDebugObjCounterAll++; if (xmlXPathDebugObjCounterAll > xmlXPathDebugObjMaxAll) xmlXPathDebugObjMaxAll = xmlXPathDebugObjCounterAll; } static void xmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt, xmlXPathObjectType objType) { int isCached = 0; if (ctxt != NULL) { if (ctxt->cache != NULL) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; isCached = 1; cache->dbgCachedAll++; switch (objType) { case XPATH_UNDEFINED: cache->dbgCachedUndefined++; break; case XPATH_NODESET: cache->dbgCachedNodeset++; break; case XPATH_BOOLEAN: cache->dbgCachedBool++; break; case XPATH_NUMBER: cache->dbgCachedNumber++; break; case XPATH_STRING: cache->dbgCachedString++; break; case XPATH_POINT: cache->dbgCachedPoint++; break; case XPATH_RANGE: cache->dbgCachedRange++; break; case XPATH_LOCATIONSET: cache->dbgCachedLocset++; break; case XPATH_USERS: cache->dbgCachedUsers++; break; case XPATH_XSLT_TREE: cache->dbgCachedXSLTTree++; break; default: break; } } } switch (objType) { case XPATH_UNDEFINED: xmlXPathDebugObjCounterUndefined--; break; case XPATH_NODESET: xmlXPathDebugObjCounterNodeset--; break; case XPATH_BOOLEAN: xmlXPathDebugObjCounterBool--; break; case XPATH_NUMBER: xmlXPathDebugObjCounterNumber--; break; case XPATH_STRING: xmlXPathDebugObjCounterString--; break; case XPATH_POINT: xmlXPathDebugObjCounterPoint--; break; case XPATH_RANGE: xmlXPathDebugObjCounterRange--; break; case XPATH_LOCATIONSET: xmlXPathDebugObjCounterLocset--; break; case XPATH_USERS: xmlXPathDebugObjCounterUsers--; break; case XPATH_XSLT_TREE: xmlXPathDebugObjCounterXSLTTree--; break; default: break; } xmlXPathDebugObjCounterAll--; } /* REVISIT TODO: Make this static when committing */ static void xmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt) { int reqAll, reqNodeset, reqString, reqBool, reqNumber, reqXSLTTree, reqUndefined; int caAll = 0, caNodeset = 0, caString = 0, caBool = 0, caNumber = 0, caXSLTTree = 0, caUndefined = 0; int reAll = 0, reNodeset = 0, reString = 0, reBool = 0, reNumber = 0, reXSLTTree = 0, reUndefined = 0; int leftObjs = xmlXPathDebugObjCounterAll; reqAll = xmlXPathDebugObjTotalAll; reqNodeset = xmlXPathDebugObjTotalNodeset; reqString = xmlXPathDebugObjTotalString; reqBool = xmlXPathDebugObjTotalBool; reqNumber = xmlXPathDebugObjTotalNumber; reqXSLTTree = xmlXPathDebugObjTotalXSLTTree; reqUndefined = xmlXPathDebugObjTotalUndefined; printf("# XPath object usage:\n"); if (ctxt != NULL) { if (ctxt->cache != NULL) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; reAll = cache->dbgReusedAll; reqAll += reAll; reNodeset = cache->dbgReusedNodeset; reqNodeset += reNodeset; reString = cache->dbgReusedString; reqString += reString; reBool = cache->dbgReusedBool; reqBool += reBool; reNumber = cache->dbgReusedNumber; reqNumber += reNumber; reXSLTTree = cache->dbgReusedXSLTTree; reqXSLTTree += reXSLTTree; reUndefined = cache->dbgReusedUndefined; reqUndefined += reUndefined; caAll = cache->dbgCachedAll; caBool = cache->dbgCachedBool; caNodeset = cache->dbgCachedNodeset; caString = cache->dbgCachedString; caNumber = cache->dbgCachedNumber; caXSLTTree = cache->dbgCachedXSLTTree; caUndefined = cache->dbgCachedUndefined; if (cache->nodesetObjs) leftObjs -= cache->nodesetObjs->number; if (cache->stringObjs) leftObjs -= cache->stringObjs->number; if (cache->booleanObjs) leftObjs -= cache->booleanObjs->number; if (cache->numberObjs) leftObjs -= cache->numberObjs->number; if (cache->miscObjs) leftObjs -= cache->miscObjs->number; } } printf("# all\n"); printf("# total : %d\n", reqAll); printf("# left : %d\n", leftObjs); printf("# created: %d\n", xmlXPathDebugObjTotalAll); printf("# reused : %d\n", reAll); printf("# max : %d\n", xmlXPathDebugObjMaxAll); printf("# node-sets\n"); printf("# total : %d\n", reqNodeset); printf("# created: %d\n", xmlXPathDebugObjTotalNodeset); printf("# reused : %d\n", reNodeset); printf("# max : %d\n", xmlXPathDebugObjMaxNodeset); printf("# strings\n"); printf("# total : %d\n", reqString); printf("# created: %d\n", xmlXPathDebugObjTotalString); printf("# reused : %d\n", reString); printf("# max : %d\n", xmlXPathDebugObjMaxString); printf("# booleans\n"); printf("# total : %d\n", reqBool); printf("# created: %d\n", xmlXPathDebugObjTotalBool); printf("# reused : %d\n", reBool); printf("# max : %d\n", xmlXPathDebugObjMaxBool); printf("# numbers\n"); printf("# total : %d\n", reqNumber); printf("# created: %d\n", xmlXPathDebugObjTotalNumber); printf("# reused : %d\n", reNumber); printf("# max : %d\n", xmlXPathDebugObjMaxNumber); printf("# XSLT result tree fragments\n"); printf("# total : %d\n", reqXSLTTree); printf("# created: %d\n", xmlXPathDebugObjTotalXSLTTree); printf("# reused : %d\n", reXSLTTree); printf("# max : %d\n", xmlXPathDebugObjMaxXSLTTree); printf("# undefined\n"); printf("# total : %d\n", reqUndefined); printf("# created: %d\n", xmlXPathDebugObjTotalUndefined); printf("# reused : %d\n", reUndefined); printf("# max : %d\n", xmlXPathDebugObjMaxUndefined); } #endif /* XP_DEBUG_OBJ_USAGE */ #endif /* LIBXML_DEBUG_ENABLED */ /************************************************************************ * * * XPath object caching * * * ************************************************************************/ /** * xmlXPathNewCache: * * Create a new object cache * * Returns the xmlXPathCache just allocated. */ static xmlXPathContextCachePtr xmlXPathNewCache(void) { xmlXPathContextCachePtr ret; ret = (xmlXPathContextCachePtr) xmlMalloc(sizeof(xmlXPathContextCache)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating object cache\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathContextCache)); ret->maxNodeset = 100; ret->maxString = 100; ret->maxBoolean = 100; ret->maxNumber = 100; ret->maxMisc = 100; return(ret); } static void xmlXPathCacheFreeObjectList(xmlPointerListPtr list) { int i; xmlXPathObjectPtr obj; if (list == NULL) return; for (i = 0; i < list->number; i++) { obj = list->items[i]; /* * Note that it is already assured that we don't need to * look out for namespace nodes in the node-set. */ if (obj->nodesetval != NULL) { if (obj->nodesetval->nodeTab != NULL) xmlFree(obj->nodesetval->nodeTab); xmlFree(obj->nodesetval); } xmlFree(obj); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjCounterAll--; #endif } xmlPointerListFree(list); } static void xmlXPathFreeCache(xmlXPathContextCachePtr cache) { if (cache == NULL) return; if (cache->nodesetObjs) xmlXPathCacheFreeObjectList(cache->nodesetObjs); if (cache->stringObjs) xmlXPathCacheFreeObjectList(cache->stringObjs); if (cache->booleanObjs) xmlXPathCacheFreeObjectList(cache->booleanObjs); if (cache->numberObjs) xmlXPathCacheFreeObjectList(cache->numberObjs); if (cache->miscObjs) xmlXPathCacheFreeObjectList(cache->miscObjs); xmlFree(cache); } /** * xmlXPathContextSetCache: * * @ctxt: the XPath context * @active: enables/disables (creates/frees) the cache * @value: a value with semantics dependant on @options * @options: options (currently only the value 0 is used) * * Creates/frees an object cache on the XPath context. * If activates XPath objects (xmlXPathObject) will be cached internally * to be reused. * @options: * 0: This will set the XPath object caching: * @value: * This will set the maximum number of XPath objects * to be cached per slot * There are 5 slots for: node-set, string, number, boolean, and * misc objects. Use <0 for the default number (100). * Other values for @options have currently no effect. * * Returns 0 if the setting succeeded, and -1 on API or internal errors. */ int xmlXPathContextSetCache(xmlXPathContextPtr ctxt, int active, int value, int options) { if (ctxt == NULL) return(-1); if (active) { xmlXPathContextCachePtr cache; if (ctxt->cache == NULL) { ctxt->cache = xmlXPathNewCache(); if (ctxt->cache == NULL) return(-1); } cache = (xmlXPathContextCachePtr) ctxt->cache; if (options == 0) { if (value < 0) value = 100; cache->maxNodeset = value; cache->maxString = value; cache->maxNumber = value; cache->maxBoolean = value; cache->maxMisc = value; } } else if (ctxt->cache != NULL) { xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); ctxt->cache = NULL; } return(0); } /** * xmlXPathCacheWrapNodeSet: * @ctxt: the XPath context * @val: the NodePtr value * * This is the cached version of xmlXPathWrapNodeSet(). * Wrap the Nodeset @val in a new xmlXPathObjectPtr * * Returns the created or reused object. */ static xmlXPathObjectPtr xmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val) { if ((ctxt != NULL) && (ctxt->cache != NULL)) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; if ((cache->miscObjs != NULL) && (cache->miscObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->miscObjs->items[--cache->miscObjs->number]; ret->type = XPATH_NODESET; ret->nodesetval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); #endif return(ret); } } return(xmlXPathWrapNodeSet(val)); } /** * xmlXPathCacheWrapString: * @ctxt: the XPath context * @val: the xmlChar * value * * This is the cached version of xmlXPathWrapString(). * Wraps the @val string into an XPath object. * * Returns the created or reused object. */ static xmlXPathObjectPtr xmlXPathCacheWrapString(xmlXPathContextPtr ctxt, xmlChar *val) { if ((ctxt != NULL) && (ctxt->cache != NULL)) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; if ((cache->stringObjs != NULL) && (cache->stringObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->stringObjs->items[--cache->stringObjs->number]; ret->type = XPATH_STRING; ret->stringval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); #endif return(ret); } else if ((cache->miscObjs != NULL) && (cache->miscObjs->number != 0)) { xmlXPathObjectPtr ret; /* * Fallback to misc-cache. */ ret = (xmlXPathObjectPtr) cache->miscObjs->items[--cache->miscObjs->number]; ret->type = XPATH_STRING; ret->stringval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); #endif return(ret); } } return(xmlXPathWrapString(val)); } /** * xmlXPathCacheNewNodeSet: * @ctxt: the XPath context * @val: the NodePtr value * * This is the cached version of xmlXPathNewNodeSet(). * Acquire an xmlXPathObjectPtr of type NodeSet and initialize * it with the single Node @val * * Returns the created or reused object. */ static xmlXPathObjectPtr xmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val) { if ((ctxt != NULL) && (ctxt->cache)) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; if ((cache->nodesetObjs != NULL) && (cache->nodesetObjs->number != 0)) { xmlXPathObjectPtr ret; /* * Use the nodset-cache. */ ret = (xmlXPathObjectPtr) cache->nodesetObjs->items[--cache->nodesetObjs->number]; ret->type = XPATH_NODESET; ret->boolval = 0; if (val) { if ((ret->nodesetval->nodeMax == 0) || (val->type == XML_NAMESPACE_DECL)) { xmlXPathNodeSetAddUnique(ret->nodesetval, val); } else { ret->nodesetval->nodeTab[0] = val; ret->nodesetval->nodeNr = 1; } } #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); #endif return(ret); } else if ((cache->miscObjs != NULL) && (cache->miscObjs->number != 0)) { xmlXPathObjectPtr ret; /* * Fallback to misc-cache. */ ret = (xmlXPathObjectPtr) cache->miscObjs->items[--cache->miscObjs->number]; ret->type = XPATH_NODESET; ret->boolval = 0; ret->nodesetval = xmlXPathNodeSetCreate(val); if (ret->nodesetval == NULL) { ctxt->lastError.domain = XML_FROM_XPATH; ctxt->lastError.code = XML_ERR_NO_MEMORY; return(NULL); } #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); #endif return(ret); } } return(xmlXPathNewNodeSet(val)); } /** * xmlXPathCacheNewCString: * @ctxt: the XPath context * @val: the char * value * * This is the cached version of xmlXPathNewCString(). * Acquire an xmlXPathObjectPtr of type string and of value @val * * Returns the created or reused object. */ static xmlXPathObjectPtr xmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val) { if ((ctxt != NULL) && (ctxt->cache)) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; if ((cache->stringObjs != NULL) && (cache->stringObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->stringObjs->items[--cache->stringObjs->number]; ret->type = XPATH_STRING; ret->stringval = xmlStrdup(BAD_CAST val); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); #endif return(ret); } else if ((cache->miscObjs != NULL) && (cache->miscObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->miscObjs->items[--cache->miscObjs->number]; ret->type = XPATH_STRING; ret->stringval = xmlStrdup(BAD_CAST val); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); #endif return(ret); } } return(xmlXPathNewCString(val)); } /** * xmlXPathCacheNewString: * @ctxt: the XPath context * @val: the xmlChar * value * * This is the cached version of xmlXPathNewString(). * Acquire an xmlXPathObjectPtr of type string and of value @val * * Returns the created or reused object. */ static xmlXPathObjectPtr xmlXPathCacheNewString(xmlXPathContextPtr ctxt, const xmlChar *val) { if ((ctxt != NULL) && (ctxt->cache)) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; if ((cache->stringObjs != NULL) && (cache->stringObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->stringObjs->items[--cache->stringObjs->number]; ret->type = XPATH_STRING; if (val != NULL) ret->stringval = xmlStrdup(val); else ret->stringval = xmlStrdup((const xmlChar *)""); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); #endif return(ret); } else if ((cache->miscObjs != NULL) && (cache->miscObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->miscObjs->items[--cache->miscObjs->number]; ret->type = XPATH_STRING; if (val != NULL) ret->stringval = xmlStrdup(val); else ret->stringval = xmlStrdup((const xmlChar *)""); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); #endif return(ret); } } return(xmlXPathNewString(val)); } /** * xmlXPathCacheNewBoolean: * @ctxt: the XPath context * @val: the boolean value * * This is the cached version of xmlXPathNewBoolean(). * Acquires an xmlXPathObjectPtr of type boolean and of value @val * * Returns the created or reused object. */ static xmlXPathObjectPtr xmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt, int val) { if ((ctxt != NULL) && (ctxt->cache)) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; if ((cache->booleanObjs != NULL) && (cache->booleanObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->booleanObjs->items[--cache->booleanObjs->number]; ret->type = XPATH_BOOLEAN; ret->boolval = (val != 0); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); #endif return(ret); } else if ((cache->miscObjs != NULL) && (cache->miscObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->miscObjs->items[--cache->miscObjs->number]; ret->type = XPATH_BOOLEAN; ret->boolval = (val != 0); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); #endif return(ret); } } return(xmlXPathNewBoolean(val)); } /** * xmlXPathCacheNewFloat: * @ctxt: the XPath context * @val: the double value * * This is the cached version of xmlXPathNewFloat(). * Acquires an xmlXPathObjectPtr of type double and of value @val * * Returns the created or reused object. */ static xmlXPathObjectPtr xmlXPathCacheNewFloat(xmlXPathContextPtr ctxt, double val) { if ((ctxt != NULL) && (ctxt->cache)) { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; if ((cache->numberObjs != NULL) && (cache->numberObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->numberObjs->items[--cache->numberObjs->number]; ret->type = XPATH_NUMBER; ret->floatval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); #endif return(ret); } else if ((cache->miscObjs != NULL) && (cache->miscObjs->number != 0)) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) cache->miscObjs->items[--cache->miscObjs->number]; ret->type = XPATH_NUMBER; ret->floatval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); #endif return(ret); } } return(xmlXPathNewFloat(val)); } /** * xmlXPathCacheConvertString: * @ctxt: the XPath context * @val: an XPath object * * This is the cached version of xmlXPathConvertString(). * Converts an existing object to its string() equivalent * * Returns a created or reused object, the old one is freed (cached) * (or the operation is done directly on @val) */ static xmlXPathObjectPtr xmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { xmlChar *res = NULL; if (val == NULL) return(xmlXPathCacheNewCString(ctxt, "")); switch (val->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); #endif break; case XPATH_NODESET: case XPATH_XSLT_TREE: res = xmlXPathCastNodeSetToString(val->nodesetval); break; case XPATH_STRING: return(val); case XPATH_BOOLEAN: res = xmlXPathCastBooleanToString(val->boolval); break; case XPATH_NUMBER: res = xmlXPathCastNumberToString(val->floatval); break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO; break; } xmlXPathReleaseObject(ctxt, val); if (res == NULL) return(xmlXPathCacheNewCString(ctxt, "")); return(xmlXPathCacheWrapString(ctxt, res)); } /** * xmlXPathCacheObjectCopy: * @ctxt: the XPath context * @val: the original object * * This is the cached version of xmlXPathObjectCopy(). * Acquire a copy of a given object * * Returns a created or reused created object. */ static xmlXPathObjectPtr xmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { if (val == NULL) return(NULL); if (XP_HAS_CACHE(ctxt)) { switch (val->type) { case XPATH_NODESET: return(xmlXPathCacheWrapNodeSet(ctxt, xmlXPathNodeSetMerge(NULL, val->nodesetval))); case XPATH_STRING: return(xmlXPathCacheNewString(ctxt, val->stringval)); case XPATH_BOOLEAN: return(xmlXPathCacheNewBoolean(ctxt, val->boolval)); case XPATH_NUMBER: return(xmlXPathCacheNewFloat(ctxt, val->floatval)); default: break; } } return(xmlXPathObjectCopy(val)); } /** * xmlXPathCacheConvertBoolean: * @ctxt: the XPath context * @val: an XPath object * * This is the cached version of xmlXPathConvertBoolean(). * Converts an existing object to its boolean() equivalent * * Returns a created or reused object, the old one is freed (or the operation * is done directly on @val) */ static xmlXPathObjectPtr xmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { xmlXPathObjectPtr ret; if (val == NULL) return(xmlXPathCacheNewBoolean(ctxt, 0)); if (val->type == XPATH_BOOLEAN) return(val); ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(val)); xmlXPathReleaseObject(ctxt, val); return(ret); } /** * xmlXPathCacheConvertNumber: * @ctxt: the XPath context * @val: an XPath object * * This is the cached version of xmlXPathConvertNumber(). * Converts an existing object to its number() equivalent * * Returns a created or reused object, the old one is freed (or the operation * is done directly on @val) */ static xmlXPathObjectPtr xmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { xmlXPathObjectPtr ret; if (val == NULL) return(xmlXPathCacheNewFloat(ctxt, 0.0)); if (val->type == XPATH_NUMBER) return(val); ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(val)); xmlXPathReleaseObject(ctxt, val); return(ret); } /************************************************************************ * * * Parser stacks related functions and macros * * * ************************************************************************/ /** * xmlXPathSetFrame: * @ctxt: an XPath parser context * * Set the callee evaluation frame * * Returns the previous frame value to be restored once done */ static int xmlXPathSetFrame(xmlXPathParserContextPtr ctxt) { int ret; if (ctxt == NULL) return(0); ret = ctxt->valueFrame; ctxt->valueFrame = ctxt->valueNr; return(ret); } /** * xmlXPathPopFrame: * @ctxt: an XPath parser context * @frame: the previous frame value * * Remove the callee evaluation frame */ static void xmlXPathPopFrame(xmlXPathParserContextPtr ctxt, int frame) { if (ctxt == NULL) return; if (ctxt->valueNr < ctxt->valueFrame) { xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR); } ctxt->valueFrame = frame; } /** * valuePop: * @ctxt: an XPath evaluation context * * Pops the top XPath object from the value stack * * Returns the XPath object just removed */ xmlXPathObjectPtr valuePop(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr ret; if ((ctxt == NULL) || (ctxt->valueNr <= 0)) return (NULL); if (ctxt->valueNr <= ctxt->valueFrame) { xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR); return (NULL); } ctxt->valueNr--; if (ctxt->valueNr > 0) ctxt->value = ctxt->valueTab[ctxt->valueNr - 1]; else ctxt->value = NULL; ret = ctxt->valueTab[ctxt->valueNr]; ctxt->valueTab[ctxt->valueNr] = NULL; return (ret); } /** * valuePush: * @ctxt: an XPath evaluation context * @value: the XPath object * * Pushes a new XPath object on top of the value stack * * returns the number of items on the value stack */ int valuePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value) { if ((ctxt == NULL) || (value == NULL)) return(-1); if (ctxt->valueNr >= ctxt->valueMax) { xmlXPathObjectPtr *tmp; if (ctxt->valueMax >= XPATH_MAX_STACK_DEPTH) { xmlXPathErrMemory(NULL, "XPath stack depth limit reached\n"); ctxt->error = XPATH_MEMORY_ERROR; return (0); } tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab, 2 * ctxt->valueMax * sizeof(ctxt->valueTab[0])); if (tmp == NULL) { xmlXPathErrMemory(NULL, "pushing value\n"); ctxt->error = XPATH_MEMORY_ERROR; return (0); } ctxt->valueMax *= 2; ctxt->valueTab = tmp; } ctxt->valueTab[ctxt->valueNr] = value; ctxt->value = value; return (ctxt->valueNr++); } /** * xmlXPathPopBoolean: * @ctxt: an XPath parser context * * Pops a boolean from the stack, handling conversion if needed. * Check error with #xmlXPathCheckError. * * Returns the boolean */ int xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr obj; int ret; obj = valuePop(ctxt); if (obj == NULL) { xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); return(0); } if (obj->type != XPATH_BOOLEAN) ret = xmlXPathCastToBoolean(obj); else ret = obj->boolval; xmlXPathReleaseObject(ctxt->context, obj); return(ret); } /** * xmlXPathPopNumber: * @ctxt: an XPath parser context * * Pops a number from the stack, handling conversion if needed. * Check error with #xmlXPathCheckError. * * Returns the number */ double xmlXPathPopNumber (xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr obj; double ret; obj = valuePop(ctxt); if (obj == NULL) { xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); return(0); } if (obj->type != XPATH_NUMBER) ret = xmlXPathCastToNumber(obj); else ret = obj->floatval; xmlXPathReleaseObject(ctxt->context, obj); return(ret); } /** * xmlXPathPopString: * @ctxt: an XPath parser context * * Pops a string from the stack, handling conversion if needed. * Check error with #xmlXPathCheckError. * * Returns the string */ xmlChar * xmlXPathPopString (xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr obj; xmlChar * ret; obj = valuePop(ctxt); if (obj == NULL) { xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); return(NULL); } ret = xmlXPathCastToString(obj); /* this does required strdup */ /* TODO: needs refactoring somewhere else */ if (obj->stringval == ret) obj->stringval = NULL; xmlXPathReleaseObject(ctxt->context, obj); return(ret); } /** * xmlXPathPopNodeSet: * @ctxt: an XPath parser context * * Pops a node-set from the stack, handling conversion if needed. * Check error with #xmlXPathCheckError. * * Returns the node-set */ xmlNodeSetPtr xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr obj; xmlNodeSetPtr ret; if (ctxt == NULL) return(NULL); if (ctxt->value == NULL) { xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); return(NULL); } if (!xmlXPathStackIsNodeSet(ctxt)) { xmlXPathSetTypeError(ctxt); return(NULL); } obj = valuePop(ctxt); ret = obj->nodesetval; #if 0 /* to fix memory leak of not clearing obj->user */ if (obj->boolval && obj->user != NULL) xmlFreeNodeList((xmlNodePtr) obj->user); #endif obj->nodesetval = NULL; xmlXPathReleaseObject(ctxt->context, obj); return(ret); } /** * xmlXPathPopExternal: * @ctxt: an XPath parser context * * Pops an external object from the stack, handling conversion if needed. * Check error with #xmlXPathCheckError. * * Returns the object */ void * xmlXPathPopExternal (xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr obj; void * ret; if ((ctxt == NULL) || (ctxt->value == NULL)) { xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); return(NULL); } if (ctxt->value->type != XPATH_USERS) { xmlXPathSetTypeError(ctxt); return(NULL); } obj = valuePop(ctxt); ret = obj->user; obj->user = NULL; xmlXPathReleaseObject(ctxt->context, obj); return(ret); } /* * Macros for accessing the content. Those should be used only by the parser, * and not exported. * * Dirty macros, i.e. one need to make assumption on the context to use them * * CUR_PTR return the current pointer to the xmlChar to be parsed. * CUR returns the current xmlChar value, i.e. a 8 bit value * in ISO-Latin or UTF-8. * This should be used internally by the parser * only to compare to ASCII values otherwise it would break when * running with UTF-8 encoding. * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only * to compare on ASCII based substring. * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined * strings within the parser. * CURRENT Returns the current char value, with the full decoding of * UTF-8 if we are using this mode. It returns an int. * NEXT Skip to the next character, this does the proper decoding * in UTF-8 mode. It also pop-up unfinished entities on the fly. * It returns the pointer to the current xmlChar. */ #define CUR (*ctxt->cur) #define SKIP(val) ctxt->cur += (val) #define NXT(val) ctxt->cur[(val)] #define CUR_PTR ctxt->cur #define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l) #define COPY_BUF(l,b,i,v) \ if (l == 1) b[i++] = (xmlChar) v; \ else i += xmlCopyChar(l,&b[i],v) #define NEXTL(l) ctxt->cur += l #define SKIP_BLANKS \ while (IS_BLANK_CH(*(ctxt->cur))) NEXT #define CURRENT (*ctxt->cur) #define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) #ifndef DBL_DIG #define DBL_DIG 16 #endif #ifndef DBL_EPSILON #define DBL_EPSILON 1E-9 #endif #define UPPER_DOUBLE 1E9 #define LOWER_DOUBLE 1E-5 #define LOWER_DOUBLE_EXP 5 #define INTEGER_DIGITS DBL_DIG #define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP)) #define EXPONENT_DIGITS (3 + 2) /** * xmlXPathFormatNumber: * @number: number to format * @buffer: output buffer * @buffersize: size of output buffer * * Convert the number into a string representation. */ static void xmlXPathFormatNumber(double number, char buffer[], int buffersize) { switch (xmlXPathIsInf(number)) { case 1: if (buffersize > (int)sizeof("Infinity")) snprintf(buffer, buffersize, "Infinity"); break; case -1: if (buffersize > (int)sizeof("-Infinity")) snprintf(buffer, buffersize, "-Infinity"); break; default: if (xmlXPathIsNaN(number)) { if (buffersize > (int)sizeof("NaN")) snprintf(buffer, buffersize, "NaN"); } else if (number == 0 && xmlXPathGetSign(number) != 0) { snprintf(buffer, buffersize, "0"); } else if (number == ((int) number)) { char work[30]; char *ptr, *cur; int value = (int) number; ptr = &buffer[0]; if (value == 0) { *ptr++ = '0'; } else { snprintf(work, 29, "%d", value); cur = &work[0]; while ((*cur) && (ptr - buffer < buffersize)) { *ptr++ = *cur++; } } if (ptr - buffer < buffersize) { *ptr = 0; } else if (buffersize > 0) { ptr--; *ptr = 0; } } else { /* For the dimension of work, DBL_DIG is number of significant digits EXPONENT is only needed for "scientific notation" 3 is sign, decimal point, and terminating zero LOWER_DOUBLE_EXP is max number of leading zeroes in fraction Note that this dimension is slightly (a few characters) larger than actually necessary. */ char work[DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP]; int integer_place, fraction_place; char *ptr; char *after_fraction; double absolute_value; int size; absolute_value = fabs(number); /* * First choose format - scientific or regular floating point. * In either case, result is in work, and after_fraction points * just past the fractional part. */ if ( ((absolute_value > UPPER_DOUBLE) || (absolute_value < LOWER_DOUBLE)) && (absolute_value != 0.0) ) { /* Use scientific notation */ integer_place = DBL_DIG + EXPONENT_DIGITS + 1; fraction_place = DBL_DIG - 1; size = snprintf(work, sizeof(work),"%*.*e", integer_place, fraction_place, number); while ((size > 0) && (work[size] != 'e')) size--; } else { /* Use regular notation */ if (absolute_value > 0.0) { integer_place = (int)log10(absolute_value); if (integer_place > 0) fraction_place = DBL_DIG - integer_place - 1; else fraction_place = DBL_DIG - integer_place; } else { fraction_place = 1; } size = snprintf(work, sizeof(work), "%0.*f", fraction_place, number); } /* Remove fractional trailing zeroes */ after_fraction = work + size; ptr = after_fraction; while (*(--ptr) == '0') ; if (*ptr != '.') ptr++; while ((*ptr++ = *after_fraction++) != 0); /* Finally copy result back to caller */ size = strlen(work) + 1; if (size > buffersize) { work[buffersize - 1] = 0; size = buffersize; } memmove(buffer, work, size); } break; } } /************************************************************************ * * * Routines to handle NodeSets * * * ************************************************************************/ /** * xmlXPathOrderDocElems: * @doc: an input document * * Call this routine to speed up XPath computation on static documents. * This stamps all the element nodes with the document order * Like for line information, the order is kept in the element->content * field, the value stored is actually - the node number (starting at -1) * to be able to differentiate from line numbers. * * Returns the number of elements found in the document or -1 in case * of error. */ long xmlXPathOrderDocElems(xmlDocPtr doc) { long count = 0; xmlNodePtr cur; if (doc == NULL) return(-1); cur = doc->children; while (cur != NULL) { if (cur->type == XML_ELEMENT_NODE) { cur->content = (void *) (-(++count)); if (cur->children != NULL) { cur = cur->children; continue; } } if (cur->next != NULL) { cur = cur->next; continue; } do { cur = cur->parent; if (cur == NULL) break; if (cur == (xmlNodePtr) doc) { cur = NULL; break; } if (cur->next != NULL) { cur = cur->next; break; } } while (cur != NULL); } return(count); } /** * xmlXPathCmpNodes: * @node1: the first node * @node2: the second node * * Compare two nodes w.r.t document order * * Returns -2 in case of error 1 if first point < second point, 0 if * it's the same node, -1 otherwise */ int xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { int depth1, depth2; int attr1 = 0, attr2 = 0; xmlNodePtr attrNode1 = NULL, attrNode2 = NULL; xmlNodePtr cur, root; if ((node1 == NULL) || (node2 == NULL)) return(-2); /* * a couple of optimizations which will avoid computations in most cases */ if (node1 == node2) /* trivial case */ return(0); if (node1->type == XML_ATTRIBUTE_NODE) { attr1 = 1; attrNode1 = node1; node1 = node1->parent; } if (node2->type == XML_ATTRIBUTE_NODE) { attr2 = 1; attrNode2 = node2; node2 = node2->parent; } if (node1 == node2) { if (attr1 == attr2) { /* not required, but we keep attributes in order */ if (attr1 != 0) { cur = attrNode2->prev; while (cur != NULL) { if (cur == attrNode1) return (1); cur = cur->prev; } return (-1); } return(0); } if (attr2 == 1) return(1); return(-1); } if ((node1->type == XML_NAMESPACE_DECL) || (node2->type == XML_NAMESPACE_DECL)) return(1); if (node1 == node2->prev) return(1); if (node1 == node2->next) return(-1); /* * Speedup using document order if availble. */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && (0 > (long) node1->content) && (0 > (long) node2->content) && (node1->doc == node2->doc)) { long l1, l2; l1 = -((long) node1->content); l2 = -((long) node2->content); if (l1 < l2) return(1); if (l1 > l2) return(-1); } /* * compute depth to root */ for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { if (cur == node1) return(1); depth2++; } root = cur; for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { if (cur == node2) return(-1); depth1++; } /* * Distinct document (or distinct entities :-( ) case. */ if (root != cur) { return(-2); } /* * get the nearest common ancestor. */ while (depth1 > depth2) { depth1--; node1 = node1->parent; } while (depth2 > depth1) { depth2--; node2 = node2->parent; } while (node1->parent != node2->parent) { node1 = node1->parent; node2 = node2->parent; /* should not happen but just in case ... */ if ((node1 == NULL) || (node2 == NULL)) return(-2); } /* * Find who's first. */ if (node1 == node2->prev) return(1); if (node1 == node2->next) return(-1); /* * Speedup using document order if availble. */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && (0 > (long) node1->content) && (0 > (long) node2->content) && (node1->doc == node2->doc)) { long l1, l2; l1 = -((long) node1->content); l2 = -((long) node2->content); if (l1 < l2) return(1); if (l1 > l2) return(-1); } for (cur = node1->next;cur != NULL;cur = cur->next) if (cur == node2) return(1); return(-1); /* assume there is no sibling list corruption */ } #ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON /** * xmlXPathCmpNodesExt: * @node1: the first node * @node2: the second node * * Compare two nodes w.r.t document order. * This one is optimized for handling of non-element nodes. * * Returns -2 in case of error 1 if first point < second point, 0 if * it's the same node, -1 otherwise */ static int xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { int depth1, depth2; int misc = 0, precedence1 = 0, precedence2 = 0; xmlNodePtr miscNode1 = NULL, miscNode2 = NULL; xmlNodePtr cur, root; long l1, l2; if ((node1 == NULL) || (node2 == NULL)) return(-2); if (node1 == node2) return(0); /* * a couple of optimizations which will avoid computations in most cases */ switch (node1->type) { case XML_ELEMENT_NODE: if (node2->type == XML_ELEMENT_NODE) { if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */ (0 > (long) node2->content) && (node1->doc == node2->doc)) { l1 = -((long) node1->content); l2 = -((long) node2->content); if (l1 < l2) return(1); if (l1 > l2) return(-1); } else goto turtle_comparison; } break; case XML_ATTRIBUTE_NODE: precedence1 = 1; /* element is owner */ miscNode1 = node1; node1 = node1->parent; misc = 1; break; case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_COMMENT_NODE: case XML_PI_NODE: { miscNode1 = node1; /* * Find nearest element node. */ if (node1->prev != NULL) { do { node1 = node1->prev; if (node1->type == XML_ELEMENT_NODE) { precedence1 = 3; /* element in prev-sibl axis */ break; } if (node1->prev == NULL) { precedence1 = 2; /* element is parent */ /* * URGENT TODO: Are there any cases, where the * parent of such a node is not an element node? */ node1 = node1->parent; break; } } while (1); } else { precedence1 = 2; /* element is parent */ node1 = node1->parent; } if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) || (0 <= (long) node1->content)) { /* * Fallback for whatever case. */ node1 = miscNode1; precedence1 = 0; } else misc = 1; } break; case XML_NAMESPACE_DECL: /* * TODO: why do we return 1 for namespace nodes? */ return(1); default: break; } switch (node2->type) { case XML_ELEMENT_NODE: break; case XML_ATTRIBUTE_NODE: precedence2 = 1; /* element is owner */ miscNode2 = node2; node2 = node2->parent; misc = 1; break; case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_COMMENT_NODE: case XML_PI_NODE: { miscNode2 = node2; if (node2->prev != NULL) { do { node2 = node2->prev; if (node2->type == XML_ELEMENT_NODE) { precedence2 = 3; /* element in prev-sibl axis */ break; } if (node2->prev == NULL) { precedence2 = 2; /* element is parent */ node2 = node2->parent; break; } } while (1); } else { precedence2 = 2; /* element is parent */ node2 = node2->parent; } if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) || (0 <= (long) node1->content)) { node2 = miscNode2; precedence2 = 0; } else misc = 1; } break; case XML_NAMESPACE_DECL: return(1); default: break; } if (misc) { if (node1 == node2) { if (precedence1 == precedence2) { /* * The ugly case; but normally there aren't many * adjacent non-element nodes around. */ cur = miscNode2->prev; while (cur != NULL) { if (cur == miscNode1) return(1); if (cur->type == XML_ELEMENT_NODE) return(-1); cur = cur->prev; } return (-1); } else { /* * Evaluate based on higher precedence wrt to the element. * TODO: This assumes attributes are sorted before content. * Is this 100% correct? */ if (precedence1 < precedence2) return(1); else return(-1); } } /* * Special case: One of the helper-elements is contained by the other. * * * Text-1(precedence1 == 2) * * Text-6(precedence2 == 3) * */ if ((precedence2 == 3) && (precedence1 > 1)) { cur = node1->parent; while (cur) { if (cur == node2) return(1); cur = cur->parent; } } if ((precedence1 == 3) && (precedence2 > 1)) { cur = node2->parent; while (cur) { if (cur == node1) return(-1); cur = cur->parent; } } } /* * Speedup using document order if availble. */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && (0 > (long) node1->content) && (0 > (long) node2->content) && (node1->doc == node2->doc)) { l1 = -((long) node1->content); l2 = -((long) node2->content); if (l1 < l2) return(1); if (l1 > l2) return(-1); } turtle_comparison: if (node1 == node2->prev) return(1); if (node1 == node2->next) return(-1); /* * compute depth to root */ for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { if (cur == node1) return(1); depth2++; } root = cur; for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { if (cur == node2) return(-1); depth1++; } /* * Distinct document (or distinct entities :-( ) case. */ if (root != cur) { return(-2); } /* * get the nearest common ancestor. */ while (depth1 > depth2) { depth1--; node1 = node1->parent; } while (depth2 > depth1) { depth2--; node2 = node2->parent; } while (node1->parent != node2->parent) { node1 = node1->parent; node2 = node2->parent; /* should not happen but just in case ... */ if ((node1 == NULL) || (node2 == NULL)) return(-2); } /* * Find who's first. */ if (node1 == node2->prev) return(1); if (node1 == node2->next) return(-1); /* * Speedup using document order if availble. */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && (0 > (long) node1->content) && (0 > (long) node2->content) && (node1->doc == node2->doc)) { l1 = -((long) node1->content); l2 = -((long) node2->content); if (l1 < l2) return(1); if (l1 > l2) return(-1); } for (cur = node1->next;cur != NULL;cur = cur->next) if (cur == node2) return(1); return(-1); /* assume there is no sibling list corruption */ } #endif /* XP_OPTIMIZED_NON_ELEM_COMPARISON */ /** * xmlXPathNodeSetSort: * @set: the node set * * Sort the node set in document order */ void xmlXPathNodeSetSort(xmlNodeSetPtr set) { #ifndef WITH_TIM_SORT int i, j, incr, len; xmlNodePtr tmp; #endif if (set == NULL) return; #ifndef WITH_TIM_SORT /* * Use the old Shell's sort implementation to sort the node-set * Timsort ought to be quite faster */ len = set->nodeNr; for (incr = len / 2; incr > 0; incr /= 2) { for (i = incr; i < len; i++) { j = i - incr; while (j >= 0) { #ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON if (xmlXPathCmpNodesExt(set->nodeTab[j], set->nodeTab[j + incr]) == -1) #else if (xmlXPathCmpNodes(set->nodeTab[j], set->nodeTab[j + incr]) == -1) #endif { tmp = set->nodeTab[j]; set->nodeTab[j] = set->nodeTab[j + incr]; set->nodeTab[j + incr] = tmp; j -= incr; } else break; } } } #else /* WITH_TIM_SORT */ libxml_domnode_tim_sort(set->nodeTab, set->nodeNr); #endif /* WITH_TIM_SORT */ } #define XML_NODESET_DEFAULT 10 /** * xmlXPathNodeSetDupNs: * @node: the parent node of the namespace XPath node * @ns: the libxml namespace declaration node. * * Namespace node in libxml don't match the XPath semantic. In a node set * the namespace nodes are duplicated and the next pointer is set to the * parent node in the XPath semantic. * * Returns the newly created object. */ static xmlNodePtr xmlXPathNodeSetDupNs(xmlNodePtr node, xmlNsPtr ns) { xmlNsPtr cur; if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) return(NULL); if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) return((xmlNodePtr) ns); /* * Allocate a new Namespace and fill the fields. */ cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); if (cur == NULL) { xmlXPathErrMemory(NULL, "duplicating namespace\n"); return(NULL); } memset(cur, 0, sizeof(xmlNs)); cur->type = XML_NAMESPACE_DECL; if (ns->href != NULL) cur->href = xmlStrdup(ns->href); if (ns->prefix != NULL) cur->prefix = xmlStrdup(ns->prefix); cur->next = (xmlNsPtr) node; return((xmlNodePtr) cur); } /** * xmlXPathNodeSetFreeNs: * @ns: the XPath namespace node found in a nodeset. * * Namespace nodes in libxml don't match the XPath semantic. In a node set * the namespace nodes are duplicated and the next pointer is set to the * parent node in the XPath semantic. Check if such a node needs to be freed */ void xmlXPathNodeSetFreeNs(xmlNsPtr ns) { if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) return; if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) { if (ns->href != NULL) xmlFree((xmlChar *)ns->href); if (ns->prefix != NULL) xmlFree((xmlChar *)ns->prefix); xmlFree(ns); } } /** * xmlXPathNodeSetCreate: * @val: an initial xmlNodePtr, or NULL * * Create a new xmlNodeSetPtr of type double and of value @val * * Returns the newly created object. */ xmlNodeSetPtr xmlXPathNodeSetCreate(xmlNodePtr val) { xmlNodeSetPtr ret; ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating nodeset\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); if (val != NULL) { ret->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (ret->nodeTab == NULL) { xmlXPathErrMemory(NULL, "creating nodeset\n"); xmlFree(ret); return(NULL); } memset(ret->nodeTab, 0 , XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); ret->nodeMax = XML_NODESET_DEFAULT; if (val->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) val; ret->nodeTab[ret->nodeNr++] = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); } else ret->nodeTab[ret->nodeNr++] = val; } return(ret); } /** * xmlXPathNodeSetCreateSize: * @size: the initial size of the set * * Create a new xmlNodeSetPtr of type double and of value @val * * Returns the newly created object. */ static xmlNodeSetPtr xmlXPathNodeSetCreateSize(int size) { xmlNodeSetPtr ret; ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating nodeset\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); if (size < XML_NODESET_DEFAULT) size = XML_NODESET_DEFAULT; ret->nodeTab = (xmlNodePtr *) xmlMalloc(size * sizeof(xmlNodePtr)); if (ret->nodeTab == NULL) { xmlXPathErrMemory(NULL, "creating nodeset\n"); xmlFree(ret); return(NULL); } memset(ret->nodeTab, 0 , size * (size_t) sizeof(xmlNodePtr)); ret->nodeMax = size; return(ret); } /** * xmlXPathNodeSetContains: * @cur: the node-set * @val: the node * * checks whether @cur contains @val * * Returns true (1) if @cur contains @val, false (0) otherwise */ int xmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val) { int i; if ((cur == NULL) || (val == NULL)) return(0); if (val->type == XML_NAMESPACE_DECL) { for (i = 0; i < cur->nodeNr; i++) { if (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) { xmlNsPtr ns1, ns2; ns1 = (xmlNsPtr) val; ns2 = (xmlNsPtr) cur->nodeTab[i]; if (ns1 == ns2) return(1); if ((ns1->next != NULL) && (ns2->next == ns1->next) && (xmlStrEqual(ns1->prefix, ns2->prefix))) return(1); } } } else { for (i = 0; i < cur->nodeNr; i++) { if (cur->nodeTab[i] == val) return(1); } } return(0); } /** * xmlXPathNodeSetAddNs: * @cur: the initial node set * @node: the hosting node * @ns: a the namespace node * * add a new namespace node to an existing NodeSet * * Returns 0 in case of success and -1 in case of error */ int xmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) { int i; if ((cur == NULL) || (ns == NULL) || (node == NULL) || (ns->type != XML_NAMESPACE_DECL) || (node->type != XML_ELEMENT_NODE)) return(-1); /* @@ with_ns to check whether namespace nodes should be looked at @@ */ /* * prevent duplicates */ for (i = 0;i < cur->nodeNr;i++) { if ((cur->nodeTab[i] != NULL) && (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) && (((xmlNsPtr)cur->nodeTab[i])->next == (xmlNsPtr) node) && (xmlStrEqual(ns->prefix, ((xmlNsPtr)cur->nodeTab[i])->prefix))) return(0); } /* * grow the nodeTab if needed */ if (cur->nodeMax == 0) { cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (cur->nodeTab == NULL) { xmlXPathErrMemory(NULL, "growing nodeset\n"); return(-1); } memset(cur->nodeTab, 0 , XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); cur->nodeMax = XML_NODESET_DEFAULT; } else if (cur->nodeNr == cur->nodeMax) { xmlNodePtr *temp; if (cur->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "growing nodeset hit limit\n"); return(-1); } temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "growing nodeset\n"); return(-1); } cur->nodeMax *= 2; cur->nodeTab = temp; } cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns); return(0); } /** * xmlXPathNodeSetAdd: * @cur: the initial node set * @val: a new xmlNodePtr * * add a new xmlNodePtr to an existing NodeSet * * Returns 0 in case of success, and -1 in case of error */ int xmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val) { int i; if ((cur == NULL) || (val == NULL)) return(-1); /* @@ with_ns to check whether namespace nodes should be looked at @@ */ /* * prevent duplcates */ for (i = 0;i < cur->nodeNr;i++) if (cur->nodeTab[i] == val) return(0); /* * grow the nodeTab if needed */ if (cur->nodeMax == 0) { cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (cur->nodeTab == NULL) { xmlXPathErrMemory(NULL, "growing nodeset\n"); return(-1); } memset(cur->nodeTab, 0 , XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); cur->nodeMax = XML_NODESET_DEFAULT; } else if (cur->nodeNr == cur->nodeMax) { xmlNodePtr *temp; if (cur->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "growing nodeset hit limit\n"); return(-1); } temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "growing nodeset\n"); return(-1); } cur->nodeMax *= 2; cur->nodeTab = temp; } if (val->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) val; cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); } else cur->nodeTab[cur->nodeNr++] = val; return(0); } /** * xmlXPathNodeSetAddUnique: * @cur: the initial node set * @val: a new xmlNodePtr * * add a new xmlNodePtr to an existing NodeSet, optimized version * when we are sure the node is not already in the set. * * Returns 0 in case of success and -1 in case of failure */ int xmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) { if ((cur == NULL) || (val == NULL)) return(-1); /* @@ with_ns to check whether namespace nodes should be looked at @@ */ /* * grow the nodeTab if needed */ if (cur->nodeMax == 0) { cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (cur->nodeTab == NULL) { xmlXPathErrMemory(NULL, "growing nodeset\n"); return(-1); } memset(cur->nodeTab, 0 , XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); cur->nodeMax = XML_NODESET_DEFAULT; } else if (cur->nodeNr == cur->nodeMax) { xmlNodePtr *temp; if (cur->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "growing nodeset hit limit\n"); return(-1); } temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "growing nodeset\n"); return(-1); } cur->nodeTab = temp; cur->nodeMax *= 2; } if (val->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) val; cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); } else cur->nodeTab[cur->nodeNr++] = val; return(0); } /** * xmlXPathNodeSetMerge: * @val1: the first NodeSet or NULL * @val2: the second NodeSet * * Merges two nodesets, all nodes from @val2 are added to @val1 * if @val1 is NULL, a new set is created and copied from @val2 * * Returns @val1 once extended or NULL in case of error. */ xmlNodeSetPtr xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { int i, j, initNr, skip; xmlNodePtr n1, n2; if (val2 == NULL) return(val1); if (val1 == NULL) { val1 = xmlXPathNodeSetCreate(NULL); if (val1 == NULL) return (NULL); #if 0 /* * TODO: The optimization won't work in every case, since * those nasty namespace nodes need to be added with * xmlXPathNodeSetDupNs() to the set; thus a pure * memcpy is not possible. * If there was a flag on the nodesetval, indicating that * some temporary nodes are in, that would be helpfull. */ /* * Optimization: Create an equally sized node-set * and memcpy the content. */ val1 = xmlXPathNodeSetCreateSize(val2->nodeNr); if (val1 == NULL) return(NULL); if (val2->nodeNr != 0) { if (val2->nodeNr == 1) *(val1->nodeTab) = *(val2->nodeTab); else { memcpy(val1->nodeTab, val2->nodeTab, val2->nodeNr * sizeof(xmlNodePtr)); } val1->nodeNr = val2->nodeNr; } return(val1); #endif } /* @@ with_ns to check whether namespace nodes should be looked at @@ */ initNr = val1->nodeNr; for (i = 0;i < val2->nodeNr;i++) { n2 = val2->nodeTab[i]; /* * check against duplicates */ skip = 0; for (j = 0; j < initNr; j++) { n1 = val1->nodeTab[j]; if (n1 == n2) { skip = 1; break; } else if ((n1->type == XML_NAMESPACE_DECL) && (n2->type == XML_NAMESPACE_DECL)) { if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && (xmlStrEqual(((xmlNsPtr) n1)->prefix, ((xmlNsPtr) n2)->prefix))) { skip = 1; break; } } } if (skip) continue; /* * grow the nodeTab if needed */ if (val1->nodeMax == 0) { val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (val1->nodeTab == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); return(NULL); } memset(val1->nodeTab, 0 , XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); val1->nodeMax = XML_NODESET_DEFAULT; } else if (val1->nodeNr == val1->nodeMax) { xmlNodePtr *temp; if (val1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); return(NULL); } temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); return(NULL); } val1->nodeTab = temp; val1->nodeMax *= 2; } if (n2->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) n2; val1->nodeTab[val1->nodeNr++] = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); } else val1->nodeTab[val1->nodeNr++] = n2; } return(val1); } /** * xmlXPathNodeSetMergeAndClear: * @set1: the first NodeSet or NULL * @set2: the second NodeSet * @hasSet2NsNodes: 1 if set2 contains namespaces nodes * * Merges two nodesets, all nodes from @set2 are added to @set1 * if @set1 is NULL, a new set is created and copied from @set2. * Checks for duplicate nodes. Clears set2. * * Returns @set1 once extended or NULL in case of error. */ static xmlNodeSetPtr xmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2, int hasNullEntries) { if ((set1 == NULL) && (hasNullEntries == 0)) { /* * Note that doing a memcpy of the list, namespace nodes are * just assigned to set1, since set2 is cleared anyway. */ set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); if (set1 == NULL) return(NULL); if (set2->nodeNr != 0) { memcpy(set1->nodeTab, set2->nodeTab, set2->nodeNr * sizeof(xmlNodePtr)); set1->nodeNr = set2->nodeNr; } } else { int i, j, initNbSet1; xmlNodePtr n1, n2; if (set1 == NULL) set1 = xmlXPathNodeSetCreate(NULL); if (set1 == NULL) return (NULL); initNbSet1 = set1->nodeNr; for (i = 0;i < set2->nodeNr;i++) { n2 = set2->nodeTab[i]; /* * Skip NULLed entries. */ if (n2 == NULL) continue; /* * Skip duplicates. */ for (j = 0; j < initNbSet1; j++) { n1 = set1->nodeTab[j]; if (n1 == n2) { goto skip_node; } else if ((n1->type == XML_NAMESPACE_DECL) && (n2->type == XML_NAMESPACE_DECL)) { if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && (xmlStrEqual(((xmlNsPtr) n1)->prefix, ((xmlNsPtr) n2)->prefix))) { /* * Free the namespace node. */ set2->nodeTab[i] = NULL; xmlXPathNodeSetFreeNs((xmlNsPtr) n2); goto skip_node; } } } /* * grow the nodeTab if needed */ if (set1->nodeMax == 0) { set1->nodeTab = (xmlNodePtr *) xmlMalloc( XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (set1->nodeTab == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); return(NULL); } memset(set1->nodeTab, 0, XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); set1->nodeMax = XML_NODESET_DEFAULT; } else if (set1->nodeNr >= set1->nodeMax) { xmlNodePtr *temp; if (set1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); return(NULL); } temp = (xmlNodePtr *) xmlRealloc( set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); return(NULL); } set1->nodeTab = temp; set1->nodeMax *= 2; } if (n2->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) n2; set1->nodeTab[set1->nodeNr++] = xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); } else set1->nodeTab[set1->nodeNr++] = n2; skip_node: {} } } set2->nodeNr = 0; return(set1); } /** * xmlXPathNodeSetMergeAndClearNoDupls: * @set1: the first NodeSet or NULL * @set2: the second NodeSet * @hasSet2NsNodes: 1 if set2 contains namespaces nodes * * Merges two nodesets, all nodes from @set2 are added to @set1 * if @set1 is NULL, a new set is created and copied from @set2. * Doesn't chack for duplicate nodes. Clears set2. * * Returns @set1 once extended or NULL in case of error. */ static xmlNodeSetPtr xmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2, int hasNullEntries) { if (set2 == NULL) return(set1); if ((set1 == NULL) && (hasNullEntries == 0)) { /* * Note that doing a memcpy of the list, namespace nodes are * just assigned to set1, since set2 is cleared anyway. */ set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); if (set1 == NULL) return(NULL); if (set2->nodeNr != 0) { memcpy(set1->nodeTab, set2->nodeTab, set2->nodeNr * sizeof(xmlNodePtr)); set1->nodeNr = set2->nodeNr; } } else { int i; xmlNodePtr n2; if (set1 == NULL) set1 = xmlXPathNodeSetCreate(NULL); if (set1 == NULL) return (NULL); for (i = 0;i < set2->nodeNr;i++) { n2 = set2->nodeTab[i]; /* * Skip NULLed entries. */ if (n2 == NULL) continue; if (set1->nodeMax == 0) { set1->nodeTab = (xmlNodePtr *) xmlMalloc( XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); if (set1->nodeTab == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); return(NULL); } memset(set1->nodeTab, 0, XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); set1->nodeMax = XML_NODESET_DEFAULT; } else if (set1->nodeNr >= set1->nodeMax) { xmlNodePtr *temp; if (set1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); return(NULL); } temp = (xmlNodePtr *) xmlRealloc( set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); if (temp == NULL) { xmlXPathErrMemory(NULL, "merging nodeset\n"); return(NULL); } set1->nodeTab = temp; set1->nodeMax *= 2; } set1->nodeTab[set1->nodeNr++] = n2; } } set2->nodeNr = 0; return(set1); } /** * xmlXPathNodeSetDel: * @cur: the initial node set * @val: an xmlNodePtr * * Removes an xmlNodePtr from an existing NodeSet */ void xmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) { int i; if (cur == NULL) return; if (val == NULL) return; /* * find node in nodeTab */ for (i = 0;i < cur->nodeNr;i++) if (cur->nodeTab[i] == val) break; if (i >= cur->nodeNr) { /* not found */ #ifdef DEBUG xmlGenericError(xmlGenericErrorContext, "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n", val->name); #endif return; } if ((cur->nodeTab[i] != NULL) && (cur->nodeTab[i]->type == XML_NAMESPACE_DECL)) xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]); cur->nodeNr--; for (;i < cur->nodeNr;i++) cur->nodeTab[i] = cur->nodeTab[i + 1]; cur->nodeTab[cur->nodeNr] = NULL; } /** * xmlXPathNodeSetRemove: * @cur: the initial node set * @val: the index to remove * * Removes an entry from an existing NodeSet list. */ void xmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) { if (cur == NULL) return; if (val >= cur->nodeNr) return; if ((cur->nodeTab[val] != NULL) && (cur->nodeTab[val]->type == XML_NAMESPACE_DECL)) xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]); cur->nodeNr--; for (;val < cur->nodeNr;val++) cur->nodeTab[val] = cur->nodeTab[val + 1]; cur->nodeTab[cur->nodeNr] = NULL; } /** * xmlXPathFreeNodeSet: * @obj: the xmlNodeSetPtr to free * * Free the NodeSet compound (not the actual nodes !). */ void xmlXPathFreeNodeSet(xmlNodeSetPtr obj) { if (obj == NULL) return; if (obj->nodeTab != NULL) { int i; /* @@ with_ns to check whether namespace nodes should be looked at @@ */ for (i = 0;i < obj->nodeNr;i++) if ((obj->nodeTab[i] != NULL) && (obj->nodeTab[i]->type == XML_NAMESPACE_DECL)) xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); xmlFree(obj->nodeTab); } xmlFree(obj); } /** * xmlXPathNodeSetClear: * @set: the node set to clear * * Clears the list from all temporary XPath objects (e.g. namespace nodes * are feed), but does *not* free the list itself. Sets the length of the * list to 0. */ static void xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes) { if ((set == NULL) || (set->nodeNr <= 0)) return; else if (hasNsNodes) { int i; xmlNodePtr node; for (i = 0; i < set->nodeNr; i++) { node = set->nodeTab[i]; if ((node != NULL) && (node->type == XML_NAMESPACE_DECL)) xmlXPathNodeSetFreeNs((xmlNsPtr) node); } } set->nodeNr = 0; } /** * xmlXPathNodeSetClearFromPos: * @set: the node set to be cleared * @pos: the start position to clear from * * Clears the list from temporary XPath objects (e.g. namespace nodes * are feed) starting with the entry at @pos, but does *not* free the list * itself. Sets the length of the list to @pos. */ static void xmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes) { if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr)) return; else if ((hasNsNodes)) { int i; xmlNodePtr node; for (i = pos; i < set->nodeNr; i++) { node = set->nodeTab[i]; if ((node != NULL) && (node->type == XML_NAMESPACE_DECL)) xmlXPathNodeSetFreeNs((xmlNsPtr) node); } } set->nodeNr = pos; } /** * xmlXPathFreeValueTree: * @obj: the xmlNodeSetPtr to free * * Free the NodeSet compound and the actual tree, this is different * from xmlXPathFreeNodeSet() */ static void xmlXPathFreeValueTree(xmlNodeSetPtr obj) { int i; if (obj == NULL) return; if (obj->nodeTab != NULL) { for (i = 0;i < obj->nodeNr;i++) { if (obj->nodeTab[i] != NULL) { if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) { xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); } else { xmlFreeNodeList(obj->nodeTab[i]); } } } xmlFree(obj->nodeTab); } xmlFree(obj); } #if defined(DEBUG) || defined(DEBUG_STEP) /** * xmlGenericErrorContextNodeSet: * @output: a FILE * for the output * @obj: the xmlNodeSetPtr to display * * Quick display of a NodeSet */ void xmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) { int i; if (output == NULL) output = xmlGenericErrorContext; if (obj == NULL) { fprintf(output, "NodeSet == NULL !\n"); return; } if (obj->nodeNr == 0) { fprintf(output, "NodeSet is empty\n"); return; } if (obj->nodeTab == NULL) { fprintf(output, " nodeTab == NULL !\n"); return; } for (i = 0; i < obj->nodeNr; i++) { if (obj->nodeTab[i] == NULL) { fprintf(output, " NULL !\n"); return; } if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) || (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE)) fprintf(output, " /"); else if (obj->nodeTab[i]->name == NULL) fprintf(output, " noname!"); else fprintf(output, " %s", obj->nodeTab[i]->name); } fprintf(output, "\n"); } #endif /** * xmlXPathNewNodeSet: * @val: the NodePtr value * * Create a new xmlXPathObjectPtr of type NodeSet and initialize * it with the single Node @val * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathNewNodeSet(xmlNodePtr val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating nodeset\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_NODESET; ret->boolval = 0; ret->nodesetval = xmlXPathNodeSetCreate(val); /* @@ with_ns to check whether namespace nodes should be looked at @@ */ #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); #endif return(ret); } /** * xmlXPathNewValueTree: * @val: the NodePtr value * * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize * it with the tree root @val * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathNewValueTree(xmlNodePtr val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating result value tree\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_XSLT_TREE; ret->boolval = 1; ret->user = (void *) val; ret->nodesetval = xmlXPathNodeSetCreate(val); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_XSLT_TREE); #endif return(ret); } /** * xmlXPathNewNodeSetList: * @val: an existing NodeSet * * Create a new xmlXPathObjectPtr of type NodeSet and initialize * it with the Nodeset @val * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathNewNodeSetList(xmlNodeSetPtr val) { xmlXPathObjectPtr ret; int i; if (val == NULL) ret = NULL; else if (val->nodeTab == NULL) ret = xmlXPathNewNodeSet(NULL); else { ret = xmlXPathNewNodeSet(val->nodeTab[0]); if (ret) { for (i = 1; i < val->nodeNr; ++i) { if (xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]) < 0) break; } } } return (ret); } /** * xmlXPathWrapNodeSet: * @val: the NodePtr value * * Wrap the Nodeset @val in a new xmlXPathObjectPtr * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathWrapNodeSet(xmlNodeSetPtr val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating node set object\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_NODESET; ret->nodesetval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); #endif return(ret); } /** * xmlXPathFreeNodeSetList: * @obj: an existing NodeSetList object * * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in * the list contrary to xmlXPathFreeObject(). */ void xmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) { if (obj == NULL) return; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageReleased(NULL, obj->type); #endif xmlFree(obj); } /** * xmlXPathDifference: * @nodes1: a node-set * @nodes2: a node-set * * Implements the EXSLT - Sets difference() function: * node-set set:difference (node-set, node-set) * * Returns the difference between the two node sets, or nodes1 if * nodes2 is empty */ xmlNodeSetPtr xmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { xmlNodeSetPtr ret; int i, l1; xmlNodePtr cur; if (xmlXPathNodeSetIsEmpty(nodes2)) return(nodes1); ret = xmlXPathNodeSetCreate(NULL); if (xmlXPathNodeSetIsEmpty(nodes1)) return(ret); l1 = xmlXPathNodeSetGetLength(nodes1); for (i = 0; i < l1; i++) { cur = xmlXPathNodeSetItem(nodes1, i); if (!xmlXPathNodeSetContains(nodes2, cur)) { if (xmlXPathNodeSetAddUnique(ret, cur) < 0) break; } } return(ret); } /** * xmlXPathIntersection: * @nodes1: a node-set * @nodes2: a node-set * * Implements the EXSLT - Sets intersection() function: * node-set set:intersection (node-set, node-set) * * Returns a node set comprising the nodes that are within both the * node sets passed as arguments */ xmlNodeSetPtr xmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL); int i, l1; xmlNodePtr cur; if (ret == NULL) return(ret); if (xmlXPathNodeSetIsEmpty(nodes1)) return(ret); if (xmlXPathNodeSetIsEmpty(nodes2)) return(ret); l1 = xmlXPathNodeSetGetLength(nodes1); for (i = 0; i < l1; i++) { cur = xmlXPathNodeSetItem(nodes1, i); if (xmlXPathNodeSetContains(nodes2, cur)) { if (xmlXPathNodeSetAddUnique(ret, cur) < 0) break; } } return(ret); } /** * xmlXPathDistinctSorted: * @nodes: a node-set, sorted by document order * * Implements the EXSLT - Sets distinct() function: * node-set set:distinct (node-set) * * Returns a subset of the nodes contained in @nodes, or @nodes if * it is empty */ xmlNodeSetPtr xmlXPathDistinctSorted (xmlNodeSetPtr nodes) { xmlNodeSetPtr ret; xmlHashTablePtr hash; int i, l; xmlChar * strval; xmlNodePtr cur; if (xmlXPathNodeSetIsEmpty(nodes)) return(nodes); ret = xmlXPathNodeSetCreate(NULL); if (ret == NULL) return(ret); l = xmlXPathNodeSetGetLength(nodes); hash = xmlHashCreate (l); for (i = 0; i < l; i++) { cur = xmlXPathNodeSetItem(nodes, i); strval = xmlXPathCastNodeToString(cur); if (xmlHashLookup(hash, strval) == NULL) { xmlHashAddEntry(hash, strval, strval); if (xmlXPathNodeSetAddUnique(ret, cur) < 0) break; } else { xmlFree(strval); } } xmlHashFree(hash, (xmlHashDeallocator) xmlFree); return(ret); } /** * xmlXPathDistinct: * @nodes: a node-set * * Implements the EXSLT - Sets distinct() function: * node-set set:distinct (node-set) * @nodes is sorted by document order, then #exslSetsDistinctSorted * is called with the sorted node-set * * Returns a subset of the nodes contained in @nodes, or @nodes if * it is empty */ xmlNodeSetPtr xmlXPathDistinct (xmlNodeSetPtr nodes) { if (xmlXPathNodeSetIsEmpty(nodes)) return(nodes); xmlXPathNodeSetSort(nodes); return(xmlXPathDistinctSorted(nodes)); } /** * xmlXPathHasSameNodes: * @nodes1: a node-set * @nodes2: a node-set * * Implements the EXSLT - Sets has-same-nodes function: * boolean set:has-same-node(node-set, node-set) * * Returns true (1) if @nodes1 shares any node with @nodes2, false (0) * otherwise */ int xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { int i, l; xmlNodePtr cur; if (xmlXPathNodeSetIsEmpty(nodes1) || xmlXPathNodeSetIsEmpty(nodes2)) return(0); l = xmlXPathNodeSetGetLength(nodes1); for (i = 0; i < l; i++) { cur = xmlXPathNodeSetItem(nodes1, i); if (xmlXPathNodeSetContains(nodes2, cur)) return(1); } return(0); } /** * xmlXPathNodeLeadingSorted: * @nodes: a node-set, sorted by document order * @node: a node * * Implements the EXSLT - Sets leading() function: * node-set set:leading (node-set, node-set) * * Returns the nodes in @nodes that precede @node in document order, * @nodes if @node is NULL or an empty node-set if @nodes * doesn't contain @node */ xmlNodeSetPtr xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { int i, l; xmlNodePtr cur; xmlNodeSetPtr ret; if (node == NULL) return(nodes); ret = xmlXPathNodeSetCreate(NULL); if (ret == NULL) return(ret); if (xmlXPathNodeSetIsEmpty(nodes) || (!xmlXPathNodeSetContains(nodes, node))) return(ret); l = xmlXPathNodeSetGetLength(nodes); for (i = 0; i < l; i++) { cur = xmlXPathNodeSetItem(nodes, i); if (cur == node) break; if (xmlXPathNodeSetAddUnique(ret, cur) < 0) break; } return(ret); } /** * xmlXPathNodeLeading: * @nodes: a node-set * @node: a node * * Implements the EXSLT - Sets leading() function: * node-set set:leading (node-set, node-set) * @nodes is sorted by document order, then #exslSetsNodeLeadingSorted * is called. * * Returns the nodes in @nodes that precede @node in document order, * @nodes if @node is NULL or an empty node-set if @nodes * doesn't contain @node */ xmlNodeSetPtr xmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node) { xmlXPathNodeSetSort(nodes); return(xmlXPathNodeLeadingSorted(nodes, node)); } /** * xmlXPathLeadingSorted: * @nodes1: a node-set, sorted by document order * @nodes2: a node-set, sorted by document order * * Implements the EXSLT - Sets leading() function: * node-set set:leading (node-set, node-set) * * Returns the nodes in @nodes1 that precede the first node in @nodes2 * in document order, @nodes1 if @nodes2 is NULL or empty or * an empty node-set if @nodes1 doesn't contain @nodes2 */ xmlNodeSetPtr xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { if (xmlXPathNodeSetIsEmpty(nodes2)) return(nodes1); return(xmlXPathNodeLeadingSorted(nodes1, xmlXPathNodeSetItem(nodes2, 1))); } /** * xmlXPathLeading: * @nodes1: a node-set * @nodes2: a node-set * * Implements the EXSLT - Sets leading() function: * node-set set:leading (node-set, node-set) * @nodes1 and @nodes2 are sorted by document order, then * #exslSetsLeadingSorted is called. * * Returns the nodes in @nodes1 that precede the first node in @nodes2 * in document order, @nodes1 if @nodes2 is NULL or empty or * an empty node-set if @nodes1 doesn't contain @nodes2 */ xmlNodeSetPtr xmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { if (xmlXPathNodeSetIsEmpty(nodes2)) return(nodes1); if (xmlXPathNodeSetIsEmpty(nodes1)) return(xmlXPathNodeSetCreate(NULL)); xmlXPathNodeSetSort(nodes1); xmlXPathNodeSetSort(nodes2); return(xmlXPathNodeLeadingSorted(nodes1, xmlXPathNodeSetItem(nodes2, 1))); } /** * xmlXPathNodeTrailingSorted: * @nodes: a node-set, sorted by document order * @node: a node * * Implements the EXSLT - Sets trailing() function: * node-set set:trailing (node-set, node-set) * * Returns the nodes in @nodes that follow @node in document order, * @nodes if @node is NULL or an empty node-set if @nodes * doesn't contain @node */ xmlNodeSetPtr xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { int i, l; xmlNodePtr cur; xmlNodeSetPtr ret; if (node == NULL) return(nodes); ret = xmlXPathNodeSetCreate(NULL); if (ret == NULL) return(ret); if (xmlXPathNodeSetIsEmpty(nodes) || (!xmlXPathNodeSetContains(nodes, node))) return(ret); l = xmlXPathNodeSetGetLength(nodes); for (i = l - 1; i >= 0; i--) { cur = xmlXPathNodeSetItem(nodes, i); if (cur == node) break; if (xmlXPathNodeSetAddUnique(ret, cur) < 0) break; } xmlXPathNodeSetSort(ret); /* bug 413451 */ return(ret); } /** * xmlXPathNodeTrailing: * @nodes: a node-set * @node: a node * * Implements the EXSLT - Sets trailing() function: * node-set set:trailing (node-set, node-set) * @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted * is called. * * Returns the nodes in @nodes that follow @node in document order, * @nodes if @node is NULL or an empty node-set if @nodes * doesn't contain @node */ xmlNodeSetPtr xmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node) { xmlXPathNodeSetSort(nodes); return(xmlXPathNodeTrailingSorted(nodes, node)); } /** * xmlXPathTrailingSorted: * @nodes1: a node-set, sorted by document order * @nodes2: a node-set, sorted by document order * * Implements the EXSLT - Sets trailing() function: * node-set set:trailing (node-set, node-set) * * Returns the nodes in @nodes1 that follow the first node in @nodes2 * in document order, @nodes1 if @nodes2 is NULL or empty or * an empty node-set if @nodes1 doesn't contain @nodes2 */ xmlNodeSetPtr xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { if (xmlXPathNodeSetIsEmpty(nodes2)) return(nodes1); return(xmlXPathNodeTrailingSorted(nodes1, xmlXPathNodeSetItem(nodes2, 0))); } /** * xmlXPathTrailing: * @nodes1: a node-set * @nodes2: a node-set * * Implements the EXSLT - Sets trailing() function: * node-set set:trailing (node-set, node-set) * @nodes1 and @nodes2 are sorted by document order, then * #xmlXPathTrailingSorted is called. * * Returns the nodes in @nodes1 that follow the first node in @nodes2 * in document order, @nodes1 if @nodes2 is NULL or empty or * an empty node-set if @nodes1 doesn't contain @nodes2 */ xmlNodeSetPtr xmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { if (xmlXPathNodeSetIsEmpty(nodes2)) return(nodes1); if (xmlXPathNodeSetIsEmpty(nodes1)) return(xmlXPathNodeSetCreate(NULL)); xmlXPathNodeSetSort(nodes1); xmlXPathNodeSetSort(nodes2); return(xmlXPathNodeTrailingSorted(nodes1, xmlXPathNodeSetItem(nodes2, 0))); } /************************************************************************ * * * Routines to handle extra functions * * * ************************************************************************/ /** * xmlXPathRegisterFunc: * @ctxt: the XPath context * @name: the function name * @f: the function implementation or NULL * * Register a new function. If @f is NULL it unregisters the function * * Returns 0 in case of success, -1 in case of error */ int xmlXPathRegisterFunc(xmlXPathContextPtr ctxt, const xmlChar *name, xmlXPathFunction f) { return(xmlXPathRegisterFuncNS(ctxt, name, NULL, f)); } /** * xmlXPathRegisterFuncNS: * @ctxt: the XPath context * @name: the function name * @ns_uri: the function namespace URI * @f: the function implementation or NULL * * Register a new function. If @f is NULL it unregisters the function * * Returns 0 in case of success, -1 in case of error */ int xmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathFunction f) { if (ctxt == NULL) return(-1); if (name == NULL) return(-1); if (ctxt->funcHash == NULL) ctxt->funcHash = xmlHashCreate(0); if (ctxt->funcHash == NULL) return(-1); if (f == NULL) return(xmlHashRemoveEntry2(ctxt->funcHash, name, ns_uri, NULL)); return(xmlHashAddEntry2(ctxt->funcHash, name, ns_uri, XML_CAST_FPTR(f))); } /** * xmlXPathRegisterFuncLookup: * @ctxt: the XPath context * @f: the lookup function * @funcCtxt: the lookup data * * Registers an external mechanism to do function lookup. */ void xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, xmlXPathFuncLookupFunc f, void *funcCtxt) { if (ctxt == NULL) return; ctxt->funcLookupFunc = f; ctxt->funcLookupData = funcCtxt; } /** * xmlXPathFunctionLookup: * @ctxt: the XPath context * @name: the function name * * Search in the Function array of the context for the given * function. * * Returns the xmlXPathFunction or NULL if not found */ xmlXPathFunction xmlXPathFunctionLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { if (ctxt == NULL) return (NULL); if (ctxt->funcLookupFunc != NULL) { xmlXPathFunction ret; xmlXPathFuncLookupFunc f; f = ctxt->funcLookupFunc; ret = f(ctxt->funcLookupData, name, NULL); if (ret != NULL) return(ret); } return(xmlXPathFunctionLookupNS(ctxt, name, NULL)); } /** * xmlXPathFunctionLookupNS: * @ctxt: the XPath context * @name: the function name * @ns_uri: the function namespace URI * * Search in the Function array of the context for the given * function. * * Returns the xmlXPathFunction or NULL if not found */ xmlXPathFunction xmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri) { xmlXPathFunction ret; if (ctxt == NULL) return(NULL); if (name == NULL) return(NULL); if (ctxt->funcLookupFunc != NULL) { xmlXPathFuncLookupFunc f; f = ctxt->funcLookupFunc; ret = f(ctxt->funcLookupData, name, ns_uri); if (ret != NULL) return(ret); } if (ctxt->funcHash == NULL) return(NULL); XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->funcHash, name, ns_uri); return(ret); } /** * xmlXPathRegisteredFuncsCleanup: * @ctxt: the XPath context * * Cleanup the XPath context data associated to registered functions */ void xmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) { if (ctxt == NULL) return; xmlHashFree(ctxt->funcHash, NULL); ctxt->funcHash = NULL; } /************************************************************************ * * * Routines to handle Variables * * * ************************************************************************/ /** * xmlXPathRegisterVariable: * @ctxt: the XPath context * @name: the variable name * @value: the variable value or NULL * * Register a new variable value. If @value is NULL it unregisters * the variable * * Returns 0 in case of success, -1 in case of error */ int xmlXPathRegisterVariable(xmlXPathContextPtr ctxt, const xmlChar *name, xmlXPathObjectPtr value) { return(xmlXPathRegisterVariableNS(ctxt, name, NULL, value)); } /** * xmlXPathRegisterVariableNS: * @ctxt: the XPath context * @name: the variable name * @ns_uri: the variable namespace URI * @value: the variable value or NULL * * Register a new variable value. If @value is NULL it unregisters * the variable * * Returns 0 in case of success, -1 in case of error */ int xmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathObjectPtr value) { if (ctxt == NULL) return(-1); if (name == NULL) return(-1); if (ctxt->varHash == NULL) ctxt->varHash = xmlHashCreate(0); if (ctxt->varHash == NULL) return(-1); if (value == NULL) return(xmlHashRemoveEntry2(ctxt->varHash, name, ns_uri, (xmlHashDeallocator)xmlXPathFreeObject)); return(xmlHashUpdateEntry2(ctxt->varHash, name, ns_uri, (void *) value, (xmlHashDeallocator)xmlXPathFreeObject)); } /** * xmlXPathRegisterVariableLookup: * @ctxt: the XPath context * @f: the lookup function * @data: the lookup data * * register an external mechanism to do variable lookup */ void xmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt, xmlXPathVariableLookupFunc f, void *data) { if (ctxt == NULL) return; ctxt->varLookupFunc = f; ctxt->varLookupData = data; } /** * xmlXPathVariableLookup: * @ctxt: the XPath context * @name: the variable name * * Search in the Variable array of the context for the given * variable value. * * Returns a copy of the value or NULL if not found */ xmlXPathObjectPtr xmlXPathVariableLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { if (ctxt == NULL) return(NULL); if (ctxt->varLookupFunc != NULL) { xmlXPathObjectPtr ret; ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) (ctxt->varLookupData, name, NULL); return(ret); } return(xmlXPathVariableLookupNS(ctxt, name, NULL)); } /** * xmlXPathVariableLookupNS: * @ctxt: the XPath context * @name: the variable name * @ns_uri: the variable namespace URI * * Search in the Variable array of the context for the given * variable value. * * Returns the a copy of the value or NULL if not found */ xmlXPathObjectPtr xmlXPathVariableLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri) { if (ctxt == NULL) return(NULL); if (ctxt->varLookupFunc != NULL) { xmlXPathObjectPtr ret; ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) (ctxt->varLookupData, name, ns_uri); if (ret != NULL) return(ret); } if (ctxt->varHash == NULL) return(NULL); if (name == NULL) return(NULL); return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr) xmlHashLookup2(ctxt->varHash, name, ns_uri))); } /** * xmlXPathRegisteredVariablesCleanup: * @ctxt: the XPath context * * Cleanup the XPath context data associated to registered variables */ void xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) { if (ctxt == NULL) return; xmlHashFree(ctxt->varHash, (xmlHashDeallocator)xmlXPathFreeObject); ctxt->varHash = NULL; } /** * xmlXPathRegisterNs: * @ctxt: the XPath context * @prefix: the namespace prefix cannot be NULL or empty string * @ns_uri: the namespace name * * Register a new namespace. If @ns_uri is NULL it unregisters * the namespace * * Returns 0 in case of success, -1 in case of error */ int xmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix, const xmlChar *ns_uri) { if (ctxt == NULL) return(-1); if (prefix == NULL) return(-1); if (prefix[0] == 0) return(-1); if (ctxt->nsHash == NULL) ctxt->nsHash = xmlHashCreate(10); if (ctxt->nsHash == NULL) return(-1); if (ns_uri == NULL) return(xmlHashRemoveEntry(ctxt->nsHash, prefix, (xmlHashDeallocator)xmlFree)); return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri), (xmlHashDeallocator)xmlFree)); } /** * xmlXPathNsLookup: * @ctxt: the XPath context * @prefix: the namespace prefix value * * Search in the namespace declaration array of the context for the given * namespace name associated to the given prefix * * Returns the value or NULL if not found */ const xmlChar * xmlXPathNsLookup(xmlXPathContextPtr ctxt, const xmlChar *prefix) { if (ctxt == NULL) return(NULL); if (prefix == NULL) return(NULL); #ifdef XML_XML_NAMESPACE if (xmlStrEqual(prefix, (const xmlChar *) "xml")) return(XML_XML_NAMESPACE); #endif if (ctxt->namespaces != NULL) { int i; for (i = 0;i < ctxt->nsNr;i++) { if ((ctxt->namespaces[i] != NULL) && (xmlStrEqual(ctxt->namespaces[i]->prefix, prefix))) return(ctxt->namespaces[i]->href); } } return((const xmlChar *) xmlHashLookup(ctxt->nsHash, prefix)); } /** * xmlXPathRegisteredNsCleanup: * @ctxt: the XPath context * * Cleanup the XPath context data associated to registered variables */ void xmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) { if (ctxt == NULL) return; xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree); ctxt->nsHash = NULL; } /************************************************************************ * * * Routines to handle Values * * * ************************************************************************/ /* Allocations are terrible, one needs to optimize all this !!! */ /** * xmlXPathNewFloat: * @val: the double value * * Create a new xmlXPathObjectPtr of type double and of value @val * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathNewFloat(double val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating float object\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_NUMBER; ret->floatval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_NUMBER); #endif return(ret); } /** * xmlXPathNewBoolean: * @val: the boolean value * * Create a new xmlXPathObjectPtr of type boolean and of value @val * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathNewBoolean(int val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating boolean object\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_BOOLEAN; ret->boolval = (val != 0); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_BOOLEAN); #endif return(ret); } /** * xmlXPathNewString: * @val: the xmlChar * value * * Create a new xmlXPathObjectPtr of type string and of value @val * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathNewString(const xmlChar *val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating string object\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_STRING; if (val != NULL) ret->stringval = xmlStrdup(val); else ret->stringval = xmlStrdup((const xmlChar *)""); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); #endif return(ret); } /** * xmlXPathWrapString: * @val: the xmlChar * value * * Wraps the @val string into an XPath object. * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathWrapString (xmlChar *val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating string object\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_STRING; ret->stringval = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); #endif return(ret); } /** * xmlXPathNewCString: * @val: the char * value * * Create a new xmlXPathObjectPtr of type string and of value @val * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathNewCString(const char *val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating string object\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_STRING; ret->stringval = xmlStrdup(BAD_CAST val); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); #endif return(ret); } /** * xmlXPathWrapCString: * @val: the char * value * * Wraps a string into an XPath object. * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathWrapCString (char * val) { return(xmlXPathWrapString((xmlChar *)(val))); } /** * xmlXPathWrapExternal: * @val: the user data * * Wraps the @val data into an XPath object. * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathWrapExternal (void *val) { xmlXPathObjectPtr ret; ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating user object\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); ret->type = XPATH_USERS; ret->user = val; #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, XPATH_USERS); #endif return(ret); } /** * xmlXPathObjectCopy: * @val: the original object * * allocate a new copy of a given object * * Returns the newly created object. */ xmlXPathObjectPtr xmlXPathObjectCopy(xmlXPathObjectPtr val) { xmlXPathObjectPtr ret; if (val == NULL) return(NULL); ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); if (ret == NULL) { xmlXPathErrMemory(NULL, "copying object\n"); return(NULL); } memcpy(ret, val , (size_t) sizeof(xmlXPathObject)); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageRequested(NULL, val->type); #endif switch (val->type) { case XPATH_BOOLEAN: case XPATH_NUMBER: case XPATH_POINT: case XPATH_RANGE: break; case XPATH_STRING: ret->stringval = xmlStrdup(val->stringval); break; case XPATH_XSLT_TREE: #if 0 /* Removed 11 July 2004 - the current handling of xslt tmpRVT nodes means that this previous handling is no longer correct, and can cause some serious problems (ref. bug 145547) */ if ((val->nodesetval != NULL) && (val->nodesetval->nodeTab != NULL)) { xmlNodePtr cur, tmp; xmlDocPtr top; ret->boolval = 1; top = xmlNewDoc(NULL); top->name = (char *) xmlStrdup(val->nodesetval->nodeTab[0]->name); ret->user = top; if (top != NULL) { top->doc = top; cur = val->nodesetval->nodeTab[0]->children; while (cur != NULL) { tmp = xmlDocCopyNode(cur, top, 1); xmlAddChild((xmlNodePtr) top, tmp); cur = cur->next; } } ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr) top); } else ret->nodesetval = xmlXPathNodeSetCreate(NULL); /* Deallocate the copied tree value */ break; #endif case XPATH_NODESET: ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval); /* Do not deallocate the copied tree value */ ret->boolval = 0; break; case XPATH_LOCATIONSET: #ifdef LIBXML_XPTR_ENABLED { xmlLocationSetPtr loc = val->user; ret->user = (void *) xmlXPtrLocationSetMerge(NULL, loc); break; } #endif case XPATH_USERS: ret->user = val->user; break; case XPATH_UNDEFINED: xmlGenericError(xmlGenericErrorContext, "xmlXPathObjectCopy: unsupported type %d\n", val->type); break; } return(ret); } /** * xmlXPathFreeObject: * @obj: the object to free * * Free up an xmlXPathObjectPtr object. */ void xmlXPathFreeObject(xmlXPathObjectPtr obj) { if (obj == NULL) return; if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { if (obj->boolval) { #if 0 if (obj->user != NULL) { xmlXPathFreeNodeSet(obj->nodesetval); xmlFreeNodeList((xmlNodePtr) obj->user); } else #endif obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */ if (obj->nodesetval != NULL) xmlXPathFreeValueTree(obj->nodesetval); } else { if (obj->nodesetval != NULL) xmlXPathFreeNodeSet(obj->nodesetval); } #ifdef LIBXML_XPTR_ENABLED } else if (obj->type == XPATH_LOCATIONSET) { if (obj->user != NULL) xmlXPtrFreeLocationSet(obj->user); #endif } else if (obj->type == XPATH_STRING) { if (obj->stringval != NULL) xmlFree(obj->stringval); } #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageReleased(NULL, obj->type); #endif xmlFree(obj); } /** * xmlXPathReleaseObject: * @obj: the xmlXPathObjectPtr to free or to cache * * Depending on the state of the cache this frees the given * XPath object or stores it in the cache. */ static void xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj) { #define XP_CACHE_ADD(sl, o) if (sl == NULL) { \ sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \ if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj; #define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n)) if (obj == NULL) return; if ((ctxt == NULL) || (ctxt->cache == NULL)) { xmlXPathFreeObject(obj); } else { xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; switch (obj->type) { case XPATH_NODESET: case XPATH_XSLT_TREE: if (obj->nodesetval != NULL) { if (obj->boolval) { /* * It looks like the @boolval is used for * evaluation if this an XSLT Result Tree Fragment. * TODO: Check if this assumption is correct. */ obj->type = XPATH_XSLT_TREE; /* just for debugging */ xmlXPathFreeValueTree(obj->nodesetval); obj->nodesetval = NULL; } else if ((obj->nodesetval->nodeMax <= 40) && (XP_CACHE_WANTS(cache->nodesetObjs, cache->maxNodeset))) { XP_CACHE_ADD(cache->nodesetObjs, obj); goto obj_cached; } else { xmlXPathFreeNodeSet(obj->nodesetval); obj->nodesetval = NULL; } } break; case XPATH_STRING: if (obj->stringval != NULL) xmlFree(obj->stringval); if (XP_CACHE_WANTS(cache->stringObjs, cache->maxString)) { XP_CACHE_ADD(cache->stringObjs, obj); goto obj_cached; } break; case XPATH_BOOLEAN: if (XP_CACHE_WANTS(cache->booleanObjs, cache->maxBoolean)) { XP_CACHE_ADD(cache->booleanObjs, obj); goto obj_cached; } break; case XPATH_NUMBER: if (XP_CACHE_WANTS(cache->numberObjs, cache->maxNumber)) { XP_CACHE_ADD(cache->numberObjs, obj); goto obj_cached; } break; #ifdef LIBXML_XPTR_ENABLED case XPATH_LOCATIONSET: if (obj->user != NULL) { xmlXPtrFreeLocationSet(obj->user); } goto free_obj; #endif default: goto free_obj; } /* * Fallback to adding to the misc-objects slot. */ if (XP_CACHE_WANTS(cache->miscObjs, cache->maxMisc)) { XP_CACHE_ADD(cache->miscObjs, obj); } else goto free_obj; obj_cached: #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageReleased(ctxt, obj->type); #endif if (obj->nodesetval != NULL) { xmlNodeSetPtr tmpset = obj->nodesetval; /* * TODO: Due to those nasty ns-nodes, we need to traverse * the list and free the ns-nodes. * URGENT TODO: Check if it's actually slowing things down. * Maybe we shouldn't try to preserve the list. */ if (tmpset->nodeNr > 1) { int i; xmlNodePtr node; for (i = 0; i < tmpset->nodeNr; i++) { node = tmpset->nodeTab[i]; if ((node != NULL) && (node->type == XML_NAMESPACE_DECL)) { xmlXPathNodeSetFreeNs((xmlNsPtr) node); } } } else if (tmpset->nodeNr == 1) { if ((tmpset->nodeTab[0] != NULL) && (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL)) xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]); } tmpset->nodeNr = 0; memset(obj, 0, sizeof(xmlXPathObject)); obj->nodesetval = tmpset; } else memset(obj, 0, sizeof(xmlXPathObject)); return; free_obj: /* * Cache is full; free the object. */ if (obj->nodesetval != NULL) xmlXPathFreeNodeSet(obj->nodesetval); #ifdef XP_DEBUG_OBJ_USAGE xmlXPathDebugObjUsageReleased(NULL, obj->type); #endif xmlFree(obj); } return; } /************************************************************************ * * * Type Casting Routines * * * ************************************************************************/ /** * xmlXPathCastBooleanToString: * @val: a boolean * * Converts a boolean to its string value. * * Returns a newly allocated string. */ xmlChar * xmlXPathCastBooleanToString (int val) { xmlChar *ret; if (val) ret = xmlStrdup((const xmlChar *) "true"); else ret = xmlStrdup((const xmlChar *) "false"); return(ret); } /** * xmlXPathCastNumberToString: * @val: a number * * Converts a number to its string value. * * Returns a newly allocated string. */ xmlChar * xmlXPathCastNumberToString (double val) { xmlChar *ret; switch (xmlXPathIsInf(val)) { case 1: ret = xmlStrdup((const xmlChar *) "Infinity"); break; case -1: ret = xmlStrdup((const xmlChar *) "-Infinity"); break; default: if (xmlXPathIsNaN(val)) { ret = xmlStrdup((const xmlChar *) "NaN"); } else if (val == 0 && xmlXPathGetSign(val) != 0) { ret = xmlStrdup((const xmlChar *) "0"); } else { /* could be improved */ char buf[100]; xmlXPathFormatNumber(val, buf, 99); buf[99] = 0; ret = xmlStrdup((const xmlChar *) buf); } } return(ret); } /** * xmlXPathCastNodeToString: * @node: a node * * Converts a node to its string value. * * Returns a newly allocated string. */ xmlChar * xmlXPathCastNodeToString (xmlNodePtr node) { xmlChar *ret; if ((ret = xmlNodeGetContent(node)) == NULL) ret = xmlStrdup((const xmlChar *) ""); return(ret); } /** * xmlXPathCastNodeSetToString: * @ns: a node-set * * Converts a node-set to its string value. * * Returns a newly allocated string. */ xmlChar * xmlXPathCastNodeSetToString (xmlNodeSetPtr ns) { if ((ns == NULL) || (ns->nodeNr == 0) || (ns->nodeTab == NULL)) return(xmlStrdup((const xmlChar *) "")); if (ns->nodeNr > 1) xmlXPathNodeSetSort(ns); return(xmlXPathCastNodeToString(ns->nodeTab[0])); } /** * xmlXPathCastToString: * @val: an XPath object * * Converts an existing object to its string() equivalent * * Returns the allocated string value of the object, NULL in case of error. * It's up to the caller to free the string memory with xmlFree(). */ xmlChar * xmlXPathCastToString(xmlXPathObjectPtr val) { xmlChar *ret = NULL; if (val == NULL) return(xmlStrdup((const xmlChar *) "")); switch (val->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "String: undefined\n"); #endif ret = xmlStrdup((const xmlChar *) ""); break; case XPATH_NODESET: case XPATH_XSLT_TREE: ret = xmlXPathCastNodeSetToString(val->nodesetval); break; case XPATH_STRING: return(xmlStrdup(val->stringval)); case XPATH_BOOLEAN: ret = xmlXPathCastBooleanToString(val->boolval); break; case XPATH_NUMBER: { ret = xmlXPathCastNumberToString(val->floatval); break; } case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO ret = xmlStrdup((const xmlChar *) ""); break; } return(ret); } /** * xmlXPathConvertString: * @val: an XPath object * * Converts an existing object to its string() equivalent * * Returns the new object, the old one is freed (or the operation * is done directly on @val) */ xmlXPathObjectPtr xmlXPathConvertString(xmlXPathObjectPtr val) { xmlChar *res = NULL; if (val == NULL) return(xmlXPathNewCString("")); switch (val->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); #endif break; case XPATH_NODESET: case XPATH_XSLT_TREE: res = xmlXPathCastNodeSetToString(val->nodesetval); break; case XPATH_STRING: return(val); case XPATH_BOOLEAN: res = xmlXPathCastBooleanToString(val->boolval); break; case XPATH_NUMBER: res = xmlXPathCastNumberToString(val->floatval); break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO; break; } xmlXPathFreeObject(val); if (res == NULL) return(xmlXPathNewCString("")); return(xmlXPathWrapString(res)); } /** * xmlXPathCastBooleanToNumber: * @val: a boolean * * Converts a boolean to its number value * * Returns the number value */ double xmlXPathCastBooleanToNumber(int val) { if (val) return(1.0); return(0.0); } /** * xmlXPathCastStringToNumber: * @val: a string * * Converts a string to its number value * * Returns the number value */ double xmlXPathCastStringToNumber(const xmlChar * val) { return(xmlXPathStringEvalNumber(val)); } /** * xmlXPathCastNodeToNumber: * @node: a node * * Converts a node to its number value * * Returns the number value */ double xmlXPathCastNodeToNumber (xmlNodePtr node) { xmlChar *strval; double ret; if (node == NULL) return(xmlXPathNAN); strval = xmlXPathCastNodeToString(node); if (strval == NULL) return(xmlXPathNAN); ret = xmlXPathCastStringToNumber(strval); xmlFree(strval); return(ret); } /** * xmlXPathCastNodeSetToNumber: * @ns: a node-set * * Converts a node-set to its number value * * Returns the number value */ double xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns) { xmlChar *str; double ret; if (ns == NULL) return(xmlXPathNAN); str = xmlXPathCastNodeSetToString(ns); ret = xmlXPathCastStringToNumber(str); xmlFree(str); return(ret); } /** * xmlXPathCastToNumber: * @val: an XPath object * * Converts an XPath object to its number value * * Returns the number value */ double xmlXPathCastToNumber(xmlXPathObjectPtr val) { double ret = 0.0; if (val == NULL) return(xmlXPathNAN); switch (val->type) { case XPATH_UNDEFINED: #ifdef DEGUB_EXPR xmlGenericError(xmlGenericErrorContext, "NUMBER: undefined\n"); #endif ret = xmlXPathNAN; break; case XPATH_NODESET: case XPATH_XSLT_TREE: ret = xmlXPathCastNodeSetToNumber(val->nodesetval); break; case XPATH_STRING: ret = xmlXPathCastStringToNumber(val->stringval); break; case XPATH_NUMBER: ret = val->floatval; break; case XPATH_BOOLEAN: ret = xmlXPathCastBooleanToNumber(val->boolval); break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO; ret = xmlXPathNAN; break; } return(ret); } /** * xmlXPathConvertNumber: * @val: an XPath object * * Converts an existing object to its number() equivalent * * Returns the new object, the old one is freed (or the operation * is done directly on @val) */ xmlXPathObjectPtr xmlXPathConvertNumber(xmlXPathObjectPtr val) { xmlXPathObjectPtr ret; if (val == NULL) return(xmlXPathNewFloat(0.0)); if (val->type == XPATH_NUMBER) return(val); ret = xmlXPathNewFloat(xmlXPathCastToNumber(val)); xmlXPathFreeObject(val); return(ret); } /** * xmlXPathCastNumberToBoolean: * @val: a number * * Converts a number to its boolean value * * Returns the boolean value */ int xmlXPathCastNumberToBoolean (double val) { if (xmlXPathIsNaN(val) || (val == 0.0)) return(0); return(1); } /** * xmlXPathCastStringToBoolean: * @val: a string * * Converts a string to its boolean value * * Returns the boolean value */ int xmlXPathCastStringToBoolean (const xmlChar *val) { if ((val == NULL) || (xmlStrlen(val) == 0)) return(0); return(1); } /** * xmlXPathCastNodeSetToBoolean: * @ns: a node-set * * Converts a node-set to its boolean value * * Returns the boolean value */ int xmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns) { if ((ns == NULL) || (ns->nodeNr == 0)) return(0); return(1); } /** * xmlXPathCastToBoolean: * @val: an XPath object * * Converts an XPath object to its boolean value * * Returns the boolean value */ int xmlXPathCastToBoolean (xmlXPathObjectPtr val) { int ret = 0; if (val == NULL) return(0); switch (val->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "BOOLEAN: undefined\n"); #endif ret = 0; break; case XPATH_NODESET: case XPATH_XSLT_TREE: ret = xmlXPathCastNodeSetToBoolean(val->nodesetval); break; case XPATH_STRING: ret = xmlXPathCastStringToBoolean(val->stringval); break; case XPATH_NUMBER: ret = xmlXPathCastNumberToBoolean(val->floatval); break; case XPATH_BOOLEAN: ret = val->boolval; break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO; ret = 0; break; } return(ret); } /** * xmlXPathConvertBoolean: * @val: an XPath object * * Converts an existing object to its boolean() equivalent * * Returns the new object, the old one is freed (or the operation * is done directly on @val) */ xmlXPathObjectPtr xmlXPathConvertBoolean(xmlXPathObjectPtr val) { xmlXPathObjectPtr ret; if (val == NULL) return(xmlXPathNewBoolean(0)); if (val->type == XPATH_BOOLEAN) return(val); ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(val)); xmlXPathFreeObject(val); return(ret); } /************************************************************************ * * * Routines to handle XPath contexts * * * ************************************************************************/ /** * xmlXPathNewContext: * @doc: the XML document * * Create a new xmlXPathContext * * Returns the xmlXPathContext just allocated. The caller will need to free it. */ xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc) { xmlXPathContextPtr ret; ret = (xmlXPathContextPtr) xmlMalloc(sizeof(xmlXPathContext)); if (ret == NULL) { xmlXPathErrMemory(NULL, "creating context\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathContext)); ret->doc = doc; ret->node = NULL; ret->varHash = NULL; ret->nb_types = 0; ret->max_types = 0; ret->types = NULL; ret->funcHash = xmlHashCreate(0); ret->nb_axis = 0; ret->max_axis = 0; ret->axis = NULL; ret->nsHash = NULL; ret->user = NULL; ret->contextSize = -1; ret->proximityPosition = -1; #ifdef XP_DEFAULT_CACHE_ON if (xmlXPathContextSetCache(ret, 1, -1, 0) == -1) { xmlXPathFreeContext(ret); return(NULL); } #endif xmlXPathRegisterAllFunctions(ret); return(ret); } /** * xmlXPathFreeContext: * @ctxt: the context to free * * Free up an xmlXPathContext */ void xmlXPathFreeContext(xmlXPathContextPtr ctxt) { if (ctxt == NULL) return; if (ctxt->cache != NULL) xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); xmlXPathRegisteredNsCleanup(ctxt); xmlXPathRegisteredFuncsCleanup(ctxt); xmlXPathRegisteredVariablesCleanup(ctxt); xmlResetError(&ctxt->lastError); xmlFree(ctxt); } /************************************************************************ * * * Routines to handle XPath parser contexts * * * ************************************************************************/ #define CHECK_CTXT(ctxt) \ if (ctxt == NULL) { \ __xmlRaiseError(NULL, NULL, NULL, \ NULL, NULL, XML_FROM_XPATH, \ XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ __FILE__, __LINE__, \ NULL, NULL, NULL, 0, 0, \ "NULL context pointer\n"); \ return(NULL); \ } \ #define CHECK_CTXT_NEG(ctxt) \ if (ctxt == NULL) { \ __xmlRaiseError(NULL, NULL, NULL, \ NULL, NULL, XML_FROM_XPATH, \ XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ __FILE__, __LINE__, \ NULL, NULL, NULL, 0, 0, \ "NULL context pointer\n"); \ return(-1); \ } \ #define CHECK_CONTEXT(ctxt) \ if ((ctxt == NULL) || (ctxt->doc == NULL) || \ (ctxt->doc->children == NULL)) { \ xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT); \ return(NULL); \ } /** * xmlXPathNewParserContext: * @str: the XPath expression * @ctxt: the XPath context * * Create a new xmlXPathParserContext * * Returns the xmlXPathParserContext just allocated. */ xmlXPathParserContextPtr xmlXPathNewParserContext(const xmlChar *str, xmlXPathContextPtr ctxt) { xmlXPathParserContextPtr ret; ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); if (ret == NULL) { xmlXPathErrMemory(ctxt, "creating parser context\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); ret->cur = ret->base = str; ret->context = ctxt; ret->comp = xmlXPathNewCompExpr(); if (ret->comp == NULL) { xmlFree(ret->valueTab); xmlFree(ret); return(NULL); } if ((ctxt != NULL) && (ctxt->dict != NULL)) { ret->comp->dict = ctxt->dict; xmlDictReference(ret->comp->dict); } return(ret); } /** * xmlXPathCompParserContext: * @comp: the XPath compiled expression * @ctxt: the XPath context * * Create a new xmlXPathParserContext when processing a compiled expression * * Returns the xmlXPathParserContext just allocated. */ static xmlXPathParserContextPtr xmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) { xmlXPathParserContextPtr ret; ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); if (ret == NULL) { xmlXPathErrMemory(ctxt, "creating evaluation context\n"); return(NULL); } memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); /* Allocate the value stack */ ret->valueTab = (xmlXPathObjectPtr *) xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); if (ret->valueTab == NULL) { xmlFree(ret); xmlXPathErrMemory(ctxt, "creating evaluation context\n"); return(NULL); } ret->valueNr = 0; ret->valueMax = 10; ret->value = NULL; ret->valueFrame = 0; ret->context = ctxt; ret->comp = comp; return(ret); } /** * xmlXPathFreeParserContext: * @ctxt: the context to free * * Free up an xmlXPathParserContext */ void xmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) { if (ctxt->valueTab != NULL) { xmlFree(ctxt->valueTab); } if (ctxt->comp != NULL) { #ifdef XPATH_STREAMING if (ctxt->comp->stream != NULL) { xmlFreePatternList(ctxt->comp->stream); ctxt->comp->stream = NULL; } #endif xmlXPathFreeCompExpr(ctxt->comp); } xmlFree(ctxt); } /************************************************************************ * * * The implicit core function library * * * ************************************************************************/ /** * xmlXPathNodeValHash: * @node: a node pointer * * Function computing the beginning of the string value of the node, * used to speed up comparisons * * Returns an int usable as a hash */ static unsigned int xmlXPathNodeValHash(xmlNodePtr node) { int len = 2; const xmlChar * string = NULL; xmlNodePtr tmp = NULL; unsigned int ret = 0; if (node == NULL) return(0); if (node->type == XML_DOCUMENT_NODE) { tmp = xmlDocGetRootElement((xmlDocPtr) node); if (tmp == NULL) node = node->children; else node = tmp; if (node == NULL) return(0); } switch (node->type) { case XML_COMMENT_NODE: case XML_PI_NODE: case XML_CDATA_SECTION_NODE: case XML_TEXT_NODE: string = node->content; if (string == NULL) return(0); if (string[0] == 0) return(0); return(((unsigned int) string[0]) + (((unsigned int) string[1]) << 8)); case XML_NAMESPACE_DECL: string = ((xmlNsPtr)node)->href; if (string == NULL) return(0); if (string[0] == 0) return(0); return(((unsigned int) string[0]) + (((unsigned int) string[1]) << 8)); case XML_ATTRIBUTE_NODE: tmp = ((xmlAttrPtr) node)->children; break; case XML_ELEMENT_NODE: tmp = node->children; break; default: return(0); } while (tmp != NULL) { switch (tmp->type) { case XML_COMMENT_NODE: case XML_PI_NODE: case XML_CDATA_SECTION_NODE: case XML_TEXT_NODE: string = tmp->content; break; case XML_NAMESPACE_DECL: string = ((xmlNsPtr)tmp)->href; break; default: break; } if ((string != NULL) && (string[0] != 0)) { if (len == 1) { return(ret + (((unsigned int) string[0]) << 8)); } if (string[1] == 0) { len = 1; ret = (unsigned int) string[0]; } else { return(((unsigned int) string[0]) + (((unsigned int) string[1]) << 8)); } } /* * Skip to next node */ if ((tmp->children != NULL) && (tmp->type != XML_DTD_NODE)) { if (tmp->children->type != XML_ENTITY_DECL) { tmp = tmp->children; continue; } } if (tmp == node) break; if (tmp->next != NULL) { tmp = tmp->next; continue; } do { tmp = tmp->parent; if (tmp == NULL) break; if (tmp == node) { tmp = NULL; break; } if (tmp->next != NULL) { tmp = tmp->next; break; } } while (tmp != NULL); } return(ret); } /** * xmlXPathStringHash: * @string: a string * * Function computing the beginning of the string value of the node, * used to speed up comparisons * * Returns an int usable as a hash */ static unsigned int xmlXPathStringHash(const xmlChar * string) { if (string == NULL) return((unsigned int) 0); if (string[0] == 0) return(0); return(((unsigned int) string[0]) + (((unsigned int) string[1]) << 8)); } /** * xmlXPathCompareNodeSetFloat: * @ctxt: the XPath Parser context * @inf: less than (1) or greater than (0) * @strict: is the comparison strict * @arg: the node set * @f: the value * * Implement the compare operation between a nodeset and a number * @ns < @val (1, 1, ... * @ns <= @val (1, 0, ... * @ns > @val (0, 1, ... * @ns >= @val (0, 0, ... * * If one object to be compared is a node-set and the other is a number, * then the comparison will be true if and only if there is a node in the * node-set such that the result of performing the comparison on the number * to be compared and on the result of converting the string-value of that * node to a number using the number function is true. * * Returns 0 or 1 depending on the results of the test. */ static int xmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt, int inf, int strict, xmlXPathObjectPtr arg, xmlXPathObjectPtr f) { int i, ret = 0; xmlNodeSetPtr ns; xmlChar *str2; if ((f == NULL) || (arg == NULL) || ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { xmlXPathReleaseObject(ctxt->context, arg); xmlXPathReleaseObject(ctxt->context, f); return(0); } ns = arg->nodesetval; if (ns != NULL) { for (i = 0;i < ns->nodeNr;i++) { str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); if (str2 != NULL) { valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2)); xmlFree(str2); xmlXPathNumberFunction(ctxt, 1); valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, f)); ret = xmlXPathCompareValues(ctxt, inf, strict); if (ret) break; } } } xmlXPathReleaseObject(ctxt->context, arg); xmlXPathReleaseObject(ctxt->context, f); return(ret); } /** * xmlXPathCompareNodeSetString: * @ctxt: the XPath Parser context * @inf: less than (1) or greater than (0) * @strict: is the comparison strict * @arg: the node set * @s: the value * * Implement the compare operation between a nodeset and a string * @ns < @val (1, 1, ... * @ns <= @val (1, 0, ... * @ns > @val (0, 1, ... * @ns >= @val (0, 0, ... * * If one object to be compared is a node-set and the other is a string, * then the comparison will be true if and only if there is a node in * the node-set such that the result of performing the comparison on the * string-value of the node and the other string is true. * * Returns 0 or 1 depending on the results of the test. */ static int xmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt, int inf, int strict, xmlXPathObjectPtr arg, xmlXPathObjectPtr s) { int i, ret = 0; xmlNodeSetPtr ns; xmlChar *str2; if ((s == NULL) || (arg == NULL) || ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { xmlXPathReleaseObject(ctxt->context, arg); xmlXPathReleaseObject(ctxt->context, s); return(0); } ns = arg->nodesetval; if (ns != NULL) { for (i = 0;i < ns->nodeNr;i++) { str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); if (str2 != NULL) { valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2)); xmlFree(str2); valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, s)); ret = xmlXPathCompareValues(ctxt, inf, strict); if (ret) break; } } } xmlXPathReleaseObject(ctxt->context, arg); xmlXPathReleaseObject(ctxt->context, s); return(ret); } /** * xmlXPathCompareNodeSets: * @inf: less than (1) or greater than (0) * @strict: is the comparison strict * @arg1: the first node set object * @arg2: the second node set object * * Implement the compare operation on nodesets: * * If both objects to be compared are node-sets, then the comparison * will be true if and only if there is a node in the first node-set * and a node in the second node-set such that the result of performing * the comparison on the string-values of the two nodes is true. * .... * When neither object to be compared is a node-set and the operator * is <=, <, >= or >, then the objects are compared by converting both * objects to numbers and comparing the numbers according to IEEE 754. * .... * The number function converts its argument to a number as follows: * - a string that consists of optional whitespace followed by an * optional minus sign followed by a Number followed by whitespace * is converted to the IEEE 754 number that is nearest (according * to the IEEE 754 round-to-nearest rule) to the mathematical value * represented by the string; any other string is converted to NaN * * Conclusion all nodes need to be converted first to their string value * and then the comparison must be done when possible */ static int xmlXPathCompareNodeSets(int inf, int strict, xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { int i, j, init = 0; double val1; double *values2; int ret = 0; xmlNodeSetPtr ns1; xmlNodeSetPtr ns2; if ((arg1 == NULL) || ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) { xmlXPathFreeObject(arg2); return(0); } if ((arg2 == NULL) || ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) { xmlXPathFreeObject(arg1); xmlXPathFreeObject(arg2); return(0); } ns1 = arg1->nodesetval; ns2 = arg2->nodesetval; if ((ns1 == NULL) || (ns1->nodeNr <= 0)) { xmlXPathFreeObject(arg1); xmlXPathFreeObject(arg2); return(0); } if ((ns2 == NULL) || (ns2->nodeNr <= 0)) { xmlXPathFreeObject(arg1); xmlXPathFreeObject(arg2); return(0); } values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double)); if (values2 == NULL) { xmlXPathErrMemory(NULL, "comparing nodesets\n"); xmlXPathFreeObject(arg1); xmlXPathFreeObject(arg2); return(0); } for (i = 0;i < ns1->nodeNr;i++) { val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]); if (xmlXPathIsNaN(val1)) continue; for (j = 0;j < ns2->nodeNr;j++) { if (init == 0) { values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]); } if (xmlXPathIsNaN(values2[j])) continue; if (inf && strict) ret = (val1 < values2[j]); else if (inf && !strict) ret = (val1 <= values2[j]); else if (!inf && strict) ret = (val1 > values2[j]); else if (!inf && !strict) ret = (val1 >= values2[j]); if (ret) break; } if (ret) break; init = 1; } xmlFree(values2); xmlXPathFreeObject(arg1); xmlXPathFreeObject(arg2); return(ret); } /** * xmlXPathCompareNodeSetValue: * @ctxt: the XPath Parser context * @inf: less than (1) or greater than (0) * @strict: is the comparison strict * @arg: the node set * @val: the value * * Implement the compare operation between a nodeset and a value * @ns < @val (1, 1, ... * @ns <= @val (1, 0, ... * @ns > @val (0, 1, ... * @ns >= @val (0, 0, ... * * If one object to be compared is a node-set and the other is a boolean, * then the comparison will be true if and only if the result of performing * the comparison on the boolean and on the result of converting * the node-set to a boolean using the boolean function is true. * * Returns 0 or 1 depending on the results of the test. */ static int xmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt, int inf, int strict, xmlXPathObjectPtr arg, xmlXPathObjectPtr val) { if ((val == NULL) || (arg == NULL) || ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) return(0); switch(val->type) { case XPATH_NUMBER: return(xmlXPathCompareNodeSetFloat(ctxt, inf, strict, arg, val)); case XPATH_NODESET: case XPATH_XSLT_TREE: return(xmlXPathCompareNodeSets(inf, strict, arg, val)); case XPATH_STRING: return(xmlXPathCompareNodeSetString(ctxt, inf, strict, arg, val)); case XPATH_BOOLEAN: valuePush(ctxt, arg); xmlXPathBooleanFunction(ctxt, 1); valuePush(ctxt, val); return(xmlXPathCompareValues(ctxt, inf, strict)); default: TODO } return(0); } /** * xmlXPathEqualNodeSetString: * @arg: the nodeset object argument * @str: the string to compare to. * @neq: flag to show whether for '=' (0) or '!=' (1) * * Implement the equal operation on XPath objects content: @arg1 == @arg2 * If one object to be compared is a node-set and the other is a string, * then the comparison will be true if and only if there is a node in * the node-set such that the result of performing the comparison on the * string-value of the node and the other string is true. * * Returns 0 or 1 depending on the results of the test. */ static int xmlXPathEqualNodeSetString(xmlXPathObjectPtr arg, const xmlChar * str, int neq) { int i; xmlNodeSetPtr ns; xmlChar *str2; unsigned int hash; if ((str == NULL) || (arg == NULL) || ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) return (0); ns = arg->nodesetval; /* * A NULL nodeset compared with a string is always false * (since there is no node equal, and no node not equal) */ if ((ns == NULL) || (ns->nodeNr <= 0) ) return (0); hash = xmlXPathStringHash(str); for (i = 0; i < ns->nodeNr; i++) { if (xmlXPathNodeValHash(ns->nodeTab[i]) == hash) { str2 = xmlNodeGetContent(ns->nodeTab[i]); if ((str2 != NULL) && (xmlStrEqual(str, str2))) { xmlFree(str2); if (neq) continue; return (1); } else if ((str2 == NULL) && (xmlStrEqual(str, BAD_CAST ""))) { if (neq) continue; return (1); } else if (neq) { if (str2 != NULL) xmlFree(str2); return (1); } if (str2 != NULL) xmlFree(str2); } else if (neq) return (1); } return (0); } /** * xmlXPathEqualNodeSetFloat: * @arg: the nodeset object argument * @f: the float to compare to * @neq: flag to show whether to compare '=' (0) or '!=' (1) * * Implement the equal operation on XPath objects content: @arg1 == @arg2 * If one object to be compared is a node-set and the other is a number, * then the comparison will be true if and only if there is a node in * the node-set such that the result of performing the comparison on the * number to be compared and on the result of converting the string-value * of that node to a number using the number function is true. * * Returns 0 or 1 depending on the results of the test. */ static int xmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr arg, double f, int neq) { int i, ret=0; xmlNodeSetPtr ns; xmlChar *str2; xmlXPathObjectPtr val; double v; if ((arg == NULL) || ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) return(0); ns = arg->nodesetval; if (ns != NULL) { for (i=0;inodeNr;i++) { str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); if (str2 != NULL) { valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2)); xmlFree(str2); xmlXPathNumberFunction(ctxt, 1); val = valuePop(ctxt); v = val->floatval; xmlXPathReleaseObject(ctxt->context, val); if (!xmlXPathIsNaN(v)) { if ((!neq) && (v==f)) { ret = 1; break; } else if ((neq) && (v!=f)) { ret = 1; break; } } else { /* NaN is unequal to any value */ if (neq) ret = 1; } } } } return(ret); } /** * xmlXPathEqualNodeSets: * @arg1: first nodeset object argument * @arg2: second nodeset object argument * @neq: flag to show whether to test '=' (0) or '!=' (1) * * Implement the equal / not equal operation on XPath nodesets: * @arg1 == @arg2 or @arg1 != @arg2 * If both objects to be compared are node-sets, then the comparison * will be true if and only if there is a node in the first node-set and * a node in the second node-set such that the result of performing the * comparison on the string-values of the two nodes is true. * * (needless to say, this is a costly operation) * * Returns 0 or 1 depending on the results of the test. */ static int xmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2, int neq) { int i, j; unsigned int *hashs1; unsigned int *hashs2; xmlChar **values1; xmlChar **values2; int ret = 0; xmlNodeSetPtr ns1; xmlNodeSetPtr ns2; if ((arg1 == NULL) || ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) return(0); if ((arg2 == NULL) || ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) return(0); ns1 = arg1->nodesetval; ns2 = arg2->nodesetval; if ((ns1 == NULL) || (ns1->nodeNr <= 0)) return(0); if ((ns2 == NULL) || (ns2->nodeNr <= 0)) return(0); /* * for equal, check if there is a node pertaining to both sets */ if (neq == 0) for (i = 0;i < ns1->nodeNr;i++) for (j = 0;j < ns2->nodeNr;j++) if (ns1->nodeTab[i] == ns2->nodeTab[j]) return(1); values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *)); if (values1 == NULL) { xmlXPathErrMemory(NULL, "comparing nodesets\n"); return(0); } hashs1 = (unsigned int *) xmlMalloc(ns1->nodeNr * sizeof(unsigned int)); if (hashs1 == NULL) { xmlXPathErrMemory(NULL, "comparing nodesets\n"); xmlFree(values1); return(0); } memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *)); values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *)); if (values2 == NULL) { xmlXPathErrMemory(NULL, "comparing nodesets\n"); xmlFree(hashs1); xmlFree(values1); return(0); } hashs2 = (unsigned int *) xmlMalloc(ns2->nodeNr * sizeof(unsigned int)); if (hashs2 == NULL) { xmlXPathErrMemory(NULL, "comparing nodesets\n"); xmlFree(hashs1); xmlFree(values1); xmlFree(values2); return(0); } memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *)); for (i = 0;i < ns1->nodeNr;i++) { hashs1[i] = xmlXPathNodeValHash(ns1->nodeTab[i]); for (j = 0;j < ns2->nodeNr;j++) { if (i == 0) hashs2[j] = xmlXPathNodeValHash(ns2->nodeTab[j]); if (hashs1[i] != hashs2[j]) { if (neq) { ret = 1; break; } } else { if (values1[i] == NULL) values1[i] = xmlNodeGetContent(ns1->nodeTab[i]); if (values2[j] == NULL) values2[j] = xmlNodeGetContent(ns2->nodeTab[j]); ret = xmlStrEqual(values1[i], values2[j]) ^ neq; if (ret) break; } } if (ret) break; } for (i = 0;i < ns1->nodeNr;i++) if (values1[i] != NULL) xmlFree(values1[i]); for (j = 0;j < ns2->nodeNr;j++) if (values2[j] != NULL) xmlFree(values2[j]); xmlFree(values1); xmlFree(values2); xmlFree(hashs1); xmlFree(hashs2); return(ret); } static int xmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { int ret = 0; /* *At this point we are assured neither arg1 nor arg2 *is a nodeset, so we can just pick the appropriate routine. */ switch (arg1->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "Equal: undefined\n"); #endif break; case XPATH_BOOLEAN: switch (arg2->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "Equal: undefined\n"); #endif break; case XPATH_BOOLEAN: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "Equal: %d boolean %d \n", arg1->boolval, arg2->boolval); #endif ret = (arg1->boolval == arg2->boolval); break; case XPATH_NUMBER: ret = (arg1->boolval == xmlXPathCastNumberToBoolean(arg2->floatval)); break; case XPATH_STRING: if ((arg2->stringval == NULL) || (arg2->stringval[0] == 0)) ret = 0; else ret = 1; ret = (arg1->boolval == ret); break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO break; case XPATH_NODESET: case XPATH_XSLT_TREE: break; } break; case XPATH_NUMBER: switch (arg2->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "Equal: undefined\n"); #endif break; case XPATH_BOOLEAN: ret = (arg2->boolval== xmlXPathCastNumberToBoolean(arg1->floatval)); break; case XPATH_STRING: valuePush(ctxt, arg2); xmlXPathNumberFunction(ctxt, 1); arg2 = valuePop(ctxt); /* no break on purpose */ case XPATH_NUMBER: /* Hand check NaN and Infinity equalities */ if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { ret = 0; } else if (xmlXPathIsInf(arg1->floatval) == 1) { if (xmlXPathIsInf(arg2->floatval) == 1) ret = 1; else ret = 0; } else if (xmlXPathIsInf(arg1->floatval) == -1) { if (xmlXPathIsInf(arg2->floatval) == -1) ret = 1; else ret = 0; } else if (xmlXPathIsInf(arg2->floatval) == 1) { if (xmlXPathIsInf(arg1->floatval) == 1) ret = 1; else ret = 0; } else if (xmlXPathIsInf(arg2->floatval) == -1) { if (xmlXPathIsInf(arg1->floatval) == -1) ret = 1; else ret = 0; } else { ret = (arg1->floatval == arg2->floatval); } break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO break; case XPATH_NODESET: case XPATH_XSLT_TREE: break; } break; case XPATH_STRING: switch (arg2->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "Equal: undefined\n"); #endif break; case XPATH_BOOLEAN: if ((arg1->stringval == NULL) || (arg1->stringval[0] == 0)) ret = 0; else ret = 1; ret = (arg2->boolval == ret); break; case XPATH_STRING: ret = xmlStrEqual(arg1->stringval, arg2->stringval); break; case XPATH_NUMBER: valuePush(ctxt, arg1); xmlXPathNumberFunction(ctxt, 1); arg1 = valuePop(ctxt); /* Hand check NaN and Infinity equalities */ if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { ret = 0; } else if (xmlXPathIsInf(arg1->floatval) == 1) { if (xmlXPathIsInf(arg2->floatval) == 1) ret = 1; else ret = 0; } else if (xmlXPathIsInf(arg1->floatval) == -1) { if (xmlXPathIsInf(arg2->floatval) == -1) ret = 1; else ret = 0; } else if (xmlXPathIsInf(arg2->floatval) == 1) { if (xmlXPathIsInf(arg1->floatval) == 1) ret = 1; else ret = 0; } else if (xmlXPathIsInf(arg2->floatval) == -1) { if (xmlXPathIsInf(arg1->floatval) == -1) ret = 1; else ret = 0; } else { ret = (arg1->floatval == arg2->floatval); } break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO break; case XPATH_NODESET: case XPATH_XSLT_TREE: break; } break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO break; case XPATH_NODESET: case XPATH_XSLT_TREE: break; } xmlXPathReleaseObject(ctxt->context, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return(ret); } /** * xmlXPathEqualValues: * @ctxt: the XPath Parser context * * Implement the equal operation on XPath objects content: @arg1 == @arg2 * * Returns 0 or 1 depending on the results of the test. */ int xmlXPathEqualValues(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr arg1, arg2, argtmp; int ret = 0; if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); arg2 = valuePop(ctxt); arg1 = valuePop(ctxt); if ((arg1 == NULL) || (arg2 == NULL)) { if (arg1 != NULL) xmlXPathReleaseObject(ctxt->context, arg1); else xmlXPathReleaseObject(ctxt->context, arg2); XP_ERROR0(XPATH_INVALID_OPERAND); } if (arg1 == arg2) { #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "Equal: by pointer\n"); #endif xmlXPathFreeObject(arg1); return(1); } /* *If either argument is a nodeset, it's a 'special case' */ if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { /* *Hack it to assure arg1 is the nodeset */ if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { argtmp = arg2; arg2 = arg1; arg1 = argtmp; } switch (arg2->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "Equal: undefined\n"); #endif break; case XPATH_NODESET: case XPATH_XSLT_TREE: ret = xmlXPathEqualNodeSets(arg1, arg2, 0); break; case XPATH_BOOLEAN: if ((arg1->nodesetval == NULL) || (arg1->nodesetval->nodeNr == 0)) ret = 0; else ret = 1; ret = (ret == arg2->boolval); break; case XPATH_NUMBER: ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 0); break; case XPATH_STRING: ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval, 0); break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO break; } xmlXPathReleaseObject(ctxt->context, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return(ret); } return (xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); } /** * xmlXPathNotEqualValues: * @ctxt: the XPath Parser context * * Implement the equal operation on XPath objects content: @arg1 == @arg2 * * Returns 0 or 1 depending on the results of the test. */ int xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr arg1, arg2, argtmp; int ret = 0; if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); arg2 = valuePop(ctxt); arg1 = valuePop(ctxt); if ((arg1 == NULL) || (arg2 == NULL)) { if (arg1 != NULL) xmlXPathReleaseObject(ctxt->context, arg1); else xmlXPathReleaseObject(ctxt->context, arg2); XP_ERROR0(XPATH_INVALID_OPERAND); } if (arg1 == arg2) { #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "NotEqual: by pointer\n"); #endif xmlXPathReleaseObject(ctxt->context, arg1); return(0); } /* *If either argument is a nodeset, it's a 'special case' */ if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { /* *Hack it to assure arg1 is the nodeset */ if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { argtmp = arg2; arg2 = arg1; arg1 = argtmp; } switch (arg2->type) { case XPATH_UNDEFINED: #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "NotEqual: undefined\n"); #endif break; case XPATH_NODESET: case XPATH_XSLT_TREE: ret = xmlXPathEqualNodeSets(arg1, arg2, 1); break; case XPATH_BOOLEAN: if ((arg1->nodesetval == NULL) || (arg1->nodesetval->nodeNr == 0)) ret = 0; else ret = 1; ret = (ret != arg2->boolval); break; case XPATH_NUMBER: ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 1); break; case XPATH_STRING: ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval,1); break; case XPATH_USERS: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: TODO break; } xmlXPathReleaseObject(ctxt->context, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return(ret); } return (!xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); } /** * xmlXPathCompareValues: * @ctxt: the XPath Parser context * @inf: less than (1) or greater than (0) * @strict: is the comparison strict * * Implement the compare operation on XPath objects: * @arg1 < @arg2 (1, 1, ... * @arg1 <= @arg2 (1, 0, ... * @arg1 > @arg2 (0, 1, ... * @arg1 >= @arg2 (0, 0, ... * * When neither object to be compared is a node-set and the operator is * <=, <, >=, >, then the objects are compared by converted both objects * to numbers and comparing the numbers according to IEEE 754. The < * comparison will be true if and only if the first number is less than the * second number. The <= comparison will be true if and only if the first * number is less than or equal to the second number. The > comparison * will be true if and only if the first number is greater than the second * number. The >= comparison will be true if and only if the first number * is greater than or equal to the second number. * * Returns 1 if the comparison succeeded, 0 if it failed */ int xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict) { int ret = 0, arg1i = 0, arg2i = 0; xmlXPathObjectPtr arg1, arg2; if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); arg2 = valuePop(ctxt); arg1 = valuePop(ctxt); if ((arg1 == NULL) || (arg2 == NULL)) { if (arg1 != NULL) xmlXPathReleaseObject(ctxt->context, arg1); else xmlXPathReleaseObject(ctxt->context, arg2); XP_ERROR0(XPATH_INVALID_OPERAND); } if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { /* * If either argument is a XPATH_NODESET or XPATH_XSLT_TREE the two arguments * are not freed from within this routine; they will be freed from the * called routine, e.g. xmlXPathCompareNodeSets or xmlXPathCompareNodeSetValue */ if (((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE)) && ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE))){ ret = xmlXPathCompareNodeSets(inf, strict, arg1, arg2); } else { if ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { ret = xmlXPathCompareNodeSetValue(ctxt, inf, strict, arg1, arg2); } else { ret = xmlXPathCompareNodeSetValue(ctxt, !inf, strict, arg2, arg1); } } return(ret); } if (arg1->type != XPATH_NUMBER) { valuePush(ctxt, arg1); xmlXPathNumberFunction(ctxt, 1); arg1 = valuePop(ctxt); } if (arg1->type != XPATH_NUMBER) { xmlXPathFreeObject(arg1); xmlXPathFreeObject(arg2); XP_ERROR0(XPATH_INVALID_OPERAND); } if (arg2->type != XPATH_NUMBER) { valuePush(ctxt, arg2); xmlXPathNumberFunction(ctxt, 1); arg2 = valuePop(ctxt); } if (arg2->type != XPATH_NUMBER) { xmlXPathReleaseObject(ctxt->context, arg1); xmlXPathReleaseObject(ctxt->context, arg2); XP_ERROR0(XPATH_INVALID_OPERAND); } /* * Add tests for infinity and nan * => feedback on 3.4 for Inf and NaN */ /* Hand check NaN and Infinity comparisons */ if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { ret=0; } else { arg1i=xmlXPathIsInf(arg1->floatval); arg2i=xmlXPathIsInf(arg2->floatval); if (inf && strict) { if ((arg1i == -1 && arg2i != -1) || (arg2i == 1 && arg1i != 1)) { ret = 1; } else if (arg1i == 0 && arg2i == 0) { ret = (arg1->floatval < arg2->floatval); } else { ret = 0; } } else if (inf && !strict) { if (arg1i == -1 || arg2i == 1) { ret = 1; } else if (arg1i == 0 && arg2i == 0) { ret = (arg1->floatval <= arg2->floatval); } else { ret = 0; } } else if (!inf && strict) { if ((arg1i == 1 && arg2i != 1) || (arg2i == -1 && arg1i != -1)) { ret = 1; } else if (arg1i == 0 && arg2i == 0) { ret = (arg1->floatval > arg2->floatval); } else { ret = 0; } } else if (!inf && !strict) { if (arg1i == 1 || arg2i == -1) { ret = 1; } else if (arg1i == 0 && arg2i == 0) { ret = (arg1->floatval >= arg2->floatval); } else { ret = 0; } } } xmlXPathReleaseObject(ctxt->context, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return(ret); } /** * xmlXPathValueFlipSign: * @ctxt: the XPath Parser context * * Implement the unary - operation on an XPath object * The numeric operators convert their operands to numbers as if * by calling the number function. */ void xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) { if ((ctxt == NULL) || (ctxt->context == NULL)) return; CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); if (xmlXPathIsNaN(ctxt->value->floatval)) ctxt->value->floatval=xmlXPathNAN; else if (xmlXPathIsInf(ctxt->value->floatval) == 1) ctxt->value->floatval=xmlXPathNINF; else if (xmlXPathIsInf(ctxt->value->floatval) == -1) ctxt->value->floatval=xmlXPathPINF; else if (ctxt->value->floatval == 0) { if (xmlXPathGetSign(ctxt->value->floatval) == 0) ctxt->value->floatval = xmlXPathNZERO; else ctxt->value->floatval = 0; } else ctxt->value->floatval = - ctxt->value->floatval; } /** * xmlXPathAddValues: * @ctxt: the XPath Parser context * * Implement the add operation on XPath objects: * The numeric operators convert their operands to numbers as if * by calling the number function. */ void xmlXPathAddValues(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr arg; double val; arg = valuePop(ctxt); if (arg == NULL) XP_ERROR(XPATH_INVALID_OPERAND); val = xmlXPathCastToNumber(arg); xmlXPathReleaseObject(ctxt->context, arg); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); ctxt->value->floatval += val; } /** * xmlXPathSubValues: * @ctxt: the XPath Parser context * * Implement the subtraction operation on XPath objects: * The numeric operators convert their operands to numbers as if * by calling the number function. */ void xmlXPathSubValues(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr arg; double val; arg = valuePop(ctxt); if (arg == NULL) XP_ERROR(XPATH_INVALID_OPERAND); val = xmlXPathCastToNumber(arg); xmlXPathReleaseObject(ctxt->context, arg); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); ctxt->value->floatval -= val; } /** * xmlXPathMultValues: * @ctxt: the XPath Parser context * * Implement the multiply operation on XPath objects: * The numeric operators convert their operands to numbers as if * by calling the number function. */ void xmlXPathMultValues(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr arg; double val; arg = valuePop(ctxt); if (arg == NULL) XP_ERROR(XPATH_INVALID_OPERAND); val = xmlXPathCastToNumber(arg); xmlXPathReleaseObject(ctxt->context, arg); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); ctxt->value->floatval *= val; } /** * xmlXPathDivValues: * @ctxt: the XPath Parser context * * Implement the div operation on XPath objects @arg1 / @arg2: * The numeric operators convert their operands to numbers as if * by calling the number function. */ void xmlXPathDivValues(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr arg; double val; arg = valuePop(ctxt); if (arg == NULL) XP_ERROR(XPATH_INVALID_OPERAND); val = xmlXPathCastToNumber(arg); xmlXPathReleaseObject(ctxt->context, arg); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); if (xmlXPathIsNaN(val) || xmlXPathIsNaN(ctxt->value->floatval)) ctxt->value->floatval = xmlXPathNAN; else if (val == 0 && xmlXPathGetSign(val) != 0) { if (ctxt->value->floatval == 0) ctxt->value->floatval = xmlXPathNAN; else if (ctxt->value->floatval > 0) ctxt->value->floatval = xmlXPathNINF; else if (ctxt->value->floatval < 0) ctxt->value->floatval = xmlXPathPINF; } else if (val == 0) { if (ctxt->value->floatval == 0) ctxt->value->floatval = xmlXPathNAN; else if (ctxt->value->floatval > 0) ctxt->value->floatval = xmlXPathPINF; else if (ctxt->value->floatval < 0) ctxt->value->floatval = xmlXPathNINF; } else ctxt->value->floatval /= val; } /** * xmlXPathModValues: * @ctxt: the XPath Parser context * * Implement the mod operation on XPath objects: @arg1 / @arg2 * The numeric operators convert their operands to numbers as if * by calling the number function. */ void xmlXPathModValues(xmlXPathParserContextPtr ctxt) { xmlXPathObjectPtr arg; double arg1, arg2; arg = valuePop(ctxt); if (arg == NULL) XP_ERROR(XPATH_INVALID_OPERAND); arg2 = xmlXPathCastToNumber(arg); xmlXPathReleaseObject(ctxt->context, arg); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); arg1 = ctxt->value->floatval; if (arg2 == 0) ctxt->value->floatval = xmlXPathNAN; else { ctxt->value->floatval = fmod(arg1, arg2); } } /************************************************************************ * * * The traversal functions * * * ************************************************************************/ /* * A traversal function enumerates nodes along an axis. * Initially it must be called with NULL, and it indicates * termination on the axis by returning NULL. */ typedef xmlNodePtr (*xmlXPathTraversalFunction) (xmlXPathParserContextPtr ctxt, xmlNodePtr cur); /* * xmlXPathTraversalFunctionExt: * A traversal function enumerates nodes along an axis. * Initially it must be called with NULL, and it indicates * termination on the axis by returning NULL. * The context node of the traversal is specified via @contextNode. */ typedef xmlNodePtr (*xmlXPathTraversalFunctionExt) (xmlNodePtr cur, xmlNodePtr contextNode); /* * xmlXPathNodeSetMergeFunction: * Used for merging node sets in xmlXPathCollectAndTest(). */ typedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction) (xmlNodeSetPtr, xmlNodeSetPtr, int); /** * xmlXPathNextSelf: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "self" direction * The self axis contains just the context node itself * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) return(ctxt->context->node); return(NULL); } /** * xmlXPathNextChild: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "child" direction * The child axis contains the children of the context node in document order. * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) { if (ctxt->context->node == NULL) return(NULL); switch (ctxt->context->node->type) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: return(ctxt->context->node->children); case XML_DOCUMENT_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif return(((xmlDocPtr) ctxt->context->node)->children); case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: case XML_ATTRIBUTE_NODE: case XML_NAMESPACE_DECL: case XML_XINCLUDE_START: case XML_XINCLUDE_END: return(NULL); } return(NULL); } if ((cur->type == XML_DOCUMENT_NODE) || (cur->type == XML_HTML_DOCUMENT_NODE)) return(NULL); return(cur->next); } /** * xmlXPathNextChildElement: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "child" direction and nodes of type element. * The child axis contains the children of the context node in document order. * * Returns the next element following that axis */ static xmlNodePtr xmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) { cur = ctxt->context->node; if (cur == NULL) return(NULL); /* * Get the first element child. */ switch (cur->type) { case XML_ELEMENT_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_ENTITY_REF_NODE: /* URGENT TODO: entify-refs as well? */ case XML_ENTITY_NODE: cur = cur->children; if (cur != NULL) { if (cur->type == XML_ELEMENT_NODE) return(cur); do { cur = cur->next; } while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE)); return(cur); } return(NULL); case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif return(xmlDocGetRootElement((xmlDocPtr) cur)); default: return(NULL); } return(NULL); } /* * Get the next sibling element node. */ switch (cur->type) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_CDATA_SECTION_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_XINCLUDE_END: break; /* case XML_DTD_NODE: */ /* URGENT TODO: DTD-node as well? */ default: return(NULL); } if (cur->next != NULL) { if (cur->next->type == XML_ELEMENT_NODE) return(cur->next); cur = cur->next; do { cur = cur->next; } while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE)); return(cur); } return(NULL); } #if 0 /** * xmlXPathNextDescendantOrSelfElemParent: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "descendant-or-self" axis. * Additionally it returns only nodes which can be parents of * element nodes. * * * Returns the next element following that axis */ static xmlNodePtr xmlXPathNextDescendantOrSelfElemParent(xmlNodePtr cur, xmlNodePtr contextNode) { if (cur == NULL) { if (contextNode == NULL) return(NULL); switch (contextNode->type) { case XML_ELEMENT_NODE: case XML_XINCLUDE_START: case XML_DOCUMENT_FRAG_NODE: case XML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif case XML_HTML_DOCUMENT_NODE: return(contextNode); default: return(NULL); } return(NULL); } else { xmlNodePtr start = cur; while (cur != NULL) { switch (cur->type) { case XML_ELEMENT_NODE: /* TODO: OK to have XInclude here? */ case XML_XINCLUDE_START: case XML_DOCUMENT_FRAG_NODE: if (cur != start) return(cur); if (cur->children != NULL) { cur = cur->children; continue; } break; /* Not sure if we need those here. */ case XML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif case XML_HTML_DOCUMENT_NODE: if (cur != start) return(cur); return(xmlDocGetRootElement((xmlDocPtr) cur)); default: break; } next_sibling: if ((cur == NULL) || (cur == contextNode)) return(NULL); if (cur->next != NULL) { cur = cur->next; } else { cur = cur->parent; goto next_sibling; } } } return(NULL); } #endif /** * xmlXPathNextDescendant: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "descendant" direction * the descendant axis contains the descendants of the context node in document * order; a descendant is a child or a child of a child and so on. * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) { if (ctxt->context->node == NULL) return(NULL); if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || (ctxt->context->node->type == XML_NAMESPACE_DECL)) return(NULL); if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) return(ctxt->context->doc->children); return(ctxt->context->node->children); } if (cur->type == XML_NAMESPACE_DECL) return(NULL); if (cur->children != NULL) { /* * Do not descend on entities declarations */ if (cur->children->type != XML_ENTITY_DECL) { cur = cur->children; /* * Skip DTDs */ if (cur->type != XML_DTD_NODE) return(cur); } } if (cur == ctxt->context->node) return(NULL); while (cur->next != NULL) { cur = cur->next; if ((cur->type != XML_ENTITY_DECL) && (cur->type != XML_DTD_NODE)) return(cur); } do { cur = cur->parent; if (cur == NULL) break; if (cur == ctxt->context->node) return(NULL); if (cur->next != NULL) { cur = cur->next; return(cur); } } while (cur != NULL); return(cur); } /** * xmlXPathNextDescendantOrSelf: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "descendant-or-self" direction * the descendant-or-self axis contains the context node and the descendants * of the context node in document order; thus the context node is the first * node on the axis, and the first child of the context node is the second node * on the axis * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) { if (ctxt->context->node == NULL) return(NULL); if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || (ctxt->context->node->type == XML_NAMESPACE_DECL)) return(NULL); return(ctxt->context->node); } return(xmlXPathNextDescendant(ctxt, cur)); } /** * xmlXPathNextParent: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "parent" direction * The parent axis contains the parent of the context node, if there is one. * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); /* * the parent of an attribute or namespace node is the element * to which the attribute or namespace node is attached * Namespace handling !!! */ if (cur == NULL) { if (ctxt->context->node == NULL) return(NULL); switch (ctxt->context->node->type) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_XINCLUDE_START: case XML_XINCLUDE_END: case XML_ENTITY_DECL: if (ctxt->context->node->parent == NULL) return((xmlNodePtr) ctxt->context->doc); if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && ((ctxt->context->node->parent->name[0] == ' ') || (xmlStrEqual(ctxt->context->node->parent->name, BAD_CAST "fake node libxslt")))) return(NULL); return(ctxt->context->node->parent); case XML_ATTRIBUTE_NODE: { xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; return(att->parent); } case XML_DOCUMENT_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif return(NULL); case XML_NAMESPACE_DECL: { xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) return((xmlNodePtr) ns->next); return(NULL); } } } return(NULL); } /** * xmlXPathNextAncestor: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "ancestor" direction * the ancestor axis contains the ancestors of the context node; the ancestors * of the context node consist of the parent of context node and the parent's * parent and so on; the nodes are ordered in reverse document order; thus the * parent is the first node on the axis, and the parent's parent is the second * node on the axis * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); /* * the parent of an attribute or namespace node is the element * to which the attribute or namespace node is attached * !!!!!!!!!!!!! */ if (cur == NULL) { if (ctxt->context->node == NULL) return(NULL); switch (ctxt->context->node->type) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: case XML_NOTATION_NODE: case XML_XINCLUDE_START: case XML_XINCLUDE_END: if (ctxt->context->node->parent == NULL) return((xmlNodePtr) ctxt->context->doc); if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && ((ctxt->context->node->parent->name[0] == ' ') || (xmlStrEqual(ctxt->context->node->parent->name, BAD_CAST "fake node libxslt")))) return(NULL); return(ctxt->context->node->parent); case XML_ATTRIBUTE_NODE: { xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node; return(tmp->parent); } case XML_DOCUMENT_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif return(NULL); case XML_NAMESPACE_DECL: { xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) return((xmlNodePtr) ns->next); /* Bad, how did that namespace end up here ? */ return(NULL); } } return(NULL); } if (cur == ctxt->context->doc->children) return((xmlNodePtr) ctxt->context->doc); if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); switch (cur->type) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: case XML_XINCLUDE_START: case XML_XINCLUDE_END: if (cur->parent == NULL) return(NULL); if ((cur->parent->type == XML_ELEMENT_NODE) && ((cur->parent->name[0] == ' ') || (xmlStrEqual(cur->parent->name, BAD_CAST "fake node libxslt")))) return(NULL); return(cur->parent); case XML_ATTRIBUTE_NODE: { xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; return(att->parent); } case XML_NAMESPACE_DECL: { xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) return((xmlNodePtr) ns->next); /* Bad, how did that namespace end up here ? */ return(NULL); } case XML_DOCUMENT_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif return(NULL); } return(NULL); } /** * xmlXPathNextAncestorOrSelf: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "ancestor-or-self" direction * he ancestor-or-self axis contains the context node and ancestors of * the context node in reverse document order; thus the context node is * the first node on the axis, and the context node's parent the second; * parent here is defined the same as with the parent axis. * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) return(ctxt->context->node); return(xmlXPathNextAncestor(ctxt, cur)); } /** * xmlXPathNextFollowingSibling: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "following-sibling" direction * The following-sibling axis contains the following siblings of the context * node in document order. * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || (ctxt->context->node->type == XML_NAMESPACE_DECL)) return(NULL); if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); if (cur == NULL) return(ctxt->context->node->next); return(cur->next); } /** * xmlXPathNextPrecedingSibling: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "preceding-sibling" direction * The preceding-sibling axis contains the preceding siblings of the context * node in reverse document order; the first preceding sibling is first on the * axis; the sibling preceding that node is the second on the axis and so on. * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || (ctxt->context->node->type == XML_NAMESPACE_DECL)) return(NULL); if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); if (cur == NULL) return(ctxt->context->node->prev); if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) { cur = cur->prev; if (cur == NULL) return(ctxt->context->node->prev); } return(cur->prev); } /** * xmlXPathNextFollowing: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "following" direction * The following axis contains all nodes in the same document as the context * node that are after the context node in document order, excluding any * descendants and excluding attribute nodes and namespace nodes; the nodes * are ordered in document order * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if ((cur != NULL) && (cur->type != XML_ATTRIBUTE_NODE) && (cur->type != XML_NAMESPACE_DECL) && (cur->children != NULL)) return(cur->children); if (cur == NULL) { cur = ctxt->context->node; if (cur->type == XML_NAMESPACE_DECL) return(NULL); if (cur->type == XML_ATTRIBUTE_NODE) cur = cur->parent; } if (cur == NULL) return(NULL) ; /* ERROR */ if (cur->next != NULL) return(cur->next) ; do { cur = cur->parent; if (cur == NULL) break; if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); if (cur->next != NULL) return(cur->next); } while (cur != NULL); return(cur); } /* * xmlXPathIsAncestor: * @ancestor: the ancestor node * @node: the current node * * Check that @ancestor is a @node's ancestor * * returns 1 if @ancestor is a @node's ancestor, 0 otherwise. */ static int xmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr node) { if ((ancestor == NULL) || (node == NULL)) return(0); if (node->type == XML_NAMESPACE_DECL) return(0); if (ancestor->type == XML_NAMESPACE_DECL) return(0); /* nodes need to be in the same document */ if (ancestor->doc != node->doc) return(0); /* avoid searching if ancestor or node is the root node */ if (ancestor == (xmlNodePtr) node->doc) return(1); if (node == (xmlNodePtr) ancestor->doc) return(0); while (node->parent != NULL) { if (node->parent == ancestor) return(1); node = node->parent; } return(0); } /** * xmlXPathNextPreceding: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "preceding" direction * the preceding axis contains all nodes in the same document as the context * node that are before the context node in document order, excluding any * ancestors and excluding attribute nodes and namespace nodes; the nodes are * ordered in reverse document order * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) { cur = ctxt->context->node; if (cur->type == XML_NAMESPACE_DECL) return(NULL); if (cur->type == XML_ATTRIBUTE_NODE) return(cur->parent); } if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) return (NULL); if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) cur = cur->prev; do { if (cur->prev != NULL) { for (cur = cur->prev; cur->last != NULL; cur = cur->last) ; return (cur); } cur = cur->parent; if (cur == NULL) return (NULL); if (cur == ctxt->context->doc->children) return (NULL); } while (xmlXPathIsAncestor(cur, ctxt->context->node)); return (cur); } /** * xmlXPathNextPrecedingInternal: * @ctxt: the XPath Parser context * @cur: the current node in the traversal * * Traversal function for the "preceding" direction * the preceding axis contains all nodes in the same document as the context * node that are before the context node in document order, excluding any * ancestors and excluding attribute nodes and namespace nodes; the nodes are * ordered in reverse document order * This is a faster implementation but internal only since it requires a * state kept in the parser context: ctxt->ancestor. * * Returns the next element following that axis */ static xmlNodePtr xmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) { cur = ctxt->context->node; if (cur == NULL) return (NULL); if (cur->type == XML_NAMESPACE_DECL) return (NULL); ctxt->ancestor = cur->parent; } if (cur->type == XML_NAMESPACE_DECL) return(NULL); if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) cur = cur->prev; while (cur->prev == NULL) { cur = cur->parent; if (cur == NULL) return (NULL); if (cur == ctxt->context->doc->children) return (NULL); if (cur != ctxt->ancestor) return (cur); ctxt->ancestor = cur->parent; } cur = cur->prev; while (cur->last != NULL) cur = cur->last; return (cur); } /** * xmlXPathNextNamespace: * @ctxt: the XPath Parser context * @cur: the current attribute in the traversal * * Traversal function for the "namespace" direction * the namespace axis contains the namespace nodes of the context node; * the order of nodes on this axis is implementation-defined; the axis will * be empty unless the context node is an element * * We keep the XML namespace node at the end of the list. * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL); if (ctxt->context->tmpNsList == NULL && cur != (xmlNodePtr) xmlXPathXMLNamespace) { if (ctxt->context->tmpNsList != NULL) xmlFree(ctxt->context->tmpNsList); ctxt->context->tmpNsList = xmlGetNsList(ctxt->context->doc, ctxt->context->node); ctxt->context->tmpNsNr = 0; if (ctxt->context->tmpNsList != NULL) { while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] != NULL) { ctxt->context->tmpNsNr++; } } return((xmlNodePtr) xmlXPathXMLNamespace); } if (ctxt->context->tmpNsNr > 0) { return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr]; } else { if (ctxt->context->tmpNsList != NULL) xmlFree(ctxt->context->tmpNsList); ctxt->context->tmpNsList = NULL; return(NULL); } } /** * xmlXPathNextAttribute: * @ctxt: the XPath Parser context * @cur: the current attribute in the traversal * * Traversal function for the "attribute" direction * TODO: support DTD inherited default attributes * * Returns the next element following that axis */ xmlNodePtr xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (ctxt->context->node == NULL) return(NULL); if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL); if (cur == NULL) { if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) return(NULL); return((xmlNodePtr)ctxt->context->node->properties); } return((xmlNodePtr)cur->next); } /************************************************************************ * * * NodeTest Functions * * * ************************************************************************/ #define IS_FUNCTION 200 /************************************************************************ * * * Implicit tree core function library * * * ************************************************************************/ /** * xmlXPathRoot: * @ctxt: the XPath Parser context * * Initialize the context to the root of the document */ void xmlXPathRoot(xmlXPathParserContextPtr ctxt) { if ((ctxt == NULL) || (ctxt->context == NULL)) return; ctxt->context->node = (xmlNodePtr) ctxt->context->doc; valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node)); } /************************************************************************ * * * The explicit core function library * *http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html#corelib * * * ************************************************************************/ /** * xmlXPathLastFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the last() XPath function * number last() * The last function returns the number of nodes in the context node list. */ void xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs) { CHECK_ARITY(0); if (ctxt->context->contextSize >= 0) { valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) ctxt->context->contextSize)); #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "last() : %d\n", ctxt->context->contextSize); #endif } else { XP_ERROR(XPATH_INVALID_CTXT_SIZE); } } /** * xmlXPathPositionFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the position() XPath function * number position() * The position function returns the position of the context node in the * context node list. The first position is 1, and so the last position * will be equal to last(). */ void xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs) { CHECK_ARITY(0); if (ctxt->context->proximityPosition >= 0) { valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) ctxt->context->proximityPosition)); #ifdef DEBUG_EXPR xmlGenericError(xmlGenericErrorContext, "position() : %d\n", ctxt->context->proximityPosition); #endif } else { XP_ERROR(XPATH_INVALID_CTXT_POSITION); } } /** * xmlXPathCountFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the count() XPath function * number count(node-set) */ void xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; CHECK_ARITY(1); if ((ctxt->value == NULL) || ((ctxt->value->type != XPATH_NODESET) && (ctxt->value->type != XPATH_XSLT_TREE))) XP_ERROR(XPATH_INVALID_TYPE); cur = valuePop(ctxt); if ((cur == NULL) || (cur->nodesetval == NULL)) valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); else if ((cur->type == XPATH_NODESET) || (cur->type == XPATH_XSLT_TREE)) { valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) cur->nodesetval->nodeNr)); } else { if ((cur->nodesetval->nodeNr != 1) || (cur->nodesetval->nodeTab == NULL)) { valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); } else { xmlNodePtr tmp; int i = 0; tmp = cur->nodesetval->nodeTab[0]; if ((tmp != NULL) && (tmp->type != XML_NAMESPACE_DECL)) { tmp = tmp->children; while (tmp != NULL) { tmp = tmp->next; i++; } } valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) i)); } } xmlXPathReleaseObject(ctxt->context, cur); } /** * xmlXPathGetElementsByIds: * @doc: the document * @ids: a whitespace separated list of IDs * * Selects elements by their unique ID. * * Returns a node-set of selected elements. */ static xmlNodeSetPtr xmlXPathGetElementsByIds (xmlDocPtr doc, const xmlChar *ids) { xmlNodeSetPtr ret; const xmlChar *cur = ids; xmlChar *ID; xmlAttrPtr attr; xmlNodePtr elem = NULL; if (ids == NULL) return(NULL); ret = xmlXPathNodeSetCreate(NULL); if (ret == NULL) return(ret); while (IS_BLANK_CH(*cur)) cur++; while (*cur != 0) { while ((!IS_BLANK_CH(*cur)) && (*cur != 0)) cur++; ID = xmlStrndup(ids, cur - ids); if (ID != NULL) { /* * We used to check the fact that the value passed * was an NCName, but this generated much troubles for * me and Aleksey Sanin, people blatantly violated that * constaint, like Visa3D spec. * if (xmlValidateNCName(ID, 1) == 0) */ attr = xmlGetID(doc, ID); if (attr != NULL) { if (attr->type == XML_ATTRIBUTE_NODE) elem = attr->parent; else if (attr->type == XML_ELEMENT_NODE) elem = (xmlNodePtr) attr; else elem = NULL; if (elem != NULL) xmlXPathNodeSetAdd(ret, elem); } xmlFree(ID); } while (IS_BLANK_CH(*cur)) cur++; ids = cur; } return(ret); } /** * xmlXPathIdFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the id() XPath function * node-set id(object) * The id function selects elements by their unique ID * (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, * then the result is the union of the result of applying id to the * string value of each of the nodes in the argument node-set. When the * argument to id is of any other type, the argument is converted to a * string as if by a call to the string function; the string is split * into a whitespace-separated list of tokens (whitespace is any sequence * of characters matching the production S); the result is a node-set * containing the elements in the same document as the context node that * have a unique ID equal to any of the tokens in the list. */ void xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlChar *tokens; xmlNodeSetPtr ret; xmlXPathObjectPtr obj; CHECK_ARITY(1); obj = valuePop(ctxt); if (obj == NULL) XP_ERROR(XPATH_INVALID_OPERAND); if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { xmlNodeSetPtr ns; int i; ret = xmlXPathNodeSetCreate(NULL); /* * FIXME -- in an out-of-memory condition this will behave badly. * The solution is not clear -- we already popped an item from * ctxt, so the object is in a corrupt state. */ if (obj->nodesetval != NULL) { for (i = 0; i < obj->nodesetval->nodeNr; i++) { tokens = xmlXPathCastNodeToString(obj->nodesetval->nodeTab[i]); ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens); ret = xmlXPathNodeSetMerge(ret, ns); xmlXPathFreeNodeSet(ns); if (tokens != NULL) xmlFree(tokens); } } xmlXPathReleaseObject(ctxt->context, obj); valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); return; } obj = xmlXPathCacheConvertString(ctxt->context, obj); ret = xmlXPathGetElementsByIds(ctxt->context->doc, obj->stringval); valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); xmlXPathReleaseObject(ctxt->context, obj); return; } /** * xmlXPathLocalNameFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the local-name() XPath function * string local-name(node-set?) * The local-name function returns a string containing the local part * of the name of the node in the argument node-set that is first in * document order. If the node-set is empty or the first node has no * name, an empty string is returned. If the argument is omitted it * defaults to the context node. */ void xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; if (ctxt == NULL) return; if (nargs == 0) { valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node)); nargs = 1; } CHECK_ARITY(1); if ((ctxt->value == NULL) || ((ctxt->value->type != XPATH_NODESET) && (ctxt->value->type != XPATH_XSLT_TREE))) XP_ERROR(XPATH_INVALID_TYPE); cur = valuePop(ctxt); if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); } else { int i = 0; /* Should be first in document order !!!!! */ switch (cur->nodesetval->nodeTab[i]->type) { case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: case XML_PI_NODE: if (cur->nodesetval->nodeTab[i]->name[0] == ' ') valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); else valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, cur->nodesetval->nodeTab[i]->name)); break; case XML_NAMESPACE_DECL: valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ((xmlNsPtr)cur->nodesetval->nodeTab[i])->prefix)); break; default: valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); } } xmlXPathReleaseObject(ctxt->context, cur); } /** * xmlXPathNamespaceURIFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the namespace-uri() XPath function * string namespace-uri(node-set?) * The namespace-uri function returns a string containing the * namespace URI of the expanded name of the node in the argument * node-set that is first in document order. If the node-set is empty, * the first node has no name, or the expanded name has no namespace * URI, an empty string is returned. If the argument is omitted it * defaults to the context node. */ void xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; if (ctxt == NULL) return; if (nargs == 0) { valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node)); nargs = 1; } CHECK_ARITY(1); if ((ctxt->value == NULL) || ((ctxt->value->type != XPATH_NODESET) && (ctxt->value->type != XPATH_XSLT_TREE))) XP_ERROR(XPATH_INVALID_TYPE); cur = valuePop(ctxt); if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); } else { int i = 0; /* Should be first in document order !!!!! */ switch (cur->nodesetval->nodeTab[i]->type) { case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: if (cur->nodesetval->nodeTab[i]->ns == NULL) valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); else valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, cur->nodesetval->nodeTab[i]->ns->href)); break; default: valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); } } xmlXPathReleaseObject(ctxt->context, cur); } /** * xmlXPathNameFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the name() XPath function * string name(node-set?) * The name function returns a string containing a QName representing * the name of the node in the argument node-set that is first in document * order. The QName must represent the name with respect to the namespace * declarations in effect on the node whose name is being represented. * Typically, this will be the form in which the name occurred in the XML * source. This need not be the case if there are namespace declarations * in effect on the node that associate multiple prefixes with the same * namespace. However, an implementation may include information about * the original prefix in its representation of nodes; in this case, an * implementation can ensure that the returned string is always the same * as the QName used in the XML source. If the argument it omitted it * defaults to the context node. * Libxml keep the original prefix so the "real qualified name" used is * returned. */ static void xmlXPathNameFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; if (nargs == 0) { valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node)); nargs = 1; } CHECK_ARITY(1); if ((ctxt->value == NULL) || ((ctxt->value->type != XPATH_NODESET) && (ctxt->value->type != XPATH_XSLT_TREE))) XP_ERROR(XPATH_INVALID_TYPE); cur = valuePop(ctxt); if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); } else { int i = 0; /* Should be first in document order !!!!! */ switch (cur->nodesetval->nodeTab[i]->type) { case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: if (cur->nodesetval->nodeTab[i]->name[0] == ' ') valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); else if ((cur->nodesetval->nodeTab[i]->ns == NULL) || (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) { valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, cur->nodesetval->nodeTab[i]->name)); } else { xmlChar *fullname; fullname = xmlBuildQName(cur->nodesetval->nodeTab[i]->name, cur->nodesetval->nodeTab[i]->ns->prefix, NULL, 0); if (fullname == cur->nodesetval->nodeTab[i]->name) fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name); if (fullname == NULL) { XP_ERROR(XPATH_MEMORY_ERROR); } valuePush(ctxt, xmlXPathCacheWrapString( ctxt->context, fullname)); } break; default: valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, cur->nodesetval->nodeTab[i])); xmlXPathLocalNameFunction(ctxt, 1); } } xmlXPathReleaseObject(ctxt->context, cur); } /** * xmlXPathStringFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the string() XPath function * string string(object?) * The string function converts an object to a string as follows: * - A node-set is converted to a string by returning the value of * the node in the node-set that is first in document order. * If the node-set is empty, an empty string is returned. * - A number is converted to a string as follows * + NaN is converted to the string NaN * + positive zero is converted to the string 0 * + negative zero is converted to the string 0 * + positive infinity is converted to the string Infinity * + negative infinity is converted to the string -Infinity * + if the number is an integer, the number is represented in * decimal form as a Number with no decimal point and no leading * zeros, preceded by a minus sign (-) if the number is negative * + otherwise, the number is represented in decimal form as a * Number including a decimal point with at least one digit * before the decimal point and at least one digit after the * decimal point, preceded by a minus sign (-) if the number * is negative; there must be no leading zeros before the decimal * point apart possibly from the one required digit immediately * before the decimal point; beyond the one required digit * after the decimal point there must be as many, but only as * many, more digits as are needed to uniquely distinguish the * number from all other IEEE 754 numeric values. * - The boolean false value is converted to the string false. * The boolean true value is converted to the string true. * * If the argument is omitted, it defaults to a node-set with the * context node as its only member. */ void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; if (ctxt == NULL) return; if (nargs == 0) { valuePush(ctxt, xmlXPathCacheWrapString(ctxt->context, xmlXPathCastNodeToString(ctxt->context->node))); return; } CHECK_ARITY(1); cur = valuePop(ctxt); if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context, cur)); } /** * xmlXPathStringLengthFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the string-length() XPath function * number string-length(string?) * The string-length returns the number of characters in the string * (see [3.6 Strings]). If the argument is omitted, it defaults to * the context node converted to a string, in other words the value * of the context node. */ void xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; if (nargs == 0) { if ((ctxt == NULL) || (ctxt->context == NULL)) return; if (ctxt->context->node == NULL) { valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0)); } else { xmlChar *content; content = xmlXPathCastNodeToString(ctxt->context->node); valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, xmlUTF8Strlen(content))); xmlFree(content); } return; } CHECK_ARITY(1); CAST_TO_STRING; CHECK_TYPE(XPATH_STRING); cur = valuePop(ctxt); valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, xmlUTF8Strlen(cur->stringval))); xmlXPathReleaseObject(ctxt->context, cur); } /** * xmlXPathConcatFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the concat() XPath function * string concat(string, string, string*) * The concat function returns the concatenation of its arguments. */ void xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur, newobj; xmlChar *tmp; if (ctxt == NULL) return; if (nargs < 2) { CHECK_ARITY(2); } CAST_TO_STRING; cur = valuePop(ctxt); if ((cur == NULL) || (cur->type != XPATH_STRING)) { xmlXPathReleaseObject(ctxt->context, cur); return; } nargs--; while (nargs > 0) { CAST_TO_STRING; newobj = valuePop(ctxt); if ((newobj == NULL) || (newobj->type != XPATH_STRING)) { xmlXPathReleaseObject(ctxt->context, newobj); xmlXPathReleaseObject(ctxt->context, cur); XP_ERROR(XPATH_INVALID_TYPE); } tmp = xmlStrcat(newobj->stringval, cur->stringval); newobj->stringval = cur->stringval; cur->stringval = tmp; xmlXPathReleaseObject(ctxt->context, newobj); nargs--; } valuePush(ctxt, cur); } /** * xmlXPathContainsFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the contains() XPath function * boolean contains(string, string) * The contains function returns true if the first argument string * contains the second argument string, and otherwise returns false. */ void xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr hay, needle; CHECK_ARITY(2); CAST_TO_STRING; CHECK_TYPE(XPATH_STRING); needle = valuePop(ctxt); CAST_TO_STRING; hay = valuePop(ctxt); if ((hay == NULL) || (hay->type != XPATH_STRING)) { xmlXPathReleaseObject(ctxt->context, hay); xmlXPathReleaseObject(ctxt->context, needle); XP_ERROR(XPATH_INVALID_TYPE); } if (xmlStrstr(hay->stringval, needle->stringval)) valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); else valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); xmlXPathReleaseObject(ctxt->context, hay); xmlXPathReleaseObject(ctxt->context, needle); } /** * xmlXPathStartsWithFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the starts-with() XPath function * boolean starts-with(string, string) * The starts-with function returns true if the first argument string * starts with the second argument string, and otherwise returns false. */ void xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr hay, needle; int n; CHECK_ARITY(2); CAST_TO_STRING; CHECK_TYPE(XPATH_STRING); needle = valuePop(ctxt); CAST_TO_STRING; hay = valuePop(ctxt); if ((hay == NULL) || (hay->type != XPATH_STRING)) { xmlXPathReleaseObject(ctxt->context, hay); xmlXPathReleaseObject(ctxt->context, needle); XP_ERROR(XPATH_INVALID_TYPE); } n = xmlStrlen(needle->stringval); if (xmlStrncmp(hay->stringval, needle->stringval, n)) valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); else valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); xmlXPathReleaseObject(ctxt->context, hay); xmlXPathReleaseObject(ctxt->context, needle); } /** * xmlXPathSubstringFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the substring() XPath function * string substring(string, number, number?) * The substring function returns the substring of the first argument * starting at the position specified in the second argument with * length specified in the third argument. For example, * substring("12345",2,3) returns "234". If the third argument is not * specified, it returns the substring starting at the position specified * in the second argument and continuing to the end of the string. For * example, substring("12345",2) returns "2345". More precisely, each * character in the string (see [3.6 Strings]) is considered to have a * numeric position: the position of the first character is 1, the position * of the second character is 2 and so on. The returned substring contains * those characters for which the position of the character is greater than * or equal to the second argument and, if the third argument is specified, * less than the sum of the second and third arguments; the comparisons * and addition used for the above follow the standard IEEE 754 rules. Thus: * - substring("12345", 1.5, 2.6) returns "234" * - substring("12345", 0, 3) returns "12" * - substring("12345", 0 div 0, 3) returns "" * - substring("12345", 1, 0 div 0) returns "" * - substring("12345", -42, 1 div 0) returns "12345" * - substring("12345", -1 div 0, 1 div 0) returns "" */ void xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr str, start, len; double le=0, in; int i, l, m; xmlChar *ret; if (nargs < 2) { CHECK_ARITY(2); } if (nargs > 3) { CHECK_ARITY(3); } /* * take care of possible last (position) argument */ if (nargs == 3) { CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); len = valuePop(ctxt); le = len->floatval; xmlXPathReleaseObject(ctxt->context, len); } CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); start = valuePop(ctxt); in = start->floatval; xmlXPathReleaseObject(ctxt->context, start); CAST_TO_STRING; CHECK_TYPE(XPATH_STRING); str = valuePop(ctxt); m = xmlUTF8Strlen((const unsigned char *)str->stringval); /* * If last pos not present, calculate last position */ if (nargs != 3) { le = (double)m; if (in < 1.0) in = 1.0; } /* Need to check for the special cases where either * the index is NaN, the length is NaN, or both * arguments are infinity (relying on Inf + -Inf = NaN) */ if (!xmlXPathIsInf(in) && !xmlXPathIsNaN(in + le)) { /* * To meet the requirements of the spec, the arguments * must be converted to integer format before * initial index calculations are done * * First we go to integer form, rounding up * and checking for special cases */ i = (int) in; if (((double)i)+0.5 <= in) i++; if (xmlXPathIsInf(le) == 1) { l = m; if (i < 1) i = 1; } else if (xmlXPathIsInf(le) == -1 || le < 0.0) l = 0; else { l = (int) le; if (((double)l)+0.5 <= le) l++; } /* Now we normalize inidices */ i -= 1; l += i; if (i < 0) i = 0; if (l > m) l = m; /* number of chars to copy */ l -= i; ret = xmlUTF8Strsub(str->stringval, i, l); } else { ret = NULL; } if (ret == NULL) valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); else { valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ret)); xmlFree(ret); } xmlXPathReleaseObject(ctxt->context, str); } /** * xmlXPathSubstringBeforeFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the substring-before() XPath function * string substring-before(string, string) * The substring-before function returns the substring of the first * argument string that precedes the first occurrence of the second * argument string in the first argument string, or the empty string * if the first argument string does not contain the second argument * string. For example, substring-before("1999/04/01","/") returns 1999. */ void xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr str; xmlXPathObjectPtr find; xmlBufPtr target; const xmlChar *point; int offset; CHECK_ARITY(2); CAST_TO_STRING; find = valuePop(ctxt); CAST_TO_STRING; str = valuePop(ctxt); target = xmlBufCreate(); if (target) { point = xmlStrstr(str->stringval, find->stringval); if (point) { offset = (int)(point - str->stringval); xmlBufAdd(target, str->stringval, offset); } valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, xmlBufContent(target))); xmlBufFree(target); } xmlXPathReleaseObject(ctxt->context, str); xmlXPathReleaseObject(ctxt->context, find); } /** * xmlXPathSubstringAfterFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the substring-after() XPath function * string substring-after(string, string) * The substring-after function returns the substring of the first * argument string that follows the first occurrence of the second * argument string in the first argument string, or the empty stringi * if the first argument string does not contain the second argument * string. For example, substring-after("1999/04/01","/") returns 04/01, * and substring-after("1999/04/01","19") returns 99/04/01. */ void xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr str; xmlXPathObjectPtr find; xmlBufPtr target; const xmlChar *point; int offset; CHECK_ARITY(2); CAST_TO_STRING; find = valuePop(ctxt); CAST_TO_STRING; str = valuePop(ctxt); target = xmlBufCreate(); if (target) { point = xmlStrstr(str->stringval, find->stringval); if (point) { offset = (int)(point - str->stringval) + xmlStrlen(find->stringval); xmlBufAdd(target, &str->stringval[offset], xmlStrlen(str->stringval) - offset); } valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, xmlBufContent(target))); xmlBufFree(target); } xmlXPathReleaseObject(ctxt->context, str); xmlXPathReleaseObject(ctxt->context, find); } /** * xmlXPathNormalizeFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the normalize-space() XPath function * string normalize-space(string?) * The normalize-space function returns the argument string with white * space normalized by stripping leading and trailing whitespace * and replacing sequences of whitespace characters by a single * space. Whitespace characters are the same allowed by the S production * in XML. If the argument is omitted, it defaults to the context * node converted to a string, in other words the value of the context node. */ void xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr obj = NULL; xmlChar *source = NULL; xmlBufPtr target; xmlChar blank; if (ctxt == NULL) return; if (nargs == 0) { /* Use current context node */ valuePush(ctxt, xmlXPathCacheWrapString(ctxt->context, xmlXPathCastNodeToString(ctxt->context->node))); nargs = 1; } CHECK_ARITY(1); CAST_TO_STRING; CHECK_TYPE(XPATH_STRING); obj = valuePop(ctxt); source = obj->stringval; target = xmlBufCreate(); if (target && source) { /* Skip leading whitespaces */ while (IS_BLANK_CH(*source)) source++; /* Collapse intermediate whitespaces, and skip trailing whitespaces */ blank = 0; while (*source) { if (IS_BLANK_CH(*source)) { blank = 0x20; } else { if (blank) { xmlBufAdd(target, &blank, 1); blank = 0; } xmlBufAdd(target, source, 1); } source++; } valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, xmlBufContent(target))); xmlBufFree(target); } xmlXPathReleaseObject(ctxt->context, obj); } /** * xmlXPathTranslateFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the translate() XPath function * string translate(string, string, string) * The translate function returns the first argument string with * occurrences of characters in the second argument string replaced * by the character at the corresponding position in the third argument * string. For example, translate("bar","abc","ABC") returns the string * BAr. If there is a character in the second argument string with no * character at a corresponding position in the third argument string * (because the second argument string is longer than the third argument * string), then occurrences of that character in the first argument * string are removed. For example, translate("--aaa--","abc-","ABC") * returns "AAA". If a character occurs more than once in second * argument string, then the first occurrence determines the replacement * character. If the third argument string is longer than the second * argument string, then excess characters are ignored. */ void xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr str; xmlXPathObjectPtr from; xmlXPathObjectPtr to; xmlBufPtr target; int offset, max; xmlChar ch; const xmlChar *point; xmlChar *cptr; CHECK_ARITY(3); CAST_TO_STRING; to = valuePop(ctxt); CAST_TO_STRING; from = valuePop(ctxt); CAST_TO_STRING; str = valuePop(ctxt); target = xmlBufCreate(); if (target) { max = xmlUTF8Strlen(to->stringval); for (cptr = str->stringval; (ch=*cptr); ) { offset = xmlUTF8Strloc(from->stringval, cptr); if (offset >= 0) { if (offset < max) { point = xmlUTF8Strpos(to->stringval, offset); if (point) xmlBufAdd(target, point, xmlUTF8Strsize(point, 1)); } } else xmlBufAdd(target, cptr, xmlUTF8Strsize(cptr, 1)); /* Step to next character in input */ cptr++; if ( ch & 0x80 ) { /* if not simple ascii, verify proper format */ if ( (ch & 0xc0) != 0xc0 ) { xmlGenericError(xmlGenericErrorContext, "xmlXPathTranslateFunction: Invalid UTF8 string\n"); /* not asserting an XPath error is probably better */ break; } /* then skip over remaining bytes for this char */ while ( (ch <<= 1) & 0x80 ) if ( (*cptr++ & 0xc0) != 0x80 ) { xmlGenericError(xmlGenericErrorContext, "xmlXPathTranslateFunction: Invalid UTF8 string\n"); /* not asserting an XPath error is probably better */ break; } if (ch & 0x80) /* must have had error encountered */ break; } } } valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, xmlBufContent(target))); xmlBufFree(target); xmlXPathReleaseObject(ctxt->context, str); xmlXPathReleaseObject(ctxt->context, from); xmlXPathReleaseObject(ctxt->context, to); } /** * xmlXPathBooleanFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the boolean() XPath function * boolean boolean(object) * The boolean function converts its argument to a boolean as follows: * - a number is true if and only if it is neither positive or * negative zero nor NaN * - a node-set is true if and only if it is non-empty * - a string is true if and only if its length is non-zero */ void xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; CHECK_ARITY(1); cur = valuePop(ctxt); if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); cur = xmlXPathCacheConvertBoolean(ctxt->context, cur); valuePush(ctxt, cur); } /** * xmlXPathNotFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the not() XPath function * boolean not(boolean) * The not function returns true if its argument is false, * and false otherwise. */ void xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs) { CHECK_ARITY(1); CAST_TO_BOOLEAN; CHECK_TYPE(XPATH_BOOLEAN); ctxt->value->boolval = ! ctxt->value->boolval; } /** * xmlXPathTrueFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the true() XPath function * boolean true() */ void xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs) { CHECK_ARITY(0); valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); } /** * xmlXPathFalseFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the false() XPath function * boolean false() */ void xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) { CHECK_ARITY(0); valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); } /** * xmlXPathLangFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the lang() XPath function * boolean lang(string) * The lang function returns true or false depending on whether the * language of the context node as specified by xml:lang attributes * is the same as or is a sublanguage of the language specified by * the argument string. The language of the context node is determined * by the value of the xml:lang attribute on the context node, or, if * the context node has no xml:lang attribute, by the value of the * xml:lang attribute on the nearest ancestor of the context node that * has an xml:lang attribute. If there is no such attribute, then lang * returns false. If there is such an attribute, then lang returns * true if the attribute value is equal to the argument ignoring case, * or if there is some suffix starting with - such that the attribute * value is equal to the argument ignoring that suffix of the attribute * value and ignoring case. */ void xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr val = NULL; const xmlChar *theLang = NULL; const xmlChar *lang; int ret = 0; int i; CHECK_ARITY(1); CAST_TO_STRING; CHECK_TYPE(XPATH_STRING); val = valuePop(ctxt); lang = val->stringval; theLang = xmlNodeGetLang(ctxt->context->node); if ((theLang != NULL) && (lang != NULL)) { for (i = 0;lang[i] != 0;i++) if (toupper(lang[i]) != toupper(theLang[i])) goto not_equal; if ((theLang[i] == 0) || (theLang[i] == '-')) ret = 1; } not_equal: if (theLang != NULL) xmlFree((void *)theLang); xmlXPathReleaseObject(ctxt->context, val); valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); } /** * xmlXPathNumberFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the number() XPath function * number number(object?) */ void xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; double res; if (ctxt == NULL) return; if (nargs == 0) { if (ctxt->context->node == NULL) { valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0)); } else { xmlChar* content = xmlNodeGetContent(ctxt->context->node); res = xmlXPathStringEvalNumber(content); valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); xmlFree(content); } return; } CHECK_ARITY(1); cur = valuePop(ctxt); valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context, cur)); } /** * xmlXPathSumFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the sum() XPath function * number sum(node-set) * The sum function returns the sum of the values of the nodes in * the argument node-set. */ void xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr cur; int i; double res = 0.0; CHECK_ARITY(1); if ((ctxt->value == NULL) || ((ctxt->value->type != XPATH_NODESET) && (ctxt->value->type != XPATH_XSLT_TREE))) XP_ERROR(XPATH_INVALID_TYPE); cur = valuePop(ctxt); if ((cur->nodesetval != NULL) && (cur->nodesetval->nodeNr != 0)) { for (i = 0; i < cur->nodesetval->nodeNr; i++) { res += xmlXPathCastNodeToNumber(cur->nodesetval->nodeTab[i]); } } valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); xmlXPathReleaseObject(ctxt->context, cur); } /* * To assure working code on multiple platforms, we want to only depend * upon the characteristic truncation of converting a floating point value * to an integer. Unfortunately, because of the different storage sizes * of our internal floating point value (double) and integer (int), we * can't directly convert (see bug 301162). This macro is a messy * 'workaround' */ #define XTRUNC(f, v) \ f = fmod((v), INT_MAX); \ f = (v) - (f) + (double)((int)(f)); /** * xmlXPathFloorFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the floor() XPath function * number floor(number) * The floor function returns the largest (closest to positive infinity) * number that is not greater than the argument and that is an integer. */ void xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) { double f; CHECK_ARITY(1); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); XTRUNC(f, ctxt->value->floatval); if (f != ctxt->value->floatval) { if (ctxt->value->floatval > 0) ctxt->value->floatval = f; else ctxt->value->floatval = f - 1; } } /** * xmlXPathCeilingFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the ceiling() XPath function * number ceiling(number) * The ceiling function returns the smallest (closest to negative infinity) * number that is not less than the argument and that is an integer. */ void xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) { double f; CHECK_ARITY(1); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); #if 0 ctxt->value->floatval = ceil(ctxt->value->floatval); #else XTRUNC(f, ctxt->value->floatval); if (f != ctxt->value->floatval) { if (ctxt->value->floatval > 0) ctxt->value->floatval = f + 1; else { if (ctxt->value->floatval < 0 && f == 0) ctxt->value->floatval = xmlXPathNZERO; else ctxt->value->floatval = f; } } #endif } /** * xmlXPathRoundFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the round() XPath function * number round(number) * The round function returns the number that is closest to the * argument and that is an integer. If there are two such numbers, * then the one that is even is returned. */ void xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) { double f; CHECK_ARITY(1); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); if ((xmlXPathIsNaN(ctxt->value->floatval)) || (xmlXPathIsInf(ctxt->value->floatval) == 1) || (xmlXPathIsInf(ctxt->value->floatval) == -1) || (ctxt->value->floatval == 0.0)) return; XTRUNC(f, ctxt->value->floatval); if (ctxt->value->floatval < 0) { if (ctxt->value->floatval < f - 0.5) ctxt->value->floatval = f - 1; else ctxt->value->floatval = f; if (ctxt->value->floatval == 0) ctxt->value->floatval = xmlXPathNZERO; } else { if (ctxt->value->floatval < f + 0.5) ctxt->value->floatval = f; else ctxt->value->floatval = f + 1; } } /************************************************************************ * * * The Parser * * * ************************************************************************/ /* * a few forward declarations since we use a recursive call based * implementation. */ static void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort); static void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter); static void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt); static void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt); static xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified); /** * xmlXPathCurrentChar: * @ctxt: the XPath parser context * @cur: pointer to the beginning of the char * @len: pointer to the length of the char read * * The current char value, if using UTF-8 this may actually span multiple * bytes in the input buffer. * * Returns the current char value and its length */ static int xmlXPathCurrentChar(xmlXPathParserContextPtr ctxt, int *len) { unsigned char c; unsigned int val; const xmlChar *cur; if (ctxt == NULL) return(0); cur = ctxt->cur; /* * We are supposed to handle UTF8, check it's valid * From rfc2044: encoding of the Unicode values on UTF-8: * * UCS-4 range (hex.) UTF-8 octet sequence (binary) * 0000 0000-0000 007F 0xxxxxxx * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx * * Check for the 0x110000 limit too */ c = *cur; if (c & 0x80) { if ((cur[1] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xe0) == 0xe0) { if ((cur[2] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xf0) == 0xf0) { if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80)) goto encoding_error; /* 4-byte code */ *len = 4; val = (cur[0] & 0x7) << 18; val |= (cur[1] & 0x3f) << 12; val |= (cur[2] & 0x3f) << 6; val |= cur[3] & 0x3f; } else { /* 3-byte code */ *len = 3; val = (cur[0] & 0xf) << 12; val |= (cur[1] & 0x3f) << 6; val |= cur[2] & 0x3f; } } else { /* 2-byte code */ *len = 2; val = (cur[0] & 0x1f) << 6; val |= cur[1] & 0x3f; } if (!IS_CHAR(val)) { XP_ERROR0(XPATH_INVALID_CHAR_ERROR); } return(val); } else { /* 1-byte code */ *len = 1; return((int) *cur); } encoding_error: /* * If we detect an UTF8 error that probably means that the * input encoding didn't get properly advertised in the * declaration header. Report the error and switch the encoding * to ISO-Latin-1 (if you don't like this policy, just declare the * encoding !) */ *len = 0; XP_ERROR0(XPATH_ENCODING_ERROR); } /** * xmlXPathParseNCName: * @ctxt: the XPath Parser context * * parse an XML namespace non qualified name. * * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* * * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | * CombiningChar | Extender * * Returns the namespace name or NULL */ xmlChar * xmlXPathParseNCName(xmlXPathParserContextPtr ctxt) { const xmlChar *in; xmlChar *ret; int count = 0; if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); /* * Accelerator for simple ASCII names */ in = ctxt->cur; if (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || (*in == '_')) { in++; while (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || ((*in >= 0x30) && (*in <= 0x39)) || (*in == '_') || (*in == '.') || (*in == '-')) in++; if ((*in == ' ') || (*in == '>') || (*in == '/') || (*in == '[') || (*in == ']') || (*in == ':') || (*in == '@') || (*in == '*')) { count = in - ctxt->cur; if (count == 0) return(NULL); ret = xmlStrndup(ctxt->cur, count); ctxt->cur = in; return(ret); } } return(xmlXPathParseNameComplex(ctxt, 0)); } /** * xmlXPathParseQName: * @ctxt: the XPath Parser context * @prefix: a xmlChar ** * * parse an XML qualified name * * [NS 5] QName ::= (Prefix ':')? LocalPart * * [NS 6] Prefix ::= NCName * * [NS 7] LocalPart ::= NCName * * Returns the function returns the local part, and prefix is updated * to get the Prefix if any. */ static xmlChar * xmlXPathParseQName(xmlXPathParserContextPtr ctxt, xmlChar **prefix) { xmlChar *ret = NULL; *prefix = NULL; ret = xmlXPathParseNCName(ctxt); if (ret && CUR == ':') { *prefix = ret; NEXT; ret = xmlXPathParseNCName(ctxt); } return(ret); } /** * xmlXPathParseName: * @ctxt: the XPath Parser context * * parse an XML name * * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | * CombiningChar | Extender * * [5] Name ::= (Letter | '_' | ':') (NameChar)* * * Returns the namespace name or NULL */ xmlChar * xmlXPathParseName(xmlXPathParserContextPtr ctxt) { const xmlChar *in; xmlChar *ret; size_t count = 0; if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); /* * Accelerator for simple ASCII names */ in = ctxt->cur; if (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || (*in == '_') || (*in == ':')) { in++; while (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || ((*in >= 0x30) && (*in <= 0x39)) || (*in == '_') || (*in == '-') || (*in == ':') || (*in == '.')) in++; if ((*in > 0) && (*in < 0x80)) { count = in - ctxt->cur; if (count > XML_MAX_NAME_LENGTH) { ctxt->cur = in; XP_ERRORNULL(XPATH_EXPR_ERROR); } ret = xmlStrndup(ctxt->cur, count); ctxt->cur = in; return(ret); } } return(xmlXPathParseNameComplex(ctxt, 1)); } static xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified) { xmlChar buf[XML_MAX_NAMELEN + 5]; int len = 0, l; int c; /* * Handler for more complex cases */ c = CUR_CHAR(l); if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ (c == '[') || (c == ']') || (c == '@') || /* accelerators */ (c == '*') || /* accelerators */ (!IS_LETTER(c) && (c != '_') && ((qualified) && (c != ':')))) { return(NULL); } while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ ((IS_LETTER(c)) || (IS_DIGIT(c)) || (c == '.') || (c == '-') || (c == '_') || ((qualified) && (c == ':')) || (IS_COMBINING(c)) || (IS_EXTENDER(c)))) { COPY_BUF(l,buf,len,c); NEXTL(l); c = CUR_CHAR(l); if (len >= XML_MAX_NAMELEN) { /* * Okay someone managed to make a huge name, so he's ready to pay * for the processing speed. */ xmlChar *buffer; int max = len * 2; if (len > XML_MAX_NAME_LENGTH) { XP_ERRORNULL(XPATH_EXPR_ERROR); } buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); if (buffer == NULL) { XP_ERRORNULL(XPATH_MEMORY_ERROR); } memcpy(buffer, buf, len); while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigname.xml */ (c == '.') || (c == '-') || (c == '_') || ((qualified) && (c == ':')) || (IS_COMBINING(c)) || (IS_EXTENDER(c))) { if (len + 10 > max) { if (max > XML_MAX_NAME_LENGTH) { XP_ERRORNULL(XPATH_EXPR_ERROR); } max *= 2; buffer = (xmlChar *) xmlRealloc(buffer, max * sizeof(xmlChar)); if (buffer == NULL) { XP_ERRORNULL(XPATH_MEMORY_ERROR); } } COPY_BUF(l,buffer,len,c); NEXTL(l); c = CUR_CHAR(l); } buffer[len] = 0; return(buffer); } } if (len == 0) return(NULL); return(xmlStrndup(buf, len)); } #define MAX_FRAC 20 /* * These are used as divisors for the fractional part of a number. * Since the table includes 1.0 (representing '0' fractional digits), * it must be dimensioned at MAX_FRAC+1 (bug 133921) */ static double my_pow10[MAX_FRAC+1] = { 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0 }; /** * xmlXPathStringEvalNumber: * @str: A string to scan * * [30a] Float ::= Number ('e' Digits?)? * * [30] Number ::= Digits ('.' Digits?)? * | '.' Digits * [31] Digits ::= [0-9]+ * * Compile a Number in the string * In complement of the Number expression, this function also handles * negative values : '-' Number. * * Returns the double value. */ double xmlXPathStringEvalNumber(const xmlChar *str) { const xmlChar *cur = str; double ret; int ok = 0; int isneg = 0; int exponent = 0; int is_exponent_negative = 0; #ifdef __GNUC__ unsigned long tmp = 0; double temp; #endif if (cur == NULL) return(0); while (IS_BLANK_CH(*cur)) cur++; if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) { return(xmlXPathNAN); } if (*cur == '-') { isneg = 1; cur++; } #ifdef __GNUC__ /* * tmp/temp is a workaround against a gcc compiler bug * http://veillard.com/gcc.bug */ ret = 0; while ((*cur >= '0') && (*cur <= '9')) { ret = ret * 10; tmp = (*cur - '0'); ok = 1; cur++; temp = (double) tmp; ret = ret + temp; } #else ret = 0; while ((*cur >= '0') && (*cur <= '9')) { ret = ret * 10 + (*cur - '0'); ok = 1; cur++; } #endif if (*cur == '.') { int v, frac = 0; double fraction = 0; cur++; if (((*cur < '0') || (*cur > '9')) && (!ok)) { return(xmlXPathNAN); } while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) { v = (*cur - '0'); fraction = fraction * 10 + v; frac = frac + 1; cur++; } fraction /= my_pow10[frac]; ret = ret + fraction; while ((*cur >= '0') && (*cur <= '9')) cur++; } if ((*cur == 'e') || (*cur == 'E')) { cur++; if (*cur == '-') { is_exponent_negative = 1; cur++; } else if (*cur == '+') { cur++; } while ((*cur >= '0') && (*cur <= '9')) { exponent = exponent * 10 + (*cur - '0'); cur++; } } while (IS_BLANK_CH(*cur)) cur++; if (*cur != 0) return(xmlXPathNAN); if (isneg) ret = -ret; if (is_exponent_negative) exponent = -exponent; ret *= pow(10.0, (double)exponent); return(ret); } /** * xmlXPathCompNumber: * @ctxt: the XPath Parser context * * [30] Number ::= Digits ('.' Digits?)? * | '.' Digits * [31] Digits ::= [0-9]+ * * Compile a Number, then push it on the stack * */ static void xmlXPathCompNumber(xmlXPathParserContextPtr ctxt) { double ret = 0.0; int ok = 0; int exponent = 0; int is_exponent_negative = 0; #ifdef __GNUC__ unsigned long tmp = 0; double temp; #endif CHECK_ERROR; if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) { XP_ERROR(XPATH_NUMBER_ERROR); } #ifdef __GNUC__ /* * tmp/temp is a workaround against a gcc compiler bug * http://veillard.com/gcc.bug */ ret = 0; while ((CUR >= '0') && (CUR <= '9')) { ret = ret * 10; tmp = (CUR - '0'); ok = 1; NEXT; temp = (double) tmp; ret = ret + temp; } #else ret = 0; while ((CUR >= '0') && (CUR <= '9')) { ret = ret * 10 + (CUR - '0'); ok = 1; NEXT; } #endif if (CUR == '.') { int v, frac = 0; double fraction = 0; NEXT; if (((CUR < '0') || (CUR > '9')) && (!ok)) { XP_ERROR(XPATH_NUMBER_ERROR); } while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) { v = (CUR - '0'); fraction = fraction * 10 + v; frac = frac + 1; NEXT; } fraction /= my_pow10[frac]; ret = ret + fraction; while ((CUR >= '0') && (CUR <= '9')) NEXT; } if ((CUR == 'e') || (CUR == 'E')) { NEXT; if (CUR == '-') { is_exponent_negative = 1; NEXT; } else if (CUR == '+') { NEXT; } while ((CUR >= '0') && (CUR <= '9')) { exponent = exponent * 10 + (CUR - '0'); NEXT; } if (is_exponent_negative) exponent = -exponent; ret *= pow(10.0, (double) exponent); } PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0, xmlXPathCacheNewFloat(ctxt->context, ret), NULL); } /** * xmlXPathParseLiteral: * @ctxt: the XPath Parser context * * Parse a Literal * * [29] Literal ::= '"' [^"]* '"' * | "'" [^']* "'" * * Returns the value found or NULL in case of error */ static xmlChar * xmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) { const xmlChar *q; xmlChar *ret = NULL; if (CUR == '"') { NEXT; q = CUR_PTR; while ((IS_CHAR_CH(CUR)) && (CUR != '"')) NEXT; if (!IS_CHAR_CH(CUR)) { XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else if (CUR == '\'') { NEXT; q = CUR_PTR; while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) NEXT; if (!IS_CHAR_CH(CUR)) { XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else { XP_ERRORNULL(XPATH_START_LITERAL_ERROR); } return(ret); } /** * xmlXPathCompLiteral: * @ctxt: the XPath Parser context * * Parse a Literal and push it on the stack. * * [29] Literal ::= '"' [^"]* '"' * | "'" [^']* "'" * * TODO: xmlXPathCompLiteral memory allocation could be improved. */ static void xmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) { const xmlChar *q; xmlChar *ret = NULL; if (CUR == '"') { NEXT; q = CUR_PTR; while ((IS_CHAR_CH(CUR)) && (CUR != '"')) NEXT; if (!IS_CHAR_CH(CUR)) { XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else if (CUR == '\'') { NEXT; q = CUR_PTR; while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) NEXT; if (!IS_CHAR_CH(CUR)) { XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else { XP_ERROR(XPATH_START_LITERAL_ERROR); } if (ret == NULL) return; PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0, xmlXPathCacheNewString(ctxt->context, ret), NULL); xmlFree(ret); } /** * xmlXPathCompVariableReference: * @ctxt: the XPath Parser context * * Parse a VariableReference, evaluate it and push it on the stack. * * The variable bindings consist of a mapping from variable names * to variable values. The value of a variable is an object, which can be * of any of the types that are possible for the value of an expression, * and may also be of additional types not specified here. * * Early evaluation is possible since: * The variable bindings [...] used to evaluate a subexpression are * always the same as those used to evaluate the containing expression. * * [36] VariableReference ::= '$' QName */ static void xmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) { xmlChar *name; xmlChar *prefix; SKIP_BLANKS; if (CUR != '$') { XP_ERROR(XPATH_VARIABLE_REF_ERROR); } NEXT; name = xmlXPathParseQName(ctxt, &prefix); if (name == NULL) { XP_ERROR(XPATH_VARIABLE_REF_ERROR); } ctxt->comp->last = -1; PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0, name, prefix); SKIP_BLANKS; if ((ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) { XP_ERROR(XPATH_FORBID_VARIABLE_ERROR); } } /** * xmlXPathIsNodeType: * @name: a name string * * Is the name given a NodeType one. * * [38] NodeType ::= 'comment' * | 'text' * | 'processing-instruction' * | 'node' * * Returns 1 if true 0 otherwise */ int xmlXPathIsNodeType(const xmlChar *name) { if (name == NULL) return(0); if (xmlStrEqual(name, BAD_CAST "node")) return(1); if (xmlStrEqual(name, BAD_CAST "text")) return(1); if (xmlStrEqual(name, BAD_CAST "comment")) return(1); if (xmlStrEqual(name, BAD_CAST "processing-instruction")) return(1); return(0); } /** * xmlXPathCompFunctionCall: * @ctxt: the XPath Parser context * * [16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument)*)? ')' * [17] Argument ::= Expr * * Compile a function call, the evaluation of all arguments are * pushed on the stack */ static void xmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) { xmlChar *name; xmlChar *prefix; int nbargs = 0; int sort = 1; name = xmlXPathParseQName(ctxt, &prefix); if (name == NULL) { xmlFree(prefix); XP_ERROR(XPATH_EXPR_ERROR); } SKIP_BLANKS; #ifdef DEBUG_EXPR if (prefix == NULL) xmlGenericError(xmlGenericErrorContext, "Calling function %s\n", name); else xmlGenericError(xmlGenericErrorContext, "Calling function %s:%s\n", prefix, name); #endif if (CUR != '(') { XP_ERROR(XPATH_EXPR_ERROR); } NEXT; SKIP_BLANKS; /* * Optimization for count(): we don't need the node-set to be sorted. */ if ((prefix == NULL) && (name[0] == 'c') && xmlStrEqual(name, BAD_CAST "count")) { sort = 0; } ctxt->comp->last = -1; if (CUR != ')') { while (CUR != 0) { int op1 = ctxt->comp->last; ctxt->comp->last = -1; xmlXPathCompileExpr(ctxt, sort); if (ctxt->error != XPATH_EXPRESSION_OK) { xmlFree(name); xmlFree(prefix); return; } PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0); nbargs++; if (CUR == ')') break; if (CUR != ',') { XP_ERROR(XPATH_EXPR_ERROR); } NEXT; SKIP_BLANKS; } } PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0, name, prefix); NEXT; SKIP_BLANKS; } /** * xmlXPathCompPrimaryExpr: * @ctxt: the XPath Parser context * * [15] PrimaryExpr ::= VariableReference * | '(' Expr ')' * | Literal * | Number * | FunctionCall * * Compile a primary expression. */ static void xmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) { SKIP_BLANKS; if (CUR == '$') xmlXPathCompVariableReference(ctxt); else if (CUR == '(') { NEXT; SKIP_BLANKS; xmlXPathCompileExpr(ctxt, 1); CHECK_ERROR; if (CUR != ')') { XP_ERROR(XPATH_EXPR_ERROR); } NEXT; SKIP_BLANKS; } else if (IS_ASCII_DIGIT(CUR) || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { xmlXPathCompNumber(ctxt); } else if ((CUR == '\'') || (CUR == '"')) { xmlXPathCompLiteral(ctxt); } else { xmlXPathCompFunctionCall(ctxt); } SKIP_BLANKS; } /** * xmlXPathCompFilterExpr: * @ctxt: the XPath Parser context * * [20] FilterExpr ::= PrimaryExpr * | FilterExpr Predicate * * Compile a filter expression. * Square brackets are used to filter expressions in the same way that * they are used in location paths. It is an error if the expression to * be filtered does not evaluate to a node-set. The context node list * used for evaluating the expression in square brackets is the node-set * to be filtered listed in document order. */ static void xmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) { xmlXPathCompPrimaryExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while (CUR == '[') { xmlXPathCompPredicate(ctxt, 1); SKIP_BLANKS; } } /** * xmlXPathScanName: * @ctxt: the XPath Parser context * * Trickery: parse an XML name but without consuming the input flow * Needed to avoid insanity in the parser state. * * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | * CombiningChar | Extender * * [5] Name ::= (Letter | '_' | ':') (NameChar)* * * [6] Names ::= Name (S Name)* * * Returns the Name parsed or NULL */ static xmlChar * xmlXPathScanName(xmlXPathParserContextPtr ctxt) { int len = 0, l; int c; const xmlChar *cur; xmlChar *ret; cur = ctxt->cur; c = CUR_CHAR(l); if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ (!IS_LETTER(c) && (c != '_') && (c != ':'))) { return(NULL); } while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ ((IS_LETTER(c)) || (IS_DIGIT(c)) || (c == '.') || (c == '-') || (c == '_') || (c == ':') || (IS_COMBINING(c)) || (IS_EXTENDER(c)))) { len += l; NEXTL(l); c = CUR_CHAR(l); } ret = xmlStrndup(cur, ctxt->cur - cur); ctxt->cur = cur; return(ret); } /** * xmlXPathCompPathExpr: * @ctxt: the XPath Parser context * * [19] PathExpr ::= LocationPath * | FilterExpr * | FilterExpr '/' RelativeLocationPath * | FilterExpr '//' RelativeLocationPath * * Compile a path expression. * The / operator and // operators combine an arbitrary expression * and a relative location path. It is an error if the expression * does not evaluate to a node-set. * The / operator does composition in the same way as when / is * used in a location path. As in location paths, // is short for * /descendant-or-self::node()/. */ static void xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) { int lc = 1; /* Should we branch to LocationPath ? */ xmlChar *name = NULL; /* we may have to preparse a name to find out */ SKIP_BLANKS; if ((CUR == '$') || (CUR == '(') || (IS_ASCII_DIGIT(CUR)) || (CUR == '\'') || (CUR == '"') || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { lc = 0; } else if (CUR == '*') { /* relative or absolute location path */ lc = 1; } else if (CUR == '/') { /* relative or absolute location path */ lc = 1; } else if (CUR == '@') { /* relative abbreviated attribute location path */ lc = 1; } else if (CUR == '.') { /* relative abbreviated attribute location path */ lc = 1; } else { /* * Problem is finding if we have a name here whether it's: * - a nodetype * - a function call in which case it's followed by '(' * - an axis in which case it's followed by ':' * - a element name * We do an a priori analysis here rather than having to * maintain parsed token content through the recursive function * calls. This looks uglier but makes the code easier to * read/write/debug. */ SKIP_BLANKS; name = xmlXPathScanName(ctxt); if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) { #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "PathExpr: Axis\n"); #endif lc = 1; xmlFree(name); } else if (name != NULL) { int len =xmlStrlen(name); while (NXT(len) != 0) { if (NXT(len) == '/') { /* element name */ #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "PathExpr: AbbrRelLocation\n"); #endif lc = 1; break; } else if (IS_BLANK_CH(NXT(len))) { /* ignore blanks */ ; } else if (NXT(len) == ':') { #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "PathExpr: AbbrRelLocation\n"); #endif lc = 1; break; } else if ((NXT(len) == '(')) { /* Note Type or Function */ if (xmlXPathIsNodeType(name)) { #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "PathExpr: Type search\n"); #endif lc = 1; } else { #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "PathExpr: function call\n"); #endif lc = 0; } break; } else if ((NXT(len) == '[')) { /* element name */ #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "PathExpr: AbbrRelLocation\n"); #endif lc = 1; break; } else if ((NXT(len) == '<') || (NXT(len) == '>') || (NXT(len) == '=')) { lc = 1; break; } else { lc = 1; break; } len++; } if (NXT(len) == 0) { #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "PathExpr: AbbrRelLocation\n"); #endif /* element name */ lc = 1; } xmlFree(name); } else { /* make sure all cases are covered explicitly */ XP_ERROR(XPATH_EXPR_ERROR); } } if (lc) { if (CUR == '/') { PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0); } else { PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); } xmlXPathCompLocationPath(ctxt); } else { xmlXPathCompFilterExpr(ctxt); CHECK_ERROR; if ((CUR == '/') && (NXT(1) == '/')) { SKIP(2); SKIP_BLANKS; PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); PUSH_UNARY_EXPR(XPATH_OP_RESET, ctxt->comp->last, 1, 0); xmlXPathCompRelativeLocationPath(ctxt); } else if (CUR == '/') { xmlXPathCompRelativeLocationPath(ctxt); } } SKIP_BLANKS; } /** * xmlXPathCompUnionExpr: * @ctxt: the XPath Parser context * * [18] UnionExpr ::= PathExpr * | UnionExpr '|' PathExpr * * Compile an union expression. */ static void xmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) { xmlXPathCompPathExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while (CUR == '|') { int op1 = ctxt->comp->last; PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); NEXT; SKIP_BLANKS; xmlXPathCompPathExpr(ctxt); PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0); SKIP_BLANKS; } } /** * xmlXPathCompUnaryExpr: * @ctxt: the XPath Parser context * * [27] UnaryExpr ::= UnionExpr * | '-' UnaryExpr * * Compile an unary expression. */ static void xmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) { int minus = 0; int found = 0; SKIP_BLANKS; while (CUR == '-') { minus = 1 - minus; found = 1; NEXT; SKIP_BLANKS; } xmlXPathCompUnionExpr(ctxt); CHECK_ERROR; if (found) { if (minus) PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0); else PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0); } } /** * xmlXPathCompMultiplicativeExpr: * @ctxt: the XPath Parser context * * [26] MultiplicativeExpr ::= UnaryExpr * | MultiplicativeExpr MultiplyOperator UnaryExpr * | MultiplicativeExpr 'div' UnaryExpr * | MultiplicativeExpr 'mod' UnaryExpr * [34] MultiplyOperator ::= '*' * * Compile an Additive expression. */ static void xmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) { xmlXPathCompUnaryExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while ((CUR == '*') || ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) || ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) { int op = -1; int op1 = ctxt->comp->last; if (CUR == '*') { op = 0; NEXT; } else if (CUR == 'd') { op = 1; SKIP(3); } else if (CUR == 'm') { op = 2; SKIP(3); } SKIP_BLANKS; xmlXPathCompUnaryExpr(ctxt); CHECK_ERROR; PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last, op, 0); SKIP_BLANKS; } } /** * xmlXPathCompAdditiveExpr: * @ctxt: the XPath Parser context * * [25] AdditiveExpr ::= MultiplicativeExpr * | AdditiveExpr '+' MultiplicativeExpr * | AdditiveExpr '-' MultiplicativeExpr * * Compile an Additive expression. */ static void xmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) { xmlXPathCompMultiplicativeExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while ((CUR == '+') || (CUR == '-')) { int plus; int op1 = ctxt->comp->last; if (CUR == '+') plus = 1; else plus = 0; NEXT; SKIP_BLANKS; xmlXPathCompMultiplicativeExpr(ctxt); CHECK_ERROR; PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last, plus, 0); SKIP_BLANKS; } } /** * xmlXPathCompRelationalExpr: * @ctxt: the XPath Parser context * * [24] RelationalExpr ::= AdditiveExpr * | RelationalExpr '<' AdditiveExpr * | RelationalExpr '>' AdditiveExpr * | RelationalExpr '<=' AdditiveExpr * | RelationalExpr '>=' AdditiveExpr * * A <= B > C is allowed ? Answer from James, yes with * (AdditiveExpr <= AdditiveExpr) > AdditiveExpr * which is basically what got implemented. * * Compile a Relational expression, then push the result * on the stack */ static void xmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) { xmlXPathCompAdditiveExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while ((CUR == '<') || (CUR == '>') || ((CUR == '<') && (NXT(1) == '=')) || ((CUR == '>') && (NXT(1) == '='))) { int inf, strict; int op1 = ctxt->comp->last; if (CUR == '<') inf = 1; else inf = 0; if (NXT(1) == '=') strict = 0; else strict = 1; NEXT; if (!strict) NEXT; SKIP_BLANKS; xmlXPathCompAdditiveExpr(ctxt); CHECK_ERROR; PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf, strict); SKIP_BLANKS; } } /** * xmlXPathCompEqualityExpr: * @ctxt: the XPath Parser context * * [23] EqualityExpr ::= RelationalExpr * | EqualityExpr '=' RelationalExpr * | EqualityExpr '!=' RelationalExpr * * A != B != C is allowed ? Answer from James, yes with * (RelationalExpr = RelationalExpr) = RelationalExpr * (RelationalExpr != RelationalExpr) != RelationalExpr * which is basically what got implemented. * * Compile an Equality expression. * */ static void xmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) { xmlXPathCompRelationalExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) { int eq; int op1 = ctxt->comp->last; if (CUR == '=') eq = 1; else eq = 0; NEXT; if (!eq) NEXT; SKIP_BLANKS; xmlXPathCompRelationalExpr(ctxt); CHECK_ERROR; PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last, eq, 0); SKIP_BLANKS; } } /** * xmlXPathCompAndExpr: * @ctxt: the XPath Parser context * * [22] AndExpr ::= EqualityExpr * | AndExpr 'and' EqualityExpr * * Compile an AND expression. * */ static void xmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) { xmlXPathCompEqualityExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'd')) { int op1 = ctxt->comp->last; SKIP(3); SKIP_BLANKS; xmlXPathCompEqualityExpr(ctxt); CHECK_ERROR; PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0); SKIP_BLANKS; } } /** * xmlXPathCompileExpr: * @ctxt: the XPath Parser context * * [14] Expr ::= OrExpr * [21] OrExpr ::= AndExpr * | OrExpr 'or' AndExpr * * Parse and compile an expression */ static void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort) { xmlXPathCompAndExpr(ctxt); CHECK_ERROR; SKIP_BLANKS; while ((CUR == 'o') && (NXT(1) == 'r')) { int op1 = ctxt->comp->last; SKIP(2); SKIP_BLANKS; xmlXPathCompAndExpr(ctxt); CHECK_ERROR; PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0); SKIP_BLANKS; } if ((sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) { /* more ops could be optimized too */ /* * This is the main place to eliminate sorting for * operations which don't require a sorted node-set. * E.g. count(). */ PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0); } } /** * xmlXPathCompPredicate: * @ctxt: the XPath Parser context * @filter: act as a filter * * [8] Predicate ::= '[' PredicateExpr ']' * [9] PredicateExpr ::= Expr * * Compile a predicate expression */ static void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter) { int op1 = ctxt->comp->last; SKIP_BLANKS; if (CUR != '[') { XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); } NEXT; SKIP_BLANKS; ctxt->comp->last = -1; /* * This call to xmlXPathCompileExpr() will deactivate sorting * of the predicate result. * TODO: Sorting is still activated for filters, since I'm not * sure if needed. Normally sorting should not be needed, since * a filter can only diminish the number of items in a sequence, * but won't change its order; so if the initial sequence is sorted, * subsequent sorting is not needed. */ if (! filter) xmlXPathCompileExpr(ctxt, 0); else xmlXPathCompileExpr(ctxt, 1); CHECK_ERROR; if (CUR != ']') { XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); } if (filter) PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0); else PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0); NEXT; SKIP_BLANKS; } /** * xmlXPathCompNodeTest: * @ctxt: the XPath Parser context * @test: pointer to a xmlXPathTestVal * @type: pointer to a xmlXPathTypeVal * @prefix: placeholder for a possible name prefix * * [7] NodeTest ::= NameTest * | NodeType '(' ')' * | 'processing-instruction' '(' Literal ')' * * [37] NameTest ::= '*' * | NCName ':' '*' * | QName * [38] NodeType ::= 'comment' * | 'text' * | 'processing-instruction' * | 'node' * * Returns the name found and updates @test, @type and @prefix appropriately */ static xmlChar * xmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test, xmlXPathTypeVal *type, const xmlChar **prefix, xmlChar *name) { int blanks; if ((test == NULL) || (type == NULL) || (prefix == NULL)) { STRANGE; return(NULL); } *type = (xmlXPathTypeVal) 0; *test = (xmlXPathTestVal) 0; *prefix = NULL; SKIP_BLANKS; if ((name == NULL) && (CUR == '*')) { /* * All elements */ NEXT; *test = NODE_TEST_ALL; return(NULL); } if (name == NULL) name = xmlXPathParseNCName(ctxt); if (name == NULL) { XP_ERRORNULL(XPATH_EXPR_ERROR); } blanks = IS_BLANK_CH(CUR); SKIP_BLANKS; if (CUR == '(') { NEXT; /* * NodeType or PI search */ if (xmlStrEqual(name, BAD_CAST "comment")) *type = NODE_TYPE_COMMENT; else if (xmlStrEqual(name, BAD_CAST "node")) *type = NODE_TYPE_NODE; else if (xmlStrEqual(name, BAD_CAST "processing-instruction")) *type = NODE_TYPE_PI; else if (xmlStrEqual(name, BAD_CAST "text")) *type = NODE_TYPE_TEXT; else { if (name != NULL) xmlFree(name); XP_ERRORNULL(XPATH_EXPR_ERROR); } *test = NODE_TEST_TYPE; SKIP_BLANKS; if (*type == NODE_TYPE_PI) { /* * Specific case: search a PI by name. */ if (name != NULL) xmlFree(name); name = NULL; if (CUR != ')') { name = xmlXPathParseLiteral(ctxt); CHECK_ERROR NULL; *test = NODE_TEST_PI; SKIP_BLANKS; } } if (CUR != ')') { if (name != NULL) xmlFree(name); XP_ERRORNULL(XPATH_UNCLOSED_ERROR); } NEXT; return(name); } *test = NODE_TEST_NAME; if ((!blanks) && (CUR == ':')) { NEXT; /* * Since currently the parser context don't have a * namespace list associated: * The namespace name for this prefix can be computed * only at evaluation time. The compilation is done * outside of any context. */ #if 0 *prefix = xmlXPathNsLookup(ctxt->context, name); if (name != NULL) xmlFree(name); if (*prefix == NULL) { XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); } #else *prefix = name; #endif if (CUR == '*') { /* * All elements */ NEXT; *test = NODE_TEST_ALL; return(NULL); } name = xmlXPathParseNCName(ctxt); if (name == NULL) { XP_ERRORNULL(XPATH_EXPR_ERROR); } } return(name); } /** * xmlXPathIsAxisName: * @name: a preparsed name token * * [6] AxisName ::= 'ancestor' * | 'ancestor-or-self' * | 'attribute' * | 'child' * | 'descendant' * | 'descendant-or-self' * | 'following' * | 'following-sibling' * | 'namespace' * | 'parent' * | 'preceding' * | 'preceding-sibling' * | 'self' * * Returns the axis or 0 */ static xmlXPathAxisVal xmlXPathIsAxisName(const xmlChar *name) { xmlXPathAxisVal ret = (xmlXPathAxisVal) 0; switch (name[0]) { case 'a': if (xmlStrEqual(name, BAD_CAST "ancestor")) ret = AXIS_ANCESTOR; if (xmlStrEqual(name, BAD_CAST "ancestor-or-self")) ret = AXIS_ANCESTOR_OR_SELF; if (xmlStrEqual(name, BAD_CAST "attribute")) ret = AXIS_ATTRIBUTE; break; case 'c': if (xmlStrEqual(name, BAD_CAST "child")) ret = AXIS_CHILD; break; case 'd': if (xmlStrEqual(name, BAD_CAST "descendant")) ret = AXIS_DESCENDANT; if (xmlStrEqual(name, BAD_CAST "descendant-or-self")) ret = AXIS_DESCENDANT_OR_SELF; break; case 'f': if (xmlStrEqual(name, BAD_CAST "following")) ret = AXIS_FOLLOWING; if (xmlStrEqual(name, BAD_CAST "following-sibling")) ret = AXIS_FOLLOWING_SIBLING; break; case 'n': if (xmlStrEqual(name, BAD_CAST "namespace")) ret = AXIS_NAMESPACE; break; case 'p': if (xmlStrEqual(name, BAD_CAST "parent")) ret = AXIS_PARENT; if (xmlStrEqual(name, BAD_CAST "preceding")) ret = AXIS_PRECEDING; if (xmlStrEqual(name, BAD_CAST "preceding-sibling")) ret = AXIS_PRECEDING_SIBLING; break; case 's': if (xmlStrEqual(name, BAD_CAST "self")) ret = AXIS_SELF; break; } return(ret); } /** * xmlXPathCompStep: * @ctxt: the XPath Parser context * * [4] Step ::= AxisSpecifier NodeTest Predicate* * | AbbreviatedStep * * [12] AbbreviatedStep ::= '.' | '..' * * [5] AxisSpecifier ::= AxisName '::' * | AbbreviatedAxisSpecifier * * [13] AbbreviatedAxisSpecifier ::= '@'? * * Modified for XPtr range support as: * * [4xptr] Step ::= AxisSpecifier NodeTest Predicate* * | AbbreviatedStep * | 'range-to' '(' Expr ')' Predicate* * * Compile one step in a Location Path * A location step of . is short for self::node(). This is * particularly useful in conjunction with //. For example, the * location path .//para is short for * self::node()/descendant-or-self::node()/child::para * and so will select all para descendant elements of the context * node. * Similarly, a location step of .. is short for parent::node(). * For example, ../title is short for parent::node()/child::title * and so will select the title children of the parent of the context * node. */ static void xmlXPathCompStep(xmlXPathParserContextPtr ctxt) { #ifdef LIBXML_XPTR_ENABLED int rangeto = 0; int op2 = -1; #endif SKIP_BLANKS; if ((CUR == '.') && (NXT(1) == '.')) { SKIP(2); SKIP_BLANKS; PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT, NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); } else if (CUR == '.') { NEXT; SKIP_BLANKS; } else { xmlChar *name = NULL; const xmlChar *prefix = NULL; xmlXPathTestVal test = (xmlXPathTestVal) 0; xmlXPathAxisVal axis = (xmlXPathAxisVal) 0; xmlXPathTypeVal type = (xmlXPathTypeVal) 0; int op1; /* * The modification needed for XPointer change to the production */ #ifdef LIBXML_XPTR_ENABLED if (ctxt->xptr) { name = xmlXPathParseNCName(ctxt); if ((name != NULL) && (xmlStrEqual(name, BAD_CAST "range-to"))) { op2 = ctxt->comp->last; xmlFree(name); SKIP_BLANKS; if (CUR != '(') { XP_ERROR(XPATH_EXPR_ERROR); } NEXT; SKIP_BLANKS; xmlXPathCompileExpr(ctxt, 1); /* PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, ctxt->comp->last, 0, 0); */ CHECK_ERROR; SKIP_BLANKS; if (CUR != ')') { XP_ERROR(XPATH_EXPR_ERROR); } NEXT; rangeto = 1; goto eval_predicates; } } #endif if (CUR == '*') { axis = AXIS_CHILD; } else { if (name == NULL) name = xmlXPathParseNCName(ctxt); if (name != NULL) { axis = xmlXPathIsAxisName(name); if (axis != 0) { SKIP_BLANKS; if ((CUR == ':') && (NXT(1) == ':')) { SKIP(2); xmlFree(name); name = NULL; } else { /* an element name can conflict with an axis one :-\ */ axis = AXIS_CHILD; } } else { axis = AXIS_CHILD; } } else if (CUR == '@') { NEXT; axis = AXIS_ATTRIBUTE; } else { axis = AXIS_CHILD; } } if (ctxt->error != XPATH_EXPRESSION_OK) { xmlFree(name); return; } name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name); if (test == 0) return; if ((prefix != NULL) && (ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_CHECKNS)) { if (xmlXPathNsLookup(ctxt->context, prefix) == NULL) { xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR); } } #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "Basis : computing new set\n"); #endif #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "Basis : "); if (ctxt->value == NULL) xmlGenericError(xmlGenericErrorContext, "no value\n"); else if (ctxt->value->nodesetval == NULL) xmlGenericError(xmlGenericErrorContext, "Empty\n"); else xmlGenericErrorContextNodeSet(stdout, ctxt->value->nodesetval); #endif #ifdef LIBXML_XPTR_ENABLED eval_predicates: #endif op1 = ctxt->comp->last; ctxt->comp->last = -1; SKIP_BLANKS; while (CUR == '[') { xmlXPathCompPredicate(ctxt, 0); } #ifdef LIBXML_XPTR_ENABLED if (rangeto) { PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0); } else #endif PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis, test, type, (void *)prefix, (void *)name); } #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "Step : "); if (ctxt->value == NULL) xmlGenericError(xmlGenericErrorContext, "no value\n"); else if (ctxt->value->nodesetval == NULL) xmlGenericError(xmlGenericErrorContext, "Empty\n"); else xmlGenericErrorContextNodeSet(xmlGenericErrorContext, ctxt->value->nodesetval); #endif } /** * xmlXPathCompRelativeLocationPath: * @ctxt: the XPath Parser context * * [3] RelativeLocationPath ::= Step * | RelativeLocationPath '/' Step * | AbbreviatedRelativeLocationPath * [11] AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step * * Compile a relative location path. */ static void xmlXPathCompRelativeLocationPath (xmlXPathParserContextPtr ctxt) { SKIP_BLANKS; if ((CUR == '/') && (NXT(1) == '/')) { SKIP(2); SKIP_BLANKS; PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); } else if (CUR == '/') { NEXT; SKIP_BLANKS; } xmlXPathCompStep(ctxt); CHECK_ERROR; SKIP_BLANKS; while (CUR == '/') { if ((CUR == '/') && (NXT(1) == '/')) { SKIP(2); SKIP_BLANKS; PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); xmlXPathCompStep(ctxt); } else if (CUR == '/') { NEXT; SKIP_BLANKS; xmlXPathCompStep(ctxt); } SKIP_BLANKS; } } /** * xmlXPathCompLocationPath: * @ctxt: the XPath Parser context * * [1] LocationPath ::= RelativeLocationPath * | AbsoluteLocationPath * [2] AbsoluteLocationPath ::= '/' RelativeLocationPath? * | AbbreviatedAbsoluteLocationPath * [10] AbbreviatedAbsoluteLocationPath ::= * '//' RelativeLocationPath * * Compile a location path * * // is short for /descendant-or-self::node()/. For example, * //para is short for /descendant-or-self::node()/child::para and * so will select any para element in the document (even a para element * that is a document element will be selected by //para since the * document element node is a child of the root node); div//para is * short for div/descendant-or-self::node()/child::para and so will * select all para descendants of div children. */ static void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) { SKIP_BLANKS; if (CUR != '/') { xmlXPathCompRelativeLocationPath(ctxt); } else { while (CUR == '/') { if ((CUR == '/') && (NXT(1) == '/')) { SKIP(2); SKIP_BLANKS; PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); xmlXPathCompRelativeLocationPath(ctxt); } else if (CUR == '/') { NEXT; SKIP_BLANKS; if ((CUR != 0 ) && ((IS_ASCII_LETTER(CUR)) || (CUR == '_') || (CUR == '.') || (CUR == '@') || (CUR == '*'))) xmlXPathCompRelativeLocationPath(ctxt); } CHECK_ERROR; } } } /************************************************************************ * * * XPath precompiled expression evaluation * * * ************************************************************************/ static int xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op); #ifdef DEBUG_STEP static void xmlXPathDebugDumpStepAxis(xmlXPathStepOpPtr op, int nbNodes) { xmlGenericError(xmlGenericErrorContext, "new step : "); switch (op->value) { case AXIS_ANCESTOR: xmlGenericError(xmlGenericErrorContext, "axis 'ancestors' "); break; case AXIS_ANCESTOR_OR_SELF: xmlGenericError(xmlGenericErrorContext, "axis 'ancestors-or-self' "); break; case AXIS_ATTRIBUTE: xmlGenericError(xmlGenericErrorContext, "axis 'attributes' "); break; case AXIS_CHILD: xmlGenericError(xmlGenericErrorContext, "axis 'child' "); break; case AXIS_DESCENDANT: xmlGenericError(xmlGenericErrorContext, "axis 'descendant' "); break; case AXIS_DESCENDANT_OR_SELF: xmlGenericError(xmlGenericErrorContext, "axis 'descendant-or-self' "); break; case AXIS_FOLLOWING: xmlGenericError(xmlGenericErrorContext, "axis 'following' "); break; case AXIS_FOLLOWING_SIBLING: xmlGenericError(xmlGenericErrorContext, "axis 'following-siblings' "); break; case AXIS_NAMESPACE: xmlGenericError(xmlGenericErrorContext, "axis 'namespace' "); break; case AXIS_PARENT: xmlGenericError(xmlGenericErrorContext, "axis 'parent' "); break; case AXIS_PRECEDING: xmlGenericError(xmlGenericErrorContext, "axis 'preceding' "); break; case AXIS_PRECEDING_SIBLING: xmlGenericError(xmlGenericErrorContext, "axis 'preceding-sibling' "); break; case AXIS_SELF: xmlGenericError(xmlGenericErrorContext, "axis 'self' "); break; } xmlGenericError(xmlGenericErrorContext, " context contains %d nodes\n", nbNodes); switch (op->value2) { case NODE_TEST_NONE: xmlGenericError(xmlGenericErrorContext, " searching for none !!!\n"); break; case NODE_TEST_TYPE: xmlGenericError(xmlGenericErrorContext, " searching for type %d\n", op->value3); break; case NODE_TEST_PI: xmlGenericError(xmlGenericErrorContext, " searching for PI !!!\n"); break; case NODE_TEST_ALL: xmlGenericError(xmlGenericErrorContext, " searching for *\n"); break; case NODE_TEST_NS: xmlGenericError(xmlGenericErrorContext, " searching for namespace %s\n", op->value5); break; case NODE_TEST_NAME: xmlGenericError(xmlGenericErrorContext, " searching for name %s\n", op->value5); if (op->value4) xmlGenericError(xmlGenericErrorContext, " with namespace %s\n", op->value4); break; } xmlGenericError(xmlGenericErrorContext, "Testing : "); } #endif /* DEBUG_STEP */ static int xmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodeSetPtr set, int contextSize, int hasNsNodes) { if (op->ch1 != -1) { xmlXPathCompExprPtr comp = ctxt->comp; /* * Process inner predicates first. */ if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { /* * TODO: raise an internal error. */ } contextSize = xmlXPathCompOpEvalPredicate(ctxt, &comp->steps[op->ch1], set, contextSize, hasNsNodes); CHECK_ERROR0; if (contextSize <= 0) return(0); } if (op->ch2 != -1) { xmlXPathContextPtr xpctxt = ctxt->context; xmlNodePtr contextNode, oldContextNode; xmlDocPtr oldContextDoc; int i, res, contextPos = 0, newContextSize; xmlXPathStepOpPtr exprOp; xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; #ifdef LIBXML_XPTR_ENABLED /* * URGENT TODO: Check the following: * We don't expect location sets if evaluating prediates, right? * Only filters should expect location sets, right? */ #endif /* * SPEC XPath 1.0: * "For each node in the node-set to be filtered, the * PredicateExpr is evaluated with that node as the * context node, with the number of nodes in the * node-set as the context size, and with the proximity * position of the node in the node-set with respect to * the axis as the context position;" * @oldset is the node-set" to be filtered. * * SPEC XPath 1.0: * "only predicates change the context position and * context size (see [2.4 Predicates])." * Example: * node-set context pos * nA 1 * nB 2 * nC 3 * After applying predicate [position() > 1] : * node-set context pos * nB 1 * nC 2 */ oldContextNode = xpctxt->node; oldContextDoc = xpctxt->doc; /* * Get the expression of this predicate. */ exprOp = &ctxt->comp->steps[op->ch2]; newContextSize = 0; for (i = 0; i < set->nodeNr; i++) { if (set->nodeTab[i] == NULL) continue; contextNode = set->nodeTab[i]; xpctxt->node = contextNode; xpctxt->contextSize = contextSize; xpctxt->proximityPosition = ++contextPos; /* * Also set the xpath document in case things like * key() are evaluated in the predicate. */ if ((contextNode->type != XML_NAMESPACE_DECL) && (contextNode->doc != NULL)) xpctxt->doc = contextNode->doc; /* * Evaluate the predicate expression with 1 context node * at a time; this node is packaged into a node set; this * node set is handed over to the evaluation mechanism. */ if (contextObj == NULL) contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); else { if (xmlXPathNodeSetAddUnique(contextObj->nodesetval, contextNode) < 0) { ctxt->error = XPATH_MEMORY_ERROR; goto evaluation_exit; } } valuePush(ctxt, contextObj); res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { xmlXPathNodeSetClear(set, hasNsNodes); newContextSize = 0; goto evaluation_exit; } if (res != 0) { newContextSize++; } else { /* * Remove the entry from the initial node set. */ set->nodeTab[i] = NULL; if (contextNode->type == XML_NAMESPACE_DECL) xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); } if (ctxt->value == contextObj) { /* * Don't free the temporary XPath object holding the * context node, in order to avoid massive recreation * inside this loop. */ valuePop(ctxt); xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); } else { /* * TODO: The object was lost in the evaluation machinery. * Can this happen? Maybe in internal-error cases. */ contextObj = NULL; } } if (contextObj != NULL) { if (ctxt->value == contextObj) valuePop(ctxt); xmlXPathReleaseObject(xpctxt, contextObj); } evaluation_exit: if (exprRes != NULL) xmlXPathReleaseObject(ctxt->context, exprRes); /* * Reset/invalidate the context. */ xpctxt->node = oldContextNode; xpctxt->doc = oldContextDoc; xpctxt->contextSize = -1; xpctxt->proximityPosition = -1; return(newContextSize); } return(contextSize); } static int xmlXPathCompOpEvalPositionalPredicate(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodeSetPtr set, int contextSize, int minPos, int maxPos, int hasNsNodes) { if (op->ch1 != -1) { xmlXPathCompExprPtr comp = ctxt->comp; if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { /* * TODO: raise an internal error. */ } contextSize = xmlXPathCompOpEvalPredicate(ctxt, &comp->steps[op->ch1], set, contextSize, hasNsNodes); CHECK_ERROR0; if (contextSize <= 0) return(0); } /* * Check if the node set contains a sufficient number of nodes for * the requested range. */ if (contextSize < minPos) { xmlXPathNodeSetClear(set, hasNsNodes); return(0); } if (op->ch2 == -1) { /* * TODO: Can this ever happen? */ return (contextSize); } else { xmlDocPtr oldContextDoc; int i, pos = 0, newContextSize = 0, contextPos = 0, res; xmlXPathStepOpPtr exprOp; xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; xmlNodePtr oldContextNode, contextNode = NULL; xmlXPathContextPtr xpctxt = ctxt->context; int frame; #ifdef LIBXML_XPTR_ENABLED /* * URGENT TODO: Check the following: * We don't expect location sets if evaluating prediates, right? * Only filters should expect location sets, right? */ #endif /* LIBXML_XPTR_ENABLED */ /* * Save old context. */ oldContextNode = xpctxt->node; oldContextDoc = xpctxt->doc; /* * Get the expression of this predicate. */ exprOp = &ctxt->comp->steps[op->ch2]; for (i = 0; i < set->nodeNr; i++) { xmlXPathObjectPtr tmp; if (set->nodeTab[i] == NULL) continue; contextNode = set->nodeTab[i]; xpctxt->node = contextNode; xpctxt->contextSize = contextSize; xpctxt->proximityPosition = ++contextPos; /* * Initialize the new set. * Also set the xpath document in case things like * key() evaluation are attempted on the predicate */ if ((contextNode->type != XML_NAMESPACE_DECL) && (contextNode->doc != NULL)) xpctxt->doc = contextNode->doc; /* * Evaluate the predicate expression with 1 context node * at a time; this node is packaged into a node set; this * node set is handed over to the evaluation mechanism. */ if (contextObj == NULL) contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); else { if (xmlXPathNodeSetAddUnique(contextObj->nodesetval, contextNode) < 0) { ctxt->error = XPATH_MEMORY_ERROR; goto evaluation_exit; } } frame = xmlXPathSetFrame(ctxt); valuePush(ctxt, contextObj); res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); tmp = valuePop(ctxt); xmlXPathPopFrame(ctxt, frame); if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { while (tmp != contextObj) { /* * Free up the result * then pop off contextObj, which will be freed later */ xmlXPathReleaseObject(xpctxt, tmp); tmp = valuePop(ctxt); } goto evaluation_error; } /* push the result back onto the stack */ valuePush(ctxt, tmp); if (res) pos++; if (res && (pos >= minPos) && (pos <= maxPos)) { /* * Fits in the requested range. */ newContextSize++; if (minPos == maxPos) { /* * Only 1 node was requested. */ if (contextNode->type == XML_NAMESPACE_DECL) { /* * As always: take care of those nasty * namespace nodes. */ set->nodeTab[i] = NULL; } xmlXPathNodeSetClear(set, hasNsNodes); set->nodeNr = 1; set->nodeTab[0] = contextNode; goto evaluation_exit; } if (pos == maxPos) { /* * We are done. */ xmlXPathNodeSetClearFromPos(set, i +1, hasNsNodes); goto evaluation_exit; } } else { /* * Remove the entry from the initial node set. */ set->nodeTab[i] = NULL; if (contextNode->type == XML_NAMESPACE_DECL) xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); } if (exprRes != NULL) { xmlXPathReleaseObject(ctxt->context, exprRes); exprRes = NULL; } if (ctxt->value == contextObj) { /* * Don't free the temporary XPath object holding the * context node, in order to avoid massive recreation * inside this loop. */ valuePop(ctxt); xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); } else { /* * The object was lost in the evaluation machinery. * Can this happen? Maybe in case of internal-errors. */ contextObj = NULL; } } goto evaluation_exit; evaluation_error: xmlXPathNodeSetClear(set, hasNsNodes); newContextSize = 0; evaluation_exit: if (contextObj != NULL) { if (ctxt->value == contextObj) valuePop(ctxt); xmlXPathReleaseObject(xpctxt, contextObj); } if (exprRes != NULL) xmlXPathReleaseObject(ctxt->context, exprRes); /* * Reset/invalidate the context. */ xpctxt->node = oldContextNode; xpctxt->doc = oldContextDoc; xpctxt->contextSize = -1; xpctxt->proximityPosition = -1; return(newContextSize); } return(contextSize); } static int xmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, int *maxPos) { xmlXPathStepOpPtr exprOp; /* * BIG NOTE: This is not intended for XPATH_OP_FILTER yet! */ /* * If not -1, then ch1 will point to: * 1) For predicates (XPATH_OP_PREDICATE): * - an inner predicate operator * 2) For filters (XPATH_OP_FILTER): * - an inner filter operater OR * - an expression selecting the node set. * E.g. "key('a', 'b')" or "(//foo | //bar)". */ if ((op->op != XPATH_OP_PREDICATE) && (op->op != XPATH_OP_FILTER)) return(0); if (op->ch2 != -1) { exprOp = &ctxt->comp->steps[op->ch2]; } else return(0); if ((exprOp != NULL) && (exprOp->op == XPATH_OP_VALUE) && (exprOp->value4 != NULL) && (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER)) { /* * We have a "[n]" predicate here. * TODO: Unfortunately this simplistic test here is not * able to detect a position() predicate in compound * expressions like "[@attr = 'a" and position() = 1], * and even not the usage of position() in * "[position() = 1]"; thus - obviously - a position-range, * like it "[position() < 5]", is also not detected. * Maybe we could rewrite the AST to ease the optimization. */ *maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval; if (((xmlXPathObjectPtr) exprOp->value4)->floatval == (float) *maxPos) { return(1); } } return(0); } static int xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodePtr * first, xmlNodePtr * last, int toBool) { #define XP_TEST_HIT \ if (hasAxisRange != 0) { \ if (++pos == maxPos) { \ if (addNode(seq, cur) < 0) \ ctxt->error = XPATH_MEMORY_ERROR; \ goto axis_range_end; } \ } else { \ if (addNode(seq, cur) < 0) \ ctxt->error = XPATH_MEMORY_ERROR; \ if (breakOnFirstHit) goto first_hit; } #define XP_TEST_HIT_NS \ if (hasAxisRange != 0) { \ if (++pos == maxPos) { \ hasNsNodes = 1; \ if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \ ctxt->error = XPATH_MEMORY_ERROR; \ goto axis_range_end; } \ } else { \ hasNsNodes = 1; \ if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \ ctxt->error = XPATH_MEMORY_ERROR; \ if (breakOnFirstHit) goto first_hit; } xmlXPathAxisVal axis = (xmlXPathAxisVal) op->value; xmlXPathTestVal test = (xmlXPathTestVal) op->value2; xmlXPathTypeVal type = (xmlXPathTypeVal) op->value3; const xmlChar *prefix = op->value4; const xmlChar *name = op->value5; const xmlChar *URI = NULL; #ifdef DEBUG_STEP int nbMatches = 0, prevMatches = 0; #endif int total = 0, hasNsNodes = 0; /* The popped object holding the context nodes */ xmlXPathObjectPtr obj; /* The set of context nodes for the node tests */ xmlNodeSetPtr contextSeq; int contextIdx; xmlNodePtr contextNode; /* The final resulting node set wrt to all context nodes */ xmlNodeSetPtr outSeq; /* * The temporary resulting node set wrt 1 context node. * Used to feed predicate evaluation. */ xmlNodeSetPtr seq; xmlNodePtr cur; /* First predicate operator */ xmlXPathStepOpPtr predOp; int maxPos; /* The requested position() (when a "[n]" predicate) */ int hasPredicateRange, hasAxisRange, pos, size, newSize; int breakOnFirstHit; xmlXPathTraversalFunction next = NULL; int (*addNode) (xmlNodeSetPtr, xmlNodePtr); xmlXPathNodeSetMergeFunction mergeAndClear; xmlNodePtr oldContextNode; xmlXPathContextPtr xpctxt = ctxt->context; CHECK_TYPE0(XPATH_NODESET); obj = valuePop(ctxt); /* * Setup namespaces. */ if (prefix != NULL) { URI = xmlXPathNsLookup(xpctxt, prefix); if (URI == NULL) { xmlXPathReleaseObject(xpctxt, obj); XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); } } /* * Setup axis. * * MAYBE FUTURE TODO: merging optimizations: * - If the nodes to be traversed wrt to the initial nodes and * the current axis cannot overlap, then we could avoid searching * for duplicates during the merge. * But the question is how/when to evaluate if they cannot overlap. * Example: if we know that for two initial nodes, the one is * not in the ancestor-or-self axis of the other, then we could safely * avoid a duplicate-aware merge, if the axis to be traversed is e.g. * the descendant-or-self axis. */ mergeAndClear = xmlXPathNodeSetMergeAndClear; switch (axis) { case AXIS_ANCESTOR: first = NULL; next = xmlXPathNextAncestor; break; case AXIS_ANCESTOR_OR_SELF: first = NULL; next = xmlXPathNextAncestorOrSelf; break; case AXIS_ATTRIBUTE: first = NULL; last = NULL; next = xmlXPathNextAttribute; mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; break; case AXIS_CHILD: last = NULL; if (((test == NODE_TEST_NAME) || (test == NODE_TEST_ALL)) && (type == NODE_TYPE_NODE)) { /* * Optimization if an element node type is 'element'. */ next = xmlXPathNextChildElement; } else next = xmlXPathNextChild; mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; break; case AXIS_DESCENDANT: last = NULL; next = xmlXPathNextDescendant; break; case AXIS_DESCENDANT_OR_SELF: last = NULL; next = xmlXPathNextDescendantOrSelf; break; case AXIS_FOLLOWING: last = NULL; next = xmlXPathNextFollowing; break; case AXIS_FOLLOWING_SIBLING: last = NULL; next = xmlXPathNextFollowingSibling; break; case AXIS_NAMESPACE: first = NULL; last = NULL; next = (xmlXPathTraversalFunction) xmlXPathNextNamespace; mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; break; case AXIS_PARENT: first = NULL; next = xmlXPathNextParent; break; case AXIS_PRECEDING: first = NULL; next = xmlXPathNextPrecedingInternal; break; case AXIS_PRECEDING_SIBLING: first = NULL; next = xmlXPathNextPrecedingSibling; break; case AXIS_SELF: first = NULL; last = NULL; next = xmlXPathNextSelf; mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; break; } #ifdef DEBUG_STEP xmlXPathDebugDumpStepAxis(op, (obj->nodesetval != NULL) ? obj->nodesetval->nodeNr : 0); #endif if (next == NULL) { xmlXPathReleaseObject(xpctxt, obj); return(0); } contextSeq = obj->nodesetval; if ((contextSeq == NULL) || (contextSeq->nodeNr <= 0)) { xmlXPathReleaseObject(xpctxt, obj); valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, NULL)); return(0); } /* * Predicate optimization --------------------------------------------- * If this step has a last predicate, which contains a position(), * then we'll optimize (although not exactly "position()", but only * the short-hand form, i.e., "[n]". * * Example - expression "/foo[parent::bar][1]": * * COLLECT 'child' 'name' 'node' foo -- op (we are here) * ROOT -- op->ch1 * PREDICATE -- op->ch2 (predOp) * PREDICATE -- predOp->ch1 = [parent::bar] * SORT * COLLECT 'parent' 'name' 'node' bar * NODE * ELEM Object is a number : 1 -- predOp->ch2 = [1] * */ maxPos = 0; predOp = NULL; hasPredicateRange = 0; hasAxisRange = 0; if (op->ch2 != -1) { /* * There's at least one predicate. 16 == XPATH_OP_PREDICATE */ predOp = &ctxt->comp->steps[op->ch2]; if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) { if (predOp->ch1 != -1) { /* * Use the next inner predicate operator. */ predOp = &ctxt->comp->steps[predOp->ch1]; hasPredicateRange = 1; } else { /* * There's no other predicate than the [n] predicate. */ predOp = NULL; hasAxisRange = 1; } } } breakOnFirstHit = ((toBool) && (predOp == NULL)) ? 1 : 0; /* * Axis traversal ----------------------------------------------------- */ /* * 2.3 Node Tests * - For the attribute axis, the principal node type is attribute. * - For the namespace axis, the principal node type is namespace. * - For other axes, the principal node type is element. * * A node test * is true for any node of the * principal node type. For example, child::* will * select all element children of the context node */ oldContextNode = xpctxt->node; addNode = xmlXPathNodeSetAddUnique; outSeq = NULL; seq = NULL; contextNode = NULL; contextIdx = 0; while (((contextIdx < contextSeq->nodeNr) || (contextNode != NULL)) && (ctxt->error == XPATH_EXPRESSION_OK)) { xpctxt->node = contextSeq->nodeTab[contextIdx++]; if (seq == NULL) { seq = xmlXPathNodeSetCreate(NULL); if (seq == NULL) { total = 0; goto error; } } /* * Traverse the axis and test the nodes. */ pos = 0; cur = NULL; hasNsNodes = 0; do { cur = next(ctxt, cur); if (cur == NULL) break; /* * QUESTION TODO: What does the "first" and "last" stuff do? */ if ((first != NULL) && (*first != NULL)) { if (*first == cur) break; if (((total % 256) == 0) && #ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON (xmlXPathCmpNodesExt(*first, cur) >= 0)) #else (xmlXPathCmpNodes(*first, cur) >= 0)) #endif { break; } } if ((last != NULL) && (*last != NULL)) { if (*last == cur) break; if (((total % 256) == 0) && #ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON (xmlXPathCmpNodesExt(cur, *last) >= 0)) #else (xmlXPathCmpNodes(cur, *last) >= 0)) #endif { break; } } total++; #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, " %s", cur->name); #endif switch (test) { case NODE_TEST_NONE: total = 0; STRANGE goto error; case NODE_TEST_TYPE: /* * TODO: Don't we need to use * xmlXPathNodeSetAddNs() for namespace nodes here? * Surprisingly, some c14n tests fail, if we do this. */ if (type == NODE_TYPE_NODE) { switch (cur->type) { case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_CDATA_SECTION_NODE: case XML_TEXT_NODE: case XML_NAMESPACE_DECL: XP_TEST_HIT break; default: break; } } else if (cur->type == type) { if (cur->type == XML_NAMESPACE_DECL) XP_TEST_HIT_NS else XP_TEST_HIT } else if ((type == NODE_TYPE_TEXT) && (cur->type == XML_CDATA_SECTION_NODE)) { XP_TEST_HIT } break; case NODE_TEST_PI: if ((cur->type == XML_PI_NODE) && ((name == NULL) || xmlStrEqual(name, cur->name))) { XP_TEST_HIT } break; case NODE_TEST_ALL: if (axis == AXIS_ATTRIBUTE) { if (cur->type == XML_ATTRIBUTE_NODE) { XP_TEST_HIT } } else if (axis == AXIS_NAMESPACE) { if (cur->type == XML_NAMESPACE_DECL) { XP_TEST_HIT_NS } } else { if (cur->type == XML_ELEMENT_NODE) { if (prefix == NULL) { XP_TEST_HIT } else if ((cur->ns != NULL) && (xmlStrEqual(URI, cur->ns->href))) { XP_TEST_HIT } } } break; case NODE_TEST_NS:{ TODO; break; } case NODE_TEST_NAME: if (axis == AXIS_ATTRIBUTE) { if (cur->type != XML_ATTRIBUTE_NODE) break; } else if (axis == AXIS_NAMESPACE) { if (cur->type != XML_NAMESPACE_DECL) break; } else { if (cur->type != XML_ELEMENT_NODE) break; } switch (cur->type) { case XML_ELEMENT_NODE: if (xmlStrEqual(name, cur->name)) { if (prefix == NULL) { if (cur->ns == NULL) { XP_TEST_HIT } } else { if ((cur->ns != NULL) && (xmlStrEqual(URI, cur->ns->href))) { XP_TEST_HIT } } } break; case XML_ATTRIBUTE_NODE:{ xmlAttrPtr attr = (xmlAttrPtr) cur; if (xmlStrEqual(name, attr->name)) { if (prefix == NULL) { if ((attr->ns == NULL) || (attr->ns->prefix == NULL)) { XP_TEST_HIT } } else { if ((attr->ns != NULL) && (xmlStrEqual(URI, attr->ns->href))) { XP_TEST_HIT } } } break; } case XML_NAMESPACE_DECL: if (cur->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr) cur; if ((ns->prefix != NULL) && (name != NULL) && (xmlStrEqual(ns->prefix, name))) { XP_TEST_HIT_NS } } break; default: break; } break; } /* switch(test) */ } while ((cur != NULL) && (ctxt->error == XPATH_EXPRESSION_OK)); goto apply_predicates; axis_range_end: /* ----------------------------------------------------- */ /* * We have a "/foo[n]", and position() = n was reached. * Note that we can have as well "/foo/::parent::foo[1]", so * a duplicate-aware merge is still needed. * Merge with the result. */ if (outSeq == NULL) { outSeq = seq; seq = NULL; } else outSeq = mergeAndClear(outSeq, seq, 0); /* * Break if only a true/false result was requested. */ if (toBool) break; continue; first_hit: /* ---------------------------------------------------------- */ /* * Break if only a true/false result was requested and * no predicates existed and a node test succeeded. */ if (outSeq == NULL) { outSeq = seq; seq = NULL; } else outSeq = mergeAndClear(outSeq, seq, 0); break; #ifdef DEBUG_STEP if (seq != NULL) nbMatches += seq->nodeNr; #endif apply_predicates: /* --------------------------------------------------- */ if (ctxt->error != XPATH_EXPRESSION_OK) goto error; /* * Apply predicates. */ if ((predOp != NULL) && (seq->nodeNr > 0)) { /* * E.g. when we have a "/foo[some expression][n]". */ /* * QUESTION TODO: The old predicate evaluation took into * account location-sets. * (E.g. ctxt->value->type == XPATH_LOCATIONSET) * Do we expect such a set here? * All what I learned now from the evaluation semantics * does not indicate that a location-set will be processed * here, so this looks OK. */ /* * Iterate over all predicates, starting with the outermost * predicate. * TODO: Problem: we cannot execute the inner predicates first * since we cannot go back *up* the operator tree! * Options we have: * 1) Use of recursive functions (like is it currently done * via xmlXPathCompOpEval()) * 2) Add a predicate evaluation information stack to the * context struct * 3) Change the way the operators are linked; we need a * "parent" field on xmlXPathStepOp * * For the moment, I'll try to solve this with a recursive * function: xmlXPathCompOpEvalPredicate(). */ size = seq->nodeNr; if (hasPredicateRange != 0) newSize = xmlXPathCompOpEvalPositionalPredicate(ctxt, predOp, seq, size, maxPos, maxPos, hasNsNodes); else newSize = xmlXPathCompOpEvalPredicate(ctxt, predOp, seq, size, hasNsNodes); if (ctxt->error != XPATH_EXPRESSION_OK) { total = 0; goto error; } /* * Add the filtered set of nodes to the result node set. */ if (newSize == 0) { /* * The predicates filtered all nodes out. */ xmlXPathNodeSetClear(seq, hasNsNodes); } else if (seq->nodeNr > 0) { /* * Add to result set. */ if (outSeq == NULL) { if (size != newSize) { /* * We need to merge and clear here, since * the sequence will contained NULLed entries. */ outSeq = mergeAndClear(NULL, seq, 1); } else { outSeq = seq; seq = NULL; } } else outSeq = mergeAndClear(outSeq, seq, (size != newSize) ? 1: 0); /* * Break if only a true/false result was requested. */ if (toBool) break; } } else if (seq->nodeNr > 0) { /* * Add to result set. */ if (outSeq == NULL) { outSeq = seq; seq = NULL; } else { outSeq = mergeAndClear(outSeq, seq, 0); } } } error: if ((obj->boolval) && (obj->user != NULL)) { /* * QUESTION TODO: What does this do and why? * TODO: Do we have to do this also for the "error" * cleanup further down? */ ctxt->value->boolval = 1; ctxt->value->user = obj->user; obj->user = NULL; obj->boolval = 0; } xmlXPathReleaseObject(xpctxt, obj); /* * Ensure we return at least an emtpy set. */ if (outSeq == NULL) { if ((seq != NULL) && (seq->nodeNr == 0)) outSeq = seq; else outSeq = xmlXPathNodeSetCreate(NULL); /* XXX what if xmlXPathNodeSetCreate returned NULL here? */ } if ((seq != NULL) && (seq != outSeq)) { xmlXPathFreeNodeSet(seq); } /* * Hand over the result. Better to push the set also in * case of errors. */ valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq)); /* * Reset the context node. */ xpctxt->node = oldContextNode; #ifdef DEBUG_STEP xmlGenericError(xmlGenericErrorContext, "\nExamined %d nodes, found %d nodes at that step\n", total, nbMatches); #endif return(total); } static int xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodePtr * first); /** * xmlXPathCompOpEvalFirst: * @ctxt: the XPath parser context with the compiled expression * @op: an XPath compiled operation * @first: the first elem found so far * * Evaluate the Precompiled XPath operation searching only the first * element in document order * * Returns the number of examined objects. */ static int xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodePtr * first) { int total = 0, cur; xmlXPathCompExprPtr comp; xmlXPathObjectPtr arg1, arg2; CHECK_ERROR0; comp = ctxt->comp; switch (op->op) { case XPATH_OP_END: return (0); case XPATH_OP_UNION: total = xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], first); CHECK_ERROR0; if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr >= 1)) { /* * limit tree traversing to first node in the result */ /* * OPTIMIZE TODO: This implicitely sorts * the result, even if not needed. E.g. if the argument * of the count() function, no sorting is needed. * OPTIMIZE TODO: How do we know if the node-list wasn't * aready sorted? */ if (ctxt->value->nodesetval->nodeNr > 1) xmlXPathNodeSetSort(ctxt->value->nodesetval); *first = ctxt->value->nodesetval->nodeTab[0]; } cur = xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2], first); CHECK_ERROR0; CHECK_TYPE0(XPATH_NODESET); arg2 = valuePop(ctxt); CHECK_TYPE0(XPATH_NODESET); arg1 = valuePop(ctxt); arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, arg2->nodesetval); valuePush(ctxt, arg1); xmlXPathReleaseObject(ctxt->context, arg2); /* optimizer */ if (total > cur) xmlXPathCompSwap(op); return (total + cur); case XPATH_OP_ROOT: xmlXPathRoot(ctxt); return (0); case XPATH_OP_NODE: if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node)); return (total); case XPATH_OP_RESET: if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; ctxt->context->node = NULL; return (total); case XPATH_OP_COLLECT:{ if (op->ch1 == -1) return (total); total = xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; total += xmlXPathNodeCollectAndTest(ctxt, op, first, NULL, 0); return (total); } case XPATH_OP_VALUE: valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, (xmlXPathObjectPtr) op->value4)); return (0); case XPATH_OP_SORT: if (op->ch1 != -1) total += xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], first); CHECK_ERROR0; if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) xmlXPathNodeSetSort(ctxt->value->nodesetval); return (total); #ifdef XP_OPTIMIZED_FILTER_FIRST case XPATH_OP_FILTER: total += xmlXPathCompOpEvalFilterFirst(ctxt, op, first); return (total); #endif default: return (xmlXPathCompOpEval(ctxt, op)); } } /** * xmlXPathCompOpEvalLast: * @ctxt: the XPath parser context with the compiled expression * @op: an XPath compiled operation * @last: the last elem found so far * * Evaluate the Precompiled XPath operation searching only the last * element in document order * * Returns the number of nodes traversed */ static int xmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodePtr * last) { int total = 0, cur; xmlXPathCompExprPtr comp; xmlXPathObjectPtr arg1, arg2; xmlNodePtr bak; xmlDocPtr bakd; int pp; int cs; CHECK_ERROR0; comp = ctxt->comp; switch (op->op) { case XPATH_OP_END: return (0); case XPATH_OP_UNION: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total = xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last); CHECK_ERROR0; if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr >= 1)) { /* * limit tree traversing to first node in the result */ if (ctxt->value->nodesetval->nodeNr > 1) xmlXPathNodeSetSort(ctxt->value->nodesetval); *last = ctxt->value->nodesetval->nodeTab[ctxt->value-> nodesetval->nodeNr - 1]; } ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; cur = xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch2], last); CHECK_ERROR0; if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */ } CHECK_TYPE0(XPATH_NODESET); arg2 = valuePop(ctxt); CHECK_TYPE0(XPATH_NODESET); arg1 = valuePop(ctxt); arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, arg2->nodesetval); valuePush(ctxt, arg1); xmlXPathReleaseObject(ctxt->context, arg2); /* optimizer */ if (total > cur) xmlXPathCompSwap(op); return (total + cur); case XPATH_OP_ROOT: xmlXPathRoot(ctxt); return (0); case XPATH_OP_NODE: if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node)); return (total); case XPATH_OP_RESET: if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; ctxt->context->node = NULL; return (total); case XPATH_OP_COLLECT:{ if (op->ch1 == -1) return (0); total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, last, 0); return (total); } case XPATH_OP_VALUE: valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, (xmlXPathObjectPtr) op->value4)); return (0); case XPATH_OP_SORT: if (op->ch1 != -1) total += xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last); CHECK_ERROR0; if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) xmlXPathNodeSetSort(ctxt->value->nodesetval); return (total); default: return (xmlXPathCompOpEval(ctxt, op)); } } #ifdef XP_OPTIMIZED_FILTER_FIRST static int xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, xmlNodePtr * first) { int total = 0; xmlXPathCompExprPtr comp; xmlXPathObjectPtr res; xmlXPathObjectPtr obj; xmlNodeSetPtr oldset; xmlNodePtr oldnode; xmlDocPtr oldDoc; int i; CHECK_ERROR0; comp = ctxt->comp; /* * Optimization for ()[last()] selection i.e. the last elem */ if ((op->ch1 != -1) && (op->ch2 != -1) && (comp->steps[op->ch1].op == XPATH_OP_SORT) && (comp->steps[op->ch2].op == XPATH_OP_SORT)) { int f = comp->steps[op->ch2].ch1; if ((f != -1) && (comp->steps[f].op == XPATH_OP_FUNCTION) && (comp->steps[f].value5 == NULL) && (comp->steps[f].value == 0) && (comp->steps[f].value4 != NULL) && (xmlStrEqual (comp->steps[f].value4, BAD_CAST "last"))) { xmlNodePtr last = NULL; total += xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], &last); CHECK_ERROR0; /* * The nodeset should be in document order, * Keep only the last value */ if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeTab != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) { ctxt->value->nodesetval->nodeTab[0] = ctxt->value->nodesetval->nodeTab[ctxt-> value-> nodesetval-> nodeNr - 1]; ctxt->value->nodesetval->nodeNr = 1; *first = *(ctxt->value->nodesetval->nodeTab); } return (total); } } if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 == -1) return (total); if (ctxt->value == NULL) return (total); #ifdef LIBXML_XPTR_ENABLED oldnode = ctxt->context->node; /* * Hum are we filtering the result of an XPointer expression */ if (ctxt->value->type == XPATH_LOCATIONSET) { xmlXPathObjectPtr tmp = NULL; xmlLocationSetPtr newlocset = NULL; xmlLocationSetPtr oldlocset; /* * Extract the old locset, and then evaluate the result of the * expression for all the element in the locset. use it to grow * up a new locset. */ CHECK_TYPE0(XPATH_LOCATIONSET); obj = valuePop(ctxt); oldlocset = obj->user; ctxt->context->node = NULL; if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { ctxt->context->contextSize = 0; ctxt->context->proximityPosition = 0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); res = valuePop(ctxt); if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } valuePush(ctxt, obj); CHECK_ERROR0; return (total); } newlocset = xmlXPtrLocationSetCreate(NULL); for (i = 0; i < oldlocset->locNr; i++) { /* * Run the evaluation with a node list made of a * single item in the nodelocset. */ ctxt->context->node = oldlocset->locTab[i]->user; ctxt->context->contextSize = oldlocset->locNr; ctxt->context->proximityPosition = i + 1; if (tmp == NULL) { tmp = xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node); } else { if (xmlXPathNodeSetAddUnique(tmp->nodesetval, ctxt->context->node) < 0) { ctxt->error = XPATH_MEMORY_ERROR; } } valuePush(ctxt, tmp); if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error != XPATH_EXPRESSION_OK) { xmlXPathFreeObject(obj); return(0); } /* * The result of the evaluation need to be tested to * decided whether the filter succeeded or not */ res = valuePop(ctxt); if (xmlXPathEvaluatePredicateResult(ctxt, res)) { xmlXPtrLocationSetAdd(newlocset, xmlXPathCacheObjectCopy(ctxt->context, oldlocset->locTab[i])); } /* * Cleanup */ if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } if (ctxt->value == tmp) { valuePop(ctxt); xmlXPathNodeSetClear(tmp->nodesetval, 1); /* * REVISIT TODO: Don't create a temporary nodeset * for everly iteration. */ /* OLD: xmlXPathFreeObject(res); */ } else tmp = NULL; ctxt->context->node = NULL; /* * Only put the first node in the result, then leave. */ if (newlocset->locNr > 0) { *first = (xmlNodePtr) oldlocset->locTab[i]->user; break; } } if (tmp != NULL) { xmlXPathReleaseObject(ctxt->context, tmp); } /* * The result is used as the new evaluation locset. */ xmlXPathReleaseObject(ctxt->context, obj); ctxt->context->node = NULL; ctxt->context->contextSize = -1; ctxt->context->proximityPosition = -1; valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); ctxt->context->node = oldnode; return (total); } #endif /* LIBXML_XPTR_ENABLED */ /* * Extract the old set, and then evaluate the result of the * expression for all the element in the set. use it to grow * up a new set. */ CHECK_TYPE0(XPATH_NODESET); obj = valuePop(ctxt); oldset = obj->nodesetval; oldnode = ctxt->context->node; oldDoc = ctxt->context->doc; ctxt->context->node = NULL; if ((oldset == NULL) || (oldset->nodeNr == 0)) { ctxt->context->contextSize = 0; ctxt->context->proximityPosition = 0; /* QUESTION TODO: Why was this code commented out? if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; res = valuePop(ctxt); if (res != NULL) xmlXPathFreeObject(res); */ valuePush(ctxt, obj); ctxt->context->node = oldnode; CHECK_ERROR0; } else { xmlNodeSetPtr newset; xmlXPathObjectPtr tmp = NULL; /* * Initialize the new set. * Also set the xpath document in case things like * key() evaluation are attempted on the predicate */ newset = xmlXPathNodeSetCreate(NULL); /* XXX what if xmlXPathNodeSetCreate returned NULL? */ for (i = 0; i < oldset->nodeNr; i++) { /* * Run the evaluation with a node list made of * a single item in the nodeset. */ ctxt->context->node = oldset->nodeTab[i]; if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && (oldset->nodeTab[i]->doc != NULL)) ctxt->context->doc = oldset->nodeTab[i]->doc; if (tmp == NULL) { tmp = xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node); } else { if (xmlXPathNodeSetAddUnique(tmp->nodesetval, ctxt->context->node) < 0) { ctxt->error = XPATH_MEMORY_ERROR; } } valuePush(ctxt, tmp); ctxt->context->contextSize = oldset->nodeNr; ctxt->context->proximityPosition = i + 1; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error != XPATH_EXPRESSION_OK) { xmlXPathFreeNodeSet(newset); xmlXPathFreeObject(obj); return(0); } /* * The result of the evaluation needs to be tested to * decide whether the filter succeeded or not */ res = valuePop(ctxt); if (xmlXPathEvaluatePredicateResult(ctxt, res)) { if (xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]) < 0) ctxt->error = XPATH_MEMORY_ERROR; } /* * Cleanup */ if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } if (ctxt->value == tmp) { valuePop(ctxt); /* * Don't free the temporary nodeset * in order to avoid massive recreation inside this * loop. */ xmlXPathNodeSetClear(tmp->nodesetval, 1); } else tmp = NULL; ctxt->context->node = NULL; /* * Only put the first node in the result, then leave. */ if (newset->nodeNr > 0) { *first = *(newset->nodeTab); break; } } if (tmp != NULL) { xmlXPathReleaseObject(ctxt->context, tmp); } /* * The result is used as the new evaluation set. */ xmlXPathReleaseObject(ctxt->context, obj); ctxt->context->node = NULL; ctxt->context->contextSize = -1; ctxt->context->proximityPosition = -1; /* may want to move this past the '}' later */ ctxt->context->doc = oldDoc; valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset)); } ctxt->context->node = oldnode; return(total); } #endif /* XP_OPTIMIZED_FILTER_FIRST */ /** * xmlXPathCompOpEval: * @ctxt: the XPath parser context with the compiled expression * @op: an XPath compiled operation * * Evaluate the Precompiled XPath operation * Returns the number of nodes traversed */ static int xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op) { int total = 0; int equal, ret; xmlXPathCompExprPtr comp; xmlXPathObjectPtr arg1, arg2; xmlNodePtr bak; xmlDocPtr bakd; int pp; int cs; CHECK_ERROR0; comp = ctxt->comp; switch (op->op) { case XPATH_OP_END: return (0); case XPATH_OP_AND: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; xmlXPathBooleanFunction(ctxt, 1); if ((ctxt->value == NULL) || (ctxt->value->boolval == 0)) return (total); arg2 = valuePop(ctxt); ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error) { xmlXPathFreeObject(arg2); return(0); } xmlXPathBooleanFunction(ctxt, 1); arg1 = valuePop(ctxt); arg1->boolval &= arg2->boolval; valuePush(ctxt, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return (total); case XPATH_OP_OR: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; xmlXPathBooleanFunction(ctxt, 1); if ((ctxt->value == NULL) || (ctxt->value->boolval == 1)) return (total); arg2 = valuePop(ctxt); ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error) { xmlXPathFreeObject(arg2); return(0); } xmlXPathBooleanFunction(ctxt, 1); arg1 = valuePop(ctxt); arg1->boolval |= arg2->boolval; valuePush(ctxt, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return (total); case XPATH_OP_EQUAL: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; if (op->value) equal = xmlXPathEqualValues(ctxt); else equal = xmlXPathNotEqualValues(ctxt); valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, equal)); return (total); case XPATH_OP_CMP: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; ret = xmlXPathCompareValues(ctxt, op->value, op->value2); valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); return (total); case XPATH_OP_PLUS: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 != -1) { ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); } CHECK_ERROR0; if (op->value == 0) xmlXPathSubValues(ctxt); else if (op->value == 1) xmlXPathAddValues(ctxt); else if (op->value == 2) xmlXPathValueFlipSign(ctxt); else if (op->value == 3) { CAST_TO_NUMBER; CHECK_TYPE0(XPATH_NUMBER); } return (total); case XPATH_OP_MULT: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; if (op->value == 0) xmlXPathMultValues(ctxt); else if (op->value == 1) xmlXPathDivValues(ctxt); else if (op->value == 2) xmlXPathModValues(ctxt); return (total); case XPATH_OP_UNION: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; ctxt->context->doc = bakd; ctxt->context->node = bak; ctxt->context->proximityPosition = pp; ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; CHECK_TYPE0(XPATH_NODESET); arg2 = valuePop(ctxt); CHECK_TYPE0(XPATH_NODESET); arg1 = valuePop(ctxt); if ((arg1->nodesetval == NULL) || ((arg2->nodesetval != NULL) && (arg2->nodesetval->nodeNr != 0))) { arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, arg2->nodesetval); } valuePush(ctxt, arg1); xmlXPathReleaseObject(ctxt->context, arg2); return (total); case XPATH_OP_ROOT: xmlXPathRoot(ctxt); return (total); case XPATH_OP_NODE: if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node)); return (total); case XPATH_OP_RESET: if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; ctxt->context->node = NULL; return (total); case XPATH_OP_COLLECT:{ if (op->ch1 == -1) return (total); total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 0); return (total); } case XPATH_OP_VALUE: valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, (xmlXPathObjectPtr) op->value4)); return (total); case XPATH_OP_VARIABLE:{ xmlXPathObjectPtr val; if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); if (op->value5 == NULL) { val = xmlXPathVariableLookup(ctxt->context, op->value4); if (val == NULL) { ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; return(0); } valuePush(ctxt, val); } else { const xmlChar *URI; URI = xmlXPathNsLookup(ctxt->context, op->value5); if (URI == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n", (char *) op->value4, (char *)op->value5); ctxt->error = XPATH_UNDEF_PREFIX_ERROR; return (total); } val = xmlXPathVariableLookupNS(ctxt->context, op->value4, URI); if (val == NULL) { ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; return(0); } valuePush(ctxt, val); } return (total); } case XPATH_OP_FUNCTION:{ xmlXPathFunction func; const xmlChar *oldFunc, *oldFuncURI; int i; int frame; frame = xmlXPathSetFrame(ctxt); if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); if (ctxt->valueNr < op->value) { xmlGenericError(xmlGenericErrorContext, "xmlXPathCompOpEval: parameter error\n"); ctxt->error = XPATH_INVALID_OPERAND; xmlXPathPopFrame(ctxt, frame); return (total); } for (i = 0; i < op->value; i++) { if (ctxt->valueTab[(ctxt->valueNr - 1) - i] == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlXPathCompOpEval: parameter error\n"); ctxt->error = XPATH_INVALID_OPERAND; xmlXPathPopFrame(ctxt, frame); return (total); } } if (op->cache != NULL) XML_CAST_FPTR(func) = op->cache; else { const xmlChar *URI = NULL; if (op->value5 == NULL) func = xmlXPathFunctionLookup(ctxt->context, op->value4); else { URI = xmlXPathNsLookup(ctxt->context, op->value5); if (URI == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n", (char *)op->value4, (char *)op->value5); xmlXPathPopFrame(ctxt, frame); ctxt->error = XPATH_UNDEF_PREFIX_ERROR; return (total); } func = xmlXPathFunctionLookupNS(ctxt->context, op->value4, URI); } if (func == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlXPathCompOpEval: function %s not found\n", (char *)op->value4); XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR); } op->cache = XML_CAST_FPTR(func); op->cacheURI = (void *) URI; } oldFunc = ctxt->context->function; oldFuncURI = ctxt->context->functionURI; ctxt->context->function = op->value4; ctxt->context->functionURI = op->cacheURI; func(ctxt, op->value); ctxt->context->function = oldFunc; ctxt->context->functionURI = oldFuncURI; xmlXPathPopFrame(ctxt, frame); return (total); } case XPATH_OP_ARG: bakd = ctxt->context->doc; bak = ctxt->context->node; pp = ctxt->context->proximityPosition; cs = ctxt->context->contextSize; if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); ctxt->context->contextSize = cs; ctxt->context->proximityPosition = pp; ctxt->context->node = bak; ctxt->context->doc = bakd; CHECK_ERROR0; if (op->ch2 != -1) { total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); ctxt->context->doc = bakd; ctxt->context->node = bak; CHECK_ERROR0; } return (total); case XPATH_OP_PREDICATE: case XPATH_OP_FILTER:{ xmlXPathObjectPtr res; xmlXPathObjectPtr obj, tmp; xmlNodeSetPtr newset = NULL; xmlNodeSetPtr oldset; xmlNodePtr oldnode; xmlDocPtr oldDoc; int i; /* * Optimization for ()[1] selection i.e. the first elem */ if ((op->ch1 != -1) && (op->ch2 != -1) && #ifdef XP_OPTIMIZED_FILTER_FIRST /* * FILTER TODO: Can we assume that the inner processing * will result in an ordered list if we have an * XPATH_OP_FILTER? * What about an additional field or flag on * xmlXPathObject like @sorted ? This way we wouln'd need * to assume anything, so it would be more robust and * easier to optimize. */ ((comp->steps[op->ch1].op == XPATH_OP_SORT) || /* 18 */ (comp->steps[op->ch1].op == XPATH_OP_FILTER)) && /* 17 */ #else (comp->steps[op->ch1].op == XPATH_OP_SORT) && #endif (comp->steps[op->ch2].op == XPATH_OP_VALUE)) { /* 12 */ xmlXPathObjectPtr val; val = comp->steps[op->ch2].value4; if ((val != NULL) && (val->type == XPATH_NUMBER) && (val->floatval == 1.0)) { xmlNodePtr first = NULL; total += xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], &first); CHECK_ERROR0; /* * The nodeset should be in document order, * Keep only the first value */ if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) ctxt->value->nodesetval->nodeNr = 1; return (total); } } /* * Optimization for ()[last()] selection i.e. the last elem */ if ((op->ch1 != -1) && (op->ch2 != -1) && (comp->steps[op->ch1].op == XPATH_OP_SORT) && (comp->steps[op->ch2].op == XPATH_OP_SORT)) { int f = comp->steps[op->ch2].ch1; if ((f != -1) && (comp->steps[f].op == XPATH_OP_FUNCTION) && (comp->steps[f].value5 == NULL) && (comp->steps[f].value == 0) && (comp->steps[f].value4 != NULL) && (xmlStrEqual (comp->steps[f].value4, BAD_CAST "last"))) { xmlNodePtr last = NULL; total += xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], &last); CHECK_ERROR0; /* * The nodeset should be in document order, * Keep only the last value */ if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeTab != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) { ctxt->value->nodesetval->nodeTab[0] = ctxt->value->nodesetval->nodeTab[ctxt-> value-> nodesetval-> nodeNr - 1]; ctxt->value->nodesetval->nodeNr = 1; } return (total); } } /* * Process inner predicates first. * Example "index[parent::book][1]": * ... * PREDICATE <-- we are here "[1]" * PREDICATE <-- process "[parent::book]" first * SORT * COLLECT 'parent' 'name' 'node' book * NODE * ELEM Object is a number : 1 */ if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if (op->ch2 == -1) return (total); if (ctxt->value == NULL) return (total); oldnode = ctxt->context->node; #ifdef LIBXML_XPTR_ENABLED /* * Hum are we filtering the result of an XPointer expression */ if (ctxt->value->type == XPATH_LOCATIONSET) { xmlLocationSetPtr newlocset = NULL; xmlLocationSetPtr oldlocset; /* * Extract the old locset, and then evaluate the result of the * expression for all the element in the locset. use it to grow * up a new locset. */ CHECK_TYPE0(XPATH_LOCATIONSET); obj = valuePop(ctxt); oldlocset = obj->user; ctxt->context->node = NULL; if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { ctxt->context->contextSize = 0; ctxt->context->proximityPosition = 0; if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); res = valuePop(ctxt); if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } valuePush(ctxt, obj); CHECK_ERROR0; return (total); } newlocset = xmlXPtrLocationSetCreate(NULL); for (i = 0; i < oldlocset->locNr; i++) { /* * Run the evaluation with a node list made of a * single item in the nodelocset. */ ctxt->context->node = oldlocset->locTab[i]->user; ctxt->context->contextSize = oldlocset->locNr; ctxt->context->proximityPosition = i + 1; tmp = xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node); valuePush(ctxt, tmp); if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error != XPATH_EXPRESSION_OK) { xmlXPathFreeObject(obj); return(0); } /* * The result of the evaluation need to be tested to * decided whether the filter succeeded or not */ res = valuePop(ctxt); if (xmlXPathEvaluatePredicateResult(ctxt, res)) { xmlXPtrLocationSetAdd(newlocset, xmlXPathObjectCopy (oldlocset->locTab[i])); } /* * Cleanup */ if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } if (ctxt->value == tmp) { res = valuePop(ctxt); xmlXPathReleaseObject(ctxt->context, res); } ctxt->context->node = NULL; } /* * The result is used as the new evaluation locset. */ xmlXPathReleaseObject(ctxt->context, obj); ctxt->context->node = NULL; ctxt->context->contextSize = -1; ctxt->context->proximityPosition = -1; valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); ctxt->context->node = oldnode; return (total); } #endif /* LIBXML_XPTR_ENABLED */ /* * Extract the old set, and then evaluate the result of the * expression for all the element in the set. use it to grow * up a new set. */ CHECK_TYPE0(XPATH_NODESET); obj = valuePop(ctxt); oldset = obj->nodesetval; oldnode = ctxt->context->node; oldDoc = ctxt->context->doc; ctxt->context->node = NULL; if ((oldset == NULL) || (oldset->nodeNr == 0)) { ctxt->context->contextSize = 0; ctxt->context->proximityPosition = 0; /* if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; res = valuePop(ctxt); if (res != NULL) xmlXPathFreeObject(res); */ valuePush(ctxt, obj); ctxt->context->node = oldnode; CHECK_ERROR0; } else { tmp = NULL; /* * Initialize the new set. * Also set the xpath document in case things like * key() evaluation are attempted on the predicate */ newset = xmlXPathNodeSetCreate(NULL); /* * SPEC XPath 1.0: * "For each node in the node-set to be filtered, the * PredicateExpr is evaluated with that node as the * context node, with the number of nodes in the * node-set as the context size, and with the proximity * position of the node in the node-set with respect to * the axis as the context position;" * @oldset is the node-set" to be filtered. * * SPEC XPath 1.0: * "only predicates change the context position and * context size (see [2.4 Predicates])." * Example: * node-set context pos * nA 1 * nB 2 * nC 3 * After applying predicate [position() > 1] : * node-set context pos * nB 1 * nC 2 * * removed the first node in the node-set, then * the context position of the */ for (i = 0; i < oldset->nodeNr; i++) { /* * Run the evaluation with a node list made of * a single item in the nodeset. */ ctxt->context->node = oldset->nodeTab[i]; if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && (oldset->nodeTab[i]->doc != NULL)) ctxt->context->doc = oldset->nodeTab[i]->doc; if (tmp == NULL) { tmp = xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node); } else { if (xmlXPathNodeSetAddUnique(tmp->nodesetval, ctxt->context->node) < 0) { ctxt->error = XPATH_MEMORY_ERROR; } } valuePush(ctxt, tmp); ctxt->context->contextSize = oldset->nodeNr; ctxt->context->proximityPosition = i + 1; /* * Evaluate the predicate against the context node. * Can/should we optimize position() predicates * here (e.g. "[1]")? */ if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error != XPATH_EXPRESSION_OK) { xmlXPathFreeNodeSet(newset); xmlXPathFreeObject(obj); return(0); } /* * The result of the evaluation needs to be tested to * decide whether the filter succeeded or not */ /* * OPTIMIZE TODO: Can we use * xmlXPathNodeSetAdd*Unique()* instead? */ res = valuePop(ctxt); if (xmlXPathEvaluatePredicateResult(ctxt, res)) { if (xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]) < 0) ctxt->error = XPATH_MEMORY_ERROR; } /* * Cleanup */ if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } if (ctxt->value == tmp) { valuePop(ctxt); xmlXPathNodeSetClear(tmp->nodesetval, 1); /* * Don't free the temporary nodeset * in order to avoid massive recreation inside this * loop. */ } else tmp = NULL; ctxt->context->node = NULL; } if (tmp != NULL) xmlXPathReleaseObject(ctxt->context, tmp); /* * The result is used as the new evaluation set. */ xmlXPathReleaseObject(ctxt->context, obj); ctxt->context->node = NULL; ctxt->context->contextSize = -1; ctxt->context->proximityPosition = -1; /* may want to move this past the '}' later */ ctxt->context->doc = oldDoc; valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset)); } ctxt->context->node = oldnode; return (total); } case XPATH_OP_SORT: if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); CHECK_ERROR0; if ((ctxt->value != NULL) && (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) { xmlXPathNodeSetSort(ctxt->value->nodesetval); } return (total); #ifdef LIBXML_XPTR_ENABLED case XPATH_OP_RANGETO:{ xmlXPathObjectPtr range; xmlXPathObjectPtr res, obj; xmlXPathObjectPtr tmp; xmlLocationSetPtr newlocset = NULL; xmlLocationSetPtr oldlocset; xmlNodeSetPtr oldset; int i, j; if (op->ch1 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); if (op->ch2 == -1) return (total); if (ctxt->value->type == XPATH_LOCATIONSET) { /* * Extract the old locset, and then evaluate the result of the * expression for all the element in the locset. use it to grow * up a new locset. */ CHECK_TYPE0(XPATH_LOCATIONSET); obj = valuePop(ctxt); oldlocset = obj->user; if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { ctxt->context->node = NULL; ctxt->context->contextSize = 0; ctxt->context->proximityPosition = 0; total += xmlXPathCompOpEval(ctxt,&comp->steps[op->ch2]); res = valuePop(ctxt); if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } valuePush(ctxt, obj); CHECK_ERROR0; return (total); } newlocset = xmlXPtrLocationSetCreate(NULL); for (i = 0; i < oldlocset->locNr; i++) { /* * Run the evaluation with a node list made of a * single item in the nodelocset. */ ctxt->context->node = oldlocset->locTab[i]->user; ctxt->context->contextSize = oldlocset->locNr; ctxt->context->proximityPosition = i + 1; tmp = xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node); valuePush(ctxt, tmp); if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error != XPATH_EXPRESSION_OK) { xmlXPathFreeObject(obj); return(0); } res = valuePop(ctxt); if (res->type == XPATH_LOCATIONSET) { xmlLocationSetPtr rloc = (xmlLocationSetPtr)res->user; for (j=0; jlocNr; j++) { range = xmlXPtrNewRange( oldlocset->locTab[i]->user, oldlocset->locTab[i]->index, rloc->locTab[j]->user2, rloc->locTab[j]->index2); if (range != NULL) { xmlXPtrLocationSetAdd(newlocset, range); } } } else { range = xmlXPtrNewRangeNodeObject( (xmlNodePtr)oldlocset->locTab[i]->user, res); if (range != NULL) { xmlXPtrLocationSetAdd(newlocset,range); } } /* * Cleanup */ if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } if (ctxt->value == tmp) { res = valuePop(ctxt); xmlXPathReleaseObject(ctxt->context, res); } ctxt->context->node = NULL; } } else { /* Not a location set */ CHECK_TYPE0(XPATH_NODESET); obj = valuePop(ctxt); oldset = obj->nodesetval; ctxt->context->node = NULL; newlocset = xmlXPtrLocationSetCreate(NULL); if (oldset != NULL) { for (i = 0; i < oldset->nodeNr; i++) { /* * Run the evaluation with a node list made of a single item * in the nodeset. */ ctxt->context->node = oldset->nodeTab[i]; /* * OPTIMIZE TODO: Avoid recreation for every iteration. */ tmp = xmlXPathCacheNewNodeSet(ctxt->context, ctxt->context->node); valuePush(ctxt, tmp); if (op->ch2 != -1) total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); if (ctxt->error != XPATH_EXPRESSION_OK) { xmlXPathFreeObject(obj); return(0); } res = valuePop(ctxt); range = xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], res); if (range != NULL) { xmlXPtrLocationSetAdd(newlocset, range); } /* * Cleanup */ if (res != NULL) { xmlXPathReleaseObject(ctxt->context, res); } if (ctxt->value == tmp) { res = valuePop(ctxt); xmlXPathReleaseObject(ctxt->context, res); } ctxt->context->node = NULL; } } } /* * The result is used as the new evaluation set. */ xmlXPathReleaseObject(ctxt->context, obj); ctxt->context->node = NULL; ctxt->context->contextSize = -1; ctxt->context->proximityPosition = -1; valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); return (total); } #endif /* LIBXML_XPTR_ENABLED */ } xmlGenericError(xmlGenericErrorContext, "XPath: unknown precompiled operation %d\n", op->op); ctxt->error = XPATH_INVALID_OPERAND; return (total); } /** * xmlXPathCompOpEvalToBoolean: * @ctxt: the XPath parser context * * Evaluates if the expression evaluates to true. * * Returns 1 if true, 0 if false and -1 on API or internal errors. */ static int xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, int isPredicate) { xmlXPathObjectPtr resObj = NULL; start: /* comp = ctxt->comp; */ switch (op->op) { case XPATH_OP_END: return (0); case XPATH_OP_VALUE: resObj = (xmlXPathObjectPtr) op->value4; if (isPredicate) return(xmlXPathEvaluatePredicateResult(ctxt, resObj)); return(xmlXPathCastToBoolean(resObj)); case XPATH_OP_SORT: /* * We don't need sorting for boolean results. Skip this one. */ if (op->ch1 != -1) { op = &ctxt->comp->steps[op->ch1]; goto start; } return(0); case XPATH_OP_COLLECT: if (op->ch1 == -1) return(0); xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[op->ch1]); if (ctxt->error != XPATH_EXPRESSION_OK) return(-1); xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 1); if (ctxt->error != XPATH_EXPRESSION_OK) return(-1); resObj = valuePop(ctxt); if (resObj == NULL) return(-1); break; default: /* * Fallback to call xmlXPathCompOpEval(). */ xmlXPathCompOpEval(ctxt, op); if (ctxt->error != XPATH_EXPRESSION_OK) return(-1); resObj = valuePop(ctxt); if (resObj == NULL) return(-1); break; } if (resObj) { int res; if (resObj->type == XPATH_BOOLEAN) { res = resObj->boolval; } else if (isPredicate) { /* * For predicates a result of type "number" is handled * differently: * SPEC XPath 1.0: * "If the result is a number, the result will be converted * to true if the number is equal to the context position * and will be converted to false otherwise;" */ res = xmlXPathEvaluatePredicateResult(ctxt, resObj); } else { res = xmlXPathCastToBoolean(resObj); } xmlXPathReleaseObject(ctxt->context, resObj); return(res); } return(0); } #ifdef XPATH_STREAMING /** * xmlXPathRunStreamEval: * @ctxt: the XPath parser context with the compiled expression * * Evaluate the Precompiled Streamable XPath expression in the given context. */ static int xmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp, xmlXPathObjectPtr *resultSeq, int toBool) { int max_depth, min_depth; int from_root; int ret, depth; int eval_all_nodes; xmlNodePtr cur = NULL, limit = NULL; xmlStreamCtxtPtr patstream = NULL; int nb_nodes = 0; if ((ctxt == NULL) || (comp == NULL)) return(-1); max_depth = xmlPatternMaxDepth(comp); if (max_depth == -1) return(-1); if (max_depth == -2) max_depth = 10000; min_depth = xmlPatternMinDepth(comp); if (min_depth == -1) return(-1); from_root = xmlPatternFromRoot(comp); if (from_root < 0) return(-1); #if 0 printf("stream eval: depth %d from root %d\n", max_depth, from_root); #endif if (! toBool) { if (resultSeq == NULL) return(-1); *resultSeq = xmlXPathCacheNewNodeSet(ctxt, NULL); if (*resultSeq == NULL) return(-1); } /* * handle the special cases of "/" amd "." being matched */ if (min_depth == 0) { if (from_root) { /* Select "/" */ if (toBool) return(1); xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, (xmlNodePtr) ctxt->doc); } else { /* Select "self::node()" */ if (toBool) return(1); xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node); } } if (max_depth == 0) { return(0); } if (from_root) { cur = (xmlNodePtr)ctxt->doc; } else if (ctxt->node != NULL) { switch (ctxt->node->type) { case XML_ELEMENT_NODE: case XML_DOCUMENT_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif cur = ctxt->node; break; case XML_ATTRIBUTE_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: case XML_NAMESPACE_DECL: case XML_XINCLUDE_START: case XML_XINCLUDE_END: break; } limit = cur; } if (cur == NULL) { return(0); } patstream = xmlPatternGetStreamCtxt(comp); if (patstream == NULL) { /* * QUESTION TODO: Is this an error? */ return(0); } eval_all_nodes = xmlStreamWantsAnyNode(patstream); if (from_root) { ret = xmlStreamPush(patstream, NULL, NULL); if (ret < 0) { } else if (ret == 1) { if (toBool) goto return_1; xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); } } depth = 0; goto scan_children; next_node: do { nb_nodes++; switch (cur->type) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_COMMENT_NODE: case XML_PI_NODE: if (cur->type == XML_ELEMENT_NODE) { ret = xmlStreamPush(patstream, cur->name, (cur->ns ? cur->ns->href : NULL)); } else if (eval_all_nodes) ret = xmlStreamPushNode(patstream, NULL, NULL, cur->type); else break; if (ret < 0) { /* NOP. */ } else if (ret == 1) { if (toBool) goto return_1; if (xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur) < 0) { ctxt->lastError.domain = XML_FROM_XPATH; ctxt->lastError.code = XML_ERR_NO_MEMORY; } } if ((cur->children == NULL) || (depth >= max_depth)) { ret = xmlStreamPop(patstream); while (cur->next != NULL) { cur = cur->next; if ((cur->type != XML_ENTITY_DECL) && (cur->type != XML_DTD_NODE)) goto next_node; } } default: break; } scan_children: if (cur->type == XML_NAMESPACE_DECL) break; if ((cur->children != NULL) && (depth < max_depth)) { /* * Do not descend on entities declarations */ if (cur->children->type != XML_ENTITY_DECL) { cur = cur->children; depth++; /* * Skip DTDs */ if (cur->type != XML_DTD_NODE) continue; } } if (cur == limit) break; while (cur->next != NULL) { cur = cur->next; if ((cur->type != XML_ENTITY_DECL) && (cur->type != XML_DTD_NODE)) goto next_node; } do { cur = cur->parent; depth--; if ((cur == NULL) || (cur == limit)) goto done; if (cur->type == XML_ELEMENT_NODE) { ret = xmlStreamPop(patstream); } else if ((eval_all_nodes) && ((cur->type == XML_TEXT_NODE) || (cur->type == XML_CDATA_SECTION_NODE) || (cur->type == XML_COMMENT_NODE) || (cur->type == XML_PI_NODE))) { ret = xmlStreamPop(patstream); } if (cur->next != NULL) { cur = cur->next; break; } } while (cur != NULL); } while ((cur != NULL) && (depth >= 0)); done: #if 0 printf("stream eval: checked %d nodes selected %d\n", nb_nodes, retObj->nodesetval->nodeNr); #endif if (patstream) xmlFreeStreamCtxt(patstream); return(0); return_1: if (patstream) xmlFreeStreamCtxt(patstream); return(1); } #endif /* XPATH_STREAMING */ /** * xmlXPathRunEval: * @ctxt: the XPath parser context with the compiled expression * @toBool: evaluate to a boolean result * * Evaluate the Precompiled XPath expression in the given context. */ static int xmlXPathRunEval(xmlXPathParserContextPtr ctxt, int toBool) { xmlXPathCompExprPtr comp; if ((ctxt == NULL) || (ctxt->comp == NULL)) return(-1); if (ctxt->valueTab == NULL) { /* Allocate the value stack */ ctxt->valueTab = (xmlXPathObjectPtr *) xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); if (ctxt->valueTab == NULL) { xmlXPathPErrMemory(ctxt, "creating evaluation context\n"); xmlFree(ctxt); } ctxt->valueNr = 0; ctxt->valueMax = 10; ctxt->value = NULL; ctxt->valueFrame = 0; } #ifdef XPATH_STREAMING if (ctxt->comp->stream) { int res; if (toBool) { /* * Evaluation to boolean result. */ res = xmlXPathRunStreamEval(ctxt->context, ctxt->comp->stream, NULL, 1); if (res != -1) return(res); } else { xmlXPathObjectPtr resObj = NULL; /* * Evaluation to a sequence. */ res = xmlXPathRunStreamEval(ctxt->context, ctxt->comp->stream, &resObj, 0); if ((res != -1) && (resObj != NULL)) { valuePush(ctxt, resObj); return(0); } if (resObj != NULL) xmlXPathReleaseObject(ctxt->context, resObj); } /* * QUESTION TODO: This falls back to normal XPath evaluation * if res == -1. Is this intended? */ } #endif comp = ctxt->comp; if (comp->last < 0) { xmlGenericError(xmlGenericErrorContext, "xmlXPathRunEval: last is less than zero\n"); return(-1); } if (toBool) return(xmlXPathCompOpEvalToBoolean(ctxt, &comp->steps[comp->last], 0)); else xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]); return(0); } /************************************************************************ * * * Public interfaces * * * ************************************************************************/ /** * xmlXPathEvalPredicate: * @ctxt: the XPath context * @res: the Predicate Expression evaluation result * * Evaluate a predicate result for the current node. * A PredicateExpr is evaluated by evaluating the Expr and converting * the result to a boolean. If the result is a number, the result will * be converted to true if the number is equal to the position of the * context node in the context node list (as returned by the position * function) and will be converted to false otherwise; if the result * is not a number, then the result will be converted as if by a call * to the boolean function. * * Returns 1 if predicate is true, 0 otherwise */ int xmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr res) { if ((ctxt == NULL) || (res == NULL)) return(0); switch (res->type) { case XPATH_BOOLEAN: return(res->boolval); case XPATH_NUMBER: return(res->floatval == ctxt->proximityPosition); case XPATH_NODESET: case XPATH_XSLT_TREE: if (res->nodesetval == NULL) return(0); return(res->nodesetval->nodeNr != 0); case XPATH_STRING: return((res->stringval != NULL) && (xmlStrlen(res->stringval) != 0)); default: STRANGE } return(0); } /** * xmlXPathEvaluatePredicateResult: * @ctxt: the XPath Parser context * @res: the Predicate Expression evaluation result * * Evaluate a predicate result for the current node. * A PredicateExpr is evaluated by evaluating the Expr and converting * the result to a boolean. If the result is a number, the result will * be converted to true if the number is equal to the position of the * context node in the context node list (as returned by the position * function) and will be converted to false otherwise; if the result * is not a number, then the result will be converted as if by a call * to the boolean function. * * Returns 1 if predicate is true, 0 otherwise */ int xmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr res) { if ((ctxt == NULL) || (res == NULL)) return(0); switch (res->type) { case XPATH_BOOLEAN: return(res->boolval); case XPATH_NUMBER: #if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200)) return((res->floatval == ctxt->context->proximityPosition) && (!xmlXPathIsNaN(res->floatval))); /* MSC pbm Mark Vakoc !*/ #else return(res->floatval == ctxt->context->proximityPosition); #endif case XPATH_NODESET: case XPATH_XSLT_TREE: if (res->nodesetval == NULL) return(0); return(res->nodesetval->nodeNr != 0); case XPATH_STRING: return((res->stringval != NULL) && (res->stringval[0] != 0)); #ifdef LIBXML_XPTR_ENABLED case XPATH_LOCATIONSET:{ xmlLocationSetPtr ptr = res->user; if (ptr == NULL) return(0); return (ptr->locNr != 0); } #endif default: STRANGE } return(0); } #ifdef XPATH_STREAMING /** * xmlXPathTryStreamCompile: * @ctxt: an XPath context * @str: the XPath expression * * Try to compile the XPath expression as a streamable subset. * * Returns the compiled expression or NULL if failed to compile. */ static xmlXPathCompExprPtr xmlXPathTryStreamCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { /* * Optimization: use streaming patterns when the XPath expression can * be compiled to a stream lookup */ xmlPatternPtr stream; xmlXPathCompExprPtr comp; xmlDictPtr dict = NULL; const xmlChar **namespaces = NULL; xmlNsPtr ns; int i, j; if ((!xmlStrchr(str, '[')) && (!xmlStrchr(str, '(')) && (!xmlStrchr(str, '@'))) { const xmlChar *tmp; /* * We don't try to handle expressions using the verbose axis * specifiers ("::"), just the simplied form at this point. * Additionally, if there is no list of namespaces available and * there's a ":" in the expression, indicating a prefixed QName, * then we won't try to compile either. xmlPatterncompile() needs * to have a list of namespaces at compilation time in order to * compile prefixed name tests. */ tmp = xmlStrchr(str, ':'); if ((tmp != NULL) && ((ctxt == NULL) || (ctxt->nsNr == 0) || (tmp[1] == ':'))) return(NULL); if (ctxt != NULL) { dict = ctxt->dict; if (ctxt->nsNr > 0) { namespaces = xmlMalloc(2 * (ctxt->nsNr + 1) * sizeof(xmlChar*)); if (namespaces == NULL) { xmlXPathErrMemory(ctxt, "allocating namespaces array\n"); return(NULL); } for (i = 0, j = 0; (j < ctxt->nsNr); j++) { ns = ctxt->namespaces[j]; namespaces[i++] = ns->href; namespaces[i++] = ns->prefix; } namespaces[i++] = NULL; namespaces[i] = NULL; } } stream = xmlPatterncompile(str, dict, XML_PATTERN_XPATH, &namespaces[0]); if (namespaces != NULL) { xmlFree((xmlChar **)namespaces); } if ((stream != NULL) && (xmlPatternStreamable(stream) == 1)) { comp = xmlXPathNewCompExpr(); if (comp == NULL) { xmlXPathErrMemory(ctxt, "allocating streamable expression\n"); return(NULL); } comp->stream = stream; comp->dict = dict; if (comp->dict) xmlDictReference(comp->dict); return(comp); } xmlFreePattern(stream); } return(NULL); } #endif /* XPATH_STREAMING */ static void xmlXPathOptimizeExpression(xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op) { /* * Try to rewrite "descendant-or-self::node()/foo" to an optimized * internal representation. */ if ((op->ch1 != -1) && (op->op == XPATH_OP_COLLECT /* 11 */)) { xmlXPathStepOpPtr prevop = &comp->steps[op->ch1]; if ((prevop->op == XPATH_OP_COLLECT /* 11 */) && ((xmlXPathAxisVal) prevop->value == AXIS_DESCENDANT_OR_SELF) && (prevop->ch2 == -1) && ((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) && ((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE)) { /* * This is a "descendant-or-self::node()" without predicates. * Try to eliminate it. */ switch ((xmlXPathAxisVal) op->value) { case AXIS_CHILD: case AXIS_DESCENDANT: /* * Convert "descendant-or-self::node()/child::" or * "descendant-or-self::node()/descendant::" to * "descendant::" */ op->ch1 = prevop->ch1; op->value = AXIS_DESCENDANT; break; case AXIS_SELF: case AXIS_DESCENDANT_OR_SELF: /* * Convert "descendant-or-self::node()/self::" or * "descendant-or-self::node()/descendant-or-self::" to * to "descendant-or-self::" */ op->ch1 = prevop->ch1; op->value = AXIS_DESCENDANT_OR_SELF; break; default: break; } } } /* Recurse */ if (op->ch1 != -1) xmlXPathOptimizeExpression(comp, &comp->steps[op->ch1]); if (op->ch2 != -1) xmlXPathOptimizeExpression(comp, &comp->steps[op->ch2]); } /** * xmlXPathCtxtCompile: * @ctxt: an XPath context * @str: the XPath expression * * Compile an XPath expression * * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. * the caller has to free the object. */ xmlXPathCompExprPtr xmlXPathCtxtCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { xmlXPathParserContextPtr pctxt; xmlXPathCompExprPtr comp; #ifdef XPATH_STREAMING comp = xmlXPathTryStreamCompile(ctxt, str); if (comp != NULL) return(comp); #endif xmlXPathInit(); pctxt = xmlXPathNewParserContext(str, ctxt); if (pctxt == NULL) return NULL; xmlXPathCompileExpr(pctxt, 1); if( pctxt->error != XPATH_EXPRESSION_OK ) { xmlXPathFreeParserContext(pctxt); return(NULL); } if (*pctxt->cur != 0) { /* * aleksey: in some cases this line prints *second* error message * (see bug #78858) and probably this should be fixed. * However, we are not sure that all error messages are printed * out in other places. It's not critical so we leave it as-is for now */ xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); comp = NULL; } else { comp = pctxt->comp; pctxt->comp = NULL; } xmlXPathFreeParserContext(pctxt); if (comp != NULL) { comp->expr = xmlStrdup(str); #ifdef DEBUG_EVAL_COUNTS comp->string = xmlStrdup(str); comp->nb = 0; #endif if ((comp->nbStep > 1) && (comp->last >= 0)) { xmlXPathOptimizeExpression(comp, &comp->steps[comp->last]); } } return(comp); } /** * xmlXPathCompile: * @str: the XPath expression * * Compile an XPath expression * * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. * the caller has to free the object. */ xmlXPathCompExprPtr xmlXPathCompile(const xmlChar *str) { return(xmlXPathCtxtCompile(NULL, str)); } /** * xmlXPathCompiledEvalInternal: * @comp: the compiled XPath expression * @ctxt: the XPath context * @resObj: the resulting XPath object or NULL * @toBool: 1 if only a boolean result is requested * * Evaluate the Precompiled XPath expression in the given context. * The caller has to free @resObj. * * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. * the caller has to free the object. */ static int xmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt, xmlXPathObjectPtr *resObj, int toBool) { xmlXPathParserContextPtr pctxt; #ifndef LIBXML_THREAD_ENABLED static int reentance = 0; #endif int res; CHECK_CTXT_NEG(ctxt) if (comp == NULL) return(-1); xmlXPathInit(); #ifndef LIBXML_THREAD_ENABLED reentance++; if (reentance > 1) xmlXPathDisableOptimizer = 1; #endif #ifdef DEBUG_EVAL_COUNTS comp->nb++; if ((comp->string != NULL) && (comp->nb > 100)) { fprintf(stderr, "100 x %s\n", comp->string); comp->nb = 0; } #endif pctxt = xmlXPathCompParserContext(comp, ctxt); res = xmlXPathRunEval(pctxt, toBool); if (resObj) { if (pctxt->value == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlXPathCompiledEval: evaluation failed\n"); *resObj = NULL; } else { *resObj = valuePop(pctxt); } } /* * Pop all remaining objects from the stack. */ if (pctxt->valueNr > 0) { xmlXPathObjectPtr tmp; int stack = 0; do { tmp = valuePop(pctxt); if (tmp != NULL) { stack++; xmlXPathReleaseObject(ctxt, tmp); } } while (tmp != NULL); if ((stack != 0) && ((toBool) || ((resObj) && (*resObj)))) { xmlGenericError(xmlGenericErrorContext, "xmlXPathCompiledEval: %d objects left on the stack.\n", stack); } } if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) { xmlXPathFreeObject(*resObj); *resObj = NULL; } pctxt->comp = NULL; xmlXPathFreeParserContext(pctxt); #ifndef LIBXML_THREAD_ENABLED reentance--; #endif return(res); } /** * xmlXPathCompiledEval: * @comp: the compiled XPath expression * @ctx: the XPath context * * Evaluate the Precompiled XPath expression in the given context. * * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. * the caller has to free the object. */ xmlXPathObjectPtr xmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx) { xmlXPathObjectPtr res = NULL; xmlXPathCompiledEvalInternal(comp, ctx, &res, 0); return(res); } /** * xmlXPathCompiledEvalToBoolean: * @comp: the compiled XPath expression * @ctxt: the XPath context * * Applies the XPath boolean() function on the result of the given * compiled expression. * * Returns 1 if the expression evaluated to true, 0 if to false and * -1 in API and internal errors. */ int xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) { return(xmlXPathCompiledEvalInternal(comp, ctxt, NULL, 1)); } /** * xmlXPathEvalExpr: * @ctxt: the XPath Parser context * * Parse and evaluate an XPath expression in the given context, * then push the result on the context stack */ void xmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) { #ifdef XPATH_STREAMING xmlXPathCompExprPtr comp; #endif if (ctxt == NULL) return; #ifdef XPATH_STREAMING comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base); if (comp != NULL) { if (ctxt->comp != NULL) xmlXPathFreeCompExpr(ctxt->comp); ctxt->comp = comp; if (ctxt->cur != NULL) while (*ctxt->cur != 0) ctxt->cur++; } else #endif { xmlXPathCompileExpr(ctxt, 1); if ((ctxt->error == XPATH_EXPRESSION_OK) && (ctxt->comp != NULL) && (ctxt->comp->nbStep > 1) && (ctxt->comp->last >= 0)) { xmlXPathOptimizeExpression(ctxt->comp, &ctxt->comp->steps[ctxt->comp->last]); } } CHECK_ERROR; xmlXPathRunEval(ctxt, 0); } /** * xmlXPathEval: * @str: the XPath expression * @ctx: the XPath context * * Evaluate the XPath Location Path in the given context. * * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. * the caller has to free the object. */ xmlXPathObjectPtr xmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) { xmlXPathParserContextPtr ctxt; xmlXPathObjectPtr res, tmp, init = NULL; int stack = 0; CHECK_CTXT(ctx) xmlXPathInit(); ctxt = xmlXPathNewParserContext(str, ctx); if (ctxt == NULL) return NULL; xmlXPathEvalExpr(ctxt); if (ctxt->value == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlXPathEval: evaluation failed\n"); res = NULL; } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL) #ifdef XPATH_STREAMING && (ctxt->comp->stream == NULL) #endif ) { xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); res = NULL; } else { res = valuePop(ctxt); } do { tmp = valuePop(ctxt); if (tmp != NULL) { if (tmp != init) stack++; xmlXPathReleaseObject(ctx, tmp); } } while (tmp != NULL); if ((stack != 0) && (res != NULL)) { xmlGenericError(xmlGenericErrorContext, "xmlXPathEval: %d object left on the stack\n", stack); } if (ctxt->error != XPATH_EXPRESSION_OK) { xmlXPathFreeObject(res); res = NULL; } xmlXPathFreeParserContext(ctxt); return(res); } /** * xmlXPathSetContextNode: * @node: the node to to use as the context node * @ctx: the XPath context * * Sets 'node' as the context node. The node must be in the same * document as that associated with the context. * * Returns -1 in case of error or 0 if successful */ int xmlXPathSetContextNode(xmlNodePtr node, xmlXPathContextPtr ctx) { if ((node == NULL) || (ctx == NULL)) return(-1); if (node->doc == ctx->doc) { ctx->node = node; return(0); } return(-1); } /** * xmlXPathNodeEval: * @node: the node to to use as the context node * @str: the XPath expression * @ctx: the XPath context * * Evaluate the XPath Location Path in the given context. The node 'node' * is set as the context node. The context node is not restored. * * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. * the caller has to free the object. */ xmlXPathObjectPtr xmlXPathNodeEval(xmlNodePtr node, const xmlChar *str, xmlXPathContextPtr ctx) { if (str == NULL) return(NULL); if (xmlXPathSetContextNode(node, ctx) < 0) return(NULL); return(xmlXPathEval(str, ctx)); } /** * xmlXPathEvalExpression: * @str: the XPath expression * @ctxt: the XPath context * * Evaluate the XPath expression in the given context. * * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. * the caller has to free the object. */ xmlXPathObjectPtr xmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) { xmlXPathParserContextPtr pctxt; xmlXPathObjectPtr res, tmp; int stack = 0; CHECK_CTXT(ctxt) xmlXPathInit(); pctxt = xmlXPathNewParserContext(str, ctxt); if (pctxt == NULL) return NULL; xmlXPathEvalExpr(pctxt); if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) { xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); res = NULL; } else { res = valuePop(pctxt); } do { tmp = valuePop(pctxt); if (tmp != NULL) { xmlXPathReleaseObject(ctxt, tmp); stack++; } } while (tmp != NULL); if ((stack != 0) && (res != NULL)) { xmlGenericError(xmlGenericErrorContext, "xmlXPathEvalExpression: %d object left on the stack\n", stack); } xmlXPathFreeParserContext(pctxt); return(res); } /************************************************************************ * * * Extra functions not pertaining to the XPath spec * * * ************************************************************************/ /** * xmlXPathEscapeUriFunction: * @ctxt: the XPath Parser context * @nargs: the number of arguments * * Implement the escape-uri() XPath function * string escape-uri(string $str, bool $escape-reserved) * * This function applies the URI escaping rules defined in section 2 of [RFC * 2396] to the string supplied as $uri-part, which typically represents all * or part of a URI. The effect of the function is to replace any special * character in the string by an escape sequence of the form %xx%yy..., * where xxyy... is the hexadecimal representation of the octets used to * represent the character in UTF-8. * * The set of characters that are escaped depends on the setting of the * boolean argument $escape-reserved. * * If $escape-reserved is true, all characters are escaped other than lower * case letters a-z, upper case letters A-Z, digits 0-9, and the characters * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!" * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and * A-F). * * If $escape-reserved is false, the behavior differs in that characters * referred to in [RFC 2396] as reserved characters are not escaped. These * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",". * * [RFC 2396] does not define whether escaped URIs should use lower case or * upper case for hexadecimal digits. To ensure that escaped URIs can be * compared using string comparison functions, this function must always use * the upper-case letters A-F. * * Generally, $escape-reserved should be set to true when escaping a string * that is to form a single part of a URI, and to false when escaping an * entire URI or URI reference. * * In the case of non-ascii characters, the string is encoded according to * utf-8 and then converted according to RFC 2396. * * Examples * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true()) * returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean" * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false()) * returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean" * */ static void xmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) { xmlXPathObjectPtr str; int escape_reserved; xmlBufPtr target; xmlChar *cptr; xmlChar escape[4]; CHECK_ARITY(2); escape_reserved = xmlXPathPopBoolean(ctxt); CAST_TO_STRING; str = valuePop(ctxt); target = xmlBufCreate(); escape[0] = '%'; escape[3] = 0; if (target) { for (cptr = str->stringval; *cptr; cptr++) { if ((*cptr >= 'A' && *cptr <= 'Z') || (*cptr >= 'a' && *cptr <= 'z') || (*cptr >= '0' && *cptr <= '9') || *cptr == '-' || *cptr == '_' || *cptr == '.' || *cptr == '!' || *cptr == '~' || *cptr == '*' || *cptr == '\''|| *cptr == '(' || *cptr == ')' || (*cptr == '%' && ((cptr[1] >= 'A' && cptr[1] <= 'F') || (cptr[1] >= 'a' && cptr[1] <= 'f') || (cptr[1] >= '0' && cptr[1] <= '9')) && ((cptr[2] >= 'A' && cptr[2] <= 'F') || (cptr[2] >= 'a' && cptr[2] <= 'f') || (cptr[2] >= '0' && cptr[2] <= '9'))) || (!escape_reserved && (*cptr == ';' || *cptr == '/' || *cptr == '?' || *cptr == ':' || *cptr == '@' || *cptr == '&' || *cptr == '=' || *cptr == '+' || *cptr == '$' || *cptr == ','))) { xmlBufAdd(target, cptr, 1); } else { if ((*cptr >> 4) < 10) escape[1] = '0' + (*cptr >> 4); else escape[1] = 'A' - 10 + (*cptr >> 4); if ((*cptr & 0xF) < 10) escape[2] = '0' + (*cptr & 0xF); else escape[2] = 'A' - 10 + (*cptr & 0xF); xmlBufAdd(target, &escape[0], 3); } } } valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, xmlBufContent(target))); xmlBufFree(target); xmlXPathReleaseObject(ctxt->context, str); } /** * xmlXPathRegisterAllFunctions: * @ctxt: the XPath context * * Registers all default XPath functions in this context */ void xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt) { xmlXPathRegisterFunc(ctxt, (const xmlChar *)"boolean", xmlXPathBooleanFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"ceiling", xmlXPathCeilingFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"count", xmlXPathCountFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"concat", xmlXPathConcatFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"contains", xmlXPathContainsFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"id", xmlXPathIdFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"false", xmlXPathFalseFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"floor", xmlXPathFloorFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"last", xmlXPathLastFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"lang", xmlXPathLangFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"local-name", xmlXPathLocalNameFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"not", xmlXPathNotFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"name", xmlXPathNameFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"namespace-uri", xmlXPathNamespaceURIFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"normalize-space", xmlXPathNormalizeFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"number", xmlXPathNumberFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"position", xmlXPathPositionFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"round", xmlXPathRoundFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string", xmlXPathStringFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string-length", xmlXPathStringLengthFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"starts-with", xmlXPathStartsWithFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring", xmlXPathSubstringFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-before", xmlXPathSubstringBeforeFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-after", xmlXPathSubstringAfterFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"sum", xmlXPathSumFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"true", xmlXPathTrueFunction); xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate", xmlXPathTranslateFunction); xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri", (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions", xmlXPathEscapeUriFunction); } #endif /* LIBXML_XPATH_ENABLED */ #define bottom_xpath #include "elfgcchack.h" libxml2-2.9.1+dfsg1/libxml2.spec0000644000175000017500000001076012134171766015015 0ustar aronaronSummary: Library providing XML and HTML support Name: libxml2 Version: 2.9.1 Release: 1%{?dist}%{?extra_release} License: MIT Group: Development/Libraries Source: ftp://xmlsoft.org/libxml2/libxml2-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-root BuildRequires: python python-devel zlib-devel pkgconfig xz-devel URL: http://xmlsoft.org/ %description This library allows to manipulate XML files. It includes support to read, modify and write XML and HTML files. There is DTDs support this includes parsing and validation even with complex DtDs, either at parse time or later once the document has been modified. The output can be a simple SAX stream or and in-memory DOM like representations. In this case one can use the built-in XPath and XPointer implementation to select sub nodes or ranges. A flexible Input/Output mechanism is available, with existing HTTP and FTP modules and combined to an URI library. %package devel Summary: Libraries, includes, etc. to develop XML and HTML applications Group: Development/Libraries Requires: libxml2 = %{version}-%{release} Requires: zlib-devel Requires: xz-devel Requires: pkgconfig %description devel Libraries, include files, etc you can use to develop XML applications. This library allows to manipulate XML files. It includes support to read, modify and write XML and HTML files. There is DTDs support this includes parsing and validation even with complex DtDs, either at parse time or later once the document has been modified. The output can be a simple SAX stream or and in-memory DOM like representations. In this case one can use the built-in XPath and XPointer implementation to select sub nodes or ranges. A flexible Input/Output mechanism is available, with existing HTTP and FTP modules and combined to an URI library. %package static Summary: Static library for libxml2 Group: Development/Libraries Requires: libxml2 = %{version}-%{release} %description static Static library for libxml2 provided for specific uses or shaving a few microseconds when parsing, do not link to them for generic purpose packages. %package python Summary: Python bindings for the libxml2 library Group: Development/Libraries Requires: libxml2 = %{version}-%{release} %description python The libxml2-python package contains a module that permits applications written in the Python programming language to use the interface supplied by the libxml2 library to manipulate XML files. This library allows to manipulate XML files. It includes support to read, modify and write XML and HTML files. There is DTDs support this includes parsing and validation even with complex DTDs, either at parse time or later once the document has been modified. %prep %setup -q %build %configure make %{_smp_mflags} %install rm -fr %{buildroot} make install DESTDIR=%{buildroot} rm -f $RPM_BUILD_ROOT%{_libdir}/*.la rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-%{version}/* rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-python-%{version}/* (cd doc/examples ; make clean ; rm -rf .deps Makefile) gzip -9 -c doc/libxml2-api.xml > doc/libxml2-api.xml.gz %check make runtests %clean rm -fr %{buildroot} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %defattr(-, root, root) %doc AUTHORS NEWS README Copyright TODO %doc %{_mandir}/man1/xmllint.1* %doc %{_mandir}/man1/xmlcatalog.1* %doc %{_mandir}/man3/libxml.3* %{_libdir}/lib*.so.* %{_bindir}/xmllint %{_bindir}/xmlcatalog %files devel %defattr(-, root, root) %doc %{_mandir}/man1/xml2-config.1* %doc AUTHORS NEWS README Copyright %doc doc/*.html doc/html doc/*.gif doc/*.png %doc doc/tutorial doc/libxml2-api.xml.gz %doc doc/examples %doc %dir %{_datadir}/gtk-doc/html/libxml2 %doc %{_datadir}/gtk-doc/html/libxml2/*.devhelp %doc %{_datadir}/gtk-doc/html/libxml2/*.html %doc %{_datadir}/gtk-doc/html/libxml2/*.png %doc %{_datadir}/gtk-doc/html/libxml2/*.css %{_libdir}/lib*.so %{_libdir}/*.sh %{_includedir}/* %{_bindir}/xml2-config %{_datadir}/aclocal/libxml.m4 %{_libdir}/pkgconfig/libxml-2.0.pc %files static %defattr(-, root, root) %{_libdir}/*a %files python %defattr(-, root, root) %{_libdir}/python*/site-packages/libxml2.py* %{_libdir}/python*/site-packages/drv_libxml2.py* %{_libdir}/python*/site-packages/libxml2mod* %doc python/TODO %doc python/libxml2class.txt %doc python/tests/*.py %doc doc/*.py %doc doc/python.html %changelog * Fri Apr 19 2013 Daniel Veillard - upstream release 2.9.1 see http://xmlsoft.org/news.html libxml2-2.9.1+dfsg1/xmlmodule.c0000644000175000017500000002451412113312344014726 0ustar aronaron/* * xmlmodule.c : basic API for dynamic module loading added 2.6.17 * * See Copyright for the status of this software. * * joelwreed@comcast.net * * http://www.fortran-2000.com/ArnaudRecipes/sharedlib.html */ #define IN_LIBXML #include "libxml.h" #include #include #include #include #include #ifdef LIBXML_MODULES_ENABLED struct _xmlModule { unsigned char *name; void *handle; }; static void *xmlModulePlatformOpen(const char *name); static int xmlModulePlatformClose(void *handle); static int xmlModulePlatformSymbol(void *handle, const char *name, void **result); /************************************************************************ * * * module memory error handler * * * ************************************************************************/ /** * xmlModuleErrMemory: * @extra: extra information * * Handle an out of memory condition */ static void xmlModuleErrMemory(xmlModulePtr module, const char *extra) { const char *name = NULL; if (module != NULL) { name = (const char *) module->name; } __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, name, NULL, 0, 0, "Memory allocation failed : %s\n", extra); } /** * xmlModuleOpen: * @name: the module name * @options: a set of xmlModuleOption * * Opens a module/shared library given its name or path * NOTE: that due to portability issues, behaviour can only be * guaranteed with @name using ASCII. We canot guarantee that * an UTF-8 string would work, which is why name is a const char * * and not a const xmlChar * . * TODO: options are not yet implemented. * * Returns a handle for the module or NULL in case of error */ xmlModulePtr xmlModuleOpen(const char *name, int options ATTRIBUTE_UNUSED) { xmlModulePtr module; module = (xmlModulePtr) xmlMalloc(sizeof(xmlModule)); if (module == NULL) { xmlModuleErrMemory(NULL, "creating module"); return (NULL); } memset(module, 0, sizeof(xmlModule)); module->handle = xmlModulePlatformOpen(name); if (module->handle == NULL) { xmlFree(module); __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, name, NULL, 0, 0, "failed to open %s\n", name); return(NULL); } module->name = xmlStrdup((const xmlChar *) name); return (module); } /** * xmlModuleSymbol: * @module: the module * @name: the name of the symbol * @symbol: the resulting symbol address * * Lookup for a symbol address in the given module * NOTE: that due to portability issues, behaviour can only be * guaranteed with @name using ASCII. We canot guarantee that * an UTF-8 string would work, which is why name is a const char * * and not a const xmlChar * . * * Returns 0 if the symbol was found, or -1 in case of error */ int xmlModuleSymbol(xmlModulePtr module, const char *name, void **symbol) { int rc = -1; if ((NULL == module) || (symbol == NULL)) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, NULL, NULL, 0, 0, "null parameter\n"); return rc; } rc = xmlModulePlatformSymbol(module->handle, name, symbol); if (rc == -1) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, name, NULL, 0, 0, "failed to find symbol: %s\n", (name == NULL ? "NULL" : name)); return rc; } return rc; } /** * xmlModuleClose: * @module: the module handle * * The close operations unload the associated module and free the * data associated to the module. * * Returns 0 in case of success, -1 in case of argument error and -2 * if the module could not be closed/unloaded. */ int xmlModuleClose(xmlModulePtr module) { int rc; if (NULL == module) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, 0, NULL, NULL, 0, 0, "null module pointer\n"); return -1; } rc = xmlModulePlatformClose(module->handle); if (rc != 0) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, 0, (const char *) module->name, NULL, 0, 0, "failed to close: %s\n", module->name); return -2; } rc = xmlModuleFree(module); return (rc); } /** * xmlModuleFree: * @module: the module handle * * The free operations free the data associated to the module * but does not unload the associated shared library which may still * be in use. * * Returns 0 in case of success, -1 in case of argument error */ int xmlModuleFree(xmlModulePtr module) { if (NULL == module) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "null module pointer\n"); return -1; } xmlFree(module->name); xmlFree(module); return (0); } #if defined(HAVE_DLOPEN) && !defined(_WIN32) #ifdef HAVE_DLFCN_H #include #endif #ifndef RTLD_GLOBAL /* For Tru64 UNIX 4.0 */ #define RTLD_GLOBAL 0 #endif /** * xmlModulePlatformOpen: * @name: path to the module * * returns a handle on success, and zero on error. */ static void * xmlModulePlatformOpen(const char *name) { return dlopen(name, RTLD_GLOBAL | RTLD_NOW); } /* * xmlModulePlatformClose: * @handle: handle to the module * * returns 0 on success, and non-zero on error. */ static int xmlModulePlatformClose(void *handle) { return dlclose(handle); } /* * xmlModulePlatformSymbol: * http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html * returns 0 on success and the loaded symbol in result, and -1 on error. */ static int xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) { *symbol = dlsym(handle, name); if (dlerror() != NULL) { return -1; } return 0; } #else /* ! HAVE_DLOPEN */ #ifdef HAVE_SHLLOAD /* HAVE_SHLLOAD */ #ifdef HAVE_DL_H #include #endif /* * xmlModulePlatformOpen: * returns a handle on success, and zero on error. */ static void * xmlModulePlatformOpen(const char *name) { return shl_load(name, BIND_IMMEDIATE, 0L); } /* * xmlModulePlatformClose: * returns 0 on success, and non-zero on error. */ static int xmlModulePlatformClose(void *handle) { return shl_unload(handle); } /* * xmlModulePlatformSymbol: * http://docs.hp.com/en/B2355-90683/shl_load.3X.html * returns 0 on success and the loaded symbol in result, and -1 on error. */ static int xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) { int rc; errno = 0; rc = shl_findsym(&handle, name, TYPE_UNDEFINED, symbol); return rc; } #endif /* HAVE_SHLLOAD */ #endif /* ! HAVE_DLOPEN */ #ifdef _WIN32 #include /* * xmlModulePlatformOpen: * returns a handle on success, and zero on error. */ static void * xmlModulePlatformOpen(const char *name) { return LoadLibraryA(name); } /* * xmlModulePlatformClose: * returns 0 on success, and non-zero on error. */ static int xmlModulePlatformClose(void *handle) { int rc; rc = FreeLibrary(handle); return (0 == rc); } /* * xmlModulePlatformSymbol: * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocaddress.asp * returns 0 on success and the loaded symbol in result, and -1 on error. */ static int xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) { #ifdef _WIN32_WCE /* * GetProcAddressA seems only available on WinCE */ *symbol = GetProcAddressA(handle, name); #else *symbol = GetProcAddress(handle, name); #endif return (NULL == *symbol) ? -1 : 0; } #endif /* _WIN32 */ #ifdef HAVE_BEOS #include /* * xmlModulePlatformOpen: * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html * returns a handle on success, and zero on error. */ static void * xmlModulePlatformOpen(const char *name) { return (void *) load_add_on(name); } /* * xmlModulePlatformClose: * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html * returns 0 on success, and non-zero on error. */ static int xmlModulePlatformClose(void *handle) { status_t rc; rc = unload_add_on((image_id) handle); if (rc == B_OK) return 0; else return -1; } /* * xmlModulePlatformSymbol: * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html * returns 0 on success and the loaded symbol in result, and -1 on error. */ static int xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) { status_t rc; rc = get_image_symbol((image_id) handle, name, B_SYMBOL_TYPE_ANY, symbol); return (rc == B_OK) ? 0 : -1; } #endif /* HAVE_BEOS */ #ifdef HAVE_OS2 #include /* * xmlModulePlatformOpen: * os2 api info: http://www.edm2.com/os2api/Dos/DosLoadModule.html * returns a handle on success, and zero on error. */ static void * xmlModulePlatformOpen(const char *name) { char errbuf[256]; void *handle; int rc; rc = DosLoadModule(errbuf, sizeof(errbuf) - 1, name, &handle); if (rc) return 0; else return (handle); } /* * xmlModulePlatformClose: * os2 api info: http://www.edm2.com/os2api/Dos/DosFreeModule.html * returns 0 on success, and non-zero on error. */ static int xmlModulePlatformClose(void *handle) { return DosFreeModule(handle); } /* * xmlModulePlatformSymbol: * os2 api info: http://www.edm2.com/os2api/Dos/DosQueryProcAddr.html * returns 0 on success and the loaded symbol in result, and -1 on error. */ static int xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) { int rc; rc = DosQueryProcAddr(handle, 0, name, symbol); return (rc == NO_ERROR) ? 0 : -1; } #endif /* HAVE_OS2 */ #define bottom_xmlmodule #include "elfgcchack.h" #endif /* LIBXML_MODULES_ENABLED */ libxml2-2.9.1+dfsg1/missing0000755000175000017500000002415212134171754014164 0ustar aronaron#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libxml2-2.9.1+dfsg1/check-xinclude-test-suite.py0000755000175000017500000001232511234335462020131 0ustar aronaron#!/usr/bin/python import sys import time import os import string sys.path.insert(0, "python") import libxml2 # # the testsuite description # DIR="xinclude-test-suite" CONF="testdescr.xml" LOG="check-xinclude-test-suite.log" log = open(LOG, "w") os.chdir(DIR) test_nr = 0 test_succeed = 0 test_failed = 0 test_error = 0 # # Error and warning handlers # error_nr = 0 error_msg = '' def errorHandler(ctx, str): global error_nr global error_msg if string.find(str, "error:") >= 0: error_nr = error_nr + 1 if len(error_msg) < 300: if len(error_msg) == 0 or error_msg[-1] == '\n': error_msg = error_msg + " >>" + str else: error_msg = error_msg + str libxml2.registerErrorHandler(errorHandler, None) def testXInclude(filename, id): global error_nr global error_msg global log error_nr = 0 error_msg = '' print "testXInclude(%s, %s)" % (filename, id) return 1 def runTest(test, basedir): global test_nr global test_failed global test_error global test_succeed global error_msg global log fatal_error = 0 uri = test.prop('href') id = test.prop('id') type = test.prop('type') if uri == None: print "Test without ID:", uri return -1 if id == None: print "Test without URI:", id return -1 if type == None: print "Test without URI:", id return -1 if basedir != None: URI = basedir + "/" + uri else: URI = uri if os.access(URI, os.R_OK) == 0: print "Test %s missing: base %s uri %s" % (URI, basedir, uri) return -1 expected = None outputfile = None diff = None if type != 'error': output = test.xpathEval('string(output)') if output == 'No output file.': output = None if output == '': output = None if output != None: if basedir != None: output = basedir + "/" + output if os.access(output, os.R_OK) == 0: print "Result for %s missing: %s" % (id, output) output = None else: try: f = open(output) expected = f.read() outputfile = output except: print "Result for %s unreadable: %s" % (id, output) try: # print "testing %s" % (URI) doc = libxml2.parseFile(URI) except: doc = None if doc != None: res = doc.xincludeProcess() if res >= 0 and expected != None: result = doc.serialize() if result != expected: print "Result for %s differs" % (id) open("xinclude.res", "w").write(result) diff = os.popen("diff %s xinclude.res" % outputfile).read() doc.freeDoc() else: print "Failed to parse %s" % (URI) res = -1 test_nr = test_nr + 1 if type == 'success': if res > 0: test_succeed = test_succeed + 1 elif res == 0: test_failed = test_failed + 1 print "Test %s: no substitution done ???" % (id) elif res < 0: test_error = test_error + 1 print "Test %s: failed valid XInclude processing" % (id) elif type == 'error': if res > 0: test_error = test_error + 1 print "Test %s: failed to detect invalid XInclude processing" % (id) elif res == 0: test_failed = test_failed + 1 print "Test %s: Invalid but no substitution done" % (id) elif res < 0: test_succeed = test_succeed + 1 elif type == 'optional': if res > 0: test_succeed = test_succeed + 1 else: print "Test %s: failed optional test" % (id) # Log the ontext if res != 1: log.write("Test ID %s\n" % (id)) log.write(" File: %s\n" % (URI)) content = string.strip(test.content) while content[-1] == '\n': content = content[0:-1] log.write(" %s:%s\n\n" % (type, content)) if error_msg != '': log.write(" ----\n%s ----\n" % (error_msg)) error_msg = '' log.write("\n") if diff != None: log.write("diff from test %s:\n" %(id)) log.write(" -----------\n%s\n -----------\n" % (diff)); return 0 def runTestCases(case): creator = case.prop('creator') if creator != None: print "=>", creator base = case.getBase(None) basedir = case.prop('basedir') if basedir != None: base = libxml2.buildURI(basedir, base) test = case.children while test != None: if test.name == 'testcase': runTest(test, base) if test.name == 'testcases': runTestCases(test) test = test.next conf = libxml2.parseFile(CONF) if conf == None: print "Unable to load %s" % CONF sys.exit(1) testsuite = conf.getRootElement() if testsuite.name != 'testsuite': print "Expecting TESTSUITE root element: aborting" sys.exit(1) profile = testsuite.prop('PROFILE') if profile != None: print profile start = time.time() case = testsuite.children while case != None: if case.name == 'testcases': old_test_nr = test_nr old_test_succeed = test_succeed old_test_failed = test_failed old_test_error = test_error runTestCases(case) print " Ran %d tests: %d suceeded, %d failed and %d generated an error" % ( test_nr - old_test_nr, test_succeed - old_test_succeed, test_failed - old_test_failed, test_error - old_test_error) case = case.next conf.freeDoc() log.close() print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % ( test_nr, test_succeed, test_failed, test_error, time.time() - start) libxml2-2.9.1+dfsg1/vms/0000755000175000017500000000000012113312343013352 5ustar aronaronlibxml2-2.9.1+dfsg1/vms/diffs.vms0000644000175000017500000001310511234335463015207 0ustar aronaron-------------------------------------------------------------------------- GLOBALS.C 105a106 > int xmlDoValidityCheckingDefaultValue = 0; 111,121c112,113 < #if defined(VMS) || defined(__VMS) < #define PLATFORM_VMS < /* int xmlDoValidityCheckingDefaultVal = 0; < * int xmlSubstituteEntitiesDefaultVal = 0; < */ < #define xmlDoValidityCheckingDefaultValue xmlDoValidityCheckingDefaultVal < #define xmlSubstituteEntitiesDefaultValue xmlSubstituteEntitiesDefaultVal < #else < int xmlDoValidityCheckingDefaultValue = 0; < int xmlSubstituteEntitiesDefaultValue = 0; < #endif --- > int xmlSubstituteEntitiesDefaultValue = 0; > 289,291d280 < #ifdef PLATFORM_VMS < gs->xmlDoValidityCheckingDefaultVal = 0; < #else 293,294d281 < #endif < 316,318d302 < #ifdef PLATFORM_VMS < gs->xmlSubstituteEntitiesDefaultVal = 0; < #else 320d303 < #endif 404,419c387,390 < #ifdef PLATFORM_VMS < extern int xmlDoValidityCheckingDefaultVal; < #undef xmlDoValidityCheckingDefaultVal < int * < __xmlDoValidityCheckingDefVal(void) { < if (IS_MAIN_THREAD) < return (&xmlDoValidityCheckingDefaultVal); < else < return (&xmlGetGlobalState()->xmlDoValidityCheckingDefaultVal); < } < #define __xmlDoValidityCheckingDefaultValue __xmlDoValidityCheckingDefVal < #else < extern int xmlDoValidityCheckingDefaultValue; < #undef xmlDoValidityCheckingDefaultValue < int * < __xmlDoValidityCheckingDefaultValue(void) { --- > extern int xmlDoValidityCheckingDefaultValue; > #undef xmlDoValidityCheckingDefaultValue > int * > __xmlDoValidityCheckingDefaultValue(void) { 424,425c395 < } < #endif --- > } 577,592c547,550 < #ifdef PLATFORM_VMS < extern int xmlSubstituteEntitiesDefaultVal; < #undef xmlSubstituteEntitiesDefaultVal < int * < __xmlSubsEntitiesDefaultValue(void) { < if (IS_MAIN_THREAD) < return (&xmlSubstituteEntitiesDefaultVal); < else < return (&xmlGetGlobalState()->xmlSubstituteEntitiesDefaultVal); < } < #define __xmlSubstituteEntitiesDefaultValue __xmlSubsEntitiesDefaultValue < #else < extern int xmlSubstituteEntitiesDefaultValue; < #undef xmlSubstituteEntitiesDefaultValue < int * < __xmlSubstituteEntitiesDefaultValue(void) { --- > extern int xmlSubstituteEntitiesDefaultValue; > #undef xmlSubstituteEntitiesDefaultValue > int * > __xmlSubstituteEntitiesDefaultValue(void) { 597,598c555 < } < #endif --- > } -------------------------------------------------------------------------- TRIO.C 113,116d112 < #if defined(VMS) || defined(__VMS) < # include < #endif /* Platform is VMS */ < 123d118 < -------------------------------------------------------------------------- GLOBALS.H 78,86c78,79 < #if defined(VMS) || defined(__VMS) < int xmlSubstituteEntitiesDefaultVal; /* 31 character name limit */ < int xmlDoValidityCheckingDefaultVal; < #define xmlSubstituteEntitiesDefaultValue xmlSubstituteEntitiesDefaultVal < #define xmlDoValidityCheckingDefaultValue xmlDoValidityCheckingDefaultVal < #else < int xmlSubstituteEntitiesDefaultValue; < int xmlDoValidityCheckingDefaultValue; < #endif --- > int xmlSubstituteEntitiesDefaultValue; > int xmlDoValidityCheckingDefaultValue; 211,226c204,209 < #if defined(VMS) || defined(__VMS) < #ifdef LIBXML_THREAD_ENABLED < extern int *__xmlDoValidityCheckingDefaultVal(void); < #define xmlDoValidityCheckingDefaultVal \ < (*(__xmlDoValidityCheckingDefaultVal())) < #else < LIBXML_DLL_IMPORT extern int xmlDoValidityCheckingDefaultVal; < #endif < #else < #ifdef LIBXML_THREAD_ENABLED < extern int *__xmlDoValidityCheckingDefaultValue(void); < #define xmlDoValidityCheckingDefaultValue \ < (*(__xmlDoValidityCheckingDefaultValue())) < #else < LIBXML_DLL_IMPORT extern int xmlDoValidityCheckingDefaultValue; < #endif --- > #ifdef LIBXML_THREAD_ENABLED > extern int *__xmlDoValidityCheckingDefaultValue(void); > #define xmlDoValidityCheckingDefaultValue \ > (*(__xmlDoValidityCheckingDefaultValue())) > #else > LIBXML_DLL_IMPORT extern int xmlDoValidityCheckingDefaultValue; 317,332c300,305 < #if defined(VMS) || defined(__VMS) < #ifdef LIBXML_THREAD_ENABLED < extern int *__xmlSubsEntitiesDefaultValue(void); < #define xmlSubsEntitiesDefaultValue \ < (*(__xmlSubsEntitiesDefaultValue())) < #else < LIBXML_DLL_IMPORT extern int xmlSubsEntitiesDefaultValue; < #endif < #else < #ifdef LIBXML_THREAD_ENABLED < extern int *__xmlSubstituteEntitiesDefaultValue(void); < #define xmlSubstituteEntitiesDefaultValue \ < (*(__xmlSubstituteEntitiesDefaultValue())) < #else < LIBXML_DLL_IMPORT extern int xmlSubstituteEntitiesDefaultValue; < #endif --- > #ifdef LIBXML_THREAD_ENABLED > extern int *__xmlSubstituteEntitiesDefaultValue(void); > #define xmlSubstituteEntitiesDefaultValue \ > (*(__xmlSubstituteEntitiesDefaultValue())) > #else > LIBXML_DLL_IMPORT extern int xmlSubstituteEntitiesDefaultValue; -------------------------------------------------------------------------- XMLIO.H 79,82d78 < #if defined(VMS) || defined(__VMS) < void xmlRegisterDefInputCallbacks (void); < #define xmlRegisterDefaultInputCallbacks xmlRegisterDefInputCallbacks < #else 84d79 < #endif 130,133d124 < #if defined(VMS) || defined(__VMS) < void xmlRegisterDefOutputCallbacks(void); < #define xmlRegisterDefaultOutputCallbacks xmlRegisterDefOutputCallbacks < #else 135,136d125 < #endif < -------------------------------------------------------------------------- XPATHINTERNALS.H 433,436d432 < #if defined(VMS) || defined(__VMS) < void xmlXPathRegisteredVarsCleanup(xmlXPathContextPtr ctxt); < #define xmlXPathRegisteredVariablesCleanup xmlXPathRegisteredVarsCleanup < #else 438d433 < #endif libxml2-2.9.1+dfsg1/vms/config.vms0000755000175000017500000001571011234335463015370 0ustar aronaron/* config.h */ #define VMS 1 /* Define if you have the strftime function. */ #define HAVE_STRFTIME 1 /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 #undef PACKAGE #undef VERSION #undef HAVE_LIBZ #undef HAVE_LIBM #undef HAVE_ISINF #if defined(_IEEE_FP) && (__CRTL_VER >= 60200000) # define HAVE_ISNAN 1 #endif #undef HAVE_LIBHISTORY #undef HAVE_LIBREADLINE /* Define if you have the class function. */ #undef HAVE_CLASS /* Define if you have the finite function. */ #undef HAVE_FINITE /* Define if you have the fp_class function. */ #define HAVE_FP_CLASS 1 /* Define if you have the fpclass function. */ #undef HAVE_FPCLASS /* Define if you have the isnand function. */ #undef HAVE_ISNAND /* Define if you have the localtime function. */ #define HAVE_LOCALTIME 1 /* Define if you have the snprintf function. */ #undef HAVE_SNPRINTF /* Define if you have the strdup function. */ #define HAVE_STRDUP 1 /* Define if you have the strerror function. */ #define HAVE_STRERROR 1 /* Define if you have the strftime function. */ #define HAVE_STRFTIME 1 /* Define if you have the strndup function. */ #undef HAVE_STRNDUP /* Define if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define if you have the header file. */ #define HAVE_CTYPE_H 1 /* Define if you have the header file. */ #define HAVE_DIRENT_H 1 /* Define if you have the header file. */ #define HAVE_ERRNO_H 1 /* Define if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define if you have the header file. */ #define HAVE_FLOAT_H 1 /* Define if you have the header file. */ #define HAVE_FP_CLASS_H 1 /* Define if you have the header file. */ #undef HAVE_IEEEFP_H /* Define if you have the header file. */ #undef HAVE_MALLOC_H /* Define if you have the header file. */ #define HAVE_MATH_H 1 /* Define if you have the header file. */ #undef HAVE_NAN_H /* Define if you have the header file. */ #undef HAVE_NDIR_H /* Define if you have the header file. */ #define HAVE_NETDB_H 1 /* Define if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define if you have the header file. */ #define HAVE_STDARG_H 1 /* Define if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strdup' function. */ #define HAVE_STRDUP 1 /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 /* Define to 1 if you have the `strftime' function. */ #define HAVE_STRFTIME 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the `strndup' function. */ #undef HAVE_STRNDUP /* Define if you have the header file. */ #undef HAVE_SYS_DIR_H /* Define if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define if you have the header file. */ #undef HAVE_SYS_NDIR_H /* Define if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define if you have the header file. */ #define HAVE_SYS_SOCKET_H 1 /* Define if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define if you have the header file. */ #define HAVE_TIME_H 1 /* Define if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define if you have the header file. */ #undef HAVE_ZLIB_H /* Name of package */ #undef PACKAGE /* Version number of package */ #undef VERSION /* Up to this point this is just a hard-wired version of * config.h. After this will be anything else we need * that is VMS-specific. */ /* For best results, compile with /NAMES=(SHORTENED), which requires * DEC C 5.7 or later. For older compilers, the shortened names below * are the same ones the mangler generates in C 5.7 and later. These may * work, though there will probably be some conflicts with redefinitions * in globals.h. */ #if __DECC_VER < 57000000 /* 0 1 2 3 0 1 2 3 * 123456789012345678901234567890123456789 1234567890123456789012345678901 */ #define __xmlDoValidityCheckingDefaultValue __xmlDoValidityChecking3qad3pq$ #define __xmlSubstituteEntitiesDefaultValue __xmlSubstituteEntities0pij13u$ #define trio_locale_set_thousand_separator trio_locale_set_thousan259ikkk$ #define xmlDoValidityCheckingDefaultValue xmlDoValidityCheckingDe1bcsei4$ #define xmlParseBalancedChunkMemoryRecover xmlParseBalancedChunkMe1lu1e86$ #define xmlParseElementChildrenContentDecl xmlParseElementChildren1mp6pcb$ #define xmlParserInputBufferCreateFilename xmlParserInputBufferCre36lujn2$ #define xmlRegisterDefaultInputCallbacks xmlRegisterDefaultInput3vin0cp$ #define xmlRegisterDefaultOutputCallbacks xmlRegisterDefaultOutpu0q443dd$ #define xmlSubstituteEntitiesDefaultValue xmlSubstituteEntitiesDe28k2c80$ #define xmlUCSIsAlphabeticPresentationForms xmlUCSIsAlphabeticPrese2qr24s3$ #define xmlUCSIsArabicPresentationFormsB xmlUCSIsArabicPresentat1gajvg8$ #define xmlUCSIsArabicPresentationFormsA xmlUCSIsArabicPresentat3sq1bti$ #define xmlUCSIsCJKCompatibilityIdeographsSupplement xmlUCSIsCJKCompatibilit0or40ki$ #define xmlUCSIsCJKCompatibilityIdeographs xmlUCSIsCJKCompatibilit2nodmc5$ #define xmlUCSIsCJKSymbolsandPunctuation xmlUCSIsCJKSymbolsandPu0a3i7ra$ #define xmlUCSIsCJKUnifiedIdeographsExtensionA xmlUCSIsCJKUnifiedIdeog11ig3fd$ #define xmlUCSIsCJKUnifiedIdeographsExtensionB xmlUCSIsCJKUnifiedIdeog3d22n2n$ #define xmlUCSIsCombiningDiacriticalMarks xmlUCSIsCombiningDiacri3tj3nl8$ #define xmlUCSIsCombiningMarksforSymbols xmlUCSIsCombiningMarksf3ftqd7s$ #define xmlUCSIsEnclosedCJKLettersandMonths xmlUCSIsEnclosedCJKLett0nq67g4$ #define xmlUCSIsHalfwidthandFullwidthForms xmlUCSIsHalfwidthandFul047l0a1$ #define xmlUCSIsHighPrivateUseSurrogates xmlUCSIsHighPrivateUseS071kh83$ #define xmlUCSIsIdeographicDescriptionCharacters xmlUCSIsIdeographicDesc1rovf8g$ #define xmlUCSIsMathematicalAlphanumericSymbols xmlUCSIsMathematicalAlp2ag8r44$ #define xmlUCSIsOpticalCharacterRecognition xmlUCSIsOpticalCharacte1juuh06$ #define xmlUCSIsSuperscriptsandSubscripts xmlUCSIsSuperscriptsand3fi4eup$ #define xmlUCSIsUnifiedCanadianAboriginalSyllabics xmlUCSIsUnifiedCanadian0lbvi9b$ #define xmlValidCtxtNormalizeAttributeValue xmlValidCtxtNormalizeAt0q11n5f$ #define xmlXPathRegisteredVariablesCleanup xmlXPathRegisteredVaria1uvs4uc$ #endif #define xmlBufferWriteChar xmlBufferWriteChar2 libxml2-2.9.1+dfsg1/vms/build_libxml.com0000755000175000017500000002034612113312343016530 0ustar aronaron$! BUILD_LIBXML.COM $! $! Build the LIBXML library $! $! Arguments: $! $! "DEBUG" - build everything in debug $! $! This procedure creates an object library XML_LIBDIR:LIBXML.OLB directory. $! After the library is built, you can link LIBXML routines into $! your code with the command $! $! $ LINK your_modules,XML_LIBDIR:LIBXML.OLB/LIBRARY $! $! Change History $! -------------- $! Command file author : John A Fotheringham (jaf@jafsoft.com) $! Update history : 19 March 2008 Tycho Hilhorst $! - added module schematron.c (prevent xmllint errors) $! - added /DEF and /INCLUDE options to cc_opts to tell $! config.h is available, and where to find it $! : 13 October 2003 Craig Berry (craigberry@mac.com) $! more new module additions $! : 25 April 2003 Craig Berry (craigberry@mac.com) $! added xmlreader.c and relaxng.c to source list $! : 28 September 2002 Craig Berry (craigberry@mac.com) $! updated to work with current sources $! miscellaneous enhancements to build process $! $!- configuration ------------------------------------------------------------- $! $!- compile command. If p1="nowarn" suppress the expected warning types $! $ cc_opts = "/DEF=HAVE_CONFIG_H/NAMES=(SHORTENED)/FLOAT=IEEE/IEEE_MODE=DENORM_RESULTS/INCLUDE=xml_srcdir" $! $ if p1.eqs."DEBUG" .or. p2.eqs."DEBUG" $ then $ debug = "Y" $ cc_command = "CC''cc_opts'/DEBUG/NOOPTIMIZE/LIST/SHOW=ALL" $ else $ debug = "N" $ cc_command = "CC''cc_opts'" $ endif $! $!- list of sources to be built into the LIBXML library. Compare this list $! to the definition of "libxml2_la_SOURCES" in the file MAKEFILE.IN. $! Currently this definition includes the list WITH_TRIO_SOURCES_TRUE $! $ sources = "SAX.c entities.c encoding.c error.c parserInternals.c" $ sources = sources + " parser.c tree.c hash.c list.c xmlIO.c xmlmemory.c uri.c" $ sources = sources + " valid.c xlink.c HTMLparser.c HTMLtree.c debugXML.c xpath.c" $ sources = sources + " xpointer.c xinclude.c nanohttp.c nanoftp.c DOCBparser.c" $ sources = sources + " catalog.c globals.c threads.c c14n.c xmlstring.c" $ sources = sources + " xmlregexp.c xmlschemas.c xmlschemastypes.c xmlunicode.c" $ sources = sources + " triostr.c trio.c xmlreader.c relaxng.c dict.c SAX2.c" $ sources = sources + " xmlwriter.c legacy.c chvalid.c pattern.c xmlsave.c" $ sources = sources + " schematron.c" $! $!- list of main modules to compile and link. Compare this list to the $! definition of bin_PROGRAMS in MAKEFILE.IN $! $ bin_progs = "xmllint xmlcatalog" $! $!- list of test modules to compile and link. Compare this list to the $! definition of noinst_PROGRAMS in MAKEFILE. $! $ noinst_PROGRAMS = "testSchemas testRelax testSAX testHTML testXPath testURI " - + "testThreads testC14N testAutomata testRegexp testReader" $! $!- set up build logicals -----------------------------------------------------\ $! $! $!- start from where the procedure is in case it's submitted in batch ----------\ $! $ whoami = f$parse(f$environment("PROCEDURE"),,,,"NO_CONCEAL") $ procdir = f$parse(whoami,,,"DEVICE") + f$parse(whoami,,,"DIRECTORY") $ set default 'procdir' $! $ if f$trnlnm("XML_LIBDIR").eqs."" $ then $ if f$search("[-]lib.dir") .eqs. "" $ then $ create/directory/log [-.lib] $ endif $ xml_libdir = f$parse("[-.lib]",,,"DEVICE") + f$parse("[-.lib]",,,"DIRECTORY") $ define/process XML_LIBDIR 'xml_libdir' $ write sys$output "Defining XML_LIBDIR as """ + f$trnlnm("XML_LIBDIR") + """ $ endif $! $ if f$trnlnm("XML_SRCDIR").eqs."" $ then $ globfile = f$search("[-...]globals.c") $ if globfile.eqs."" $ then $ write sys$output "Can't locate globals.c. You need to manually define a XML_SRCDIR logical" $ exit $ else $ srcdir = f$parse(globfile,,,"DEVICE") + f$parse(globfile,,,"DIRECTORY") $ define/process XML_SRCDIR "''srcdir'" $ write sys$output "Defining XML_SRCDIR as ""''srcdir'""" $ endif $ endif $! $ copy/log config.vms xml_srcdir:config.h $! $ if f$trnlnm("libxml").eqs."" $ then $ globfile = f$search("[-...]globals.h") $ if globfile.eqs."" $ then $ write sys$output "Can't locate globals.h. You need to manually define a LIBXML logical" $ exit $ else $ includedir = f$parse(globfile,,,"DEVICE") + f$parse(globfile,,,"DIRECTORY") $ define/process libxml "''includedir'" $ write sys$output "Defining libxml as ""''includedir'""" $ endif $ endif $! $!- set up error handling (such as it is) ------------------------------------- $! $ exit_status = 1 $ saved_default = f$environment("default") $ on error then goto ERROR_OUT $ on control_y then goto ERROR_OUT $! $!- move to the source directory and create any necessary subdirs and the $! object library $! $ set default xml_srcdir $ if f$search("DEBUG.DIR").eqs."" then create/dir [.DEBUG] $ if f$search("XML_LIBDIR:LIBXML.OLB").eqs."" $ then $ write sys$output "Creating new object library XML_LIBDIR:LIBXML.OLB" $ library/create XML_LIBDIR:LIBXML.OLB $ endif $! $ goto start_here $ start_here: ! move this line to debug/rerun parts of this command file $! $!- compile modules into the library ------------------------------------------ $! $ lib_command = "LIBRARY/REPLACE/LOG XML_LIBDIR:LIBXML.OLB" $ link_command = "" $! $ write sys$output "" $ write sys$output "Building modules into the LIBXML object library" $ write sys$output "" $! $ s_no = 0 $ sources = f$edit(sources,"COMPRESS") $! $ source_loop: $! $ next_source = f$element (S_no," ",sources) $ if next_source.nes."" .and. next_source.nes." " $ then $! $ on error then goto ERROR_OUT $ on control_y then goto ERROR_OUT $ call build 'next_source' $ s_no = s_no + 1 $ goto source_loop $! $ endif $! $!- now build self-test programs ---------------------------------------------- $! $! these programs are built as ordinary modules into XML_LIBDIR:LIBXML.OLB. Here they $! are built a second time with /DEFINE=(STANDALONE) in which case a main() $! is also compiled into the module $ $ lib_command = "" $ link_command = "LINK" $! $ library/compress XML_LIBDIR:LIBXML.OLB $ purge XML_LIBDIR:LIBXML.OLB $! $ write sys$output "" $ write sys$output "Building STANDALONE self-test programs" $ write sys$output "" $! $ call build NANOFTP.C /DEFINE=(STANDALONE) $ call build NANOHTTP.C /DEFINE=(STANDALONE) $ call build TRIONAN.C /DEFINE=(STANDALONE) $! $!- now build main and test programs ------------------------------------------ $! $! $ lib_command = "" $ link_command = "LINK" $! $ write sys$output "" $ write sys$output "Building main programs and test programs" $ write sys$output "" $! $ p_no = 0 $ all_progs = bin_progs + " " + noinst_PROGRAMS $ all_progs = f$edit(all_progs,"COMPRESS") $! $ prog_loop: $! $ next_prog = f$element (p_no," ",all_progs) $ if next_prog.nes."" .and. next_prog.nes." " $ then $! $ on error then goto ERROR_OUT $ on control_y then goto ERROR_OUT $ call build 'next_prog'.c $ p_no = p_no + 1 $ goto prog_loop $! $ endif $! $!- Th-th-th-th-th-that's all folks! ------------------------------------------ $! $ goto exit_here ! move this line to avoid parts of this command file $ exit_here: $! $ exit $ goto exit_out $! $! $EXIT_OUT: $! $ purge/nolog [.debug] $ set default 'saved_default $ exit 'exit_status $! $ $ERROR_OUT: $ exit_status = $status $ write sys$output "''f$message(exit_status)'" $ goto EXIT_OUT $! $!- the BUILD subroutine. Compile then insert into library or link as required $! $BUILD: subroutine $ on warning then goto EXIT_BUILD $ source_file = p1 $ name = f$parse(source_file,,,"NAME") $ object_file = f$parse("[.debug].OBJ",name,,,"SYNTAX_ONLY") $! $!- compile $! $ write sys$output "''cc_command'''p2'/object=''object_file' ''source_file'" $ cc_command'p2' /object='object_file 'source_file' $! $!- insert into library if command defined $! $ if lib_command.nes."" then lib_command 'object_file' $! $!- link module if command defined $ if link_command.nes."" $ then $ opts = "" $ if debug then opts = "/DEBUG" $ write sys$output "''link_command'''opts' ''object_file',XML_LIBDIR:libxml.olb/library" $ link_command'opts' 'object_file',- XML_LIBDIR:libxml.olb/library $ endif $! $EXIT_BUILD: $ exit $status $! $endsubroutine libxml2-2.9.1+dfsg1/vms/readme.vms0000644000175000017500000001235611234335463015360 0ustar aronaronIssues in porting libxml to VMS =============================== Here's a summary of the issues I encountered when building LIBXML under VMS. There was some VMS support in the version I got, but it was a little out of date with the result that some newer files had problems. I present this list "as is" to hopefully act as a guide to anyone having problems in the future. That's it. Good luck! John A Fotheringham (jaf@jafsoft.com) October 2001 Updated October 2002 by Craig A Berry (craigberry@mac.com) Installation kit ---------------- - File attributes. Having downloaded essentially a Unix distribution, some of the file attributes weren't correct... especially those in the [.VMS] subdirectory. In EDT you could see line feeds and carriage returns as etc. To correct this use the command $ set file /attr=rfm=stm This sets the record format to be "stream". Other variants may be used instead depending on how you got the files onto your system. Files will look okay in an EDT editor once the attributes are set. Without this the command file may not run correctly, since it may be interpreted as a single line. - VMS-specific files are in a [.VMS] directory. If you've found this file then you already know this :-) This directory contains BUILD_LIBXML.COM - a build command file, which I've radically re-worked CONFIG.VMS - a configuration file to replace config.h - Don't execute BUILD_LIBXML.COM until you've done all the following - read these notes - reviewed the configuration section of BUILD_LIBXML.COM, and in particular updated the module lists in line with MAKEFILE - identified the location of the include files, so that you can manually set the LIBXML logical if need be. - re-read these notes :-p instructions for all these steps are below. - the file [.vms]config.vms is used in lieu of a Configure-generated config.h. This file contains a number of define statements that identify the software options required under VMS - The include files are in a [.INCLUDE.LIBXML] subdirectory. You need a logical "libxml" to point to this so that include statements of the form #include will work correctly. The source files are mostly two levels above this directory, although there are some .h files there as well. - The command file BUILD_LIBXML.COM will do the following - setup some logicals - set def to the source directory - compile modules and place them into a LIBXML.OLB library - compile and link a number of self-test programs - compile and link a number of utilities and test programs - set def back to the original directory (i.e. if it fails you might not be where you started :-) before running this command file review the configuration segment at the top. In particular compare the lists of modules with those in the most recent version of the Unix MAKEFILE. Instructions are contained in the command file itself. The command file will attempt to set two logicals - xml_srcdir. The directory containing the source files - libxml. The include file directory. It attempts this by looking for modules globals.c and globals.h in nearby directories. If this logic fails, you'll need to manually define these logicals. The TRIO package ---------------- - A sub-package TRIO is used to provide some functions not naturally available under VMS. These include support for infinite and undefined numbers, and specialised print functions like "snprintf" I had to make several changes to trionan.c in discussion with the author (hopefully these are now included in the distro, so I won't list them here) To build this software we need to add /IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE to the compile command for xpath.c and trio.c, and to any main program that uses this functionality. BUILD_LIBXML.COM should do this for you. - to build in trio support you need the define WITH_TRIO to be set. This is done by default for VMS in xmlversion.h Compiler and linker errors -------------------------- - the DEC C compiler may produce a number of warnings when compiling the C code. These include - Implicit function warnings. These indicate functions whose type is not defined in a .h file. This will probably only happen if your configuration is not correct (e.g. for "snprintf" if you haven't edited xmlversion.h to set WITH_TRIO - uninitialised variables. Not usually a problem. You can solve this by editing the code to initialise the variables affected Changes made to the codebase ---------------------------- - I changed all dummy declarations in trio.c to be va_list dummy = NULL; to prevent compiler whinge in TRIO.C about uninitialised variables - I had to add the following to nanoftp.c #if defined(VMS) || defined(__VMS) #define SOCKLEN_T unsigned int #endif This matches similar lines already added to nanohttp.c - Several variables and function names exceed the 31 character limit of the VMS linker. The solution adopted has been to use the /NAMES=SHORTENED compiler option, which requires DEC/Compaq C 5.7 or later. For a complete list of the names that needed shortening and the short names generated by the compiler, see [.vms]config.vms. libxml2-2.9.1+dfsg1/testchar.c0000644000175000017500000003726712113312343014545 0ustar aronaron/** * Test the UTF-8 decoding routines * * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #include #include #include "buf.h" int lastError; static void errorHandler(void *unused, xmlErrorPtr err) { if ((unused == NULL) && (err != NULL) && (lastError == 0)) { lastError = err->code; } } char document1[100] = "XXXX"; char document2[100] = ""; static void testDocumentRangeByte1(xmlParserCtxtPtr ctxt, char *document, int len, char *data, int forbid1, int forbid2) { int i; xmlDocPtr res; for (i = 0;i <= 0xFF;i++) { lastError = 0; xmlCtxtReset(ctxt); data[0] = i; res = xmlReadMemory(document, len, "test", NULL, 0); if ((i == forbid1) || (i == forbid2)) { if ((lastError == 0) || (res != NULL)) fprintf(stderr, "Failed to detect invalid char for Byte 0x%02X: %c\n", i, i); } else if ((i == '<') || (i == '&')) { if ((lastError == 0) || (res != NULL)) fprintf(stderr, "Failed to detect illegal char %c for Byte 0x%02X\n", i, i); } else if (((i < 0x20) || (i >= 0x80)) && (i != 0x9) && (i != 0xA) && (i != 0xD)) { if ((lastError != XML_ERR_INVALID_CHAR) && (res != NULL)) fprintf(stderr, "Failed to detect invalid char for Byte 0x%02X\n", i); } else if (res == NULL) { fprintf(stderr, "Failed to parse valid char for Byte 0x%02X : %c\n", i, i); } if (res != NULL) xmlFreeDoc(res); } } static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document, int len, char *data) { int i, j; xmlDocPtr res; for (i = 0x80;i <= 0xFF;i++) { for (j = 0;j <= 0xFF;j++) { lastError = 0; xmlCtxtReset(ctxt); data[0] = i; data[1] = j; res = xmlReadMemory(document, len, "test", NULL, 0); /* if first bit of first char is set, then second bit must too */ if ((i & 0x80) && ((i & 0x40) == 0)) { if ((lastError == 0) || (res != NULL)) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n", i, j); } /* * if first bit of first char is set, then second char first * bits must be 10 */ else if ((i & 0x80) && ((j & 0xC0) != 0x80)) { if ((lastError == 0) || (res != NULL)) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n", i, j); } /* * if using a 2 byte encoding then the value must be greater * than 0x80, i.e. one of bits 5 to 1 of i must be set */ else if ((i & 0x80) && ((i & 0x1E) == 0)) { if ((lastError == 0) || (res != NULL)) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n", i, j); } /* * if third bit of first char is set, then the sequence would need * at least 3 bytes, but we give only 2 ! */ else if ((i & 0xE0) == 0xE0) { if ((lastError == 0) || (res != NULL)) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x00\n", i, j); } /* * We should see no error in remaning cases */ else if ((lastError != 0) || (res == NULL)) { fprintf(stderr, "Failed to parse document for Bytes 0x%02X 0x%02X\n", i, j); } if (res != NULL) xmlFreeDoc(res); } } } /** * testDocumentRanges: * * Test the correct UTF8 character parsing in context of XML documents * Those are in-context injection tests checking the parser behaviour on * edge case values at different point in content, beginning and end of * CDATA in text or in attribute values. */ static void testDocumentRanges(void) { xmlParserCtxtPtr ctxt; char *data; /* * Set up a parsing context using the first document as * the current input source. */ ctxt = xmlNewParserCtxt(); if (ctxt == NULL) { fprintf(stderr, "Failed to allocate parser context\n"); return; } printf("testing 1 byte char in document: 1"); fflush(stdout); data = &document1[5]; data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 1 byte injection at beginning of area */ testDocumentRangeByte1(ctxt, &document1[0], strlen(document1), data, -1, -1); printf(" 2"); fflush(stdout); data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 1 byte injection at end of area */ testDocumentRangeByte1(ctxt, &document1[0], strlen(document1), data + 3, -1, -1); printf(" 3"); fflush(stdout); data = &document2[10]; data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 1 byte injection at beginning of area */ testDocumentRangeByte1(ctxt, &document2[0], strlen(document2), data, '\'', -1); printf(" 4"); fflush(stdout); data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 1 byte injection at end of area */ testDocumentRangeByte1(ctxt, &document2[0], strlen(document2), data + 3, '\'', -1); printf(" done\n"); printf("testing 2 byte char in document: 1"); fflush(stdout); data = &document1[5]; data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 2 byte injection at beginning of area */ testDocumentRangeByte2(ctxt, &document1[0], strlen(document1), data); printf(" 2"); fflush(stdout); data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 2 byte injection at end of area */ testDocumentRangeByte2(ctxt, &document1[0], strlen(document1), data + 2); printf(" 3"); fflush(stdout); data = &document2[10]; data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 2 byte injection at beginning of area */ testDocumentRangeByte2(ctxt, &document2[0], strlen(document2), data); printf(" 4"); fflush(stdout); data[0] = ' '; data[1] = ' '; data[2] = ' '; data[3] = ' '; /* test 2 byte injection at end of area */ testDocumentRangeByte2(ctxt, &document2[0], strlen(document2), data + 2); printf(" done\n"); xmlFreeParserCtxt(ctxt); } static void testCharRangeByte1(xmlParserCtxtPtr ctxt, char *data) { int i = 0; int len, c; data[1] = 0; data[2] = 0; data[3] = 0; for (i = 0;i <= 0xFF;i++) { data[0] = i; ctxt->charset = XML_CHAR_ENCODING_UTF8; lastError = 0; c = xmlCurrentChar(ctxt, &len); if ((i == 0) || (i >= 0x80)) { /* we must see an error there */ if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Byte 0x%02X\n", i); } else if (i == 0xD) { if ((c != 0xA) || (len != 1)) fprintf(stderr, "Failed to convert char for Byte 0x%02X\n", i); } else if ((c != i) || (len != 1)) { fprintf(stderr, "Failed to parse char for Byte 0x%02X\n", i); } } } static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) { int i, j; int len, c; data[2] = 0; data[3] = 0; for (i = 0x80;i <= 0xFF;i++) { for (j = 0;j <= 0xFF;j++) { data[0] = i; data[1] = j; ctxt->charset = XML_CHAR_ENCODING_UTF8; lastError = 0; c = xmlCurrentChar(ctxt, &len); /* if first bit of first char is set, then second bit must too */ if ((i & 0x80) && ((i & 0x40) == 0)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n", i, j); } /* * if first bit of first char is set, then second char first * bits must be 10 */ else if ((i & 0x80) && ((j & 0xC0) != 0x80)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X: %d\n", i, j, c); } /* * if using a 2 byte encoding then the value must be greater * than 0x80, i.e. one of bits 5 to 1 of i must be set */ else if ((i & 0x80) && ((i & 0x1E) == 0)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X: %d\n", i, j, c); } /* * if third bit of first char is set, then the sequence would need * at least 3 bytes, but we give only 2 ! */ else if ((i & 0xE0) == 0xE0) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x00\n", i, j); } /* * We should see no error in remaning cases */ else if ((lastError != 0) || (len != 2)) { fprintf(stderr, "Failed to parse char for Bytes 0x%02X 0x%02X\n", i, j); } /* * Finally check the value is right */ else if (c != (j & 0x3F) + ((i & 0x1F) << 6)) { fprintf(stderr, "Failed to parse char for Bytes 0x%02X 0x%02X: expect %d got %d\n", i, j, ((j & 0x3F) + ((i & 0x1F) << 6)), c); } } } } static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) { int i, j, k, K; int len, c; unsigned char lows[6] = {0, 0x80, 0x81, 0xC1, 0xFF, 0xBF}; int value; data[3] = 0; for (i = 0xE0;i <= 0xFF;i++) { for (j = 0;j <= 0xFF;j++) { for (k = 0;k < 6;k++) { data[0] = i; data[1] = j; K = lows[k]; data[2] = (char) K; value = (K & 0x3F) + ((j & 0x3F) << 6) + ((i & 0xF) << 12); ctxt->charset = XML_CHAR_ENCODING_UTF8; lastError = 0; c = xmlCurrentChar(ctxt, &len); /* * if fourth bit of first char is set, then the sequence would need * at least 4 bytes, but we give only 3 ! */ if ((i & 0xF0) == 0xF0) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n", i, j, K, data[3]); } /* * The second and the third bytes must start with 10 */ else if (((j & 0xC0) != 0x80) || ((K & 0xC0) != 0x80)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X\n", i, j, K); } /* * if using a 3 byte encoding then the value must be greater * than 0x800, i.e. one of bits 4 to 0 of i must be set or * the 6th byte of data[1] must be set */ else if (((i & 0xF) == 0) && ((j & 0x20) == 0)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X\n", i, j, K); } /* * There are values in that range that are not allowed in XML-1.0 */ else if (((value > 0xD7FF) && (value <0xE000)) || ((value > 0xFFFD) && (value <0x10000))) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char 0x%04X for Bytes 0x%02X 0x%02X 0x%02X\n", value, i, j, K); } /* * We should see no error in remaining cases */ else if ((lastError != 0) || (len != 3)) { fprintf(stderr, "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X\n", i, j, K); } /* * Finally check the value is right */ else if (c != value) { fprintf(stderr, "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X: expect %d got %d\n", i, j, data[2], value, c); } } } } } static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) { int i, j, k, K, l, L; int len, c; unsigned char lows[6] = {0, 0x80, 0x81, 0xC1, 0xFF, 0xBF}; int value; data[4] = 0; for (i = 0xF0;i <= 0xFF;i++) { for (j = 0;j <= 0xFF;j++) { for (k = 0;k < 6;k++) { for (l = 0;l < 6;l++) { data[0] = i; data[1] = j; K = lows[k]; data[2] = (char) K; L = lows[l]; data[3] = (char) L; value = (L & 0x3F) + ((K & 0x3F) << 6) + ((j & 0x3F) << 12) + ((i & 0x7) << 18); ctxt->charset = XML_CHAR_ENCODING_UTF8; lastError = 0; c = xmlCurrentChar(ctxt, &len); /* * if fifth bit of first char is set, then the sequence would need * at least 5 bytes, but we give only 4 ! */ if ((i & 0xF8) == 0xF8) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n", i, j, K, data[3]); } /* * The second, third and fourth bytes must start with 10 */ else if (((j & 0xC0) != 0x80) || ((K & 0xC0) != 0x80) || ((L & 0xC0) != 0x80)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n", i, j, K, L); } /* * if using a 3 byte encoding then the value must be greater * than 0x10000, i.e. one of bits 3 to 0 of i must be set or * the 6 or 5th byte of j must be set */ else if (((i & 0x7) == 0) && ((j & 0x30) == 0)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n", i, j, K, L); } /* * There are values in that range that are not allowed in XML-1.0 */ else if (((value > 0xD7FF) && (value <0xE000)) || ((value > 0xFFFD) && (value <0x10000)) || (value > 0x10FFFF)) { if (lastError != XML_ERR_INVALID_CHAR) fprintf(stderr, "Failed to detect invalid char 0x%04X for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n", value, i, j, K, L); } /* * We should see no error in remaining cases */ else if ((lastError != 0) || (len != 4)) { fprintf(stderr, "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X\n", i, j, K); } /* * Finally check the value is right */ else if (c != value) { fprintf(stderr, "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X: expect %d got %d\n", i, j, data[2], value, c); } } } } } } /** * testCharRanges: * * Test the correct UTF8 character parsing in isolation i.e. * not when parsing a full document, this is less expensive and we can * cover the full range of UTF-8 chars accepted by XML-1.0 */ static void testCharRanges(void) { char data[5]; xmlParserCtxtPtr ctxt; xmlParserInputBufferPtr buf; xmlParserInputPtr input; memset(data, 0, 5); /* * Set up a parsing context using the above data buffer as * the current input source. */ ctxt = xmlNewParserCtxt(); if (ctxt == NULL) { fprintf(stderr, "Failed to allocate parser context\n"); return; } buf = xmlParserInputBufferCreateStatic(data, sizeof(data), XML_CHAR_ENCODING_NONE); if (buf == NULL) { fprintf(stderr, "Failed to allocate input buffer\n"); goto error; } input = xmlNewInputStream(ctxt); if (input == NULL) { xmlFreeParserInputBuffer(buf); goto error; } input->filename = NULL; input->buf = buf; input->cur = input->base = xmlBufContent(input->buf->buffer); input->end = input->base + 4; inputPush(ctxt, input); printf("testing char range: 1"); fflush(stdout); testCharRangeByte1(ctxt, data); printf(" 2"); fflush(stdout); testCharRangeByte2(ctxt, data); printf(" 3"); fflush(stdout); testCharRangeByte3(ctxt, data); printf(" 4"); fflush(stdout); testCharRangeByte4(ctxt, data); printf(" done\n"); fflush(stdout); error: xmlFreeParserCtxt(ctxt); } int main(void) { /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION /* * Catch errors separately */ xmlSetStructuredErrorFunc(NULL, errorHandler); /* * Run the tests */ testCharRanges(); testDocumentRanges(); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } libxml2-2.9.1+dfsg1/check-xml-test-suite.py0000755000175000017500000002263711234335462017125 0ustar aronaron#!/usr/bin/python import sys import time import os import string sys.path.insert(0, "python") import libxml2 test_nr = 0 test_succeed = 0 test_failed = 0 test_error = 0 # # the testsuite description # CONF="xml-test-suite/xmlconf/xmlconf.xml" LOG="check-xml-test-suite.log" log = open(LOG, "w") # # Error and warning handlers # error_nr = 0 error_msg = '' def errorHandler(ctx, str): global error_nr global error_msg error_nr = error_nr + 1 if len(error_msg) < 300: if len(error_msg) == 0 or error_msg[-1] == '\n': error_msg = error_msg + " >>" + str else: error_msg = error_msg + str libxml2.registerErrorHandler(errorHandler, None) #warning_nr = 0 #warning = '' #def warningHandler(ctx, str): # global warning_nr # global warning # # warning_nr = warning_nr + 1 # warning = warning + str # #libxml2.registerWarningHandler(warningHandler, None) # # Used to load the XML testsuite description # def loadNoentDoc(filename): ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return None ctxt.replaceEntities(1) ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None if ctxt.wellFormed() != 1: doc.freeDoc() return None return doc # # The conformance testing routines # def testNotWf(filename, id): global error_nr global error_msg global log error_nr = 0 error_msg = '' ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return -1 ret = ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None if doc != None: doc.freeDoc() if ret == 0 or ctxt.wellFormed() != 0: print "%s: error: Well Formedness error not detected" % (id) log.write("%s: error: Well Formedness error not detected\n" % (id)) return 0 return 1 def testNotWfEnt(filename, id): global error_nr global error_msg global log error_nr = 0 error_msg = '' ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return -1 ctxt.replaceEntities(1) ret = ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None if doc != None: doc.freeDoc() if ret == 0 or ctxt.wellFormed() != 0: print "%s: error: Well Formedness error not detected" % (id) log.write("%s: error: Well Formedness error not detected\n" % (id)) return 0 return 1 def testNotWfEntDtd(filename, id): global error_nr global error_msg global log error_nr = 0 error_msg = '' ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return -1 ctxt.replaceEntities(1) ctxt.loadSubset(1) ret = ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None if doc != None: doc.freeDoc() if ret == 0 or ctxt.wellFormed() != 0: print "%s: error: Well Formedness error not detected" % (id) log.write("%s: error: Well Formedness error not detected\n" % (id)) return 0 return 1 def testWfEntDtd(filename, id): global error_nr global error_msg global log error_nr = 0 error_msg = '' ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return -1 ctxt.replaceEntities(1) ctxt.loadSubset(1) ret = ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None if doc == None or ret != 0 or ctxt.wellFormed() == 0: print "%s: error: wrongly failed to parse the document" % (id) log.write("%s: error: wrongly failed to parse the document\n" % (id)) if doc != None: doc.freeDoc() return 0 if error_nr != 0: print "%s: warning: WF document generated an error msg" % (id) log.write("%s: error: WF document generated an error msg\n" % (id)) doc.freeDoc() return 2 doc.freeDoc() return 1 def testError(filename, id): global error_nr global error_msg global log error_nr = 0 error_msg = '' ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return -1 ctxt.replaceEntities(1) ctxt.loadSubset(1) ret = ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None if doc != None: doc.freeDoc() if ctxt.wellFormed() == 0: print "%s: warning: failed to parse the document but accepted" % (id) log.write("%s: warning: failed to parse the document but accepte\n" % (id)) return 2 if error_nr != 0: print "%s: warning: WF document generated an error msg" % (id) log.write("%s: error: WF document generated an error msg\n" % (id)) return 2 return 1 def testInvalid(filename, id): global error_nr global error_msg global log error_nr = 0 error_msg = '' ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return -1 ctxt.validate(1) ret = ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None valid = ctxt.isValid() if doc == None: print "%s: error: wrongly failed to parse the document" % (id) log.write("%s: error: wrongly failed to parse the document\n" % (id)) return 0 if valid == 1: print "%s: error: Validity error not detected" % (id) log.write("%s: error: Validity error not detected\n" % (id)) doc.freeDoc() return 0 if error_nr == 0: print "%s: warning: Validity error not reported" % (id) log.write("%s: warning: Validity error not reported\n" % (id)) doc.freeDoc() return 2 doc.freeDoc() return 1 def testValid(filename, id): global error_nr global error_msg error_nr = 0 error_msg = '' ctxt = libxml2.createFileParserCtxt(filename) if ctxt == None: return -1 ctxt.validate(1) ctxt.parseDocument() try: doc = ctxt.doc() except: doc = None valid = ctxt.isValid() if doc == None: print "%s: error: wrongly failed to parse the document" % (id) log.write("%s: error: wrongly failed to parse the document\n" % (id)) return 0 if valid != 1: print "%s: error: Validity check failed" % (id) log.write("%s: error: Validity check failed\n" % (id)) doc.freeDoc() return 0 if error_nr != 0 or valid != 1: print "%s: warning: valid document reported an error" % (id) log.write("%s: warning: valid document reported an error\n" % (id)) doc.freeDoc() return 2 doc.freeDoc() return 1 def runTest(test): global test_nr global test_succeed global test_failed global error_msg global log uri = test.prop('URI') id = test.prop('ID') if uri == None: print "Test without ID:", uri return -1 if id == None: print "Test without URI:", id return -1 base = test.getBase(None) URI = libxml2.buildURI(uri, base) if os.access(URI, os.R_OK) == 0: print "Test %s missing: base %s uri %s" % (URI, base, uri) return -1 type = test.prop('TYPE') if type == None: print "Test %s missing TYPE" % (id) return -1 extra = None if type == "invalid": res = testInvalid(URI, id) elif type == "valid": res = testValid(URI, id) elif type == "not-wf": extra = test.prop('ENTITIES') # print URI #if extra == None: # res = testNotWfEntDtd(URI, id) #elif extra == 'none': # res = testNotWf(URI, id) #elif extra == 'general': # res = testNotWfEnt(URI, id) #elif extra == 'both' or extra == 'parameter': res = testNotWfEntDtd(URI, id) #else: # print "Unknow value %s for an ENTITIES test value" % (extra) # return -1 elif type == "error": res = testError(URI, id) else: # TODO skipped for now return -1 test_nr = test_nr + 1 if res > 0: test_succeed = test_succeed + 1 elif res == 0: test_failed = test_failed + 1 elif res < 0: test_error = test_error + 1 # Log the ontext if res != 1: log.write(" File: %s\n" % (URI)) content = string.strip(test.content) while content[-1] == '\n': content = content[0:-1] if extra != None: log.write(" %s:%s:%s\n" % (type, extra, content)) else: log.write(" %s:%s\n\n" % (type, content)) if error_msg != '': log.write(" ----\n%s ----\n" % (error_msg)) error_msg = '' log.write("\n") return 0 def runTestCases(case): profile = case.prop('PROFILE') if profile != None and \ string.find(profile, "IBM XML Conformance Test Suite - Production") < 0: print "=>", profile test = case.children while test != None: if test.name == 'TEST': runTest(test) if test.name == 'TESTCASES': runTestCases(test) test = test.next conf = loadNoentDoc(CONF) if conf == None: print "Unable to load %s" % CONF sys.exit(1) testsuite = conf.getRootElement() if testsuite.name != 'TESTSUITE': print "Expecting TESTSUITE root element: aborting" sys.exit(1) profile = testsuite.prop('PROFILE') if profile != None: print profile start = time.time() case = testsuite.children while case != None: if case.name == 'TESTCASES': old_test_nr = test_nr old_test_succeed = test_succeed old_test_failed = test_failed old_test_error = test_error runTestCases(case) print " Ran %d tests: %d suceeded, %d failed and %d generated an error" % ( test_nr - old_test_nr, test_succeed - old_test_succeed, test_failed - old_test_failed, test_error - old_test_error) case = case.next conf.freeDoc() log.close() print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % ( test_nr, test_succeed, test_failed, test_error, time.time() - start) libxml2-2.9.1+dfsg1/xzlib.c0000644000175000017500000005507412113312344014055 0ustar aronaron/** * xzlib.c: front end for the transparent suport of lzma compression * at the I/O layer, based on an example file from lzma project * * See Copyright for the status of this software. * * Anders F Bjorklund */ #define IN_LIBXML #include "libxml.h" #ifdef HAVE_LZMA_H #include #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_ZLIB_H #include #endif #include #include "xzlib.h" #include /* values for xz_state how */ #define LOOK 0 /* look for a gzip/lzma header */ #define COPY 1 /* copy input directly */ #define GZIP 2 /* decompress a gzip stream */ #define LZMA 3 /* decompress a lzma stream */ /* internal lzma file state data structure */ typedef struct { int mode; /* see lzma modes above */ int fd; /* file descriptor */ char *path; /* path or fd for error messages */ uint64_t pos; /* current position in uncompressed data */ unsigned int size; /* buffer size, zero if not allocated yet */ unsigned int want; /* requested buffer size, default is BUFSIZ */ unsigned char *in; /* input buffer */ unsigned char *out; /* output buffer (double-sized when reading) */ unsigned char *next; /* next output data to deliver or write */ unsigned int have; /* amount of output data unused at next */ int eof; /* true if end of input file reached */ uint64_t start; /* where the lzma data started, for rewinding */ uint64_t raw; /* where the raw data started, for seeking */ int how; /* 0: get header, 1: copy, 2: decompress */ int direct; /* true if last read direct, false if lzma */ /* seek request */ uint64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ /* error information */ int err; /* error code */ char *msg; /* error message */ /* lzma stream */ int init; /* is the iniflate stream initialized */ lzma_stream strm; /* stream structure in-place (not a pointer) */ char padding1[32]; /* padding allowing to cope with possible extensions of above structure without too much side effect */ #ifdef HAVE_ZLIB_H /* zlib inflate or deflate stream */ z_stream zstrm; /* stream structure in-place (not a pointer) */ #endif char padding2[32]; /* padding allowing to cope with possible extensions of above structure without too much side effect */ } xz_state, *xz_statep; static void xz_error(xz_statep state, int err, const char *msg) { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != LZMA_MEM_ERROR) xmlFree(state->msg); state->msg = NULL; } /* set error code, and if no message, then done */ state->err = err; if (msg == NULL) return; /* for an out of memory error, save as static string */ if (err == LZMA_MEM_ERROR) { state->msg = (char *) msg; return; } /* construct error message with path */ if ((state->msg = xmlMalloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { state->err = LZMA_MEM_ERROR; state->msg = (char *) "out of memory"; return; } strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); return; } static void xz_reset(xz_statep state) { state->have = 0; /* no output data available */ state->eof = 0; /* not at end of file */ state->how = LOOK; /* look for gzip header */ state->direct = 1; /* default for empty file */ state->seek = 0; /* no seek request pending */ xz_error(state, LZMA_OK, NULL); /* clear error */ state->pos = 0; /* no uncompressed data yet */ state->strm.avail_in = 0; /* no input data yet */ #ifdef HAVE_ZLIB_H state->zstrm.avail_in = 0; /* no input data yet */ #endif } static xzFile xz_open(const char *path, int fd, const char *mode ATTRIBUTE_UNUSED) { xz_statep state; /* allocate xzFile structure to return */ state = xmlMalloc(sizeof(xz_state)); if (state == NULL) return NULL; state->size = 0; /* no buffers allocated yet */ state->want = BUFSIZ; /* requested buffer size */ state->msg = NULL; /* no error message yet */ state->init = 0; /* initialization of zlib data */ /* save the path name for error messages */ state->path = xmlMalloc(strlen(path) + 1); if (state->path == NULL) { xmlFree(state); return NULL; } strcpy(state->path, path); /* open the file with the appropriate mode (or just use fd) */ state->fd = fd != -1 ? fd : open(path, #ifdef O_LARGEFILE O_LARGEFILE | #endif #ifdef O_BINARY O_BINARY | #endif O_RDONLY, 0666); if (state->fd == -1) { xmlFree(state->path); xmlFree(state); return NULL; } /* save the current position for rewinding (only if reading) */ state->start = lseek(state->fd, 0, SEEK_CUR); if (state->start == (uint64_t) - 1) state->start = 0; /* initialize stream */ xz_reset(state); /* return stream */ return (xzFile) state; } xzFile __libxml2_xzopen(const char *path, const char *mode) { return xz_open(path, -1, mode); } xzFile __libxml2_xzdopen(int fd, const char *mode) { char *path; /* identifier for error messages */ xzFile xz; if (fd == -1 || (path = xmlMalloc(7 + 3 * sizeof(int))) == NULL) return NULL; sprintf(path, "", fd); /* for debugging */ xz = xz_open(path, fd, mode); xmlFree(path); return xz; } static int xz_load(xz_statep state, unsigned char *buf, unsigned int len, unsigned int *have) { int ret; *have = 0; do { ret = read(state->fd, buf + *have, len - *have); if (ret <= 0) break; *have += ret; } while (*have < len); if (ret < 0) { xz_error(state, -1, strerror(errno)); return -1; } if (ret == 0) state->eof = 1; return 0; } static int xz_avail(xz_statep state) { lzma_stream *strm = &(state->strm); if (state->err != LZMA_OK) return -1; if (state->eof == 0) { /* avail_in is size_t, which is not necessary sizeof(unsigned) */ unsigned tmp = strm->avail_in; if (xz_load(state, state->in, state->size, &tmp) == -1) { strm->avail_in = tmp; return -1; } strm->avail_in = tmp; strm->next_in = state->in; } return 0; } static int is_format_xz(xz_statep state) { lzma_stream *strm = &(state->strm); return strm->avail_in >= 6 && memcmp(state->in, "\3757zXZ", 6) == 0; } static int is_format_lzma(xz_statep state) { lzma_stream *strm = &(state->strm); lzma_filter filter; lzma_options_lzma *opt; uint32_t dict_size; uint64_t uncompressed_size; size_t i; if (strm->avail_in < 13) return 0; filter.id = LZMA_FILTER_LZMA1; if (lzma_properties_decode(&filter, NULL, state->in, 5) != LZMA_OK) return 0; opt = filter.options; dict_size = opt->dict_size; free(opt); /* we can't use xmlFree on a string returned by zlib */ /* A hack to ditch tons of false positives: We allow only dictionary * sizes that are 2^n or 2^n + 2^(n-1) or UINT32_MAX. LZMA_Alone * created only files with 2^n, but accepts any dictionary size. * If someone complains, this will be reconsidered. */ if (dict_size != UINT32_MAX) { uint32_t d = dict_size - 1; d |= d >> 2; d |= d >> 3; d |= d >> 4; d |= d >> 8; d |= d >> 16; ++d; if (d != dict_size || dict_size == 0) return 0; } /* Another hack to ditch false positives: Assume that if the * uncompressed size is known, it must be less than 256 GiB. * Again, if someone complains, this will be reconsidered. */ uncompressed_size = 0; for (i = 0; i < 8; ++i) uncompressed_size |= (uint64_t) (state->in[5 + i]) << (i * 8); if (uncompressed_size != UINT64_MAX && uncompressed_size > (UINT64_C(1) << 38)) return 0; return 1; } #ifdef HAVE_ZLIB_H /* Get next byte from input, or -1 if end or error. */ #define NEXT() ((strm->avail_in == 0 && xz_avail(state) == -1) ? -1 : \ (strm->avail_in == 0 ? -1 : \ (strm->avail_in--, *(strm->next_in)++))) /* Get a four-byte little-endian integer and return 0 on success and the value in *ret. Otherwise -1 is returned and *ret is not modified. */ static int gz_next4(xz_statep state, unsigned long *ret) { int ch; unsigned long val; z_streamp strm = &(state->zstrm); val = NEXT(); val += (unsigned) NEXT() << 8; val += (unsigned long) NEXT() << 16; ch = NEXT(); if (ch == -1) return -1; val += (unsigned long) ch << 24; *ret = val; return 0; } #endif static int xz_head(xz_statep state) { lzma_stream *strm = &(state->strm); lzma_stream init = LZMA_STREAM_INIT; int flags; unsigned len; /* allocate read buffers and inflate memory */ if (state->size == 0) { /* allocate buffers */ state->in = xmlMalloc(state->want); state->out = xmlMalloc(state->want << 1); if (state->in == NULL || state->out == NULL) { if (state->out != NULL) xmlFree(state->out); if (state->in != NULL) xmlFree(state->in); xz_error(state, LZMA_MEM_ERROR, "out of memory"); return -1; } state->size = state->want; /* allocate decoder memory */ state->strm = init; state->strm.avail_in = 0; state->strm.next_in = NULL; if (lzma_auto_decoder(&state->strm, UINT64_MAX, 0) != LZMA_OK) { xmlFree(state->out); xmlFree(state->in); state->size = 0; xz_error(state, LZMA_MEM_ERROR, "out of memory"); return -1; } #ifdef HAVE_ZLIB_H /* allocate inflate memory */ state->zstrm.zalloc = Z_NULL; state->zstrm.zfree = Z_NULL; state->zstrm.opaque = Z_NULL; state->zstrm.avail_in = 0; state->zstrm.next_in = Z_NULL; if (state->init == 0) { if (inflateInit2(&(state->zstrm), -15) != Z_OK) {/* raw inflate */ xmlFree(state->out); xmlFree(state->in); state->size = 0; xz_error(state, LZMA_MEM_ERROR, "out of memory"); return -1; } state->init = 1; } #endif } /* get some data in the input buffer */ if (strm->avail_in == 0) { if (xz_avail(state) == -1) return -1; if (strm->avail_in == 0) return 0; } /* look for the xz magic header bytes */ if (is_format_xz(state) || is_format_lzma(state)) { state->how = LZMA; state->direct = 0; return 0; } #ifdef HAVE_ZLIB_H /* look for the gzip magic header bytes 31 and 139 */ if (strm->next_in[0] == 31) { strm->avail_in--; strm->next_in++; if (strm->avail_in == 0 && xz_avail(state) == -1) return -1; if (strm->avail_in && strm->next_in[0] == 139) { /* we have a gzip header, woo hoo! */ strm->avail_in--; strm->next_in++; /* skip rest of header */ if (NEXT() != 8) { /* compression method */ xz_error(state, LZMA_DATA_ERROR, "unknown compression method"); return -1; } flags = NEXT(); if (flags & 0xe0) { /* reserved flag bits */ xz_error(state, LZMA_DATA_ERROR, "unknown header flags set"); return -1; } NEXT(); /* modification time */ NEXT(); NEXT(); NEXT(); NEXT(); /* extra flags */ NEXT(); /* operating system */ if (flags & 4) { /* extra field */ len = (unsigned) NEXT(); len += (unsigned) NEXT() << 8; while (len--) if (NEXT() < 0) break; } if (flags & 8) /* file name */ while (NEXT() > 0) ; if (flags & 16) /* comment */ while (NEXT() > 0) ; if (flags & 2) { /* header crc */ NEXT(); NEXT(); } /* an unexpected end of file is not checked for here -- it will be * noticed on the first request for uncompressed data */ /* set up for decompression */ inflateReset(&state->zstrm); state->zstrm.adler = crc32(0L, Z_NULL, 0); state->how = GZIP; state->direct = 0; return 0; } else { /* not a gzip file -- save first byte (31) and fall to raw i/o */ state->out[0] = 31; state->have = 1; } } #endif /* doing raw i/o, save start of raw data for seeking, copy any leftover * input to output -- this assumes that the output buffer is larger than * the input buffer, which also assures space for gzungetc() */ state->raw = state->pos; state->next = state->out; if (strm->avail_in) { memcpy(state->next + state->have, strm->next_in, strm->avail_in); state->have += strm->avail_in; strm->avail_in = 0; } state->how = COPY; state->direct = 1; return 0; } static int xz_decomp(xz_statep state) { int ret; unsigned had; unsigned long crc, len; lzma_stream *strm = &(state->strm); lzma_action action = LZMA_RUN; /* fill output buffer up to end of deflate stream */ had = strm->avail_out; do { /* get more input for inflate() */ if (strm->avail_in == 0 && xz_avail(state) == -1) return -1; if (strm->avail_in == 0) { xz_error(state, LZMA_DATA_ERROR, "unexpected end of file"); return -1; } if (state->eof) action = LZMA_FINISH; /* decompress and handle errors */ #ifdef HAVE_ZLIB_H if (state->how == GZIP) { state->zstrm.avail_in = (uInt) state->strm.avail_in; state->zstrm.next_in = (Bytef *) state->strm.next_in; state->zstrm.avail_out = (uInt) state->strm.avail_out; state->zstrm.next_out = (Bytef *) state->strm.next_out; ret = inflate(&state->zstrm, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { xz_error(state, Z_STREAM_ERROR, "internal error: inflate stream corrupt"); return -1; } if (ret == Z_MEM_ERROR) ret = LZMA_MEM_ERROR; if (ret == Z_DATA_ERROR) ret = LZMA_DATA_ERROR; if (ret == Z_STREAM_END) ret = LZMA_STREAM_END; state->strm.avail_in = state->zstrm.avail_in; state->strm.next_in = state->zstrm.next_in; state->strm.avail_out = state->zstrm.avail_out; state->strm.next_out = state->zstrm.next_out; } else /* state->how == LZMA */ #endif ret = lzma_code(strm, action); if (ret == LZMA_MEM_ERROR) { xz_error(state, LZMA_MEM_ERROR, "out of memory"); return -1; } if (ret == LZMA_DATA_ERROR) { xz_error(state, LZMA_DATA_ERROR, "compressed data error"); return -1; } } while (strm->avail_out && ret != LZMA_STREAM_END); /* update available output and crc check value */ state->have = had - strm->avail_out; state->next = strm->next_out - state->have; #ifdef HAVE_ZLIB_H state->zstrm.adler = crc32(state->zstrm.adler, state->next, state->have); #endif if (ret == LZMA_STREAM_END) { #ifdef HAVE_ZLIB_H if (state->how == GZIP) { if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { xz_error(state, LZMA_DATA_ERROR, "unexpected end of file"); return -1; } if (crc != state->zstrm.adler) { xz_error(state, LZMA_DATA_ERROR, "incorrect data check"); return -1; } if (len != (state->zstrm.total_out & 0xffffffffL)) { xz_error(state, LZMA_DATA_ERROR, "incorrect length check"); return -1; } state->strm.avail_in = 0; state->strm.next_in = NULL; state->strm.avail_out = 0; state->strm.next_out = NULL; } else #endif if (strm->avail_in != 0 || !state->eof) { xz_error(state, LZMA_DATA_ERROR, "trailing garbage"); return -1; } state->how = LOOK; /* ready for next stream, once have is 0 (leave * state->direct unchanged to remember how) */ } /* good decompression */ return 0; } static int xz_make(xz_statep state) { lzma_stream *strm = &(state->strm); if (state->how == LOOK) { /* look for lzma / gzip header */ if (xz_head(state) == -1) return -1; if (state->have) /* got some data from xz_head() */ return 0; } if (state->how == COPY) { /* straight copy */ if (xz_load(state, state->out, state->size << 1, &(state->have)) == -1) return -1; state->next = state->out; } else if (state->how == LZMA || state->how == GZIP) { /* decompress */ strm->avail_out = state->size << 1; strm->next_out = state->out; if (xz_decomp(state) == -1) return -1; } return 0; } static int xz_skip(xz_statep state, uint64_t len) { unsigned n; /* skip over len bytes or reach end-of-file, whichever comes first */ while (len) /* skip over whatever is in output buffer */ if (state->have) { n = (uint64_t) state->have > len ? (unsigned) len : state->have; state->have -= n; state->next += n; state->pos += n; len -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && state->strm.avail_in == 0) break; /* need more data to skip -- load up output buffer */ else { /* get more output, looking for header if required */ if (xz_make(state) == -1) return -1; } return 0; } int __libxml2_xzread(xzFile file, void *buf, unsigned len) { unsigned got, n; xz_statep state; lzma_stream *strm; /* get internal structure */ if (file == NULL) return -1; state = (xz_statep) file; strm = &(state->strm); /* check that we're reading and that there's no error */ if (state->err != LZMA_OK) return -1; /* since an int is returned, make sure len fits in one, otherwise return * with an error (this avoids the flaw in the interface) */ if ((int) len < 0) { xz_error(state, LZMA_BUF_ERROR, "requested length does not fit in int"); return -1; } /* if len is zero, avoid unnecessary operations */ if (len == 0) return 0; /* process a skip request */ if (state->seek) { state->seek = 0; if (xz_skip(state, state->skip) == -1) return -1; } /* get len bytes to buf, or less than len if at the end */ got = 0; do { /* first just try copying data from the output buffer */ if (state->have) { n = state->have > len ? len : state->have; memcpy(buf, state->next, n); state->next += n; state->have -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && strm->avail_in == 0) break; /* need output data -- for small len or new stream load up our output * buffer */ else if (state->how == LOOK || len < (state->size << 1)) { /* get more output, looking for header if required */ if (xz_make(state) == -1) return -1; continue; /* no progress yet -- go back to memcpy() above */ /* the copy above assures that we will leave with space in the * output buffer, allowing at least one gzungetc() to succeed */ } /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ if (xz_load(state, buf, len, &n) == -1) return -1; } /* large len -- decompress directly into user buffer */ else { /* state->how == LZMA */ strm->avail_out = len; strm->next_out = buf; if (xz_decomp(state) == -1) return -1; n = state->have; state->have = 0; } /* update progress */ len -= n; buf = (char *) buf + n; got += n; state->pos += n; } while (len); /* return number of bytes read into user buffer (will fit in int) */ return (int) got; } int __libxml2_xzclose(xzFile file) { int ret; xz_statep state; /* get internal structure */ if (file == NULL) return LZMA_DATA_ERROR; state = (xz_statep) file; /* free memory and close file */ if (state->size) { lzma_end(&(state->strm)); #ifdef HAVE_ZLIB_H if (state->init == 1) inflateEnd(&(state->zstrm)); state->init = 0; #endif xmlFree(state->out); xmlFree(state->in); } xmlFree(state->path); ret = close(state->fd); xmlFree(state); return ret ? ret : LZMA_OK; } #endif /* HAVE_LZMA_H */ libxml2-2.9.1+dfsg1/testXPath.c0000644000175000017500000001343712113312343014645 0ustar aronaron/* * testXPath.c : a small tester program for XPath. * * See Copyright for the status of this software. * * daniel@veillard.com */ #include "libxml.h" #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #include #include #include #include #include #include #include #include #include #if defined(LIBXML_XPTR_ENABLED) #include static int xptr = 0; #endif static int debug = 0; static int valid = 0; static int expr = 0; static int tree = 0; static int nocdata = 0; static xmlDocPtr document = NULL; /* * Default document */ static xmlChar buffer[] = "\n\ \n\ \n\ Welcome to Gnome\n\ \n\ \n\ The Linux adventure\n\

bla bla bla ...

\n\ \n\

...

\n\
\n\ \n\ Chapter 2\n\

this is chapter 2 ...

\n\
\n\ \n\ Chapter 3\n\

this is chapter 3 ...

\n\
\n\
\n\ "; static void testXPath(const char *str) { xmlXPathObjectPtr res; xmlXPathContextPtr ctxt; #if defined(LIBXML_XPTR_ENABLED) if (xptr) { ctxt = xmlXPtrNewContext(document, NULL, NULL); res = xmlXPtrEval(BAD_CAST str, ctxt); } else { #endif ctxt = xmlXPathNewContext(document); ctxt->node = xmlDocGetRootElement(document); if (expr) res = xmlXPathEvalExpression(BAD_CAST str, ctxt); else { /* res = xmlXPathEval(BAD_CAST str, ctxt); */ xmlXPathCompExprPtr comp; comp = xmlXPathCompile(BAD_CAST str); if (comp != NULL) { if (tree) xmlXPathDebugDumpCompExpr(stdout, comp, 0); res = xmlXPathCompiledEval(comp, ctxt); xmlXPathFreeCompExpr(comp); } else res = NULL; } #if defined(LIBXML_XPTR_ENABLED) } #endif xmlXPathDebugDumpObject(stdout, res, 0); xmlXPathFreeObject(res); xmlXPathFreeContext(ctxt); } static void testXPathFile(const char *filename) { FILE *input; char expression[5000]; int len; input = fopen(filename, "r"); if (input == NULL) { xmlGenericError(xmlGenericErrorContext, "Cannot open %s for reading\n", filename); return; } while (fgets(expression, 4500, input) != NULL) { len = strlen(expression); len--; while ((len >= 0) && ((expression[len] == '\n') || (expression[len] == '\t') || (expression[len] == '\r') || (expression[len] == ' '))) len--; expression[len + 1] = 0; if (len >= 0) { printf("\n========================\nExpression: %s\n", expression) ; testXPath(expression); } } fclose(input); } int main(int argc, char **argv) { int i; int strings = 0; int usefile = 0; char *filename = NULL; for (i = 1; i < argc ; i++) { #if defined(LIBXML_XPTR_ENABLED) if ((!strcmp(argv[i], "-xptr")) || (!strcmp(argv[i], "--xptr"))) xptr++; else #endif if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) debug++; else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid"))) valid++; else if ((!strcmp(argv[i], "-expr")) || (!strcmp(argv[i], "--expr"))) expr++; else if ((!strcmp(argv[i], "-tree")) || (!strcmp(argv[i], "--tree"))) tree++; else if ((!strcmp(argv[i], "-nocdata")) || (!strcmp(argv[i], "--nocdata"))) nocdata++; else if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input"))) filename = argv[++i]; else if ((!strcmp(argv[i], "-f")) || (!strcmp(argv[i], "--file"))) usefile++; } if (valid != 0) xmlDoValidityCheckingDefaultValue = 1; xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS; xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS; xmlSubstituteEntitiesDefaultValue = 1; #ifdef LIBXML_SAX1_ENABLED if (nocdata != 0) { xmlDefaultSAXHandlerInit(); xmlDefaultSAXHandler.cdataBlock = NULL; } #endif if (document == NULL) { if (filename == NULL) document = xmlReadDoc(buffer,NULL,NULL,XML_PARSE_COMPACT); else document = xmlReadFile(filename,NULL,XML_PARSE_COMPACT); } for (i = 1; i < argc ; i++) { if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input"))) { i++; continue; } if (argv[i][0] != '-') { if (usefile) testXPathFile(argv[i]); else testXPath(argv[i]); strings ++; } } if (strings == 0) { printf("Usage : %s [--debug] [--copy] stringsorfiles ...\n", argv[0]); printf("\tParse the XPath strings and output the result of the parsing\n"); printf("\t--debug : dump a debug version of the result\n"); printf("\t--valid : switch on DTD support in the parser\n"); #if defined(LIBXML_XPTR_ENABLED) printf("\t--xptr : expressions are XPointer expressions\n"); #endif printf("\t--expr : debug XPath expressions only\n"); printf("\t--tree : show the compiled XPath tree\n"); printf("\t--nocdata : do not generate CDATA nodes\n"); printf("\t--input filename : or\n"); printf("\t-i filename : read the document from filename\n"); printf("\t--file : or\n"); printf("\t-f : read queries from files, args\n"); } if (document != NULL) xmlFreeDoc(document); xmlCleanupParser(); xmlMemoryDump(); return(0); } #else #include int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { printf("%s : XPath/Debug support not compiled in\n", argv[0]); return(0); } #endif /* LIBXML_XPATH_ENABLED */ libxml2-2.9.1+dfsg1/configure0000755000175000017500000172070712134171753014505 0ustar aronaron#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="entities.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS PYTHON_TESTS RELDATE RDL_LIBS M_LIBS PYTHON_SITE_PACKAGES PYTHON_INCLUDES PYTHON_VERSION HAVE_ISINF HAVE_ISNAN XML_INCLUDEDIR ICONV_LIBS XML_LIBTOOLLIBS XML_LIBS XML_LIBDIR XML_CFLAGS CYGWIN_EXTRA_PYTHON_LIBADD CYGWIN_EXTRA_LDFLAGS WIN32_EXTRA_PYTHON_LIBADD WIN32_EXTRA_LDFLAGS WIN32_EXTRA_LIBADD WITH_RUN_DEBUG WITH_MEM_DEBUG TEST_DEBUG DEBUG_OBJ WITH_DEBUG TEST_REGEXPS WITH_REGEXPS TEST_SCHEMAS WITH_SCHEMAS TEST_SCHEMATRON WITH_SCHEMATRON WITH_ISO8859X ICU_LIBS WITH_ICU WITH_ICONV WITH_OUTPUT TEST_XPATH XPATH_OBJ WITH_XPATH TEST_XINCLUDE XINCLUDE_OBJ WITH_XINCLUDE TEST_C14N C14N_OBJ WITH_C14N TEST_XPTR XPTR_OBJ WITH_XPTR DOCB_OBJ WITH_DOCB TEST_CATALOG CATALOG_OBJ WITH_CATALOG TEST_VTIME TEST_VALID WITH_VALID TEST_PHTML TEST_HTML HTML_OBJ WITH_HTML TEST_PUSH WITH_PUSH TEST_SAX WITH_SAX1_SOURCES_FALSE WITH_SAX1_SOURCES_TRUE WITH_SAX1 TEST_PATTERN WITH_PATTERN WITH_WRITER READER_TEST WITH_READER WITH_LEGACY HTTP_OBJ WITH_HTTP FTP_OBJ WITH_FTP WITH_TREE THREADS_W32_FALSE THREADS_W32_TRUE WITH_THREAD_ALLOC TEST_THREADS THREAD_CFLAGS WITH_THREADS BASE_THREAD_LIBS THREAD_LIBS WITH_TRIO WITH_TRIO_SOURCES_FALSE WITH_TRIO_SOURCES_TRUE STATIC_BINARIES TEST_MODULES MODULE_EXTENSION MODULE_PLATFORM_LIBS WITH_MODULES PYTHON_LIBS PYTHON_SUBDIR pythondir WITH_PYTHON_FALSE WITH_PYTHON_TRUE PYTHON WITH_LZMA LZMA_LIBS LZMA_CFLAGS WITH_ZLIB Z_LIBS Z_CFLAGS REBUILD_DOCS_FALSE REBUILD_DOCS_TRUE HTML_DIR USE_VERSION_SCRIPT_FALSE USE_VERSION_SCRIPT_TRUE VERSION_SCRIPT_FLAGS OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL XSLTPROC XMLLINT WGET PERL TAR MV CPP LN_S am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM LIBXML_VERSION_EXTRA LIBXML_VERSION_NUMBER LIBXML_VERSION_INFO LIBXML_VERSION LIBXML_MICRO_VERSION LIBXML_MINOR_VERSION LIBXML_MAJOR_VERSION host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock with_c14n with_catalog with_debug with_docbook with_fexceptions with_ftp with_history with_html with_html_dir with_html_subdir with_http with_iconv with_icu with_iso8859x with_legacy with_mem_debug with_minimum with_output with_pattern with_push with_python with_reader with_readline with_regexps with_run_debug with_sax1 with_schemas with_schematron with_threads with_thread_alloc with_tree with_valid with_writer with_xinclude with_xpath with_xptr with_modules with_zlib with_lzma with_coverage enable_rebuild_docs enable_ipv6 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-rebuild-docs[=yes/no] rebuild some generated docs [default=no] --enable-ipv6[=yes/no] enables compilation of IPv6 code [default=yes] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-c14n add the Canonicalization support (on) --with-catalog add the Catalog support (on) --with-debug add the debugging module (on) --with-docbook add Docbook SGML support (on) --with-fexceptions add GCC flag -fexceptions for C++ exceptions (off) --with-ftp add the FTP support (on) --with-history add history support to xmllint shell(off) --with-html add the HTML support (on) --with-html-dir=path path to base html directory, default $datadir/doc/html --with-html-subdir=path directory used under html-dir, default $PACKAGE-$VERSION/html --with-http add the HTTP support (on) --with-iconv[=DIR] add ICONV support (on) --with-icu add ICU support (off) --with-iso8859x add ISO8859X support if no iconv (on) --with-legacy add deprecated APIs for compatibility (on) --with-mem-debug add the memory debugging module (off) --with-minimum build a minimally sized library (off) --with-output add the serialization support (on) --with-pattern add the xmlPattern selection interface (on) --with-push add the PUSH parser interfaces (on) --with-python[=DIR] build Python bindings if found --with-reader add the xmlReader parsing interface (on) --with-readline=DIR use readline in DIR --with-regexps add Regular Expressions support (on) --with-run-debug add the runtime debugging module (off) --with-sax1 add the older SAX1 interface (on) --with-schemas add Relax-NG and Schemas support (on) --with-schematron add Schematron support (on) --with-threads add multithread support(on) --with-thread-alloc add per-thread memory(off) --with-tree add the DOM like tree manipulation APIs (on) --with-valid add the DTD validation support (on) --with-writer add the xmlWriter saving interface (on) --with-xinclude add the XInclude support (on) --with-xpath add the XPATH support (on) --with-xptr add the XPointer support (on) --with-modules add the dynamic modules support (on) --with-zlib[=DIR] use libz in DIR --with-lzma[=DIR] use liblzma in DIR --with-coverage build for code coverage with GCC (off) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac LIBXML_MAJOR_VERSION=2 LIBXML_MINOR_VERSION=9 LIBXML_MICRO_VERSION=1 LIBXML_MICRO_VERSION_SUFFIX= LIBXML_VERSION=$LIBXML_MAJOR_VERSION.$LIBXML_MINOR_VERSION.$LIBXML_MICRO_VERSION$LIBXML_MICRO_VERSION_SUFFIX LIBXML_VERSION_INFO=`expr $LIBXML_MAJOR_VERSION + $LIBXML_MINOR_VERSION`:$LIBXML_MICRO_VERSION:$LIBXML_MINOR_VERSION LIBXML_VERSION_NUMBER=`expr $LIBXML_MAJOR_VERSION \* 10000 + $LIBXML_MINOR_VERSION \* 100 + $LIBXML_MICRO_VERSION` if test -f CVS/Entries ; then extra=`grep ChangeLog CVS/Entries | grep -v LIBXML | sed -e s\%/ChangeLog/1\.%% -e s\%/.*$%%` echo extra=$extra if test "$extra" != "" then LIBXML_VERSION_EXTRA="-CVS$extra" fi else if test -d .svn ; then extra=`svn info | grep Revision | sed 's+Revision: ++'` echo extra=$extra if test "$extra" != "" then LIBXML_VERSION_EXTRA="-SVN$extra" fi else if test -d .git ; then extra=`git describe 2>/dev/null | sed 's+LIBXML[0-9.]*-++'` echo extra=$extra if test "$extra" != "" then LIBXML_VERSION_EXTRA="-GIT$extra" fi fi fi fi VERSION=${LIBXML_VERSION} am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=libxml2 VERSION=$VERSION cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Support silent build rules, requires at least automake-1.11. Disable # by either passing --disable-silent-rules to configure or passing V=1 # to make # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Extract the first word of "mv", so it can be a program name with args. set dummy mv; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MV+:} false; then : $as_echo_n "(cached) " >&6 else case $MV in [\\/]* | ?:[\\/]*) ac_cv_path_MV="$MV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MV" && ac_cv_path_MV="/bin/mv" ;; esac fi MV=$ac_cv_path_MV if test -n "$MV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5 $as_echo "$MV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "tar", so it can be a program name with args. set dummy tar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_TAR+:} false; then : $as_echo_n "(cached) " >&6 else case $TAR in [\\/]* | ?:[\\/]*) ac_cv_path_TAR="$TAR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_TAR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_TAR" && ac_cv_path_TAR="/bin/tar" ;; esac fi TAR=$ac_cv_path_TAR if test -n "$TAR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TAR" >&5 $as_echo "$TAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="/usr/bin/perl" ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "wget", so it can be a program name with args. set dummy wget; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WGET+:} false; then : $as_echo_n "(cached) " >&6 else case $WGET in [\\/]* | ?:[\\/]*) ac_cv_path_WGET="$WGET" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="/usr/bin/wget" ;; esac fi WGET=$ac_cv_path_WGET if test -n "$WGET"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5 $as_echo "$WGET" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xmllint", so it can be a program name with args. set dummy xmllint; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XMLLINT+:} false; then : $as_echo_n "(cached) " >&6 else case $XMLLINT in [\\/]* | ?:[\\/]*) ac_cv_path_XMLLINT="$XMLLINT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XMLLINT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XMLLINT" && ac_cv_path_XMLLINT="/usr/bin/xmllint" ;; esac fi XMLLINT=$ac_cv_path_XMLLINT if test -n "$XMLLINT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLLINT" >&5 $as_echo "$XMLLINT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xsltproc", so it can be a program name with args. set dummy xsltproc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XSLTPROC+:} false; then : $as_echo_n "(cached) " >&6 else case $XSLTPROC in [\\/]* | ?:[\\/]*) ac_cv_path_XSLTPROC="$XSLTPROC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XSLTPROC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XSLTPROC" && ac_cv_path_XSLTPROC="/usr/bin/xsltproc" ;; esac fi XSLTPROC=$ac_cv_path_XSLTPROC if test -n "$XSLTPROC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 $as_echo "$XSLTPROC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: VERSION_SCRIPT_FLAGS= # lt_cv_prog_gnu_ld is from libtool 2.+ if test "$lt_cv_prog_gnu_ld" = yes; then VERSION_SCRIPT_FLAGS=-Wl,--version-script= else case $host in *-*-sunos*) VERSION_SCRIPT_FLAGS="-Wl,-M -Wl,";; esac fi if test -n "$VERSION_SCRIPT_FLAGS"; then USE_VERSION_SCRIPT_TRUE= USE_VERSION_SCRIPT_FALSE='#' else USE_VERSION_SCRIPT_TRUE='#' USE_VERSION_SCRIPT_FALSE= fi _cppflags="${CPPFLAGS}" _libs="${LIBS}" # Check whether --with-c14n was given. if test "${with_c14n+set}" = set; then : withval=$with_c14n; fi # Check whether --with-catalog was given. if test "${with_catalog+set}" = set; then : withval=$with_catalog; fi # Check whether --with-debug was given. if test "${with_debug+set}" = set; then : withval=$with_debug; fi # Check whether --with-docbook was given. if test "${with_docbook+set}" = set; then : withval=$with_docbook; fi # Check whether --with-fexceptions was given. if test "${with_fexceptions+set}" = set; then : withval=$with_fexceptions; fi # Check whether --with-ftp was given. if test "${with_ftp+set}" = set; then : withval=$with_ftp; fi # Check whether --with-history was given. if test "${with_history+set}" = set; then : withval=$with_history; fi # Check whether --with-html was given. if test "${with_html+set}" = set; then : withval=$with_html; fi # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then : withval=$with_html_dir; HTML_DIR=$withval else HTML_DIR='$(datadir)/doc' fi # Check whether --with-html-subdir was given. if test "${with_html_subdir+set}" = set; then : withval=$with_html_subdir; test "x$withval" != "x" && HTML_DIR="$HTML_DIR/$withval" else HTML_DIR="$HTML_DIR/\$(PACKAGE)-\$(VERSION)/html" fi # Check whether --with-http was given. if test "${with_http+set}" = set; then : withval=$with_http; fi # Check whether --with-iconv was given. if test "${with_iconv+set}" = set; then : withval=$with_iconv; fi # Check whether --with-icu was given. if test "${with_icu+set}" = set; then : withval=$with_icu; fi # Check whether --with-iso8859x was given. if test "${with_iso8859x+set}" = set; then : withval=$with_iso8859x; fi # Check whether --with-legacy was given. if test "${with_legacy+set}" = set; then : withval=$with_legacy; fi # Check whether --with-mem_debug was given. if test "${with_mem_debug+set}" = set; then : withval=$with_mem_debug; fi # Check whether --with-minimum was given. if test "${with_minimum+set}" = set; then : withval=$with_minimum; fi # Check whether --with-output was given. if test "${with_output+set}" = set; then : withval=$with_output; fi # Check whether --with-pattern was given. if test "${with_pattern+set}" = set; then : withval=$with_pattern; fi # Check whether --with-push was given. if test "${with_push+set}" = set; then : withval=$with_push; fi # Check whether --with-python was given. if test "${with_python+set}" = set; then : withval=$with_python; fi # Check whether --with-reader was given. if test "${with_reader+set}" = set; then : withval=$with_reader; fi # Check whether --with-readline was given. if test "${with_readline+set}" = set; then : withval=$with_readline; if test "$withval" != "no" -a "$withval" != "yes"; then RDL_DIR=$withval CPPFLAGS="${CPPFLAGS} -I$withval/include" LIBS="${LIBS} -L$withval/lib" fi fi # Check whether --with-regexps was given. if test "${with_regexps+set}" = set; then : withval=$with_regexps; fi # Check whether --with-run_debug was given. if test "${with_run_debug+set}" = set; then : withval=$with_run_debug; fi # Check whether --with-sax1 was given. if test "${with_sax1+set}" = set; then : withval=$with_sax1; fi # Check whether --with-schemas was given. if test "${with_schemas+set}" = set; then : withval=$with_schemas; fi # Check whether --with-schematron was given. if test "${with_schematron+set}" = set; then : withval=$with_schematron; fi # Check whether --with-threads was given. if test "${with_threads+set}" = set; then : withval=$with_threads; fi # Check whether --with-thread-alloc was given. if test "${with_thread_alloc+set}" = set; then : withval=$with_thread_alloc; fi # Check whether --with-tree was given. if test "${with_tree+set}" = set; then : withval=$with_tree; fi # Check whether --with-valid was given. if test "${with_valid+set}" = set; then : withval=$with_valid; fi # Check whether --with-writer was given. if test "${with_writer+set}" = set; then : withval=$with_writer; fi # Check whether --with-xinclude was given. if test "${with_xinclude+set}" = set; then : withval=$with_xinclude; fi # Check whether --with-xpath was given. if test "${with_xpath+set}" = set; then : withval=$with_xpath; fi # Check whether --with-xptr was given. if test "${with_xptr+set}" = set; then : withval=$with_xptr; fi # Check whether --with-modules was given. if test "${with_modules+set}" = set; then : withval=$with_modules; fi # Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; if test "$withval" != "no" -a "$withval" != "yes"; then Z_DIR=$withval CPPFLAGS="${CPPFLAGS} -I$withval/include" LIBS="${LIBS} -L$withval/lib" fi fi # Check whether --with-lzma was given. if test "${with_lzma+set}" = set; then : withval=$with_lzma; if test "$withval" != "no" -a "$withval" != "yes"; then LZMA_DIR=$withval CPPFLAGS="${CPPFLAGS} -I$withval/include" LIBS="${LIBS} -L$withval/lib" fi fi # Check whether --with-coverage was given. if test "${with_coverage+set}" = set; then : withval=$with_coverage; fi # Check whether --enable-rebuild-docs was given. if test "${enable_rebuild_docs+set}" = set; then : enableval=$enable_rebuild_docs; fi if test "$enable_rebuild_docs" = "yes" -a "$srcdir" != "."; then as_fn_error $? "cannot rebuild docs when builddir != srcdir" "$LINENO" 5 fi if test "$enable_rebuild_docs" = "yes" -o "$USER" = "veillard"; then REBUILD_DOCS_TRUE= REBUILD_DOCS_FALSE='#' else REBUILD_DOCS_TRUE='#' REBUILD_DOCS_FALSE= fi if test "$with_schemas" = "yes" then with_pattern=yes with_regexps=yes fi if test "$with_schematron" = "yes" then with_pattern=yes with_xpath=yes fi if test "$with_reader" = "yes" then with_push=yes fi if test "$with_xptr" = "yes" then with_xpath=yes fi if test "$with_minimum" = "yes" then echo "Configuring for a minimal library" if test "$with_c14n" = "" then with_c14n=no fi if test "$with_catalog" = "" then with_catalog=no fi echo So far so good! if test "$with_debug" = "" then with_debug=no fi if test "$with_docbook" = "" then with_docbook=no fi if test "$with_fexceptions" = "" then with_fexceptions=no fi if test "$with_ftp" = "" then with_ftp=no fi if test "$with_history" = "" then with_history=no fi if test "$with_html" = "" then with_html=no fi if test "$with_http" = "" then with_http=no fi if test "$with_iconv" = "" then with_iconv=no fi if test "$with_iso8859x" = "" then with_iso8859x=no fi if test "$with_legacy" = "" then with_legacy=no fi if test "$with_mem_debug" = "" then with_mem_debug=no fi if test "$with_output" = "" then with_output=no fi if test "$with_pattern" = "" then with_pattern=no fi if test "$with_push" = "" then with_push=no fi if test "$with_python" = "" then with_python=no fi if test "$with_reader" = "" then with_reader=no fi if test "$with_readline" = "" then with_readline=no fi if test "$with_regexps" = "" then with_regexps=no fi if test "$with_run_debug" = "" then with_run_debug=no fi if test "$with_sax1" = "" then with_sax1=no fi if test "$with_schemas" = "" then with_schemas=no fi if test "$with_schematron" = "" then with_schematron=no fi if test "$with_threads" = "" then with_threads=no fi if test "$with_thread_alloc" = "" then with_thread_alloc=no fi if test "$with_tree" = "" then with_tree=no fi if test "$with_valid" = "" then with_valid=no fi if test "$with_writer" = "" then with_writer=no fi if test "$with_xinclude" = "" then with_xinclude=no fi if test "$with_xpath" = "" then with_xpath=no fi if test "$with_xptr" = "" then with_xptr=no fi if test "$with_zlib" = "" then with_zlib=no fi if test "$with_modules" = "" then with_modules=no fi fi echo Checking zlib WITH_ZLIB=0 if test "$with_zlib" = "no"; then echo "Disabling compression support" else for ac_header in zlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzread in -lz" >&5 $as_echo_n "checking for gzread in -lz... " >&6; } if ${ac_cv_lib_z_gzread+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzread (); int main () { return gzread (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzread=yes else ac_cv_lib_z_gzread=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzread" >&5 $as_echo "$ac_cv_lib_z_gzread" >&6; } if test "x$ac_cv_lib_z_gzread" = xyes; then : $as_echo "#define HAVE_LIBZ 1" >>confdefs.h WITH_ZLIB=1 if test "x${Z_DIR}" != "x"; then Z_CFLAGS="-I${Z_DIR}/include" Z_LIBS="-L${Z_DIR}/lib -lz" case ${host} in *-*-solaris*) Z_LIBS="-L${Z_DIR}/lib -R${Z_DIR}/lib -lz" ;; esac else Z_LIBS="-lz" fi fi fi done fi echo Checking lzma WITH_LZMA=0 if test "$with_lzma" = "no"; then echo "Disabling compression support" else for ac_header in lzma.h do : ac_fn_c_check_header_mongrel "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default" if test "x$ac_cv_header_lzma_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LZMA_H 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzma_code in -llzma" >&5 $as_echo_n "checking for lzma_code in -llzma... " >&6; } if ${ac_cv_lib_lzma_lzma_code+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llzma $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lzma_code (); int main () { return lzma_code (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lzma_lzma_code=yes else ac_cv_lib_lzma_lzma_code=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_code" >&5 $as_echo "$ac_cv_lib_lzma_lzma_code" >&6; } if test "x$ac_cv_lib_lzma_lzma_code" = xyes; then : $as_echo "#define HAVE_LIBLZMA 1" >>confdefs.h WITH_LZMA=1 if test "x${LZMA_DIR}" != "x"; then LZMA_CFLAGS="-I${LZMA_DIR}/include" LZMA_LIBS="-L${LZMA_DIR}/lib -llzma" else LZMA_LIBS="-llzma" fi fi fi done fi CPPFLAGS=${_cppflags} LIBS=${_libs} echo Checking headers ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in fcntl.h do : ac_fn_c_check_header_mongrel "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" if test "x$ac_cv_header_fcntl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FCNTL_H 1 _ACEOF fi done for ac_header in unistd.h do : ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNISTD_H 1 _ACEOF fi done for ac_header in ctype.h do : ac_fn_c_check_header_mongrel "$LINENO" "ctype.h" "ac_cv_header_ctype_h" "$ac_includes_default" if test "x$ac_cv_header_ctype_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CTYPE_H 1 _ACEOF fi done for ac_header in dirent.h do : ac_fn_c_check_header_mongrel "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" if test "x$ac_cv_header_dirent_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DIRENT_H 1 _ACEOF fi done for ac_header in errno.h do : ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ERRNO_H 1 _ACEOF fi done for ac_header in malloc.h do : ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_H 1 _ACEOF fi done for ac_header in stdarg.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdarg.h" "ac_cv_header_stdarg_h" "$ac_includes_default" if test "x$ac_cv_header_stdarg_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDARG_H 1 _ACEOF fi done for ac_header in sys/stat.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$ac_includes_default" if test "x$ac_cv_header_sys_stat_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_STAT_H 1 _ACEOF fi done for ac_header in sys/types.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" if test "x$ac_cv_header_sys_types_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TYPES_H 1 _ACEOF fi done for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done for ac_header in inttypes.h do : ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" if test "x$ac_cv_header_inttypes_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H 1 _ACEOF fi done for ac_header in time.h do : ac_fn_c_check_header_mongrel "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default" if test "x$ac_cv_header_time_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TIME_H 1 _ACEOF fi done for ac_header in ansidecl.h do : ac_fn_c_check_header_mongrel "$LINENO" "ansidecl.h" "ac_cv_header_ansidecl_h" "$ac_includes_default" if test "x$ac_cv_header_ansidecl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ANSIDECL_H 1 _ACEOF fi done for ac_header in ieeefp.h do : ac_fn_c_check_header_mongrel "$LINENO" "ieeefp.h" "ac_cv_header_ieeefp_h" "$ac_includes_default" if test "x$ac_cv_header_ieeefp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_IEEEFP_H 1 _ACEOF fi done for ac_header in nan.h do : ac_fn_c_check_header_mongrel "$LINENO" "nan.h" "ac_cv_header_nan_h" "$ac_includes_default" if test "x$ac_cv_header_nan_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NAN_H 1 _ACEOF fi done for ac_header in math.h do : ac_fn_c_check_header_mongrel "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" if test "x$ac_cv_header_math_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MATH_H 1 _ACEOF fi done for ac_header in limits.h do : ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIMITS_H 1 _ACEOF fi done for ac_header in fp_class.h do : ac_fn_c_check_header_mongrel "$LINENO" "fp_class.h" "ac_cv_header_fp_class_h" "$ac_includes_default" if test "x$ac_cv_header_fp_class_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FP_CLASS_H 1 _ACEOF fi done for ac_header in float.h do : ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FLOAT_H 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done for ac_header in sys/socket.h do : ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "#if HAVE_SYS_TYPES_H # include # endif " if test "x$ac_cv_header_sys_socket_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SOCKET_H 1 _ACEOF fi done for ac_header in netinet/in.h do : ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "#if HAVE_SYS_TYPES_H # include # endif " if test "x$ac_cv_header_netinet_in_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NETINET_IN_H 1 _ACEOF fi done for ac_header in arpa/inet.h do : ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "#if HAVE_SYS_TYPES_H # include # endif #if HAVE_ARPA_INET_H # include # endif " if test "x$ac_cv_header_arpa_inet_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ARPA_INET_H 1 _ACEOF fi done for ac_header in netdb.h do : ac_fn_c_check_header_mongrel "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default" if test "x$ac_cv_header_netdb_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NETDB_H 1 _ACEOF fi done for ac_header in sys/time.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" if test "x$ac_cv_header_sys_time_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TIME_H 1 _ACEOF fi done for ac_header in sys/select.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SELECT_H 1 _ACEOF fi done for ac_header in poll.h do : ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" if test "x$ac_cv_header_poll_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POLL_H 1 _ACEOF fi done for ac_header in sys/mman.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mman_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_MMAN_H 1 _ACEOF fi done for ac_header in sys/timeb.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/timeb.h" "ac_cv_header_sys_timeb_h" "$ac_includes_default" if test "x$ac_cv_header_sys_timeb_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TIMEB_H 1 _ACEOF fi done for ac_header in signal.h do : ac_fn_c_check_header_mongrel "$LINENO" "signal.h" "ac_cv_header_signal_h" "$ac_includes_default" if test "x$ac_cv_header_signal_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGNAL_H 1 _ACEOF fi done for ac_header in arpa/nameser.h do : ac_fn_c_check_header_compile "$LINENO" "arpa/nameser.h" "ac_cv_header_arpa_nameser_h" "#if HAVE_SYS_TYPES_H # include # endif " if test "x$ac_cv_header_arpa_nameser_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ARPA_NAMESER_H 1 _ACEOF fi done for ac_header in resolv.h do : ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "#if HAVE_SYS_TYPES_H # include # endif #if HAVE_NETINET_IN_H # include # endif #if HAVE_ARPA_NAMESER_H # include # endif " if test "x$ac_cv_header_resolv_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RESOLV_H 1 _ACEOF fi done for ac_header in dl.h do : ac_fn_c_check_header_mongrel "$LINENO" "dl.h" "ac_cv_header_dl_h" "$ac_includes_default" if test "x$ac_cv_header_dl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DL_H 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done echo Checking types ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac echo Checking libraries for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in strdup strndup strerror do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in finite isnand fp_class class fpclass do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strftime localtime gettimeofday ftime do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in stat _stat signal do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in rand rand_r srand time do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in isascii mmap munmap putenv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5 $as_echo_n "checking for va_copy... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include va_list ap1,ap2; int main () { va_copy(ap1,ap2); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_va_copy=yes else have_va_copy=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_va_copy" >&5 $as_echo "$have_va_copy" >&6; } if test x"$have_va_copy" = x"yes"; then $as_echo "#define HAVE_VA_COPY 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __va_copy" >&5 $as_echo_n "checking for __va_copy... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include va_list ap1,ap2; int main () { __va_copy(ap1,ap2); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have___va_copy=yes else have___va_copy=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have___va_copy" >&5 $as_echo "$have___va_copy" >&6; } if test x"$have___va_copy" = x"yes"; then $as_echo "#define HAVE___VA_COPY 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostent" >&5 $as_echo_n "checking for library containing gethostent... " >&6; } if ${ac_cv_search_gethostent+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostent (); int main () { return gethostent (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostent=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostent+:} false; then : break fi done if ${ac_cv_search_gethostent+:} false; then : else ac_cv_search_gethostent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostent" >&5 $as_echo "$ac_cv_search_gethostent" >&6; } ac_res=$ac_cv_search_gethostent if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 $as_echo_n "checking for library containing setsockopt... " >&6; } if ${ac_cv_search_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF for ac_lib in '' socket net network; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_setsockopt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_setsockopt+:} false; then : break fi done if ${ac_cv_search_setsockopt+:} false; then : else ac_cv_search_setsockopt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setsockopt" >&5 $as_echo "$ac_cv_search_setsockopt" >&6; } ac_res=$ac_cv_search_setsockopt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing connect" >&5 $as_echo_n "checking for library containing connect... " >&6; } if ${ac_cv_search_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF for ac_lib in '' inet; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_connect=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_connect+:} false; then : break fi done if ${ac_cv_search_connect+:} false; then : else ac_cv_search_connect=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_connect" >&5 $as_echo "$ac_cv_search_connect" >&6; } ac_res=$ac_cv_search_connect if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of socket length (socklen_t)" >&5 $as_echo_n "checking for type of socket length (socklen_t)... " >&6; } cat > conftest.$ac_ext < #include #include int main(void) { (void)getsockopt (1, 1, 1, NULL, (socklen_t *)NULL) ; return 0; } EOF if { (eval echo configure:13596: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then rm -rf conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: socklen_t *" >&5 $as_echo "socklen_t *" >&6; } XML_SOCKLEN_T=socklen_t else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* cat > conftest.$ac_ext < #include #include int main(void) { (void)getsockopt (1, 1, 1, NULL, (size_t *)NULL) ; return 0; } EOF if { (eval echo configure:13619: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then rm -rf conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: size_t *" >&5 $as_echo "size_t *" >&6; } XML_SOCKLEN_T=size_t else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* cat > conftest.$ac_ext < #include #include int main(void) { (void)getsockopt (1, 1, 1, NULL, (int *)NULL) ; return 0; } EOF if { (eval echo configure:13642: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then rm -rf conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: int *" >&5 $as_echo "int *" >&6; } XML_SOCKLEN_T=int else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not determine" >&5 $as_echo "$as_me: WARNING: could not determine" >&2;} XML_SOCKLEN_T="int" fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* cat >>confdefs.h <<_ACEOF #define XML_SOCKLEN_T $XML_SOCKLEN_T _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable IPv6" >&5 $as_echo_n "checking whether to enable IPv6... " >&6; } # Check whether --enable-ipv6 was given. if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; else enable_ipv6=yes fi if test "$with_minimum" = "yes" then enable_ipv6=no fi if test $enable_ipv6 = yes; then have_ipv6=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { struct sockaddr_storage ss; socket(AF_INET6, SOCK_STREAM, 0) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_ipv6=yes else have_ipv6=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_ipv6" >&5 $as_echo "$have_ipv6" >&6; } if test $have_ipv6 = yes; then $as_echo "#define SUPPORT_IP6 /**/" >>confdefs.h have_broken_ss_family=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking struct sockaddr::ss_family" >&5 $as_echo_n "checking struct sockaddr::ss_family... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { struct sockaddr_storage ss ; ss.ss_family = 0 ; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_ss_family=yes else have_ss_family=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_ss_family" >&5 $as_echo "$have_ss_family" >&6; } if test x$have_ss_family = xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking broken struct sockaddr::ss_family" >&5 $as_echo_n "checking broken struct sockaddr::ss_family... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { struct sockaddr_storage ss ; ss.__ss_family = 0 ; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_broken_ss_family=yes else have_broken_ss_family=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_broken_ss_family" >&5 $as_echo "$have_broken_ss_family" >&6; } if test x$have_broken_ss_family = xyes ; then $as_echo "#define HAVE_BROKEN_SS_FAMILY /**/" >>confdefs.h $as_echo "#define ss_family __ss_family" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ss_family and __ss_family not found" >&5 $as_echo "$as_me: WARNING: ss_family and __ss_family not found" >&2;} fi fi have_getaddrinfo=no ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" if test "x$ac_cv_func_getaddrinfo" = xyes; then : have_getaddrinfo=yes fi if test $have_getaddrinfo != yes; then for lib in bsd socket inet; do as_ac_Lib=`$as_echo "ac_cv_lib_$lib''_getaddrinfo" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -l$lib" >&5 $as_echo_n "checking for getaddrinfo in -l$lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getaddrinfo (); int main () { return getaddrinfo (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$lib";have_getaddrinfo=yes;break fi done fi if test $have_getaddrinfo = yes; then $as_echo "#define HAVE_GETADDRINFO /**/" >>confdefs.h fi fi fi ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" if test "x$ac_cv_func_isnan" = xyes; then : $as_echo "#define HAVE_ISNAN /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan in -lm" >&5 $as_echo_n "checking for isnan in -lm... " >&6; } if ${ac_cv_lib_m_isnan+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char isnan (); int main () { return isnan (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_isnan=yes else ac_cv_lib_m_isnan=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_isnan" >&5 $as_echo "$ac_cv_lib_m_isnan" >&6; } if test "x$ac_cv_lib_m_isnan" = xyes; then : $as_echo "#define HAVE_ISNAN /**/" >>confdefs.h fi fi ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" if test "x$ac_cv_func_isinf" = xyes; then : $as_echo "#define HAVE_ISINF /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf in -lm" >&5 $as_echo_n "checking for isinf in -lm... " >&6; } if ${ac_cv_lib_m_isinf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char isinf (); int main () { return isinf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_isinf=yes else ac_cv_lib_m_isinf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_isinf" >&5 $as_echo "$ac_cv_lib_m_isinf" >&6; } if test "x$ac_cv_lib_m_isinf" = xyes; then : $as_echo "#define HAVE_ISINF /**/" >>confdefs.h fi fi XML_LIBDIR='-L${libdir}' XML_INCLUDEDIR='-I${includedir}/libxml2' XML_CFLAGS="" RDL_LIBS="" if test "${GCC}" != "yes" ; then case "${host}" in hppa*-*-hpux* ) CFLAGS="${CFLAGS} -Wp,-H30000" ;; *-dec-osf* ) CFLAGS="${CFLAGS} -ieee" ;; alpha*-*-linux* ) CFLAGS="${CFLAGS} -ieee" ;; esac else if test "$with_fexceptions" = "yes" then # # Not activated by default because this inflates the code size # Used to allow propagation of C++ exceptions through the library # CFLAGS="${CFLAGS} -fexceptions" fi # warnings we'd like to see CFLAGS="${CFLAGS} -pedantic -W -Wformat -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat -Wchar-subscripts -Wuninitialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls" # warnings we'd like to supress CFLAGS="${CFLAGS} -Wno-long-long" case "${host}" in alpha*-*-linux* ) CFLAGS="${CFLAGS} -mieee" ;; alpha*-*-osf* ) CFLAGS="${CFLAGS} -mieee" ;; esac fi case ${host} in *-*-solaris*) XML_LIBDIR="${XML_LIBDIR} -R${libdir}" ;; hppa*-hp-mpeix) NEED_TRIO=1 ;; *-*-mingw* | *-*-cygwin* | *-*-msvc* ) # If the host is Windows, and shared libraries are disabled, we # need to add -DLIBXML_STATIC to CFLAGS in order for linking to # work properly (without it, xmlexports.h would force the use of # DLL imports, which obviously aren't present in a static # library). if test "x$enable_shared" = "xno"; then XML_CFLAGS="$XML_CFLAGS -DLIBXML_STATIC" CFLAGS="$CFLAGS -DLIBXML_STATIC" fi ;; esac PYTHON_VERSION= PYTHON_INCLUDES= PYTHON_SITE_PACKAGES= PYTHON_TESTS= pythondir= if test "$with_python" != "no" ; then if test -x "$with_python/bin/python" then echo Found python in $with_python/bin/python PYTHON="$with_python/bin/python" else if test -x "$with_python/python.exe" then echo Found python in $with_python/python.exe PYTHON="$with_python/python.exe" else if test -x "$with_python" then echo Found python in $with_python PYTHON="$with_python" else if test -x "$PYTHON" then echo Found python in environment PYTHON=$PYTHON with_python=`$PYTHON -c "import sys; print(sys.exec_prefix)"` else # Extract the first word of "python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5", so it can be a program name with args. set dummy python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi fi fi if test "$PYTHON" != "" then PYTHON_VERSION=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_version())"` PYTHON_INCLUDES=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_inc())"` # does not work as it produce a /usr/lib/python path instead of/usr/lib64/python # # PYTHON_SITE_PACKAGES=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_lib())"` echo Found Python version $PYTHON_VERSION fi if test "$PYTHON_VERSION" != "" -a "$PYTHON_INCLUDES" = "" then if test -r $with_python/include/python$PYTHON_VERSION/Python.h then PYTHON_INCLUDES=$with_python/include/python$PYTHON_VERSION else if test -r $prefix/include/python$PYTHON_VERSION/Python.h then PYTHON_INCLUDES=$prefix/include/python$PYTHON_VERSION else if test -r /usr/include/python$PYTHON_VERSION/Python.h then PYTHON_INCLUDES=/usr/include/python$PYTHON_VERSION else if test -r $with_python/include/Python.h then PYTHON_INCLUDES=$with_python/include else echo could not find python$PYTHON_VERSION/Python.h or $with_python/include/Python.h fi fi fi fi fi if test "$PYTHON_VERSION" != "" -a "$PYTHON_SITE_PACKAGES" = "" then if test -d $libdir/python$PYTHON_VERSION/site-packages then PYTHON_SITE_PACKAGES=$libdir/python$PYTHON_VERSION/site-packages else if test -d $with_python/lib/site-packages then PYTHON_SITE_PACKAGES=$with_python/lib/site-packages else PYTHON_SITE_PACKAGES=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_lib())"` fi fi fi pythondir='$(PYTHON_SITE_PACKAGES)' PYTHON_LIBS=`python$PYTHON_VERSION-config --ldflags` else PYTHON= fi if test "$PYTHON_INCLUDES" != ""; then WITH_PYTHON_TRUE= WITH_PYTHON_FALSE='#' else WITH_PYTHON_TRUE='#' WITH_PYTHON_FALSE= fi if test "$PYTHON_INCLUDES" != "" then PYTHON_SUBDIR=python else PYTHON_SUBDIR= fi WITH_MODULES=0 TEST_MODULES= if test "$with_modules" != "no" ; then case "$host" in *-*-cygwin*) MODULE_EXTENSION=".dll" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lcygwin" >&5 $as_echo_n "checking for dlopen in -lcygwin... " >&6; } if ${ac_cv_lib_cygwin_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcygwin $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cygwin_dlopen=yes else ac_cv_lib_cygwin_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cygwin_dlopen" >&5 $as_echo "$ac_cv_lib_cygwin_dlopen" >&6; } if test "x$ac_cv_lib_cygwin_dlopen" = xyes; then : WITH_MODULES=1 MODULE_PLATFORM_LIBS= $as_echo "#define HAVE_DLOPEN /**/" >>confdefs.h fi ;; *-*-mingw*) MODULE_EXTENSION=".dll" WITH_MODULES=1 ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : libxml_have_shl_load=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : MODULE_PLATFORM_LIBS="-ldld" libxml_have_shl_load=yes else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : libxml_have_dlopen=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : MODULE_PLATFORM_LIBS="-ldl" libxml_have_dlopen=yes fi fi fi fi if test "${libxml_have_shl_load}" = "yes"; then MODULE_EXTENSION=".sl" WITH_MODULES=1 $as_echo "#define HAVE_SHLLOAD /**/" >>confdefs.h fi if test "${libxml_have_dlopen}" = "yes"; then case "${host}" in *-*-hpux* ) MODULE_EXTENSION=".sl" ;; * ) MODULE_EXTENSION=".so" ;; esac WITH_MODULES=1 $as_echo "#define HAVE_DLOPEN /**/" >>confdefs.h fi ;; esac fi if test "${WITH_MODULES}" = "1"; then TEST_MODULES="ModuleTests" fi if [ "${LOGNAME}" = "veillard" -a "`pwd`" = "/u/veillard/XML" ] || \ [ "${LOGNAME}" = "veillard" -a "`pwd`" = "/home/veillard/libxml2" ] || \ [ "${LOGNAME}" = "bill" -a "`pwd`" = "/home/bill/gnomesvn/libxml2" ] then if test "$with_minimum" != "yes" then if test "${with_mem_debug}" = "" ; then echo Activating memory debugging with_mem_debug="yes" with_run_debug="yes" fi if test "${with_docbook}" = "" ; then with_docbook="yes" fi fi if test "${GCC}" = "yes" ; then CFLAGS="-g -O -pedantic -W -Wformat -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat -Wchar-subscripts -Wuninitialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls -Wall" fi STATIC_BINARIES="-static" else STATIC_BINARIES= fi if test "${NEED_TRIO}" = "1" ; then echo Adding trio library for string functions WITH_TRIO=1 else WITH_TRIO=0 fi if test "${NEED_TRIO}" = "1"; then WITH_TRIO_SOURCES_TRUE= WITH_TRIO_SOURCES_FALSE='#' else WITH_TRIO_SOURCES_TRUE='#' WITH_TRIO_SOURCES_FALSE= fi echo Checking configuration requirements THREAD_LIBS="" BASE_THREAD_LIBS="" WITH_THREADS=0 THREAD_CFLAGS="" TEST_THREADS="" THREADS_W32="" WITH_THREAD_ALLOC=0 if test "$with_threads" = "no" ; then echo Disabling multithreaded support else echo Enabling multithreaded support case $host_os in *mingw32*) if test "$with_threads" != "pthread" && test "$with_threads" != "no"; then WITH_THREADS="1" THREADS_W32="1" THREAD_CFLAGS="$THREAD_CFLAGS -DHAVE_WIN32_THREADS" fi ;; esac if test -z "$THREADS_W32"; then if test "$with_threads" = "pthread" || test "$with_threads" = "" || test "$with_threads" = "yes" ; then ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in -lpthread" >&5 $as_echo_n "checking for pthread_join in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_join+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_join=yes else ac_cv_lib_pthread_pthread_join=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_join" >&5 $as_echo "$ac_cv_lib_pthread_pthread_join" >&6; } if test "x$ac_cv_lib_pthread_pthread_join" = xyes; then : THREAD_LIBS="-lpthread" $as_echo "#define HAVE_LIBPTHREAD /**/" >>confdefs.h $as_echo "#define HAVE_PTHREAD_H /**/" >>confdefs.h WITH_THREADS="1" fi fi fi fi case $host_os in *cygwin*) THREAD_LIBS="" ;; *beos*) WITH_THREADS="1" THREAD_CFLAGS="$THREAD_CFLAGS -DHAVE_BEOS_THREADS" ;; *linux*) if test "${GCC}" = "yes" ; then GCC_VERSION=`${CC} --version | head -1 | awk '{print $3}'` GCC_MAJOR=`echo ${GCC_VERSION} | sed 's+\..*++'` GCC_MEDIUM=`echo ${GCC_VERSION} | sed 's+[0-9]*\.++' | sed 's+\..*++'` if test "${THREAD_LIBS}" = "-lpthread" ; then if expr ${GCC_MEDIUM} \> 2 \& ${GCC_MAJOR} = 3 > /dev/null then THREAD_LIBS="" BASE_THREAD_LIBS="-lpthread" else if expr ${GCC_MAJOR} \> 3 > /dev/null then THREAD_LIBS="" BASE_THREAD_LIBS="-lpthread" else echo old GCC disabling weak symbols for pthread fi fi fi fi ;; esac if test "$WITH_THREADS" = "1" ; then THREAD_CFLAGS="$THREAD_CFLAGS -D_REENTRANT" TEST_THREADS="Threadtests" fi fi if test "$with_thread_alloc" = "yes" -a "$WITH_THREADS" = "1" ; then WITH_THREAD_ALLOC=1 fi if test -n "$THREADS_W32"; then THREADS_W32_TRUE= THREADS_W32_FALSE='#' else THREADS_W32_TRUE='#' THREADS_W32_FALSE= fi if test "$with_history" = "yes" ; then echo Enabling xmllint shell history unset tcap for termlib in ncurses curses termcap terminfo termlib; do as_ac_Lib=`$as_echo "ac_cv_lib_${termlib}''_tputs" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -l${termlib}" >&5 $as_echo_n "checking for tputs in -l${termlib}... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${termlib} $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tputs (); int main () { return tputs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : tcap="-l$termlib" fi test -n "$tcap" && break done ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" if test "x$ac_cv_header_readline_history_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for append_history in -lhistory" >&5 $as_echo_n "checking for append_history in -lhistory... " >&6; } if ${ac_cv_lib_history_append_history+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lhistory $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char append_history (); int main () { return append_history (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_history_append_history=yes else ac_cv_lib_history_append_history=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_history_append_history" >&5 $as_echo "$ac_cv_lib_history_append_history" >&6; } if test "x$ac_cv_lib_history_append_history" = xyes; then : RDL_LIBS="-lhistory" $as_echo "#define HAVE_LIBHISTORY /**/" >>confdefs.h fi fi ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" if test "x$ac_cv_header_readline_readline_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 $as_echo_n "checking for readline in -lreadline... " >&6; } if ${ac_cv_lib_readline_readline+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $tcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char readline (); int main () { return readline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else ac_cv_lib_readline_readline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 $as_echo "$ac_cv_lib_readline_readline" >&6; } if test "x$ac_cv_lib_readline_readline" = xyes; then : RDL_LIBS="-lreadline $RDL_LIBS $tcap" $as_echo "#define HAVE_LIBREADLINE /**/" >>confdefs.h fi fi if test -n "$RDL_DIR" -a -n "$RDL_LIBS"; then CPPFLAGS="$CPPFLAGS -I${RDL_DIR}/include" RDL_LIBS="-L${RDL_DIR}/lib $RDL_LIBS" fi fi if test "$with_tree" = "no" ; then echo Disabling DOM like tree manipulation APIs WITH_TREE=0 else WITH_TREE=1 fi if test "$with_ftp" = "no" ; then echo Disabling FTP support WITH_FTP=0 FTP_OBJ= else WITH_FTP=1 FTP_OBJ=nanoftp.o fi if test "$with_http" = "no" ; then echo Disabling HTTP support WITH_HTTP=0 HTTP_OBJ= else WITH_HTTP=1 HTTP_OBJ=nanohttp.o fi if test "$with_legacy" = "no" ; then echo Disabling deprecated APIs WITH_LEGACY=0 else WITH_LEGACY=1 fi if test "$with_reader" = "no" ; then echo Disabling the xmlReader parsing interface WITH_READER=0 READER_TEST= else WITH_READER=1 READER_TEST=Readertests if test "$with_push" = "no" ; then echo xmlReader requires Push interface - enabling it with_push=yes fi fi if test "$with_writer" = "no" ; then echo Disabling the xmlWriter saving interface WITH_WRITER=0 # WRITER_TEST= else WITH_WRITER=1 # WRITER_TEST=Writertests if test "$with_push" = "no" ; then echo xmlWriter requires Push interface - enabling it with_push=yes fi if test "$with_output" = "no" ; then echo xmlWriter requires Output interface - enabling it with_output=yes fi fi #AC_SUBST(WRITER_TEST) if test "$with_pattern" = "no" ; then echo Disabling the xmlPattern parsing interface WITH_PATTERN=0 TEST_PATTERN= else WITH_PATTERN=1 TEST_PATTERN=Patterntests fi if test "$with_sax1" = "no" ; then echo Disabling the older SAX1 interface WITH_SAX1=0 TEST_SAX= else WITH_SAX1=1 TEST_SAX=SAXtests fi if test "${WITH_TRIO}" = "1"; then WITH_SAX1_SOURCES_TRUE= WITH_SAX1_SOURCES_FALSE='#' else WITH_SAX1_SOURCES_TRUE='#' WITH_SAX1_SOURCES_FALSE= fi if test "$with_push" = "no" ; then echo Disabling the PUSH parser interfaces WITH_PUSH=0 TEST_PUSH= else WITH_PUSH=1 TEST_PUSH="XMLPushtests" fi if test "$with_html" = "no" ; then echo Disabling HTML support WITH_HTML=0 HTML_OBJ= TEST_HTML= else WITH_HTML=1 HTML_OBJ="HTMLparser.o HTMLtree.o" TEST_HTML=HTMLtests if test "$with_push" != "no" ; then TEST_PHTML=HTMLPushtests else TEST_PHTML= fi fi if test "$with_valid" = "no" ; then echo Disabling DTD validation support WITH_VALID=0 TEST_VALID= TEST_VTIME= else WITH_VALID=1 TEST_VALID=Validtests TEST_VTIME=VTimingtests fi if test "$with_catalog" = "no" ; then echo Disabling Catalog support WITH_CATALOG=0 CATALOG_OBJ= TEST_CATALOG= else WITH_CATALOG=1 CATALOG_OBJ="catalog.o" TEST_CATALOG=Catatests fi if test "$with_docbook" = "no" ; then echo Disabling Docbook support WITH_DOCB=0 DOCB_OBJ= else WITH_DOCB=1 DOCB_OBJ="DOCBparser.o" fi if test "$with_xptr" = "no" ; then echo Disabling XPointer support WITH_XPTR=0 XPTR_OBJ= TEST_XPTR= else WITH_XPTR=1 XPTR_OBJ=xpointer.o TEST_XPTR=XPtrtests if test "$with_xpath" = "no" ; then echo XPointer requires XPath support - enabling it with_xpath=yes fi fi if test "$with_c14n" = "no" ; then echo Disabling C14N support WITH_C14N=0 C14N_OBJ= TEST_C14N= else WITH_C14N=1 C14N_OBJ="c14n.c" TEST_C14N=C14Ntests if test "$with_xpath" = "no" ; then echo C14N requires XPath support - enabling it with_xpath=yes fi fi if test "$with_xinclude" = "no" ; then echo Disabling XInclude support WITH_XINCLUDE=0 XINCLUDE_OBJ= with_xinclude="no" TEST_XINCLUDE= else WITH_XINCLUDE=1 XINCLUDE_OBJ=xinclude.o TEST_XINCLUDE=XIncludetests if test "$with_xpath" = "no" ; then echo XInclude requires XPath support - enabling it with_xpath=yes fi fi if test "$with_xpath" = "no" ; then echo Disabling XPATH support WITH_XPATH=0 XPATH_OBJ= TEST_XPATH= else WITH_XPATH=1 XPATH_OBJ=xpath.o TEST_XPATH=XPathtests fi if test "$with_output" = "no" ; then echo Disabling serialization/saving support WITH_OUTPUT=0 else WITH_OUTPUT=1 fi WITH_ICONV=0 if test "$with_iconv" = "no" ; then echo Disabling ICONV support else if test "$with_iconv" != "yes" -a "$with_iconv" != "" ; then CPPFLAGS="${CPPFLAGS} -I$with_iconv/include" # Export this since our headers include iconv.h XML_INCLUDEDIR="${XML_INCLUDEDIR} -I$with_iconv/include" ICONV_LIBS="-L$with_iconv/lib" fi ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" if test "x$ac_cv_header_iconv_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open ("",""); iconv (cd, NULL, NULL, NULL, NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WITH_ICONV=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv in -liconv" >&5 $as_echo_n "checking for iconv in -liconv... " >&6; } _ldflags="${LDFLAGS}" _libs="${LIBS}" LDFLAGS="${LDFLAGS} ${ICONV_LIBS}" LIBS="${LIBS} -liconv" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open ("",""); iconv (cd, NULL, NULL, NULL, NULL); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WITH_ICONV=1 ICONV_LIBS="${ICONV_LIBS} -liconv" LIBS="${_libs}" LDFLAGS="${_ldflags}" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } LIBS="${_libs}" LDFLAGS="${_ldflags}" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi if test "$WITH_ICONV" = "1" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${xml_cv_iconv_arg2+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : xml_cv_iconv_arg2="" else xml_cv_iconv_arg2="const" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi xml_cv_iconv_decl="extern size_t iconv (iconv_t cd, $xml_cv_iconv_arg2 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${xml_xxx:- }$xml_cv_iconv_decl" >&5 $as_echo "${xml_xxx:- }$xml_cv_iconv_decl" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $xml_cv_iconv_arg2 _ACEOF fi fi case "$host" in *mingw*) M_LIBS="" ;; *beos*) M_LIBS="" ;; *haiku*) M_LIBS="" ;; *) M_LIBS="-lm" ;; esac XML_LIBS="-lxml2 $Z_LIBS $THREAD_LIBS $ICONV_LIBS $M_LIBS $LIBS" XML_LIBTOOLLIBS="libxml2.la" WITH_ICU=0 ICU_LIBS="" if test "$with_icu" != "yes" ; then echo Disabling ICU support else ICU_CONFIG=icu-config if ${ICU_CONFIG} --cflags >/dev/null 2>&1 then ICU_LIBS=`${ICU_CONFIG} --ldflags` WITH_ICU=1 echo Enabling ICU support else as_fn_error $? "libicu config program icu-config not found" "$LINENO" 5 fi fi WITH_ISO8859X=1 if test "$WITH_ICONV" != "1" ; then if test "$with_iso8859x" = "no" ; then echo Disabling ISO8859X support WITH_ISO8859X=0 fi fi if test "$with_schematron" = "no" ; then echo "Disabling Schematron support" WITH_SCHEMATRON=0 TEST_SCHEMATRON= else echo "Enabled Schematron support" WITH_SCHEMATRON=1 TEST_SCHEMATRON="Schematrontests" with_xpath=yes with_pattern=yes fi if test "$with_schemas" = "no" ; then echo "Disabling Schemas/Relax-NG support" WITH_SCHEMAS=0 TEST_SCHEMAS= else echo "Enabled Schemas/Relax-NG support" WITH_SCHEMAS=1 TEST_SCHEMAS="Schemastests Relaxtests" if test "$PYTHON_INCLUDES" != "" ; then PYTHON_TESTS="$PYTHON_TESTS RelaxNGPythonTests SchemasPythonTests" fi with_regexps=yes fi if test "$with_regexps" = "no" ; then echo Disabling Regexps support WITH_REGEXPS=0 TEST_REGEXPS= else WITH_REGEXPS=1 TEST_REGEXPS="Regexptests Automatatests" fi if test "$with_debug" = "no" ; then echo Disabling DEBUG support WITH_DEBUG=0 DEBUG_OBJ= TEST_DEBUG= else WITH_DEBUG=1 DEBUG_OBJ=debugXML.o TEST_DEBUG=Scripttests fi if test "$with_mem_debug" = "yes" ; then if test "$with_thread_alloc" = "yes" ; then echo Disabling memory debug - cannot use mem-debug with thread-alloc! WITH_MEM_DEBUG=0 else echo Enabling memory debug support WITH_MEM_DEBUG=1 fi else WITH_MEM_DEBUG=0 fi if test "$with_run_debug" = "yes" ; then echo Enabling runtime debug support WITH_RUN_DEBUG=1 else WITH_RUN_DEBUG=0 fi WIN32_EXTRA_LIBADD= WIN32_EXTRA_LDFLAGS= CYGWIN_EXTRA_LDFLAGS= CYGWIN_EXTRA_PYTHON_LIBADD= WIN32_EXTRA_PYTHON_LIBADD= case "$host" in *-*-mingw*) CPPFLAGS="$CPPFLAGS -DWIN32" WIN32_EXTRA_LIBADD="-lws2_32" WIN32_EXTRA_LDFLAGS="-no-undefined" $as_echo "#define _WINSOCKAPI_ 1" >>confdefs.h if test "${PYTHON}" != "" then WIN32_EXTRA_PYTHON_LIBADD="-L${pythondir}/../../libs -lpython$(echo ${PYTHON_VERSION} | tr -d .)" fi ;; *-*-cygwin*) CYGWIN_EXTRA_LDFLAGS="-no-undefined" if test "${PYTHON}" != "" then CYGWIN_EXTRA_PYTHON_LIBADD="-L/usr/lib/python${PYTHON_VERSION}/config -lpython${PYTHON_VERSION}" fi ;; esac for ac_func in printf sprintf fprintf snprintf vfprintf vsprintf vsnprintf sscanf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else NEED_TRIO=1 fi done if test "$with_coverage" = "yes" -a "${GCC}" = "yes" then echo Enabling code coverage for GCC CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage" LDFLAGS="$LDFLAGS -fprofile-arcs -ftest-coverage" else echo Disabling code coverage for GCC fi RELDATE=`date +'%a %b %e %Y'` rm -f COPYING.LIB COPYING ln -s $srcdir/Copyright COPYING # keep on one line for cygwin c.f. #130896 ac_config_files="$ac_config_files libxml2.spec:libxml.spec.in Makefile include/Makefile include/libxml/Makefile doc/Makefile doc/examples/Makefile doc/devhelp/Makefile example/Makefile python/Makefile python/tests/Makefile xstc/Makefile include/libxml/xmlversion.h xml2-config libxml-2.0.pc libxml-2.0-uninstalled.pc python/setup.py" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_VERSION_SCRIPT_TRUE}" && test -z "${USE_VERSION_SCRIPT_FALSE}"; then as_fn_error $? "conditional \"USE_VERSION_SCRIPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${REBUILD_DOCS_TRUE}" && test -z "${REBUILD_DOCS_FALSE}"; then as_fn_error $? "conditional \"REBUILD_DOCS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_PYTHON_TRUE}" && test -z "${WITH_PYTHON_FALSE}"; then as_fn_error $? "conditional \"WITH_PYTHON\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_TRIO_SOURCES_TRUE}" && test -z "${WITH_TRIO_SOURCES_FALSE}"; then as_fn_error $? "conditional \"WITH_TRIO_SOURCES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${THREADS_W32_TRUE}" && test -z "${THREADS_W32_FALSE}"; then as_fn_error $? "conditional \"THREADS_W32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_SAX1_SOURCES_TRUE}" && test -z "${WITH_SAX1_SOURCES_FALSE}"; then as_fn_error $? "conditional \"WITH_SAX1_SOURCES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "libxml2.spec") CONFIG_FILES="$CONFIG_FILES libxml2.spec:libxml.spec.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "include/libxml/Makefile") CONFIG_FILES="$CONFIG_FILES include/libxml/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/examples/Makefile") CONFIG_FILES="$CONFIG_FILES doc/examples/Makefile" ;; "doc/devhelp/Makefile") CONFIG_FILES="$CONFIG_FILES doc/devhelp/Makefile" ;; "example/Makefile") CONFIG_FILES="$CONFIG_FILES example/Makefile" ;; "python/Makefile") CONFIG_FILES="$CONFIG_FILES python/Makefile" ;; "python/tests/Makefile") CONFIG_FILES="$CONFIG_FILES python/tests/Makefile" ;; "xstc/Makefile") CONFIG_FILES="$CONFIG_FILES xstc/Makefile" ;; "include/libxml/xmlversion.h") CONFIG_FILES="$CONFIG_FILES include/libxml/xmlversion.h" ;; "xml2-config") CONFIG_FILES="$CONFIG_FILES xml2-config" ;; "libxml-2.0.pc") CONFIG_FILES="$CONFIG_FILES libxml-2.0.pc" ;; "libxml-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES libxml-2.0-uninstalled.pc" ;; "python/setup.py") CONFIG_FILES="$CONFIG_FILES python/setup.py" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi chmod +x xml2-config python/setup.py echo Done configuring libxml2-2.9.1+dfsg1/buf.h0000644000175000017500000000445712113312340013501 0ustar aronaron/* * Summary: Internal Interfaces for memory buffers in libxml2 * Description: this module describes most of the new xmlBuf buffer * entry points, those are private routines, with a * few exceptions exported in tree.h. This was added * in 2.9.0. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_BUF_H__ #define __XML_BUF_H__ #include #ifdef __cplusplus extern "C" { #endif xmlBufPtr xmlBufCreate(void); xmlBufPtr xmlBufCreateSize(size_t size); xmlBufPtr xmlBufCreateStatic(void *mem, size_t size); int xmlBufSetAllocationScheme(xmlBufPtr buf, xmlBufferAllocationScheme scheme); int xmlBufGetAllocationScheme(xmlBufPtr buf); void xmlBufFree(xmlBufPtr buf); void xmlBufEmpty(xmlBufPtr buf); /* size_t xmlBufShrink(xmlBufPtr buf, size_t len); */ int xmlBufGrow(xmlBufPtr buf, int len); int xmlBufInflate(xmlBufPtr buf, size_t len); int xmlBufResize(xmlBufPtr buf, size_t len); int xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len); int xmlBufAddHead(xmlBufPtr buf, const xmlChar *str, int len); int xmlBufCat(xmlBufPtr buf, const xmlChar *str); int xmlBufCCat(xmlBufPtr buf, const char *str); int xmlBufWriteCHAR(xmlBufPtr buf, const xmlChar *string); int xmlBufWriteChar(xmlBufPtr buf, const char *string); int xmlBufWriteQuotedString(xmlBufPtr buf, const xmlChar *string); size_t xmlBufAvail(const xmlBufPtr buf); size_t xmlBufLength(const xmlBufPtr buf); /* size_t xmlBufUse(const xmlBufPtr buf); */ int xmlBufIsEmpty(const xmlBufPtr buf); int xmlBufAddLen(xmlBufPtr buf, size_t len); int xmlBufErase(xmlBufPtr buf, size_t len); /* const xmlChar * xmlBufContent(const xmlBufPtr buf); */ /* const xmlChar * xmlBufEnd(const xmlBufPtr buf); */ xmlChar * xmlBufDetach(xmlBufPtr buf); size_t xmlBufDump(FILE *file, xmlBufPtr buf); xmlBufPtr xmlBufFromBuffer(xmlBufferPtr buffer); xmlBufferPtr xmlBufBackToBuffer(xmlBufPtr buf); int xmlBufMergeBuffer(xmlBufPtr buf, xmlBufferPtr buffer); int xmlBufResetInput(xmlBufPtr buf, xmlParserInputPtr input); size_t xmlBufGetInputBase(xmlBufPtr buf, xmlParserInputPtr input); int xmlBufSetInputBaseCur(xmlBufPtr buf, xmlParserInputPtr input, size_t base, size_t cur); #ifdef __cplusplus } #endif #endif /* __XML_BUF_H__ */ libxml2-2.9.1+dfsg1/triostr.c0000644000175000017500000012166412113312343014431 0ustar aronaron/************************************************************************* * * $Id$ * * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. * ************************************************************************/ /************************************************************************* * Include files */ #include #include #include #include #include #include "triodef.h" #include "triostr.h" /************************************************************************* * Definitions */ #if !defined(TRIO_STRING_PUBLIC) # define TRIO_STRING_PUBLIC TRIO_PUBLIC #endif #if !defined(TRIO_STRING_PRIVATE) # define TRIO_STRING_PRIVATE TRIO_PRIVATE #endif #if !defined(NULL) # define NULL 0 #endif #if !defined(NIL) # define NIL ((char)0) #endif #if !defined(FALSE) # define FALSE (1 == 0) # define TRUE (! FALSE) #endif #if !defined(BOOLEAN_T) # define BOOLEAN_T int #endif #if defined(TRIO_COMPILER_SUPPORTS_C99) # define USE_STRTOD # define USE_STRTOF #elif defined(TRIO_COMPILER_MSVC) # define USE_STRTOD #endif #if defined(TRIO_PLATFORM_UNIX) # define USE_STRCASECMP # define USE_STRNCASECMP # if defined(TRIO_PLATFORM_SUNOS) # define USE_SYS_ERRLIST # else # define USE_STRERROR # endif # if defined(TRIO_PLATFORM_QNX) # define strcasecmp(x,y) stricmp(x,y) # define strncasecmp(x,y,n) strnicmp(x,y,n) # endif #elif defined(TRIO_PLATFORM_WIN32) # define USE_STRCASECMP # if defined(_WIN32_WCE) # define strcasecmp(x,y) _stricmp(x,y) # else # define strcasecmp(x,y) strcmpi(x,y) # endif #endif #if !(defined(TRIO_PLATFORM_SUNOS)) # define USE_TOLOWER # define USE_TOUPPER #endif /************************************************************************* * Structures */ struct _trio_string_t { char *content; size_t length; size_t allocated; }; /************************************************************************* * Constants */ #if !defined(TRIO_MINIMAL) static TRIO_CONST char rcsid[] = "@(#)$Id$"; #endif /************************************************************************* * Static String Functions */ #if defined(TRIO_DOCUMENTATION) # include "doc/doc_static.h" #endif /** @addtogroup StaticStrings @{ */ /** Create new string. @param size Size of new string. @return Pointer to string, or NULL if allocation failed. */ TRIO_STRING_PUBLIC char * trio_create TRIO_ARGS1((size), size_t size) { return (char *)TRIO_MALLOC(size); } /** Destroy string. @param string String to be freed. */ TRIO_STRING_PUBLIC void trio_destroy TRIO_ARGS1((string), char *string) { if (string) { TRIO_FREE(string); } } /** Count the number of characters in a string. @param string String to measure. @return Number of characters in @string. */ TRIO_STRING_PUBLIC size_t trio_length TRIO_ARGS1((string), TRIO_CONST char *string) { return strlen(string); } #if !defined(TRIO_MINIMAL) /** Append @p source at the end of @p target. @param target Target string. @param source Source string. @return Boolean value indicating success or failure. @pre @p target must point to a memory chunk with sufficient room to contain the @p target string and @p source string. @pre No boundary checking is performed, so insufficient memory will result in a buffer overrun. @post @p target will be zero terminated. */ TRIO_STRING_PUBLIC int trio_append TRIO_ARGS2((target, source), char *target, TRIO_CONST char *source) { assert(target); assert(source); return (strcat(target, source) != NULL); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Append at most @p max characters from @p source to @p target. @param target Target string. @param max Maximum number of characters to append. @param source Source string. @return Boolean value indicating success or failure. @pre @p target must point to a memory chuck with sufficient room to contain the @p target string and the @p source string (at most @p max characters). @pre No boundary checking is performed, so insufficient memory will result in a buffer overrun. @post @p target will be zero terminated. */ TRIO_STRING_PUBLIC int trio_append_max TRIO_ARGS3((target, max, source), char *target, size_t max, TRIO_CONST char *source) { size_t length; assert(target); assert(source); length = trio_length(target); if (max > length) { strncat(target, source, max - length - 1); } return TRUE; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Determine if a string contains a substring. @param string String to be searched. @param substring String to be found. @return Boolean value indicating success or failure. */ TRIO_STRING_PUBLIC int trio_contains TRIO_ARGS2((string, substring), TRIO_CONST char *string, TRIO_CONST char *substring) { assert(string); assert(substring); return (0 != strstr(string, substring)); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Copy @p source to @p target. @param target Target string. @param source Source string. @return Boolean value indicating success or failure. @pre @p target must point to a memory chunk with sufficient room to contain the @p source string. @pre No boundary checking is performed, so insufficient memory will result in a buffer overrun. @post @p target will be zero terminated. */ TRIO_STRING_PUBLIC int trio_copy TRIO_ARGS2((target, source), char *target, TRIO_CONST char *source) { assert(target); assert(source); (void)strcpy(target, source); return TRUE; } #endif /* !defined(TRIO_MINIMAL) */ /** Copy at most @p max characters from @p source to @p target. @param target Target string. @param max Maximum number of characters to append. @param source Source string. @return Boolean value indicating success or failure. @pre @p target must point to a memory chunk with sufficient room to contain the @p source string (at most @p max characters). @pre No boundary checking is performed, so insufficient memory will result in a buffer overrun. @post @p target will be zero terminated. */ TRIO_STRING_PUBLIC int trio_copy_max TRIO_ARGS3((target, max, source), char *target, size_t max, TRIO_CONST char *source) { assert(target); assert(source); assert(max > 0); /* Includes != 0 */ (void)strncpy(target, source, max - 1); target[max - 1] = (char)0; return TRUE; } /* * TrioDuplicateMax */ TRIO_STRING_PRIVATE char * TrioDuplicateMax TRIO_ARGS2((source, size), TRIO_CONST char *source, size_t size) { char *target; assert(source); /* Make room for string plus a terminating zero */ size++; target = trio_create(size); if (target) { trio_copy_max(target, size, source); } return target; } /** Duplicate @p source. @param source Source string. @return A copy of the @p source string. @post @p target will be zero terminated. */ TRIO_STRING_PUBLIC char * trio_duplicate TRIO_ARGS1((source), TRIO_CONST char *source) { return TrioDuplicateMax(source, trio_length(source)); } #if !defined(TRIO_MINIMAL) /** Duplicate at most @p max characters of @p source. @param source Source string. @param max Maximum number of characters to duplicate. @return A copy of the @p source string. @post @p target will be zero terminated. */ TRIO_STRING_PUBLIC char * trio_duplicate_max TRIO_ARGS2((source, max), TRIO_CONST char *source, size_t max) { size_t length; assert(source); assert(max > 0); length = trio_length(source); if (length > max) { length = max; } return TrioDuplicateMax(source, length); } #endif /* !defined(TRIO_MINIMAL) */ /** Compare if two strings are equal. @param first First string. @param second Second string. @return Boolean indicating whether the two strings are equal or not. Case-insensitive comparison. */ TRIO_STRING_PUBLIC int trio_equal TRIO_ARGS2((first, second), TRIO_CONST char *first, TRIO_CONST char *second) { assert(first); assert(second); if ((first != NULL) && (second != NULL)) { #if defined(USE_STRCASECMP) return (0 == strcasecmp(first, second)); #else while ((*first != NIL) && (*second != NIL)) { if (trio_to_upper(*first) != trio_to_upper(*second)) { break; } first++; second++; } return ((*first == NIL) && (*second == NIL)); #endif } return FALSE; } /** Compare if two strings are equal. @param first First string. @param second Second string. @return Boolean indicating whether the two strings are equal or not. Case-sensitive comparison. */ TRIO_STRING_PUBLIC int trio_equal_case TRIO_ARGS2((first, second), TRIO_CONST char *first, TRIO_CONST char *second) { assert(first); assert(second); if ((first != NULL) && (second != NULL)) { return (0 == strcmp(first, second)); } return FALSE; } #if !defined(TRIO_MINIMAL) /** Compare if two strings up until the first @p max characters are equal. @param first First string. @param max Maximum number of characters to compare. @param second Second string. @return Boolean indicating whether the two strings are equal or not. Case-sensitive comparison. */ TRIO_STRING_PUBLIC int trio_equal_case_max TRIO_ARGS3((first, max, second), TRIO_CONST char *first, size_t max, TRIO_CONST char *second) { assert(first); assert(second); if ((first != NULL) && (second != NULL)) { return (0 == strncmp(first, second, max)); } return FALSE; } #endif /* !defined(TRIO_MINIMAL) */ /** Compare if two strings are equal. @param first First string. @param second Second string. @return Boolean indicating whether the two strings are equal or not. Collating characters are considered equal. */ TRIO_STRING_PUBLIC int trio_equal_locale TRIO_ARGS2((first, second), TRIO_CONST char *first, TRIO_CONST char *second) { assert(first); assert(second); #if defined(LC_COLLATE) return (strcoll(first, second) == 0); #else return trio_equal(first, second); #endif } /** Compare if two strings up until the first @p max characters are equal. @param first First string. @param max Maximum number of characters to compare. @param second Second string. @return Boolean indicating whether the two strings are equal or not. Case-insensitive comparison. */ TRIO_STRING_PUBLIC int trio_equal_max TRIO_ARGS3((first, max, second), TRIO_CONST char *first, size_t max, TRIO_CONST char *second) { assert(first); assert(second); if ((first != NULL) && (second != NULL)) { #if defined(USE_STRNCASECMP) return (0 == strncasecmp(first, second, max)); #else /* Not adequately tested yet */ size_t cnt = 0; while ((*first != NIL) && (*second != NIL) && (cnt <= max)) { if (trio_to_upper(*first) != trio_to_upper(*second)) { break; } first++; second++; cnt++; } return ((cnt == max) || ((*first == NIL) && (*second == NIL))); #endif } return FALSE; } /** Provide a textual description of an error code (errno). @param error_number Error number. @return Textual description of @p error_number. */ TRIO_STRING_PUBLIC TRIO_CONST char * trio_error TRIO_ARGS1((error_number), int error_number) { #if defined(USE_STRERROR) return strerror(error_number); #elif defined(USE_SYS_ERRLIST) extern char *sys_errlist[]; extern int sys_nerr; return ((error_number < 0) || (error_number >= sys_nerr)) ? "unknown" : sys_errlist[error_number]; #else return "unknown"; #endif } #if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE) /** Format the date/time according to @p format. @param target Target string. @param max Maximum number of characters to format. @param format Formatting string. @param datetime Date/time structure. @return Number of formatted characters. The formatting string accepts the same specifiers as the standard C function strftime. */ TRIO_STRING_PUBLIC size_t trio_format_date_max TRIO_ARGS4((target, max, format, datetime), char *target, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime) { assert(target); assert(format); assert(datetime); assert(max > 0); return strftime(target, max, format, datetime); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Calculate a hash value for a string. @param string String to be calculated on. @param type Hash function. @return Calculated hash value. @p type can be one of the following @li @c TRIO_HASH_PLAIN Plain hash function. */ TRIO_STRING_PUBLIC unsigned long trio_hash TRIO_ARGS2((string, type), TRIO_CONST char *string, int type) { unsigned long value = 0L; char ch; assert(string); switch (type) { case TRIO_HASH_PLAIN: while ( (ch = *string++) != NIL ) { value *= 31; value += (unsigned long)ch; } break; default: assert(FALSE); break; } return value; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Find first occurrence of a character in a string. @param string String to be searched. @param character Character to be found. @param A pointer to the found character, or NULL if character was not found. */ TRIO_STRING_PUBLIC char * trio_index TRIO_ARGS2((string, character), TRIO_CONST char *string, int character) { assert(string); return strchr(string, character); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Find last occurrence of a character in a string. @param string String to be searched. @param character Character to be found. @param A pointer to the found character, or NULL if character was not found. */ TRIO_STRING_PUBLIC char * trio_index_last TRIO_ARGS2((string, character), TRIO_CONST char *string, int character) { assert(string); return strchr(string, character); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Convert the alphabetic letters in the string to lower-case. @param target String to be converted. @return Number of processed characters (converted or not). */ TRIO_STRING_PUBLIC int trio_lower TRIO_ARGS1((target), char *target) { assert(target); return trio_span_function(target, target, trio_to_lower); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Compare two strings using wildcards. @param string String to be searched. @param pattern Pattern, including wildcards, to search for. @return Boolean value indicating success or failure. Case-insensitive comparison. The following wildcards can be used @li @c * Match any number of characters. @li @c ? Match a single character. */ TRIO_STRING_PUBLIC int trio_match TRIO_ARGS2((string, pattern), TRIO_CONST char *string, TRIO_CONST char *pattern) { assert(string); assert(pattern); for (; ('*' != *pattern); ++pattern, ++string) { if (NIL == *string) { return (NIL == *pattern); } if ((trio_to_upper((int)*string) != trio_to_upper((int)*pattern)) && ('?' != *pattern)) { return FALSE; } } /* two-line patch to prevent *too* much recursiveness: */ while ('*' == pattern[1]) pattern++; do { if ( trio_match(string, &pattern[1]) ) { return TRUE; } } while (*string++); return FALSE; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Compare two strings using wildcards. @param string String to be searched. @param pattern Pattern, including wildcards, to search for. @return Boolean value indicating success or failure. Case-sensitive comparison. The following wildcards can be used @li @c * Match any number of characters. @li @c ? Match a single character. */ TRIO_STRING_PUBLIC int trio_match_case TRIO_ARGS2((string, pattern), TRIO_CONST char *string, TRIO_CONST char *pattern) { assert(string); assert(pattern); for (; ('*' != *pattern); ++pattern, ++string) { if (NIL == *string) { return (NIL == *pattern); } if ((*string != *pattern) && ('?' != *pattern)) { return FALSE; } } /* two-line patch to prevent *too* much recursiveness: */ while ('*' == pattern[1]) pattern++; do { if ( trio_match_case(string, &pattern[1]) ) { return TRUE; } } while (*string++); return FALSE; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Execute a function on each character in string. @param target Target string. @param source Source string. @param Function Function to be executed. @return Number of processed characters. */ TRIO_STRING_PUBLIC size_t trio_span_function TRIO_ARGS3((target, source, Function), char *target, TRIO_CONST char *source, int (*Function) TRIO_PROTO((int))) { size_t count = 0; assert(target); assert(source); assert(Function); while (*source != NIL) { *target++ = Function(*source++); count++; } return count; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Search for a substring in a string. @param string String to be searched. @param substring String to be found. @return Pointer to first occurrence of @p substring in @p string, or NULL if no match was found. */ TRIO_STRING_PUBLIC char * trio_substring TRIO_ARGS2((string, substring), TRIO_CONST char *string, TRIO_CONST char *substring) { assert(string); assert(substring); return strstr(string, substring); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Search for a substring in the first @p max characters of a string. @param string String to be searched. @param max Maximum characters to be searched. @param substring String to be found. @return Pointer to first occurrence of @p substring in @p string, or NULL if no match was found. */ TRIO_STRING_PUBLIC char * trio_substring_max TRIO_ARGS3((string, max, substring), TRIO_CONST char *string, size_t max, TRIO_CONST char *substring) { size_t count; size_t size; char *result = NULL; assert(string); assert(substring); size = trio_length(substring); if (size <= max) { for (count = 0; count <= max - size; count++) { if (trio_equal_max(substring, size, &string[count])) { result = (char *)&string[count]; break; } } } return result; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Tokenize string. @param string String to be tokenized. @param tokens String containing list of delimiting characters. @return Start of new token. @warning @p string will be destroyed. */ TRIO_STRING_PUBLIC char * trio_tokenize TRIO_ARGS2((string, delimiters), char *string, TRIO_CONST char *delimiters) { assert(delimiters); return strtok(string, delimiters); } #endif /* !defined(TRIO_MINIMAL) */ /** Convert string to floating-point number. @param source String to be converted. @param endp Pointer to end of the converted string. @return A floating-point number. The following Extended Backus-Naur form is used @verbatim double ::= [ ] ( | | ) [ [ ] ] number ::= 1*( ) digit ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ) exponential ::= ( 'e' | 'E' ) sign ::= ( '-' | '+' ) decimal_point ::= '.' @endverbatim */ /* FIXME: Add EBNF for hex-floats */ TRIO_STRING_PUBLIC trio_long_double_t trio_to_long_double TRIO_ARGS2((source, endp), TRIO_CONST char *source, char **endp) { #if defined(USE_STRTOLD) return strtold(source, endp); #else int isNegative = FALSE; int isExponentNegative = FALSE; trio_long_double_t integer = 0.0; trio_long_double_t fraction = 0.0; unsigned long exponent = 0; trio_long_double_t base; trio_long_double_t fracdiv = 1.0; trio_long_double_t value = 0.0; /* First try hex-floats */ if ((source[0] == '0') && ((source[1] == 'x') || (source[1] == 'X'))) { base = 16.0; source += 2; while (isxdigit((int)*source)) { integer *= base; integer += (isdigit((int)*source) ? (*source - '0') : 10 + (trio_to_upper((int)*source) - 'A')); source++; } if (*source == '.') { source++; while (isxdigit((int)*source)) { fracdiv /= base; fraction += fracdiv * (isdigit((int)*source) ? (*source - '0') : 10 + (trio_to_upper((int)*source) - 'A')); source++; } if ((*source == 'p') || (*source == 'P')) { source++; if ((*source == '+') || (*source == '-')) { isExponentNegative = (*source == '-'); source++; } while (isdigit((int)*source)) { exponent *= 10; exponent += (*source - '0'); source++; } } } /* For later use with exponent */ base = 2.0; } else /* Then try normal decimal floats */ { base = 10.0; isNegative = (*source == '-'); /* Skip sign */ if ((*source == '+') || (*source == '-')) source++; /* Integer part */ while (isdigit((int)*source)) { integer *= base; integer += (*source - '0'); source++; } if (*source == '.') { source++; /* skip decimal point */ while (isdigit((int)*source)) { fracdiv /= base; fraction += (*source - '0') * fracdiv; source++; } } if ((*source == 'e') || (*source == 'E') #if TRIO_MICROSOFT || (*source == 'd') || (*source == 'D') #endif ) { source++; /* Skip exponential indicator */ isExponentNegative = (*source == '-'); if ((*source == '+') || (*source == '-')) source++; while (isdigit((int)*source)) { exponent *= (int)base; exponent += (*source - '0'); source++; } } } value = integer + fraction; if (exponent != 0) { if (isExponentNegative) value /= pow(base, (double)exponent); else value *= pow(base, (double)exponent); } if (isNegative) value = -value; if (endp) *endp = (char *)source; return value; #endif } /** Convert string to floating-point number. @param source String to be converted. @param endp Pointer to end of the converted string. @return A floating-point number. See @ref trio_to_long_double. */ TRIO_STRING_PUBLIC double trio_to_double TRIO_ARGS2((source, endp), TRIO_CONST char *source, char **endp) { #if defined(USE_STRTOD) return strtod(source, endp); #else return (double)trio_to_long_double(source, endp); #endif } #if !defined(TRIO_MINIMAL) /** Convert string to floating-point number. @param source String to be converted. @param endp Pointer to end of the converted string. @return A floating-point number. See @ref trio_to_long_double. */ TRIO_STRING_PUBLIC float trio_to_float TRIO_ARGS2((source, endp), TRIO_CONST char *source, char **endp) { #if defined(USE_STRTOF) return strtof(source, endp); #else return (float)trio_to_long_double(source, endp); #endif } #endif /* !defined(TRIO_MINIMAL) */ /** Convert string to signed integer. @param string String to be converted. @param endp Pointer to end of converted string. @param base Radix number of number. */ TRIO_STRING_PUBLIC long trio_to_long TRIO_ARGS3((string, endp, base), TRIO_CONST char *string, char **endp, int base) { assert(string); assert((base >= 2) && (base <= 36)); return strtol(string, endp, base); } #if !defined(TRIO_MINIMAL) /** Convert one alphabetic letter to lower-case. @param source The letter to be converted. @return The converted letter. */ TRIO_STRING_PUBLIC int trio_to_lower TRIO_ARGS1((source), int source) { #if defined(USE_TOLOWER) return tolower(source); #else /* Does not handle locales or non-contiguous alphabetic characters */ return ((source >= (int)'A') && (source <= (int)'Z')) ? source - 'A' + 'a' : source; #endif } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Convert string to unsigned integer. @param string String to be converted. @param endp Pointer to end of converted string. @param base Radix number of number. */ TRIO_STRING_PUBLIC unsigned long trio_to_unsigned_long TRIO_ARGS3((string, endp, base), TRIO_CONST char *string, char **endp, int base) { assert(string); assert((base >= 2) && (base <= 36)); return strtoul(string, endp, base); } #endif /* !defined(TRIO_MINIMAL) */ /** Convert one alphabetic letter to upper-case. @param source The letter to be converted. @return The converted letter. */ TRIO_STRING_PUBLIC int trio_to_upper TRIO_ARGS1((source), int source) { #if defined(USE_TOUPPER) return toupper(source); #else /* Does not handle locales or non-contiguous alphabetic characters */ return ((source >= (int)'a') && (source <= (int)'z')) ? source - 'a' + 'A' : source; #endif } #if !defined(TRIO_MINIMAL) /** Convert the alphabetic letters in the string to upper-case. @param target The string to be converted. @return The number of processed characters (converted or not). */ TRIO_STRING_PUBLIC int trio_upper TRIO_ARGS1((target), char *target) { assert(target); return trio_span_function(target, target, trio_to_upper); } #endif /* !defined(TRIO_MINIMAL) */ /** @} End of StaticStrings */ /************************************************************************* * Dynamic String Functions */ #if defined(TRIO_DOCUMENTATION) # include "doc/doc_dynamic.h" #endif /** @addtogroup DynamicStrings @{ */ /* * TrioStringAlloc */ TRIO_STRING_PRIVATE trio_string_t * TrioStringAlloc(TRIO_NOARGS) { trio_string_t *self; self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t)); if (self) { self->content = NULL; self->length = 0; self->allocated = 0; } return self; } /* * TrioStringGrow * * The size of the string will be increased by 'delta' characters. If * 'delta' is zero, the size will be doubled. */ TRIO_STRING_PRIVATE BOOLEAN_T TrioStringGrow TRIO_ARGS2((self, delta), trio_string_t *self, size_t delta) { BOOLEAN_T status = FALSE; char *new_content; size_t new_size; new_size = (delta == 0) ? ( (self->allocated == 0) ? 1 : self->allocated * 2 ) : self->allocated + delta; new_content = (char *)TRIO_REALLOC(self->content, new_size); if (new_content) { self->content = new_content; self->allocated = new_size; status = TRUE; } return status; } #if !defined(TRIO_MINIMAL) /* * TrioStringGrowTo * * The size of the string will be increased to 'length' plus one characters. * If 'length' is less than the original size, the original size will be * used (that is, the size of the string is never decreased). */ TRIO_STRING_PRIVATE BOOLEAN_T TrioStringGrowTo TRIO_ARGS2((self, length), trio_string_t *self, size_t length) { length++; /* Room for terminating zero */ return (self->allocated < length) ? TrioStringGrow(self, length - self->allocated) : TRUE; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /** Create a new dynamic string. @param initial_size Initial size of the buffer. @return Newly allocated dynamic string, or NULL if memory allocation failed. */ TRIO_STRING_PUBLIC trio_string_t * trio_string_create TRIO_ARGS1((initial_size), int initial_size) { trio_string_t *self; self = TrioStringAlloc(); if (self) { if (TrioStringGrow(self, (size_t)((initial_size > 0) ? initial_size : 1))) { self->content[0] = (char)0; self->allocated = initial_size; } else { trio_string_destroy(self); self = NULL; } } return self; } #endif /* !defined(TRIO_MINIMAL) */ /** Deallocate the dynamic string and its contents. @param self Dynamic string */ TRIO_STRING_PUBLIC void trio_string_destroy TRIO_ARGS1((self), trio_string_t *self) { assert(self); if (self) { trio_destroy(self->content); TRIO_FREE(self); } } #if !defined(TRIO_MINIMAL) /** Get a pointer to the content. @param self Dynamic string. @param offset Offset into content. @return Pointer to the content. @p Offset can be zero, positive, or negative. If @p offset is zero, then the start of the content will be returned. If @p offset is positive, then a pointer to @p offset number of characters from the beginning of the content is returned. If @p offset is negative, then a pointer to @p offset number of characters from the ending of the string, starting at the terminating zero, is returned. */ TRIO_STRING_PUBLIC char * trio_string_get TRIO_ARGS2((self, offset), trio_string_t *self, int offset) { char *result = NULL; assert(self); if (self->content != NULL) { if (self->length == 0) { (void)trio_string_length(self); } if (offset >= 0) { if (offset > (int)self->length) { offset = self->length; } } else { offset += self->length + 1; if (offset < 0) { offset = 0; } } result = &(self->content[offset]); } return result; } #endif /* !defined(TRIO_MINIMAL) */ /** Extract the content. @param self Dynamic String @return Content of dynamic string. The content is removed from the dynamic string. This enables destruction of the dynamic string without deallocation of the content. */ TRIO_STRING_PUBLIC char * trio_string_extract TRIO_ARGS1((self), trio_string_t *self) { char *result; assert(self); result = self->content; /* FIXME: Allocate new empty buffer? */ self->content = NULL; self->length = self->allocated = 0; return result; } #if !defined(TRIO_MINIMAL) /** Set the content of the dynamic string. @param self Dynamic String @param buffer The new content. Sets the content of the dynamic string to a copy @p buffer. An existing content will be deallocated first, if necessary. @remark This function will make a copy of @p buffer. You are responsible for deallocating @p buffer yourself. */ TRIO_STRING_PUBLIC void trio_xstring_set TRIO_ARGS2((self, buffer), trio_string_t *self, char *buffer) { assert(self); trio_destroy(self->content); self->content = trio_duplicate(buffer); } #endif /* !defined(TRIO_MINIMAL) */ /* * trio_string_size */ TRIO_STRING_PUBLIC int trio_string_size TRIO_ARGS1((self), trio_string_t *self) { assert(self); return self->allocated; } /* * trio_string_terminate */ TRIO_STRING_PUBLIC void trio_string_terminate TRIO_ARGS1((self), trio_string_t *self) { trio_xstring_append_char(self, 0); } #if !defined(TRIO_MINIMAL) /** Append the second string to the first. @param self Dynamic string to be modified. @param other Dynamic string to copy from. @return Boolean value indicating success or failure. */ TRIO_STRING_PUBLIC int trio_string_append TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { size_t length; assert(self); assert(other); length = self->length + other->length; if (!TrioStringGrowTo(self, length)) goto error; trio_copy(&self->content[self->length], other->content); self->length = length; return TRUE; error: return FALSE; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_append */ TRIO_STRING_PUBLIC int trio_xstring_append TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { size_t length; assert(self); assert(other); length = self->length + trio_length(other); if (!TrioStringGrowTo(self, length)) goto error; trio_copy(&self->content[self->length], other); self->length = length; return TRUE; error: return FALSE; } #endif /* !defined(TRIO_MINIMAL) */ /* * trio_xstring_append_char */ TRIO_STRING_PUBLIC int trio_xstring_append_char TRIO_ARGS2((self, character), trio_string_t *self, char character) { assert(self); if ((int)self->length >= trio_string_size(self)) { if (!TrioStringGrow(self, 0)) goto error; } self->content[self->length] = character; self->length++; return TRUE; error: return FALSE; } #if !defined(TRIO_MINIMAL) /** Search for the first occurrence of second parameter in the first. @param self Dynamic string to be modified. @param other Dynamic string to copy from. @return Boolean value indicating success or failure. */ TRIO_STRING_PUBLIC int trio_string_contains TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { assert(self); assert(other); return trio_contains(self->content, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_contains */ TRIO_STRING_PUBLIC int trio_xstring_contains TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { assert(self); assert(other); return trio_contains(self->content, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_copy */ TRIO_STRING_PUBLIC int trio_string_copy TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { assert(self); assert(other); self->length = 0; return trio_string_append(self, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_copy */ TRIO_STRING_PUBLIC int trio_xstring_copy TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { assert(self); assert(other); self->length = 0; return trio_xstring_append(self, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_duplicate */ TRIO_STRING_PUBLIC trio_string_t * trio_string_duplicate TRIO_ARGS1((other), trio_string_t *other) { trio_string_t *self; assert(other); self = TrioStringAlloc(); if (self) { self->content = TrioDuplicateMax(other->content, other->length); if (self->content) { self->length = other->length; self->allocated = self->length + 1; } else { self->length = self->allocated = 0; } } return self; } #endif /* !defined(TRIO_MINIMAL) */ /* * trio_xstring_duplicate */ TRIO_STRING_PUBLIC trio_string_t * trio_xstring_duplicate TRIO_ARGS1((other), TRIO_CONST char *other) { trio_string_t *self; assert(other); self = TrioStringAlloc(); if (self) { self->content = TrioDuplicateMax(other, trio_length(other)); if (self->content) { self->length = trio_length(self->content); self->allocated = self->length + 1; } else { self->length = self->allocated = 0; } } return self; } #if !defined(TRIO_MINIMAL) /* * trio_string_equal */ TRIO_STRING_PUBLIC int trio_string_equal TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { assert(self); assert(other); return trio_equal(self->content, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_equal */ TRIO_STRING_PUBLIC int trio_xstring_equal TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { assert(self); assert(other); return trio_equal(self->content, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_equal_max */ TRIO_STRING_PUBLIC int trio_string_equal_max TRIO_ARGS3((self, max, other), trio_string_t *self, size_t max, trio_string_t *other) { assert(self); assert(other); return trio_equal_max(self->content, max, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_equal_max */ TRIO_STRING_PUBLIC int trio_xstring_equal_max TRIO_ARGS3((self, max, other), trio_string_t *self, size_t max, TRIO_CONST char *other) { assert(self); assert(other); return trio_equal_max(self->content, max, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_equal_case */ TRIO_STRING_PUBLIC int trio_string_equal_case TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { assert(self); assert(other); return trio_equal_case(self->content, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_equal_case */ TRIO_STRING_PUBLIC int trio_xstring_equal_case TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { assert(self); assert(other); return trio_equal_case(self->content, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_equal_case_max */ TRIO_STRING_PUBLIC int trio_string_equal_case_max TRIO_ARGS3((self, max, other), trio_string_t *self, size_t max, trio_string_t *other) { assert(self); assert(other); return trio_equal_case_max(self->content, max, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_equal_case_max */ TRIO_STRING_PUBLIC int trio_xstring_equal_case_max TRIO_ARGS3((self, max, other), trio_string_t *self, size_t max, TRIO_CONST char *other) { assert(self); assert(other); return trio_equal_case_max(self->content, max, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE) /* * trio_string_format_data_max */ TRIO_STRING_PUBLIC size_t trio_string_format_date_max TRIO_ARGS4((self, max, format, datetime), trio_string_t *self, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime) { assert(self); return trio_format_date_max(self->content, max, format, datetime); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_index */ TRIO_STRING_PUBLIC char * trio_string_index TRIO_ARGS2((self, character), trio_string_t *self, int character) { assert(self); return trio_index(self->content, character); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_index_last */ TRIO_STRING_PUBLIC char * trio_string_index_last TRIO_ARGS2((self, character), trio_string_t *self, int character) { assert(self); return trio_index_last(self->content, character); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_length */ TRIO_STRING_PUBLIC int trio_string_length TRIO_ARGS1((self), trio_string_t *self) { assert(self); if (self->length == 0) { self->length = trio_length(self->content); } return self->length; } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_lower */ TRIO_STRING_PUBLIC int trio_string_lower TRIO_ARGS1((self), trio_string_t *self) { assert(self); return trio_lower(self->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_match */ TRIO_STRING_PUBLIC int trio_string_match TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { assert(self); assert(other); return trio_match(self->content, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_match */ TRIO_STRING_PUBLIC int trio_xstring_match TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { assert(self); assert(other); return trio_match(self->content, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_match_case */ TRIO_STRING_PUBLIC int trio_string_match_case TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { assert(self); assert(other); return trio_match_case(self->content, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_match_case */ TRIO_STRING_PUBLIC int trio_xstring_match_case TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { assert(self); assert(other); return trio_match_case(self->content, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_substring */ TRIO_STRING_PUBLIC char * trio_string_substring TRIO_ARGS2((self, other), trio_string_t *self, trio_string_t *other) { assert(self); assert(other); return trio_substring(self->content, other->content); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_xstring_substring */ TRIO_STRING_PUBLIC char * trio_xstring_substring TRIO_ARGS2((self, other), trio_string_t *self, TRIO_CONST char *other) { assert(self); assert(other); return trio_substring(self->content, other); } #endif /* !defined(TRIO_MINIMAL) */ #if !defined(TRIO_MINIMAL) /* * trio_string_upper */ TRIO_STRING_PUBLIC int trio_string_upper TRIO_ARGS1((self), trio_string_t *self) { assert(self); return trio_upper(self->content); } #endif /* !defined(TRIO_MINIMAL) */ /** @} End of DynamicStrings */ libxml2-2.9.1+dfsg1/xmlsave.c0000644000175000017500000022775712113312344014415 0ustar aronaron/* * xmlsave.c: Implemetation of the document serializer * * See Copyright for the status of this software. * * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #include #include #include #include #include #define MAX_INDENT 60 #include #include "buf.h" #include "enc.h" #include "save.h" /************************************************************************ * * * XHTML detection * * * ************************************************************************/ #define XHTML_STRICT_PUBLIC_ID BAD_CAST \ "-//W3C//DTD XHTML 1.0 Strict//EN" #define XHTML_STRICT_SYSTEM_ID BAD_CAST \ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" #define XHTML_FRAME_PUBLIC_ID BAD_CAST \ "-//W3C//DTD XHTML 1.0 Frameset//EN" #define XHTML_FRAME_SYSTEM_ID BAD_CAST \ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd" #define XHTML_TRANS_PUBLIC_ID BAD_CAST \ "-//W3C//DTD XHTML 1.0 Transitional//EN" #define XHTML_TRANS_SYSTEM_ID BAD_CAST \ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" #define XHTML_NS_NAME BAD_CAST "http://www.w3.org/1999/xhtml" /** * xmlIsXHTML: * @systemID: the system identifier * @publicID: the public identifier * * Try to find if the document correspond to an XHTML DTD * * Returns 1 if true, 0 if not and -1 in case of error */ int xmlIsXHTML(const xmlChar *systemID, const xmlChar *publicID) { if ((systemID == NULL) && (publicID == NULL)) return(-1); if (publicID != NULL) { if (xmlStrEqual(publicID, XHTML_STRICT_PUBLIC_ID)) return(1); if (xmlStrEqual(publicID, XHTML_FRAME_PUBLIC_ID)) return(1); if (xmlStrEqual(publicID, XHTML_TRANS_PUBLIC_ID)) return(1); } if (systemID != NULL) { if (xmlStrEqual(systemID, XHTML_STRICT_SYSTEM_ID)) return(1); if (xmlStrEqual(systemID, XHTML_FRAME_SYSTEM_ID)) return(1); if (xmlStrEqual(systemID, XHTML_TRANS_SYSTEM_ID)) return(1); } return(0); } #ifdef LIBXML_OUTPUT_ENABLED #define TODO \ xmlGenericError(xmlGenericErrorContext, \ "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); struct _xmlSaveCtxt { void *_private; int type; int fd; const xmlChar *filename; const xmlChar *encoding; xmlCharEncodingHandlerPtr handler; xmlOutputBufferPtr buf; xmlDocPtr doc; int options; int level; int format; char indent[MAX_INDENT + 1]; /* array for indenting output */ int indent_nr; int indent_size; xmlCharEncodingOutputFunc escape; /* used for element content */ xmlCharEncodingOutputFunc escapeAttr;/* used for attribute content */ }; /************************************************************************ * * * Output error handlers * * * ************************************************************************/ /** * xmlSaveErrMemory: * @extra: extra informations * * Handle an out of memory condition */ static void xmlSaveErrMemory(const char *extra) { __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra); } /** * xmlSaveErr: * @code: the error number * @node: the location of the error. * @extra: extra informations * * Handle an out of memory condition */ static void xmlSaveErr(int code, xmlNodePtr node, const char *extra) { const char *msg = NULL; switch(code) { case XML_SAVE_NOT_UTF8: msg = "string is not in UTF-8\n"; break; case XML_SAVE_CHAR_INVALID: msg = "invalid character value\n"; break; case XML_SAVE_UNKNOWN_ENCODING: msg = "unknown encoding %s\n"; break; case XML_SAVE_NO_DOCTYPE: msg = "document has no DOCTYPE\n"; break; default: msg = "unexpected error number\n"; } __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra); } /************************************************************************ * * * Special escaping routines * * * ************************************************************************/ static unsigned char * xmlSerializeHexCharRef(unsigned char *out, int val) { unsigned char *ptr; *out++ = '&'; *out++ = '#'; *out++ = 'x'; if (val < 0x10) ptr = out; else if (val < 0x100) ptr = out + 1; else if (val < 0x1000) ptr = out + 2; else if (val < 0x10000) ptr = out + 3; else if (val < 0x100000) ptr = out + 4; else ptr = out + 5; out = ptr + 1; while (val > 0) { switch (val & 0xF) { case 0: *ptr-- = '0'; break; case 1: *ptr-- = '1'; break; case 2: *ptr-- = '2'; break; case 3: *ptr-- = '3'; break; case 4: *ptr-- = '4'; break; case 5: *ptr-- = '5'; break; case 6: *ptr-- = '6'; break; case 7: *ptr-- = '7'; break; case 8: *ptr-- = '8'; break; case 9: *ptr-- = '9'; break; case 0xA: *ptr-- = 'A'; break; case 0xB: *ptr-- = 'B'; break; case 0xC: *ptr-- = 'C'; break; case 0xD: *ptr-- = 'D'; break; case 0xE: *ptr-- = 'E'; break; case 0xF: *ptr-- = 'F'; break; default: *ptr-- = '0'; break; } val >>= 4; } *out++ = ';'; *out = 0; return(out); } /** * xmlEscapeEntities: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of unescaped UTF-8 bytes * @inlen: the length of @in * * Take a block of UTF-8 chars in and escape them. Used when there is no * encoding specified. * * Returns 0 if success, or -1 otherwise * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ static int xmlEscapeEntities(unsigned char* out, int *outlen, const xmlChar* in, int *inlen) { unsigned char* outstart = out; const unsigned char* base = in; unsigned char* outend = out + *outlen; const unsigned char* inend; int val; inend = in + (*inlen); while ((in < inend) && (out < outend)) { if (*in == '<') { if (outend - out < 4) break; *out++ = '&'; *out++ = 'l'; *out++ = 't'; *out++ = ';'; in++; continue; } else if (*in == '>') { if (outend - out < 4) break; *out++ = '&'; *out++ = 'g'; *out++ = 't'; *out++ = ';'; in++; continue; } else if (*in == '&') { if (outend - out < 5) break; *out++ = '&'; *out++ = 'a'; *out++ = 'm'; *out++ = 'p'; *out++ = ';'; in++; continue; } else if (((*in >= 0x20) && (*in < 0x80)) || (*in == '\n') || (*in == '\t')) { /* * default case, just copy ! */ *out++ = *in++; continue; } else if (*in >= 0x80) { /* * We assume we have UTF-8 input. */ if (outend - out < 11) break; if (*in < 0xC0) { xmlSaveErr(XML_SAVE_NOT_UTF8, NULL, NULL); in++; goto error; } else if (*in < 0xE0) { if (inend - in < 2) break; val = (in[0]) & 0x1F; val <<= 6; val |= (in[1]) & 0x3F; in += 2; } else if (*in < 0xF0) { if (inend - in < 3) break; val = (in[0]) & 0x0F; val <<= 6; val |= (in[1]) & 0x3F; val <<= 6; val |= (in[2]) & 0x3F; in += 3; } else if (*in < 0xF8) { if (inend - in < 4) break; val = (in[0]) & 0x07; val <<= 6; val |= (in[1]) & 0x3F; val <<= 6; val |= (in[2]) & 0x3F; val <<= 6; val |= (in[3]) & 0x3F; in += 4; } else { xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL); in++; goto error; } if (!IS_CHAR(val)) { xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL); in++; goto error; } /* * We could do multiple things here. Just save as a char ref */ out = xmlSerializeHexCharRef(out, val); } else if (IS_BYTE_CHAR(*in)) { if (outend - out < 6) break; out = xmlSerializeHexCharRef(out, *in++); } else { xmlGenericError(xmlGenericErrorContext, "xmlEscapeEntities : char out of range\n"); in++; goto error; } } *outlen = out - outstart; *inlen = in - base; return(0); error: *outlen = out - outstart; *inlen = in - base; return(-1); } /************************************************************************ * * * Allocation and deallocation * * * ************************************************************************/ /** * xmlSaveCtxtInit: * @ctxt: the saving context * * Initialize a saving context */ static void xmlSaveCtxtInit(xmlSaveCtxtPtr ctxt) { int i; int len; if (ctxt == NULL) return; if ((ctxt->encoding == NULL) && (ctxt->escape == NULL)) ctxt->escape = xmlEscapeEntities; len = xmlStrlen((xmlChar *)xmlTreeIndentString); if ((xmlTreeIndentString == NULL) || (len == 0)) { memset(&ctxt->indent[0], 0, MAX_INDENT + 1); } else { ctxt->indent_size = len; ctxt->indent_nr = MAX_INDENT / ctxt->indent_size; for (i = 0;i < ctxt->indent_nr;i++) memcpy(&ctxt->indent[i * ctxt->indent_size], xmlTreeIndentString, ctxt->indent_size); ctxt->indent[ctxt->indent_nr * ctxt->indent_size] = 0; } if (xmlSaveNoEmptyTags) { ctxt->options |= XML_SAVE_NO_EMPTY; } } /** * xmlFreeSaveCtxt: * * Free a saving context, destroying the ouptut in any remaining buffer */ static void xmlFreeSaveCtxt(xmlSaveCtxtPtr ctxt) { if (ctxt == NULL) return; if (ctxt->encoding != NULL) xmlFree((char *) ctxt->encoding); if (ctxt->buf != NULL) xmlOutputBufferClose(ctxt->buf); xmlFree(ctxt); } /** * xmlNewSaveCtxt: * * Create a new saving context * * Returns the new structure or NULL in case of error */ static xmlSaveCtxtPtr xmlNewSaveCtxt(const char *encoding, int options) { xmlSaveCtxtPtr ret; ret = (xmlSaveCtxtPtr) xmlMalloc(sizeof(xmlSaveCtxt)); if (ret == NULL) { xmlSaveErrMemory("creating saving context"); return ( NULL ); } memset(ret, 0, sizeof(xmlSaveCtxt)); if (encoding != NULL) { ret->handler = xmlFindCharEncodingHandler(encoding); if (ret->handler == NULL) { xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); xmlFreeSaveCtxt(ret); return(NULL); } ret->encoding = xmlStrdup((const xmlChar *)encoding); ret->escape = NULL; } xmlSaveCtxtInit(ret); /* * Use the options */ /* Re-check this option as it may already have been set */ if ((ret->options & XML_SAVE_NO_EMPTY) && ! (options & XML_SAVE_NO_EMPTY)) { options |= XML_SAVE_NO_EMPTY; } ret->options = options; if (options & XML_SAVE_FORMAT) ret->format = 1; else if (options & XML_SAVE_WSNONSIG) ret->format = 2; return(ret); } /************************************************************************ * * * Dumping XML tree content to a simple buffer * * * ************************************************************************/ /** * xmlAttrSerializeContent: * @buf: the XML buffer output * @doc: the document * @attr: the attribute pointer * * Serialize the attribute in the buffer */ static void xmlAttrSerializeContent(xmlOutputBufferPtr buf, xmlAttrPtr attr) { xmlNodePtr children; children = attr->children; while (children != NULL) { switch (children->type) { case XML_TEXT_NODE: xmlBufAttrSerializeTxtContent(buf->buffer, attr->doc, attr, children->content); break; case XML_ENTITY_REF_NODE: xmlBufAdd(buf->buffer, BAD_CAST "&", 1); xmlBufAdd(buf->buffer, children->name, xmlStrlen(children->name)); xmlBufAdd(buf->buffer, BAD_CAST ";", 1); break; default: /* should not happen unless we have a badly built tree */ break; } children = children->next; } } /** * xmlBufDumpNotationTable: * @buf: an xmlBufPtr output * @table: A notation table * * This will dump the content of the notation table as an XML DTD definition */ void xmlBufDumpNotationTable(xmlBufPtr buf, xmlNotationTablePtr table) { xmlBufferPtr buffer; buffer = xmlBufferCreate(); if (buffer == NULL) { /* * TODO set the error in buf */ return; } xmlDumpNotationTable(buffer, table); xmlBufMergeBuffer(buf, buffer); } /** * xmlBufDumpElementDecl: * @buf: an xmlBufPtr output * @elem: An element table * * This will dump the content of the element declaration as an XML * DTD definition */ void xmlBufDumpElementDecl(xmlBufPtr buf, xmlElementPtr elem) { xmlBufferPtr buffer; buffer = xmlBufferCreate(); if (buffer == NULL) { /* * TODO set the error in buf */ return; } xmlDumpElementDecl(buffer, elem); xmlBufMergeBuffer(buf, buffer); } /** * xmlBufDumpAttributeDecl: * @buf: an xmlBufPtr output * @attr: An attribute declaration * * This will dump the content of the attribute declaration as an XML * DTD definition */ void xmlBufDumpAttributeDecl(xmlBufPtr buf, xmlAttributePtr attr) { xmlBufferPtr buffer; buffer = xmlBufferCreate(); if (buffer == NULL) { /* * TODO set the error in buf */ return; } xmlDumpAttributeDecl(buffer, attr); xmlBufMergeBuffer(buf, buffer); } /** * xmlBufDumpEntityDecl: * @buf: an xmlBufPtr output * @ent: An entity table * * This will dump the content of the entity table as an XML DTD definition */ void xmlBufDumpEntityDecl(xmlBufPtr buf, xmlEntityPtr ent) { xmlBufferPtr buffer; buffer = xmlBufferCreate(); if (buffer == NULL) { /* * TODO set the error in buf */ return; } xmlDumpEntityDecl(buffer, ent); xmlBufMergeBuffer(buf, buffer); } /************************************************************************ * * * Dumping XML tree content to an I/O output buffer * * * ************************************************************************/ static int xmlSaveSwitchEncoding(xmlSaveCtxtPtr ctxt, const char *encoding) { xmlOutputBufferPtr buf = ctxt->buf; if ((encoding != NULL) && (buf->encoder == NULL) && (buf->conv == NULL)) { buf->encoder = xmlFindCharEncodingHandler((const char *)encoding); if (buf->encoder == NULL) { xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, (const char *)encoding); return(-1); } buf->conv = xmlBufCreate(); if (buf->conv == NULL) { xmlCharEncCloseFunc(buf->encoder); xmlSaveErrMemory("creating encoding buffer"); return(-1); } /* * initialize the state, e.g. if outputting a BOM */ xmlCharEncOutput(buf, 1); } return(0); } static int xmlSaveClearEncoding(xmlSaveCtxtPtr ctxt) { xmlOutputBufferPtr buf = ctxt->buf; xmlOutputBufferFlush(buf); xmlCharEncCloseFunc(buf->encoder); xmlBufFree(buf->conv); buf->encoder = NULL; buf->conv = NULL; return(0); } #ifdef LIBXML_HTML_ENABLED static void xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); #endif static void xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); static void xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur); static int xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur); /** * xmlOutputBufferWriteWSNonSig: * @ctxt: The save context * @extra: Number of extra indents to apply to ctxt->level * * Write out formatting for non-significant whitespace output. */ static void xmlOutputBufferWriteWSNonSig(xmlSaveCtxtPtr ctxt, int extra) { int i; if ((ctxt == NULL) || (ctxt->buf == NULL)) return; xmlOutputBufferWrite(ctxt->buf, 1, "\n"); for (i = 0; i < (ctxt->level + extra); i += ctxt->indent_nr) { xmlOutputBufferWrite(ctxt->buf, ctxt->indent_size * ((ctxt->level + extra - i) > ctxt->indent_nr ? ctxt->indent_nr : (ctxt->level + extra - i)), ctxt->indent); } } /** * xmlNsDumpOutput: * @buf: the XML buffer output * @cur: a namespace * @ctxt: the output save context. Optional. * * Dump a local Namespace definition. * Should be called in the context of attributes dumps. * If @ctxt is supplied, @buf should be its buffer. */ static void xmlNsDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur, xmlSaveCtxtPtr ctxt) { if ((cur == NULL) || (buf == NULL)) return; if ((cur->type == XML_LOCAL_NAMESPACE) && (cur->href != NULL)) { if (xmlStrEqual(cur->prefix, BAD_CAST "xml")) return; if (ctxt != NULL && ctxt->format == 2) xmlOutputBufferWriteWSNonSig(ctxt, 2); else xmlOutputBufferWrite(buf, 1, " "); /* Within the context of an element attributes */ if (cur->prefix != NULL) { xmlOutputBufferWrite(buf, 6, "xmlns:"); xmlOutputBufferWriteString(buf, (const char *)cur->prefix); } else xmlOutputBufferWrite(buf, 5, "xmlns"); xmlOutputBufferWrite(buf, 1, "="); xmlBufWriteQuotedString(buf->buffer, cur->href); } } /** * xmlNsDumpOutputCtxt * @ctxt: the save context * @cur: a namespace * * Dump a local Namespace definition to a save context. * Should be called in the context of attribute dumps. */ static void xmlNsDumpOutputCtxt(xmlSaveCtxtPtr ctxt, xmlNsPtr cur) { xmlNsDumpOutput(ctxt->buf, cur, ctxt); } /** * xmlNsListDumpOutputCtxt * @ctxt: the save context * @cur: the first namespace * * Dump a list of local namespace definitions to a save context. * Should be called in the context of attribute dumps. */ static void xmlNsListDumpOutputCtxt(xmlSaveCtxtPtr ctxt, xmlNsPtr cur) { while (cur != NULL) { xmlNsDumpOutput(ctxt->buf, cur, ctxt); cur = cur->next; } } /** * xmlNsListDumpOutput: * @buf: the XML buffer output * @cur: the first namespace * * Dump a list of local Namespace definitions. * Should be called in the context of attributes dumps. */ void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) { while (cur != NULL) { xmlNsDumpOutput(buf, cur, NULL); cur = cur->next; } } /** * xmlDtdDumpOutput: * @buf: the XML buffer output * @dtd: the pointer to the DTD * * Dump the XML document DTD, if any. */ static void xmlDtdDumpOutput(xmlSaveCtxtPtr ctxt, xmlDtdPtr dtd) { xmlOutputBufferPtr buf; int format, level; xmlDocPtr doc; if (dtd == NULL) return; if ((ctxt == NULL) || (ctxt->buf == NULL)) return; buf = ctxt->buf; xmlOutputBufferWrite(buf, 10, "name); if (dtd->ExternalID != NULL) { xmlOutputBufferWrite(buf, 8, " PUBLIC "); xmlBufWriteQuotedString(buf->buffer, dtd->ExternalID); xmlOutputBufferWrite(buf, 1, " "); xmlBufWriteQuotedString(buf->buffer, dtd->SystemID); } else if (dtd->SystemID != NULL) { xmlOutputBufferWrite(buf, 8, " SYSTEM "); xmlBufWriteQuotedString(buf->buffer, dtd->SystemID); } if ((dtd->entities == NULL) && (dtd->elements == NULL) && (dtd->attributes == NULL) && (dtd->notations == NULL) && (dtd->pentities == NULL)) { xmlOutputBufferWrite(buf, 1, ">"); return; } xmlOutputBufferWrite(buf, 3, " [\n"); /* * Dump the notations first they are not in the DTD children list * Do this only on a standalone DTD or on the internal subset though. */ if ((dtd->notations != NULL) && ((dtd->doc == NULL) || (dtd->doc->intSubset == dtd))) { xmlBufDumpNotationTable(buf->buffer, (xmlNotationTablePtr) dtd->notations); } format = ctxt->format; level = ctxt->level; doc = ctxt->doc; ctxt->format = 0; ctxt->level = -1; ctxt->doc = dtd->doc; xmlNodeListDumpOutput(ctxt, dtd->children); ctxt->format = format; ctxt->level = level; ctxt->doc = doc; xmlOutputBufferWrite(buf, 2, "]>"); } /** * xmlAttrDumpOutput: * @buf: the XML buffer output * @cur: the attribute pointer * * Dump an XML attribute */ static void xmlAttrDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { xmlOutputBufferPtr buf; if (cur == NULL) return; buf = ctxt->buf; if (buf == NULL) return; if (ctxt->format == 2) xmlOutputBufferWriteWSNonSig(ctxt, 2); else xmlOutputBufferWrite(buf, 1, " "); if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); xmlOutputBufferWrite(buf, 1, ":"); } xmlOutputBufferWriteString(buf, (const char *)cur->name); xmlOutputBufferWrite(buf, 2, "=\""); xmlAttrSerializeContent(buf, cur); xmlOutputBufferWrite(buf, 1, "\""); } /** * xmlAttrListDumpOutput: * @buf: the XML buffer output * @doc: the document * @cur: the first attribute pointer * @encoding: an optional encoding string * * Dump a list of XML attributes */ static void xmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { if (cur == NULL) return; while (cur != NULL) { xmlAttrDumpOutput(ctxt, cur); cur = cur->next; } } /** * xmlNodeListDumpOutput: * @cur: the first node * * Dump an XML node list, recursive behaviour, children are printed too. */ static void xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { xmlOutputBufferPtr buf; if (cur == NULL) return; buf = ctxt->buf; while (cur != NULL) { if ((ctxt->format == 1) && (xmlIndentTreeOutput) && ((cur->type == XML_ELEMENT_NODE) || (cur->type == XML_COMMENT_NODE) || (cur->type == XML_PI_NODE))) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level), ctxt->indent); xmlNodeDumpOutputInternal(ctxt, cur); if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); } cur = cur->next; } } #ifdef LIBXML_HTML_ENABLED /** * xmlNodeDumpOutputInternal: * @cur: the current node * * Dump an HTML node, recursive behaviour, children are printed too. */ static int htmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { const xmlChar *oldenc = NULL; const xmlChar *oldctxtenc = ctxt->encoding; const xmlChar *encoding = ctxt->encoding; xmlOutputBufferPtr buf = ctxt->buf; int switched_encoding = 0; xmlDocPtr doc; xmlInitParser(); doc = cur->doc; if (doc != NULL) { oldenc = doc->encoding; if (ctxt->encoding != NULL) { doc->encoding = BAD_CAST ctxt->encoding; } else if (doc->encoding != NULL) { encoding = doc->encoding; } } if ((encoding != NULL) && (doc != NULL)) htmlSetMetaEncoding(doc, (const xmlChar *) encoding); if ((encoding == NULL) && (doc != NULL)) encoding = htmlGetMetaEncoding(doc); if (encoding == NULL) encoding = BAD_CAST "HTML"; if ((encoding != NULL) && (oldctxtenc == NULL) && (buf->encoder == NULL) && (buf->conv == NULL)) { if (xmlSaveSwitchEncoding(ctxt, (const char*) encoding) < 0) { doc->encoding = oldenc; return(-1); } switched_encoding = 1; } if (ctxt->options & XML_SAVE_FORMAT) htmlNodeDumpFormatOutput(buf, doc, cur, (const char *)encoding, 1); else htmlNodeDumpFormatOutput(buf, doc, cur, (const char *)encoding, 0); /* * Restore the state of the saving context at the end of the document */ if ((switched_encoding) && (oldctxtenc == NULL)) { xmlSaveClearEncoding(ctxt); } if (doc != NULL) doc->encoding = oldenc; return(0); } #endif /** * xmlNodeDumpOutputInternal: * @cur: the current node * * Dump an XML node, recursive behaviour, children are printed too. */ static void xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { int format; xmlNodePtr tmp; xmlChar *start, *end; xmlOutputBufferPtr buf; if (cur == NULL) return; buf = ctxt->buf; if (cur->type == XML_XINCLUDE_START) return; if (cur->type == XML_XINCLUDE_END) return; if ((cur->type == XML_DOCUMENT_NODE) || (cur->type == XML_HTML_DOCUMENT_NODE)) { xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur); return; } #ifdef LIBXML_HTML_ENABLED if (ctxt->options & XML_SAVE_XHTML) { xhtmlNodeDumpOutput(ctxt, cur); return; } if (((cur->type != XML_NAMESPACE_DECL) && (cur->doc != NULL) && (cur->doc->type == XML_HTML_DOCUMENT_NODE) && ((ctxt->options & XML_SAVE_AS_XML) == 0)) || (ctxt->options & XML_SAVE_AS_HTML)) { htmlNodeDumpOutputInternal(ctxt, cur); return; } #endif if (cur->type == XML_DTD_NODE) { xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur); return; } if (cur->type == XML_DOCUMENT_FRAG_NODE) { xmlNodeListDumpOutput(ctxt, cur->children); return; } if (cur->type == XML_ELEMENT_DECL) { xmlBufDumpElementDecl(buf->buffer, (xmlElementPtr) cur); return; } if (cur->type == XML_ATTRIBUTE_DECL) { xmlBufDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur); return; } if (cur->type == XML_ENTITY_DECL) { xmlBufDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur); return; } if (cur->type == XML_TEXT_NODE) { if (cur->content != NULL) { if (cur->name != xmlStringTextNoenc) { xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); } else { /* * Disable escaping, needed for XSLT */ xmlOutputBufferWriteString(buf, (const char *) cur->content); } } return; } if (cur->type == XML_PI_NODE) { if (cur->content != NULL) { xmlOutputBufferWrite(buf, 2, "name); if (cur->content != NULL) { if (ctxt->format == 2) xmlOutputBufferWriteWSNonSig(ctxt, 0); else xmlOutputBufferWrite(buf, 1, " "); xmlOutputBufferWriteString(buf, (const char *)cur->content); } xmlOutputBufferWrite(buf, 2, "?>"); } else { xmlOutputBufferWrite(buf, 2, "name); if (ctxt->format == 2) xmlOutputBufferWriteWSNonSig(ctxt, 0); xmlOutputBufferWrite(buf, 2, "?>"); } return; } if (cur->type == XML_COMMENT_NODE) { if (cur->content != NULL) { xmlOutputBufferWrite(buf, 4, ""); } return; } if (cur->type == XML_ENTITY_REF_NODE) { xmlOutputBufferWrite(buf, 1, "&"); xmlOutputBufferWriteString(buf, (const char *)cur->name); xmlOutputBufferWrite(buf, 1, ";"); return; } if (cur->type == XML_CDATA_SECTION_NODE) { if (cur->content == NULL || *cur->content == '\0') { xmlOutputBufferWrite(buf, 12, ""); } else { start = end = cur->content; while (*end != '\0') { if ((*end == ']') && (*(end + 1) == ']') && (*(end + 2) == '>')) { end = end + 2; xmlOutputBufferWrite(buf, 9, ""); start = end; } end++; } if (start != end) { xmlOutputBufferWrite(buf, 9, ""); } } return; } if (cur->type == XML_ATTRIBUTE_NODE) { xmlAttrDumpOutput(ctxt, (xmlAttrPtr) cur); return; } if (cur->type == XML_NAMESPACE_DECL) { xmlNsDumpOutputCtxt(ctxt, (xmlNsPtr) cur); return; } format = ctxt->format; if (format == 1) { tmp = cur->children; while (tmp != NULL) { if ((tmp->type == XML_TEXT_NODE) || (tmp->type == XML_CDATA_SECTION_NODE) || (tmp->type == XML_ENTITY_REF_NODE)) { ctxt->format = 0; break; } tmp = tmp->next; } } xmlOutputBufferWrite(buf, 1, "<"); if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); xmlOutputBufferWrite(buf, 1, ":"); } xmlOutputBufferWriteString(buf, (const char *)cur->name); if (cur->nsDef) xmlNsListDumpOutputCtxt(ctxt, cur->nsDef); if (cur->properties != NULL) xmlAttrListDumpOutput(ctxt, cur->properties); if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) && (cur->children == NULL) && ((ctxt->options & XML_SAVE_NO_EMPTY) == 0)) { if (ctxt->format == 2) xmlOutputBufferWriteWSNonSig(ctxt, 0); xmlOutputBufferWrite(buf, 2, "/>"); ctxt->format = format; return; } if (ctxt->format == 2) xmlOutputBufferWriteWSNonSig(ctxt, 1); xmlOutputBufferWrite(buf, 1, ">"); if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); } if (cur->children != NULL) { if (ctxt->format == 1) xmlOutputBufferWrite(buf, 1, "\n"); if (ctxt->level >= 0) ctxt->level++; xmlNodeListDumpOutput(ctxt, cur->children); if (ctxt->level > 0) ctxt->level--; if ((xmlIndentTreeOutput) && (ctxt->format == 1)) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level), ctxt->indent); } xmlOutputBufferWrite(buf, 2, "ns != NULL) && (cur->ns->prefix != NULL)) { xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); xmlOutputBufferWrite(buf, 1, ":"); } xmlOutputBufferWriteString(buf, (const char *)cur->name); if (ctxt->format == 2) xmlOutputBufferWriteWSNonSig(ctxt, 0); xmlOutputBufferWrite(buf, 1, ">"); ctxt->format = format; } /** * xmlDocContentDumpOutput: * @cur: the document * * Dump an XML document. */ static int xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur) { #ifdef LIBXML_HTML_ENABLED xmlDtdPtr dtd; int is_xhtml = 0; #endif const xmlChar *oldenc = cur->encoding; const xmlChar *oldctxtenc = ctxt->encoding; const xmlChar *encoding = ctxt->encoding; xmlCharEncodingOutputFunc oldescape = ctxt->escape; xmlCharEncodingOutputFunc oldescapeAttr = ctxt->escapeAttr; xmlOutputBufferPtr buf = ctxt->buf; xmlCharEncoding enc; int switched_encoding = 0; xmlInitParser(); if ((cur->type != XML_HTML_DOCUMENT_NODE) && (cur->type != XML_DOCUMENT_NODE)) return(-1); if (ctxt->encoding != NULL) { cur->encoding = BAD_CAST ctxt->encoding; } else if (cur->encoding != NULL) { encoding = cur->encoding; } else if (cur->charset != XML_CHAR_ENCODING_UTF8) { encoding = (const xmlChar *) xmlGetCharEncodingName((xmlCharEncoding) cur->charset); } if (((cur->type == XML_HTML_DOCUMENT_NODE) && ((ctxt->options & XML_SAVE_AS_XML) == 0) && ((ctxt->options & XML_SAVE_XHTML) == 0)) || (ctxt->options & XML_SAVE_AS_HTML)) { #ifdef LIBXML_HTML_ENABLED if (encoding != NULL) htmlSetMetaEncoding(cur, (const xmlChar *) encoding); if (encoding == NULL) encoding = htmlGetMetaEncoding(cur); if (encoding == NULL) encoding = BAD_CAST "HTML"; if ((encoding != NULL) && (oldctxtenc == NULL) && (buf->encoder == NULL) && (buf->conv == NULL)) { if (xmlSaveSwitchEncoding(ctxt, (const char*) encoding) < 0) { cur->encoding = oldenc; return(-1); } } if (ctxt->options & XML_SAVE_FORMAT) htmlDocContentDumpFormatOutput(buf, cur, (const char *)encoding, 1); else htmlDocContentDumpFormatOutput(buf, cur, (const char *)encoding, 0); if (ctxt->encoding != NULL) cur->encoding = oldenc; return(0); #else return(-1); #endif } else if ((cur->type == XML_DOCUMENT_NODE) || (ctxt->options & XML_SAVE_AS_XML) || (ctxt->options & XML_SAVE_XHTML)) { enc = xmlParseCharEncoding((const char*) encoding); if ((encoding != NULL) && (oldctxtenc == NULL) && (buf->encoder == NULL) && (buf->conv == NULL) && ((ctxt->options & XML_SAVE_NO_DECL) == 0)) { if ((enc != XML_CHAR_ENCODING_UTF8) && (enc != XML_CHAR_ENCODING_NONE) && (enc != XML_CHAR_ENCODING_ASCII)) { /* * we need to switch to this encoding but just for this * document since we output the XMLDecl the conversion * must be done to not generate not well formed documents. */ if (xmlSaveSwitchEncoding(ctxt, (const char*) encoding) < 0) { cur->encoding = oldenc; return(-1); } switched_encoding = 1; } if (ctxt->escape == xmlEscapeEntities) ctxt->escape = NULL; if (ctxt->escapeAttr == xmlEscapeEntities) ctxt->escapeAttr = NULL; } /* * Save the XML declaration */ if ((ctxt->options & XML_SAVE_NO_DECL) == 0) { xmlOutputBufferWrite(buf, 14, "version != NULL) xmlBufWriteQuotedString(buf->buffer, cur->version); else xmlOutputBufferWrite(buf, 5, "\"1.0\""); if (encoding != NULL) { xmlOutputBufferWrite(buf, 10, " encoding="); xmlBufWriteQuotedString(buf->buffer, (xmlChar *) encoding); } switch (cur->standalone) { case 0: xmlOutputBufferWrite(buf, 16, " standalone=\"no\""); break; case 1: xmlOutputBufferWrite(buf, 17, " standalone=\"yes\""); break; } xmlOutputBufferWrite(buf, 3, "?>\n"); } #ifdef LIBXML_HTML_ENABLED if (ctxt->options & XML_SAVE_XHTML) is_xhtml = 1; if ((ctxt->options & XML_SAVE_NO_XHTML) == 0) { dtd = xmlGetIntSubset(cur); if (dtd != NULL) { is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); if (is_xhtml < 0) is_xhtml = 0; } } #endif if (cur->children != NULL) { xmlNodePtr child = cur->children; while (child != NULL) { ctxt->level = 0; #ifdef LIBXML_HTML_ENABLED if (is_xhtml) xhtmlNodeDumpOutput(ctxt, child); else #endif xmlNodeDumpOutputInternal(ctxt, child); xmlOutputBufferWrite(buf, 1, "\n"); child = child->next; } } } /* * Restore the state of the saving context at the end of the document */ if ((switched_encoding) && (oldctxtenc == NULL)) { xmlSaveClearEncoding(ctxt); ctxt->escape = oldescape; ctxt->escapeAttr = oldescapeAttr; } cur->encoding = oldenc; return(0); } #ifdef LIBXML_HTML_ENABLED /************************************************************************ * * * Functions specific to XHTML serialization * * * ************************************************************************/ /** * xhtmlIsEmpty: * @node: the node * * Check if a node is an empty xhtml node * * Returns 1 if the node is an empty node, 0 if not and -1 in case of error */ static int xhtmlIsEmpty(xmlNodePtr node) { if (node == NULL) return(-1); if (node->type != XML_ELEMENT_NODE) return(0); if ((node->ns != NULL) && (!xmlStrEqual(node->ns->href, XHTML_NS_NAME))) return(0); if (node->children != NULL) return(0); switch (node->name[0]) { case 'a': if (xmlStrEqual(node->name, BAD_CAST "area")) return(1); return(0); case 'b': if (xmlStrEqual(node->name, BAD_CAST "br")) return(1); if (xmlStrEqual(node->name, BAD_CAST "base")) return(1); if (xmlStrEqual(node->name, BAD_CAST "basefont")) return(1); return(0); case 'c': if (xmlStrEqual(node->name, BAD_CAST "col")) return(1); return(0); case 'f': if (xmlStrEqual(node->name, BAD_CAST "frame")) return(1); return(0); case 'h': if (xmlStrEqual(node->name, BAD_CAST "hr")) return(1); return(0); case 'i': if (xmlStrEqual(node->name, BAD_CAST "img")) return(1); if (xmlStrEqual(node->name, BAD_CAST "input")) return(1); if (xmlStrEqual(node->name, BAD_CAST "isindex")) return(1); return(0); case 'l': if (xmlStrEqual(node->name, BAD_CAST "link")) return(1); return(0); case 'm': if (xmlStrEqual(node->name, BAD_CAST "meta")) return(1); return(0); case 'p': if (xmlStrEqual(node->name, BAD_CAST "param")) return(1); return(0); } return(0); } /** * xhtmlAttrListDumpOutput: * @cur: the first attribute pointer * * Dump a list of XML attributes */ static void xhtmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { xmlAttrPtr xml_lang = NULL; xmlAttrPtr lang = NULL; xmlAttrPtr name = NULL; xmlAttrPtr id = NULL; xmlNodePtr parent; xmlOutputBufferPtr buf; if (cur == NULL) return; buf = ctxt->buf; parent = cur->parent; while (cur != NULL) { if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "id"))) id = cur; else if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "name"))) name = cur; else if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang"))) lang = cur; else if ((cur->ns != NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang")) && (xmlStrEqual(cur->ns->prefix, BAD_CAST "xml"))) xml_lang = cur; else if ((cur->ns == NULL) && ((cur->children == NULL) || (cur->children->content == NULL) || (cur->children->content[0] == 0)) && (htmlIsBooleanAttr(cur->name))) { if (cur->children != NULL) xmlFreeNode(cur->children); cur->children = xmlNewText(cur->name); if (cur->children != NULL) cur->children->parent = (xmlNodePtr) cur; } xmlAttrDumpOutput(ctxt, cur); cur = cur->next; } /* * C.8 */ if ((name != NULL) && (id == NULL)) { if ((parent != NULL) && (parent->name != NULL) && ((xmlStrEqual(parent->name, BAD_CAST "a")) || (xmlStrEqual(parent->name, BAD_CAST "p")) || (xmlStrEqual(parent->name, BAD_CAST "div")) || (xmlStrEqual(parent->name, BAD_CAST "img")) || (xmlStrEqual(parent->name, BAD_CAST "map")) || (xmlStrEqual(parent->name, BAD_CAST "applet")) || (xmlStrEqual(parent->name, BAD_CAST "form")) || (xmlStrEqual(parent->name, BAD_CAST "frame")) || (xmlStrEqual(parent->name, BAD_CAST "iframe")))) { xmlOutputBufferWrite(buf, 5, " id=\""); xmlAttrSerializeContent(buf, name); xmlOutputBufferWrite(buf, 1, "\""); } } /* * C.7. */ if ((lang != NULL) && (xml_lang == NULL)) { xmlOutputBufferWrite(buf, 11, " xml:lang=\""); xmlAttrSerializeContent(buf, lang); xmlOutputBufferWrite(buf, 1, "\""); } else if ((xml_lang != NULL) && (lang == NULL)) { xmlOutputBufferWrite(buf, 7, " lang=\""); xmlAttrSerializeContent(buf, xml_lang); xmlOutputBufferWrite(buf, 1, "\""); } } /** * xhtmlNodeListDumpOutput: * @buf: the XML buffer output * @doc: the XHTML document * @cur: the first node * @level: the imbrication level for indenting * @format: is formatting allowed * @encoding: an optional encoding string * * Dump an XML node list, recursive behaviour, children are printed too. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called */ static void xhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { xmlOutputBufferPtr buf; if (cur == NULL) return; buf = ctxt->buf; while (cur != NULL) { if ((ctxt->format == 1) && (xmlIndentTreeOutput) && (cur->type == XML_ELEMENT_NODE)) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level), ctxt->indent); xhtmlNodeDumpOutput(ctxt, cur); if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); } cur = cur->next; } } /** * xhtmlNodeDumpOutput: * @buf: the XML buffer output * @doc: the XHTML document * @cur: the current node * @level: the imbrication level for indenting * @format: is formatting allowed * @encoding: an optional encoding string * * Dump an XHTML node, recursive behaviour, children are printed too. */ static void xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { int format, addmeta = 0; xmlNodePtr tmp; xmlChar *start, *end; xmlOutputBufferPtr buf; if (cur == NULL) return; if ((cur->type == XML_DOCUMENT_NODE) || (cur->type == XML_HTML_DOCUMENT_NODE)) { xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur); return; } if (cur->type == XML_XINCLUDE_START) return; if (cur->type == XML_XINCLUDE_END) return; if (cur->type == XML_NAMESPACE_DECL) { xmlNsDumpOutputCtxt(ctxt, (xmlNsPtr) cur); return; } if (cur->type == XML_DTD_NODE) { xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur); return; } if (cur->type == XML_DOCUMENT_FRAG_NODE) { xhtmlNodeListDumpOutput(ctxt, cur->children); return; } buf = ctxt->buf; if (cur->type == XML_ELEMENT_DECL) { xmlBufDumpElementDecl(buf->buffer, (xmlElementPtr) cur); return; } if (cur->type == XML_ATTRIBUTE_DECL) { xmlBufDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur); return; } if (cur->type == XML_ENTITY_DECL) { xmlBufDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur); return; } if (cur->type == XML_TEXT_NODE) { if (cur->content != NULL) { if ((cur->name == xmlStringText) || (cur->name != xmlStringTextNoenc)) { xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); } else { /* * Disable escaping, needed for XSLT */ xmlOutputBufferWriteString(buf, (const char *) cur->content); } } return; } if (cur->type == XML_PI_NODE) { if (cur->content != NULL) { xmlOutputBufferWrite(buf, 2, "name); if (cur->content != NULL) { xmlOutputBufferWrite(buf, 1, " "); xmlOutputBufferWriteString(buf, (const char *)cur->content); } xmlOutputBufferWrite(buf, 2, "?>"); } else { xmlOutputBufferWrite(buf, 2, "name); xmlOutputBufferWrite(buf, 2, "?>"); } return; } if (cur->type == XML_COMMENT_NODE) { if (cur->content != NULL) { xmlOutputBufferWrite(buf, 4, ""); } return; } if (cur->type == XML_ENTITY_REF_NODE) { xmlOutputBufferWrite(buf, 1, "&"); xmlOutputBufferWriteString(buf, (const char *)cur->name); xmlOutputBufferWrite(buf, 1, ";"); return; } if (cur->type == XML_CDATA_SECTION_NODE) { if (cur->content == NULL || *cur->content == '\0') { xmlOutputBufferWrite(buf, 12, ""); } else { start = end = cur->content; while (*end != '\0') { if (*end == ']' && *(end + 1) == ']' && *(end + 2) == '>') { end = end + 2; xmlOutputBufferWrite(buf, 9, ""); start = end; } end++; } if (start != end) { xmlOutputBufferWrite(buf, 9, ""); } } return; } if (cur->type == XML_ATTRIBUTE_NODE) { xmlAttrDumpOutput(ctxt, (xmlAttrPtr) cur); return; } format = ctxt->format; if (format == 1) { tmp = cur->children; while (tmp != NULL) { if ((tmp->type == XML_TEXT_NODE) || (tmp->type == XML_ENTITY_REF_NODE)) { format = 0; break; } tmp = tmp->next; } } xmlOutputBufferWrite(buf, 1, "<"); if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); xmlOutputBufferWrite(buf, 1, ":"); } xmlOutputBufferWriteString(buf, (const char *)cur->name); if (cur->nsDef) xmlNsListDumpOutputCtxt(ctxt, cur->nsDef); if ((xmlStrEqual(cur->name, BAD_CAST "html") && (cur->ns == NULL) && (cur->nsDef == NULL))) { /* * 3.1.1. Strictly Conforming Documents A.3.1.1 3/ */ xmlOutputBufferWriteString(buf, " xmlns=\"http://www.w3.org/1999/xhtml\""); } if (cur->properties != NULL) xhtmlAttrListDumpOutput(ctxt, cur->properties); if ((cur->type == XML_ELEMENT_NODE) && (cur->parent != NULL) && (cur->parent->parent == (xmlNodePtr) cur->doc) && xmlStrEqual(cur->name, BAD_CAST"head") && xmlStrEqual(cur->parent->name, BAD_CAST"html")) { tmp = cur->children; while (tmp != NULL) { if (xmlStrEqual(tmp->name, BAD_CAST"meta")) { xmlChar *httpequiv; httpequiv = xmlGetProp(tmp, BAD_CAST"http-equiv"); if (httpequiv != NULL) { if (xmlStrcasecmp(httpequiv, BAD_CAST"Content-Type") == 0) { xmlFree(httpequiv); break; } xmlFree(httpequiv); } } tmp = tmp->next; } if (tmp == NULL) addmeta = 1; } if ((cur->type == XML_ELEMENT_NODE) && (cur->children == NULL)) { if (((cur->ns == NULL) || (cur->ns->prefix == NULL)) && ((xhtmlIsEmpty(cur) == 1) && (addmeta == 0))) { /* * C.2. Empty Elements */ xmlOutputBufferWrite(buf, 3, " />"); } else { if (addmeta == 1) { xmlOutputBufferWrite(buf, 1, ">"); if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); if (xmlIndentTreeOutput) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level + 1 > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level + 1), ctxt->indent); } xmlOutputBufferWriteString(buf, ""); if (ctxt->format == 1) xmlOutputBufferWrite(buf, 1, "\n"); } else { xmlOutputBufferWrite(buf, 1, ">"); } /* * C.3. Element Minimization and Empty Element Content */ xmlOutputBufferWrite(buf, 2, "ns != NULL) && (cur->ns->prefix != NULL)) { xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); xmlOutputBufferWrite(buf, 1, ":"); } xmlOutputBufferWriteString(buf, (const char *)cur->name); xmlOutputBufferWrite(buf, 1, ">"); } return; } xmlOutputBufferWrite(buf, 1, ">"); if (addmeta == 1) { if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); if (xmlIndentTreeOutput) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level + 1 > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level + 1), ctxt->indent); } xmlOutputBufferWriteString(buf, ""); } if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); } #if 0 /* * This was removed due to problems with HTML processors. * See bug #345147. */ /* * 4.8. Script and Style elements */ if ((cur->type == XML_ELEMENT_NODE) && ((xmlStrEqual(cur->name, BAD_CAST "script")) || (xmlStrEqual(cur->name, BAD_CAST "style"))) && ((cur->ns == NULL) || (xmlStrEqual(cur->ns->href, XHTML_NS_NAME)))) { xmlNodePtr child = cur->children; while (child != NULL) { if (child->type == XML_TEXT_NODE) { if ((xmlStrchr(child->content, '<') == NULL) && (xmlStrchr(child->content, '&') == NULL) && (xmlStrstr(child->content, BAD_CAST "]]>") == NULL)) { /* Nothing to escape, so just output as is... */ /* FIXME: Should we do something about "--" also? */ int level = ctxt->level; int indent = ctxt->format; ctxt->level = 0; ctxt->format = 0; xmlOutputBufferWriteString(buf, (const char *) child->content); /* (We cannot use xhtmlNodeDumpOutput() here because * we wish to leave '>' unescaped!) */ ctxt->level = level; ctxt->format = indent; } else { /* We must use a CDATA section. Unfortunately, * this will break CSS and JavaScript when read by * a browser in HTML4-compliant mode. :-( */ start = end = child->content; while (*end != '\0') { if (*end == ']' && *(end + 1) == ']' && *(end + 2) == '>') { end = end + 2; xmlOutputBufferWrite(buf, 9, ""); start = end; } end++; } if (start != end) { xmlOutputBufferWrite(buf, 9, ""); } } } else { int level = ctxt->level; int indent = ctxt->format; ctxt->level = 0; ctxt->format = 0; xhtmlNodeDumpOutput(ctxt, child); ctxt->level = level; ctxt->format = indent; } child = child->next; } } #endif if (cur->children != NULL) { int indent = ctxt->format; if (format == 1) xmlOutputBufferWrite(buf, 1, "\n"); if (ctxt->level >= 0) ctxt->level++; ctxt->format = format; xhtmlNodeListDumpOutput(ctxt, cur->children); if (ctxt->level > 0) ctxt->level--; ctxt->format = indent; if ((xmlIndentTreeOutput) && (format == 1)) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level), ctxt->indent); } xmlOutputBufferWrite(buf, 2, "ns != NULL) && (cur->ns->prefix != NULL)) { xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); xmlOutputBufferWrite(buf, 1, ":"); } xmlOutputBufferWriteString(buf, (const char *)cur->name); xmlOutputBufferWrite(buf, 1, ">"); } #endif /************************************************************************ * * * Public entry points * * * ************************************************************************/ /** * xmlSaveToFd: * @fd: a file descriptor number * @encoding: the encoding name to use or NULL * @options: a set of xmlSaveOptions * * Create a document saving context serializing to a file descriptor * with the encoding and the options given. * * Returns a new serialization context or NULL in case of error. */ xmlSaveCtxtPtr xmlSaveToFd(int fd, const char *encoding, int options) { xmlSaveCtxtPtr ret; ret = xmlNewSaveCtxt(encoding, options); if (ret == NULL) return(NULL); ret->buf = xmlOutputBufferCreateFd(fd, ret->handler); if (ret->buf == NULL) { xmlFreeSaveCtxt(ret); return(NULL); } return(ret); } /** * xmlSaveToFilename: * @filename: a file name or an URL * @encoding: the encoding name to use or NULL * @options: a set of xmlSaveOptions * * Create a document saving context serializing to a filename or possibly * to an URL (but this is less reliable) with the encoding and the options * given. * * Returns a new serialization context or NULL in case of error. */ xmlSaveCtxtPtr xmlSaveToFilename(const char *filename, const char *encoding, int options) { xmlSaveCtxtPtr ret; int compression = 0; /* TODO handle compression option */ ret = xmlNewSaveCtxt(encoding, options); if (ret == NULL) return(NULL); ret->buf = xmlOutputBufferCreateFilename(filename, ret->handler, compression); if (ret->buf == NULL) { xmlFreeSaveCtxt(ret); return(NULL); } return(ret); } /** * xmlSaveToBuffer: * @buffer: a buffer * @encoding: the encoding name to use or NULL * @options: a set of xmlSaveOptions * * Create a document saving context serializing to a buffer * with the encoding and the options given * * Returns a new serialization context or NULL in case of error. */ xmlSaveCtxtPtr xmlSaveToBuffer(xmlBufferPtr buffer, const char *encoding, int options) { xmlSaveCtxtPtr ret; xmlOutputBufferPtr out_buff; xmlCharEncodingHandlerPtr handler; ret = xmlNewSaveCtxt(encoding, options); if (ret == NULL) return(NULL); if (encoding != NULL) { handler = xmlFindCharEncodingHandler(encoding); if (handler == NULL) { xmlFree(ret); return(NULL); } } else handler = NULL; out_buff = xmlOutputBufferCreateBuffer(buffer, handler); if (out_buff == NULL) { xmlFree(ret); if (handler) xmlCharEncCloseFunc(handler); return(NULL); } ret->buf = out_buff; return(ret); } /** * xmlSaveToIO: * @iowrite: an I/O write function * @ioclose: an I/O close function * @ioctx: an I/O handler * @encoding: the encoding name to use or NULL * @options: a set of xmlSaveOptions * * Create a document saving context serializing to a file descriptor * with the encoding and the options given * * Returns a new serialization context or NULL in case of error. */ xmlSaveCtxtPtr xmlSaveToIO(xmlOutputWriteCallback iowrite, xmlOutputCloseCallback ioclose, void *ioctx, const char *encoding, int options) { xmlSaveCtxtPtr ret; ret = xmlNewSaveCtxt(encoding, options); if (ret == NULL) return(NULL); ret->buf = xmlOutputBufferCreateIO(iowrite, ioclose, ioctx, ret->handler); if (ret->buf == NULL) { xmlFreeSaveCtxt(ret); return(NULL); } return(ret); } /** * xmlSaveDoc: * @ctxt: a document saving context * @doc: a document * * Save a full document to a saving context * TODO: The function is not fully implemented yet as it does not return the * byte count but 0 instead * * Returns the number of byte written or -1 in case of error */ long xmlSaveDoc(xmlSaveCtxtPtr ctxt, xmlDocPtr doc) { long ret = 0; if ((ctxt == NULL) || (doc == NULL)) return(-1); if (xmlDocContentDumpOutput(ctxt, doc) < 0) return(-1); return(ret); } /** * xmlSaveTree: * @ctxt: a document saving context * @node: the top node of the subtree to save * * Save a subtree starting at the node parameter to a saving context * TODO: The function is not fully implemented yet as it does not return the * byte count but 0 instead * * Returns the number of byte written or -1 in case of error */ long xmlSaveTree(xmlSaveCtxtPtr ctxt, xmlNodePtr node) { long ret = 0; if ((ctxt == NULL) || (node == NULL)) return(-1); xmlNodeDumpOutputInternal(ctxt, node); return(ret); } /** * xmlSaveFlush: * @ctxt: a document saving context * * Flush a document saving context, i.e. make sure that all bytes have * been output. * * Returns the number of byte written or -1 in case of error. */ int xmlSaveFlush(xmlSaveCtxtPtr ctxt) { if (ctxt == NULL) return(-1); if (ctxt->buf == NULL) return(-1); return(xmlOutputBufferFlush(ctxt->buf)); } /** * xmlSaveClose: * @ctxt: a document saving context * * Close a document saving context, i.e. make sure that all bytes have * been output and free the associated data. * * Returns the number of byte written or -1 in case of error. */ int xmlSaveClose(xmlSaveCtxtPtr ctxt) { int ret; if (ctxt == NULL) return(-1); ret = xmlSaveFlush(ctxt); xmlFreeSaveCtxt(ctxt); return(ret); } /** * xmlSaveSetEscape: * @ctxt: a document saving context * @escape: the escaping function * * Set a custom escaping function to be used for text in element content * * Returns 0 if successful or -1 in case of error. */ int xmlSaveSetEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape) { if (ctxt == NULL) return(-1); ctxt->escape = escape; return(0); } /** * xmlSaveSetAttrEscape: * @ctxt: a document saving context * @escape: the escaping function * * Set a custom escaping function to be used for text in attribute content * * Returns 0 if successful or -1 in case of error. */ int xmlSaveSetAttrEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape) { if (ctxt == NULL) return(-1); ctxt->escapeAttr = escape; return(0); } /************************************************************************ * * * Public entry points based on buffers * * * ************************************************************************/ /** * xmlBufAttrSerializeTxtContent: * @buf: and xmlBufPtr output * @doc: the document * @attr: the attribute node * @string: the text content * * Serialize text attribute values to an xmlBufPtr */ void xmlBufAttrSerializeTxtContent(xmlBufPtr buf, xmlDocPtr doc, xmlAttrPtr attr, const xmlChar * string) { xmlChar *base, *cur; if (string == NULL) return; base = cur = (xmlChar *) string; while (*cur != 0) { if (*cur == '\n') { if (base != cur) xmlBufAdd(buf, base, cur - base); xmlBufAdd(buf, BAD_CAST " ", 5); cur++; base = cur; } else if (*cur == '\r') { if (base != cur) xmlBufAdd(buf, base, cur - base); xmlBufAdd(buf, BAD_CAST " ", 5); cur++; base = cur; } else if (*cur == '\t') { if (base != cur) xmlBufAdd(buf, base, cur - base); xmlBufAdd(buf, BAD_CAST " ", 4); cur++; base = cur; } else if (*cur == '"') { if (base != cur) xmlBufAdd(buf, base, cur - base); xmlBufAdd(buf, BAD_CAST """, 6); cur++; base = cur; } else if (*cur == '<') { if (base != cur) xmlBufAdd(buf, base, cur - base); xmlBufAdd(buf, BAD_CAST "<", 4); cur++; base = cur; } else if (*cur == '>') { if (base != cur) xmlBufAdd(buf, base, cur - base); xmlBufAdd(buf, BAD_CAST ">", 4); cur++; base = cur; } else if (*cur == '&') { if (base != cur) xmlBufAdd(buf, base, cur - base); xmlBufAdd(buf, BAD_CAST "&", 5); cur++; base = cur; } else if ((*cur >= 0x80) && ((doc == NULL) || (doc->encoding == NULL))) { /* * We assume we have UTF-8 content. */ unsigned char tmp[12]; int val = 0, l = 1; if (base != cur) xmlBufAdd(buf, base, cur - base); if (*cur < 0xC0) { xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL); if (doc != NULL) doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); xmlSerializeHexCharRef(tmp, *cur); xmlBufAdd(buf, (xmlChar *) tmp, -1); cur++; base = cur; continue; } else if (*cur < 0xE0) { val = (cur[0]) & 0x1F; val <<= 6; val |= (cur[1]) & 0x3F; l = 2; } else if (*cur < 0xF0) { val = (cur[0]) & 0x0F; val <<= 6; val |= (cur[1]) & 0x3F; val <<= 6; val |= (cur[2]) & 0x3F; l = 3; } else if (*cur < 0xF8) { val = (cur[0]) & 0x07; val <<= 6; val |= (cur[1]) & 0x3F; val <<= 6; val |= (cur[2]) & 0x3F; val <<= 6; val |= (cur[3]) & 0x3F; l = 4; } if ((l == 1) || (!IS_CHAR(val))) { xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL); if (doc != NULL) doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); xmlSerializeHexCharRef(tmp, *cur); xmlBufAdd(buf, (xmlChar *) tmp, -1); cur++; base = cur; continue; } /* * We could do multiple things here. Just save * as a char ref */ xmlSerializeHexCharRef(tmp, val); xmlBufAdd(buf, (xmlChar *) tmp, -1); cur += l; base = cur; } else { cur++; } } if (base != cur) xmlBufAdd(buf, base, cur - base); } /** * xmlAttrSerializeTxtContent: * @buf: the XML buffer output * @doc: the document * @attr: the attribute node * @string: the text content * * Serialize text attribute values to an xml simple buffer */ void xmlAttrSerializeTxtContent(xmlBufferPtr buf, xmlDocPtr doc, xmlAttrPtr attr, const xmlChar * string) { xmlBufPtr buffer; if ((buf == NULL) || (string == NULL)) return; buffer = xmlBufFromBuffer(buf); if (buffer == NULL) return; xmlBufAttrSerializeTxtContent(buffer, doc, attr, string); xmlBufBackToBuffer(buffer); } /** * xmlNodeDump: * @buf: the XML buffer output * @doc: the document * @cur: the current node * @level: the imbrication level for indenting * @format: is formatting allowed * * Dump an XML node, recursive behaviour,children are printed too. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called * Since this is using xmlBuffer structures it is limited to 2GB and somehow * deprecated, use xmlBufNodeDump() instead. * * Returns the number of bytes written to the buffer or -1 in case of error */ int xmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format) { xmlBufPtr buffer; int ret; if ((buf == NULL) || (cur == NULL)) return(-1); buffer = xmlBufFromBuffer(buf); if (buffer == NULL) return(-1); ret = xmlBufNodeDump(buffer, doc, cur, level, format); xmlBufBackToBuffer(buffer); if (ret > INT_MAX) return(-1); return((int) ret); } /** * xmlBufNodeDump: * @buf: the XML buffer output * @doc: the document * @cur: the current node * @level: the imbrication level for indenting * @format: is formatting allowed * * Dump an XML node, recursive behaviour,children are printed too. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called * * Returns the number of bytes written to the buffer, in case of error 0 * is returned or @buf stores the error */ size_t xmlBufNodeDump(xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format) { size_t use; int ret; xmlOutputBufferPtr outbuf; int oldalloc; xmlInitParser(); if (cur == NULL) { #ifdef DEBUG_TREE xmlGenericError(xmlGenericErrorContext, "xmlNodeDump : node == NULL\n"); #endif return (-1); } if (buf == NULL) { #ifdef DEBUG_TREE xmlGenericError(xmlGenericErrorContext, "xmlNodeDump : buf == NULL\n"); #endif return (-1); } outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); if (outbuf == NULL) { xmlSaveErrMemory("creating buffer"); return (-1); } memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer)); outbuf->buffer = buf; outbuf->encoder = NULL; outbuf->writecallback = NULL; outbuf->closecallback = NULL; outbuf->context = NULL; outbuf->written = 0; use = xmlBufUse(buf); oldalloc = xmlBufGetAllocationScheme(buf); xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT); xmlNodeDumpOutput(outbuf, doc, cur, level, format, NULL); xmlBufSetAllocationScheme(buf, oldalloc); xmlFree(outbuf); ret = xmlBufUse(buf) - use; return (ret); } /** * xmlElemDump: * @f: the FILE * for the output * @doc: the document * @cur: the current node * * Dump an XML/HTML node, recursive behaviour, children are printed too. */ void xmlElemDump(FILE * f, xmlDocPtr doc, xmlNodePtr cur) { xmlOutputBufferPtr outbuf; xmlInitParser(); if (cur == NULL) { #ifdef DEBUG_TREE xmlGenericError(xmlGenericErrorContext, "xmlElemDump : cur == NULL\n"); #endif return; } #ifdef DEBUG_TREE if (doc == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlElemDump : doc == NULL\n"); } #endif outbuf = xmlOutputBufferCreateFile(f, NULL); if (outbuf == NULL) return; if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { #ifdef LIBXML_HTML_ENABLED htmlNodeDumpOutput(outbuf, doc, cur, NULL); #else xmlSaveErr(XML_ERR_INTERNAL_ERROR, cur, "HTML support not compiled in\n"); #endif /* LIBXML_HTML_ENABLED */ } else xmlNodeDumpOutput(outbuf, doc, cur, 0, 1, NULL); xmlOutputBufferClose(outbuf); } /************************************************************************ * * * Saving functions front-ends * * * ************************************************************************/ /** * xmlNodeDumpOutput: * @buf: the XML buffer output * @doc: the document * @cur: the current node * @level: the imbrication level for indenting * @format: is formatting allowed * @encoding: an optional encoding string * * Dump an XML node, recursive behaviour, children are printed too. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called */ void xmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format, const char *encoding) { xmlSaveCtxt ctxt; #ifdef LIBXML_HTML_ENABLED xmlDtdPtr dtd; int is_xhtml = 0; #endif xmlInitParser(); if ((buf == NULL) || (cur == NULL)) return; if (encoding == NULL) encoding = "UTF-8"; memset(&ctxt, 0, sizeof(ctxt)); ctxt.doc = doc; ctxt.buf = buf; ctxt.level = level; ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; #ifdef LIBXML_HTML_ENABLED dtd = xmlGetIntSubset(doc); if (dtd != NULL) { is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); if (is_xhtml < 0) is_xhtml = 0; } if (is_xhtml) xhtmlNodeDumpOutput(&ctxt, cur); else #endif xmlNodeDumpOutputInternal(&ctxt, cur); } /** * xmlDocDumpFormatMemoryEnc: * @out_doc: Document to generate XML text from * @doc_txt_ptr: Memory pointer for allocated XML text * @doc_txt_len: Length of the generated XML text * @txt_encoding: Character encoding to use when generating XML text * @format: should formatting spaces been added * * Dump the current DOM tree into memory using the character encoding specified * by the caller. Note it is up to the caller of this function to free the * allocated memory with xmlFree(). * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called */ void xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, int * doc_txt_len, const char * txt_encoding, int format) { xmlSaveCtxt ctxt; int dummy = 0; xmlOutputBufferPtr out_buff = NULL; xmlCharEncodingHandlerPtr conv_hdlr = NULL; if (doc_txt_len == NULL) { doc_txt_len = &dummy; /* Continue, caller just won't get length */ } if (doc_txt_ptr == NULL) { *doc_txt_len = 0; return; } *doc_txt_ptr = NULL; *doc_txt_len = 0; if (out_doc == NULL) { /* No document, no output */ return; } /* * Validate the encoding value, if provided. * This logic is copied from xmlSaveFileEnc. */ if (txt_encoding == NULL) txt_encoding = (const char *) out_doc->encoding; if (txt_encoding != NULL) { conv_hdlr = xmlFindCharEncodingHandler(txt_encoding); if ( conv_hdlr == NULL ) { xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, (xmlNodePtr) out_doc, txt_encoding); return; } } if ((out_buff = xmlAllocOutputBuffer(conv_hdlr)) == NULL ) { xmlSaveErrMemory("creating buffer"); return; } memset(&ctxt, 0, sizeof(ctxt)); ctxt.doc = out_doc; ctxt.buf = out_buff; ctxt.level = 0; ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) txt_encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; xmlDocContentDumpOutput(&ctxt, out_doc); xmlOutputBufferFlush(out_buff); if (out_buff->conv != NULL) { *doc_txt_len = xmlBufUse(out_buff->conv); *doc_txt_ptr = xmlStrndup(xmlBufContent(out_buff->conv), *doc_txt_len); } else { *doc_txt_len = xmlBufUse(out_buff->buffer); *doc_txt_ptr = xmlStrndup(xmlBufContent(out_buff->buffer),*doc_txt_len); } (void)xmlOutputBufferClose(out_buff); if ((*doc_txt_ptr == NULL) && (*doc_txt_len > 0)) { *doc_txt_len = 0; xmlSaveErrMemory("creating output"); } return; } /** * xmlDocDumpMemory: * @cur: the document * @mem: OUT: the memory pointer * @size: OUT: the memory length * * Dump an XML document in memory and return the #xmlChar * and it's size * in bytes. It's up to the caller to free the memory with xmlFree(). * The resulting byte array is zero terminated, though the last 0 is not * included in the returned size. */ void xmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) { xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, 0); } /** * xmlDocDumpFormatMemory: * @cur: the document * @mem: OUT: the memory pointer * @size: OUT: the memory length * @format: should formatting spaces been added * * * Dump an XML document in memory and return the #xmlChar * and it's size. * It's up to the caller to free the memory with xmlFree(). * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called */ void xmlDocDumpFormatMemory(xmlDocPtr cur, xmlChar**mem, int *size, int format) { xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, format); } /** * xmlDocDumpMemoryEnc: * @out_doc: Document to generate XML text from * @doc_txt_ptr: Memory pointer for allocated XML text * @doc_txt_len: Length of the generated XML text * @txt_encoding: Character encoding to use when generating XML text * * Dump the current DOM tree into memory using the character encoding specified * by the caller. Note it is up to the caller of this function to free the * allocated memory with xmlFree(). */ void xmlDocDumpMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, int * doc_txt_len, const char * txt_encoding) { xmlDocDumpFormatMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len, txt_encoding, 0); } /** * xmlDocFormatDump: * @f: the FILE* * @cur: the document * @format: should formatting spaces been added * * Dump an XML document to an open FILE. * * returns: the number of bytes written or -1 in case of failure. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called */ int xmlDocFormatDump(FILE *f, xmlDocPtr cur, int format) { xmlSaveCtxt ctxt; xmlOutputBufferPtr buf; const char * encoding; xmlCharEncodingHandlerPtr handler = NULL; int ret; if (cur == NULL) { #ifdef DEBUG_TREE xmlGenericError(xmlGenericErrorContext, "xmlDocDump : document == NULL\n"); #endif return(-1); } encoding = (const char *) cur->encoding; if (encoding != NULL) { handler = xmlFindCharEncodingHandler(encoding); if (handler == NULL) { xmlFree((char *) cur->encoding); cur->encoding = NULL; encoding = NULL; } } buf = xmlOutputBufferCreateFile(f, handler); if (buf == NULL) return(-1); memset(&ctxt, 0, sizeof(ctxt)); ctxt.doc = cur; ctxt.buf = buf; ctxt.level = 0; ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; xmlDocContentDumpOutput(&ctxt, cur); ret = xmlOutputBufferClose(buf); return(ret); } /** * xmlDocDump: * @f: the FILE* * @cur: the document * * Dump an XML document to an open FILE. * * returns: the number of bytes written or -1 in case of failure. */ int xmlDocDump(FILE *f, xmlDocPtr cur) { return(xmlDocFormatDump (f, cur, 0)); } /** * xmlSaveFileTo: * @buf: an output I/O buffer * @cur: the document * @encoding: the encoding if any assuming the I/O layer handles the trancoding * * Dump an XML document to an I/O buffer. * Warning ! This call xmlOutputBufferClose() on buf which is not available * after this call. * * returns: the number of bytes written or -1 in case of failure. */ int xmlSaveFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding) { xmlSaveCtxt ctxt; int ret; if (buf == NULL) return(-1); if (cur == NULL) { xmlOutputBufferClose(buf); return(-1); } memset(&ctxt, 0, sizeof(ctxt)); ctxt.doc = cur; ctxt.buf = buf; ctxt.level = 0; ctxt.format = 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; xmlDocContentDumpOutput(&ctxt, cur); ret = xmlOutputBufferClose(buf); return(ret); } /** * xmlSaveFormatFileTo: * @buf: an output I/O buffer * @cur: the document * @encoding: the encoding if any assuming the I/O layer handles the trancoding * @format: should formatting spaces been added * * Dump an XML document to an I/O buffer. * Warning ! This call xmlOutputBufferClose() on buf which is not available * after this call. * * returns: the number of bytes written or -1 in case of failure. */ int xmlSaveFormatFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding, int format) { xmlSaveCtxt ctxt; int ret; if (buf == NULL) return(-1); if ((cur == NULL) || ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_HTML_DOCUMENT_NODE))) { xmlOutputBufferClose(buf); return(-1); } memset(&ctxt, 0, sizeof(ctxt)); ctxt.doc = cur; ctxt.buf = buf; ctxt.level = 0; ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; xmlDocContentDumpOutput(&ctxt, cur); ret = xmlOutputBufferClose(buf); return (ret); } /** * xmlSaveFormatFileEnc: * @filename: the filename or URL to output * @cur: the document being saved * @encoding: the name of the encoding to use or NULL. * @format: should formatting spaces be added. * * Dump an XML document to a file or an URL. * * Returns the number of bytes written or -1 in case of error. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called */ int xmlSaveFormatFileEnc( const char * filename, xmlDocPtr cur, const char * encoding, int format ) { xmlSaveCtxt ctxt; xmlOutputBufferPtr buf; xmlCharEncodingHandlerPtr handler = NULL; int ret; if (cur == NULL) return(-1); if (encoding == NULL) encoding = (const char *) cur->encoding; if (encoding != NULL) { handler = xmlFindCharEncodingHandler(encoding); if (handler == NULL) return(-1); } #ifdef HAVE_ZLIB_H if (cur->compression < 0) cur->compression = xmlGetCompressMode(); #endif /* * save the content to a temp buffer. */ buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression); if (buf == NULL) return(-1); memset(&ctxt, 0, sizeof(ctxt)); ctxt.doc = cur; ctxt.buf = buf; ctxt.level = 0; ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; xmlDocContentDumpOutput(&ctxt, cur); ret = xmlOutputBufferClose(buf); return(ret); } /** * xmlSaveFileEnc: * @filename: the filename (or URL) * @cur: the document * @encoding: the name of an encoding (or NULL) * * Dump an XML document, converting it to the given encoding * * returns: the number of bytes written or -1 in case of failure. */ int xmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) { return ( xmlSaveFormatFileEnc( filename, cur, encoding, 0 ) ); } /** * xmlSaveFormatFile: * @filename: the filename (or URL) * @cur: the document * @format: should formatting spaces been added * * Dump an XML document to a file. Will use compression if * compiled in and enabled. If @filename is "-" the stdout file is * used. If @format is set then the document will be indented on output. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called * * returns: the number of bytes written or -1 in case of failure. */ int xmlSaveFormatFile(const char *filename, xmlDocPtr cur, int format) { return ( xmlSaveFormatFileEnc( filename, cur, NULL, format ) ); } /** * xmlSaveFile: * @filename: the filename (or URL) * @cur: the document * * Dump an XML document to a file. Will use compression if * compiled in and enabled. If @filename is "-" the stdout file is * used. * returns: the number of bytes written or -1 in case of failure. */ int xmlSaveFile(const char *filename, xmlDocPtr cur) { return(xmlSaveFormatFileEnc(filename, cur, NULL, 0)); } #endif /* LIBXML_OUTPUT_ENABLED */ #define bottom_xmlsave #include "elfgcchack.h" libxml2-2.9.1+dfsg1/testHTML.c0000644000175000017500000005124112113312343014360 0ustar aronaron/* * testHTML.c : a small tester program for HTML input. * * See Copyright for the status of this software. * * daniel@veillard.com */ #include "libxml.h" #ifdef LIBXML_HTML_ENABLED #include #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #include #include #include #include #include #include #ifdef LIBXML_DEBUG_ENABLED static int debug = 0; #endif static int copy = 0; static int sax = 0; static int repeat = 0; static int noout = 0; #ifdef LIBXML_PUSH_ENABLED static int push = 0; #endif /* LIBXML_PUSH_ENABLED */ static char *encoding = NULL; static int options = 0; static xmlSAXHandler emptySAXHandlerStruct = { NULL, /* internalSubset */ NULL, /* isStandalone */ NULL, /* hasInternalSubset */ NULL, /* hasExternalSubset */ NULL, /* resolveEntity */ NULL, /* getEntity */ NULL, /* entityDecl */ NULL, /* notationDecl */ NULL, /* attributeDecl */ NULL, /* elementDecl */ NULL, /* unparsedEntityDecl */ NULL, /* setDocumentLocator */ NULL, /* startDocument */ NULL, /* endDocument */ NULL, /* startElement */ NULL, /* endElement */ NULL, /* reference */ NULL, /* characters */ NULL, /* ignorableWhitespace */ NULL, /* processingInstruction */ NULL, /* comment */ NULL, /* xmlParserWarning */ NULL, /* xmlParserError */ NULL, /* xmlParserError */ NULL, /* getParameterEntity */ NULL, /* cdataBlock */ NULL, /* externalSubset */ 1, /* initialized */ NULL, /* private */ NULL, /* startElementNsSAX2Func */ NULL, /* endElementNsSAX2Func */ NULL /* xmlStructuredErrorFunc */ }; static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct; extern xmlSAXHandlerPtr debugSAXHandler; /************************************************************************ * * * Debug Handlers * * * ************************************************************************/ /** * isStandaloneDebug: * @ctxt: An XML parser context * * Is this document tagged standalone ? * * Returns 1 if true */ static int isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.isStandalone()\n"); return(0); } /** * hasInternalSubsetDebug: * @ctxt: An XML parser context * * Does this document has an internal subset * * Returns 1 if true */ static int hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.hasInternalSubset()\n"); return(0); } /** * hasExternalSubsetDebug: * @ctxt: An XML parser context * * Does this document has an external subset * * Returns 1 if true */ static int hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.hasExternalSubset()\n"); return(0); } /** * hasInternalSubsetDebug: * @ctxt: An XML parser context * * Does this document has an internal subset */ static void internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) { fprintf(stdout, "SAX.internalSubset(%s,", name); if (ExternalID == NULL) fprintf(stdout, " ,"); else fprintf(stdout, " %s,", ExternalID); if (SystemID == NULL) fprintf(stdout, " )\n"); else fprintf(stdout, " %s)\n", SystemID); } /** * resolveEntityDebug: * @ctxt: An XML parser context * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * Special entity resolver, better left to the parser, it has * more context than the application layer. * The default behaviour is to NOT resolve the entities, in that case * the ENTITY_REF nodes are built in the structure (and the parameter * values). * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */ static xmlParserInputPtr resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId) { /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ fprintf(stdout, "SAX.resolveEntity("); if (publicId != NULL) fprintf(stdout, "%s", (char *)publicId); else fprintf(stdout, " "); if (systemId != NULL) fprintf(stdout, ", %s)\n", (char *)systemId); else fprintf(stdout, ", )\n"); /********* if (systemId != NULL) { return(xmlNewInputFromFile(ctxt, (char *) systemId)); } *********/ return(NULL); } /** * getEntityDebug: * @ctxt: An XML parser context * @name: The entity name * * Get an entity by name * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */ static xmlEntityPtr getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) { fprintf(stdout, "SAX.getEntity(%s)\n", name); return(NULL); } /** * getParameterEntityDebug: * @ctxt: An XML parser context * @name: The entity name * * Get a parameter entity by name * * Returns the xmlParserInputPtr */ static xmlEntityPtr getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) { fprintf(stdout, "SAX.getParameterEntity(%s)\n", name); return(NULL); } /** * entityDeclDebug: * @ctxt: An XML parser context * @name: the entity name * @type: the entity type * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @content: the entity value (without processing). * * An entity definition has been parsed */ static void entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) { fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n", name, type, publicId, systemId, content); } /** * attributeDeclDebug: * @ctxt: An XML parser context * @name: the attribute name * @type: the attribute type * * An attribute definition has been parsed */ static void attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *elem, const xmlChar *name, int type, int def, const xmlChar *defaultValue, xmlEnumerationPtr tree ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n", elem, name, type, def, defaultValue); } /** * elementDeclDebug: * @ctxt: An XML parser context * @name: the element name * @type: the element type * @content: the element value (without processing). * * An element definition has been parsed */ static void elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, xmlElementContentPtr content ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n", name, type); } /** * notationDeclDebug: * @ctxt: An XML parser context * @name: The name of the notation * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * What to do when a notation declaration has been parsed. */ static void notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId) { fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n", (char *) name, (char *) publicId, (char *) systemId); } /** * unparsedEntityDeclDebug: * @ctxt: An XML parser context * @name: The name of the entity * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @notationName: the name of the notation * * What to do when an unparsed entity declaration is parsed */ static void unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName) { fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n", (char *) name, (char *) publicId, (char *) systemId, (char *) notationName); } /** * setDocumentLocatorDebug: * @ctxt: An XML parser context * @loc: A SAX Locator * * Receive the document locator at startup, actually xmlDefaultSAXLocator * Everything is available on the context, so this is useless in our case. */ static void setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.setDocumentLocator()\n"); } /** * startDocumentDebug: * @ctxt: An XML parser context * * called when the document start being processed. */ static void startDocumentDebug(void *ctx ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.startDocument()\n"); } /** * endDocumentDebug: * @ctxt: An XML parser context * * called when the document end has been detected. */ static void endDocumentDebug(void *ctx ATTRIBUTE_UNUSED) { fprintf(stdout, "SAX.endDocument()\n"); } /** * startElementDebug: * @ctxt: An XML parser context * @name: The element name * * called when an opening tag has been processed. */ static void startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) { int i; fprintf(stdout, "SAX.startElement(%s", (char *) name); if (atts != NULL) { for (i = 0;(atts[i] != NULL);i++) { fprintf(stdout, ", %s", atts[i++]); if (atts[i] != NULL) { unsigned char output[40]; const unsigned char *att = atts[i]; int outlen, attlen; fprintf(stdout, "='"); while ((attlen = strlen((char*)att)) > 0) { outlen = sizeof output - 1; htmlEncodeEntities(output, &outlen, att, &attlen, '\''); output[outlen] = 0; fprintf(stdout, "%s", (char *) output); att += attlen; } fprintf(stdout, "'"); } } } fprintf(stdout, ")\n"); } /** * endElementDebug: * @ctxt: An XML parser context * @name: The element name * * called when the end of an element has been detected. */ static void endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) { fprintf(stdout, "SAX.endElement(%s)\n", (char *) name); } /** * charactersDebug: * @ctxt: An XML parser context * @ch: a xmlChar string * @len: the number of xmlChar * * receiving some chars from the parser. * Question: how much at a time ??? */ static void charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) { unsigned char output[40]; int inlen = len, outlen = 30; htmlEncodeEntities(output, &outlen, ch, &inlen, 0); output[outlen] = 0; fprintf(stdout, "SAX.characters(%s, %d)\n", output, len); } /** * cdataDebug: * @ctxt: An XML parser context * @ch: a xmlChar string * @len: the number of xmlChar * * receiving some cdata chars from the parser. * Question: how much at a time ??? */ static void cdataDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) { unsigned char output[40]; int inlen = len, outlen = 30; htmlEncodeEntities(output, &outlen, ch, &inlen, 0); output[outlen] = 0; fprintf(stdout, "SAX.cdata(%s, %d)\n", output, len); } /** * referenceDebug: * @ctxt: An XML parser context * @name: The entity name * * called when an entity reference is detected. */ static void referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) { fprintf(stdout, "SAX.reference(%s)\n", name); } /** * ignorableWhitespaceDebug: * @ctxt: An XML parser context * @ch: a xmlChar string * @start: the first char in the string * @len: the number of xmlChar * * receiving some ignorable whitespaces from the parser. * Question: how much at a time ??? */ static void ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) { char output[40]; int i; for (i = 0;(i 0) { ctxt = htmlCreatePushParserCtxt(emptySAXHandler, NULL, chars, res, filename, XML_CHAR_ENCODING_NONE); while ((res = fread(chars, 1, size, f)) > 0) { htmlParseChunk(ctxt, chars, res, 0); } htmlParseChunk(ctxt, chars, 0, 1); doc = ctxt->myDoc; htmlFreeParserCtxt(ctxt); } if (doc != NULL) { fprintf(stdout, "htmlSAXParseFile returned non-NULL\n"); xmlFreeDoc(doc); } fclose(f); } if (!noout) { #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) f = fopen(filename, "rb"); #else f = fopen(filename, "r"); #endif if (f != NULL) { int res, size = 3; char chars[4096]; htmlParserCtxtPtr ctxt; /* if (repeat) */ size = 4096; res = fread(chars, 1, 4, f); if (res > 0) { ctxt = htmlCreatePushParserCtxt(debugSAXHandler, NULL, chars, res, filename, XML_CHAR_ENCODING_NONE); while ((res = fread(chars, 1, size, f)) > 0) { htmlParseChunk(ctxt, chars, res, 0); } htmlParseChunk(ctxt, chars, 0, 1); doc = ctxt->myDoc; htmlFreeParserCtxt(ctxt); } if (doc != NULL) { fprintf(stdout, "htmlSAXParseFile returned non-NULL\n"); xmlFreeDoc(doc); } fclose(f); } } } else { #endif /* LIBXML_PUSH_ENABLED */ doc = htmlSAXParseFile(filename, NULL, emptySAXHandler, NULL); if (doc != NULL) { fprintf(stdout, "htmlSAXParseFile returned non-NULL\n"); xmlFreeDoc(doc); } if (!noout) { /* * Debug callback */ doc = htmlSAXParseFile(filename, NULL, debugSAXHandler, NULL); if (doc != NULL) { fprintf(stdout, "htmlSAXParseFile returned non-NULL\n"); xmlFreeDoc(doc); } } #ifdef LIBXML_PUSH_ENABLED } #endif /* LIBXML_PUSH_ENABLED */ } static void parseAndPrintFile(char *filename) { htmlDocPtr doc = NULL; /* * build an HTML tree from a string; */ #ifdef LIBXML_PUSH_ENABLED if (push) { FILE *f; #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) f = fopen(filename, "rb"); #else f = fopen(filename, "r"); #endif if (f != NULL) { int res, size = 3; char chars[4096]; htmlParserCtxtPtr ctxt; /* if (repeat) */ size = 4096; res = fread(chars, 1, 4, f); if (res > 0) { ctxt = htmlCreatePushParserCtxt(NULL, NULL, chars, res, filename, XML_CHAR_ENCODING_NONE); while ((res = fread(chars, 1, size, f)) > 0) { htmlParseChunk(ctxt, chars, res, 0); } htmlParseChunk(ctxt, chars, 0, 1); doc = ctxt->myDoc; htmlFreeParserCtxt(ctxt); } fclose(f); } } else { doc = htmlReadFile(filename, NULL, options); } #else doc = htmlReadFile(filename,NULL,options); #endif if (doc == NULL) { xmlGenericError(xmlGenericErrorContext, "Could not parse %s\n", filename); } #ifdef LIBXML_TREE_ENABLED /* * test intermediate copy if needed. */ if (copy) { htmlDocPtr tmp; tmp = doc; doc = xmlCopyDoc(doc, 1); xmlFreeDoc(tmp); } #endif #ifdef LIBXML_OUTPUT_ENABLED /* * print it. */ if (!noout) { #ifdef LIBXML_DEBUG_ENABLED if (!debug) { if (encoding) htmlSaveFileEnc("-", doc, encoding); else htmlDocDump(stdout, doc); } else xmlDebugDumpDocument(stdout, doc); #else if (encoding) htmlSaveFileEnc("-", doc, encoding); else htmlDocDump(stdout, doc); #endif } #endif /* LIBXML_OUTPUT_ENABLED */ /* * free it. */ xmlFreeDoc(doc); } int main(int argc, char **argv) { int i, count; int files = 0; for (i = 1; i < argc ; i++) { #ifdef LIBXML_DEBUG_ENABLED if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) debug++; else #endif if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy"))) copy++; #ifdef LIBXML_PUSH_ENABLED else if ((!strcmp(argv[i], "-push")) || (!strcmp(argv[i], "--push"))) push++; #endif /* LIBXML_PUSH_ENABLED */ else if ((!strcmp(argv[i], "-sax")) || (!strcmp(argv[i], "--sax"))) sax++; else if ((!strcmp(argv[i], "-noout")) || (!strcmp(argv[i], "--noout"))) noout++; else if ((!strcmp(argv[i], "-repeat")) || (!strcmp(argv[i], "--repeat"))) repeat++; else if ((!strcmp(argv[i], "-encode")) || (!strcmp(argv[i], "--encode"))) { i++; encoding = argv[i]; } } for (i = 1; i < argc ; i++) { if ((!strcmp(argv[i], "-encode")) || (!strcmp(argv[i], "--encode"))) { i++; continue; } if (argv[i][0] != '-') { if (repeat) { for (count = 0;count < 100 * repeat;count++) { if (sax) parseSAXFile(argv[i]); else parseAndPrintFile(argv[i]); } } else { if (sax) parseSAXFile(argv[i]); else parseAndPrintFile(argv[i]); } files ++; } } if (files == 0) { printf("Usage : %s [--debug] [--copy] [--copy] HTMLfiles ...\n", argv[0]); printf("\tParse the HTML files and output the result of the parsing\n"); #ifdef LIBXML_DEBUG_ENABLED printf("\t--debug : dump a debug tree of the in-memory document\n"); #endif printf("\t--copy : used to test the internal copy implementation\n"); printf("\t--sax : debug the sequence of SAX callbacks\n"); printf("\t--repeat : parse the file 100 times, for timing\n"); printf("\t--noout : do not print the result\n"); #ifdef LIBXML_PUSH_ENABLED printf("\t--push : use the push mode parser\n"); #endif /* LIBXML_PUSH_ENABLED */ printf("\t--encode encoding : output in the given encoding\n"); } xmlCleanupParser(); xmlMemoryDump(); return(0); } #else /* !LIBXML_HTML_ENABLED */ #include int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { printf("%s : HTML support not compiled in\n", argv[0]); return(0); } #endif libxml2-2.9.1+dfsg1/ltmain.sh0000644000175000017500000105152212134171750014403 0ustar aronaron # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 libxml2-2.9.1+dfsg1/SAX2.c0000644000175000017500000024743112124500635013446 0ustar aronaron/* * SAX2.c : Default SAX2 handler to build a tree. * * See Copyright for the status of this software. * * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Define SIZE_T_MAX unless defined through . */ #ifndef SIZE_T_MAX # define SIZE_T_MAX ((size_t)-1) #endif /* !SIZE_T_MAX */ /* #define DEBUG_SAX2 */ /* #define DEBUG_SAX2_TREE */ /** * TODO: * * macro to flag unimplemented blocks * XML_CATALOG_PREFER user env to select between system/public prefered * option. C.f. Richard Tobin *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with *> values "system" and "public". I have made the default be "system" to *> match yours. */ #define TODO \ xmlGenericError(xmlGenericErrorContext, \ "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); /* * xmlSAX2ErrMemory: * @ctxt: an XML validation parser context * @msg: a string to accompany the error message */ static void xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, const char *msg) { xmlStructuredErrorFunc schannel = NULL; const char *str1 = "out of memory\n"; if (ctxt != NULL) { ctxt->errNo = XML_ERR_NO_MEMORY; if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) schannel = ctxt->sax->serror; __xmlRaiseError(schannel, ctxt->vctxt.error, ctxt->vctxt.userData, ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, (const char *) str1, NULL, NULL, 0, 0, msg, (const char *) str1, NULL); ctxt->errNo = XML_ERR_NO_MEMORY; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; } else { __xmlRaiseError(schannel, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, (const char *) str1, NULL, NULL, 0, 0, msg, (const char *) str1, NULL); } } /** * xmlValidError: * @ctxt: an XML validation parser context * @error: the error number * @msg: the error message * @str1: extra data * @str2: extra data * * Handle a validation error */ static void xmlErrValid(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const char *str1, const char *str2) { xmlStructuredErrorFunc schannel = NULL; if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) { ctxt->errNo = error; if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) schannel = ctxt->sax->serror; __xmlRaiseError(schannel, ctxt->vctxt.error, ctxt->vctxt.userData, ctxt, NULL, XML_FROM_DTD, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, (const char *) str1, (const char *) str2); ctxt->valid = 0; } else { __xmlRaiseError(schannel, NULL, NULL, ctxt, NULL, XML_FROM_DTD, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, (const char *) str1, (const char *) str2); } } /** * xmlFatalErrMsg: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @str1: an error string * @str2: an error string * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1, const xmlChar *str2) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, str1, str2); if (ctxt != NULL) { ctxt->wellFormed = 0; ctxt->valid = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlWarnMsg: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @str1: an error string * @str2: an error string * * Handle a parser warning */ static void xmlWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_WARNING, NULL, 0, (const char *) str1, NULL, NULL, 0, 0, msg, str1); } /** * xmlNsErrMsg: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @str1: an error string * @str2: an error string * * Handle a namespace error */ static void xmlNsErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1, const xmlChar *str2) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, str1, str2); } /** * xmlNsWarnMsg: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @str1: an error string * * Handle a namespace warning */ static void xmlNsWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1, const xmlChar *str2) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, XML_ERR_WARNING, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, str1, str2); } /** * xmlSAX2GetPublicId: * @ctx: the user data (XML parser context) * * Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" * * Returns a xmlChar * */ const xmlChar * xmlSAX2GetPublicId(void *ctx ATTRIBUTE_UNUSED) { /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ return(NULL); } /** * xmlSAX2GetSystemId: * @ctx: the user data (XML parser context) * * Provides the system ID, basically URL or filename e.g. * http://www.sgmlsource.com/dtds/memo.dtd * * Returns a xmlChar * */ const xmlChar * xmlSAX2GetSystemId(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if ((ctx == NULL) || (ctxt->input == NULL)) return(NULL); return((const xmlChar *) ctxt->input->filename); } /** * xmlSAX2GetLineNumber: * @ctx: the user data (XML parser context) * * Provide the line number of the current parsing point. * * Returns an int */ int xmlSAX2GetLineNumber(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if ((ctx == NULL) || (ctxt->input == NULL)) return(0); return(ctxt->input->line); } /** * xmlSAX2GetColumnNumber: * @ctx: the user data (XML parser context) * * Provide the column number of the current parsing point. * * Returns an int */ int xmlSAX2GetColumnNumber(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if ((ctx == NULL) || (ctxt->input == NULL)) return(0); return(ctxt->input->col); } /** * xmlSAX2IsStandalone: * @ctx: the user data (XML parser context) * * Is this document tagged standalone ? * * Returns 1 if true */ int xmlSAX2IsStandalone(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if ((ctx == NULL) || (ctxt->myDoc == NULL)) return(0); return(ctxt->myDoc->standalone == 1); } /** * xmlSAX2HasInternalSubset: * @ctx: the user data (XML parser context) * * Does this document has an internal subset * * Returns 1 if true */ int xmlSAX2HasInternalSubset(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return(0); return(ctxt->myDoc->intSubset != NULL); } /** * xmlSAX2HasExternalSubset: * @ctx: the user data (XML parser context) * * Does this document has an external subset * * Returns 1 if true */ int xmlSAX2HasExternalSubset(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return(0); return(ctxt->myDoc->extSubset != NULL); } /** * xmlSAX2InternalSubset: * @ctx: the user data (XML parser context) * @name: the root element name * @ExternalID: the external ID * @SystemID: the SYSTEM ID (e.g. filename or URL) * * Callback on internal subset declaration. */ void xmlSAX2InternalSubset(void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlDtdPtr dtd; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2InternalSubset(%s, %s, %s)\n", name, ExternalID, SystemID); #endif if (ctxt->myDoc == NULL) return; dtd = xmlGetIntSubset(ctxt->myDoc); if (dtd != NULL) { if (ctxt->html) return; xmlUnlinkNode((xmlNodePtr) dtd); xmlFreeDtd(dtd); ctxt->myDoc->intSubset = NULL; } ctxt->myDoc->intSubset = xmlCreateIntSubset(ctxt->myDoc, name, ExternalID, SystemID); if (ctxt->myDoc->intSubset == NULL) xmlSAX2ErrMemory(ctxt, "xmlSAX2InternalSubset"); } /** * xmlSAX2ExternalSubset: * @ctx: the user data (XML parser context) * @name: the root element name * @ExternalID: the external ID * @SystemID: the SYSTEM ID (e.g. filename or URL) * * Callback on external subset declaration. */ void xmlSAX2ExternalSubset(void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2ExternalSubset(%s, %s, %s)\n", name, ExternalID, SystemID); #endif if (((ExternalID != NULL) || (SystemID != NULL)) && (((ctxt->validate) || (ctxt->loadsubset != 0)) && (ctxt->wellFormed && ctxt->myDoc))) { /* * Try to fetch and parse the external subset. */ xmlParserInputPtr oldinput; int oldinputNr; int oldinputMax; xmlParserInputPtr *oldinputTab; xmlParserInputPtr input = NULL; xmlCharEncoding enc; int oldcharset; const xmlChar *oldencoding; /* * Ask the Entity resolver to load the damn thing */ if ((ctxt->sax != NULL) && (ctxt->sax->resolveEntity != NULL)) input = ctxt->sax->resolveEntity(ctxt->userData, ExternalID, SystemID); if (input == NULL) { return; } xmlNewDtd(ctxt->myDoc, name, ExternalID, SystemID); /* * make sure we won't destroy the main document context */ oldinput = ctxt->input; oldinputNr = ctxt->inputNr; oldinputMax = ctxt->inputMax; oldinputTab = ctxt->inputTab; oldcharset = ctxt->charset; oldencoding = ctxt->encoding; ctxt->encoding = NULL; ctxt->inputTab = (xmlParserInputPtr *) xmlMalloc(5 * sizeof(xmlParserInputPtr)); if (ctxt->inputTab == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2ExternalSubset"); ctxt->input = oldinput; ctxt->inputNr = oldinputNr; ctxt->inputMax = oldinputMax; ctxt->inputTab = oldinputTab; ctxt->charset = oldcharset; ctxt->encoding = oldencoding; return; } ctxt->inputNr = 0; ctxt->inputMax = 5; ctxt->input = NULL; xmlPushInput(ctxt, input); /* * On the fly encoding conversion if needed */ if (ctxt->input->length >= 4) { enc = xmlDetectCharEncoding(ctxt->input->cur, 4); xmlSwitchEncoding(ctxt, enc); } if (input->filename == NULL) input->filename = (char *) xmlCanonicPath(SystemID); input->line = 1; input->col = 1; input->base = ctxt->input->cur; input->cur = ctxt->input->cur; input->free = NULL; /* * let's parse that entity knowing it's an external subset. */ xmlParseExternalSubset(ctxt, ExternalID, SystemID); /* * Free up the external entities */ while (ctxt->inputNr > 1) xmlPopInput(ctxt); xmlFreeInputStream(ctxt->input); xmlFree(ctxt->inputTab); /* * Restore the parsing context of the main entity */ ctxt->input = oldinput; ctxt->inputNr = oldinputNr; ctxt->inputMax = oldinputMax; ctxt->inputTab = oldinputTab; ctxt->charset = oldcharset; if ((ctxt->encoding != NULL) && ((ctxt->dict == NULL) || (!xmlDictOwns(ctxt->dict, ctxt->encoding)))) xmlFree((xmlChar *) ctxt->encoding); ctxt->encoding = oldencoding; /* ctxt->wellFormed = oldwellFormed; */ } } /** * xmlSAX2ResolveEntity: * @ctx: the user data (XML parser context) * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * The entity loader, to control the loading of external entities, * the application can either: * - override this xmlSAX2ResolveEntity() callback in the SAX block * - or better use the xmlSetExternalEntityLoader() function to * set up it's own entity resolution routine * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */ xmlParserInputPtr xmlSAX2ResolveEntity(void *ctx, const xmlChar *publicId, const xmlChar *systemId) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlParserInputPtr ret; xmlChar *URI; const char *base = NULL; if (ctx == NULL) return(NULL); if (ctxt->input != NULL) base = ctxt->input->filename; if (base == NULL) base = ctxt->directory; URI = xmlBuildURI(systemId, (const xmlChar *) base); #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2ResolveEntity(%s, %s)\n", publicId, systemId); #endif ret = xmlLoadExternalEntity((const char *) URI, (const char *) publicId, ctxt); if (URI != NULL) xmlFree(URI); return(ret); } /** * xmlSAX2GetEntity: * @ctx: the user data (XML parser context) * @name: The entity name * * Get an entity by name * * Returns the xmlEntityPtr if found. */ xmlEntityPtr xmlSAX2GetEntity(void *ctx, const xmlChar *name) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlEntityPtr ret = NULL; if (ctx == NULL) return(NULL); #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2GetEntity(%s)\n", name); #endif if (ctxt->inSubset == 0) { ret = xmlGetPredefinedEntity(name); if (ret != NULL) return(ret); } if ((ctxt->myDoc != NULL) && (ctxt->myDoc->standalone == 1)) { if (ctxt->inSubset == 2) { ctxt->myDoc->standalone = 0; ret = xmlGetDocEntity(ctxt->myDoc, name); ctxt->myDoc->standalone = 1; } else { ret = xmlGetDocEntity(ctxt->myDoc, name); if (ret == NULL) { ctxt->myDoc->standalone = 0; ret = xmlGetDocEntity(ctxt->myDoc, name); if (ret != NULL) { xmlFatalErrMsg(ctxt, XML_ERR_NOT_STANDALONE, "Entity(%s) document marked standalone but requires external subset\n", name, NULL); } ctxt->myDoc->standalone = 1; } } } else { ret = xmlGetDocEntity(ctxt->myDoc, name); } if ((ret != NULL) && ((ctxt->validate) || (ctxt->replaceEntities)) && (ret->children == NULL) && (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { int val; /* * for validation purposes we really need to fetch and * parse the external entity */ xmlNodePtr children; unsigned long oldnbent = ctxt->nbentities; val = xmlParseCtxtExternalEntity(ctxt, ret->URI, ret->ExternalID, &children); if (val == 0) { xmlAddChildList((xmlNodePtr) ret, children); } else { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, "Failure to process entity %s\n", name, NULL); ctxt->validate = 0; return(NULL); } ret->owner = 1; if (ret->checked == 0) { ret->checked = (ctxt->nbentities - oldnbent + 1) * 2; if ((ret->content != NULL) && (xmlStrchr(ret->content, '<'))) ret->checked |= 1; } } return(ret); } /** * xmlSAX2GetParameterEntity: * @ctx: the user data (XML parser context) * @name: The entity name * * Get a parameter entity by name * * Returns the xmlEntityPtr if found. */ xmlEntityPtr xmlSAX2GetParameterEntity(void *ctx, const xmlChar *name) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlEntityPtr ret; if (ctx == NULL) return(NULL); #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2GetParameterEntity(%s)\n", name); #endif ret = xmlGetParameterEntity(ctxt->myDoc, name); return(ret); } /** * xmlSAX2EntityDecl: * @ctx: the user data (XML parser context) * @name: the entity name * @type: the entity type * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @content: the entity value (without processing). * * An entity definition has been parsed */ void xmlSAX2EntityDecl(void *ctx, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) { xmlEntityPtr ent; xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EntityDecl(%s, %d, %s, %s, %s)\n", name, type, publicId, systemId, content); #endif if (ctxt->inSubset == 1) { ent = xmlAddDocEntity(ctxt->myDoc, name, type, publicId, systemId, content); if ((ent == NULL) && (ctxt->pedantic)) xmlWarnMsg(ctxt, XML_WAR_ENTITY_REDEFINED, "Entity(%s) already defined in the internal subset\n", name); if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { xmlChar *URI; const char *base = NULL; if (ctxt->input != NULL) base = ctxt->input->filename; if (base == NULL) base = ctxt->directory; URI = xmlBuildURI(systemId, (const xmlChar *) base); ent->URI = URI; } } else if (ctxt->inSubset == 2) { ent = xmlAddDtdEntity(ctxt->myDoc, name, type, publicId, systemId, content); if ((ent == NULL) && (ctxt->pedantic) && (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) ctxt->sax->warning(ctxt->userData, "Entity(%s) already defined in the external subset\n", name); if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { xmlChar *URI; const char *base = NULL; if (ctxt->input != NULL) base = ctxt->input->filename; if (base == NULL) base = ctxt->directory; URI = xmlBuildURI(systemId, (const xmlChar *) base); ent->URI = URI; } } else { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, "SAX.xmlSAX2EntityDecl(%s) called while not in subset\n", name, NULL); } } /** * xmlSAX2AttributeDecl: * @ctx: the user data (XML parser context) * @elem: the name of the element * @fullname: the attribute name * @type: the attribute type * @def: the type of default value * @defaultValue: the attribute default value * @tree: the tree of enumerated value set * * An attribute definition has been parsed */ void xmlSAX2AttributeDecl(void *ctx, const xmlChar *elem, const xmlChar *fullname, int type, int def, const xmlChar *defaultValue, xmlEnumerationPtr tree) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlAttributePtr attr; xmlChar *name = NULL, *prefix = NULL; if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2AttributeDecl(%s, %s, %d, %d, %s, ...)\n", elem, fullname, type, def, defaultValue); #endif if ((xmlStrEqual(fullname, BAD_CAST "xml:id")) && (type != XML_ATTRIBUTE_ID)) { /* * Raise the error but keep the validity flag */ int tmp = ctxt->valid; xmlErrValid(ctxt, XML_DTD_XMLID_TYPE, "xml:id : attribute type should be ID\n", NULL, NULL); ctxt->valid = tmp; } /* TODO: optimize name/prefix allocation */ name = xmlSplitQName(ctxt, fullname, &prefix); ctxt->vctxt.valid = 1; if (ctxt->inSubset == 1) attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, elem, name, prefix, (xmlAttributeType) type, (xmlAttributeDefault) def, defaultValue, tree); else if (ctxt->inSubset == 2) attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, elem, name, prefix, (xmlAttributeType) type, (xmlAttributeDefault) def, defaultValue, tree); else { xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, "SAX.xmlSAX2AttributeDecl(%s) called while not in subset\n", name, NULL); xmlFreeEnumeration(tree); return; } #ifdef LIBXML_VALID_ENABLED if (ctxt->vctxt.valid == 0) ctxt->valid = 0; if ((attr != NULL) && (ctxt->validate) && (ctxt->wellFormed) && (ctxt->myDoc->intSubset != NULL)) ctxt->valid &= xmlValidateAttributeDecl(&ctxt->vctxt, ctxt->myDoc, attr); #endif /* LIBXML_VALID_ENABLED */ if (prefix != NULL) xmlFree(prefix); if (name != NULL) xmlFree(name); } /** * xmlSAX2ElementDecl: * @ctx: the user data (XML parser context) * @name: the element name * @type: the element type * @content: the element value tree * * An element definition has been parsed */ void xmlSAX2ElementDecl(void *ctx, const xmlChar * name, int type, xmlElementContentPtr content) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlElementPtr elem = NULL; if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2ElementDecl(%s, %d, ...)\n", name, type); #endif if (ctxt->inSubset == 1) elem = xmlAddElementDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, name, (xmlElementTypeVal) type, content); else if (ctxt->inSubset == 2) elem = xmlAddElementDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, name, (xmlElementTypeVal) type, content); else { xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, "SAX.xmlSAX2ElementDecl(%s) called while not in subset\n", name, NULL); return; } #ifdef LIBXML_VALID_ENABLED if (elem == NULL) ctxt->valid = 0; if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) ctxt->valid &= xmlValidateElementDecl(&ctxt->vctxt, ctxt->myDoc, elem); #endif /* LIBXML_VALID_ENABLED */ } /** * xmlSAX2NotationDecl: * @ctx: the user data (XML parser context) * @name: The name of the notation * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * What to do when a notation declaration has been parsed. */ void xmlSAX2NotationDecl(void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNotationPtr nota = NULL; if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2NotationDecl(%s, %s, %s)\n", name, publicId, systemId); #endif if ((publicId == NULL) && (systemId == NULL)) { xmlFatalErrMsg(ctxt, XML_ERR_NOTATION_PROCESSING, "SAX.xmlSAX2NotationDecl(%s) externalID or PublicID missing\n", name, NULL); return; } else if (ctxt->inSubset == 1) nota = xmlAddNotationDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, name, publicId, systemId); else if (ctxt->inSubset == 2) nota = xmlAddNotationDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, name, publicId, systemId); else { xmlFatalErrMsg(ctxt, XML_ERR_NOTATION_PROCESSING, "SAX.xmlSAX2NotationDecl(%s) called while not in subset\n", name, NULL); return; } #ifdef LIBXML_VALID_ENABLED if (nota == NULL) ctxt->valid = 0; if ((ctxt->validate) && (ctxt->wellFormed) && (ctxt->myDoc->intSubset != NULL)) ctxt->valid &= xmlValidateNotationDecl(&ctxt->vctxt, ctxt->myDoc, nota); #endif /* LIBXML_VALID_ENABLED */ } /** * xmlSAX2UnparsedEntityDecl: * @ctx: the user data (XML parser context) * @name: The name of the entity * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @notationName: the name of the notation * * What to do when an unparsed entity declaration is parsed */ void xmlSAX2UnparsedEntityDecl(void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName) { xmlEntityPtr ent; xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2UnparsedEntityDecl(%s, %s, %s, %s)\n", name, publicId, systemId, notationName); #endif if (ctxt->inSubset == 1) { ent = xmlAddDocEntity(ctxt->myDoc, name, XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, publicId, systemId, notationName); if ((ent == NULL) && (ctxt->pedantic) && (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) ctxt->sax->warning(ctxt->userData, "Entity(%s) already defined in the internal subset\n", name); if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { xmlChar *URI; const char *base = NULL; if (ctxt->input != NULL) base = ctxt->input->filename; if (base == NULL) base = ctxt->directory; URI = xmlBuildURI(systemId, (const xmlChar *) base); ent->URI = URI; } } else if (ctxt->inSubset == 2) { ent = xmlAddDtdEntity(ctxt->myDoc, name, XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, publicId, systemId, notationName); if ((ent == NULL) && (ctxt->pedantic) && (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) ctxt->sax->warning(ctxt->userData, "Entity(%s) already defined in the external subset\n", name); if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { xmlChar *URI; const char *base = NULL; if (ctxt->input != NULL) base = ctxt->input->filename; if (base == NULL) base = ctxt->directory; URI = xmlBuildURI(systemId, (const xmlChar *) base); ent->URI = URI; } } else { xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, "SAX.xmlSAX2UnparsedEntityDecl(%s) called while not in subset\n", name, NULL); } } /** * xmlSAX2SetDocumentLocator: * @ctx: the user data (XML parser context) * @loc: A SAX Locator * * Receive the document locator at startup, actually xmlDefaultSAXLocator * Everything is available on the context, so this is useless in our case. */ void xmlSAX2SetDocumentLocator(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) { /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2SetDocumentLocator()\n"); #endif } /** * xmlSAX2StartDocument: * @ctx: the user data (XML parser context) * * called when the document start being processed. */ void xmlSAX2StartDocument(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlDocPtr doc; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2StartDocument()\n"); #endif if (ctxt->html) { #ifdef LIBXML_HTML_ENABLED if (ctxt->myDoc == NULL) ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); ctxt->myDoc->properties = XML_DOC_HTML; ctxt->myDoc->parseFlags = ctxt->options; if (ctxt->myDoc == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); return; } #else xmlGenericError(xmlGenericErrorContext, "libxml2 built without HTML support\n"); ctxt->errNo = XML_ERR_INTERNAL_ERROR; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; return; #endif } else { doc = ctxt->myDoc = xmlNewDoc(ctxt->version); if (doc != NULL) { doc->properties = 0; if (ctxt->options & XML_PARSE_OLD10) doc->properties |= XML_DOC_OLD10; doc->parseFlags = ctxt->options; if (ctxt->encoding != NULL) doc->encoding = xmlStrdup(ctxt->encoding); else doc->encoding = NULL; doc->standalone = ctxt->standalone; } else { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); return; } if ((ctxt->dictNames) && (doc != NULL)) { doc->dict = ctxt->dict; xmlDictReference(doc->dict); } } if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) && (ctxt->input != NULL) && (ctxt->input->filename != NULL)) { ctxt->myDoc->URL = xmlPathToURI((const xmlChar *)ctxt->input->filename); if (ctxt->myDoc->URL == NULL) xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); } } /** * xmlSAX2EndDocument: * @ctx: the user data (XML parser context) * * called when the document end has been detected. */ void xmlSAX2EndDocument(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndDocument()\n"); #endif if (ctx == NULL) return; #ifdef LIBXML_VALID_ENABLED if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) ctxt->valid &= xmlValidateDocumentFinal(&ctxt->vctxt, ctxt->myDoc); #endif /* LIBXML_VALID_ENABLED */ /* * Grab the encoding if it was added on-the-fly */ if ((ctxt->encoding != NULL) && (ctxt->myDoc != NULL) && (ctxt->myDoc->encoding == NULL)) { ctxt->myDoc->encoding = ctxt->encoding; ctxt->encoding = NULL; } if ((ctxt->inputTab != NULL) && (ctxt->inputNr > 0) && (ctxt->inputTab[0] != NULL) && (ctxt->inputTab[0]->encoding != NULL) && (ctxt->myDoc != NULL) && (ctxt->myDoc->encoding == NULL)) { ctxt->myDoc->encoding = xmlStrdup(ctxt->inputTab[0]->encoding); } if ((ctxt->charset != XML_CHAR_ENCODING_NONE) && (ctxt->myDoc != NULL) && (ctxt->myDoc->charset == XML_CHAR_ENCODING_NONE)) { ctxt->myDoc->charset = ctxt->charset; } } #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) /** * xmlSAX2AttributeInternal: * @ctx: the user data (XML parser context) * @fullname: The attribute name, including namespace prefix * @value: The attribute value * @prefix: the prefix on the element node * * Handle an attribute that has been read by the parser. * The default handling is to convert the attribute into an * DOM subtree and past it in a new xmlAttr element added to * the element. */ static void xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname, const xmlChar *value, const xmlChar *prefix ATTRIBUTE_UNUSED) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlAttrPtr ret; xmlChar *name; xmlChar *ns; xmlChar *nval; xmlNsPtr namespace; if (ctxt->html) { name = xmlStrdup(fullname); ns = NULL; namespace = NULL; } else { /* * Split the full name into a namespace prefix and the tag name */ name = xmlSplitQName(ctxt, fullname, &ns); if ((name != NULL) && (name[0] == 0)) { if (xmlStrEqual(ns, BAD_CAST "xmlns")) { xmlNsErrMsg(ctxt, XML_ERR_NS_DECL_ERROR, "invalid namespace declaration '%s'\n", fullname, NULL); } else { xmlNsWarnMsg(ctxt, XML_WAR_NS_COLUMN, "Avoid attribute ending with ':' like '%s'\n", fullname, NULL); } if (ns != NULL) xmlFree(ns); ns = NULL; xmlFree(name); name = xmlStrdup(fullname); } } if (name == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); if (ns != NULL) xmlFree(ns); return; } #ifdef LIBXML_HTML_ENABLED if ((ctxt->html) && (value == NULL) && (htmlIsBooleanAttr(fullname))) { nval = xmlStrdup(fullname); value = (const xmlChar *) nval; } else #endif { #ifdef LIBXML_VALID_ENABLED /* * Do the last stage of the attribute normalization * Needed for HTML too: * http://www.w3.org/TR/html4/types.html#h-6.2 */ ctxt->vctxt.valid = 1; nval = xmlValidCtxtNormalizeAttributeValue(&ctxt->vctxt, ctxt->myDoc, ctxt->node, fullname, value); if (ctxt->vctxt.valid != 1) { ctxt->valid = 0; } if (nval != NULL) value = nval; #else nval = NULL; #endif /* LIBXML_VALID_ENABLED */ } /* * Check whether it's a namespace definition */ if ((!ctxt->html) && (ns == NULL) && (name[0] == 'x') && (name[1] == 'm') && (name[2] == 'l') && (name[3] == 'n') && (name[4] == 's') && (name[5] == 0)) { xmlNsPtr nsret; xmlChar *val; if (!ctxt->replaceEntities) { ctxt->depth++; val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, 0,0,0); ctxt->depth--; } else { val = (xmlChar *) value; } if (val[0] != 0) { xmlURIPtr uri; uri = xmlParseURI((const char *)val); if (uri == NULL) { if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) ctxt->sax->warning(ctxt->userData, "xmlns: %s not a valid URI\n", val); } else { if (uri->scheme == NULL) { if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) ctxt->sax->warning(ctxt->userData, "xmlns: URI %s is not absolute\n", val); } xmlFreeURI(uri); } } /* a default namespace definition */ nsret = xmlNewNs(ctxt->node, val, NULL); #ifdef LIBXML_VALID_ENABLED /* * Validate also for namespace decls, they are attributes from * an XML-1.0 perspective */ if (nsret != NULL && ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, ctxt->node, prefix, nsret, val); #endif /* LIBXML_VALID_ENABLED */ if (name != NULL) xmlFree(name); if (nval != NULL) xmlFree(nval); if (val != value) xmlFree(val); return; } if ((!ctxt->html) && (ns != NULL) && (ns[0] == 'x') && (ns[1] == 'm') && (ns[2] == 'l') && (ns[3] == 'n') && (ns[4] == 's') && (ns[5] == 0)) { xmlNsPtr nsret; xmlChar *val; if (!ctxt->replaceEntities) { ctxt->depth++; val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, 0,0,0); ctxt->depth--; if (val == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); xmlFree(ns); if (name != NULL) xmlFree(name); return; } } else { val = (xmlChar *) value; } if (val[0] == 0) { xmlNsErrMsg(ctxt, XML_NS_ERR_EMPTY, "Empty namespace name for prefix %s\n", name, NULL); } if ((ctxt->pedantic != 0) && (val[0] != 0)) { xmlURIPtr uri; uri = xmlParseURI((const char *)val); if (uri == NULL) { xmlNsWarnMsg(ctxt, XML_WAR_NS_URI, "xmlns:%s: %s not a valid URI\n", name, value); } else { if (uri->scheme == NULL) { xmlNsWarnMsg(ctxt, XML_WAR_NS_URI_RELATIVE, "xmlns:%s: URI %s is not absolute\n", name, value); } xmlFreeURI(uri); } } /* a standard namespace definition */ nsret = xmlNewNs(ctxt->node, val, name); xmlFree(ns); #ifdef LIBXML_VALID_ENABLED /* * Validate also for namespace decls, they are attributes from * an XML-1.0 perspective */ if (nsret != NULL && ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, ctxt->node, prefix, nsret, value); #endif /* LIBXML_VALID_ENABLED */ if (name != NULL) xmlFree(name); if (nval != NULL) xmlFree(nval); if (val != value) xmlFree(val); return; } if (ns != NULL) { namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, ns); if (namespace == NULL) { xmlNsErrMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, "Namespace prefix %s of attribute %s is not defined\n", ns, name); } else { xmlAttrPtr prop; prop = ctxt->node->properties; while (prop != NULL) { if (prop->ns != NULL) { if ((xmlStrEqual(name, prop->name)) && ((namespace == prop->ns) || (xmlStrEqual(namespace->href, prop->ns->href)))) { xmlNsErrMsg(ctxt, XML_ERR_ATTRIBUTE_REDEFINED, "Attribute %s in %s redefined\n", name, namespace->href); ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; goto error; } } prop = prop->next; } } } else { namespace = NULL; } /* !!!!!! */ ret = xmlNewNsPropEatName(ctxt->node, namespace, name, NULL); if (ret != NULL) { if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { xmlNodePtr tmp; ret->children = xmlStringGetNodeList(ctxt->myDoc, value); tmp = ret->children; while (tmp != NULL) { tmp->parent = (xmlNodePtr) ret; if (tmp->next == NULL) ret->last = tmp; tmp = tmp->next; } } else if (value != NULL) { ret->children = xmlNewDocText(ctxt->myDoc, value); ret->last = ret->children; if (ret->children != NULL) ret->children->parent = (xmlNodePtr) ret; } } #ifdef LIBXML_VALID_ENABLED if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) { /* * If we don't substitute entities, the validation should be * done on a value with replaced entities anyway. */ if (!ctxt->replaceEntities) { xmlChar *val; ctxt->depth++; val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, 0,0,0); ctxt->depth--; if (val == NULL) ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, ctxt->node, ret, value); else { xmlChar *nvalnorm; /* * Do the last stage of the attribute normalization * It need to be done twice ... it's an extra burden related * to the ability to keep xmlSAX2References in attributes */ nvalnorm = xmlValidNormalizeAttributeValue(ctxt->myDoc, ctxt->node, fullname, val); if (nvalnorm != NULL) { xmlFree(val); val = nvalnorm; } ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, ctxt->node, ret, val); xmlFree(val); } } else { ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, ctxt->node, ret, value); } } else #endif /* LIBXML_VALID_ENABLED */ if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) && (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) || ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) { /* * when validating, the ID registration is done at the attribute * validation level. Otherwise we have to do specific handling here. */ if (xmlStrEqual(fullname, BAD_CAST "xml:id")) { /* * Add the xml:id value * * Open issue: normalization of the value. */ if (xmlValidateNCName(value, 1) != 0) { xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, "xml:id : attribute value %s is not an NCName\n", (const char *) value, NULL); } xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) xmlAddRef(&ctxt->vctxt, ctxt->myDoc, value, ret); } error: if (nval != NULL) xmlFree(nval); if (ns != NULL) xmlFree(ns); } /* * xmlCheckDefaultedAttributes: * * Check defaulted attributes from the DTD */ static void xmlCheckDefaultedAttributes(xmlParserCtxtPtr ctxt, const xmlChar *name, const xmlChar *prefix, const xmlChar **atts) { xmlElementPtr elemDecl; const xmlChar *att; int internal = 1; int i; elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->intSubset, name, prefix); if (elemDecl == NULL) { elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset, name, prefix); internal = 0; } process_external_subset: if (elemDecl != NULL) { xmlAttributePtr attr = elemDecl->attributes; /* * Check against defaulted attributes from the external subset * if the document is stamped as standalone */ if ((ctxt->myDoc->standalone == 1) && (ctxt->myDoc->extSubset != NULL) && (ctxt->validate)) { while (attr != NULL) { if ((attr->defaultValue != NULL) && (xmlGetDtdQAttrDesc(ctxt->myDoc->extSubset, attr->elem, attr->name, attr->prefix) == attr) && (xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, attr->elem, attr->name, attr->prefix) == NULL)) { xmlChar *fulln; if (attr->prefix != NULL) { fulln = xmlStrdup(attr->prefix); fulln = xmlStrcat(fulln, BAD_CAST ":"); fulln = xmlStrcat(fulln, attr->name); } else { fulln = xmlStrdup(attr->name); } if (fulln == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); break; } /* * Check that the attribute is not declared in the * serialization */ att = NULL; if (atts != NULL) { i = 0; att = atts[i]; while (att != NULL) { if (xmlStrEqual(att, fulln)) break; i += 2; att = atts[i]; } } if (att == NULL) { xmlErrValid(ctxt, XML_DTD_STANDALONE_DEFAULTED, "standalone: attribute %s on %s defaulted from external subset\n", (const char *)fulln, (const char *)attr->elem); } xmlFree(fulln); } attr = attr->nexth; } } /* * Actually insert defaulted values when needed */ attr = elemDecl->attributes; while (attr != NULL) { /* * Make sure that attributes redefinition occuring in the * internal subset are not overriden by definitions in the * external subset. */ if (attr->defaultValue != NULL) { /* * the element should be instantiated in the tree if: * - this is a namespace prefix * - the user required for completion in the tree * like XSLT * - there isn't already an attribute definition * in the internal subset overriding it. */ if (((attr->prefix != NULL) && (xmlStrEqual(attr->prefix, BAD_CAST "xmlns"))) || ((attr->prefix == NULL) && (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) || (ctxt->loadsubset & XML_COMPLETE_ATTRS)) { xmlAttributePtr tst; tst = xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, attr->elem, attr->name, attr->prefix); if ((tst == attr) || (tst == NULL)) { xmlChar fn[50]; xmlChar *fulln; fulln = xmlBuildQName(attr->name, attr->prefix, fn, 50); if (fulln == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); return; } /* * Check that the attribute is not declared in the * serialization */ att = NULL; if (atts != NULL) { i = 0; att = atts[i]; while (att != NULL) { if (xmlStrEqual(att, fulln)) break; i += 2; att = atts[i]; } } if (att == NULL) { xmlSAX2AttributeInternal(ctxt, fulln, attr->defaultValue, prefix); } if ((fulln != fn) && (fulln != attr->name)) xmlFree(fulln); } } } attr = attr->nexth; } if (internal == 1) { elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset, name, prefix); internal = 0; goto process_external_subset; } } } /** * xmlSAX2StartElement: * @ctx: the user data (XML parser context) * @fullname: The element name, including namespace prefix * @atts: An array of name/value attributes pairs, NULL terminated * * called when an opening tag has been processed. */ void xmlSAX2StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr ret; xmlNodePtr parent; xmlNsPtr ns; xmlChar *name; xmlChar *prefix; const xmlChar *att; const xmlChar *value; int i; if ((ctx == NULL) || (fullname == NULL) || (ctxt->myDoc == NULL)) return; parent = ctxt->node; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2StartElement(%s)\n", fullname); #endif /* * First check on validity: */ if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && ((ctxt->myDoc->intSubset == NULL) || ((ctxt->myDoc->intSubset->notations == NULL) && (ctxt->myDoc->intSubset->elements == NULL) && (ctxt->myDoc->intSubset->attributes == NULL) && (ctxt->myDoc->intSubset->entities == NULL)))) { xmlErrValid(ctxt, XML_ERR_NO_DTD, "Validation failed: no DTD found !", NULL, NULL); ctxt->validate = 0; } /* * Split the full name into a namespace prefix and the tag name */ name = xmlSplitQName(ctxt, fullname, &prefix); /* * Note : the namespace resolution is deferred until the end of the * attributes parsing, since local namespace can be defined as * an attribute at this level. */ ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, name, NULL); if (ret == NULL) { if (prefix != NULL) xmlFree(prefix); xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); return; } if (ctxt->myDoc->children == NULL) { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "Setting %s as root\n", name); #endif xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); } else if (parent == NULL) { parent = ctxt->myDoc->children; } ctxt->nodemem = -1; if (ctxt->linenumbers) { if (ctxt->input != NULL) { if (ctxt->input->line < 65535) ret->line = (short) ctxt->input->line; else ret->line = 65535; } } /* * We are parsing a new node. */ #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "pushing(%s)\n", name); #endif nodePush(ctxt, ret); /* * Link the child element */ if (parent != NULL) { if (parent->type == XML_ELEMENT_NODE) { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "adding child %s to %s\n", name, parent->name); #endif xmlAddChild(parent, ret); } else { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "adding sibling %s to ", name); xmlDebugDumpOneNode(stderr, parent, 0); #endif xmlAddSibling(parent, ret); } } /* * Insert all the defaulted attributes from the DTD especially namespaces */ if ((!ctxt->html) && ((ctxt->myDoc->intSubset != NULL) || (ctxt->myDoc->extSubset != NULL))) { xmlCheckDefaultedAttributes(ctxt, name, prefix, atts); } /* * process all the attributes whose name start with "xmlns" */ if (atts != NULL) { i = 0; att = atts[i++]; value = atts[i++]; if (!ctxt->html) { while ((att != NULL) && (value != NULL)) { if ((att[0] == 'x') && (att[1] == 'm') && (att[2] == 'l') && (att[3] == 'n') && (att[4] == 's')) xmlSAX2AttributeInternal(ctxt, att, value, prefix); att = atts[i++]; value = atts[i++]; } } } /* * Search the namespace, note that since the attributes have been * processed, the local namespaces are available. */ ns = xmlSearchNs(ctxt->myDoc, ret, prefix); if ((ns == NULL) && (parent != NULL)) ns = xmlSearchNs(ctxt->myDoc, parent, prefix); if ((prefix != NULL) && (ns == NULL)) { ns = xmlNewNs(ret, NULL, prefix); xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, "Namespace prefix %s is not defined\n", prefix, NULL); } /* * set the namespace node, making sure that if the default namspace * is unbound on a parent we simply kee it NULL */ if ((ns != NULL) && (ns->href != NULL) && ((ns->href[0] != 0) || (ns->prefix != NULL))) xmlSetNs(ret, ns); /* * process all the other attributes */ if (atts != NULL) { i = 0; att = atts[i++]; value = atts[i++]; if (ctxt->html) { while (att != NULL) { xmlSAX2AttributeInternal(ctxt, att, value, NULL); att = atts[i++]; value = atts[i++]; } } else { while ((att != NULL) && (value != NULL)) { if ((att[0] != 'x') || (att[1] != 'm') || (att[2] != 'l') || (att[3] != 'n') || (att[4] != 's')) xmlSAX2AttributeInternal(ctxt, att, value, NULL); /* * Next ones */ att = atts[i++]; value = atts[i++]; } } } #ifdef LIBXML_VALID_ENABLED /* * If it's the Document root, finish the DTD validation and * check the document root element for validity */ if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { int chk; chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc); if (chk <= 0) ctxt->valid = 0; if (chk < 0) ctxt->wellFormed = 0; ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_1; } #endif /* LIBXML_VALID_ENABLED */ if (prefix != NULL) xmlFree(prefix); } /** * xmlSAX2EndElement: * @ctx: the user data (XML parser context) * @name: The element name * * called when the end of an element has been detected. */ void xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr cur; if (ctx == NULL) return; cur = ctxt->node; #ifdef DEBUG_SAX if (name == NULL) xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(NULL)\n"); else xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(%s)\n", name); #endif /* Capture end position and add node */ if (cur != NULL && ctxt->record_info) { ctxt->nodeInfo->end_pos = ctxt->input->cur - ctxt->input->base; ctxt->nodeInfo->end_line = ctxt->input->line; ctxt->nodeInfo->node = cur; xmlParserAddNodeInfo(ctxt, ctxt->nodeInfo); } ctxt->nodemem = -1; #ifdef LIBXML_VALID_ENABLED if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, cur); #endif /* LIBXML_VALID_ENABLED */ /* * end of parsing of this node. */ #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "popping(%s)\n", cur->name); #endif nodePop(ctxt); } #endif /* LIBXML_SAX1_ENABLED || LIBXML_HTML_ENABLE */ /* * xmlSAX2TextNode: * @ctxt: the parser context * @str: the input string * @len: the string length * * Callback for a text node * * Returns the newly allocated string or NULL if not needed or error */ static xmlNodePtr xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) { xmlNodePtr ret; const xmlChar *intern = NULL; /* * Allocate */ if (ctxt->freeElems != NULL) { ret = ctxt->freeElems; ctxt->freeElems = ret->next; ctxt->freeElemsNr--; } else { ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); } if (ret == NULL) { xmlErrMemory(ctxt, "xmlSAX2Characters"); return(NULL); } memset(ret, 0, sizeof(xmlNode)); /* * intern the formatting blanks found between tags, or the * very short strings */ if (ctxt->dictNames) { xmlChar cur = str[len]; if ((len < (int) (2 * sizeof(void *))) && (ctxt->options & XML_PARSE_COMPACT)) { /* store the string in the node overriding properties and nsDef */ xmlChar *tmp = (xmlChar *) &(ret->properties); memcpy(tmp, str, len); tmp[len] = 0; intern = tmp; } else if ((len <= 3) && ((cur == '"') || (cur == '\'') || ((cur == '<') && (str[len + 1] != '!')))) { intern = xmlDictLookup(ctxt->dict, str, len); } else if (IS_BLANK_CH(*str) && (len < 60) && (cur == '<') && (str[len + 1] != '!')) { int i; for (i = 1;i < len;i++) { if (!IS_BLANK_CH(str[i])) goto skip; } intern = xmlDictLookup(ctxt->dict, str, len); } } skip: ret->type = XML_TEXT_NODE; ret->name = xmlStringText; if (intern == NULL) { ret->content = xmlStrndup(str, len); if (ret->content == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); xmlFree(ret); return(NULL); } } else ret->content = (xmlChar *) intern; if (ctxt->linenumbers) { if (ctxt->input != NULL) { if (ctxt->input->line < 65535) ret->line = (short) ctxt->input->line; else { ret->line = 65535; if (ctxt->options & XML_PARSE_BIG_LINES) ret->psvi = (void *) (long) ctxt->input->line; } } } if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) xmlRegisterNodeDefaultValue(ret); return(ret); } #ifdef LIBXML_VALID_ENABLED /* * xmlSAX2DecodeAttrEntities: * @ctxt: the parser context * @str: the input string * @len: the string length * * Remove the entities from an attribute value * * Returns the newly allocated string or NULL if not needed or error */ static xmlChar * xmlSAX2DecodeAttrEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, const xmlChar *end) { const xmlChar *in; xmlChar *ret; in = str; while (in < end) if (*in++ == '&') goto decode; return(NULL); decode: ctxt->depth++; ret = xmlStringLenDecodeEntities(ctxt, str, end - str, XML_SUBSTITUTE_REF, 0,0,0); ctxt->depth--; return(ret); } #endif /* LIBXML_VALID_ENABLED */ /** * xmlSAX2AttributeNs: * @ctx: the user data (XML parser context) * @localname: the local name of the attribute * @prefix: the attribute namespace prefix if available * @URI: the attribute namespace name if available * @value: Start of the attribute value * @valueend: end of the attribute value * * Handle an attribute that has been read by the parser. * The default handling is to convert the attribute into an * DOM subtree and past it in a new xmlAttr element added to * the element. */ static void xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt, const xmlChar * localname, const xmlChar * prefix, const xmlChar * value, const xmlChar * valueend) { xmlAttrPtr ret; xmlNsPtr namespace = NULL; xmlChar *dup = NULL; /* * Note: if prefix == NULL, the attribute is not in the default namespace */ if (prefix != NULL) namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, prefix); /* * allocate the node */ if (ctxt->freeAttrs != NULL) { ret = ctxt->freeAttrs; ctxt->freeAttrs = ret->next; ctxt->freeAttrsNr--; memset(ret, 0, sizeof(xmlAttr)); ret->type = XML_ATTRIBUTE_NODE; ret->parent = ctxt->node; ret->doc = ctxt->myDoc; ret->ns = namespace; if (ctxt->dictNames) ret->name = localname; else ret->name = xmlStrdup(localname); /* link at the end to preserv order, TODO speed up with a last */ if (ctxt->node->properties == NULL) { ctxt->node->properties = ret; } else { xmlAttrPtr prev = ctxt->node->properties; while (prev->next != NULL) prev = prev->next; prev->next = ret; ret->prev = prev; } if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) xmlRegisterNodeDefaultValue((xmlNodePtr)ret); } else { if (ctxt->dictNames) ret = xmlNewNsPropEatName(ctxt->node, namespace, (xmlChar *) localname, NULL); else ret = xmlNewNsProp(ctxt->node, namespace, localname, NULL); if (ret == NULL) { xmlErrMemory(ctxt, "xmlSAX2AttributeNs"); return; } } if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { xmlNodePtr tmp; /* * We know that if there is an entity reference, then * the string has been dup'ed and terminates with 0 * otherwise with ' or " */ if (*valueend != 0) { tmp = xmlSAX2TextNode(ctxt, value, valueend - value); ret->children = tmp; ret->last = tmp; if (tmp != NULL) { tmp->doc = ret->doc; tmp->parent = (xmlNodePtr) ret; } } else { ret->children = xmlStringLenGetNodeList(ctxt->myDoc, value, valueend - value); tmp = ret->children; while (tmp != NULL) { tmp->doc = ret->doc; tmp->parent = (xmlNodePtr) ret; if (tmp->next == NULL) ret->last = tmp; tmp = tmp->next; } } } else if (value != NULL) { xmlNodePtr tmp; tmp = xmlSAX2TextNode(ctxt, value, valueend - value); ret->children = tmp; ret->last = tmp; if (tmp != NULL) { tmp->doc = ret->doc; tmp->parent = (xmlNodePtr) ret; } } #ifdef LIBXML_VALID_ENABLED if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) { /* * If we don't substitute entities, the validation should be * done on a value with replaced entities anyway. */ if (!ctxt->replaceEntities) { dup = xmlSAX2DecodeAttrEntities(ctxt, value, valueend); if (dup == NULL) { if (*valueend == 0) { ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, ctxt->node, ret, value); } else { /* * That should already be normalized. * cheaper to finally allocate here than duplicate * entry points in the full validation code */ dup = xmlStrndup(value, valueend - value); ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, ctxt->node, ret, dup); } } else { /* * dup now contains a string of the flattened attribute * content with entities substitued. Check if we need to * apply an extra layer of normalization. * It need to be done twice ... it's an extra burden related * to the ability to keep references in attributes */ if (ctxt->attsSpecial != NULL) { xmlChar *nvalnorm; xmlChar fn[50]; xmlChar *fullname; fullname = xmlBuildQName(localname, prefix, fn, 50); if (fullname != NULL) { ctxt->vctxt.valid = 1; nvalnorm = xmlValidCtxtNormalizeAttributeValue( &ctxt->vctxt, ctxt->myDoc, ctxt->node, fullname, dup); if (ctxt->vctxt.valid != 1) ctxt->valid = 0; if ((fullname != fn) && (fullname != localname)) xmlFree(fullname); if (nvalnorm != NULL) { xmlFree(dup); dup = nvalnorm; } } } ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, ctxt->node, ret, dup); } } else { /* * if entities already have been substitued, then * the attribute as passed is already normalized */ dup = xmlStrndup(value, valueend - value); ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, ctxt->node, ret, dup); } } else #endif /* LIBXML_VALID_ENABLED */ if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) && (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) || ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) { /* * when validating, the ID registration is done at the attribute * validation level. Otherwise we have to do specific handling here. */ if ((prefix == ctxt->str_xml) && (localname[0] == 'i') && (localname[1] == 'd') && (localname[2] == 0)) { /* * Add the xml:id value * * Open issue: normalization of the value. */ if (dup == NULL) dup = xmlStrndup(value, valueend - value); #ifdef LIBXML_VALID_ENABLED if (xmlValidateNCName(dup, 1) != 0) { xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, "xml:id : attribute value %s is not an NCName\n", (const char *) dup, NULL); } #endif xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) { /* might be worth duplicate entry points and not copy */ if (dup == NULL) dup = xmlStrndup(value, valueend - value); xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); } else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) { if (dup == NULL) dup = xmlStrndup(value, valueend - value); xmlAddRef(&ctxt->vctxt, ctxt->myDoc, dup, ret); } } if (dup != NULL) xmlFree(dup); } /** * xmlSAX2StartElementNs: * @ctx: the user data (XML parser context) * @localname: the local name of the element * @prefix: the element namespace prefix if available * @URI: the element namespace name if available * @nb_namespaces: number of namespace definitions on that node * @namespaces: pointer to the array of prefix/URI pairs namespace definitions * @nb_attributes: the number of attributes on that node * @nb_defaulted: the number of defaulted attributes. * @attributes: pointer to the array of (localname/prefix/URI/value/end) * attribute values. * * SAX2 callback when an element start has been detected by the parser. * It provides the namespace informations for the element, as well as * the new namespace declarations on the element. */ void xmlSAX2StartElementNs(void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr ret; xmlNodePtr parent; xmlNsPtr last = NULL, ns; const xmlChar *uri, *pref; xmlChar *lname = NULL; int i, j; if (ctx == NULL) return; parent = ctxt->node; /* * First check on validity: */ if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && ((ctxt->myDoc->intSubset == NULL) || ((ctxt->myDoc->intSubset->notations == NULL) && (ctxt->myDoc->intSubset->elements == NULL) && (ctxt->myDoc->intSubset->attributes == NULL) && (ctxt->myDoc->intSubset->entities == NULL)))) { xmlErrValid(ctxt, XML_DTD_NO_DTD, "Validation failed: no DTD found !", NULL, NULL); ctxt->validate = 0; } /* * Take care of the rare case of an undefined namespace prefix */ if ((prefix != NULL) && (URI == NULL)) { if (ctxt->dictNames) { const xmlChar *fullname; fullname = xmlDictQLookup(ctxt->dict, prefix, localname); if (fullname != NULL) localname = fullname; } else { lname = xmlBuildQName(localname, prefix, NULL, 0); } } /* * allocate the node */ if (ctxt->freeElems != NULL) { ret = ctxt->freeElems; ctxt->freeElems = ret->next; ctxt->freeElemsNr--; memset(ret, 0, sizeof(xmlNode)); ret->type = XML_ELEMENT_NODE; if (ctxt->dictNames) ret->name = localname; else { if (lname == NULL) ret->name = xmlStrdup(localname); else ret->name = lname; if (ret->name == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); return; } } if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) xmlRegisterNodeDefaultValue(ret); } else { if (ctxt->dictNames) ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, (xmlChar *) localname, NULL); else if (lname == NULL) ret = xmlNewDocNode(ctxt->myDoc, NULL, localname, NULL); else ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, (xmlChar *) lname, NULL); if (ret == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); return; } } if (ctxt->linenumbers) { if (ctxt->input != NULL) { if (ctxt->input->line < 65535) ret->line = (short) ctxt->input->line; else ret->line = 65535; } } if (parent == NULL) { xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); } /* * Build the namespace list */ for (i = 0,j = 0;j < nb_namespaces;j++) { pref = namespaces[i++]; uri = namespaces[i++]; ns = xmlNewNs(NULL, uri, pref); if (ns != NULL) { if (last == NULL) { ret->nsDef = last = ns; } else { last->next = ns; last = ns; } if ((URI != NULL) && (prefix == pref)) ret->ns = ns; } else { /* * any out of memory error would already have been raised * but we can't be garanteed it's the actual error due to the * API, best is to skip in this case */ continue; } #ifdef LIBXML_VALID_ENABLED if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) { ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, ret, prefix, ns, uri); } #endif /* LIBXML_VALID_ENABLED */ } ctxt->nodemem = -1; /* * We are parsing a new node. */ nodePush(ctxt, ret); /* * Link the child element */ if (parent != NULL) { if (parent->type == XML_ELEMENT_NODE) { xmlAddChild(parent, ret); } else { xmlAddSibling(parent, ret); } } /* * Insert the defaulted attributes from the DTD only if requested: */ if ((nb_defaulted != 0) && ((ctxt->loadsubset & XML_COMPLETE_ATTRS) == 0)) nb_attributes -= nb_defaulted; /* * Search the namespace if it wasn't already found * Note that, if prefix is NULL, this searches for the default Ns */ if ((URI != NULL) && (ret->ns == NULL)) { ret->ns = xmlSearchNs(ctxt->myDoc, parent, prefix); if ((ret->ns == NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) { ret->ns = xmlSearchNs(ctxt->myDoc, ret, prefix); } if (ret->ns == NULL) { ns = xmlNewNs(ret, NULL, prefix); if (ns == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); return; } if (prefix != NULL) xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, "Namespace prefix %s was not found\n", prefix, NULL); else xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, "Namespace default prefix was not found\n", NULL, NULL); } } /* * process all the other attributes */ if (nb_attributes > 0) { for (j = 0,i = 0;i < nb_attributes;i++,j+=5) { /* * Handle the rare case of an undefined atribute prefix */ if ((attributes[j+1] != NULL) && (attributes[j+2] == NULL)) { if (ctxt->dictNames) { const xmlChar *fullname; fullname = xmlDictQLookup(ctxt->dict, attributes[j+1], attributes[j]); if (fullname != NULL) { xmlSAX2AttributeNs(ctxt, fullname, NULL, attributes[j+3], attributes[j+4]); continue; } } else { lname = xmlBuildQName(attributes[j], attributes[j+1], NULL, 0); if (lname != NULL) { xmlSAX2AttributeNs(ctxt, lname, NULL, attributes[j+3], attributes[j+4]); xmlFree(lname); continue; } } } xmlSAX2AttributeNs(ctxt, attributes[j], attributes[j+1], attributes[j+3], attributes[j+4]); } } #ifdef LIBXML_VALID_ENABLED /* * If it's the Document root, finish the DTD validation and * check the document root element for validity */ if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { int chk; chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc); if (chk <= 0) ctxt->valid = 0; if (chk < 0) ctxt->wellFormed = 0; ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_1; } #endif /* LIBXML_VALID_ENABLED */ } /** * xmlSAX2EndElementNs: * @ctx: the user data (XML parser context) * @localname: the local name of the element * @prefix: the element namespace prefix if available * @URI: the element namespace name if available * * SAX2 callback when an element end has been detected by the parser. * It provides the namespace informations for the element. */ void xmlSAX2EndElementNs(void *ctx, const xmlChar * localname ATTRIBUTE_UNUSED, const xmlChar * prefix ATTRIBUTE_UNUSED, const xmlChar * URI ATTRIBUTE_UNUSED) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlParserNodeInfo node_info; xmlNodePtr cur; if (ctx == NULL) return; cur = ctxt->node; /* Capture end position and add node */ if ((ctxt->record_info) && (cur != NULL)) { node_info.end_pos = ctxt->input->cur - ctxt->input->base; node_info.end_line = ctxt->input->line; node_info.node = cur; xmlParserAddNodeInfo(ctxt, &node_info); } ctxt->nodemem = -1; #ifdef LIBXML_VALID_ENABLED if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && ctxt->myDoc->intSubset) ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, cur); #endif /* LIBXML_VALID_ENABLED */ /* * end of parsing of this node. */ nodePop(ctxt); } /** * xmlSAX2Reference: * @ctx: the user data (XML parser context) * @name: The entity name * * called when an entity xmlSAX2Reference is detected. */ void xmlSAX2Reference(void *ctx, const xmlChar *name) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr ret; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2Reference(%s)\n", name); #endif if (name[0] == '#') ret = xmlNewCharRef(ctxt->myDoc, name); else ret = xmlNewReference(ctxt->myDoc, name); #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "add xmlSAX2Reference %s to %s \n", name, ctxt->node->name); #endif if (xmlAddChild(ctxt->node, ret) == NULL) { xmlFreeNode(ret); } } /** * xmlSAX2Characters: * @ctx: the user data (XML parser context) * @ch: a xmlChar string * @len: the number of xmlChar * * receiving some chars from the parser. */ void xmlSAX2Characters(void *ctx, const xmlChar *ch, int len) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr lastChild; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2Characters(%.30s, %d)\n", ch, len); #endif /* * Handle the data if any. If there is no child * add it as content, otherwise if the last child is text, * concatenate it, else create a new node of type text. */ if (ctxt->node == NULL) { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "add chars: ctxt->node == NULL !\n"); #endif return; } lastChild = ctxt->node->last; #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "add chars to %s \n", ctxt->node->name); #endif /* * Here we needed an accelerator mechanism in case of very large * elements. Use an attribute in the structure !!! */ if (lastChild == NULL) { lastChild = xmlSAX2TextNode(ctxt, ch, len); if (lastChild != NULL) { ctxt->node->children = lastChild; ctxt->node->last = lastChild; lastChild->parent = ctxt->node; lastChild->doc = ctxt->node->doc; ctxt->nodelen = len; ctxt->nodemem = len + 1; } else { xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); return; } } else { int coalesceText = (lastChild != NULL) && (lastChild->type == XML_TEXT_NODE) && (lastChild->name == xmlStringText); if ((coalesceText) && (ctxt->nodemem != 0)) { /* * The whole point of maintaining nodelen and nodemem, * xmlTextConcat is too costly, i.e. compute length, * reallocate a new buffer, move data, append ch. Here * We try to minimaze realloc() uses and avoid copying * and recomputing length over and over. */ if (lastChild->content == (xmlChar *)&(lastChild->properties)) { lastChild->content = xmlStrdup(lastChild->content); lastChild->properties = NULL; } else if ((ctxt->nodemem == ctxt->nodelen + 1) && (xmlDictOwns(ctxt->dict, lastChild->content))) { lastChild->content = xmlStrdup(lastChild->content); } if (((size_t)ctxt->nodelen + (size_t)len > XML_MAX_TEXT_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: huge text node"); return; } if ((size_t)ctxt->nodelen > SIZE_T_MAX - (size_t)len || (size_t)ctxt->nodemem + (size_t)len > SIZE_T_MAX / 2) { xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters overflow prevented"); return; } if (ctxt->nodelen + len >= ctxt->nodemem) { xmlChar *newbuf; size_t size; size = ctxt->nodemem + len; size *= 2; newbuf = (xmlChar *) xmlRealloc(lastChild->content,size); if (newbuf == NULL) { xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); return; } ctxt->nodemem = size; lastChild->content = newbuf; } memcpy(&lastChild->content[ctxt->nodelen], ch, len); ctxt->nodelen += len; lastChild->content[ctxt->nodelen] = 0; } else if (coalesceText) { if (xmlTextConcat(lastChild, ch, len)) { xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); } if (ctxt->node->children != NULL) { ctxt->nodelen = xmlStrlen(lastChild->content); ctxt->nodemem = ctxt->nodelen + 1; } } else { /* Mixed content, first time */ lastChild = xmlSAX2TextNode(ctxt, ch, len); if (lastChild != NULL) { xmlAddChild(ctxt->node, lastChild); if (ctxt->node->children != NULL) { ctxt->nodelen = len; ctxt->nodemem = len + 1; } } } } } /** * xmlSAX2IgnorableWhitespace: * @ctx: the user data (XML parser context) * @ch: a xmlChar string * @len: the number of xmlChar * * receiving some ignorable whitespaces from the parser. * UNUSED: by default the DOM building will use xmlSAX2Characters */ void xmlSAX2IgnorableWhitespace(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) { /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2IgnorableWhitespace(%.30s, %d)\n", ch, len); #endif } /** * xmlSAX2ProcessingInstruction: * @ctx: the user data (XML parser context) * @target: the target name * @data: the PI data's * * A processing instruction has been parsed. */ void xmlSAX2ProcessingInstruction(void *ctx, const xmlChar *target, const xmlChar *data) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr ret; xmlNodePtr parent; if (ctx == NULL) return; parent = ctxt->node; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2ProcessingInstruction(%s, %s)\n", target, data); #endif ret = xmlNewDocPI(ctxt->myDoc, target, data); if (ret == NULL) return; if (ctxt->linenumbers) { if (ctxt->input != NULL) { if (ctxt->input->line < 65535) ret->line = (short) ctxt->input->line; else ret->line = 65535; } } if (ctxt->inSubset == 1) { xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); return; } else if (ctxt->inSubset == 2) { xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); return; } if (parent == NULL) { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "Setting PI %s as root\n", target); #endif xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); return; } if (parent->type == XML_ELEMENT_NODE) { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "adding PI %s child to %s\n", target, parent->name); #endif xmlAddChild(parent, ret); } else { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "adding PI %s sibling to ", target); xmlDebugDumpOneNode(stderr, parent, 0); #endif xmlAddSibling(parent, ret); } } /** * xmlSAX2Comment: * @ctx: the user data (XML parser context) * @value: the xmlSAX2Comment content * * A xmlSAX2Comment has been parsed. */ void xmlSAX2Comment(void *ctx, const xmlChar *value) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr ret; xmlNodePtr parent; if (ctx == NULL) return; parent = ctxt->node; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2Comment(%s)\n", value); #endif ret = xmlNewDocComment(ctxt->myDoc, value); if (ret == NULL) return; if (ctxt->linenumbers) { if (ctxt->input != NULL) { if (ctxt->input->line < 65535) ret->line = (short) ctxt->input->line; else ret->line = 65535; } } if (ctxt->inSubset == 1) { xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); return; } else if (ctxt->inSubset == 2) { xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); return; } if (parent == NULL) { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "Setting xmlSAX2Comment as root\n"); #endif xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); return; } if (parent->type == XML_ELEMENT_NODE) { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "adding xmlSAX2Comment child to %s\n", parent->name); #endif xmlAddChild(parent, ret); } else { #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "adding xmlSAX2Comment sibling to "); xmlDebugDumpOneNode(stderr, parent, 0); #endif xmlAddSibling(parent, ret); } } /** * xmlSAX2CDataBlock: * @ctx: the user data (XML parser context) * @value: The pcdata content * @len: the block length * * called when a pcdata block has been parsed */ void xmlSAX2CDataBlock(void *ctx, const xmlChar *value, int len) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlNodePtr ret, lastChild; if (ctx == NULL) return; #ifdef DEBUG_SAX xmlGenericError(xmlGenericErrorContext, "SAX.pcdata(%.10s, %d)\n", value, len); #endif lastChild = xmlGetLastChild(ctxt->node); #ifdef DEBUG_SAX_TREE xmlGenericError(xmlGenericErrorContext, "add chars to %s \n", ctxt->node->name); #endif if ((lastChild != NULL) && (lastChild->type == XML_CDATA_SECTION_NODE)) { xmlTextConcat(lastChild, value, len); } else { ret = xmlNewCDataBlock(ctxt->myDoc, value, len); xmlAddChild(ctxt->node, ret); } } static int xmlSAX2DefaultVersionValue = 2; #ifdef LIBXML_SAX1_ENABLED /** * xmlSAXDefaultVersion: * @version: the version, 1 or 2 * * Set the default version of SAX used globally by the library. * By default, during initialization the default is set to 2. * Note that it is generally a better coding style to use * xmlSAXVersion() to set up the version explicitly for a given * parsing context. * * Returns the previous value in case of success and -1 in case of error. */ int xmlSAXDefaultVersion(int version) { int ret = xmlSAX2DefaultVersionValue; if ((version != 1) && (version != 2)) return(-1); xmlSAX2DefaultVersionValue = version; return(ret); } #endif /* LIBXML_SAX1_ENABLED */ /** * xmlSAXVersion: * @hdlr: the SAX handler * @version: the version, 1 or 2 * * Initialize the default XML SAX handler according to the version * * Returns 0 in case of success and -1 in case of error. */ int xmlSAXVersion(xmlSAXHandler *hdlr, int version) { if (hdlr == NULL) return(-1); if (version == 2) { hdlr->startElement = NULL; hdlr->endElement = NULL; hdlr->startElementNs = xmlSAX2StartElementNs; hdlr->endElementNs = xmlSAX2EndElementNs; hdlr->serror = NULL; hdlr->initialized = XML_SAX2_MAGIC; #ifdef LIBXML_SAX1_ENABLED } else if (version == 1) { hdlr->startElement = xmlSAX2StartElement; hdlr->endElement = xmlSAX2EndElement; hdlr->initialized = 1; #endif /* LIBXML_SAX1_ENABLED */ } else return(-1); hdlr->internalSubset = xmlSAX2InternalSubset; hdlr->externalSubset = xmlSAX2ExternalSubset; hdlr->isStandalone = xmlSAX2IsStandalone; hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; hdlr->resolveEntity = xmlSAX2ResolveEntity; hdlr->getEntity = xmlSAX2GetEntity; hdlr->getParameterEntity = xmlSAX2GetParameterEntity; hdlr->entityDecl = xmlSAX2EntityDecl; hdlr->attributeDecl = xmlSAX2AttributeDecl; hdlr->elementDecl = xmlSAX2ElementDecl; hdlr->notationDecl = xmlSAX2NotationDecl; hdlr->unparsedEntityDecl = xmlSAX2UnparsedEntityDecl; hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; hdlr->startDocument = xmlSAX2StartDocument; hdlr->endDocument = xmlSAX2EndDocument; hdlr->reference = xmlSAX2Reference; hdlr->characters = xmlSAX2Characters; hdlr->cdataBlock = xmlSAX2CDataBlock; hdlr->ignorableWhitespace = xmlSAX2Characters; hdlr->processingInstruction = xmlSAX2ProcessingInstruction; hdlr->comment = xmlSAX2Comment; hdlr->warning = xmlParserWarning; hdlr->error = xmlParserError; hdlr->fatalError = xmlParserError; return(0); } /** * xmlSAX2InitDefaultSAXHandler: * @hdlr: the SAX handler * @warning: flag if non-zero sets the handler warning procedure * * Initialize the default XML SAX2 handler */ void xmlSAX2InitDefaultSAXHandler(xmlSAXHandler *hdlr, int warning) { if ((hdlr == NULL) || (hdlr->initialized != 0)) return; xmlSAXVersion(hdlr, xmlSAX2DefaultVersionValue); if (warning == 0) hdlr->warning = NULL; else hdlr->warning = xmlParserWarning; } /** * xmlDefaultSAXHandlerInit: * * Initialize the default SAX2 handler */ void xmlDefaultSAXHandlerInit(void) { #ifdef LIBXML_SAX1_ENABLED xmlSAXVersion((xmlSAXHandlerPtr) &xmlDefaultSAXHandler, 1); #endif /* LIBXML_SAX1_ENABLED */ } #ifdef LIBXML_HTML_ENABLED /** * xmlSAX2InitHtmlDefaultSAXHandler: * @hdlr: the SAX handler * * Initialize the default HTML SAX2 handler */ void xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr) { if ((hdlr == NULL) || (hdlr->initialized != 0)) return; hdlr->internalSubset = xmlSAX2InternalSubset; hdlr->externalSubset = NULL; hdlr->isStandalone = NULL; hdlr->hasInternalSubset = NULL; hdlr->hasExternalSubset = NULL; hdlr->resolveEntity = NULL; hdlr->getEntity = xmlSAX2GetEntity; hdlr->getParameterEntity = NULL; hdlr->entityDecl = NULL; hdlr->attributeDecl = NULL; hdlr->elementDecl = NULL; hdlr->notationDecl = NULL; hdlr->unparsedEntityDecl = NULL; hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; hdlr->startDocument = xmlSAX2StartDocument; hdlr->endDocument = xmlSAX2EndDocument; hdlr->startElement = xmlSAX2StartElement; hdlr->endElement = xmlSAX2EndElement; hdlr->reference = NULL; hdlr->characters = xmlSAX2Characters; hdlr->cdataBlock = xmlSAX2CDataBlock; hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; hdlr->processingInstruction = xmlSAX2ProcessingInstruction; hdlr->comment = xmlSAX2Comment; hdlr->warning = xmlParserWarning; hdlr->error = xmlParserError; hdlr->fatalError = xmlParserError; hdlr->initialized = 1; } /** * htmlDefaultSAXHandlerInit: * * Initialize the default SAX handler */ void htmlDefaultSAXHandlerInit(void) { xmlSAX2InitHtmlDefaultSAXHandler((xmlSAXHandlerPtr) &htmlDefaultSAXHandler); } #endif /* LIBXML_HTML_ENABLED */ #ifdef LIBXML_DOCB_ENABLED /** * xmlSAX2InitDocbDefaultSAXHandler: * @hdlr: the SAX handler * * Initialize the default DocBook SAX2 handler */ void xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr) { if ((hdlr == NULL) || (hdlr->initialized != 0)) return; hdlr->internalSubset = xmlSAX2InternalSubset; hdlr->externalSubset = NULL; hdlr->isStandalone = xmlSAX2IsStandalone; hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; hdlr->resolveEntity = xmlSAX2ResolveEntity; hdlr->getEntity = xmlSAX2GetEntity; hdlr->getParameterEntity = NULL; hdlr->entityDecl = xmlSAX2EntityDecl; hdlr->attributeDecl = NULL; hdlr->elementDecl = NULL; hdlr->notationDecl = NULL; hdlr->unparsedEntityDecl = NULL; hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; hdlr->startDocument = xmlSAX2StartDocument; hdlr->endDocument = xmlSAX2EndDocument; hdlr->startElement = xmlSAX2StartElement; hdlr->endElement = xmlSAX2EndElement; hdlr->reference = xmlSAX2Reference; hdlr->characters = xmlSAX2Characters; hdlr->cdataBlock = NULL; hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; hdlr->processingInstruction = NULL; hdlr->comment = xmlSAX2Comment; hdlr->warning = xmlParserWarning; hdlr->error = xmlParserError; hdlr->fatalError = xmlParserError; hdlr->initialized = 1; } /** * docbDefaultSAXHandlerInit: * * Initialize the default SAX handler */ void docbDefaultSAXHandlerInit(void) { xmlSAX2InitDocbDefaultSAXHandler((xmlSAXHandlerPtr) &docbDefaultSAXHandler); } #endif /* LIBXML_DOCB_ENABLED */ #define bottom_SAX2 #include "elfgcchack.h" libxml2-2.9.1+dfsg1/xmlregexp.c0000644000175000017500000065545412113312344014750 0ustar aronaron/* * regexp.c: generic and extensible Regular Expression engine * * Basically designed with the purpose of compiling regexps for * the variety of validation/shemas mechanisms now available in * XML related specifications these include: * - XML-1.0 DTD validation * - XML Schemas structure part 1 * - XML Schemas Datatypes part 2 especially Appendix F * - RELAX-NG/TREX i.e. the counter proposal * * See Copyright for the status of this software. * * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_REGEXP_ENABLED /* #define DEBUG_ERR */ #include #include #ifdef HAVE_LIMITS_H #include #endif #include #include #include #include #include #ifndef INT_MAX #define INT_MAX 123456789 /* easy to flag and big enough for our needs */ #endif /* #define DEBUG_REGEXP_GRAPH */ /* #define DEBUG_REGEXP_EXEC */ /* #define DEBUG_PUSH */ /* #define DEBUG_COMPACTION */ #define MAX_PUSH 10000000 #ifdef ERROR #undef ERROR #endif #define ERROR(str) \ ctxt->error = XML_REGEXP_COMPILE_ERROR; \ xmlRegexpErrCompile(ctxt, str); #define NEXT ctxt->cur++ #define CUR (*(ctxt->cur)) #define NXT(index) (ctxt->cur[index]) #define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l) #define NEXTL(l) ctxt->cur += l; #define XML_REG_STRING_SEPARATOR '|' /* * Need PREV to check on a '-' within a Character Group. May only be used * when it's guaranteed that cur is not at the beginning of ctxt->string! */ #define PREV (ctxt->cur[-1]) /** * TODO: * * macro to flag unimplemented blocks */ #define TODO \ xmlGenericError(xmlGenericErrorContext, \ "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); /************************************************************************ * * * Datatypes and structures * * * ************************************************************************/ /* * Note: the order of the enums below is significant, do not shuffle */ typedef enum { XML_REGEXP_EPSILON = 1, XML_REGEXP_CHARVAL, XML_REGEXP_RANGES, XML_REGEXP_SUBREG, /* used for () sub regexps */ XML_REGEXP_STRING, XML_REGEXP_ANYCHAR, /* . */ XML_REGEXP_ANYSPACE, /* \s */ XML_REGEXP_NOTSPACE, /* \S */ XML_REGEXP_INITNAME, /* \l */ XML_REGEXP_NOTINITNAME, /* \L */ XML_REGEXP_NAMECHAR, /* \c */ XML_REGEXP_NOTNAMECHAR, /* \C */ XML_REGEXP_DECIMAL, /* \d */ XML_REGEXP_NOTDECIMAL, /* \D */ XML_REGEXP_REALCHAR, /* \w */ XML_REGEXP_NOTREALCHAR, /* \W */ XML_REGEXP_LETTER = 100, XML_REGEXP_LETTER_UPPERCASE, XML_REGEXP_LETTER_LOWERCASE, XML_REGEXP_LETTER_TITLECASE, XML_REGEXP_LETTER_MODIFIER, XML_REGEXP_LETTER_OTHERS, XML_REGEXP_MARK, XML_REGEXP_MARK_NONSPACING, XML_REGEXP_MARK_SPACECOMBINING, XML_REGEXP_MARK_ENCLOSING, XML_REGEXP_NUMBER, XML_REGEXP_NUMBER_DECIMAL, XML_REGEXP_NUMBER_LETTER, XML_REGEXP_NUMBER_OTHERS, XML_REGEXP_PUNCT, XML_REGEXP_PUNCT_CONNECTOR, XML_REGEXP_PUNCT_DASH, XML_REGEXP_PUNCT_OPEN, XML_REGEXP_PUNCT_CLOSE, XML_REGEXP_PUNCT_INITQUOTE, XML_REGEXP_PUNCT_FINQUOTE, XML_REGEXP_PUNCT_OTHERS, XML_REGEXP_SEPAR, XML_REGEXP_SEPAR_SPACE, XML_REGEXP_SEPAR_LINE, XML_REGEXP_SEPAR_PARA, XML_REGEXP_SYMBOL, XML_REGEXP_SYMBOL_MATH, XML_REGEXP_SYMBOL_CURRENCY, XML_REGEXP_SYMBOL_MODIFIER, XML_REGEXP_SYMBOL_OTHERS, XML_REGEXP_OTHER, XML_REGEXP_OTHER_CONTROL, XML_REGEXP_OTHER_FORMAT, XML_REGEXP_OTHER_PRIVATE, XML_REGEXP_OTHER_NA, XML_REGEXP_BLOCK_NAME } xmlRegAtomType; typedef enum { XML_REGEXP_QUANT_EPSILON = 1, XML_REGEXP_QUANT_ONCE, XML_REGEXP_QUANT_OPT, XML_REGEXP_QUANT_MULT, XML_REGEXP_QUANT_PLUS, XML_REGEXP_QUANT_ONCEONLY, XML_REGEXP_QUANT_ALL, XML_REGEXP_QUANT_RANGE } xmlRegQuantType; typedef enum { XML_REGEXP_START_STATE = 1, XML_REGEXP_FINAL_STATE, XML_REGEXP_TRANS_STATE, XML_REGEXP_SINK_STATE, XML_REGEXP_UNREACH_STATE } xmlRegStateType; typedef enum { XML_REGEXP_MARK_NORMAL = 0, XML_REGEXP_MARK_START, XML_REGEXP_MARK_VISITED } xmlRegMarkedType; typedef struct _xmlRegRange xmlRegRange; typedef xmlRegRange *xmlRegRangePtr; struct _xmlRegRange { int neg; /* 0 normal, 1 not, 2 exclude */ xmlRegAtomType type; int start; int end; xmlChar *blockName; }; typedef struct _xmlRegAtom xmlRegAtom; typedef xmlRegAtom *xmlRegAtomPtr; typedef struct _xmlAutomataState xmlRegState; typedef xmlRegState *xmlRegStatePtr; struct _xmlRegAtom { int no; xmlRegAtomType type; xmlRegQuantType quant; int min; int max; void *valuep; void *valuep2; int neg; int codepoint; xmlRegStatePtr start; xmlRegStatePtr start0; xmlRegStatePtr stop; int maxRanges; int nbRanges; xmlRegRangePtr *ranges; void *data; }; typedef struct _xmlRegCounter xmlRegCounter; typedef xmlRegCounter *xmlRegCounterPtr; struct _xmlRegCounter { int min; int max; }; typedef struct _xmlRegTrans xmlRegTrans; typedef xmlRegTrans *xmlRegTransPtr; struct _xmlRegTrans { xmlRegAtomPtr atom; int to; int counter; int count; int nd; }; struct _xmlAutomataState { xmlRegStateType type; xmlRegMarkedType mark; xmlRegMarkedType markd; xmlRegMarkedType reached; int no; int maxTrans; int nbTrans; xmlRegTrans *trans; /* knowing states ponting to us can speed things up */ int maxTransTo; int nbTransTo; int *transTo; }; typedef struct _xmlAutomata xmlRegParserCtxt; typedef xmlRegParserCtxt *xmlRegParserCtxtPtr; #define AM_AUTOMATA_RNG 1 struct _xmlAutomata { xmlChar *string; xmlChar *cur; int error; int neg; xmlRegStatePtr start; xmlRegStatePtr end; xmlRegStatePtr state; xmlRegAtomPtr atom; int maxAtoms; int nbAtoms; xmlRegAtomPtr *atoms; int maxStates; int nbStates; xmlRegStatePtr *states; int maxCounters; int nbCounters; xmlRegCounter *counters; int determinist; int negs; int flags; }; struct _xmlRegexp { xmlChar *string; int nbStates; xmlRegStatePtr *states; int nbAtoms; xmlRegAtomPtr *atoms; int nbCounters; xmlRegCounter *counters; int determinist; int flags; /* * That's the compact form for determinists automatas */ int nbstates; int *compact; void **transdata; int nbstrings; xmlChar **stringMap; }; typedef struct _xmlRegExecRollback xmlRegExecRollback; typedef xmlRegExecRollback *xmlRegExecRollbackPtr; struct _xmlRegExecRollback { xmlRegStatePtr state;/* the current state */ int index; /* the index in the input stack */ int nextbranch; /* the next transition to explore in that state */ int *counts; /* save the automata state if it has some */ }; typedef struct _xmlRegInputToken xmlRegInputToken; typedef xmlRegInputToken *xmlRegInputTokenPtr; struct _xmlRegInputToken { xmlChar *value; void *data; }; struct _xmlRegExecCtxt { int status; /* execution status != 0 indicate an error */ int determinist; /* did we find an indeterministic behaviour */ xmlRegexpPtr comp; /* the compiled regexp */ xmlRegExecCallbacks callback; void *data; xmlRegStatePtr state;/* the current state */ int transno; /* the current transition on that state */ int transcount; /* the number of chars in char counted transitions */ /* * A stack of rollback states */ int maxRollbacks; int nbRollbacks; xmlRegExecRollback *rollbacks; /* * The state of the automata if any */ int *counts; /* * The input stack */ int inputStackMax; int inputStackNr; int index; int *charStack; const xmlChar *inputString; /* when operating on characters */ xmlRegInputTokenPtr inputStack;/* when operating on strings */ /* * error handling */ int errStateNo; /* the error state number */ xmlRegStatePtr errState; /* the error state */ xmlChar *errString; /* the string raising the error */ int *errCounts; /* counters at the error state */ int nbPush; }; #define REGEXP_ALL_COUNTER 0x123456 #define REGEXP_ALL_LAX_COUNTER 0x123457 static void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top); static void xmlRegFreeState(xmlRegStatePtr state); static void xmlRegFreeAtom(xmlRegAtomPtr atom); static int xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr); static int xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint); static int xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg, int start, int end, const xmlChar *blockName); void xmlAutomataSetFlags(xmlAutomataPtr am, int flags); /************************************************************************ * * * Regexp memory error handler * * * ************************************************************************/ /** * xmlRegexpErrMemory: * @extra: extra information * * Handle an out of memory condition */ static void xmlRegexpErrMemory(xmlRegParserCtxtPtr ctxt, const char *extra) { const char *regexp = NULL; if (ctxt != NULL) { regexp = (const char *) ctxt->string; ctxt->error = XML_ERR_NO_MEMORY; } __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, regexp, NULL, 0, 0, "Memory allocation failed : %s\n", extra); } /** * xmlRegexpErrCompile: * @extra: extra information * * Handle a compilation failure */ static void xmlRegexpErrCompile(xmlRegParserCtxtPtr ctxt, const char *extra) { const char *regexp = NULL; int idx = 0; if (ctxt != NULL) { regexp = (const char *) ctxt->string; idx = ctxt->cur - ctxt->string; ctxt->error = XML_REGEXP_COMPILE_ERROR; } __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, XML_REGEXP_COMPILE_ERROR, XML_ERR_FATAL, NULL, 0, extra, regexp, NULL, idx, 0, "failed to compile: %s\n", extra); } /************************************************************************ * * * Allocation/Deallocation * * * ************************************************************************/ static int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt); /** * xmlRegEpxFromParse: * @ctxt: the parser context used to build it * * Allocate a new regexp and fill it with the result from the parser * * Returns the new regexp or NULL in case of error */ static xmlRegexpPtr xmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) { xmlRegexpPtr ret; ret = (xmlRegexpPtr) xmlMalloc(sizeof(xmlRegexp)); if (ret == NULL) { xmlRegexpErrMemory(ctxt, "compiling regexp"); return(NULL); } memset(ret, 0, sizeof(xmlRegexp)); ret->string = ctxt->string; ret->nbStates = ctxt->nbStates; ret->states = ctxt->states; ret->nbAtoms = ctxt->nbAtoms; ret->atoms = ctxt->atoms; ret->nbCounters = ctxt->nbCounters; ret->counters = ctxt->counters; ret->determinist = ctxt->determinist; ret->flags = ctxt->flags; if (ret->determinist == -1) { xmlRegexpIsDeterminist(ret); } if ((ret->determinist != 0) && (ret->nbCounters == 0) && (ctxt->negs == 0) && (ret->atoms != NULL) && (ret->atoms[0] != NULL) && (ret->atoms[0]->type == XML_REGEXP_STRING)) { int i, j, nbstates = 0, nbatoms = 0; int *stateRemap; int *stringRemap; int *transitions; void **transdata; xmlChar **stringMap; xmlChar *value; /* * Switch to a compact representation * 1/ counting the effective number of states left * 2/ counting the unique number of atoms, and check that * they are all of the string type * 3/ build a table state x atom for the transitions */ stateRemap = xmlMalloc(ret->nbStates * sizeof(int)); if (stateRemap == NULL) { xmlRegexpErrMemory(ctxt, "compiling regexp"); xmlFree(ret); return(NULL); } for (i = 0;i < ret->nbStates;i++) { if (ret->states[i] != NULL) { stateRemap[i] = nbstates; nbstates++; } else { stateRemap[i] = -1; } } #ifdef DEBUG_COMPACTION printf("Final: %d states\n", nbstates); #endif stringMap = xmlMalloc(ret->nbAtoms * sizeof(char *)); if (stringMap == NULL) { xmlRegexpErrMemory(ctxt, "compiling regexp"); xmlFree(stateRemap); xmlFree(ret); return(NULL); } stringRemap = xmlMalloc(ret->nbAtoms * sizeof(int)); if (stringRemap == NULL) { xmlRegexpErrMemory(ctxt, "compiling regexp"); xmlFree(stringMap); xmlFree(stateRemap); xmlFree(ret); return(NULL); } for (i = 0;i < ret->nbAtoms;i++) { if ((ret->atoms[i]->type == XML_REGEXP_STRING) && (ret->atoms[i]->quant == XML_REGEXP_QUANT_ONCE)) { value = ret->atoms[i]->valuep; for (j = 0;j < nbatoms;j++) { if (xmlStrEqual(stringMap[j], value)) { stringRemap[i] = j; break; } } if (j >= nbatoms) { stringRemap[i] = nbatoms; stringMap[nbatoms] = xmlStrdup(value); if (stringMap[nbatoms] == NULL) { for (i = 0;i < nbatoms;i++) xmlFree(stringMap[i]); xmlFree(stringRemap); xmlFree(stringMap); xmlFree(stateRemap); xmlFree(ret); return(NULL); } nbatoms++; } } else { xmlFree(stateRemap); xmlFree(stringRemap); for (i = 0;i < nbatoms;i++) xmlFree(stringMap[i]); xmlFree(stringMap); xmlFree(ret); return(NULL); } } #ifdef DEBUG_COMPACTION printf("Final: %d atoms\n", nbatoms); #endif transitions = (int *) xmlMalloc((nbstates + 1) * (nbatoms + 1) * sizeof(int)); if (transitions == NULL) { xmlFree(stateRemap); xmlFree(stringRemap); xmlFree(stringMap); xmlFree(ret); return(NULL); } memset(transitions, 0, (nbstates + 1) * (nbatoms + 1) * sizeof(int)); /* * Allocate the transition table. The first entry for each * state corresponds to the state type. */ transdata = NULL; for (i = 0;i < ret->nbStates;i++) { int stateno, atomno, targetno, prev; xmlRegStatePtr state; xmlRegTransPtr trans; stateno = stateRemap[i]; if (stateno == -1) continue; state = ret->states[i]; transitions[stateno * (nbatoms + 1)] = state->type; for (j = 0;j < state->nbTrans;j++) { trans = &(state->trans[j]); if ((trans->to == -1) || (trans->atom == NULL)) continue; atomno = stringRemap[trans->atom->no]; if ((trans->atom->data != NULL) && (transdata == NULL)) { transdata = (void **) xmlMalloc(nbstates * nbatoms * sizeof(void *)); if (transdata != NULL) memset(transdata, 0, nbstates * nbatoms * sizeof(void *)); else { xmlRegexpErrMemory(ctxt, "compiling regexp"); break; } } targetno = stateRemap[trans->to]; /* * if the same atom can generate transitions to 2 different * states then it means the automata is not determinist and * the compact form can't be used ! */ prev = transitions[stateno * (nbatoms + 1) + atomno + 1]; if (prev != 0) { if (prev != targetno + 1) { ret->determinist = 0; #ifdef DEBUG_COMPACTION printf("Indet: state %d trans %d, atom %d to %d : %d to %d\n", i, j, trans->atom->no, trans->to, atomno, targetno); printf(" previous to is %d\n", prev); #endif if (transdata != NULL) xmlFree(transdata); xmlFree(transitions); xmlFree(stateRemap); xmlFree(stringRemap); for (i = 0;i < nbatoms;i++) xmlFree(stringMap[i]); xmlFree(stringMap); goto not_determ; } } else { #if 0 printf("State %d trans %d: atom %d to %d : %d to %d\n", i, j, trans->atom->no, trans->to, atomno, targetno); #endif transitions[stateno * (nbatoms + 1) + atomno + 1] = targetno + 1; /* to avoid 0 */ if (transdata != NULL) transdata[stateno * nbatoms + atomno] = trans->atom->data; } } } ret->determinist = 1; #ifdef DEBUG_COMPACTION /* * Debug */ for (i = 0;i < nbstates;i++) { for (j = 0;j < nbatoms + 1;j++) { printf("%02d ", transitions[i * (nbatoms + 1) + j]); } printf("\n"); } printf("\n"); #endif /* * Cleanup of the old data */ if (ret->states != NULL) { for (i = 0;i < ret->nbStates;i++) xmlRegFreeState(ret->states[i]); xmlFree(ret->states); } ret->states = NULL; ret->nbStates = 0; if (ret->atoms != NULL) { for (i = 0;i < ret->nbAtoms;i++) xmlRegFreeAtom(ret->atoms[i]); xmlFree(ret->atoms); } ret->atoms = NULL; ret->nbAtoms = 0; ret->compact = transitions; ret->transdata = transdata; ret->stringMap = stringMap; ret->nbstrings = nbatoms; ret->nbstates = nbstates; xmlFree(stateRemap); xmlFree(stringRemap); } not_determ: ctxt->string = NULL; ctxt->nbStates = 0; ctxt->states = NULL; ctxt->nbAtoms = 0; ctxt->atoms = NULL; ctxt->nbCounters = 0; ctxt->counters = NULL; return(ret); } /** * xmlRegNewParserCtxt: * @string: the string to parse * * Allocate a new regexp parser context * * Returns the new context or NULL in case of error */ static xmlRegParserCtxtPtr xmlRegNewParserCtxt(const xmlChar *string) { xmlRegParserCtxtPtr ret; ret = (xmlRegParserCtxtPtr) xmlMalloc(sizeof(xmlRegParserCtxt)); if (ret == NULL) return(NULL); memset(ret, 0, sizeof(xmlRegParserCtxt)); if (string != NULL) ret->string = xmlStrdup(string); ret->cur = ret->string; ret->neg = 0; ret->negs = 0; ret->error = 0; ret->determinist = -1; return(ret); } /** * xmlRegNewRange: * @ctxt: the regexp parser context * @neg: is that negative * @type: the type of range * @start: the start codepoint * @end: the end codepoint * * Allocate a new regexp range * * Returns the new range or NULL in case of error */ static xmlRegRangePtr xmlRegNewRange(xmlRegParserCtxtPtr ctxt, int neg, xmlRegAtomType type, int start, int end) { xmlRegRangePtr ret; ret = (xmlRegRangePtr) xmlMalloc(sizeof(xmlRegRange)); if (ret == NULL) { xmlRegexpErrMemory(ctxt, "allocating range"); return(NULL); } ret->neg = neg; ret->type = type; ret->start = start; ret->end = end; return(ret); } /** * xmlRegFreeRange: * @range: the regexp range * * Free a regexp range */ static void xmlRegFreeRange(xmlRegRangePtr range) { if (range == NULL) return; if (range->blockName != NULL) xmlFree(range->blockName); xmlFree(range); } /** * xmlRegCopyRange: * @range: the regexp range * * Copy a regexp range * * Returns the new copy or NULL in case of error. */ static xmlRegRangePtr xmlRegCopyRange(xmlRegParserCtxtPtr ctxt, xmlRegRangePtr range) { xmlRegRangePtr ret; if (range == NULL) return(NULL); ret = xmlRegNewRange(ctxt, range->neg, range->type, range->start, range->end); if (ret == NULL) return(NULL); if (range->blockName != NULL) { ret->blockName = xmlStrdup(range->blockName); if (ret->blockName == NULL) { xmlRegexpErrMemory(ctxt, "allocating range"); xmlRegFreeRange(ret); return(NULL); } } return(ret); } /** * xmlRegNewAtom: * @ctxt: the regexp parser context * @type: the type of atom * * Allocate a new atom * * Returns the new atom or NULL in case of error */ static xmlRegAtomPtr xmlRegNewAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomType type) { xmlRegAtomPtr ret; ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); if (ret == NULL) { xmlRegexpErrMemory(ctxt, "allocating atom"); return(NULL); } memset(ret, 0, sizeof(xmlRegAtom)); ret->type = type; ret->quant = XML_REGEXP_QUANT_ONCE; ret->min = 0; ret->max = 0; return(ret); } /** * xmlRegFreeAtom: * @atom: the regexp atom * * Free a regexp atom */ static void xmlRegFreeAtom(xmlRegAtomPtr atom) { int i; if (atom == NULL) return; for (i = 0;i < atom->nbRanges;i++) xmlRegFreeRange(atom->ranges[i]); if (atom->ranges != NULL) xmlFree(atom->ranges); if ((atom->type == XML_REGEXP_STRING) && (atom->valuep != NULL)) xmlFree(atom->valuep); if ((atom->type == XML_REGEXP_STRING) && (atom->valuep2 != NULL)) xmlFree(atom->valuep2); if ((atom->type == XML_REGEXP_BLOCK_NAME) && (atom->valuep != NULL)) xmlFree(atom->valuep); xmlFree(atom); } /** * xmlRegCopyAtom: * @ctxt: the regexp parser context * @atom: the oiginal atom * * Allocate a new regexp range * * Returns the new atom or NULL in case of error */ static xmlRegAtomPtr xmlRegCopyAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { xmlRegAtomPtr ret; ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); if (ret == NULL) { xmlRegexpErrMemory(ctxt, "copying atom"); return(NULL); } memset(ret, 0, sizeof(xmlRegAtom)); ret->type = atom->type; ret->quant = atom->quant; ret->min = atom->min; ret->max = atom->max; if (atom->nbRanges > 0) { int i; ret->ranges = (xmlRegRangePtr *) xmlMalloc(sizeof(xmlRegRangePtr) * atom->nbRanges); if (ret->ranges == NULL) { xmlRegexpErrMemory(ctxt, "copying atom"); goto error; } for (i = 0;i < atom->nbRanges;i++) { ret->ranges[i] = xmlRegCopyRange(ctxt, atom->ranges[i]); if (ret->ranges[i] == NULL) goto error; ret->nbRanges = i + 1; } } return(ret); error: xmlRegFreeAtom(ret); return(NULL); } static xmlRegStatePtr xmlRegNewState(xmlRegParserCtxtPtr ctxt) { xmlRegStatePtr ret; ret = (xmlRegStatePtr) xmlMalloc(sizeof(xmlRegState)); if (ret == NULL) { xmlRegexpErrMemory(ctxt, "allocating state"); return(NULL); } memset(ret, 0, sizeof(xmlRegState)); ret->type = XML_REGEXP_TRANS_STATE; ret->mark = XML_REGEXP_MARK_NORMAL; return(ret); } /** * xmlRegFreeState: * @state: the regexp state * * Free a regexp state */ static void xmlRegFreeState(xmlRegStatePtr state) { if (state == NULL) return; if (state->trans != NULL) xmlFree(state->trans); if (state->transTo != NULL) xmlFree(state->transTo); xmlFree(state); } /** * xmlRegFreeParserCtxt: * @ctxt: the regexp parser context * * Free a regexp parser context */ static void xmlRegFreeParserCtxt(xmlRegParserCtxtPtr ctxt) { int i; if (ctxt == NULL) return; if (ctxt->string != NULL) xmlFree(ctxt->string); if (ctxt->states != NULL) { for (i = 0;i < ctxt->nbStates;i++) xmlRegFreeState(ctxt->states[i]); xmlFree(ctxt->states); } if (ctxt->atoms != NULL) { for (i = 0;i < ctxt->nbAtoms;i++) xmlRegFreeAtom(ctxt->atoms[i]); xmlFree(ctxt->atoms); } if (ctxt->counters != NULL) xmlFree(ctxt->counters); xmlFree(ctxt); } /************************************************************************ * * * Display of Data structures * * * ************************************************************************/ static void xmlRegPrintAtomType(FILE *output, xmlRegAtomType type) { switch (type) { case XML_REGEXP_EPSILON: fprintf(output, "epsilon "); break; case XML_REGEXP_CHARVAL: fprintf(output, "charval "); break; case XML_REGEXP_RANGES: fprintf(output, "ranges "); break; case XML_REGEXP_SUBREG: fprintf(output, "subexpr "); break; case XML_REGEXP_STRING: fprintf(output, "string "); break; case XML_REGEXP_ANYCHAR: fprintf(output, "anychar "); break; case XML_REGEXP_ANYSPACE: fprintf(output, "anyspace "); break; case XML_REGEXP_NOTSPACE: fprintf(output, "notspace "); break; case XML_REGEXP_INITNAME: fprintf(output, "initname "); break; case XML_REGEXP_NOTINITNAME: fprintf(output, "notinitname "); break; case XML_REGEXP_NAMECHAR: fprintf(output, "namechar "); break; case XML_REGEXP_NOTNAMECHAR: fprintf(output, "notnamechar "); break; case XML_REGEXP_DECIMAL: fprintf(output, "decimal "); break; case XML_REGEXP_NOTDECIMAL: fprintf(output, "notdecimal "); break; case XML_REGEXP_REALCHAR: fprintf(output, "realchar "); break; case XML_REGEXP_NOTREALCHAR: fprintf(output, "notrealchar "); break; case XML_REGEXP_LETTER: fprintf(output, "LETTER "); break; case XML_REGEXP_LETTER_UPPERCASE: fprintf(output, "LETTER_UPPERCASE "); break; case XML_REGEXP_LETTER_LOWERCASE: fprintf(output, "LETTER_LOWERCASE "); break; case XML_REGEXP_LETTER_TITLECASE: fprintf(output, "LETTER_TITLECASE "); break; case XML_REGEXP_LETTER_MODIFIER: fprintf(output, "LETTER_MODIFIER "); break; case XML_REGEXP_LETTER_OTHERS: fprintf(output, "LETTER_OTHERS "); break; case XML_REGEXP_MARK: fprintf(output, "MARK "); break; case XML_REGEXP_MARK_NONSPACING: fprintf(output, "MARK_NONSPACING "); break; case XML_REGEXP_MARK_SPACECOMBINING: fprintf(output, "MARK_SPACECOMBINING "); break; case XML_REGEXP_MARK_ENCLOSING: fprintf(output, "MARK_ENCLOSING "); break; case XML_REGEXP_NUMBER: fprintf(output, "NUMBER "); break; case XML_REGEXP_NUMBER_DECIMAL: fprintf(output, "NUMBER_DECIMAL "); break; case XML_REGEXP_NUMBER_LETTER: fprintf(output, "NUMBER_LETTER "); break; case XML_REGEXP_NUMBER_OTHERS: fprintf(output, "NUMBER_OTHERS "); break; case XML_REGEXP_PUNCT: fprintf(output, "PUNCT "); break; case XML_REGEXP_PUNCT_CONNECTOR: fprintf(output, "PUNCT_CONNECTOR "); break; case XML_REGEXP_PUNCT_DASH: fprintf(output, "PUNCT_DASH "); break; case XML_REGEXP_PUNCT_OPEN: fprintf(output, "PUNCT_OPEN "); break; case XML_REGEXP_PUNCT_CLOSE: fprintf(output, "PUNCT_CLOSE "); break; case XML_REGEXP_PUNCT_INITQUOTE: fprintf(output, "PUNCT_INITQUOTE "); break; case XML_REGEXP_PUNCT_FINQUOTE: fprintf(output, "PUNCT_FINQUOTE "); break; case XML_REGEXP_PUNCT_OTHERS: fprintf(output, "PUNCT_OTHERS "); break; case XML_REGEXP_SEPAR: fprintf(output, "SEPAR "); break; case XML_REGEXP_SEPAR_SPACE: fprintf(output, "SEPAR_SPACE "); break; case XML_REGEXP_SEPAR_LINE: fprintf(output, "SEPAR_LINE "); break; case XML_REGEXP_SEPAR_PARA: fprintf(output, "SEPAR_PARA "); break; case XML_REGEXP_SYMBOL: fprintf(output, "SYMBOL "); break; case XML_REGEXP_SYMBOL_MATH: fprintf(output, "SYMBOL_MATH "); break; case XML_REGEXP_SYMBOL_CURRENCY: fprintf(output, "SYMBOL_CURRENCY "); break; case XML_REGEXP_SYMBOL_MODIFIER: fprintf(output, "SYMBOL_MODIFIER "); break; case XML_REGEXP_SYMBOL_OTHERS: fprintf(output, "SYMBOL_OTHERS "); break; case XML_REGEXP_OTHER: fprintf(output, "OTHER "); break; case XML_REGEXP_OTHER_CONTROL: fprintf(output, "OTHER_CONTROL "); break; case XML_REGEXP_OTHER_FORMAT: fprintf(output, "OTHER_FORMAT "); break; case XML_REGEXP_OTHER_PRIVATE: fprintf(output, "OTHER_PRIVATE "); break; case XML_REGEXP_OTHER_NA: fprintf(output, "OTHER_NA "); break; case XML_REGEXP_BLOCK_NAME: fprintf(output, "BLOCK "); break; } } static void xmlRegPrintQuantType(FILE *output, xmlRegQuantType type) { switch (type) { case XML_REGEXP_QUANT_EPSILON: fprintf(output, "epsilon "); break; case XML_REGEXP_QUANT_ONCE: fprintf(output, "once "); break; case XML_REGEXP_QUANT_OPT: fprintf(output, "? "); break; case XML_REGEXP_QUANT_MULT: fprintf(output, "* "); break; case XML_REGEXP_QUANT_PLUS: fprintf(output, "+ "); break; case XML_REGEXP_QUANT_RANGE: fprintf(output, "range "); break; case XML_REGEXP_QUANT_ONCEONLY: fprintf(output, "onceonly "); break; case XML_REGEXP_QUANT_ALL: fprintf(output, "all "); break; } } static void xmlRegPrintRange(FILE *output, xmlRegRangePtr range) { fprintf(output, " range: "); if (range->neg) fprintf(output, "negative "); xmlRegPrintAtomType(output, range->type); fprintf(output, "%c - %c\n", range->start, range->end); } static void xmlRegPrintAtom(FILE *output, xmlRegAtomPtr atom) { fprintf(output, " atom: "); if (atom == NULL) { fprintf(output, "NULL\n"); return; } if (atom->neg) fprintf(output, "not "); xmlRegPrintAtomType(output, atom->type); xmlRegPrintQuantType(output, atom->quant); if (atom->quant == XML_REGEXP_QUANT_RANGE) fprintf(output, "%d-%d ", atom->min, atom->max); if (atom->type == XML_REGEXP_STRING) fprintf(output, "'%s' ", (char *) atom->valuep); if (atom->type == XML_REGEXP_CHARVAL) fprintf(output, "char %c\n", atom->codepoint); else if (atom->type == XML_REGEXP_RANGES) { int i; fprintf(output, "%d entries\n", atom->nbRanges); for (i = 0; i < atom->nbRanges;i++) xmlRegPrintRange(output, atom->ranges[i]); } else if (atom->type == XML_REGEXP_SUBREG) { fprintf(output, "start %d end %d\n", atom->start->no, atom->stop->no); } else { fprintf(output, "\n"); } } static void xmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) { fprintf(output, " trans: "); if (trans == NULL) { fprintf(output, "NULL\n"); return; } if (trans->to < 0) { fprintf(output, "removed\n"); return; } if (trans->nd != 0) { if (trans->nd == 2) fprintf(output, "last not determinist, "); else fprintf(output, "not determinist, "); } if (trans->counter >= 0) { fprintf(output, "counted %d, ", trans->counter); } if (trans->count == REGEXP_ALL_COUNTER) { fprintf(output, "all transition, "); } else if (trans->count >= 0) { fprintf(output, "count based %d, ", trans->count); } if (trans->atom == NULL) { fprintf(output, "epsilon to %d\n", trans->to); return; } if (trans->atom->type == XML_REGEXP_CHARVAL) fprintf(output, "char %c ", trans->atom->codepoint); fprintf(output, "atom %d, to %d\n", trans->atom->no, trans->to); } static void xmlRegPrintState(FILE *output, xmlRegStatePtr state) { int i; fprintf(output, " state: "); if (state == NULL) { fprintf(output, "NULL\n"); return; } if (state->type == XML_REGEXP_START_STATE) fprintf(output, "START "); if (state->type == XML_REGEXP_FINAL_STATE) fprintf(output, "FINAL "); fprintf(output, "%d, %d transitions:\n", state->no, state->nbTrans); for (i = 0;i < state->nbTrans; i++) { xmlRegPrintTrans(output, &(state->trans[i])); } } #ifdef DEBUG_REGEXP_GRAPH static void xmlRegPrintCtxt(FILE *output, xmlRegParserCtxtPtr ctxt) { int i; fprintf(output, " ctxt: "); if (ctxt == NULL) { fprintf(output, "NULL\n"); return; } fprintf(output, "'%s' ", ctxt->string); if (ctxt->error) fprintf(output, "error "); if (ctxt->neg) fprintf(output, "neg "); fprintf(output, "\n"); fprintf(output, "%d atoms:\n", ctxt->nbAtoms); for (i = 0;i < ctxt->nbAtoms; i++) { fprintf(output, " %02d ", i); xmlRegPrintAtom(output, ctxt->atoms[i]); } if (ctxt->atom != NULL) { fprintf(output, "current atom:\n"); xmlRegPrintAtom(output, ctxt->atom); } fprintf(output, "%d states:", ctxt->nbStates); if (ctxt->start != NULL) fprintf(output, " start: %d", ctxt->start->no); if (ctxt->end != NULL) fprintf(output, " end: %d", ctxt->end->no); fprintf(output, "\n"); for (i = 0;i < ctxt->nbStates; i++) { xmlRegPrintState(output, ctxt->states[i]); } fprintf(output, "%d counters:\n", ctxt->nbCounters); for (i = 0;i < ctxt->nbCounters; i++) { fprintf(output, " %d: min %d max %d\n", i, ctxt->counters[i].min, ctxt->counters[i].max); } } #endif /************************************************************************ * * * Finite Automata structures manipulations * * * ************************************************************************/ static void xmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom, int neg, xmlRegAtomType type, int start, int end, xmlChar *blockName) { xmlRegRangePtr range; if (atom == NULL) { ERROR("add range: atom is NULL"); return; } if (atom->type != XML_REGEXP_RANGES) { ERROR("add range: atom is not ranges"); return; } if (atom->maxRanges == 0) { atom->maxRanges = 4; atom->ranges = (xmlRegRangePtr *) xmlMalloc(atom->maxRanges * sizeof(xmlRegRangePtr)); if (atom->ranges == NULL) { xmlRegexpErrMemory(ctxt, "adding ranges"); atom->maxRanges = 0; return; } } else if (atom->nbRanges >= atom->maxRanges) { xmlRegRangePtr *tmp; atom->maxRanges *= 2; tmp = (xmlRegRangePtr *) xmlRealloc(atom->ranges, atom->maxRanges * sizeof(xmlRegRangePtr)); if (tmp == NULL) { xmlRegexpErrMemory(ctxt, "adding ranges"); atom->maxRanges /= 2; return; } atom->ranges = tmp; } range = xmlRegNewRange(ctxt, neg, type, start, end); if (range == NULL) return; range->blockName = blockName; atom->ranges[atom->nbRanges++] = range; } static int xmlRegGetCounter(xmlRegParserCtxtPtr ctxt) { if (ctxt->maxCounters == 0) { ctxt->maxCounters = 4; ctxt->counters = (xmlRegCounter *) xmlMalloc(ctxt->maxCounters * sizeof(xmlRegCounter)); if (ctxt->counters == NULL) { xmlRegexpErrMemory(ctxt, "allocating counter"); ctxt->maxCounters = 0; return(-1); } } else if (ctxt->nbCounters >= ctxt->maxCounters) { xmlRegCounter *tmp; ctxt->maxCounters *= 2; tmp = (xmlRegCounter *) xmlRealloc(ctxt->counters, ctxt->maxCounters * sizeof(xmlRegCounter)); if (tmp == NULL) { xmlRegexpErrMemory(ctxt, "allocating counter"); ctxt->maxCounters /= 2; return(-1); } ctxt->counters = tmp; } ctxt->counters[ctxt->nbCounters].min = -1; ctxt->counters[ctxt->nbCounters].max = -1; return(ctxt->nbCounters++); } static int xmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { if (atom == NULL) { ERROR("atom push: atom is NULL"); return(-1); } if (ctxt->maxAtoms == 0) { ctxt->maxAtoms = 4; ctxt->atoms = (xmlRegAtomPtr *) xmlMalloc(ctxt->maxAtoms * sizeof(xmlRegAtomPtr)); if (ctxt->atoms == NULL) { xmlRegexpErrMemory(ctxt, "pushing atom"); ctxt->maxAtoms = 0; return(-1); } } else if (ctxt->nbAtoms >= ctxt->maxAtoms) { xmlRegAtomPtr *tmp; ctxt->maxAtoms *= 2; tmp = (xmlRegAtomPtr *) xmlRealloc(ctxt->atoms, ctxt->maxAtoms * sizeof(xmlRegAtomPtr)); if (tmp == NULL) { xmlRegexpErrMemory(ctxt, "allocating counter"); ctxt->maxAtoms /= 2; return(-1); } ctxt->atoms = tmp; } atom->no = ctxt->nbAtoms; ctxt->atoms[ctxt->nbAtoms++] = atom; return(0); } static void xmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target, int from) { if (target->maxTransTo == 0) { target->maxTransTo = 8; target->transTo = (int *) xmlMalloc(target->maxTransTo * sizeof(int)); if (target->transTo == NULL) { xmlRegexpErrMemory(ctxt, "adding transition"); target->maxTransTo = 0; return; } } else if (target->nbTransTo >= target->maxTransTo) { int *tmp; target->maxTransTo *= 2; tmp = (int *) xmlRealloc(target->transTo, target->maxTransTo * sizeof(int)); if (tmp == NULL) { xmlRegexpErrMemory(ctxt, "adding transition"); target->maxTransTo /= 2; return; } target->transTo = tmp; } target->transTo[target->nbTransTo] = from; target->nbTransTo++; } static void xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, xmlRegAtomPtr atom, xmlRegStatePtr target, int counter, int count) { int nrtrans; if (state == NULL) { ERROR("add state: state is NULL"); return; } if (target == NULL) { ERROR("add state: target is NULL"); return; } /* * Other routines follow the philosophy 'When in doubt, add a transition' * so we check here whether such a transition is already present and, if * so, silently ignore this request. */ for (nrtrans = state->nbTrans - 1; nrtrans >= 0; nrtrans--) { xmlRegTransPtr trans = &(state->trans[nrtrans]); if ((trans->atom == atom) && (trans->to == target->no) && (trans->counter == counter) && (trans->count == count)) { #ifdef DEBUG_REGEXP_GRAPH printf("Ignoring duplicate transition from %d to %d\n", state->no, target->no); #endif return; } } if (state->maxTrans == 0) { state->maxTrans = 8; state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans * sizeof(xmlRegTrans)); if (state->trans == NULL) { xmlRegexpErrMemory(ctxt, "adding transition"); state->maxTrans = 0; return; } } else if (state->nbTrans >= state->maxTrans) { xmlRegTrans *tmp; state->maxTrans *= 2; tmp = (xmlRegTrans *) xmlRealloc(state->trans, state->maxTrans * sizeof(xmlRegTrans)); if (tmp == NULL) { xmlRegexpErrMemory(ctxt, "adding transition"); state->maxTrans /= 2; return; } state->trans = tmp; } #ifdef DEBUG_REGEXP_GRAPH printf("Add trans from %d to %d ", state->no, target->no); if (count == REGEXP_ALL_COUNTER) printf("all transition\n"); else if (count >= 0) printf("count based %d\n", count); else if (counter >= 0) printf("counted %d\n", counter); else if (atom == NULL) printf("epsilon transition\n"); else if (atom != NULL) xmlRegPrintAtom(stdout, atom); #endif state->trans[state->nbTrans].atom = atom; state->trans[state->nbTrans].to = target->no; state->trans[state->nbTrans].counter = counter; state->trans[state->nbTrans].count = count; state->trans[state->nbTrans].nd = 0; state->nbTrans++; xmlRegStateAddTransTo(ctxt, target, state->no); } static int xmlRegStatePush(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state) { if (state == NULL) return(-1); if (ctxt->maxStates == 0) { ctxt->maxStates = 4; ctxt->states = (xmlRegStatePtr *) xmlMalloc(ctxt->maxStates * sizeof(xmlRegStatePtr)); if (ctxt->states == NULL) { xmlRegexpErrMemory(ctxt, "adding state"); ctxt->maxStates = 0; return(-1); } } else if (ctxt->nbStates >= ctxt->maxStates) { xmlRegStatePtr *tmp; ctxt->maxStates *= 2; tmp = (xmlRegStatePtr *) xmlRealloc(ctxt->states, ctxt->maxStates * sizeof(xmlRegStatePtr)); if (tmp == NULL) { xmlRegexpErrMemory(ctxt, "adding state"); ctxt->maxStates /= 2; return(-1); } ctxt->states = tmp; } state->no = ctxt->nbStates; ctxt->states[ctxt->nbStates++] = state; return(0); } /** * xmlFAGenerateAllTransition: * @ctxt: a regexp parser context * @from: the from state * @to: the target state or NULL for building a new one * @lax: * */ static void xmlFAGenerateAllTransition(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, xmlRegStatePtr to, int lax) { if (to == NULL) { to = xmlRegNewState(ctxt); xmlRegStatePush(ctxt, to); ctxt->state = to; } if (lax) xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_LAX_COUNTER); else xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER); } /** * xmlFAGenerateEpsilonTransition: * @ctxt: a regexp parser context * @from: the from state * @to: the target state or NULL for building a new one * */ static void xmlFAGenerateEpsilonTransition(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, xmlRegStatePtr to) { if (to == NULL) { to = xmlRegNewState(ctxt); xmlRegStatePush(ctxt, to); ctxt->state = to; } xmlRegStateAddTrans(ctxt, from, NULL, to, -1, -1); } /** * xmlFAGenerateCountedEpsilonTransition: * @ctxt: a regexp parser context * @from: the from state * @to: the target state or NULL for building a new one * counter: the counter for that transition * */ static void xmlFAGenerateCountedEpsilonTransition(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, xmlRegStatePtr to, int counter) { if (to == NULL) { to = xmlRegNewState(ctxt); xmlRegStatePush(ctxt, to); ctxt->state = to; } xmlRegStateAddTrans(ctxt, from, NULL, to, counter, -1); } /** * xmlFAGenerateCountedTransition: * @ctxt: a regexp parser context * @from: the from state * @to: the target state or NULL for building a new one * counter: the counter for that transition * */ static void xmlFAGenerateCountedTransition(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, xmlRegStatePtr to, int counter) { if (to == NULL) { to = xmlRegNewState(ctxt); xmlRegStatePush(ctxt, to); ctxt->state = to; } xmlRegStateAddTrans(ctxt, from, NULL, to, -1, counter); } /** * xmlFAGenerateTransitions: * @ctxt: a regexp parser context * @from: the from state * @to: the target state or NULL for building a new one * @atom: the atom generating the transition * * Returns 0 if success and -1 in case of error. */ static int xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, xmlRegStatePtr to, xmlRegAtomPtr atom) { xmlRegStatePtr end; if (atom == NULL) { ERROR("genrate transition: atom == NULL"); return(-1); } if (atom->type == XML_REGEXP_SUBREG) { /* * this is a subexpression handling one should not need to * create a new node except for XML_REGEXP_QUANT_RANGE. */ if (xmlRegAtomPush(ctxt, atom) < 0) { return(-1); } if ((to != NULL) && (atom->stop != to) && (atom->quant != XML_REGEXP_QUANT_RANGE)) { /* * Generate an epsilon transition to link to the target */ xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); #ifdef DV } else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) && (atom->quant != XML_REGEXP_QUANT_ONCE)) { to = xmlRegNewState(ctxt); xmlRegStatePush(ctxt, to); ctxt->state = to; xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); #endif } switch (atom->quant) { case XML_REGEXP_QUANT_OPT: atom->quant = XML_REGEXP_QUANT_ONCE; /* * transition done to the state after end of atom. * 1. set transition from atom start to new state * 2. set transition from atom end to this state. */ if (to == NULL) { xmlFAGenerateEpsilonTransition(ctxt, atom->start, 0); xmlFAGenerateEpsilonTransition(ctxt, atom->stop, ctxt->state); } else { xmlFAGenerateEpsilonTransition(ctxt, atom->start, to); } break; case XML_REGEXP_QUANT_MULT: atom->quant = XML_REGEXP_QUANT_ONCE; xmlFAGenerateEpsilonTransition(ctxt, atom->start, atom->stop); xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); break; case XML_REGEXP_QUANT_PLUS: atom->quant = XML_REGEXP_QUANT_ONCE; xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); break; case XML_REGEXP_QUANT_RANGE: { int counter; xmlRegStatePtr inter, newstate; /* * create the final state now if needed */ if (to != NULL) { newstate = to; } else { newstate = xmlRegNewState(ctxt); xmlRegStatePush(ctxt, newstate); } /* * The principle here is to use counted transition * to avoid explosion in the number of states in the * graph. This is clearly more complex but should not * be exploitable at runtime. */ if ((atom->min == 0) && (atom->start0 == NULL)) { xmlRegAtomPtr copy; /* * duplicate a transition based on atom to count next * occurences after 1. We cannot loop to atom->start * directly because we need an epsilon transition to * newstate. */ /* ???? For some reason it seems we never reach that case, I suppose this got optimized out before when building the automata */ copy = xmlRegCopyAtom(ctxt, atom); if (copy == NULL) return(-1); copy->quant = XML_REGEXP_QUANT_ONCE; copy->min = 0; copy->max = 0; if (xmlFAGenerateTransitions(ctxt, atom->start, NULL, copy) < 0) return(-1); inter = ctxt->state; counter = xmlRegGetCounter(ctxt); ctxt->counters[counter].min = atom->min - 1; ctxt->counters[counter].max = atom->max - 1; /* count the number of times we see it again */ xmlFAGenerateCountedEpsilonTransition(ctxt, inter, atom->stop, counter); /* allow a way out based on the count */ xmlFAGenerateCountedTransition(ctxt, inter, newstate, counter); /* and also allow a direct exit for 0 */ xmlFAGenerateEpsilonTransition(ctxt, atom->start, newstate); } else { /* * either we need the atom at least once or there * is an atom->start0 allowing to easilly plug the * epsilon transition. */ counter = xmlRegGetCounter(ctxt); ctxt->counters[counter].min = atom->min - 1; ctxt->counters[counter].max = atom->max - 1; /* count the number of times we see it again */ xmlFAGenerateCountedEpsilonTransition(ctxt, atom->stop, atom->start, counter); /* allow a way out based on the count */ xmlFAGenerateCountedTransition(ctxt, atom->stop, newstate, counter); /* and if needed allow a direct exit for 0 */ if (atom->min == 0) xmlFAGenerateEpsilonTransition(ctxt, atom->start0, newstate); } atom->min = 0; atom->max = 0; atom->quant = XML_REGEXP_QUANT_ONCE; ctxt->state = newstate; } default: break; } return(0); } if ((atom->min == 0) && (atom->max == 0) && (atom->quant == XML_REGEXP_QUANT_RANGE)) { /* * we can discard the atom and generate an epsilon transition instead */ if (to == NULL) { to = xmlRegNewState(ctxt); if (to != NULL) xmlRegStatePush(ctxt, to); else { return(-1); } } xmlFAGenerateEpsilonTransition(ctxt, from, to); ctxt->state = to; xmlRegFreeAtom(atom); return(0); } if (to == NULL) { to = xmlRegNewState(ctxt); if (to != NULL) xmlRegStatePush(ctxt, to); else { return(-1); } } end = to; if ((atom->quant == XML_REGEXP_QUANT_MULT) || (atom->quant == XML_REGEXP_QUANT_PLUS)) { /* * Do not pollute the target state by adding transitions from * it as it is likely to be the shared target of multiple branches. * So isolate with an epsilon transition. */ xmlRegStatePtr tmp; tmp = xmlRegNewState(ctxt); if (tmp != NULL) xmlRegStatePush(ctxt, tmp); else { return(-1); } xmlFAGenerateEpsilonTransition(ctxt, tmp, to); to = tmp; } if (xmlRegAtomPush(ctxt, atom) < 0) { return(-1); } xmlRegStateAddTrans(ctxt, from, atom, to, -1, -1); ctxt->state = end; switch (atom->quant) { case XML_REGEXP_QUANT_OPT: atom->quant = XML_REGEXP_QUANT_ONCE; xmlFAGenerateEpsilonTransition(ctxt, from, to); break; case XML_REGEXP_QUANT_MULT: atom->quant = XML_REGEXP_QUANT_ONCE; xmlFAGenerateEpsilonTransition(ctxt, from, to); xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); break; case XML_REGEXP_QUANT_PLUS: atom->quant = XML_REGEXP_QUANT_ONCE; xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); break; case XML_REGEXP_QUANT_RANGE: #if DV_test if (atom->min == 0) { xmlFAGenerateEpsilonTransition(ctxt, from, to); } #endif break; default: break; } return(0); } /** * xmlFAReduceEpsilonTransitions: * @ctxt: a regexp parser context * @fromnr: the from state * @tonr: the to state * @counter: should that transition be associated to a counted * */ static void xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, int tonr, int counter) { int transnr; xmlRegStatePtr from; xmlRegStatePtr to; #ifdef DEBUG_REGEXP_GRAPH printf("xmlFAReduceEpsilonTransitions(%d, %d)\n", fromnr, tonr); #endif from = ctxt->states[fromnr]; if (from == NULL) return; to = ctxt->states[tonr]; if (to == NULL) return; if ((to->mark == XML_REGEXP_MARK_START) || (to->mark == XML_REGEXP_MARK_VISITED)) return; to->mark = XML_REGEXP_MARK_VISITED; if (to->type == XML_REGEXP_FINAL_STATE) { #ifdef DEBUG_REGEXP_GRAPH printf("State %d is final, so %d becomes final\n", tonr, fromnr); #endif from->type = XML_REGEXP_FINAL_STATE; } for (transnr = 0;transnr < to->nbTrans;transnr++) { if (to->trans[transnr].to < 0) continue; if (to->trans[transnr].atom == NULL) { /* * Don't remove counted transitions * Don't loop either */ if (to->trans[transnr].to != fromnr) { if (to->trans[transnr].count >= 0) { int newto = to->trans[transnr].to; xmlRegStateAddTrans(ctxt, from, NULL, ctxt->states[newto], -1, to->trans[transnr].count); } else { #ifdef DEBUG_REGEXP_GRAPH printf("Found epsilon trans %d from %d to %d\n", transnr, tonr, to->trans[transnr].to); #endif if (to->trans[transnr].counter >= 0) { xmlFAReduceEpsilonTransitions(ctxt, fromnr, to->trans[transnr].to, to->trans[transnr].counter); } else { xmlFAReduceEpsilonTransitions(ctxt, fromnr, to->trans[transnr].to, counter); } } } } else { int newto = to->trans[transnr].to; if (to->trans[transnr].counter >= 0) { xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, ctxt->states[newto], to->trans[transnr].counter, -1); } else { xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, ctxt->states[newto], counter, -1); } } } to->mark = XML_REGEXP_MARK_NORMAL; } /** * xmlFAEliminateSimpleEpsilonTransitions: * @ctxt: a regexp parser context * * Eliminating general epsilon transitions can get costly in the general * algorithm due to the large amount of generated new transitions and * associated comparisons. However for simple epsilon transition used just * to separate building blocks when generating the automata this can be * reduced to state elimination: * - if there exists an epsilon from X to Y * - if there is no other transition from X * then X and Y are semantically equivalent and X can be eliminated * If X is the start state then make Y the start state, else replace the * target of all transitions to X by transitions to Y. */ static void xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { int statenr, i, j, newto; xmlRegStatePtr state, tmp; for (statenr = 0;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if (state == NULL) continue; if (state->nbTrans != 1) continue; if (state->type == XML_REGEXP_UNREACH_STATE) continue; /* is the only transition out a basic transition */ if ((state->trans[0].atom == NULL) && (state->trans[0].to >= 0) && (state->trans[0].to != statenr) && (state->trans[0].counter < 0) && (state->trans[0].count < 0)) { newto = state->trans[0].to; if (state->type == XML_REGEXP_START_STATE) { #ifdef DEBUG_REGEXP_GRAPH printf("Found simple epsilon trans from start %d to %d\n", statenr, newto); #endif } else { #ifdef DEBUG_REGEXP_GRAPH printf("Found simple epsilon trans from %d to %d\n", statenr, newto); #endif for (i = 0;i < state->nbTransTo;i++) { tmp = ctxt->states[state->transTo[i]]; for (j = 0;j < tmp->nbTrans;j++) { if (tmp->trans[j].to == statenr) { #ifdef DEBUG_REGEXP_GRAPH printf("Changed transition %d on %d to go to %d\n", j, tmp->no, newto); #endif tmp->trans[j].to = -1; xmlRegStateAddTrans(ctxt, tmp, tmp->trans[j].atom, ctxt->states[newto], tmp->trans[j].counter, tmp->trans[j].count); } } } if (state->type == XML_REGEXP_FINAL_STATE) ctxt->states[newto]->type = XML_REGEXP_FINAL_STATE; /* eliminate the transition completely */ state->nbTrans = 0; state->type = XML_REGEXP_UNREACH_STATE; } } } } /** * xmlFAEliminateEpsilonTransitions: * @ctxt: a regexp parser context * */ static void xmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { int statenr, transnr; xmlRegStatePtr state; int has_epsilon; if (ctxt->states == NULL) return; /* * Eliminate simple epsilon transition and the associated unreachable * states. */ xmlFAEliminateSimpleEpsilonTransitions(ctxt); for (statenr = 0;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if ((state != NULL) && (state->type == XML_REGEXP_UNREACH_STATE)) { #ifdef DEBUG_REGEXP_GRAPH printf("Removed unreachable state %d\n", statenr); #endif xmlRegFreeState(state); ctxt->states[statenr] = NULL; } } has_epsilon = 0; /* * Build the completed transitions bypassing the epsilons * Use a marking algorithm to avoid loops * Mark sink states too. * Process from the latests states backward to the start when * there is long cascading epsilon chains this minimize the * recursions and transition compares when adding the new ones */ for (statenr = ctxt->nbStates - 1;statenr >= 0;statenr--) { state = ctxt->states[statenr]; if (state == NULL) continue; if ((state->nbTrans == 0) && (state->type != XML_REGEXP_FINAL_STATE)) { state->type = XML_REGEXP_SINK_STATE; } for (transnr = 0;transnr < state->nbTrans;transnr++) { if ((state->trans[transnr].atom == NULL) && (state->trans[transnr].to >= 0)) { if (state->trans[transnr].to == statenr) { state->trans[transnr].to = -1; #ifdef DEBUG_REGEXP_GRAPH printf("Removed loopback epsilon trans %d on %d\n", transnr, statenr); #endif } else if (state->trans[transnr].count < 0) { int newto = state->trans[transnr].to; #ifdef DEBUG_REGEXP_GRAPH printf("Found epsilon trans %d from %d to %d\n", transnr, statenr, newto); #endif has_epsilon = 1; state->trans[transnr].to = -2; state->mark = XML_REGEXP_MARK_START; xmlFAReduceEpsilonTransitions(ctxt, statenr, newto, state->trans[transnr].counter); state->mark = XML_REGEXP_MARK_NORMAL; #ifdef DEBUG_REGEXP_GRAPH } else { printf("Found counted transition %d on %d\n", transnr, statenr); #endif } } } } /* * Eliminate the epsilon transitions */ if (has_epsilon) { for (statenr = 0;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if (state == NULL) continue; for (transnr = 0;transnr < state->nbTrans;transnr++) { xmlRegTransPtr trans = &(state->trans[transnr]); if ((trans->atom == NULL) && (trans->count < 0) && (trans->to >= 0)) { trans->to = -1; } } } } /* * Use this pass to detect unreachable states too */ for (statenr = 0;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if (state != NULL) state->reached = XML_REGEXP_MARK_NORMAL; } state = ctxt->states[0]; if (state != NULL) state->reached = XML_REGEXP_MARK_START; while (state != NULL) { xmlRegStatePtr target = NULL; state->reached = XML_REGEXP_MARK_VISITED; /* * Mark all states reachable from the current reachable state */ for (transnr = 0;transnr < state->nbTrans;transnr++) { if ((state->trans[transnr].to >= 0) && ((state->trans[transnr].atom != NULL) || (state->trans[transnr].count >= 0))) { int newto = state->trans[transnr].to; if (ctxt->states[newto] == NULL) continue; if (ctxt->states[newto]->reached == XML_REGEXP_MARK_NORMAL) { ctxt->states[newto]->reached = XML_REGEXP_MARK_START; target = ctxt->states[newto]; } } } /* * find the next accessible state not explored */ if (target == NULL) { for (statenr = 1;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if ((state != NULL) && (state->reached == XML_REGEXP_MARK_START)) { target = state; break; } } } state = target; } for (statenr = 0;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if ((state != NULL) && (state->reached == XML_REGEXP_MARK_NORMAL)) { #ifdef DEBUG_REGEXP_GRAPH printf("Removed unreachable state %d\n", statenr); #endif xmlRegFreeState(state); ctxt->states[statenr] = NULL; } } } static int xmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) { int ret = 0; if ((range1->type == XML_REGEXP_RANGES) || (range2->type == XML_REGEXP_RANGES) || (range2->type == XML_REGEXP_SUBREG) || (range1->type == XML_REGEXP_SUBREG) || (range1->type == XML_REGEXP_STRING) || (range2->type == XML_REGEXP_STRING)) return(-1); /* put them in order */ if (range1->type > range2->type) { xmlRegRangePtr tmp; tmp = range1; range1 = range2; range2 = tmp; } if ((range1->type == XML_REGEXP_ANYCHAR) || (range2->type == XML_REGEXP_ANYCHAR)) { ret = 1; } else if ((range1->type == XML_REGEXP_EPSILON) || (range2->type == XML_REGEXP_EPSILON)) { return(0); } else if (range1->type == range2->type) { if (range1->type != XML_REGEXP_CHARVAL) ret = 1; else if ((range1->end < range2->start) || (range2->end < range1->start)) ret = 0; else ret = 1; } else if (range1->type == XML_REGEXP_CHARVAL) { int codepoint; int neg = 0; /* * just check all codepoints in the range for acceptance, * this is usually way cheaper since done only once at * compilation than testing over and over at runtime or * pushing too many states when evaluating. */ if (((range1->neg == 0) && (range2->neg != 0)) || ((range1->neg != 0) && (range2->neg == 0))) neg = 1; for (codepoint = range1->start;codepoint <= range1->end ;codepoint++) { ret = xmlRegCheckCharacterRange(range2->type, codepoint, 0, range2->start, range2->end, range2->blockName); if (ret < 0) return(-1); if (((neg == 1) && (ret == 0)) || ((neg == 0) && (ret == 1))) return(1); } return(0); } else if ((range1->type == XML_REGEXP_BLOCK_NAME) || (range2->type == XML_REGEXP_BLOCK_NAME)) { if (range1->type == range2->type) { ret = xmlStrEqual(range1->blockName, range2->blockName); } else { /* * comparing a block range with anything else is way * too costly, and maintining the table is like too much * memory too, so let's force the automata to save state * here. */ return(1); } } else if ((range1->type < XML_REGEXP_LETTER) || (range2->type < XML_REGEXP_LETTER)) { if ((range1->type == XML_REGEXP_ANYSPACE) && (range2->type == XML_REGEXP_NOTSPACE)) ret = 0; else if ((range1->type == XML_REGEXP_INITNAME) && (range2->type == XML_REGEXP_NOTINITNAME)) ret = 0; else if ((range1->type == XML_REGEXP_NAMECHAR) && (range2->type == XML_REGEXP_NOTNAMECHAR)) ret = 0; else if ((range1->type == XML_REGEXP_DECIMAL) && (range2->type == XML_REGEXP_NOTDECIMAL)) ret = 0; else if ((range1->type == XML_REGEXP_REALCHAR) && (range2->type == XML_REGEXP_NOTREALCHAR)) ret = 0; else { /* same thing to limit complexity */ return(1); } } else { ret = 0; /* range1->type < range2->type here */ switch (range1->type) { case XML_REGEXP_LETTER: /* all disjoint except in the subgroups */ if ((range2->type == XML_REGEXP_LETTER_UPPERCASE) || (range2->type == XML_REGEXP_LETTER_LOWERCASE) || (range2->type == XML_REGEXP_LETTER_TITLECASE) || (range2->type == XML_REGEXP_LETTER_MODIFIER) || (range2->type == XML_REGEXP_LETTER_OTHERS)) ret = 1; break; case XML_REGEXP_MARK: if ((range2->type == XML_REGEXP_MARK_NONSPACING) || (range2->type == XML_REGEXP_MARK_SPACECOMBINING) || (range2->type == XML_REGEXP_MARK_ENCLOSING)) ret = 1; break; case XML_REGEXP_NUMBER: if ((range2->type == XML_REGEXP_NUMBER_DECIMAL) || (range2->type == XML_REGEXP_NUMBER_LETTER) || (range2->type == XML_REGEXP_NUMBER_OTHERS)) ret = 1; break; case XML_REGEXP_PUNCT: if ((range2->type == XML_REGEXP_PUNCT_CONNECTOR) || (range2->type == XML_REGEXP_PUNCT_DASH) || (range2->type == XML_REGEXP_PUNCT_OPEN) || (range2->type == XML_REGEXP_PUNCT_CLOSE) || (range2->type == XML_REGEXP_PUNCT_INITQUOTE) || (range2->type == XML_REGEXP_PUNCT_FINQUOTE) || (range2->type == XML_REGEXP_PUNCT_OTHERS)) ret = 1; break; case XML_REGEXP_SEPAR: if ((range2->type == XML_REGEXP_SEPAR_SPACE) || (range2->type == XML_REGEXP_SEPAR_LINE) || (range2->type == XML_REGEXP_SEPAR_PARA)) ret = 1; break; case XML_REGEXP_SYMBOL: if ((range2->type == XML_REGEXP_SYMBOL_MATH) || (range2->type == XML_REGEXP_SYMBOL_CURRENCY) || (range2->type == XML_REGEXP_SYMBOL_MODIFIER) || (range2->type == XML_REGEXP_SYMBOL_OTHERS)) ret = 1; break; case XML_REGEXP_OTHER: if ((range2->type == XML_REGEXP_OTHER_CONTROL) || (range2->type == XML_REGEXP_OTHER_FORMAT) || (range2->type == XML_REGEXP_OTHER_PRIVATE)) ret = 1; break; default: if ((range2->type >= XML_REGEXP_LETTER) && (range2->type < XML_REGEXP_BLOCK_NAME)) ret = 0; else { /* safety net ! */ return(1); } } } if (((range1->neg == 0) && (range2->neg != 0)) || ((range1->neg != 0) && (range2->neg == 0))) ret = !ret; return(ret); } /** * xmlFACompareAtomTypes: * @type1: an atom type * @type2: an atom type * * Compares two atoms type to check whether they intersect in some ways, * this is used by xmlFACompareAtoms only * * Returns 1 if they may intersect and 0 otherwise */ static int xmlFACompareAtomTypes(xmlRegAtomType type1, xmlRegAtomType type2) { if ((type1 == XML_REGEXP_EPSILON) || (type1 == XML_REGEXP_CHARVAL) || (type1 == XML_REGEXP_RANGES) || (type1 == XML_REGEXP_SUBREG) || (type1 == XML_REGEXP_STRING) || (type1 == XML_REGEXP_ANYCHAR)) return(1); if ((type2 == XML_REGEXP_EPSILON) || (type2 == XML_REGEXP_CHARVAL) || (type2 == XML_REGEXP_RANGES) || (type2 == XML_REGEXP_SUBREG) || (type2 == XML_REGEXP_STRING) || (type2 == XML_REGEXP_ANYCHAR)) return(1); if (type1 == type2) return(1); /* simplify subsequent compares by making sure type1 < type2 */ if (type1 > type2) { xmlRegAtomType tmp = type1; type1 = type2; type2 = tmp; } switch (type1) { case XML_REGEXP_ANYSPACE: /* \s */ /* can't be a letter, number, mark, pontuation, symbol */ if ((type2 == XML_REGEXP_NOTSPACE) || ((type2 >= XML_REGEXP_LETTER) && (type2 <= XML_REGEXP_LETTER_OTHERS)) || ((type2 >= XML_REGEXP_NUMBER) && (type2 <= XML_REGEXP_NUMBER_OTHERS)) || ((type2 >= XML_REGEXP_MARK) && (type2 <= XML_REGEXP_MARK_ENCLOSING)) || ((type2 >= XML_REGEXP_PUNCT) && (type2 <= XML_REGEXP_PUNCT_OTHERS)) || ((type2 >= XML_REGEXP_SYMBOL) && (type2 <= XML_REGEXP_SYMBOL_OTHERS)) ) return(0); break; case XML_REGEXP_NOTSPACE: /* \S */ break; case XML_REGEXP_INITNAME: /* \l */ /* can't be a number, mark, separator, pontuation, symbol or other */ if ((type2 == XML_REGEXP_NOTINITNAME) || ((type2 >= XML_REGEXP_NUMBER) && (type2 <= XML_REGEXP_NUMBER_OTHERS)) || ((type2 >= XML_REGEXP_MARK) && (type2 <= XML_REGEXP_MARK_ENCLOSING)) || ((type2 >= XML_REGEXP_SEPAR) && (type2 <= XML_REGEXP_SEPAR_PARA)) || ((type2 >= XML_REGEXP_PUNCT) && (type2 <= XML_REGEXP_PUNCT_OTHERS)) || ((type2 >= XML_REGEXP_SYMBOL) && (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || ((type2 >= XML_REGEXP_OTHER) && (type2 <= XML_REGEXP_OTHER_NA)) ) return(0); break; case XML_REGEXP_NOTINITNAME: /* \L */ break; case XML_REGEXP_NAMECHAR: /* \c */ /* can't be a mark, separator, pontuation, symbol or other */ if ((type2 == XML_REGEXP_NOTNAMECHAR) || ((type2 >= XML_REGEXP_MARK) && (type2 <= XML_REGEXP_MARK_ENCLOSING)) || ((type2 >= XML_REGEXP_PUNCT) && (type2 <= XML_REGEXP_PUNCT_OTHERS)) || ((type2 >= XML_REGEXP_SEPAR) && (type2 <= XML_REGEXP_SEPAR_PARA)) || ((type2 >= XML_REGEXP_SYMBOL) && (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || ((type2 >= XML_REGEXP_OTHER) && (type2 <= XML_REGEXP_OTHER_NA)) ) return(0); break; case XML_REGEXP_NOTNAMECHAR: /* \C */ break; case XML_REGEXP_DECIMAL: /* \d */ /* can't be a letter, mark, separator, pontuation, symbol or other */ if ((type2 == XML_REGEXP_NOTDECIMAL) || (type2 == XML_REGEXP_REALCHAR) || ((type2 >= XML_REGEXP_LETTER) && (type2 <= XML_REGEXP_LETTER_OTHERS)) || ((type2 >= XML_REGEXP_MARK) && (type2 <= XML_REGEXP_MARK_ENCLOSING)) || ((type2 >= XML_REGEXP_PUNCT) && (type2 <= XML_REGEXP_PUNCT_OTHERS)) || ((type2 >= XML_REGEXP_SEPAR) && (type2 <= XML_REGEXP_SEPAR_PARA)) || ((type2 >= XML_REGEXP_SYMBOL) && (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || ((type2 >= XML_REGEXP_OTHER) && (type2 <= XML_REGEXP_OTHER_NA)) )return(0); break; case XML_REGEXP_NOTDECIMAL: /* \D */ break; case XML_REGEXP_REALCHAR: /* \w */ /* can't be a mark, separator, pontuation, symbol or other */ if ((type2 == XML_REGEXP_NOTDECIMAL) || ((type2 >= XML_REGEXP_MARK) && (type2 <= XML_REGEXP_MARK_ENCLOSING)) || ((type2 >= XML_REGEXP_PUNCT) && (type2 <= XML_REGEXP_PUNCT_OTHERS)) || ((type2 >= XML_REGEXP_SEPAR) && (type2 <= XML_REGEXP_SEPAR_PARA)) || ((type2 >= XML_REGEXP_SYMBOL) && (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || ((type2 >= XML_REGEXP_OTHER) && (type2 <= XML_REGEXP_OTHER_NA)) )return(0); break; case XML_REGEXP_NOTREALCHAR: /* \W */ break; /* * at that point we know both type 1 and type2 are from * character categories are ordered and are different, * it becomes simple because this is a partition */ case XML_REGEXP_LETTER: if (type2 <= XML_REGEXP_LETTER_OTHERS) return(1); return(0); case XML_REGEXP_LETTER_UPPERCASE: case XML_REGEXP_LETTER_LOWERCASE: case XML_REGEXP_LETTER_TITLECASE: case XML_REGEXP_LETTER_MODIFIER: case XML_REGEXP_LETTER_OTHERS: return(0); case XML_REGEXP_MARK: if (type2 <= XML_REGEXP_MARK_ENCLOSING) return(1); return(0); case XML_REGEXP_MARK_NONSPACING: case XML_REGEXP_MARK_SPACECOMBINING: case XML_REGEXP_MARK_ENCLOSING: return(0); case XML_REGEXP_NUMBER: if (type2 <= XML_REGEXP_NUMBER_OTHERS) return(1); return(0); case XML_REGEXP_NUMBER_DECIMAL: case XML_REGEXP_NUMBER_LETTER: case XML_REGEXP_NUMBER_OTHERS: return(0); case XML_REGEXP_PUNCT: if (type2 <= XML_REGEXP_PUNCT_OTHERS) return(1); return(0); case XML_REGEXP_PUNCT_CONNECTOR: case XML_REGEXP_PUNCT_DASH: case XML_REGEXP_PUNCT_OPEN: case XML_REGEXP_PUNCT_CLOSE: case XML_REGEXP_PUNCT_INITQUOTE: case XML_REGEXP_PUNCT_FINQUOTE: case XML_REGEXP_PUNCT_OTHERS: return(0); case XML_REGEXP_SEPAR: if (type2 <= XML_REGEXP_SEPAR_PARA) return(1); return(0); case XML_REGEXP_SEPAR_SPACE: case XML_REGEXP_SEPAR_LINE: case XML_REGEXP_SEPAR_PARA: return(0); case XML_REGEXP_SYMBOL: if (type2 <= XML_REGEXP_SYMBOL_OTHERS) return(1); return(0); case XML_REGEXP_SYMBOL_MATH: case XML_REGEXP_SYMBOL_CURRENCY: case XML_REGEXP_SYMBOL_MODIFIER: case XML_REGEXP_SYMBOL_OTHERS: return(0); case XML_REGEXP_OTHER: if (type2 <= XML_REGEXP_OTHER_NA) return(1); return(0); case XML_REGEXP_OTHER_CONTROL: case XML_REGEXP_OTHER_FORMAT: case XML_REGEXP_OTHER_PRIVATE: case XML_REGEXP_OTHER_NA: return(0); default: break; } return(1); } /** * xmlFAEqualAtoms: * @atom1: an atom * @atom2: an atom * @deep: if not set only compare string pointers * * Compares two atoms to check whether they are the same exactly * this is used to remove equivalent transitions * * Returns 1 if same and 0 otherwise */ static int xmlFAEqualAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { int ret = 0; if (atom1 == atom2) return(1); if ((atom1 == NULL) || (atom2 == NULL)) return(0); if (atom1->type != atom2->type) return(0); switch (atom1->type) { case XML_REGEXP_EPSILON: ret = 0; break; case XML_REGEXP_STRING: if (!deep) ret = (atom1->valuep == atom2->valuep); else ret = xmlStrEqual((xmlChar *)atom1->valuep, (xmlChar *)atom2->valuep); break; case XML_REGEXP_CHARVAL: ret = (atom1->codepoint == atom2->codepoint); break; case XML_REGEXP_RANGES: /* too hard to do in the general case */ ret = 0; default: break; } return(ret); } /** * xmlFACompareAtoms: * @atom1: an atom * @atom2: an atom * @deep: if not set only compare string pointers * * Compares two atoms to check whether they intersect in some ways, * this is used by xmlFAComputesDeterminism and xmlFARecurseDeterminism only * * Returns 1 if yes and 0 otherwise */ static int xmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { int ret = 1; if (atom1 == atom2) return(1); if ((atom1 == NULL) || (atom2 == NULL)) return(0); if ((atom1->type == XML_REGEXP_ANYCHAR) || (atom2->type == XML_REGEXP_ANYCHAR)) return(1); if (atom1->type > atom2->type) { xmlRegAtomPtr tmp; tmp = atom1; atom1 = atom2; atom2 = tmp; } if (atom1->type != atom2->type) { ret = xmlFACompareAtomTypes(atom1->type, atom2->type); /* if they can't intersect at the type level break now */ if (ret == 0) return(0); } switch (atom1->type) { case XML_REGEXP_STRING: if (!deep) ret = (atom1->valuep != atom2->valuep); else ret = xmlRegStrEqualWildcard((xmlChar *)atom1->valuep, (xmlChar *)atom2->valuep); break; case XML_REGEXP_EPSILON: goto not_determinist; case XML_REGEXP_CHARVAL: if (atom2->type == XML_REGEXP_CHARVAL) { ret = (atom1->codepoint == atom2->codepoint); } else { ret = xmlRegCheckCharacter(atom2, atom1->codepoint); if (ret < 0) ret = 1; } break; case XML_REGEXP_RANGES: if (atom2->type == XML_REGEXP_RANGES) { int i, j, res; xmlRegRangePtr r1, r2; /* * need to check that none of the ranges eventually matches */ for (i = 0;i < atom1->nbRanges;i++) { for (j = 0;j < atom2->nbRanges;j++) { r1 = atom1->ranges[i]; r2 = atom2->ranges[j]; res = xmlFACompareRanges(r1, r2); if (res == 1) { ret = 1; goto done; } } } ret = 0; } break; default: goto not_determinist; } done: if (atom1->neg != atom2->neg) { ret = !ret; } if (ret == 0) return(0); not_determinist: return(1); } /** * xmlFARecurseDeterminism: * @ctxt: a regexp parser context * * Check whether the associated regexp is determinist, * should be called after xmlFAEliminateEpsilonTransitions() * */ static int xmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, int to, xmlRegAtomPtr atom) { int ret = 1; int res; int transnr, nbTrans; xmlRegTransPtr t1; int deep = 1; if (state == NULL) return(ret); if (state->markd == XML_REGEXP_MARK_VISITED) return(ret); if (ctxt->flags & AM_AUTOMATA_RNG) deep = 0; /* * don't recurse on transitions potentially added in the course of * the elimination. */ nbTrans = state->nbTrans; for (transnr = 0;transnr < nbTrans;transnr++) { t1 = &(state->trans[transnr]); /* * check transitions conflicting with the one looked at */ if (t1->atom == NULL) { if (t1->to < 0) continue; state->markd = XML_REGEXP_MARK_VISITED; res = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], to, atom); state->markd = 0; if (res == 0) { ret = 0; /* t1->nd = 1; */ } continue; } if (t1->to != to) continue; if (xmlFACompareAtoms(t1->atom, atom, deep)) { ret = 0; /* mark the transition as non-deterministic */ t1->nd = 1; } } return(ret); } /** * xmlFAComputesDeterminism: * @ctxt: a regexp parser context * * Check whether the associated regexp is determinist, * should be called after xmlFAEliminateEpsilonTransitions() * */ static int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt) { int statenr, transnr; xmlRegStatePtr state; xmlRegTransPtr t1, t2, last; int i; int ret = 1; int deep = 1; #ifdef DEBUG_REGEXP_GRAPH printf("xmlFAComputesDeterminism\n"); xmlRegPrintCtxt(stdout, ctxt); #endif if (ctxt->determinist != -1) return(ctxt->determinist); if (ctxt->flags & AM_AUTOMATA_RNG) deep = 0; /* * First cleanup the automata removing cancelled transitions */ for (statenr = 0;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if (state == NULL) continue; if (state->nbTrans < 2) continue; for (transnr = 0;transnr < state->nbTrans;transnr++) { t1 = &(state->trans[transnr]); /* * Determinism checks in case of counted or all transitions * will have to be handled separately */ if (t1->atom == NULL) { /* t1->nd = 1; */ continue; } if (t1->to == -1) /* eliminated */ continue; for (i = 0;i < transnr;i++) { t2 = &(state->trans[i]); if (t2->to == -1) /* eliminated */ continue; if (t2->atom != NULL) { if (t1->to == t2->to) { /* * Here we use deep because we want to keep the * transitions which indicate a conflict */ if (xmlFAEqualAtoms(t1->atom, t2->atom, deep) && (t1->counter == t2->counter) && (t1->count == t2->count)) t2->to = -1; /* eliminated */ } } } } } /* * Check for all states that there aren't 2 transitions * with the same atom and a different target. */ for (statenr = 0;statenr < ctxt->nbStates;statenr++) { state = ctxt->states[statenr]; if (state == NULL) continue; if (state->nbTrans < 2) continue; last = NULL; for (transnr = 0;transnr < state->nbTrans;transnr++) { t1 = &(state->trans[transnr]); /* * Determinism checks in case of counted or all transitions * will have to be handled separately */ if (t1->atom == NULL) { continue; } if (t1->to == -1) /* eliminated */ continue; for (i = 0;i < transnr;i++) { t2 = &(state->trans[i]); if (t2->to == -1) /* eliminated */ continue; if (t2->atom != NULL) { /* * But here we don't use deep because we want to * find transitions which indicate a conflict */ if (xmlFACompareAtoms(t1->atom, t2->atom, 1)) { ret = 0; /* mark the transitions as non-deterministic ones */ t1->nd = 1; t2->nd = 1; last = t1; } } else if (t1->to != -1) { /* * do the closure in case of remaining specific * epsilon transitions like choices or all */ ret = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], t2->to, t2->atom); /* don't shortcut the computation so all non deterministic transition get marked down if (ret == 0) return(0); */ if (ret == 0) { t1->nd = 1; /* t2->nd = 1; */ last = t1; } } } /* don't shortcut the computation so all non deterministic transition get marked down if (ret == 0) break; */ } /* * mark specifically the last non-deterministic transition * from a state since there is no need to set-up rollback * from it */ if (last != NULL) { last->nd = 2; } /* don't shortcut the computation so all non deterministic transition get marked down if (ret == 0) break; */ } ctxt->determinist = ret; return(ret); } /************************************************************************ * * * Routines to check input against transition atoms * * * ************************************************************************/ static int xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg, int start, int end, const xmlChar *blockName) { int ret = 0; switch (type) { case XML_REGEXP_STRING: case XML_REGEXP_SUBREG: case XML_REGEXP_RANGES: case XML_REGEXP_EPSILON: return(-1); case XML_REGEXP_ANYCHAR: ret = ((codepoint != '\n') && (codepoint != '\r')); break; case XML_REGEXP_CHARVAL: ret = ((codepoint >= start) && (codepoint <= end)); break; case XML_REGEXP_NOTSPACE: neg = !neg; case XML_REGEXP_ANYSPACE: ret = ((codepoint == '\n') || (codepoint == '\r') || (codepoint == '\t') || (codepoint == ' ')); break; case XML_REGEXP_NOTINITNAME: neg = !neg; case XML_REGEXP_INITNAME: ret = (IS_LETTER(codepoint) || (codepoint == '_') || (codepoint == ':')); break; case XML_REGEXP_NOTNAMECHAR: neg = !neg; case XML_REGEXP_NAMECHAR: ret = (IS_LETTER(codepoint) || IS_DIGIT(codepoint) || (codepoint == '.') || (codepoint == '-') || (codepoint == '_') || (codepoint == ':') || IS_COMBINING(codepoint) || IS_EXTENDER(codepoint)); break; case XML_REGEXP_NOTDECIMAL: neg = !neg; case XML_REGEXP_DECIMAL: ret = xmlUCSIsCatNd(codepoint); break; case XML_REGEXP_REALCHAR: neg = !neg; case XML_REGEXP_NOTREALCHAR: ret = xmlUCSIsCatP(codepoint); if (ret == 0) ret = xmlUCSIsCatZ(codepoint); if (ret == 0) ret = xmlUCSIsCatC(codepoint); break; case XML_REGEXP_LETTER: ret = xmlUCSIsCatL(codepoint); break; case XML_REGEXP_LETTER_UPPERCASE: ret = xmlUCSIsCatLu(codepoint); break; case XML_REGEXP_LETTER_LOWERCASE: ret = xmlUCSIsCatLl(codepoint); break; case XML_REGEXP_LETTER_TITLECASE: ret = xmlUCSIsCatLt(codepoint); break; case XML_REGEXP_LETTER_MODIFIER: ret = xmlUCSIsCatLm(codepoint); break; case XML_REGEXP_LETTER_OTHERS: ret = xmlUCSIsCatLo(codepoint); break; case XML_REGEXP_MARK: ret = xmlUCSIsCatM(codepoint); break; case XML_REGEXP_MARK_NONSPACING: ret = xmlUCSIsCatMn(codepoint); break; case XML_REGEXP_MARK_SPACECOMBINING: ret = xmlUCSIsCatMc(codepoint); break; case XML_REGEXP_MARK_ENCLOSING: ret = xmlUCSIsCatMe(codepoint); break; case XML_REGEXP_NUMBER: ret = xmlUCSIsCatN(codepoint); break; case XML_REGEXP_NUMBER_DECIMAL: ret = xmlUCSIsCatNd(codepoint); break; case XML_REGEXP_NUMBER_LETTER: ret = xmlUCSIsCatNl(codepoint); break; case XML_REGEXP_NUMBER_OTHERS: ret = xmlUCSIsCatNo(codepoint); break; case XML_REGEXP_PUNCT: ret = xmlUCSIsCatP(codepoint); break; case XML_REGEXP_PUNCT_CONNECTOR: ret = xmlUCSIsCatPc(codepoint); break; case XML_REGEXP_PUNCT_DASH: ret = xmlUCSIsCatPd(codepoint); break; case XML_REGEXP_PUNCT_OPEN: ret = xmlUCSIsCatPs(codepoint); break; case XML_REGEXP_PUNCT_CLOSE: ret = xmlUCSIsCatPe(codepoint); break; case XML_REGEXP_PUNCT_INITQUOTE: ret = xmlUCSIsCatPi(codepoint); break; case XML_REGEXP_PUNCT_FINQUOTE: ret = xmlUCSIsCatPf(codepoint); break; case XML_REGEXP_PUNCT_OTHERS: ret = xmlUCSIsCatPo(codepoint); break; case XML_REGEXP_SEPAR: ret = xmlUCSIsCatZ(codepoint); break; case XML_REGEXP_SEPAR_SPACE: ret = xmlUCSIsCatZs(codepoint); break; case XML_REGEXP_SEPAR_LINE: ret = xmlUCSIsCatZl(codepoint); break; case XML_REGEXP_SEPAR_PARA: ret = xmlUCSIsCatZp(codepoint); break; case XML_REGEXP_SYMBOL: ret = xmlUCSIsCatS(codepoint); break; case XML_REGEXP_SYMBOL_MATH: ret = xmlUCSIsCatSm(codepoint); break; case XML_REGEXP_SYMBOL_CURRENCY: ret = xmlUCSIsCatSc(codepoint); break; case XML_REGEXP_SYMBOL_MODIFIER: ret = xmlUCSIsCatSk(codepoint); break; case XML_REGEXP_SYMBOL_OTHERS: ret = xmlUCSIsCatSo(codepoint); break; case XML_REGEXP_OTHER: ret = xmlUCSIsCatC(codepoint); break; case XML_REGEXP_OTHER_CONTROL: ret = xmlUCSIsCatCc(codepoint); break; case XML_REGEXP_OTHER_FORMAT: ret = xmlUCSIsCatCf(codepoint); break; case XML_REGEXP_OTHER_PRIVATE: ret = xmlUCSIsCatCo(codepoint); break; case XML_REGEXP_OTHER_NA: /* ret = xmlUCSIsCatCn(codepoint); */ /* Seems it doesn't exist anymore in recent Unicode releases */ ret = 0; break; case XML_REGEXP_BLOCK_NAME: ret = xmlUCSIsBlock(codepoint, (const char *) blockName); break; } if (neg) return(!ret); return(ret); } static int xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint) { int i, ret = 0; xmlRegRangePtr range; if ((atom == NULL) || (!IS_CHAR(codepoint))) return(-1); switch (atom->type) { case XML_REGEXP_SUBREG: case XML_REGEXP_EPSILON: return(-1); case XML_REGEXP_CHARVAL: return(codepoint == atom->codepoint); case XML_REGEXP_RANGES: { int accept = 0; for (i = 0;i < atom->nbRanges;i++) { range = atom->ranges[i]; if (range->neg == 2) { ret = xmlRegCheckCharacterRange(range->type, codepoint, 0, range->start, range->end, range->blockName); if (ret != 0) return(0); /* excluded char */ } else if (range->neg) { ret = xmlRegCheckCharacterRange(range->type, codepoint, 0, range->start, range->end, range->blockName); if (ret == 0) accept = 1; else return(0); } else { ret = xmlRegCheckCharacterRange(range->type, codepoint, 0, range->start, range->end, range->blockName); if (ret != 0) accept = 1; /* might still be excluded */ } } return(accept); } case XML_REGEXP_STRING: printf("TODO: XML_REGEXP_STRING\n"); return(-1); case XML_REGEXP_ANYCHAR: case XML_REGEXP_ANYSPACE: case XML_REGEXP_NOTSPACE: case XML_REGEXP_INITNAME: case XML_REGEXP_NOTINITNAME: case XML_REGEXP_NAMECHAR: case XML_REGEXP_NOTNAMECHAR: case XML_REGEXP_DECIMAL: case XML_REGEXP_NOTDECIMAL: case XML_REGEXP_REALCHAR: case XML_REGEXP_NOTREALCHAR: case XML_REGEXP_LETTER: case XML_REGEXP_LETTER_UPPERCASE: case XML_REGEXP_LETTER_LOWERCASE: case XML_REGEXP_LETTER_TITLECASE: case XML_REGEXP_LETTER_MODIFIER: case XML_REGEXP_LETTER_OTHERS: case XML_REGEXP_MARK: case XML_REGEXP_MARK_NONSPACING: case XML_REGEXP_MARK_SPACECOMBINING: case XML_REGEXP_MARK_ENCLOSING: case XML_REGEXP_NUMBER: case XML_REGEXP_NUMBER_DECIMAL: case XML_REGEXP_NUMBER_LETTER: case XML_REGEXP_NUMBER_OTHERS: case XML_REGEXP_PUNCT: case XML_REGEXP_PUNCT_CONNECTOR: case XML_REGEXP_PUNCT_DASH: case XML_REGEXP_PUNCT_OPEN: case XML_REGEXP_PUNCT_CLOSE: case XML_REGEXP_PUNCT_INITQUOTE: case XML_REGEXP_PUNCT_FINQUOTE: case XML_REGEXP_PUNCT_OTHERS: case XML_REGEXP_SEPAR: case XML_REGEXP_SEPAR_SPACE: case XML_REGEXP_SEPAR_LINE: case XML_REGEXP_SEPAR_PARA: case XML_REGEXP_SYMBOL: case XML_REGEXP_SYMBOL_MATH: case XML_REGEXP_SYMBOL_CURRENCY: case XML_REGEXP_SYMBOL_MODIFIER: case XML_REGEXP_SYMBOL_OTHERS: case XML_REGEXP_OTHER: case XML_REGEXP_OTHER_CONTROL: case XML_REGEXP_OTHER_FORMAT: case XML_REGEXP_OTHER_PRIVATE: case XML_REGEXP_OTHER_NA: case XML_REGEXP_BLOCK_NAME: ret = xmlRegCheckCharacterRange(atom->type, codepoint, 0, 0, 0, (const xmlChar *)atom->valuep); if (atom->neg) ret = !ret; break; } return(ret); } /************************************************************************ * * * Saving and restoring state of an execution context * * * ************************************************************************/ #ifdef DEBUG_REGEXP_EXEC static void xmlFARegDebugExec(xmlRegExecCtxtPtr exec) { printf("state: %d:%d:idx %d", exec->state->no, exec->transno, exec->index); if (exec->inputStack != NULL) { int i; printf(": "); for (i = 0;(i < 3) && (i < exec->inputStackNr);i++) printf("%s ", (const char *) exec->inputStack[exec->inputStackNr - (i + 1)].value); } else { printf(": %s", &(exec->inputString[exec->index])); } printf("\n"); } #endif static void xmlFARegExecSave(xmlRegExecCtxtPtr exec) { #ifdef DEBUG_REGEXP_EXEC printf("saving "); exec->transno++; xmlFARegDebugExec(exec); exec->transno--; #endif #ifdef MAX_PUSH if (exec->nbPush > MAX_PUSH) { return; } exec->nbPush++; #endif if (exec->maxRollbacks == 0) { exec->maxRollbacks = 4; exec->rollbacks = (xmlRegExecRollback *) xmlMalloc(exec->maxRollbacks * sizeof(xmlRegExecRollback)); if (exec->rollbacks == NULL) { xmlRegexpErrMemory(NULL, "saving regexp"); exec->maxRollbacks = 0; return; } memset(exec->rollbacks, 0, exec->maxRollbacks * sizeof(xmlRegExecRollback)); } else if (exec->nbRollbacks >= exec->maxRollbacks) { xmlRegExecRollback *tmp; int len = exec->maxRollbacks; exec->maxRollbacks *= 2; tmp = (xmlRegExecRollback *) xmlRealloc(exec->rollbacks, exec->maxRollbacks * sizeof(xmlRegExecRollback)); if (tmp == NULL) { xmlRegexpErrMemory(NULL, "saving regexp"); exec->maxRollbacks /= 2; return; } exec->rollbacks = tmp; tmp = &exec->rollbacks[len]; memset(tmp, 0, (exec->maxRollbacks - len) * sizeof(xmlRegExecRollback)); } exec->rollbacks[exec->nbRollbacks].state = exec->state; exec->rollbacks[exec->nbRollbacks].index = exec->index; exec->rollbacks[exec->nbRollbacks].nextbranch = exec->transno + 1; if (exec->comp->nbCounters > 0) { if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { exec->rollbacks[exec->nbRollbacks].counts = (int *) xmlMalloc(exec->comp->nbCounters * sizeof(int)); if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { xmlRegexpErrMemory(NULL, "saving regexp"); exec->status = -5; return; } } memcpy(exec->rollbacks[exec->nbRollbacks].counts, exec->counts, exec->comp->nbCounters * sizeof(int)); } exec->nbRollbacks++; } static void xmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { if (exec->nbRollbacks <= 0) { exec->status = -1; #ifdef DEBUG_REGEXP_EXEC printf("rollback failed on empty stack\n"); #endif return; } exec->nbRollbacks--; exec->state = exec->rollbacks[exec->nbRollbacks].state; exec->index = exec->rollbacks[exec->nbRollbacks].index; exec->transno = exec->rollbacks[exec->nbRollbacks].nextbranch; if (exec->comp->nbCounters > 0) { if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { fprintf(stderr, "exec save: allocation failed"); exec->status = -6; return; } memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts, exec->comp->nbCounters * sizeof(int)); } #ifdef DEBUG_REGEXP_EXEC printf("restored "); xmlFARegDebugExec(exec); #endif } /************************************************************************ * * * Verifier, running an input against a compiled regexp * * * ************************************************************************/ static int xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { xmlRegExecCtxt execval; xmlRegExecCtxtPtr exec = &execval; int ret, codepoint = 0, len, deter; exec->inputString = content; exec->index = 0; exec->nbPush = 0; exec->determinist = 1; exec->maxRollbacks = 0; exec->nbRollbacks = 0; exec->rollbacks = NULL; exec->status = 0; exec->comp = comp; exec->state = comp->states[0]; exec->transno = 0; exec->transcount = 0; exec->inputStack = NULL; exec->inputStackMax = 0; if (comp->nbCounters > 0) { exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int)); if (exec->counts == NULL) { xmlRegexpErrMemory(NULL, "running regexp"); return(-1); } memset(exec->counts, 0, comp->nbCounters * sizeof(int)); } else exec->counts = NULL; while ((exec->status == 0) && (exec->state != NULL) && ((exec->inputString[exec->index] != 0) || ((exec->state != NULL) && (exec->state->type != XML_REGEXP_FINAL_STATE)))) { xmlRegTransPtr trans; xmlRegAtomPtr atom; /* * If end of input on non-terminal state, rollback, however we may * still have epsilon like transition for counted transitions * on counters, in that case don't break too early. Additionally, * if we are working on a range like "AB{0,2}", where B is not present, * we don't want to break. */ len = 1; if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) { /* * if there is a transition, we must check if * atom allows minOccurs of 0 */ if (exec->transno < exec->state->nbTrans) { trans = &exec->state->trans[exec->transno]; if (trans->to >=0) { atom = trans->atom; if (!((atom->min == 0) && (atom->max > 0))) goto rollback; } } else goto rollback; } exec->transcount = 0; for (;exec->transno < exec->state->nbTrans;exec->transno++) { trans = &exec->state->trans[exec->transno]; if (trans->to < 0) continue; atom = trans->atom; ret = 0; deter = 1; if (trans->count >= 0) { int count; xmlRegCounterPtr counter; if (exec->counts == NULL) { exec->status = -1; goto error; } /* * A counted transition. */ count = exec->counts[trans->count]; counter = &exec->comp->counters[trans->count]; #ifdef DEBUG_REGEXP_EXEC printf("testing count %d: val %d, min %d, max %d\n", trans->count, count, counter->min, counter->max); #endif ret = ((count >= counter->min) && (count <= counter->max)); if ((ret) && (counter->min != counter->max)) deter = 0; } else if (atom == NULL) { fprintf(stderr, "epsilon transition left at runtime\n"); exec->status = -2; break; } else if (exec->inputString[exec->index] != 0) { codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); ret = xmlRegCheckCharacter(atom, codepoint); if ((ret == 1) && (atom->min >= 0) && (atom->max > 0)) { xmlRegStatePtr to = comp->states[trans->to]; /* * this is a multiple input sequence * If there is a counter associated increment it now. * before potentially saving and rollback * do not increment if the counter is already over the * maximum limit in which case get to next transition */ if (trans->counter >= 0) { xmlRegCounterPtr counter; if ((exec->counts == NULL) || (exec->comp == NULL) || (exec->comp->counters == NULL)) { exec->status = -1; goto error; } counter = &exec->comp->counters[trans->counter]; if (exec->counts[trans->counter] >= counter->max) continue; /* for loop on transitions */ #ifdef DEBUG_REGEXP_EXEC printf("Increasing count %d\n", trans->counter); #endif exec->counts[trans->counter]++; } if (exec->state->nbTrans > exec->transno + 1) { xmlFARegExecSave(exec); } exec->transcount = 1; do { /* * Try to progress as much as possible on the input */ if (exec->transcount == atom->max) { break; } exec->index += len; /* * End of input: stop here */ if (exec->inputString[exec->index] == 0) { exec->index -= len; break; } if (exec->transcount >= atom->min) { int transno = exec->transno; xmlRegStatePtr state = exec->state; /* * The transition is acceptable save it */ exec->transno = -1; /* trick */ exec->state = to; xmlFARegExecSave(exec); exec->transno = transno; exec->state = state; } codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); ret = xmlRegCheckCharacter(atom, codepoint); exec->transcount++; } while (ret == 1); if (exec->transcount < atom->min) ret = 0; /* * If the last check failed but one transition was found * possible, rollback */ if (ret < 0) ret = 0; if (ret == 0) { goto rollback; } if (trans->counter >= 0) { if (exec->counts == NULL) { exec->status = -1; goto error; } #ifdef DEBUG_REGEXP_EXEC printf("Decreasing count %d\n", trans->counter); #endif exec->counts[trans->counter]--; } } else if ((ret == 0) && (atom->min == 0) && (atom->max > 0)) { /* * we don't match on the codepoint, but minOccurs of 0 * says that's ok. Setting len to 0 inhibits stepping * over the codepoint. */ exec->transcount = 1; len = 0; ret = 1; } } else if ((atom->min == 0) && (atom->max > 0)) { /* another spot to match when minOccurs is 0 */ exec->transcount = 1; len = 0; ret = 1; } if (ret == 1) { if ((trans->nd == 1) || ((trans->count >= 0) && (deter == 0) && (exec->state->nbTrans > exec->transno + 1))) { #ifdef DEBUG_REGEXP_EXEC if (trans->nd == 1) printf("Saving on nd transition atom %d for %c at %d\n", trans->atom->no, codepoint, exec->index); else printf("Saving on counted transition count %d for %c at %d\n", trans->count, codepoint, exec->index); #endif xmlFARegExecSave(exec); } if (trans->counter >= 0) { xmlRegCounterPtr counter; /* make sure we don't go over the counter maximum value */ if ((exec->counts == NULL) || (exec->comp == NULL) || (exec->comp->counters == NULL)) { exec->status = -1; goto error; } counter = &exec->comp->counters[trans->counter]; if (exec->counts[trans->counter] >= counter->max) continue; /* for loop on transitions */ #ifdef DEBUG_REGEXP_EXEC printf("Increasing count %d\n", trans->counter); #endif exec->counts[trans->counter]++; } if ((trans->count >= 0) && (trans->count < REGEXP_ALL_COUNTER)) { if (exec->counts == NULL) { exec->status = -1; goto error; } #ifdef DEBUG_REGEXP_EXEC printf("resetting count %d on transition\n", trans->count); #endif exec->counts[trans->count] = 0; } #ifdef DEBUG_REGEXP_EXEC printf("entering state %d\n", trans->to); #endif exec->state = comp->states[trans->to]; exec->transno = 0; if (trans->atom != NULL) { exec->index += len; } goto progress; } else if (ret < 0) { exec->status = -4; break; } } if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { rollback: /* * Failed to find a way out */ exec->determinist = 0; #ifdef DEBUG_REGEXP_EXEC printf("rollback from state %d on %d:%c\n", exec->state->no, codepoint,codepoint); #endif xmlFARegExecRollBack(exec); } progress: continue; } error: if (exec->rollbacks != NULL) { if (exec->counts != NULL) { int i; for (i = 0;i < exec->maxRollbacks;i++) if (exec->rollbacks[i].counts != NULL) xmlFree(exec->rollbacks[i].counts); } xmlFree(exec->rollbacks); } if (exec->state == NULL) return(-1); if (exec->counts != NULL) xmlFree(exec->counts); if (exec->status == 0) return(1); if (exec->status == -1) { if (exec->nbPush > MAX_PUSH) return(-1); return(0); } return(exec->status); } /************************************************************************ * * * Progressive interface to the verifier one atom at a time * * * ************************************************************************/ #ifdef DEBUG_ERR static void testerr(xmlRegExecCtxtPtr exec); #endif /** * xmlRegNewExecCtxt: * @comp: a precompiled regular expression * @callback: a callback function used for handling progresses in the * automata matching phase * @data: the context data associated to the callback in this context * * Build a context used for progressive evaluation of a regexp. * * Returns the new context */ xmlRegExecCtxtPtr xmlRegNewExecCtxt(xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data) { xmlRegExecCtxtPtr exec; if (comp == NULL) return(NULL); if ((comp->compact == NULL) && (comp->states == NULL)) return(NULL); exec = (xmlRegExecCtxtPtr) xmlMalloc(sizeof(xmlRegExecCtxt)); if (exec == NULL) { xmlRegexpErrMemory(NULL, "creating execution context"); return(NULL); } memset(exec, 0, sizeof(xmlRegExecCtxt)); exec->inputString = NULL; exec->index = 0; exec->determinist = 1; exec->maxRollbacks = 0; exec->nbRollbacks = 0; exec->rollbacks = NULL; exec->status = 0; exec->comp = comp; if (comp->compact == NULL) exec->state = comp->states[0]; exec->transno = 0; exec->transcount = 0; exec->callback = callback; exec->data = data; if (comp->nbCounters > 0) { /* * For error handling, exec->counts is allocated twice the size * the second half is used to store the data in case of rollback */ exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int) * 2); if (exec->counts == NULL) { xmlRegexpErrMemory(NULL, "creating execution context"); xmlFree(exec); return(NULL); } memset(exec->counts, 0, comp->nbCounters * sizeof(int) * 2); exec->errCounts = &exec->counts[comp->nbCounters]; } else { exec->counts = NULL; exec->errCounts = NULL; } exec->inputStackMax = 0; exec->inputStackNr = 0; exec->inputStack = NULL; exec->errStateNo = -1; exec->errString = NULL; exec->nbPush = 0; return(exec); } /** * xmlRegFreeExecCtxt: * @exec: a regular expression evaulation context * * Free the structures associated to a regular expression evaulation context. */ void xmlRegFreeExecCtxt(xmlRegExecCtxtPtr exec) { if (exec == NULL) return; if (exec->rollbacks != NULL) { if (exec->counts != NULL) { int i; for (i = 0;i < exec->maxRollbacks;i++) if (exec->rollbacks[i].counts != NULL) xmlFree(exec->rollbacks[i].counts); } xmlFree(exec->rollbacks); } if (exec->counts != NULL) xmlFree(exec->counts); if (exec->inputStack != NULL) { int i; for (i = 0;i < exec->inputStackNr;i++) { if (exec->inputStack[i].value != NULL) xmlFree(exec->inputStack[i].value); } xmlFree(exec->inputStack); } if (exec->errString != NULL) xmlFree(exec->errString); xmlFree(exec); } static void xmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value, void *data) { #ifdef DEBUG_PUSH printf("saving value: %d:%s\n", exec->inputStackNr, value); #endif if (exec->inputStackMax == 0) { exec->inputStackMax = 4; exec->inputStack = (xmlRegInputTokenPtr) xmlMalloc(exec->inputStackMax * sizeof(xmlRegInputToken)); if (exec->inputStack == NULL) { xmlRegexpErrMemory(NULL, "pushing input string"); exec->inputStackMax = 0; return; } } else if (exec->inputStackNr + 1 >= exec->inputStackMax) { xmlRegInputTokenPtr tmp; exec->inputStackMax *= 2; tmp = (xmlRegInputTokenPtr) xmlRealloc(exec->inputStack, exec->inputStackMax * sizeof(xmlRegInputToken)); if (tmp == NULL) { xmlRegexpErrMemory(NULL, "pushing input string"); exec->inputStackMax /= 2; return; } exec->inputStack = tmp; } exec->inputStack[exec->inputStackNr].value = xmlStrdup(value); exec->inputStack[exec->inputStackNr].data = data; exec->inputStackNr++; exec->inputStack[exec->inputStackNr].value = NULL; exec->inputStack[exec->inputStackNr].data = NULL; } /** * xmlRegStrEqualWildcard: * @expStr: the string to be evaluated * @valStr: the validation string * * Checks if both strings are equal or have the same content. "*" * can be used as a wildcard in @valStr; "|" is used as a seperator of * substrings in both @expStr and @valStr. * * Returns 1 if the comparison is satisfied and the number of substrings * is equal, 0 otherwise. */ static int xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr) { if (expStr == valStr) return(1); if (expStr == NULL) return(0); if (valStr == NULL) return(0); do { /* * Eval if we have a wildcard for the current item. */ if (*expStr != *valStr) { /* if one of them starts with a wildcard make valStr be it */ if (*valStr == '*') { const xmlChar *tmp; tmp = valStr; valStr = expStr; expStr = tmp; } if ((*valStr != 0) && (*expStr != 0) && (*expStr++ == '*')) { do { if (*valStr == XML_REG_STRING_SEPARATOR) break; valStr++; } while (*valStr != 0); continue; } else return(0); } expStr++; valStr++; } while (*valStr != 0); if (*expStr != 0) return (0); else return (1); } /** * xmlRegCompactPushString: * @exec: a regexp execution context * @comp: the precompiled exec with a compact table * @value: a string token input * @data: data associated to the token to reuse in callbacks * * Push one input token in the execution context * * Returns: 1 if the regexp reached a final state, 0 if non-final, and * a negative value in case of error. */ static int xmlRegCompactPushString(xmlRegExecCtxtPtr exec, xmlRegexpPtr comp, const xmlChar *value, void *data) { int state = exec->index; int i, target; if ((comp == NULL) || (comp->compact == NULL) || (comp->stringMap == NULL)) return(-1); if (value == NULL) { /* * are we at a final state ? */ if (comp->compact[state * (comp->nbstrings + 1)] == XML_REGEXP_FINAL_STATE) return(1); return(0); } #ifdef DEBUG_PUSH printf("value pushed: %s\n", value); #endif /* * Examine all outside transitions from current state */ for (i = 0;i < comp->nbstrings;i++) { target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; if ((target > 0) && (target <= comp->nbstates)) { target--; /* to avoid 0 */ if (xmlRegStrEqualWildcard(comp->stringMap[i], value)) { exec->index = target; if ((exec->callback != NULL) && (comp->transdata != NULL)) { exec->callback(exec->data, value, comp->transdata[state * comp->nbstrings + i], data); } #ifdef DEBUG_PUSH printf("entering state %d\n", target); #endif if (comp->compact[target * (comp->nbstrings + 1)] == XML_REGEXP_SINK_STATE) goto error; if (comp->compact[target * (comp->nbstrings + 1)] == XML_REGEXP_FINAL_STATE) return(1); return(0); } } } /* * Failed to find an exit transition out from current state for the * current token */ #ifdef DEBUG_PUSH printf("failed to find a transition for %s on state %d\n", value, state); #endif error: if (exec->errString != NULL) xmlFree(exec->errString); exec->errString = xmlStrdup(value); exec->errStateNo = state; exec->status = -1; #ifdef DEBUG_ERR testerr(exec); #endif return(-1); } /** * xmlRegExecPushStringInternal: * @exec: a regexp execution context or NULL to indicate the end * @value: a string token input * @data: data associated to the token to reuse in callbacks * @compound: value was assembled from 2 strings * * Push one input token in the execution context * * Returns: 1 if the regexp reached a final state, 0 if non-final, and * a negative value in case of error. */ static int xmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value, void *data, int compound) { xmlRegTransPtr trans; xmlRegAtomPtr atom; int ret; int final = 0; int progress = 1; if (exec == NULL) return(-1); if (exec->comp == NULL) return(-1); if (exec->status != 0) return(exec->status); if (exec->comp->compact != NULL) return(xmlRegCompactPushString(exec, exec->comp, value, data)); if (value == NULL) { if (exec->state->type == XML_REGEXP_FINAL_STATE) return(1); final = 1; } #ifdef DEBUG_PUSH printf("value pushed: %s\n", value); #endif /* * If we have an active rollback stack push the new value there * and get back to where we were left */ if ((value != NULL) && (exec->inputStackNr > 0)) { xmlFARegExecSaveInputString(exec, value, data); value = exec->inputStack[exec->index].value; data = exec->inputStack[exec->index].data; #ifdef DEBUG_PUSH printf("value loaded: %s\n", value); #endif } while ((exec->status == 0) && ((value != NULL) || ((final == 1) && (exec->state->type != XML_REGEXP_FINAL_STATE)))) { /* * End of input on non-terminal state, rollback, however we may * still have epsilon like transition for counted transitions * on counters, in that case don't break too early. */ if ((value == NULL) && (exec->counts == NULL)) goto rollback; exec->transcount = 0; for (;exec->transno < exec->state->nbTrans;exec->transno++) { trans = &exec->state->trans[exec->transno]; if (trans->to < 0) continue; atom = trans->atom; ret = 0; if (trans->count == REGEXP_ALL_LAX_COUNTER) { int i; int count; xmlRegTransPtr t; xmlRegCounterPtr counter; ret = 0; #ifdef DEBUG_PUSH printf("testing all lax %d\n", trans->count); #endif /* * Check all counted transitions from the current state */ if ((value == NULL) && (final)) { ret = 1; } else if (value != NULL) { for (i = 0;i < exec->state->nbTrans;i++) { t = &exec->state->trans[i]; if ((t->counter < 0) || (t == trans)) continue; counter = &exec->comp->counters[t->counter]; count = exec->counts[t->counter]; if ((count < counter->max) && (t->atom != NULL) && (xmlStrEqual(value, t->atom->valuep))) { ret = 0; break; } if ((count >= counter->min) && (count < counter->max) && (t->atom != NULL) && (xmlStrEqual(value, t->atom->valuep))) { ret = 1; break; } } } } else if (trans->count == REGEXP_ALL_COUNTER) { int i; int count; xmlRegTransPtr t; xmlRegCounterPtr counter; ret = 1; #ifdef DEBUG_PUSH printf("testing all %d\n", trans->count); #endif /* * Check all counted transitions from the current state */ for (i = 0;i < exec->state->nbTrans;i++) { t = &exec->state->trans[i]; if ((t->counter < 0) || (t == trans)) continue; counter = &exec->comp->counters[t->counter]; count = exec->counts[t->counter]; if ((count < counter->min) || (count > counter->max)) { ret = 0; break; } } } else if (trans->count >= 0) { int count; xmlRegCounterPtr counter; /* * A counted transition. */ count = exec->counts[trans->count]; counter = &exec->comp->counters[trans->count]; #ifdef DEBUG_PUSH printf("testing count %d: val %d, min %d, max %d\n", trans->count, count, counter->min, counter->max); #endif ret = ((count >= counter->min) && (count <= counter->max)); } else if (atom == NULL) { fprintf(stderr, "epsilon transition left at runtime\n"); exec->status = -2; break; } else if (value != NULL) { ret = xmlRegStrEqualWildcard(atom->valuep, value); if (atom->neg) { ret = !ret; if (!compound) ret = 0; } if ((ret == 1) && (trans->counter >= 0)) { xmlRegCounterPtr counter; int count; count = exec->counts[trans->counter]; counter = &exec->comp->counters[trans->counter]; if (count >= counter->max) ret = 0; } if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { xmlRegStatePtr to = exec->comp->states[trans->to]; /* * this is a multiple input sequence */ if (exec->state->nbTrans > exec->transno + 1) { if (exec->inputStackNr <= 0) { xmlFARegExecSaveInputString(exec, value, data); } xmlFARegExecSave(exec); } exec->transcount = 1; do { /* * Try to progress as much as possible on the input */ if (exec->transcount == atom->max) { break; } exec->index++; value = exec->inputStack[exec->index].value; data = exec->inputStack[exec->index].data; #ifdef DEBUG_PUSH printf("value loaded: %s\n", value); #endif /* * End of input: stop here */ if (value == NULL) { exec->index --; break; } if (exec->transcount >= atom->min) { int transno = exec->transno; xmlRegStatePtr state = exec->state; /* * The transition is acceptable save it */ exec->transno = -1; /* trick */ exec->state = to; if (exec->inputStackNr <= 0) { xmlFARegExecSaveInputString(exec, value, data); } xmlFARegExecSave(exec); exec->transno = transno; exec->state = state; } ret = xmlStrEqual(value, atom->valuep); exec->transcount++; } while (ret == 1); if (exec->transcount < atom->min) ret = 0; /* * If the last check failed but one transition was found * possible, rollback */ if (ret < 0) ret = 0; if (ret == 0) { goto rollback; } } } if (ret == 1) { if ((exec->callback != NULL) && (atom != NULL) && (data != NULL)) { exec->callback(exec->data, atom->valuep, atom->data, data); } if (exec->state->nbTrans > exec->transno + 1) { if (exec->inputStackNr <= 0) { xmlFARegExecSaveInputString(exec, value, data); } xmlFARegExecSave(exec); } if (trans->counter >= 0) { #ifdef DEBUG_PUSH printf("Increasing count %d\n", trans->counter); #endif exec->counts[trans->counter]++; } if ((trans->count >= 0) && (trans->count < REGEXP_ALL_COUNTER)) { #ifdef DEBUG_REGEXP_EXEC printf("resetting count %d on transition\n", trans->count); #endif exec->counts[trans->count] = 0; } #ifdef DEBUG_PUSH printf("entering state %d\n", trans->to); #endif if ((exec->comp->states[trans->to] != NULL) && (exec->comp->states[trans->to]->type == XML_REGEXP_SINK_STATE)) { /* * entering a sink state, save the current state as error * state. */ if (exec->errString != NULL) xmlFree(exec->errString); exec->errString = xmlStrdup(value); exec->errState = exec->state; memcpy(exec->errCounts, exec->counts, exec->comp->nbCounters * sizeof(int)); } exec->state = exec->comp->states[trans->to]; exec->transno = 0; if (trans->atom != NULL) { if (exec->inputStack != NULL) { exec->index++; if (exec->index < exec->inputStackNr) { value = exec->inputStack[exec->index].value; data = exec->inputStack[exec->index].data; #ifdef DEBUG_PUSH printf("value loaded: %s\n", value); #endif } else { value = NULL; data = NULL; #ifdef DEBUG_PUSH printf("end of input\n"); #endif } } else { value = NULL; data = NULL; #ifdef DEBUG_PUSH printf("end of input\n"); #endif } } goto progress; } else if (ret < 0) { exec->status = -4; break; } } if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { rollback: /* * if we didn't yet rollback on the current input * store the current state as the error state. */ if ((progress) && (exec->state != NULL) && (exec->state->type != XML_REGEXP_SINK_STATE)) { progress = 0; if (exec->errString != NULL) xmlFree(exec->errString); exec->errString = xmlStrdup(value); exec->errState = exec->state; memcpy(exec->errCounts, exec->counts, exec->comp->nbCounters * sizeof(int)); } /* * Failed to find a way out */ exec->determinist = 0; xmlFARegExecRollBack(exec); if (exec->status == 0) { value = exec->inputStack[exec->index].value; data = exec->inputStack[exec->index].data; #ifdef DEBUG_PUSH printf("value loaded: %s\n", value); #endif } } continue; progress: progress = 1; continue; } if (exec->status == 0) { return(exec->state->type == XML_REGEXP_FINAL_STATE); } #ifdef DEBUG_ERR if (exec->status < 0) { testerr(exec); } #endif return(exec->status); } /** * xmlRegExecPushString: * @exec: a regexp execution context or NULL to indicate the end * @value: a string token input * @data: data associated to the token to reuse in callbacks * * Push one input token in the execution context * * Returns: 1 if the regexp reached a final state, 0 if non-final, and * a negative value in case of error. */ int xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, void *data) { return(xmlRegExecPushStringInternal(exec, value, data, 0)); } /** * xmlRegExecPushString2: * @exec: a regexp execution context or NULL to indicate the end * @value: the first string token input * @value2: the second string token input * @data: data associated to the token to reuse in callbacks * * Push one input token in the execution context * * Returns: 1 if the regexp reached a final state, 0 if non-final, and * a negative value in case of error. */ int xmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value, const xmlChar *value2, void *data) { xmlChar buf[150]; int lenn, lenp, ret; xmlChar *str; if (exec == NULL) return(-1); if (exec->comp == NULL) return(-1); if (exec->status != 0) return(exec->status); if (value2 == NULL) return(xmlRegExecPushString(exec, value, data)); lenn = strlen((char *) value2); lenp = strlen((char *) value); if (150 < lenn + lenp + 2) { str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); if (str == NULL) { exec->status = -1; return(-1); } } else { str = buf; } memcpy(&str[0], value, lenp); str[lenp] = XML_REG_STRING_SEPARATOR; memcpy(&str[lenp + 1], value2, lenn); str[lenn + lenp + 1] = 0; if (exec->comp->compact != NULL) ret = xmlRegCompactPushString(exec, exec->comp, str, data); else ret = xmlRegExecPushStringInternal(exec, str, data, 1); if (str != buf) xmlFree(str); return(ret); } /** * xmlRegExecGetValues: * @exec: a regexp execution context * @err: error extraction or normal one * @nbval: pointer to the number of accepted values IN/OUT * @nbneg: return number of negative transitions * @values: pointer to the array of acceptable values * @terminal: return value if this was a terminal state * * Extract informations from the regexp execution, internal routine to * implement xmlRegExecNextValues() and xmlRegExecErrInfo() * * Returns: 0 in case of success or -1 in case of error. */ static int xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, int *nbval, int *nbneg, xmlChar **values, int *terminal) { int maxval; int nb = 0; if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) || (values == NULL) || (*nbval <= 0)) return(-1); maxval = *nbval; *nbval = 0; *nbneg = 0; if ((exec->comp != NULL) && (exec->comp->compact != NULL)) { xmlRegexpPtr comp; int target, i, state; comp = exec->comp; if (err) { if (exec->errStateNo == -1) return(-1); state = exec->errStateNo; } else { state = exec->index; } if (terminal != NULL) { if (comp->compact[state * (comp->nbstrings + 1)] == XML_REGEXP_FINAL_STATE) *terminal = 1; else *terminal = 0; } for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; if ((target > 0) && (target <= comp->nbstates) && (comp->compact[(target - 1) * (comp->nbstrings + 1)] != XML_REGEXP_SINK_STATE)) { values[nb++] = comp->stringMap[i]; (*nbval)++; } } for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; if ((target > 0) && (target <= comp->nbstates) && (comp->compact[(target - 1) * (comp->nbstrings + 1)] == XML_REGEXP_SINK_STATE)) { values[nb++] = comp->stringMap[i]; (*nbneg)++; } } } else { int transno; xmlRegTransPtr trans; xmlRegAtomPtr atom; xmlRegStatePtr state; if (terminal != NULL) { if (exec->state->type == XML_REGEXP_FINAL_STATE) *terminal = 1; else *terminal = 0; } if (err) { if (exec->errState == NULL) return(-1); state = exec->errState; } else { if (exec->state == NULL) return(-1); state = exec->state; } for (transno = 0; (transno < state->nbTrans) && (nb < maxval); transno++) { trans = &state->trans[transno]; if (trans->to < 0) continue; atom = trans->atom; if ((atom == NULL) || (atom->valuep == NULL)) continue; if (trans->count == REGEXP_ALL_LAX_COUNTER) { /* this should not be reached but ... */ TODO; } else if (trans->count == REGEXP_ALL_COUNTER) { /* this should not be reached but ... */ TODO; } else if (trans->counter >= 0) { xmlRegCounterPtr counter = NULL; int count; if (err) count = exec->errCounts[trans->counter]; else count = exec->counts[trans->counter]; if (exec->comp != NULL) counter = &exec->comp->counters[trans->counter]; if ((counter == NULL) || (count < counter->max)) { if (atom->neg) values[nb++] = (xmlChar *) atom->valuep2; else values[nb++] = (xmlChar *) atom->valuep; (*nbval)++; } } else { if ((exec->comp->states[trans->to] != NULL) && (exec->comp->states[trans->to]->type != XML_REGEXP_SINK_STATE)) { if (atom->neg) values[nb++] = (xmlChar *) atom->valuep2; else values[nb++] = (xmlChar *) atom->valuep; (*nbval)++; } } } for (transno = 0; (transno < state->nbTrans) && (nb < maxval); transno++) { trans = &state->trans[transno]; if (trans->to < 0) continue; atom = trans->atom; if ((atom == NULL) || (atom->valuep == NULL)) continue; if (trans->count == REGEXP_ALL_LAX_COUNTER) { continue; } else if (trans->count == REGEXP_ALL_COUNTER) { continue; } else if (trans->counter >= 0) { continue; } else { if ((exec->comp->states[trans->to] != NULL) && (exec->comp->states[trans->to]->type == XML_REGEXP_SINK_STATE)) { if (atom->neg) values[nb++] = (xmlChar *) atom->valuep2; else values[nb++] = (xmlChar *) atom->valuep; (*nbneg)++; } } } } return(0); } /** * xmlRegExecNextValues: * @exec: a regexp execution context * @nbval: pointer to the number of accepted values IN/OUT * @nbneg: return number of negative transitions * @values: pointer to the array of acceptable values * @terminal: return value if this was a terminal state * * Extract informations from the regexp execution, * the parameter @values must point to an array of @nbval string pointers * on return nbval will contain the number of possible strings in that * state and the @values array will be updated with them. The string values * returned will be freed with the @exec context and don't need to be * deallocated. * * Returns: 0 in case of success or -1 in case of error. */ int xmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, int *nbneg, xmlChar **values, int *terminal) { return(xmlRegExecGetValues(exec, 0, nbval, nbneg, values, terminal)); } /** * xmlRegExecErrInfo: * @exec: a regexp execution context generating an error * @string: return value for the error string * @nbval: pointer to the number of accepted values IN/OUT * @nbneg: return number of negative transitions * @values: pointer to the array of acceptable values * @terminal: return value if this was a terminal state * * Extract error informations from the regexp execution, the parameter * @string will be updated with the value pushed and not accepted, * the parameter @values must point to an array of @nbval string pointers * on return nbval will contain the number of possible strings in that * state and the @values array will be updated with them. The string values * returned will be freed with the @exec context and don't need to be * deallocated. * * Returns: 0 in case of success or -1 in case of error. */ int xmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string, int *nbval, int *nbneg, xmlChar **values, int *terminal) { if (exec == NULL) return(-1); if (string != NULL) { if (exec->status != 0) *string = exec->errString; else *string = NULL; } return(xmlRegExecGetValues(exec, 1, nbval, nbneg, values, terminal)); } #ifdef DEBUG_ERR static void testerr(xmlRegExecCtxtPtr exec) { const xmlChar *string; xmlChar *values[5]; int nb = 5; int nbneg; int terminal; xmlRegExecErrInfo(exec, &string, &nb, &nbneg, &values[0], &terminal); } #endif #if 0 static int xmlRegExecPushChar(xmlRegExecCtxtPtr exec, int UCS) { xmlRegTransPtr trans; xmlRegAtomPtr atom; int ret; int codepoint, len; if (exec == NULL) return(-1); if (exec->status != 0) return(exec->status); while ((exec->status == 0) && ((exec->inputString[exec->index] != 0) || (exec->state->type != XML_REGEXP_FINAL_STATE))) { /* * End of input on non-terminal state, rollback, however we may * still have epsilon like transition for counted transitions * on counters, in that case don't break too early. */ if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) goto rollback; exec->transcount = 0; for (;exec->transno < exec->state->nbTrans;exec->transno++) { trans = &exec->state->trans[exec->transno]; if (trans->to < 0) continue; atom = trans->atom; ret = 0; if (trans->count >= 0) { int count; xmlRegCounterPtr counter; /* * A counted transition. */ count = exec->counts[trans->count]; counter = &exec->comp->counters[trans->count]; #ifdef DEBUG_REGEXP_EXEC printf("testing count %d: val %d, min %d, max %d\n", trans->count, count, counter->min, counter->max); #endif ret = ((count >= counter->min) && (count <= counter->max)); } else if (atom == NULL) { fprintf(stderr, "epsilon transition left at runtime\n"); exec->status = -2; break; } else if (exec->inputString[exec->index] != 0) { codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); ret = xmlRegCheckCharacter(atom, codepoint); if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { xmlRegStatePtr to = exec->comp->states[trans->to]; /* * this is a multiple input sequence */ if (exec->state->nbTrans > exec->transno + 1) { xmlFARegExecSave(exec); } exec->transcount = 1; do { /* * Try to progress as much as possible on the input */ if (exec->transcount == atom->max) { break; } exec->index += len; /* * End of input: stop here */ if (exec->inputString[exec->index] == 0) { exec->index -= len; break; } if (exec->transcount >= atom->min) { int transno = exec->transno; xmlRegStatePtr state = exec->state; /* * The transition is acceptable save it */ exec->transno = -1; /* trick */ exec->state = to; xmlFARegExecSave(exec); exec->transno = transno; exec->state = state; } codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); ret = xmlRegCheckCharacter(atom, codepoint); exec->transcount++; } while (ret == 1); if (exec->transcount < atom->min) ret = 0; /* * If the last check failed but one transition was found * possible, rollback */ if (ret < 0) ret = 0; if (ret == 0) { goto rollback; } } } if (ret == 1) { if (exec->state->nbTrans > exec->transno + 1) { xmlFARegExecSave(exec); } /* * restart count for expressions like this ((abc){2})* */ if (trans->count >= 0) { #ifdef DEBUG_REGEXP_EXEC printf("Reset count %d\n", trans->count); #endif exec->counts[trans->count] = 0; } if (trans->counter >= 0) { #ifdef DEBUG_REGEXP_EXEC printf("Increasing count %d\n", trans->counter); #endif exec->counts[trans->counter]++; } #ifdef DEBUG_REGEXP_EXEC printf("entering state %d\n", trans->to); #endif exec->state = exec->comp->states[trans->to]; exec->transno = 0; if (trans->atom != NULL) { exec->index += len; } goto progress; } else if (ret < 0) { exec->status = -4; break; } } if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { rollback: /* * Failed to find a way out */ exec->determinist = 0; xmlFARegExecRollBack(exec); } progress: continue; } } #endif /************************************************************************ * * * Parser for the Schemas Datatype Regular Expressions * * http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#regexs * * * ************************************************************************/ /** * xmlFAIsChar: * @ctxt: a regexp parser context * * [10] Char ::= [^.\?*+()|#x5B#x5D] */ static int xmlFAIsChar(xmlRegParserCtxtPtr ctxt) { int cur; int len; cur = CUR_SCHAR(ctxt->cur, len); if ((cur == '.') || (cur == '\\') || (cur == '?') || (cur == '*') || (cur == '+') || (cur == '(') || (cur == ')') || (cur == '|') || (cur == 0x5B) || (cur == 0x5D) || (cur == 0)) return(-1); return(cur); } /** * xmlFAParseCharProp: * @ctxt: a regexp parser context * * [27] charProp ::= IsCategory | IsBlock * [28] IsCategory ::= Letters | Marks | Numbers | Punctuation | * Separators | Symbols | Others * [29] Letters ::= 'L' [ultmo]? * [30] Marks ::= 'M' [nce]? * [31] Numbers ::= 'N' [dlo]? * [32] Punctuation ::= 'P' [cdseifo]? * [33] Separators ::= 'Z' [slp]? * [34] Symbols ::= 'S' [mcko]? * [35] Others ::= 'C' [cfon]? * [36] IsBlock ::= 'Is' [a-zA-Z0-9#x2D]+ */ static void xmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { int cur; xmlRegAtomType type = (xmlRegAtomType) 0; xmlChar *blockName = NULL; cur = CUR; if (cur == 'L') { NEXT; cur = CUR; if (cur == 'u') { NEXT; type = XML_REGEXP_LETTER_UPPERCASE; } else if (cur == 'l') { NEXT; type = XML_REGEXP_LETTER_LOWERCASE; } else if (cur == 't') { NEXT; type = XML_REGEXP_LETTER_TITLECASE; } else if (cur == 'm') { NEXT; type = XML_REGEXP_LETTER_MODIFIER; } else if (cur == 'o') { NEXT; type = XML_REGEXP_LETTER_OTHERS; } else { type = XML_REGEXP_LETTER; } } else if (cur == 'M') { NEXT; cur = CUR; if (cur == 'n') { NEXT; /* nonspacing */ type = XML_REGEXP_MARK_NONSPACING; } else if (cur == 'c') { NEXT; /* spacing combining */ type = XML_REGEXP_MARK_SPACECOMBINING; } else if (cur == 'e') { NEXT; /* enclosing */ type = XML_REGEXP_MARK_ENCLOSING; } else { /* all marks */ type = XML_REGEXP_MARK; } } else if (cur == 'N') { NEXT; cur = CUR; if (cur == 'd') { NEXT; /* digital */ type = XML_REGEXP_NUMBER_DECIMAL; } else if (cur == 'l') { NEXT; /* letter */ type = XML_REGEXP_NUMBER_LETTER; } else if (cur == 'o') { NEXT; /* other */ type = XML_REGEXP_NUMBER_OTHERS; } else { /* all numbers */ type = XML_REGEXP_NUMBER; } } else if (cur == 'P') { NEXT; cur = CUR; if (cur == 'c') { NEXT; /* connector */ type = XML_REGEXP_PUNCT_CONNECTOR; } else if (cur == 'd') { NEXT; /* dash */ type = XML_REGEXP_PUNCT_DASH; } else if (cur == 's') { NEXT; /* open */ type = XML_REGEXP_PUNCT_OPEN; } else if (cur == 'e') { NEXT; /* close */ type = XML_REGEXP_PUNCT_CLOSE; } else if (cur == 'i') { NEXT; /* initial quote */ type = XML_REGEXP_PUNCT_INITQUOTE; } else if (cur == 'f') { NEXT; /* final quote */ type = XML_REGEXP_PUNCT_FINQUOTE; } else if (cur == 'o') { NEXT; /* other */ type = XML_REGEXP_PUNCT_OTHERS; } else { /* all punctuation */ type = XML_REGEXP_PUNCT; } } else if (cur == 'Z') { NEXT; cur = CUR; if (cur == 's') { NEXT; /* space */ type = XML_REGEXP_SEPAR_SPACE; } else if (cur == 'l') { NEXT; /* line */ type = XML_REGEXP_SEPAR_LINE; } else if (cur == 'p') { NEXT; /* paragraph */ type = XML_REGEXP_SEPAR_PARA; } else { /* all separators */ type = XML_REGEXP_SEPAR; } } else if (cur == 'S') { NEXT; cur = CUR; if (cur == 'm') { NEXT; type = XML_REGEXP_SYMBOL_MATH; /* math */ } else if (cur == 'c') { NEXT; type = XML_REGEXP_SYMBOL_CURRENCY; /* currency */ } else if (cur == 'k') { NEXT; type = XML_REGEXP_SYMBOL_MODIFIER; /* modifiers */ } else if (cur == 'o') { NEXT; type = XML_REGEXP_SYMBOL_OTHERS; /* other */ } else { /* all symbols */ type = XML_REGEXP_SYMBOL; } } else if (cur == 'C') { NEXT; cur = CUR; if (cur == 'c') { NEXT; /* control */ type = XML_REGEXP_OTHER_CONTROL; } else if (cur == 'f') { NEXT; /* format */ type = XML_REGEXP_OTHER_FORMAT; } else if (cur == 'o') { NEXT; /* private use */ type = XML_REGEXP_OTHER_PRIVATE; } else if (cur == 'n') { NEXT; /* not assigned */ type = XML_REGEXP_OTHER_NA; } else { /* all others */ type = XML_REGEXP_OTHER; } } else if (cur == 'I') { const xmlChar *start; NEXT; cur = CUR; if (cur != 's') { ERROR("IsXXXX expected"); return; } NEXT; start = ctxt->cur; cur = CUR; if (((cur >= 'a') && (cur <= 'z')) || ((cur >= 'A') && (cur <= 'Z')) || ((cur >= '0') && (cur <= '9')) || (cur == 0x2D)) { NEXT; cur = CUR; while (((cur >= 'a') && (cur <= 'z')) || ((cur >= 'A') && (cur <= 'Z')) || ((cur >= '0') && (cur <= '9')) || (cur == 0x2D)) { NEXT; cur = CUR; } } type = XML_REGEXP_BLOCK_NAME; blockName = xmlStrndup(start, ctxt->cur - start); } else { ERROR("Unknown char property"); return; } if (ctxt->atom == NULL) { ctxt->atom = xmlRegNewAtom(ctxt, type); if (ctxt->atom != NULL) ctxt->atom->valuep = blockName; } else if (ctxt->atom->type == XML_REGEXP_RANGES) { xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, type, 0, 0, blockName); } } /** * xmlFAParseCharClassEsc: * @ctxt: a regexp parser context * * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) * [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E] * [25] catEsc ::= '\p{' charProp '}' * [26] complEsc ::= '\P{' charProp '}' * [37] MultiCharEsc ::= '.' | ('\' [sSiIcCdDwW]) */ static void xmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { int cur; if (CUR == '.') { if (ctxt->atom == NULL) { ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_ANYCHAR); } else if (ctxt->atom->type == XML_REGEXP_RANGES) { xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, XML_REGEXP_ANYCHAR, 0, 0, NULL); } NEXT; return; } if (CUR != '\\') { ERROR("Escaped sequence: expecting \\"); return; } NEXT; cur = CUR; if (cur == 'p') { NEXT; if (CUR != '{') { ERROR("Expecting '{'"); return; } NEXT; xmlFAParseCharProp(ctxt); if (CUR != '}') { ERROR("Expecting '}'"); return; } NEXT; } else if (cur == 'P') { NEXT; if (CUR != '{') { ERROR("Expecting '{'"); return; } NEXT; xmlFAParseCharProp(ctxt); ctxt->atom->neg = 1; if (CUR != '}') { ERROR("Expecting '}'"); return; } NEXT; } else if ((cur == 'n') || (cur == 'r') || (cur == 't') || (cur == '\\') || (cur == '|') || (cur == '.') || (cur == '?') || (cur == '*') || (cur == '+') || (cur == '(') || (cur == ')') || (cur == '{') || (cur == '}') || (cur == 0x2D) || (cur == 0x5B) || (cur == 0x5D) || (cur == 0x5E)) { if (ctxt->atom == NULL) { ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); if (ctxt->atom != NULL) { switch (cur) { case 'n': ctxt->atom->codepoint = '\n'; break; case 'r': ctxt->atom->codepoint = '\r'; break; case 't': ctxt->atom->codepoint = '\t'; break; default: ctxt->atom->codepoint = cur; } } } else if (ctxt->atom->type == XML_REGEXP_RANGES) { switch (cur) { case 'n': cur = '\n'; break; case 'r': cur = '\r'; break; case 't': cur = '\t'; break; } xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, XML_REGEXP_CHARVAL, cur, cur, NULL); } NEXT; } else if ((cur == 's') || (cur == 'S') || (cur == 'i') || (cur == 'I') || (cur == 'c') || (cur == 'C') || (cur == 'd') || (cur == 'D') || (cur == 'w') || (cur == 'W')) { xmlRegAtomType type = XML_REGEXP_ANYSPACE; switch (cur) { case 's': type = XML_REGEXP_ANYSPACE; break; case 'S': type = XML_REGEXP_NOTSPACE; break; case 'i': type = XML_REGEXP_INITNAME; break; case 'I': type = XML_REGEXP_NOTINITNAME; break; case 'c': type = XML_REGEXP_NAMECHAR; break; case 'C': type = XML_REGEXP_NOTNAMECHAR; break; case 'd': type = XML_REGEXP_DECIMAL; break; case 'D': type = XML_REGEXP_NOTDECIMAL; break; case 'w': type = XML_REGEXP_REALCHAR; break; case 'W': type = XML_REGEXP_NOTREALCHAR; break; } NEXT; if (ctxt->atom == NULL) { ctxt->atom = xmlRegNewAtom(ctxt, type); } else if (ctxt->atom->type == XML_REGEXP_RANGES) { xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, type, 0, 0, NULL); } } else { ERROR("Wrong escape sequence, misuse of character '\\'"); } } /** * xmlFAParseCharRange: * @ctxt: a regexp parser context * * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash * [18] seRange ::= charOrEsc '-' charOrEsc * [20] charOrEsc ::= XmlChar | SingleCharEsc * [21] XmlChar ::= [^\#x2D#x5B#x5D] * [22] XmlCharIncDash ::= [^\#x5B#x5D] */ static void xmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) { int cur, len; int start = -1; int end = -1; if (CUR == '\0') { ERROR("Expecting ']'"); return; } cur = CUR; if (cur == '\\') { NEXT; cur = CUR; switch (cur) { case 'n': start = 0xA; break; case 'r': start = 0xD; break; case 't': start = 0x9; break; case '\\': case '|': case '.': case '-': case '^': case '?': case '*': case '+': case '{': case '}': case '(': case ')': case '[': case ']': start = cur; break; default: ERROR("Invalid escape value"); return; } end = start; len = 1; } else if ((cur != 0x5B) && (cur != 0x5D)) { end = start = CUR_SCHAR(ctxt->cur, len); } else { ERROR("Expecting a char range"); return; } /* * Since we are "inside" a range, we can assume ctxt->cur is past * the start of ctxt->string, and PREV should be safe */ if ((start == '-') && (NXT(1) != ']') && (PREV != '[') && (PREV != '^')) { NEXTL(len); return; } NEXTL(len); cur = CUR; if ((cur != '-') || (NXT(1) == ']')) { xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, XML_REGEXP_CHARVAL, start, end, NULL); return; } NEXT; cur = CUR; if (cur == '\\') { NEXT; cur = CUR; switch (cur) { case 'n': end = 0xA; break; case 'r': end = 0xD; break; case 't': end = 0x9; break; case '\\': case '|': case '.': case '-': case '^': case '?': case '*': case '+': case '{': case '}': case '(': case ')': case '[': case ']': end = cur; break; default: ERROR("Invalid escape value"); return; } len = 1; } else if ((cur != 0x5B) && (cur != 0x5D)) { end = CUR_SCHAR(ctxt->cur, len); } else { ERROR("Expecting the end of a char range"); return; } NEXTL(len); /* TODO check that the values are acceptable character ranges for XML */ if (end < start) { ERROR("End of range is before start of range"); } else { xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, XML_REGEXP_CHARVAL, start, end, NULL); } return; } /** * xmlFAParsePosCharGroup: * @ctxt: a regexp parser context * * [14] posCharGroup ::= ( charRange | charClassEsc )+ */ static void xmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) { do { if (CUR == '\\') { xmlFAParseCharClassEsc(ctxt); } else { xmlFAParseCharRange(ctxt); } } while ((CUR != ']') && (CUR != '^') && (CUR != '-') && (CUR != 0) && (ctxt->error == 0)); } /** * xmlFAParseCharGroup: * @ctxt: a regexp parser context * * [13] charGroup ::= posCharGroup | negCharGroup | charClassSub * [15] negCharGroup ::= '^' posCharGroup * [16] charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr * [12] charClassExpr ::= '[' charGroup ']' */ static void xmlFAParseCharGroup(xmlRegParserCtxtPtr ctxt) { int n = ctxt->neg; while ((CUR != ']') && (ctxt->error == 0)) { if (CUR == '^') { int neg = ctxt->neg; NEXT; ctxt->neg = !ctxt->neg; xmlFAParsePosCharGroup(ctxt); ctxt->neg = neg; } else if ((CUR == '-') && (NXT(1) == '[')) { int neg = ctxt->neg; ctxt->neg = 2; NEXT; /* eat the '-' */ NEXT; /* eat the '[' */ xmlFAParseCharGroup(ctxt); if (CUR == ']') { NEXT; } else { ERROR("charClassExpr: ']' expected"); break; } ctxt->neg = neg; break; } else if (CUR != ']') { xmlFAParsePosCharGroup(ctxt); } } ctxt->neg = n; } /** * xmlFAParseCharClass: * @ctxt: a regexp parser context * * [11] charClass ::= charClassEsc | charClassExpr * [12] charClassExpr ::= '[' charGroup ']' */ static void xmlFAParseCharClass(xmlRegParserCtxtPtr ctxt) { if (CUR == '[') { NEXT; ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_RANGES); if (ctxt->atom == NULL) return; xmlFAParseCharGroup(ctxt); if (CUR == ']') { NEXT; } else { ERROR("xmlFAParseCharClass: ']' expected"); } } else { xmlFAParseCharClassEsc(ctxt); } } /** * xmlFAParseQuantExact: * @ctxt: a regexp parser context * * [8] QuantExact ::= [0-9]+ * * Returns 0 if success or -1 in case of error */ static int xmlFAParseQuantExact(xmlRegParserCtxtPtr ctxt) { int ret = 0; int ok = 0; while ((CUR >= '0') && (CUR <= '9')) { ret = ret * 10 + (CUR - '0'); ok = 1; NEXT; } if (ok != 1) { return(-1); } return(ret); } /** * xmlFAParseQuantifier: * @ctxt: a regexp parser context * * [4] quantifier ::= [?*+] | ( '{' quantity '}' ) * [5] quantity ::= quantRange | quantMin | QuantExact * [6] quantRange ::= QuantExact ',' QuantExact * [7] quantMin ::= QuantExact ',' * [8] QuantExact ::= [0-9]+ */ static int xmlFAParseQuantifier(xmlRegParserCtxtPtr ctxt) { int cur; cur = CUR; if ((cur == '?') || (cur == '*') || (cur == '+')) { if (ctxt->atom != NULL) { if (cur == '?') ctxt->atom->quant = XML_REGEXP_QUANT_OPT; else if (cur == '*') ctxt->atom->quant = XML_REGEXP_QUANT_MULT; else if (cur == '+') ctxt->atom->quant = XML_REGEXP_QUANT_PLUS; } NEXT; return(1); } if (cur == '{') { int min = 0, max = 0; NEXT; cur = xmlFAParseQuantExact(ctxt); if (cur >= 0) min = cur; if (CUR == ',') { NEXT; if (CUR == '}') max = INT_MAX; else { cur = xmlFAParseQuantExact(ctxt); if (cur >= 0) max = cur; else { ERROR("Improper quantifier"); } } } if (CUR == '}') { NEXT; } else { ERROR("Unterminated quantifier"); } if (max == 0) max = min; if (ctxt->atom != NULL) { ctxt->atom->quant = XML_REGEXP_QUANT_RANGE; ctxt->atom->min = min; ctxt->atom->max = max; } return(1); } return(0); } /** * xmlFAParseAtom: * @ctxt: a regexp parser context * * [9] atom ::= Char | charClass | ( '(' regExp ')' ) */ static int xmlFAParseAtom(xmlRegParserCtxtPtr ctxt) { int codepoint, len; codepoint = xmlFAIsChar(ctxt); if (codepoint > 0) { ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); if (ctxt->atom == NULL) return(-1); codepoint = CUR_SCHAR(ctxt->cur, len); ctxt->atom->codepoint = codepoint; NEXTL(len); return(1); } else if (CUR == '|') { return(0); } else if (CUR == 0) { return(0); } else if (CUR == ')') { return(0); } else if (CUR == '(') { xmlRegStatePtr start, oldend, start0; NEXT; /* * this extra Epsilon transition is needed if we count with 0 allowed * unfortunately this can't be known at that point */ xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); start0 = ctxt->state; xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); start = ctxt->state; oldend = ctxt->end; ctxt->end = NULL; ctxt->atom = NULL; xmlFAParseRegExp(ctxt, 0); if (CUR == ')') { NEXT; } else { ERROR("xmlFAParseAtom: expecting ')'"); } ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_SUBREG); if (ctxt->atom == NULL) return(-1); ctxt->atom->start = start; ctxt->atom->start0 = start0; ctxt->atom->stop = ctxt->state; ctxt->end = oldend; return(1); } else if ((CUR == '[') || (CUR == '\\') || (CUR == '.')) { xmlFAParseCharClass(ctxt); return(1); } return(0); } /** * xmlFAParsePiece: * @ctxt: a regexp parser context * * [3] piece ::= atom quantifier? */ static int xmlFAParsePiece(xmlRegParserCtxtPtr ctxt) { int ret; ctxt->atom = NULL; ret = xmlFAParseAtom(ctxt); if (ret == 0) return(0); if (ctxt->atom == NULL) { ERROR("internal: no atom generated"); } xmlFAParseQuantifier(ctxt); return(1); } /** * xmlFAParseBranch: * @ctxt: a regexp parser context * @to: optional target to the end of the branch * * @to is used to optimize by removing duplicate path in automata * in expressions like (a|b)(c|d) * * [2] branch ::= piece* */ static int xmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) { xmlRegStatePtr previous; int ret; previous = ctxt->state; ret = xmlFAParsePiece(ctxt); if (ret != 0) { if (xmlFAGenerateTransitions(ctxt, previous, (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) return(-1); previous = ctxt->state; ctxt->atom = NULL; } while ((ret != 0) && (ctxt->error == 0)) { ret = xmlFAParsePiece(ctxt); if (ret != 0) { if (xmlFAGenerateTransitions(ctxt, previous, (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) return(-1); previous = ctxt->state; ctxt->atom = NULL; } } return(0); } /** * xmlFAParseRegExp: * @ctxt: a regexp parser context * @top: is this the top-level expression ? * * [1] regExp ::= branch ( '|' branch )* */ static void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) { xmlRegStatePtr start, end; /* if not top start should have been generated by an epsilon trans */ start = ctxt->state; ctxt->end = NULL; xmlFAParseBranch(ctxt, NULL); if (top) { #ifdef DEBUG_REGEXP_GRAPH printf("State %d is final\n", ctxt->state->no); #endif ctxt->state->type = XML_REGEXP_FINAL_STATE; } if (CUR != '|') { ctxt->end = ctxt->state; return; } end = ctxt->state; while ((CUR == '|') && (ctxt->error == 0)) { NEXT; if (CUR == 0) { ERROR("expecting a branch after |") return; } ctxt->state = start; ctxt->end = NULL; xmlFAParseBranch(ctxt, end); } if (!top) { ctxt->state = end; ctxt->end = end; } } /************************************************************************ * * * The basic API * * * ************************************************************************/ /** * xmlRegexpPrint: * @output: the file for the output debug * @regexp: the compiled regexp * * Print the content of the compiled regular expression */ void xmlRegexpPrint(FILE *output, xmlRegexpPtr regexp) { int i; if (output == NULL) return; fprintf(output, " regexp: "); if (regexp == NULL) { fprintf(output, "NULL\n"); return; } fprintf(output, "'%s' ", regexp->string); fprintf(output, "\n"); fprintf(output, "%d atoms:\n", regexp->nbAtoms); for (i = 0;i < regexp->nbAtoms; i++) { fprintf(output, " %02d ", i); xmlRegPrintAtom(output, regexp->atoms[i]); } fprintf(output, "%d states:", regexp->nbStates); fprintf(output, "\n"); for (i = 0;i < regexp->nbStates; i++) { xmlRegPrintState(output, regexp->states[i]); } fprintf(output, "%d counters:\n", regexp->nbCounters); for (i = 0;i < regexp->nbCounters; i++) { fprintf(output, " %d: min %d max %d\n", i, regexp->counters[i].min, regexp->counters[i].max); } } /** * xmlRegexpCompile: * @regexp: a regular expression string * * Parses a regular expression conforming to XML Schemas Part 2 Datatype * Appendix F and builds an automata suitable for testing strings against * that regular expression * * Returns the compiled expression or NULL in case of error */ xmlRegexpPtr xmlRegexpCompile(const xmlChar *regexp) { xmlRegexpPtr ret; xmlRegParserCtxtPtr ctxt; ctxt = xmlRegNewParserCtxt(regexp); if (ctxt == NULL) return(NULL); /* initialize the parser */ ctxt->end = NULL; ctxt->start = ctxt->state = xmlRegNewState(ctxt); xmlRegStatePush(ctxt, ctxt->start); /* parse the expression building an automata */ xmlFAParseRegExp(ctxt, 1); if (CUR != 0) { ERROR("xmlFAParseRegExp: extra characters"); } if (ctxt->error != 0) { xmlRegFreeParserCtxt(ctxt); return(NULL); } ctxt->end = ctxt->state; ctxt->start->type = XML_REGEXP_START_STATE; ctxt->end->type = XML_REGEXP_FINAL_STATE; /* remove the Epsilon except for counted transitions */ xmlFAEliminateEpsilonTransitions(ctxt); if (ctxt->error != 0) { xmlRegFreeParserCtxt(ctxt); return(NULL); } ret = xmlRegEpxFromParse(ctxt); xmlRegFreeParserCtxt(ctxt); return(ret); } /** * xmlRegexpExec: * @comp: the compiled regular expression * @content: the value to check against the regular expression * * Check if the regular expression generates the value * * Returns 1 if it matches, 0 if not and a negative value in case of error */ int xmlRegexpExec(xmlRegexpPtr comp, const xmlChar *content) { if ((comp == NULL) || (content == NULL)) return(-1); return(xmlFARegExec(comp, content)); } /** * xmlRegexpIsDeterminist: * @comp: the compiled regular expression * * Check if the regular expression is determinist * * Returns 1 if it yes, 0 if not and a negative value in case of error */ int xmlRegexpIsDeterminist(xmlRegexpPtr comp) { xmlAutomataPtr am; int ret; if (comp == NULL) return(-1); if (comp->determinist != -1) return(comp->determinist); am = xmlNewAutomata(); if (am->states != NULL) { int i; for (i = 0;i < am->nbStates;i++) xmlRegFreeState(am->states[i]); xmlFree(am->states); } am->nbAtoms = comp->nbAtoms; am->atoms = comp->atoms; am->nbStates = comp->nbStates; am->states = comp->states; am->determinist = -1; am->flags = comp->flags; ret = xmlFAComputesDeterminism(am); am->atoms = NULL; am->states = NULL; xmlFreeAutomata(am); comp->determinist = ret; return(ret); } /** * xmlRegFreeRegexp: * @regexp: the regexp * * Free a regexp */ void xmlRegFreeRegexp(xmlRegexpPtr regexp) { int i; if (regexp == NULL) return; if (regexp->string != NULL) xmlFree(regexp->string); if (regexp->states != NULL) { for (i = 0;i < regexp->nbStates;i++) xmlRegFreeState(regexp->states[i]); xmlFree(regexp->states); } if (regexp->atoms != NULL) { for (i = 0;i < regexp->nbAtoms;i++) xmlRegFreeAtom(regexp->atoms[i]); xmlFree(regexp->atoms); } if (regexp->counters != NULL) xmlFree(regexp->counters); if (regexp->compact != NULL) xmlFree(regexp->compact); if (regexp->transdata != NULL) xmlFree(regexp->transdata); if (regexp->stringMap != NULL) { for (i = 0; i < regexp->nbstrings;i++) xmlFree(regexp->stringMap[i]); xmlFree(regexp->stringMap); } xmlFree(regexp); } #ifdef LIBXML_AUTOMATA_ENABLED /************************************************************************ * * * The Automata interface * * * ************************************************************************/ /** * xmlNewAutomata: * * Create a new automata * * Returns the new object or NULL in case of failure */ xmlAutomataPtr xmlNewAutomata(void) { xmlAutomataPtr ctxt; ctxt = xmlRegNewParserCtxt(NULL); if (ctxt == NULL) return(NULL); /* initialize the parser */ ctxt->end = NULL; ctxt->start = ctxt->state = xmlRegNewState(ctxt); if (ctxt->start == NULL) { xmlFreeAutomata(ctxt); return(NULL); } ctxt->start->type = XML_REGEXP_START_STATE; if (xmlRegStatePush(ctxt, ctxt->start) < 0) { xmlRegFreeState(ctxt->start); xmlFreeAutomata(ctxt); return(NULL); } ctxt->flags = 0; return(ctxt); } /** * xmlFreeAutomata: * @am: an automata * * Free an automata */ void xmlFreeAutomata(xmlAutomataPtr am) { if (am == NULL) return; xmlRegFreeParserCtxt(am); } /** * xmlAutomataSetFlags: * @am: an automata * @flags: a set of internal flags * * Set some flags on the automata */ void xmlAutomataSetFlags(xmlAutomataPtr am, int flags) { if (am == NULL) return; am->flags |= flags; } /** * xmlAutomataGetInitState: * @am: an automata * * Initial state lookup * * Returns the initial state of the automata */ xmlAutomataStatePtr xmlAutomataGetInitState(xmlAutomataPtr am) { if (am == NULL) return(NULL); return(am->start); } /** * xmlAutomataSetFinalState: * @am: an automata * @state: a state in this automata * * Makes that state a final state * * Returns 0 or -1 in case of error */ int xmlAutomataSetFinalState(xmlAutomataPtr am, xmlAutomataStatePtr state) { if ((am == NULL) || (state == NULL)) return(-1); state->type = XML_REGEXP_FINAL_STATE; return(0); } /** * xmlAutomataNewTransition: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @token: the input string associated to that transition * @data: data passed to the callback function if the transition is activated * * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by the value of @token * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewTransition(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, void *data) { xmlRegAtomPtr atom; if ((am == NULL) || (from == NULL) || (token == NULL)) return(NULL); atom = xmlRegNewAtom(am, XML_REGEXP_STRING); if (atom == NULL) return(NULL); atom->data = data; if (atom == NULL) return(NULL); atom->valuep = xmlStrdup(token); if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { xmlRegFreeAtom(atom); return(NULL); } if (to == NULL) return(am->state); return(to); } /** * xmlAutomataNewTransition2: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @token: the first input string associated to that transition * @token2: the second input string associated to that transition * @data: data passed to the callback function if the transition is activated * * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by the value of @token * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewTransition2(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, void *data) { xmlRegAtomPtr atom; if ((am == NULL) || (from == NULL) || (token == NULL)) return(NULL); atom = xmlRegNewAtom(am, XML_REGEXP_STRING); if (atom == NULL) return(NULL); atom->data = data; if ((token2 == NULL) || (*token2 == 0)) { atom->valuep = xmlStrdup(token); } else { int lenn, lenp; xmlChar *str; lenn = strlen((char *) token2); lenp = strlen((char *) token); str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); if (str == NULL) { xmlRegFreeAtom(atom); return(NULL); } memcpy(&str[0], token, lenp); str[lenp] = '|'; memcpy(&str[lenp + 1], token2, lenn); str[lenn + lenp + 1] = 0; atom->valuep = str; } if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { xmlRegFreeAtom(atom); return(NULL); } if (to == NULL) return(am->state); return(to); } /** * xmlAutomataNewNegTrans: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @token: the first input string associated to that transition * @token2: the second input string associated to that transition * @data: data passed to the callback function if the transition is activated * * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by any value except (@token,@token2) * Note that if @token2 is not NULL, then (X, NULL) won't match to follow # the semantic of XSD ##other * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, void *data) { xmlRegAtomPtr atom; xmlChar err_msg[200]; if ((am == NULL) || (from == NULL) || (token == NULL)) return(NULL); atom = xmlRegNewAtom(am, XML_REGEXP_STRING); if (atom == NULL) return(NULL); atom->data = data; atom->neg = 1; if ((token2 == NULL) || (*token2 == 0)) { atom->valuep = xmlStrdup(token); } else { int lenn, lenp; xmlChar *str; lenn = strlen((char *) token2); lenp = strlen((char *) token); str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); if (str == NULL) { xmlRegFreeAtom(atom); return(NULL); } memcpy(&str[0], token, lenp); str[lenp] = '|'; memcpy(&str[lenp + 1], token2, lenn); str[lenn + lenp + 1] = 0; atom->valuep = str; } snprintf((char *) err_msg, 199, "not %s", (const char *) atom->valuep); err_msg[199] = 0; atom->valuep2 = xmlStrdup(err_msg); if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { xmlRegFreeAtom(atom); return(NULL); } am->negs++; if (to == NULL) return(am->state); return(to); } /** * xmlAutomataNewCountTrans2: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @token: the input string associated to that transition * @token2: the second input string associated to that transition * @min: the minimum successive occurences of token * @max: the maximum successive occurences of token * @data: data associated to the transition * * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by a succession of input of value @token and @token2 and * whose number is between @min and @max * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewCountTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, int min, int max, void *data) { xmlRegAtomPtr atom; int counter; if ((am == NULL) || (from == NULL) || (token == NULL)) return(NULL); if (min < 0) return(NULL); if ((max < min) || (max < 1)) return(NULL); atom = xmlRegNewAtom(am, XML_REGEXP_STRING); if (atom == NULL) return(NULL); if ((token2 == NULL) || (*token2 == 0)) { atom->valuep = xmlStrdup(token); } else { int lenn, lenp; xmlChar *str; lenn = strlen((char *) token2); lenp = strlen((char *) token); str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); if (str == NULL) { xmlRegFreeAtom(atom); return(NULL); } memcpy(&str[0], token, lenp); str[lenp] = '|'; memcpy(&str[lenp + 1], token2, lenn); str[lenn + lenp + 1] = 0; atom->valuep = str; } atom->data = data; if (min == 0) atom->min = 1; else atom->min = min; atom->max = max; /* * associate a counter to the transition. */ counter = xmlRegGetCounter(am); am->counters[counter].min = min; am->counters[counter].max = max; /* xmlFAGenerateTransitions(am, from, to, atom); */ if (to == NULL) { to = xmlRegNewState(am); xmlRegStatePush(am, to); } xmlRegStateAddTrans(am, from, atom, to, counter, -1); xmlRegAtomPush(am, atom); am->state = to; if (to == NULL) to = am->state; if (to == NULL) return(NULL); if (min == 0) xmlFAGenerateEpsilonTransition(am, from, to); return(to); } /** * xmlAutomataNewCountTrans: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @token: the input string associated to that transition * @min: the minimum successive occurences of token * @max: the maximum successive occurences of token * @data: data associated to the transition * * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by a succession of input of value @token and whose number * is between @min and @max * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewCountTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, int min, int max, void *data) { xmlRegAtomPtr atom; int counter; if ((am == NULL) || (from == NULL) || (token == NULL)) return(NULL); if (min < 0) return(NULL); if ((max < min) || (max < 1)) return(NULL); atom = xmlRegNewAtom(am, XML_REGEXP_STRING); if (atom == NULL) return(NULL); atom->valuep = xmlStrdup(token); atom->data = data; if (min == 0) atom->min = 1; else atom->min = min; atom->max = max; /* * associate a counter to the transition. */ counter = xmlRegGetCounter(am); am->counters[counter].min = min; am->counters[counter].max = max; /* xmlFAGenerateTransitions(am, from, to, atom); */ if (to == NULL) { to = xmlRegNewState(am); xmlRegStatePush(am, to); } xmlRegStateAddTrans(am, from, atom, to, counter, -1); xmlRegAtomPush(am, atom); am->state = to; if (to == NULL) to = am->state; if (to == NULL) return(NULL); if (min == 0) xmlFAGenerateEpsilonTransition(am, from, to); return(to); } /** * xmlAutomataNewOnceTrans2: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @token: the input string associated to that transition * @token2: the second input string associated to that transition * @min: the minimum successive occurences of token * @max: the maximum successive occurences of token * @data: data associated to the transition * * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by a succession of input of value @token and @token2 and whose * number is between @min and @max, moreover that transition can only be * crossed once. * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, int min, int max, void *data) { xmlRegAtomPtr atom; int counter; if ((am == NULL) || (from == NULL) || (token == NULL)) return(NULL); if (min < 1) return(NULL); if ((max < min) || (max < 1)) return(NULL); atom = xmlRegNewAtom(am, XML_REGEXP_STRING); if (atom == NULL) return(NULL); if ((token2 == NULL) || (*token2 == 0)) { atom->valuep = xmlStrdup(token); } else { int lenn, lenp; xmlChar *str; lenn = strlen((char *) token2); lenp = strlen((char *) token); str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); if (str == NULL) { xmlRegFreeAtom(atom); return(NULL); } memcpy(&str[0], token, lenp); str[lenp] = '|'; memcpy(&str[lenp + 1], token2, lenn); str[lenn + lenp + 1] = 0; atom->valuep = str; } atom->data = data; atom->quant = XML_REGEXP_QUANT_ONCEONLY; atom->min = min; atom->max = max; /* * associate a counter to the transition. */ counter = xmlRegGetCounter(am); am->counters[counter].min = 1; am->counters[counter].max = 1; /* xmlFAGenerateTransitions(am, from, to, atom); */ if (to == NULL) { to = xmlRegNewState(am); xmlRegStatePush(am, to); } xmlRegStateAddTrans(am, from, atom, to, counter, -1); xmlRegAtomPush(am, atom); am->state = to; return(to); } /** * xmlAutomataNewOnceTrans: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @token: the input string associated to that transition * @min: the minimum successive occurences of token * @max: the maximum successive occurences of token * @data: data associated to the transition * * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by a succession of input of value @token and whose number * is between @min and @max, moreover that transition can only be crossed * once. * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewOnceTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, int min, int max, void *data) { xmlRegAtomPtr atom; int counter; if ((am == NULL) || (from == NULL) || (token == NULL)) return(NULL); if (min < 1) return(NULL); if ((max < min) || (max < 1)) return(NULL); atom = xmlRegNewAtom(am, XML_REGEXP_STRING); if (atom == NULL) return(NULL); atom->valuep = xmlStrdup(token); atom->data = data; atom->quant = XML_REGEXP_QUANT_ONCEONLY; atom->min = min; atom->max = max; /* * associate a counter to the transition. */ counter = xmlRegGetCounter(am); am->counters[counter].min = 1; am->counters[counter].max = 1; /* xmlFAGenerateTransitions(am, from, to, atom); */ if (to == NULL) { to = xmlRegNewState(am); xmlRegStatePush(am, to); } xmlRegStateAddTrans(am, from, atom, to, counter, -1); xmlRegAtomPush(am, atom); am->state = to; return(to); } /** * xmlAutomataNewState: * @am: an automata * * Create a new disconnected state in the automata * * Returns the new state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewState(xmlAutomataPtr am) { xmlAutomataStatePtr to; if (am == NULL) return(NULL); to = xmlRegNewState(am); xmlRegStatePush(am, to); return(to); } /** * xmlAutomataNewEpsilon: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * * If @to is NULL, this creates first a new target state in the automata * and then adds an epsilon transition from the @from state to the * target state * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewEpsilon(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to) { if ((am == NULL) || (from == NULL)) return(NULL); xmlFAGenerateEpsilonTransition(am, from, to); if (to == NULL) return(am->state); return(to); } /** * xmlAutomataNewAllTrans: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @lax: allow to transition if not all all transitions have been activated * * If @to is NULL, this creates first a new target state in the automata * and then adds a an ALL transition from the @from state to the * target state. That transition is an epsilon transition allowed only when * all transitions from the @from node have been activated. * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int lax) { if ((am == NULL) || (from == NULL)) return(NULL); xmlFAGenerateAllTransition(am, from, to, lax); if (to == NULL) return(am->state); return(to); } /** * xmlAutomataNewCounter: * @am: an automata * @min: the minimal value on the counter * @max: the maximal value on the counter * * Create a new counter * * Returns the counter number or -1 in case of error */ int xmlAutomataNewCounter(xmlAutomataPtr am, int min, int max) { int ret; if (am == NULL) return(-1); ret = xmlRegGetCounter(am); if (ret < 0) return(-1); am->counters[ret].min = min; am->counters[ret].max = max; return(ret); } /** * xmlAutomataNewCountedTrans: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @counter: the counter associated to that transition * * If @to is NULL, this creates first a new target state in the automata * and then adds an epsilon transition from the @from state to the target state * which will increment the counter provided * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewCountedTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int counter) { if ((am == NULL) || (from == NULL) || (counter < 0)) return(NULL); xmlFAGenerateCountedEpsilonTransition(am, from, to, counter); if (to == NULL) return(am->state); return(to); } /** * xmlAutomataNewCounterTrans: * @am: an automata * @from: the starting point of the transition * @to: the target point of the transition or NULL * @counter: the counter associated to that transition * * If @to is NULL, this creates first a new target state in the automata * and then adds an epsilon transition from the @from state to the target state * which will be allowed only if the counter is within the right range. * * Returns the target state or NULL in case of error */ xmlAutomataStatePtr xmlAutomataNewCounterTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int counter) { if ((am == NULL) || (from == NULL) || (counter < 0)) return(NULL); xmlFAGenerateCountedTransition(am, from, to, counter); if (to == NULL) return(am->state); return(to); } /** * xmlAutomataCompile: * @am: an automata * * Compile the automata into a Reg Exp ready for being executed. * The automata should be free after this point. * * Returns the compiled regexp or NULL in case of error */ xmlRegexpPtr xmlAutomataCompile(xmlAutomataPtr am) { xmlRegexpPtr ret; if ((am == NULL) || (am->error != 0)) return(NULL); xmlFAEliminateEpsilonTransitions(am); /* xmlFAComputesDeterminism(am); */ ret = xmlRegEpxFromParse(am); return(ret); } /** * xmlAutomataIsDeterminist: * @am: an automata * * Checks if an automata is determinist. * * Returns 1 if true, 0 if not, and -1 in case of error */ int xmlAutomataIsDeterminist(xmlAutomataPtr am) { int ret; if (am == NULL) return(-1); ret = xmlFAComputesDeterminism(am); return(ret); } #endif /* LIBXML_AUTOMATA_ENABLED */ #ifdef LIBXML_EXPR_ENABLED /************************************************************************ * * * Formal Expression handling code * * * ************************************************************************/ /************************************************************************ * * * Expression handling context * * * ************************************************************************/ struct _xmlExpCtxt { xmlDictPtr dict; xmlExpNodePtr *table; int size; int nbElems; int nb_nodes; int maxNodes; const char *expr; const char *cur; int nb_cons; int tabSize; }; /** * xmlExpNewCtxt: * @maxNodes: the maximum number of nodes * @dict: optional dictionnary to use internally * * Creates a new context for manipulating expressions * * Returns the context or NULL in case of error */ xmlExpCtxtPtr xmlExpNewCtxt(int maxNodes, xmlDictPtr dict) { xmlExpCtxtPtr ret; int size = 256; if (maxNodes <= 4096) maxNodes = 4096; ret = (xmlExpCtxtPtr) xmlMalloc(sizeof(xmlExpCtxt)); if (ret == NULL) return(NULL); memset(ret, 0, sizeof(xmlExpCtxt)); ret->size = size; ret->nbElems = 0; ret->maxNodes = maxNodes; ret->table = xmlMalloc(size * sizeof(xmlExpNodePtr)); if (ret->table == NULL) { xmlFree(ret); return(NULL); } memset(ret->table, 0, size * sizeof(xmlExpNodePtr)); if (dict == NULL) { ret->dict = xmlDictCreate(); if (ret->dict == NULL) { xmlFree(ret->table); xmlFree(ret); return(NULL); } } else { ret->dict = dict; xmlDictReference(ret->dict); } return(ret); } /** * xmlExpFreeCtxt: * @ctxt: an expression context * * Free an expression context */ void xmlExpFreeCtxt(xmlExpCtxtPtr ctxt) { if (ctxt == NULL) return; xmlDictFree(ctxt->dict); if (ctxt->table != NULL) xmlFree(ctxt->table); xmlFree(ctxt); } /************************************************************************ * * * Structure associated to an expression node * * * ************************************************************************/ #define MAX_NODES 10000 /* #define DEBUG_DERIV */ /* * TODO: * - Wildcards * - public API for creation * * Started * - regression testing * * Done * - split into module and test tool * - memleaks */ typedef enum { XML_EXP_NILABLE = (1 << 0) } xmlExpNodeInfo; #define IS_NILLABLE(node) ((node)->info & XML_EXP_NILABLE) struct _xmlExpNode { unsigned char type;/* xmlExpNodeType */ unsigned char info;/* OR of xmlExpNodeInfo */ unsigned short key; /* the hash key */ unsigned int ref; /* The number of references */ int c_max; /* the maximum length it can consume */ xmlExpNodePtr exp_left; xmlExpNodePtr next;/* the next node in the hash table or free list */ union { struct { int f_min; int f_max; } count; struct { xmlExpNodePtr f_right; } children; const xmlChar *f_str; } field; }; #define exp_min field.count.f_min #define exp_max field.count.f_max /* #define exp_left field.children.f_left */ #define exp_right field.children.f_right #define exp_str field.f_str static xmlExpNodePtr xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type); static xmlExpNode forbiddenExpNode = { XML_EXP_FORBID, 0, 0, 0, 0, NULL, NULL, {{ 0, 0}} }; xmlExpNodePtr forbiddenExp = &forbiddenExpNode; static xmlExpNode emptyExpNode = { XML_EXP_EMPTY, 1, 0, 0, 0, NULL, NULL, {{ 0, 0}} }; xmlExpNodePtr emptyExp = &emptyExpNode; /************************************************************************ * * * The custom hash table for unicity and canonicalization * * of sub-expressions pointers * * * ************************************************************************/ /* * xmlExpHashNameComputeKey: * Calculate the hash key for a token */ static unsigned short xmlExpHashNameComputeKey(const xmlChar *name) { unsigned short value = 0L; char ch; if (name != NULL) { value += 30 * (*name); while ((ch = *name++) != 0) { value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); } } return (value); } /* * xmlExpHashComputeKey: * Calculate the hash key for a compound expression */ static unsigned short xmlExpHashComputeKey(xmlExpNodeType type, xmlExpNodePtr left, xmlExpNodePtr right) { unsigned long value; unsigned short ret; switch (type) { case XML_EXP_SEQ: value = left->key; value += right->key; value *= 3; ret = (unsigned short) value; break; case XML_EXP_OR: value = left->key; value += right->key; value *= 7; ret = (unsigned short) value; break; case XML_EXP_COUNT: value = left->key; value += right->key; ret = (unsigned short) value; break; default: ret = 0; } return(ret); } static xmlExpNodePtr xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type) { xmlExpNodePtr ret; if (ctxt->nb_nodes >= MAX_NODES) return(NULL); ret = (xmlExpNodePtr) xmlMalloc(sizeof(xmlExpNode)); if (ret == NULL) return(NULL); memset(ret, 0, sizeof(xmlExpNode)); ret->type = type; ret->next = NULL; ctxt->nb_nodes++; ctxt->nb_cons++; return(ret); } /** * xmlExpHashGetEntry: * @table: the hash table * * Get the unique entry from the hash table. The entry is created if * needed. @left and @right are consumed, i.e. their ref count will * be decremented by the operation. * * Returns the pointer or NULL in case of error */ static xmlExpNodePtr xmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type, xmlExpNodePtr left, xmlExpNodePtr right, const xmlChar *name, int min, int max) { unsigned short kbase, key; xmlExpNodePtr entry; xmlExpNodePtr insert; if (ctxt == NULL) return(NULL); /* * Check for duplicate and insertion location. */ if (type == XML_EXP_ATOM) { kbase = xmlExpHashNameComputeKey(name); } else if (type == XML_EXP_COUNT) { /* COUNT reduction rule 1 */ /* a{1} -> a */ if (min == max) { if (min == 1) { return(left); } if (min == 0) { xmlExpFree(ctxt, left); return(emptyExp); } } if (min < 0) { xmlExpFree(ctxt, left); return(forbiddenExp); } if (max == -1) kbase = min + 79; else kbase = max - min; kbase += left->key; } else if (type == XML_EXP_OR) { /* Forbid reduction rules */ if (left->type == XML_EXP_FORBID) { xmlExpFree(ctxt, left); return(right); } if (right->type == XML_EXP_FORBID) { xmlExpFree(ctxt, right); return(left); } /* OR reduction rule 1 */ /* a | a reduced to a */ if (left == right) { left->ref--; return(left); } /* OR canonicalization rule 1 */ /* linearize (a | b) | c into a | (b | c) */ if ((left->type == XML_EXP_OR) && (right->type != XML_EXP_OR)) { xmlExpNodePtr tmp = left; left = right; right = tmp; } /* OR reduction rule 2 */ /* a | (a | b) and b | (a | b) are reduced to a | b */ if (right->type == XML_EXP_OR) { if ((left == right->exp_left) || (left == right->exp_right)) { xmlExpFree(ctxt, left); return(right); } } /* OR canonicalization rule 2 */ /* linearize (a | b) | c into a | (b | c) */ if (left->type == XML_EXP_OR) { xmlExpNodePtr tmp; /* OR canonicalization rule 2 */ if ((left->exp_right->type != XML_EXP_OR) && (left->exp_right->key < left->exp_left->key)) { tmp = left->exp_right; left->exp_right = left->exp_left; left->exp_left = tmp; } left->exp_right->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_right, right, NULL, 0, 0); left->exp_left->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_left, tmp, NULL, 0, 0); xmlExpFree(ctxt, left); return(tmp); } if (right->type == XML_EXP_OR) { /* Ordering in the tree */ /* C | (A | B) -> A | (B | C) */ if (left->key > right->exp_right->key) { xmlExpNodePtr tmp; right->exp_right->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_right, left, NULL, 0, 0); right->exp_left->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, tmp, NULL, 0, 0); xmlExpFree(ctxt, right); return(tmp); } /* Ordering in the tree */ /* B | (A | C) -> A | (B | C) */ if (left->key > right->exp_left->key) { xmlExpNodePtr tmp; right->exp_right->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, right->exp_right, NULL, 0, 0); right->exp_left->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, tmp, NULL, 0, 0); xmlExpFree(ctxt, right); return(tmp); } } /* we know both types are != XML_EXP_OR here */ else if (left->key > right->key) { xmlExpNodePtr tmp = left; left = right; right = tmp; } kbase = xmlExpHashComputeKey(type, left, right); } else if (type == XML_EXP_SEQ) { /* Forbid reduction rules */ if (left->type == XML_EXP_FORBID) { xmlExpFree(ctxt, right); return(left); } if (right->type == XML_EXP_FORBID) { xmlExpFree(ctxt, left); return(right); } /* Empty reduction rules */ if (right->type == XML_EXP_EMPTY) { return(left); } if (left->type == XML_EXP_EMPTY) { return(right); } kbase = xmlExpHashComputeKey(type, left, right); } else return(NULL); key = kbase % ctxt->size; if (ctxt->table[key] != NULL) { for (insert = ctxt->table[key]; insert != NULL; insert = insert->next) { if ((insert->key == kbase) && (insert->type == type)) { if (type == XML_EXP_ATOM) { if (name == insert->exp_str) { insert->ref++; return(insert); } } else if (type == XML_EXP_COUNT) { if ((insert->exp_min == min) && (insert->exp_max == max) && (insert->exp_left == left)) { insert->ref++; left->ref--; return(insert); } } else if ((insert->exp_left == left) && (insert->exp_right == right)) { insert->ref++; left->ref--; right->ref--; return(insert); } } } } entry = xmlExpNewNode(ctxt, type); if (entry == NULL) return(NULL); entry->key = kbase; if (type == XML_EXP_ATOM) { entry->exp_str = name; entry->c_max = 1; } else if (type == XML_EXP_COUNT) { entry->exp_min = min; entry->exp_max = max; entry->exp_left = left; if ((min == 0) || (IS_NILLABLE(left))) entry->info |= XML_EXP_NILABLE; if (max < 0) entry->c_max = -1; else entry->c_max = max * entry->exp_left->c_max; } else { entry->exp_left = left; entry->exp_right = right; if (type == XML_EXP_OR) { if ((IS_NILLABLE(left)) || (IS_NILLABLE(right))) entry->info |= XML_EXP_NILABLE; if ((entry->exp_left->c_max == -1) || (entry->exp_right->c_max == -1)) entry->c_max = -1; else if (entry->exp_left->c_max > entry->exp_right->c_max) entry->c_max = entry->exp_left->c_max; else entry->c_max = entry->exp_right->c_max; } else { if ((IS_NILLABLE(left)) && (IS_NILLABLE(right))) entry->info |= XML_EXP_NILABLE; if ((entry->exp_left->c_max == -1) || (entry->exp_right->c_max == -1)) entry->c_max = -1; else entry->c_max = entry->exp_left->c_max + entry->exp_right->c_max; } } entry->ref = 1; if (ctxt->table[key] != NULL) entry->next = ctxt->table[key]; ctxt->table[key] = entry; ctxt->nbElems++; return(entry); } /** * xmlExpFree: * @ctxt: the expression context * @exp: the expression * * Dereference the expression */ void xmlExpFree(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp) { if ((exp == NULL) || (exp == forbiddenExp) || (exp == emptyExp)) return; exp->ref--; if (exp->ref == 0) { unsigned short key; /* Unlink it first from the hash table */ key = exp->key % ctxt->size; if (ctxt->table[key] == exp) { ctxt->table[key] = exp->next; } else { xmlExpNodePtr tmp; tmp = ctxt->table[key]; while (tmp != NULL) { if (tmp->next == exp) { tmp->next = exp->next; break; } tmp = tmp->next; } } if ((exp->type == XML_EXP_SEQ) || (exp->type == XML_EXP_OR)) { xmlExpFree(ctxt, exp->exp_left); xmlExpFree(ctxt, exp->exp_right); } else if (exp->type == XML_EXP_COUNT) { xmlExpFree(ctxt, exp->exp_left); } xmlFree(exp); ctxt->nb_nodes--; } } /** * xmlExpRef: * @exp: the expression * * Increase the reference count of the expression */ void xmlExpRef(xmlExpNodePtr exp) { if (exp != NULL) exp->ref++; } /** * xmlExpNewAtom: * @ctxt: the expression context * @name: the atom name * @len: the atom name length in byte (or -1); * * Get the atom associated to this name from that context * * Returns the node or NULL in case of error */ xmlExpNodePtr xmlExpNewAtom(xmlExpCtxtPtr ctxt, const xmlChar *name, int len) { if ((ctxt == NULL) || (name == NULL)) return(NULL); name = xmlDictLookup(ctxt->dict, name, len); if (name == NULL) return(NULL); return(xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, name, 0, 0)); } /** * xmlExpNewOr: * @ctxt: the expression context * @left: left expression * @right: right expression * * Get the atom associated to the choice @left | @right * Note that @left and @right are consumed in the operation, to keep * an handle on them use xmlExpRef() and use xmlExpFree() to release them, * this is true even in case of failure (unless ctxt == NULL). * * Returns the node or NULL in case of error */ xmlExpNodePtr xmlExpNewOr(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { if (ctxt == NULL) return(NULL); if ((left == NULL) || (right == NULL)) { xmlExpFree(ctxt, left); xmlExpFree(ctxt, right); return(NULL); } return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, right, NULL, 0, 0)); } /** * xmlExpNewSeq: * @ctxt: the expression context * @left: left expression * @right: right expression * * Get the atom associated to the sequence @left , @right * Note that @left and @right are consumed in the operation, to keep * an handle on them use xmlExpRef() and use xmlExpFree() to release them, * this is true even in case of failure (unless ctxt == NULL). * * Returns the node or NULL in case of error */ xmlExpNodePtr xmlExpNewSeq(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { if (ctxt == NULL) return(NULL); if ((left == NULL) || (right == NULL)) { xmlExpFree(ctxt, left); xmlExpFree(ctxt, right); return(NULL); } return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, left, right, NULL, 0, 0)); } /** * xmlExpNewRange: * @ctxt: the expression context * @subset: the expression to be repeated * @min: the lower bound for the repetition * @max: the upper bound for the repetition, -1 means infinite * * Get the atom associated to the range (@subset){@min, @max} * Note that @subset is consumed in the operation, to keep * an handle on it use xmlExpRef() and use xmlExpFree() to release it, * this is true even in case of failure (unless ctxt == NULL). * * Returns the node or NULL in case of error */ xmlExpNodePtr xmlExpNewRange(xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max) { if (ctxt == NULL) return(NULL); if ((subset == NULL) || (min < 0) || (max < -1) || ((max >= 0) && (min > max))) { xmlExpFree(ctxt, subset); return(NULL); } return(xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, subset, NULL, NULL, min, max)); } /************************************************************************ * * * Public API for operations on expressions * * * ************************************************************************/ static int xmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar**list, int len, int nb) { int tmp, tmp2; tail: switch (exp->type) { case XML_EXP_EMPTY: return(0); case XML_EXP_ATOM: for (tmp = 0;tmp < nb;tmp++) if (list[tmp] == exp->exp_str) return(0); if (nb >= len) return(-2); list[nb] = exp->exp_str; return(1); case XML_EXP_COUNT: exp = exp->exp_left; goto tail; case XML_EXP_SEQ: case XML_EXP_OR: tmp = xmlExpGetLanguageInt(ctxt, exp->exp_left, list, len, nb); if (tmp < 0) return(tmp); tmp2 = xmlExpGetLanguageInt(ctxt, exp->exp_right, list, len, nb + tmp); if (tmp2 < 0) return(tmp2); return(tmp + tmp2); } return(-1); } /** * xmlExpGetLanguage: * @ctxt: the expression context * @exp: the expression * @langList: where to store the tokens * @len: the allocated length of @list * * Find all the strings used in @exp and store them in @list * * Returns the number of unique strings found, -1 in case of errors and * -2 if there is more than @len strings */ int xmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar**langList, int len) { if ((ctxt == NULL) || (exp == NULL) || (langList == NULL) || (len <= 0)) return(-1); return(xmlExpGetLanguageInt(ctxt, exp, langList, len, 0)); } static int xmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar**list, int len, int nb) { int tmp, tmp2; tail: switch (exp->type) { case XML_EXP_FORBID: return(0); case XML_EXP_EMPTY: return(0); case XML_EXP_ATOM: for (tmp = 0;tmp < nb;tmp++) if (list[tmp] == exp->exp_str) return(0); if (nb >= len) return(-2); list[nb] = exp->exp_str; return(1); case XML_EXP_COUNT: exp = exp->exp_left; goto tail; case XML_EXP_SEQ: tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); if (tmp < 0) return(tmp); if (IS_NILLABLE(exp->exp_left)) { tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, nb + tmp); if (tmp2 < 0) return(tmp2); tmp += tmp2; } return(tmp); case XML_EXP_OR: tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); if (tmp < 0) return(tmp); tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, nb + tmp); if (tmp2 < 0) return(tmp2); return(tmp + tmp2); } return(-1); } /** * xmlExpGetStart: * @ctxt: the expression context * @exp: the expression * @tokList: where to store the tokens * @len: the allocated length of @list * * Find all the strings that appears at the start of the languages * accepted by @exp and store them in @list. E.g. for (a, b) | c * it will return the list [a, c] * * Returns the number of unique strings found, -1 in case of errors and * -2 if there is more than @len strings */ int xmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar**tokList, int len) { if ((ctxt == NULL) || (exp == NULL) || (tokList == NULL) || (len <= 0)) return(-1); return(xmlExpGetStartInt(ctxt, exp, tokList, len, 0)); } /** * xmlExpIsNillable: * @exp: the expression * * Finds if the expression is nillable, i.e. if it accepts the empty sequqnce * * Returns 1 if nillable, 0 if not and -1 in case of error */ int xmlExpIsNillable(xmlExpNodePtr exp) { if (exp == NULL) return(-1); return(IS_NILLABLE(exp) != 0); } static xmlExpNodePtr xmlExpStringDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar *str) { xmlExpNodePtr ret; switch (exp->type) { case XML_EXP_EMPTY: return(forbiddenExp); case XML_EXP_FORBID: return(forbiddenExp); case XML_EXP_ATOM: if (exp->exp_str == str) { #ifdef DEBUG_DERIV printf("deriv atom: equal => Empty\n"); #endif ret = emptyExp; } else { #ifdef DEBUG_DERIV printf("deriv atom: mismatch => forbid\n"); #endif /* TODO wildcards here */ ret = forbiddenExp; } return(ret); case XML_EXP_OR: { xmlExpNodePtr tmp; #ifdef DEBUG_DERIV printf("deriv or: => or(derivs)\n"); #endif tmp = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); if (tmp == NULL) { return(NULL); } ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); if (ret == NULL) { xmlExpFree(ctxt, tmp); return(NULL); } ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, NULL, 0, 0); return(ret); } case XML_EXP_SEQ: #ifdef DEBUG_DERIV printf("deriv seq: starting with left\n"); #endif ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); if (ret == NULL) { return(NULL); } else if (ret == forbiddenExp) { if (IS_NILLABLE(exp->exp_left)) { #ifdef DEBUG_DERIV printf("deriv seq: left failed but nillable\n"); #endif ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); } } else { #ifdef DEBUG_DERIV printf("deriv seq: left match => sequence\n"); #endif exp->exp_right->ref++; ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right, NULL, 0, 0); } return(ret); case XML_EXP_COUNT: { int min, max; xmlExpNodePtr tmp; if (exp->exp_max == 0) return(forbiddenExp); ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); if (ret == NULL) return(NULL); if (ret == forbiddenExp) { #ifdef DEBUG_DERIV printf("deriv count: pattern mismatch => forbid\n"); #endif return(ret); } if (exp->exp_max == 1) return(ret); if (exp->exp_max < 0) /* unbounded */ max = -1; else max = exp->exp_max - 1; if (exp->exp_min > 0) min = exp->exp_min - 1; else min = 0; exp->exp_left->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL, NULL, min, max); if (ret == emptyExp) { #ifdef DEBUG_DERIV printf("deriv count: match to empty => new count\n"); #endif return(tmp); } #ifdef DEBUG_DERIV printf("deriv count: match => sequence with new count\n"); #endif return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, tmp, NULL, 0, 0)); } } return(NULL); } /** * xmlExpStringDerive: * @ctxt: the expression context * @exp: the expression * @str: the string * @len: the string len in bytes if available * * Do one step of Brzozowski derivation of the expression @exp with * respect to the input string * * Returns the resulting expression or NULL in case of internal error */ xmlExpNodePtr xmlExpStringDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar *str, int len) { const xmlChar *input; if ((exp == NULL) || (ctxt == NULL) || (str == NULL)) { return(NULL); } /* * check the string is in the dictionnary, if yes use an interned * copy, otherwise we know it's not an acceptable input */ input = xmlDictExists(ctxt->dict, str, len); if (input == NULL) { return(forbiddenExp); } return(xmlExpStringDeriveInt(ctxt, exp, input)); } static int xmlExpCheckCard(xmlExpNodePtr exp, xmlExpNodePtr sub) { int ret = 1; if (sub->c_max == -1) { if (exp->c_max != -1) ret = 0; } else if ((exp->c_max >= 0) && (exp->c_max < sub->c_max)) { ret = 0; } #if 0 if ((IS_NILLABLE(sub)) && (!IS_NILLABLE(exp))) ret = 0; #endif return(ret); } static xmlExpNodePtr xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub); /** * xmlExpDivide: * @ctxt: the expressions context * @exp: the englobing expression * @sub: the subexpression * @mult: the multiple expression * @remain: the remain from the derivation of the multiple * * Check if exp is a multiple of sub, i.e. if there is a finite number n * so that sub{n} subsume exp * * Returns the multiple value if successful, 0 if it is not a multiple * and -1 in case of internel error. */ static int xmlExpDivide(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub, xmlExpNodePtr *mult, xmlExpNodePtr *remain) { int i; xmlExpNodePtr tmp, tmp2; if (mult != NULL) *mult = NULL; if (remain != NULL) *remain = NULL; if (exp->c_max == -1) return(0); if (IS_NILLABLE(exp) && (!IS_NILLABLE(sub))) return(0); for (i = 1;i <= exp->c_max;i++) { sub->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, sub, NULL, NULL, i, i); if (tmp == NULL) { return(-1); } if (!xmlExpCheckCard(tmp, exp)) { xmlExpFree(ctxt, tmp); continue; } tmp2 = xmlExpExpDeriveInt(ctxt, tmp, exp); if (tmp2 == NULL) { xmlExpFree(ctxt, tmp); return(-1); } if ((tmp2 != forbiddenExp) && (IS_NILLABLE(tmp2))) { if (remain != NULL) *remain = tmp2; else xmlExpFree(ctxt, tmp2); if (mult != NULL) *mult = tmp; else xmlExpFree(ctxt, tmp); #ifdef DEBUG_DERIV printf("Divide succeeded %d\n", i); #endif return(i); } xmlExpFree(ctxt, tmp); xmlExpFree(ctxt, tmp2); } #ifdef DEBUG_DERIV printf("Divide failed\n"); #endif return(0); } /** * xmlExpExpDeriveInt: * @ctxt: the expressions context * @exp: the englobing expression * @sub: the subexpression * * Try to do a step of Brzozowski derivation but at a higher level * the input being a subexpression. * * Returns the resulting expression or NULL in case of internal error */ static xmlExpNodePtr xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { xmlExpNodePtr ret, tmp, tmp2, tmp3; const xmlChar **tab; int len, i; /* * In case of equality and if the expression can only consume a finite * amount, then the derivation is empty */ if ((exp == sub) && (exp->c_max >= 0)) { #ifdef DEBUG_DERIV printf("Equal(exp, sub) and finite -> Empty\n"); #endif return(emptyExp); } /* * decompose sub sequence first */ if (sub->type == XML_EXP_EMPTY) { #ifdef DEBUG_DERIV printf("Empty(sub) -> Empty\n"); #endif exp->ref++; return(exp); } if (sub->type == XML_EXP_SEQ) { #ifdef DEBUG_DERIV printf("Seq(sub) -> decompose\n"); #endif tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); if (tmp == NULL) return(NULL); if (tmp == forbiddenExp) return(tmp); ret = xmlExpExpDeriveInt(ctxt, tmp, sub->exp_right); xmlExpFree(ctxt, tmp); return(ret); } if (sub->type == XML_EXP_OR) { #ifdef DEBUG_DERIV printf("Or(sub) -> decompose\n"); #endif tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); if (tmp == forbiddenExp) return(tmp); if (tmp == NULL) return(NULL); ret = xmlExpExpDeriveInt(ctxt, exp, sub->exp_right); if ((ret == NULL) || (ret == forbiddenExp)) { xmlExpFree(ctxt, tmp); return(ret); } return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, NULL, 0, 0)); } if (!xmlExpCheckCard(exp, sub)) { #ifdef DEBUG_DERIV printf("CheckCard(exp, sub) failed -> Forbid\n"); #endif return(forbiddenExp); } switch (exp->type) { case XML_EXP_EMPTY: if (sub == emptyExp) return(emptyExp); #ifdef DEBUG_DERIV printf("Empty(exp) -> Forbid\n"); #endif return(forbiddenExp); case XML_EXP_FORBID: #ifdef DEBUG_DERIV printf("Forbid(exp) -> Forbid\n"); #endif return(forbiddenExp); case XML_EXP_ATOM: if (sub->type == XML_EXP_ATOM) { /* TODO: handle wildcards */ if (exp->exp_str == sub->exp_str) { #ifdef DEBUG_DERIV printf("Atom match -> Empty\n"); #endif return(emptyExp); } #ifdef DEBUG_DERIV printf("Atom mismatch -> Forbid\n"); #endif return(forbiddenExp); } if ((sub->type == XML_EXP_COUNT) && (sub->exp_max == 1) && (sub->exp_left->type == XML_EXP_ATOM)) { /* TODO: handle wildcards */ if (exp->exp_str == sub->exp_left->exp_str) { #ifdef DEBUG_DERIV printf("Atom match -> Empty\n"); #endif return(emptyExp); } #ifdef DEBUG_DERIV printf("Atom mismatch -> Forbid\n"); #endif return(forbiddenExp); } #ifdef DEBUG_DERIV printf("Compex exp vs Atom -> Forbid\n"); #endif return(forbiddenExp); case XML_EXP_SEQ: /* try to get the sequence consumed only if possible */ if (xmlExpCheckCard(exp->exp_left, sub)) { /* See if the sequence can be consumed directly */ #ifdef DEBUG_DERIV printf("Seq trying left only\n"); #endif ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); if ((ret != forbiddenExp) && (ret != NULL)) { #ifdef DEBUG_DERIV printf("Seq trying left only worked\n"); #endif /* * TODO: assumption here that we are determinist * i.e. we won't get to a nillable exp left * subset which could be matched by the right * part too. * e.g.: (a | b)+,(a | c) and 'a+,a' */ exp->exp_right->ref++; return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right, NULL, 0, 0)); } #ifdef DEBUG_DERIV } else { printf("Seq: left too short\n"); #endif } /* Try instead to decompose */ if (sub->type == XML_EXP_COUNT) { int min, max; #ifdef DEBUG_DERIV printf("Seq: sub is a count\n"); #endif ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); if (ret == NULL) return(NULL); if (ret != forbiddenExp) { #ifdef DEBUG_DERIV printf("Seq , Count match on left\n"); #endif if (sub->exp_max < 0) max = -1; else max = sub->exp_max -1; if (sub->exp_min > 0) min = sub->exp_min -1; else min = 0; exp->exp_right->ref++; tmp = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right, NULL, 0, 0); if (tmp == NULL) return(NULL); sub->exp_left->ref++; tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, sub->exp_left, NULL, NULL, min, max); if (tmp2 == NULL) { xmlExpFree(ctxt, tmp); return(NULL); } ret = xmlExpExpDeriveInt(ctxt, tmp, tmp2); xmlExpFree(ctxt, tmp); xmlExpFree(ctxt, tmp2); return(ret); } } /* we made no progress on structured operations */ break; case XML_EXP_OR: #ifdef DEBUG_DERIV printf("Or , trying both side\n"); #endif ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); if (ret == NULL) return(NULL); tmp = xmlExpExpDeriveInt(ctxt, exp->exp_right, sub); if (tmp == NULL) { xmlExpFree(ctxt, ret); return(NULL); } return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp, NULL, 0, 0)); case XML_EXP_COUNT: { int min, max; if (sub->type == XML_EXP_COUNT) { /* * Try to see if the loop is completely subsumed */ tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); if (tmp == NULL) return(NULL); if (tmp == forbiddenExp) { int mult; #ifdef DEBUG_DERIV printf("Count, Count inner don't subsume\n"); #endif mult = xmlExpDivide(ctxt, sub->exp_left, exp->exp_left, NULL, &tmp); if (mult <= 0) { #ifdef DEBUG_DERIV printf("Count, Count not multiple => forbidden\n"); #endif return(forbiddenExp); } if (sub->exp_max == -1) { max = -1; if (exp->exp_max == -1) { if (exp->exp_min <= sub->exp_min * mult) min = 0; else min = exp->exp_min - sub->exp_min * mult; } else { #ifdef DEBUG_DERIV printf("Count, Count finite can't subsume infinite\n"); #endif xmlExpFree(ctxt, tmp); return(forbiddenExp); } } else { if (exp->exp_max == -1) { #ifdef DEBUG_DERIV printf("Infinite loop consume mult finite loop\n"); #endif if (exp->exp_min > sub->exp_min * mult) { max = -1; min = exp->exp_min - sub->exp_min * mult; } else { max = -1; min = 0; } } else { if (exp->exp_max < sub->exp_max * mult) { #ifdef DEBUG_DERIV printf("loops max mult mismatch => forbidden\n"); #endif xmlExpFree(ctxt, tmp); return(forbiddenExp); } if (sub->exp_max * mult > exp->exp_min) min = 0; else min = exp->exp_min - sub->exp_max * mult; max = exp->exp_max - sub->exp_max * mult; } } } else if (!IS_NILLABLE(tmp)) { /* * TODO: loop here to try to grow if working on finite * blocks. */ #ifdef DEBUG_DERIV printf("Count, Count remain not nillable => forbidden\n"); #endif xmlExpFree(ctxt, tmp); return(forbiddenExp); } else if (sub->exp_max == -1) { if (exp->exp_max == -1) { if (exp->exp_min <= sub->exp_min) { #ifdef DEBUG_DERIV printf("Infinite loops Okay => COUNT(0,Inf)\n"); #endif max = -1; min = 0; } else { #ifdef DEBUG_DERIV printf("Infinite loops min => Count(X,Inf)\n"); #endif max = -1; min = exp->exp_min - sub->exp_min; } } else if (exp->exp_min > sub->exp_min) { #ifdef DEBUG_DERIV printf("loops min mismatch 1 => forbidden ???\n"); #endif xmlExpFree(ctxt, tmp); return(forbiddenExp); } else { max = -1; min = 0; } } else { if (exp->exp_max == -1) { #ifdef DEBUG_DERIV printf("Infinite loop consume finite loop\n"); #endif if (exp->exp_min > sub->exp_min) { max = -1; min = exp->exp_min - sub->exp_min; } else { max = -1; min = 0; } } else { if (exp->exp_max < sub->exp_max) { #ifdef DEBUG_DERIV printf("loops max mismatch => forbidden\n"); #endif xmlExpFree(ctxt, tmp); return(forbiddenExp); } if (sub->exp_max > exp->exp_min) min = 0; else min = exp->exp_min - sub->exp_max; max = exp->exp_max - sub->exp_max; } } #ifdef DEBUG_DERIV printf("loops match => SEQ(COUNT())\n"); #endif exp->exp_left->ref++; tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL, NULL, min, max); if (tmp2 == NULL) { return(NULL); } ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, NULL, 0, 0); return(ret); } tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); if (tmp == NULL) return(NULL); if (tmp == forbiddenExp) { #ifdef DEBUG_DERIV printf("loop mismatch => forbidden\n"); #endif return(forbiddenExp); } if (exp->exp_min > 0) min = exp->exp_min - 1; else min = 0; if (exp->exp_max < 0) max = -1; else max = exp->exp_max - 1; #ifdef DEBUG_DERIV printf("loop match => SEQ(COUNT())\n"); #endif exp->exp_left->ref++; tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL, NULL, min, max); if (tmp2 == NULL) return(NULL); ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, NULL, 0, 0); return(ret); } } #ifdef DEBUG_DERIV printf("Fallback to derivative\n"); #endif if (IS_NILLABLE(sub)) { if (!(IS_NILLABLE(exp))) return(forbiddenExp); else ret = emptyExp; } else ret = NULL; /* * here the structured derivation made no progress so * we use the default token based derivation to force one more step */ if (ctxt->tabSize == 0) ctxt->tabSize = 40; tab = (const xmlChar **) xmlMalloc(ctxt->tabSize * sizeof(const xmlChar *)); if (tab == NULL) { return(NULL); } /* * collect all the strings accepted by the subexpression on input */ len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); while (len < 0) { const xmlChar **temp; temp = (const xmlChar **) xmlRealloc((xmlChar **) tab, ctxt->tabSize * 2 * sizeof(const xmlChar *)); if (temp == NULL) { xmlFree((xmlChar **) tab); return(NULL); } tab = temp; ctxt->tabSize *= 2; len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); } for (i = 0;i < len;i++) { tmp = xmlExpStringDeriveInt(ctxt, exp, tab[i]); if ((tmp == NULL) || (tmp == forbiddenExp)) { xmlExpFree(ctxt, ret); xmlFree((xmlChar **) tab); return(tmp); } tmp2 = xmlExpStringDeriveInt(ctxt, sub, tab[i]); if ((tmp2 == NULL) || (tmp2 == forbiddenExp)) { xmlExpFree(ctxt, tmp); xmlExpFree(ctxt, ret); xmlFree((xmlChar **) tab); return(tmp); } tmp3 = xmlExpExpDeriveInt(ctxt, tmp, tmp2); xmlExpFree(ctxt, tmp); xmlExpFree(ctxt, tmp2); if ((tmp3 == NULL) || (tmp3 == forbiddenExp)) { xmlExpFree(ctxt, ret); xmlFree((xmlChar **) tab); return(tmp3); } if (ret == NULL) ret = tmp3; else { ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp3, NULL, 0, 0); if (ret == NULL) { xmlFree((xmlChar **) tab); return(NULL); } } } xmlFree((xmlChar **) tab); return(ret); } /** * xmlExpExpDerive: * @ctxt: the expressions context * @exp: the englobing expression * @sub: the subexpression * * Evaluates the expression resulting from @exp consuming a sub expression @sub * Based on algebraic derivation and sometimes direct Brzozowski derivation * it usually tatkes less than linear time and can handle expressions generating * infinite languages. * * Returns the resulting expression or NULL in case of internal error, the * result must be freed */ xmlExpNodePtr xmlExpExpDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) return(NULL); /* * O(1) speedups */ if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { #ifdef DEBUG_DERIV printf("Sub nillable and not exp : can't subsume\n"); #endif return(forbiddenExp); } if (xmlExpCheckCard(exp, sub) == 0) { #ifdef DEBUG_DERIV printf("sub generate longuer sequances than exp : can't subsume\n"); #endif return(forbiddenExp); } return(xmlExpExpDeriveInt(ctxt, exp, sub)); } /** * xmlExpSubsume: * @ctxt: the expressions context * @exp: the englobing expression * @sub: the subexpression * * Check whether @exp accepts all the languages accexpted by @sub * the input being a subexpression. * * Returns 1 if true 0 if false and -1 in case of failure. */ int xmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { xmlExpNodePtr tmp; if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) return(-1); /* * TODO: speedup by checking the language of sub is a subset of the * language of exp */ /* * O(1) speedups */ if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { #ifdef DEBUG_DERIV printf("Sub nillable and not exp : can't subsume\n"); #endif return(0); } if (xmlExpCheckCard(exp, sub) == 0) { #ifdef DEBUG_DERIV printf("sub generate longuer sequances than exp : can't subsume\n"); #endif return(0); } tmp = xmlExpExpDeriveInt(ctxt, exp, sub); #ifdef DEBUG_DERIV printf("Result derivation :\n"); PRINT_EXP(tmp); #endif if (tmp == NULL) return(-1); if (tmp == forbiddenExp) return(0); if (tmp == emptyExp) return(1); if ((tmp != NULL) && (IS_NILLABLE(tmp))) { xmlExpFree(ctxt, tmp); return(1); } xmlExpFree(ctxt, tmp); return(0); } /************************************************************************ * * * Parsing expression * * * ************************************************************************/ static xmlExpNodePtr xmlExpParseExpr(xmlExpCtxtPtr ctxt); #undef CUR #define CUR (*ctxt->cur) #undef NEXT #define NEXT ctxt->cur++; #undef IS_BLANK #define IS_BLANK(c) ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) #define SKIP_BLANKS while (IS_BLANK(*ctxt->cur)) ctxt->cur++; static int xmlExpParseNumber(xmlExpCtxtPtr ctxt) { int ret = 0; SKIP_BLANKS if (CUR == '*') { NEXT return(-1); } if ((CUR < '0') || (CUR > '9')) return(-1); while ((CUR >= '0') && (CUR <= '9')) { ret = ret * 10 + (CUR - '0'); NEXT } return(ret); } static xmlExpNodePtr xmlExpParseOr(xmlExpCtxtPtr ctxt) { const char *base; xmlExpNodePtr ret; const xmlChar *val; SKIP_BLANKS base = ctxt->cur; if (*ctxt->cur == '(') { NEXT ret = xmlExpParseExpr(ctxt); SKIP_BLANKS if (*ctxt->cur != ')') { fprintf(stderr, "unbalanced '(' : %s\n", base); xmlExpFree(ctxt, ret); return(NULL); } NEXT; SKIP_BLANKS goto parse_quantifier; } while ((CUR != 0) && (!(IS_BLANK(CUR))) && (CUR != '(') && (CUR != ')') && (CUR != '|') && (CUR != ',') && (CUR != '{') && (CUR != '*') && (CUR != '+') && (CUR != '?') && (CUR != '}')) NEXT; val = xmlDictLookup(ctxt->dict, BAD_CAST base, ctxt->cur - base); if (val == NULL) return(NULL); ret = xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, val, 0, 0); if (ret == NULL) return(NULL); SKIP_BLANKS parse_quantifier: if (CUR == '{') { int min, max; NEXT min = xmlExpParseNumber(ctxt); if (min < 0) { xmlExpFree(ctxt, ret); return(NULL); } SKIP_BLANKS if (CUR == ',') { NEXT max = xmlExpParseNumber(ctxt); SKIP_BLANKS } else max = min; if (CUR != '}') { xmlExpFree(ctxt, ret); return(NULL); } NEXT ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, min, max); SKIP_BLANKS } else if (CUR == '?') { NEXT ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 0, 1); SKIP_BLANKS } else if (CUR == '+') { NEXT ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 1, -1); SKIP_BLANKS } else if (CUR == '*') { NEXT ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 0, -1); SKIP_BLANKS } return(ret); } static xmlExpNodePtr xmlExpParseSeq(xmlExpCtxtPtr ctxt) { xmlExpNodePtr ret, right; ret = xmlExpParseOr(ctxt); SKIP_BLANKS while (CUR == '|') { NEXT right = xmlExpParseOr(ctxt); if (right == NULL) { xmlExpFree(ctxt, ret); return(NULL); } ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, right, NULL, 0, 0); if (ret == NULL) return(NULL); } return(ret); } static xmlExpNodePtr xmlExpParseExpr(xmlExpCtxtPtr ctxt) { xmlExpNodePtr ret, right; ret = xmlExpParseSeq(ctxt); SKIP_BLANKS while (CUR == ',') { NEXT right = xmlExpParseSeq(ctxt); if (right == NULL) { xmlExpFree(ctxt, ret); return(NULL); } ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, right, NULL, 0, 0); if (ret == NULL) return(NULL); } return(ret); } /** * xmlExpParse: * @ctxt: the expressions context * @expr: the 0 terminated string * * Minimal parser for regexps, it understand the following constructs * - string terminals * - choice operator | * - sequence operator , * - subexpressions (...) * - usual cardinality operators + * and ? * - finite sequences { min, max } * - infinite sequences { min, * } * There is minimal checkings made especially no checking on strings values * * Returns a new expression or NULL in case of failure */ xmlExpNodePtr xmlExpParse(xmlExpCtxtPtr ctxt, const char *expr) { xmlExpNodePtr ret; ctxt->expr = expr; ctxt->cur = expr; ret = xmlExpParseExpr(ctxt); SKIP_BLANKS if (*ctxt->cur != 0) { xmlExpFree(ctxt, ret); return(NULL); } return(ret); } static void xmlExpDumpInt(xmlBufferPtr buf, xmlExpNodePtr expr, int glob) { xmlExpNodePtr c; if (expr == NULL) return; if (glob) xmlBufferWriteChar(buf, "("); switch (expr->type) { case XML_EXP_EMPTY: xmlBufferWriteChar(buf, "empty"); break; case XML_EXP_FORBID: xmlBufferWriteChar(buf, "forbidden"); break; case XML_EXP_ATOM: xmlBufferWriteCHAR(buf, expr->exp_str); break; case XML_EXP_SEQ: c = expr->exp_left; if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) xmlExpDumpInt(buf, c, 1); else xmlExpDumpInt(buf, c, 0); xmlBufferWriteChar(buf, " , "); c = expr->exp_right; if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) xmlExpDumpInt(buf, c, 1); else xmlExpDumpInt(buf, c, 0); break; case XML_EXP_OR: c = expr->exp_left; if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) xmlExpDumpInt(buf, c, 1); else xmlExpDumpInt(buf, c, 0); xmlBufferWriteChar(buf, " | "); c = expr->exp_right; if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) xmlExpDumpInt(buf, c, 1); else xmlExpDumpInt(buf, c, 0); break; case XML_EXP_COUNT: { char rep[40]; c = expr->exp_left; if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) xmlExpDumpInt(buf, c, 1); else xmlExpDumpInt(buf, c, 0); if ((expr->exp_min == 0) && (expr->exp_max == 1)) { rep[0] = '?'; rep[1] = 0; } else if ((expr->exp_min == 0) && (expr->exp_max == -1)) { rep[0] = '*'; rep[1] = 0; } else if ((expr->exp_min == 1) && (expr->exp_max == -1)) { rep[0] = '+'; rep[1] = 0; } else if (expr->exp_max == expr->exp_min) { snprintf(rep, 39, "{%d}", expr->exp_min); } else if (expr->exp_max < 0) { snprintf(rep, 39, "{%d,inf}", expr->exp_min); } else { snprintf(rep, 39, "{%d,%d}", expr->exp_min, expr->exp_max); } rep[39] = 0; xmlBufferWriteChar(buf, rep); break; } default: fprintf(stderr, "Error in tree\n"); } if (glob) xmlBufferWriteChar(buf, ")"); } /** * xmlExpDump: * @buf: a buffer to receive the output * @expr: the compiled expression * * Serialize the expression as compiled to the buffer */ void xmlExpDump(xmlBufferPtr buf, xmlExpNodePtr expr) { if ((buf == NULL) || (expr == NULL)) return; xmlExpDumpInt(buf, expr, 0); } /** * xmlExpMaxToken: * @expr: a compiled expression * * Indicate the maximum number of input a expression can accept * * Returns the maximum length or -1 in case of error */ int xmlExpMaxToken(xmlExpNodePtr expr) { if (expr == NULL) return(-1); return(expr->c_max); } /** * xmlExpCtxtNbNodes: * @ctxt: an expression context * * Debugging facility provides the number of allocated nodes at a that point * * Returns the number of nodes in use or -1 in case of error */ int xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt) { if (ctxt == NULL) return(-1); return(ctxt->nb_nodes); } /** * xmlExpCtxtNbCons: * @ctxt: an expression context * * Debugging facility provides the number of allocated nodes over lifetime * * Returns the number of nodes ever allocated or -1 in case of error */ int xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt) { if (ctxt == NULL) return(-1); return(ctxt->nb_cons); } #endif /* LIBXML_EXPR_ENABLED */ #define bottom_xmlregexp #include "elfgcchack.h" #endif /* LIBXML_REGEXP_ENABLED */ libxml2-2.9.1+dfsg1/include/0000755000175000017500000000000012134171765014206 5ustar aronaronlibxml2-2.9.1+dfsg1/include/win32config.h0000644000175000017500000000546312113312342016500 0ustar aronaron#ifndef __LIBXML_WIN32_CONFIG__ #define __LIBXML_WIN32_CONFIG__ #define HAVE_CTYPE_H #define HAVE_STDARG_H #define HAVE_MALLOC_H #define HAVE_ERRNO_H #if defined(_WIN32_WCE) #undef HAVE_ERRNO_H #include #include "wincecompat.h" #else #define HAVE_SYS_STAT_H #define HAVE__STAT #define HAVE_STAT #define HAVE_STDLIB_H #define HAVE_TIME_H #define HAVE_FCNTL_H #include #include #endif #include #ifndef ICONV_CONST #define ICONV_CONST const #endif #ifdef NEED_SOCKETS #include #endif /* * Windows platforms may define except */ #undef except #define HAVE_ISINF #define HAVE_ISNAN #include #if defined(_MSC_VER) || defined(__BORLANDC__) /* MS C-runtime has functions which can be used in order to determine if a given floating-point variable contains NaN, (+-)INF. These are preferred, because floating-point technology is considered propriatary by MS and we can assume that their functions know more about their oddities than we do. */ #include /* Bjorn Reese figured a quite nice construct for isinf() using the _fpclass function. */ #ifndef isinf #define isinf(d) ((_fpclass(d) == _FPCLASS_PINF) ? 1 \ : ((_fpclass(d) == _FPCLASS_NINF) ? -1 : 0)) #endif /* _isnan(x) returns nonzero if (x == NaN) and zero otherwise. */ #ifndef isnan #define isnan(d) (_isnan(d)) #endif #else /* _MSC_VER */ #ifndef isinf static int isinf (double d) { int expon = 0; double val = frexp (d, &expon); if (expon == 1025) { if (val == 0.5) { return 1; } else if (val == -0.5) { return -1; } else { return 0; } } else { return 0; } } #endif #ifndef isnan static int isnan (double d) { int expon = 0; double val = frexp (d, &expon); if (expon == 1025) { if (val == 0.5) { return 0; } else if (val == -0.5) { return 0; } else { return 1; } } else { return 0; } } #endif #endif /* _MSC_VER */ #if defined(_MSC_VER) #define mkdir(p,m) _mkdir(p) #define snprintf _snprintf #if _MSC_VER < 1500 #define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) #endif #elif defined(__MINGW32__) #define mkdir(p,m) _mkdir(p) #endif /* Threading API to use should be specified here for compatibility reasons. This is however best specified on the compiler's command-line. */ #if defined(LIBXML_THREAD_ENABLED) #if !defined(HAVE_PTHREAD_H) && !defined(HAVE_WIN32_THREADS) && !defined(_WIN32_WCE) #define HAVE_WIN32_THREADS #endif #endif /* Some third-party libraries far from our control assume the following is defined, which it is not if we don't include windows.h. */ #if !defined(FALSE) #define FALSE 0 #endif #if !defined(TRUE) #define TRUE (!(FALSE)) #endif #endif /* __LIBXML_WIN32_CONFIG__ */ libxml2-2.9.1+dfsg1/include/Makefile.in0000644000175000017500000005100712134171754016254 0ustar aronaron# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_THREAD_LIBS = @BASE_THREAD_LIBS@ C14N_OBJ = @C14N_OBJ@ CATALOG_OBJ = @CATALOG_OBJ@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@ CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@ DEBUG_OBJ = @DEBUG_OBJ@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCB_OBJ = @DOCB_OBJ@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTP_OBJ = @FTP_OBJ@ GREP = @GREP@ HAVE_ISINF = @HAVE_ISINF@ HAVE_ISNAN = @HAVE_ISNAN@ HTML_DIR = @HTML_DIR@ HTML_OBJ = @HTML_OBJ@ HTTP_OBJ = @HTTP_OBJ@ ICONV_LIBS = @ICONV_LIBS@ ICU_LIBS = @ICU_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_MAJOR_VERSION = @LIBXML_MAJOR_VERSION@ LIBXML_MICRO_VERSION = @LIBXML_MICRO_VERSION@ LIBXML_MINOR_VERSION = @LIBXML_MINOR_VERSION@ LIBXML_VERSION = @LIBXML_VERSION@ LIBXML_VERSION_EXTRA = @LIBXML_VERSION_EXTRA@ LIBXML_VERSION_INFO = @LIBXML_VERSION_INFO@ LIBXML_VERSION_NUMBER = @LIBXML_VERSION_NUMBER@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LZMA_CFLAGS = @LZMA_CFLAGS@ LZMA_LIBS = @LZMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODULE_EXTENSION = @MODULE_EXTENSION@ MODULE_PLATFORM_LIBS = @MODULE_PLATFORM_LIBS@ MV = @MV@ M_LIBS = @M_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PYTHON = @PYTHON@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_SITE_PACKAGES = @PYTHON_SITE_PACKAGES@ PYTHON_SUBDIR = @PYTHON_SUBDIR@ PYTHON_TESTS = @PYTHON_TESTS@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RDL_LIBS = @RDL_LIBS@ READER_TEST = @READER_TEST@ RELDATE = @RELDATE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STATIC_BINARIES = @STATIC_BINARIES@ STRIP = @STRIP@ TAR = @TAR@ TEST_C14N = @TEST_C14N@ TEST_CATALOG = @TEST_CATALOG@ TEST_DEBUG = @TEST_DEBUG@ TEST_HTML = @TEST_HTML@ TEST_MODULES = @TEST_MODULES@ TEST_PATTERN = @TEST_PATTERN@ TEST_PHTML = @TEST_PHTML@ TEST_PUSH = @TEST_PUSH@ TEST_REGEXPS = @TEST_REGEXPS@ TEST_SAX = @TEST_SAX@ TEST_SCHEMAS = @TEST_SCHEMAS@ TEST_SCHEMATRON = @TEST_SCHEMATRON@ TEST_THREADS = @TEST_THREADS@ TEST_VALID = @TEST_VALID@ TEST_VTIME = @TEST_VTIME@ TEST_XINCLUDE = @TEST_XINCLUDE@ TEST_XPATH = @TEST_XPATH@ TEST_XPTR = @TEST_XPTR@ THREAD_CFLAGS = @THREAD_CFLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ WITH_DOCB = @WITH_DOCB@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_LZMA = @WITH_LZMA@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ WITH_MODULES = @WITH_MODULES@ WITH_OUTPUT = @WITH_OUTPUT@ WITH_PATTERN = @WITH_PATTERN@ WITH_PUSH = @WITH_PUSH@ WITH_READER = @WITH_READER@ WITH_REGEXPS = @WITH_REGEXPS@ WITH_RUN_DEBUG = @WITH_RUN_DEBUG@ WITH_SAX1 = @WITH_SAX1@ WITH_SCHEMAS = @WITH_SCHEMAS@ WITH_SCHEMATRON = @WITH_SCHEMATRON@ WITH_THREADS = @WITH_THREADS@ WITH_THREAD_ALLOC = @WITH_THREAD_ALLOC@ WITH_TREE = @WITH_TREE@ WITH_TRIO = @WITH_TRIO@ WITH_VALID = @WITH_VALID@ WITH_WRITER = @WITH_WRITER@ WITH_XINCLUDE = @WITH_XINCLUDE@ WITH_XPATH = @WITH_XPATH@ WITH_XPTR = @WITH_XPTR@ WITH_ZLIB = @WITH_ZLIB@ XINCLUDE_OBJ = @XINCLUDE_OBJ@ XMLLINT = @XMLLINT@ XML_CFLAGS = @XML_CFLAGS@ XML_INCLUDEDIR = @XML_INCLUDEDIR@ XML_LIBDIR = @XML_LIBDIR@ XML_LIBS = @XML_LIBS@ XML_LIBTOOLLIBS = @XML_LIBTOOLLIBS@ XPATH_OBJ = @XPATH_OBJ@ XPTR_OBJ = @XPTR_OBJ@ XSLTPROC = @XSLTPROC@ Z_CFLAGS = @Z_CFLAGS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = libxml EXTRA_DIST = win32config.h wsockcompat.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libxml2-2.9.1+dfsg1/include/libxml/0000755000175000017500000000000012134171765015475 5ustar aronaronlibxml2-2.9.1+dfsg1/include/libxml/chvalid.h0000644000175000017500000001204711234335462017260 0ustar aronaron/* * Summary: Unicode character range checking * Description: this module exports interfaces for the character * range validation APIs * * This file is automatically generated from the cvs source * definition files using the genChRanges.py Python script * * Generation date: Mon Mar 27 11:09:48 2006 * Sources: chvalid.def * Author: William Brack */ #ifndef __XML_CHVALID_H__ #define __XML_CHVALID_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* * Define our typedefs and structures * */ typedef struct _xmlChSRange xmlChSRange; typedef xmlChSRange *xmlChSRangePtr; struct _xmlChSRange { unsigned short low; unsigned short high; }; typedef struct _xmlChLRange xmlChLRange; typedef xmlChLRange *xmlChLRangePtr; struct _xmlChLRange { unsigned int low; unsigned int high; }; typedef struct _xmlChRangeGroup xmlChRangeGroup; typedef xmlChRangeGroup *xmlChRangeGroupPtr; struct _xmlChRangeGroup { int nbShortRange; int nbLongRange; const xmlChSRange *shortRange; /* points to an array of ranges */ const xmlChLRange *longRange; }; /** * Range checking routine */ XMLPUBFUN int XMLCALL xmlCharInRange(unsigned int val, const xmlChRangeGroup *group); /** * xmlIsBaseChar_ch: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsBaseChar_ch(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \ ((0x61 <= (c)) && ((c) <= 0x7a)) || \ ((0xc0 <= (c)) && ((c) <= 0xd6)) || \ ((0xd8 <= (c)) && ((c) <= 0xf6)) || \ (0xf8 <= (c))) /** * xmlIsBaseCharQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsBaseCharQ(c) (((c) < 0x100) ? \ xmlIsBaseChar_ch((c)) : \ xmlCharInRange((c), &xmlIsBaseCharGroup)) XMLPUBVAR const xmlChRangeGroup xmlIsBaseCharGroup; /** * xmlIsBlank_ch: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsBlank_ch(c) (((c) == 0x20) || \ ((0x9 <= (c)) && ((c) <= 0xa)) || \ ((c) == 0xd)) /** * xmlIsBlankQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsBlankQ(c) (((c) < 0x100) ? \ xmlIsBlank_ch((c)) : 0) /** * xmlIsChar_ch: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsChar_ch(c) (((0x9 <= (c)) && ((c) <= 0xa)) || \ ((c) == 0xd) || \ (0x20 <= (c))) /** * xmlIsCharQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsCharQ(c) (((c) < 0x100) ? \ xmlIsChar_ch((c)) :\ (((0x100 <= (c)) && ((c) <= 0xd7ff)) || \ ((0xe000 <= (c)) && ((c) <= 0xfffd)) || \ ((0x10000 <= (c)) && ((c) <= 0x10ffff)))) XMLPUBVAR const xmlChRangeGroup xmlIsCharGroup; /** * xmlIsCombiningQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsCombiningQ(c) (((c) < 0x100) ? \ 0 : \ xmlCharInRange((c), &xmlIsCombiningGroup)) XMLPUBVAR const xmlChRangeGroup xmlIsCombiningGroup; /** * xmlIsDigit_ch: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsDigit_ch(c) (((0x30 <= (c)) && ((c) <= 0x39))) /** * xmlIsDigitQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsDigitQ(c) (((c) < 0x100) ? \ xmlIsDigit_ch((c)) : \ xmlCharInRange((c), &xmlIsDigitGroup)) XMLPUBVAR const xmlChRangeGroup xmlIsDigitGroup; /** * xmlIsExtender_ch: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsExtender_ch(c) (((c) == 0xb7)) /** * xmlIsExtenderQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsExtenderQ(c) (((c) < 0x100) ? \ xmlIsExtender_ch((c)) : \ xmlCharInRange((c), &xmlIsExtenderGroup)) XMLPUBVAR const xmlChRangeGroup xmlIsExtenderGroup; /** * xmlIsIdeographicQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsIdeographicQ(c) (((c) < 0x100) ? \ 0 :\ (((0x4e00 <= (c)) && ((c) <= 0x9fa5)) || \ ((c) == 0x3007) || \ ((0x3021 <= (c)) && ((c) <= 0x3029)))) XMLPUBVAR const xmlChRangeGroup xmlIsIdeographicGroup; XMLPUBVAR const unsigned char xmlIsPubidChar_tab[256]; /** * xmlIsPubidChar_ch: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsPubidChar_ch(c) (xmlIsPubidChar_tab[(c)]) /** * xmlIsPubidCharQ: * @c: char to validate * * Automatically generated by genChRanges.py */ #define xmlIsPubidCharQ(c) (((c) < 0x100) ? \ xmlIsPubidChar_ch((c)) : 0) XMLPUBFUN int XMLCALL xmlIsBaseChar(unsigned int ch); XMLPUBFUN int XMLCALL xmlIsBlank(unsigned int ch); XMLPUBFUN int XMLCALL xmlIsChar(unsigned int ch); XMLPUBFUN int XMLCALL xmlIsCombining(unsigned int ch); XMLPUBFUN int XMLCALL xmlIsDigit(unsigned int ch); XMLPUBFUN int XMLCALL xmlIsExtender(unsigned int ch); XMLPUBFUN int XMLCALL xmlIsIdeographic(unsigned int ch); XMLPUBFUN int XMLCALL xmlIsPubidChar(unsigned int ch); #ifdef __cplusplus } #endif #endif /* __XML_CHVALID_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlsave.h0000644000175000017500000000444112113312342017311 0ustar aronaron/* * Summary: the XML document serializer * Description: API to save document or subtree of document * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_XMLSAVE_H__ #define __XML_XMLSAVE_H__ #include #include #include #include #ifdef LIBXML_OUTPUT_ENABLED #ifdef __cplusplus extern "C" { #endif /** * xmlSaveOption: * * This is the set of XML save options that can be passed down * to the xmlSaveToFd() and similar calls. */ typedef enum { XML_SAVE_FORMAT = 1<<0, /* format save output */ XML_SAVE_NO_DECL = 1<<1, /* drop the xml declaration */ XML_SAVE_NO_EMPTY = 1<<2, /* no empty tags */ XML_SAVE_NO_XHTML = 1<<3, /* disable XHTML1 specific rules */ XML_SAVE_XHTML = 1<<4, /* force XHTML1 specific rules */ XML_SAVE_AS_XML = 1<<5, /* force XML serialization on HTML doc */ XML_SAVE_AS_HTML = 1<<6, /* force HTML serialization on XML doc */ XML_SAVE_WSNONSIG = 1<<7 /* format with non-significant whitespace */ } xmlSaveOption; typedef struct _xmlSaveCtxt xmlSaveCtxt; typedef xmlSaveCtxt *xmlSaveCtxtPtr; XMLPUBFUN xmlSaveCtxtPtr XMLCALL xmlSaveToFd (int fd, const char *encoding, int options); XMLPUBFUN xmlSaveCtxtPtr XMLCALL xmlSaveToFilename (const char *filename, const char *encoding, int options); XMLPUBFUN xmlSaveCtxtPtr XMLCALL xmlSaveToBuffer (xmlBufferPtr buffer, const char *encoding, int options); XMLPUBFUN xmlSaveCtxtPtr XMLCALL xmlSaveToIO (xmlOutputWriteCallback iowrite, xmlOutputCloseCallback ioclose, void *ioctx, const char *encoding, int options); XMLPUBFUN long XMLCALL xmlSaveDoc (xmlSaveCtxtPtr ctxt, xmlDocPtr doc); XMLPUBFUN long XMLCALL xmlSaveTree (xmlSaveCtxtPtr ctxt, xmlNodePtr node); XMLPUBFUN int XMLCALL xmlSaveFlush (xmlSaveCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlSaveClose (xmlSaveCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlSaveSetEscape (xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape); XMLPUBFUN int XMLCALL xmlSaveSetAttrEscape (xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape); #ifdef __cplusplus } #endif #endif /* LIBXML_OUTPUT_ENABLED */ #endif /* __XML_XMLSAVE_H__ */ libxml2-2.9.1+dfsg1/include/libxml/threads.h0000644000175000017500000000347412113312342017271 0ustar aronaron/** * Summary: interfaces for thread handling * Description: set of generic threading related routines * should work with pthreads, Windows native or TLS threads * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_THREADS_H__ #define __XML_THREADS_H__ #include #ifdef __cplusplus extern "C" { #endif /* * xmlMutex are a simple mutual exception locks. */ typedef struct _xmlMutex xmlMutex; typedef xmlMutex *xmlMutexPtr; /* * xmlRMutex are reentrant mutual exception locks. */ typedef struct _xmlRMutex xmlRMutex; typedef xmlRMutex *xmlRMutexPtr; #ifdef __cplusplus } #endif #include #ifdef __cplusplus extern "C" { #endif XMLPUBFUN xmlMutexPtr XMLCALL xmlNewMutex (void); XMLPUBFUN void XMLCALL xmlMutexLock (xmlMutexPtr tok); XMLPUBFUN void XMLCALL xmlMutexUnlock (xmlMutexPtr tok); XMLPUBFUN void XMLCALL xmlFreeMutex (xmlMutexPtr tok); XMLPUBFUN xmlRMutexPtr XMLCALL xmlNewRMutex (void); XMLPUBFUN void XMLCALL xmlRMutexLock (xmlRMutexPtr tok); XMLPUBFUN void XMLCALL xmlRMutexUnlock (xmlRMutexPtr tok); XMLPUBFUN void XMLCALL xmlFreeRMutex (xmlRMutexPtr tok); /* * Library wide APIs. */ XMLPUBFUN void XMLCALL xmlInitThreads (void); XMLPUBFUN void XMLCALL xmlLockLibrary (void); XMLPUBFUN void XMLCALL xmlUnlockLibrary(void); XMLPUBFUN int XMLCALL xmlGetThreadId (void); XMLPUBFUN int XMLCALL xmlIsMainThread (void); XMLPUBFUN void XMLCALL xmlCleanupThreads(void); XMLPUBFUN xmlGlobalStatePtr XMLCALL xmlGetGlobalState(void); #if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && defined(LIBXML_STATIC_FOR_DLL) int XMLCALL xmlDllMain(void *hinstDLL, unsigned long fdwReason, void *lpvReserved); #endif #ifdef __cplusplus } #endif #endif /* __XML_THREADS_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlmemory.h0000644000175000017500000001347112113312342017666 0ustar aronaron/* * Summary: interface for the memory allocator * Description: provides interfaces for the memory allocator, * including debugging capabilities. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __DEBUG_MEMORY_ALLOC__ #define __DEBUG_MEMORY_ALLOC__ #include #include /** * DEBUG_MEMORY: * * DEBUG_MEMORY replaces the allocator with a collect and debug * shell to the libc allocator. * DEBUG_MEMORY should only be activated when debugging * libxml i.e. if libxml has been configured with --with-debug-mem too. */ /* #define DEBUG_MEMORY_FREED */ /* #define DEBUG_MEMORY_LOCATION */ #ifdef DEBUG #ifndef DEBUG_MEMORY #define DEBUG_MEMORY #endif #endif /** * DEBUG_MEMORY_LOCATION: * * DEBUG_MEMORY_LOCATION should be activated only when debugging * libxml i.e. if libxml has been configured with --with-debug-mem too. */ #ifdef DEBUG_MEMORY_LOCATION #endif #ifdef __cplusplus extern "C" { #endif /* * The XML memory wrapper support 4 basic overloadable functions. */ /** * xmlFreeFunc: * @mem: an already allocated block of memory * * Signature for a free() implementation. */ typedef void (XMLCALL *xmlFreeFunc)(void *mem); /** * xmlMallocFunc: * @size: the size requested in bytes * * Signature for a malloc() implementation. * * Returns a pointer to the newly allocated block or NULL in case of error. */ typedef void *(LIBXML_ATTR_ALLOC_SIZE(1) XMLCALL *xmlMallocFunc)(size_t size); /** * xmlReallocFunc: * @mem: an already allocated block of memory * @size: the new size requested in bytes * * Signature for a realloc() implementation. * * Returns a pointer to the newly reallocated block or NULL in case of error. */ typedef void *(XMLCALL *xmlReallocFunc)(void *mem, size_t size); /** * xmlStrdupFunc: * @str: a zero terminated string * * Signature for an strdup() implementation. * * Returns the copy of the string or NULL in case of error. */ typedef char *(XMLCALL *xmlStrdupFunc)(const char *str); /* * The 4 interfaces used for all memory handling within libxml. LIBXML_DLL_IMPORT xmlFreeFunc xmlFree; LIBXML_DLL_IMPORT xmlMallocFunc xmlMalloc; LIBXML_DLL_IMPORT xmlMallocFunc xmlMallocAtomic; LIBXML_DLL_IMPORT xmlReallocFunc xmlRealloc; LIBXML_DLL_IMPORT xmlStrdupFunc xmlMemStrdup; */ /* * The way to overload the existing functions. * The xmlGc function have an extra entry for atomic block * allocations useful for garbage collected memory allocators */ XMLPUBFUN int XMLCALL xmlMemSetup (xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, xmlReallocFunc reallocFunc, xmlStrdupFunc strdupFunc); XMLPUBFUN int XMLCALL xmlMemGet (xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc, xmlReallocFunc *reallocFunc, xmlStrdupFunc *strdupFunc); XMLPUBFUN int XMLCALL xmlGcMemSetup (xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, xmlMallocFunc mallocAtomicFunc, xmlReallocFunc reallocFunc, xmlStrdupFunc strdupFunc); XMLPUBFUN int XMLCALL xmlGcMemGet (xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc, xmlMallocFunc *mallocAtomicFunc, xmlReallocFunc *reallocFunc, xmlStrdupFunc *strdupFunc); /* * Initialization of the memory layer. */ XMLPUBFUN int XMLCALL xmlInitMemory (void); /* * Cleanup of the memory layer. */ XMLPUBFUN void XMLCALL xmlCleanupMemory (void); /* * These are specific to the XML debug memory wrapper. */ XMLPUBFUN int XMLCALL xmlMemUsed (void); XMLPUBFUN int XMLCALL xmlMemBlocks (void); XMLPUBFUN void XMLCALL xmlMemDisplay (FILE *fp); XMLPUBFUN void XMLCALL xmlMemDisplayLast(FILE *fp, long nbBytes); XMLPUBFUN void XMLCALL xmlMemShow (FILE *fp, int nr); XMLPUBFUN void XMLCALL xmlMemoryDump (void); XMLPUBFUN void * XMLCALL xmlMemMalloc (size_t size) LIBXML_ATTR_ALLOC_SIZE(1); XMLPUBFUN void * XMLCALL xmlMemRealloc (void *ptr,size_t size); XMLPUBFUN void XMLCALL xmlMemFree (void *ptr); XMLPUBFUN char * XMLCALL xmlMemoryStrdup (const char *str); XMLPUBFUN void * XMLCALL xmlMallocLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1); XMLPUBFUN void * XMLCALL xmlReallocLoc (void *ptr, size_t size, const char *file, int line); XMLPUBFUN void * XMLCALL xmlMallocAtomicLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1); XMLPUBFUN char * XMLCALL xmlMemStrdupLoc (const char *str, const char *file, int line); #ifdef DEBUG_MEMORY_LOCATION /** * xmlMalloc: * @size: number of bytes to allocate * * Wrapper for the malloc() function used in the XML library. * * Returns the pointer to the allocated area or NULL in case of error. */ #define xmlMalloc(size) xmlMallocLoc((size), __FILE__, __LINE__) /** * xmlMallocAtomic: * @size: number of bytes to allocate * * Wrapper for the malloc() function used in the XML library for allocation * of block not containing pointers to other areas. * * Returns the pointer to the allocated area or NULL in case of error. */ #define xmlMallocAtomic(size) xmlMallocAtomicLoc((size), __FILE__, __LINE__) /** * xmlRealloc: * @ptr: pointer to the existing allocated area * @size: number of bytes to allocate * * Wrapper for the realloc() function used in the XML library. * * Returns the pointer to the allocated area or NULL in case of error. */ #define xmlRealloc(ptr, size) xmlReallocLoc((ptr), (size), __FILE__, __LINE__) /** * xmlMemStrdup: * @str: pointer to the existing string * * Wrapper for the strdup() function, xmlStrdup() is usually preferred. * * Returns the pointer to the allocated area or NULL in case of error. */ #define xmlMemStrdup(str) xmlMemStrdupLoc((str), __FILE__, __LINE__) #endif /* DEBUG_MEMORY_LOCATION */ #ifdef __cplusplus } #endif /* __cplusplus */ #ifndef __XML_GLOBALS_H #ifndef __XML_THREADS_H__ #include #include #endif #endif #endif /* __DEBUG_MEMORY_ALLOC__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlschemastypes.h0000644000175000017500000001135112113312342021061 0ustar aronaron/* * Summary: implementation of XML Schema Datatypes * Description: module providing the XML Schema Datatypes implementation * both definition and validity checking * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_SCHEMA_TYPES_H__ #define __XML_SCHEMA_TYPES_H__ #include #ifdef LIBXML_SCHEMAS_ENABLED #include #include #ifdef __cplusplus extern "C" { #endif typedef enum { XML_SCHEMA_WHITESPACE_UNKNOWN = 0, XML_SCHEMA_WHITESPACE_PRESERVE = 1, XML_SCHEMA_WHITESPACE_REPLACE = 2, XML_SCHEMA_WHITESPACE_COLLAPSE = 3 } xmlSchemaWhitespaceValueType; XMLPUBFUN void XMLCALL xmlSchemaInitTypes (void); XMLPUBFUN void XMLCALL xmlSchemaCleanupTypes (void); XMLPUBFUN xmlSchemaTypePtr XMLCALL xmlSchemaGetPredefinedType (const xmlChar *name, const xmlChar *ns); XMLPUBFUN int XMLCALL xmlSchemaValidatePredefinedType (xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val); XMLPUBFUN int XMLCALL xmlSchemaValPredefTypeNode (xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val, xmlNodePtr node); XMLPUBFUN int XMLCALL xmlSchemaValidateFacet (xmlSchemaTypePtr base, xmlSchemaFacetPtr facet, const xmlChar *value, xmlSchemaValPtr val); XMLPUBFUN int XMLCALL xmlSchemaValidateFacetWhtsp (xmlSchemaFacetPtr facet, xmlSchemaWhitespaceValueType fws, xmlSchemaValType valType, const xmlChar *value, xmlSchemaValPtr val, xmlSchemaWhitespaceValueType ws); XMLPUBFUN void XMLCALL xmlSchemaFreeValue (xmlSchemaValPtr val); XMLPUBFUN xmlSchemaFacetPtr XMLCALL xmlSchemaNewFacet (void); XMLPUBFUN int XMLCALL xmlSchemaCheckFacet (xmlSchemaFacetPtr facet, xmlSchemaTypePtr typeDecl, xmlSchemaParserCtxtPtr ctxt, const xmlChar *name); XMLPUBFUN void XMLCALL xmlSchemaFreeFacet (xmlSchemaFacetPtr facet); XMLPUBFUN int XMLCALL xmlSchemaCompareValues (xmlSchemaValPtr x, xmlSchemaValPtr y); XMLPUBFUN xmlSchemaTypePtr XMLCALL xmlSchemaGetBuiltInListSimpleTypeItemType (xmlSchemaTypePtr type); XMLPUBFUN int XMLCALL xmlSchemaValidateListSimpleTypeFacet (xmlSchemaFacetPtr facet, const xmlChar *value, unsigned long actualLen, unsigned long *expectedLen); XMLPUBFUN xmlSchemaTypePtr XMLCALL xmlSchemaGetBuiltInType (xmlSchemaValType type); XMLPUBFUN int XMLCALL xmlSchemaIsBuiltInTypeFacet (xmlSchemaTypePtr type, int facetType); XMLPUBFUN xmlChar * XMLCALL xmlSchemaCollapseString (const xmlChar *value); XMLPUBFUN xmlChar * XMLCALL xmlSchemaWhiteSpaceReplace (const xmlChar *value); XMLPUBFUN unsigned long XMLCALL xmlSchemaGetFacetValueAsULong (xmlSchemaFacetPtr facet); XMLPUBFUN int XMLCALL xmlSchemaValidateLengthFacet (xmlSchemaTypePtr type, xmlSchemaFacetPtr facet, const xmlChar *value, xmlSchemaValPtr val, unsigned long *length); XMLPUBFUN int XMLCALL xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, xmlSchemaValType valType, const xmlChar *value, xmlSchemaValPtr val, unsigned long *length, xmlSchemaWhitespaceValueType ws); XMLPUBFUN int XMLCALL xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val, xmlNodePtr node); XMLPUBFUN int XMLCALL xmlSchemaGetCanonValue (xmlSchemaValPtr val, const xmlChar **retValue); XMLPUBFUN int XMLCALL xmlSchemaGetCanonValueWhtsp (xmlSchemaValPtr val, const xmlChar **retValue, xmlSchemaWhitespaceValueType ws); XMLPUBFUN int XMLCALL xmlSchemaValueAppend (xmlSchemaValPtr prev, xmlSchemaValPtr cur); XMLPUBFUN xmlSchemaValPtr XMLCALL xmlSchemaValueGetNext (xmlSchemaValPtr cur); XMLPUBFUN const xmlChar * XMLCALL xmlSchemaValueGetAsString (xmlSchemaValPtr val); XMLPUBFUN int XMLCALL xmlSchemaValueGetAsBoolean (xmlSchemaValPtr val); XMLPUBFUN xmlSchemaValPtr XMLCALL xmlSchemaNewStringValue (xmlSchemaValType type, const xmlChar *value); XMLPUBFUN xmlSchemaValPtr XMLCALL xmlSchemaNewNOTATIONValue (const xmlChar *name, const xmlChar *ns); XMLPUBFUN xmlSchemaValPtr XMLCALL xmlSchemaNewQNameValue (const xmlChar *namespaceName, const xmlChar *localName); XMLPUBFUN int XMLCALL xmlSchemaCompareValuesWhtsp (xmlSchemaValPtr x, xmlSchemaWhitespaceValueType xws, xmlSchemaValPtr y, xmlSchemaWhitespaceValueType yws); XMLPUBFUN xmlSchemaValPtr XMLCALL xmlSchemaCopyValue (xmlSchemaValPtr val); XMLPUBFUN xmlSchemaValType XMLCALL xmlSchemaGetValType (xmlSchemaValPtr val); #ifdef __cplusplus } #endif #endif /* LIBXML_SCHEMAS_ENABLED */ #endif /* __XML_SCHEMA_TYPES_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlexports.h0000644000175000017500000000752012113312342020060 0ustar aronaron/* * Summary: macros for marking symbols as exportable/importable. * Description: macros for marking symbols as exportable/importable. * * Copy: See Copyright for the status of this software. * * Author: Igor Zlatovic */ #ifndef __XML_EXPORTS_H__ #define __XML_EXPORTS_H__ /** * XMLPUBFUN, XMLPUBVAR, XMLCALL * * Macros which declare an exportable function, an exportable variable and * the calling convention used for functions. * * Please use an extra block for every platform/compiler combination when * modifying this, rather than overlong #ifdef lines. This helps * readability as well as the fact that different compilers on the same * platform might need different definitions. */ /** * XMLPUBFUN: * * Macros which declare an exportable function */ #define XMLPUBFUN /** * XMLPUBVAR: * * Macros which declare an exportable variable */ #define XMLPUBVAR extern /** * XMLCALL: * * Macros which declare the called convention for exported functions */ #define XMLCALL /** * XMLCDECL: * * Macro which declares the calling convention for exported functions that * use '...'. */ #define XMLCDECL /** DOC_DISABLE */ /* Windows platform with MS compiler */ #if defined(_WIN32) && defined(_MSC_VER) #undef XMLPUBFUN #undef XMLPUBVAR #undef XMLCALL #undef XMLCDECL #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) #define XMLPUBFUN __declspec(dllexport) #define XMLPUBVAR __declspec(dllexport) #else #define XMLPUBFUN #if !defined(LIBXML_STATIC) #define XMLPUBVAR __declspec(dllimport) extern #else #define XMLPUBVAR extern #endif #endif #if defined(LIBXML_FASTCALL) #define XMLCALL __fastcall #else #define XMLCALL __cdecl #endif #define XMLCDECL __cdecl #if !defined _REENTRANT #define _REENTRANT #endif #endif /* Windows platform with Borland compiler */ #if defined(_WIN32) && defined(__BORLANDC__) #undef XMLPUBFUN #undef XMLPUBVAR #undef XMLCALL #undef XMLCDECL #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) #define XMLPUBFUN __declspec(dllexport) #define XMLPUBVAR __declspec(dllexport) extern #else #define XMLPUBFUN #if !defined(LIBXML_STATIC) #define XMLPUBVAR __declspec(dllimport) extern #else #define XMLPUBVAR extern #endif #endif #define XMLCALL __cdecl #define XMLCDECL __cdecl #if !defined _REENTRANT #define _REENTRANT #endif #endif /* Windows platform with GNU compiler (Mingw) */ #if defined(_WIN32) && defined(__MINGW32__) #undef XMLPUBFUN #undef XMLPUBVAR #undef XMLCALL #undef XMLCDECL /* * if defined(IN_LIBXML) this raises problems on mingw with msys * _imp__xmlFree listed as missing. Try to workaround the problem * by also making that declaration when compiling client code. */ #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) #define XMLPUBFUN __declspec(dllexport) #define XMLPUBVAR __declspec(dllexport) extern #else #define XMLPUBFUN #if !defined(LIBXML_STATIC) #define XMLPUBVAR __declspec(dllimport) extern #else #define XMLPUBVAR extern #endif #endif #define XMLCALL __cdecl #define XMLCDECL __cdecl #if !defined _REENTRANT #define _REENTRANT #endif #endif /* Cygwin platform, GNU compiler */ #if defined(_WIN32) && defined(__CYGWIN__) #undef XMLPUBFUN #undef XMLPUBVAR #undef XMLCALL #undef XMLCDECL #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) #define XMLPUBFUN __declspec(dllexport) #define XMLPUBVAR __declspec(dllexport) #else #define XMLPUBFUN #if !defined(LIBXML_STATIC) #define XMLPUBVAR __declspec(dllimport) extern #else #define XMLPUBVAR #endif #endif #define XMLCALL __cdecl #define XMLCDECL __cdecl #endif /* Compatibility */ #if !defined(LIBXML_DLL_IMPORT) #define LIBXML_DLL_IMPORT XMLPUBVAR #endif #endif /* __XML_EXPORTS_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlerror.h0000644000175000017500000010770312131465256017526 0ustar aronaron/* * Summary: error handling * Description: the API used to report errors * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #include #ifndef __XML_ERROR_H__ #define __XML_ERROR_H__ #ifdef __cplusplus extern "C" { #endif /** * xmlErrorLevel: * * Indicates the level of an error */ typedef enum { XML_ERR_NONE = 0, XML_ERR_WARNING = 1, /* A simple warning */ XML_ERR_ERROR = 2, /* A recoverable error */ XML_ERR_FATAL = 3 /* A fatal error */ } xmlErrorLevel; /** * xmlErrorDomain: * * Indicates where an error may have come from */ typedef enum { XML_FROM_NONE = 0, XML_FROM_PARSER, /* The XML parser */ XML_FROM_TREE, /* The tree module */ XML_FROM_NAMESPACE, /* The XML Namespace module */ XML_FROM_DTD, /* The XML DTD validation with parser context*/ XML_FROM_HTML, /* The HTML parser */ XML_FROM_MEMORY, /* The memory allocator */ XML_FROM_OUTPUT, /* The serialization code */ XML_FROM_IO, /* The Input/Output stack */ XML_FROM_FTP, /* The FTP module */ XML_FROM_HTTP, /* The HTTP module */ XML_FROM_XINCLUDE, /* The XInclude processing */ XML_FROM_XPATH, /* The XPath module */ XML_FROM_XPOINTER, /* The XPointer module */ XML_FROM_REGEXP, /* The regular expressions module */ XML_FROM_DATATYPE, /* The W3C XML Schemas Datatype module */ XML_FROM_SCHEMASP, /* The W3C XML Schemas parser module */ XML_FROM_SCHEMASV, /* The W3C XML Schemas validation module */ XML_FROM_RELAXNGP, /* The Relax-NG parser module */ XML_FROM_RELAXNGV, /* The Relax-NG validator module */ XML_FROM_CATALOG, /* The Catalog module */ XML_FROM_C14N, /* The Canonicalization module */ XML_FROM_XSLT, /* The XSLT engine from libxslt */ XML_FROM_VALID, /* The XML DTD validation with valid context */ XML_FROM_CHECK, /* The error checking module */ XML_FROM_WRITER, /* The xmlwriter module */ XML_FROM_MODULE, /* The dynamically loaded module module*/ XML_FROM_I18N, /* The module handling character conversion */ XML_FROM_SCHEMATRONV,/* The Schematron validator module */ XML_FROM_BUFFER, /* The buffers module */ XML_FROM_URI /* The URI module */ } xmlErrorDomain; /** * xmlError: * * An XML Error instance. */ typedef struct _xmlError xmlError; typedef xmlError *xmlErrorPtr; struct _xmlError { int domain; /* What part of the library raised this error */ int code; /* The error code, e.g. an xmlParserError */ char *message;/* human-readable informative error message */ xmlErrorLevel level;/* how consequent is the error */ char *file; /* the filename */ int line; /* the line number if available */ char *str1; /* extra string information */ char *str2; /* extra string information */ char *str3; /* extra string information */ int int1; /* extra number information */ int int2; /* column number of the error or 0 if N/A (todo: rename this field when we would break ABI) */ void *ctxt; /* the parser context if available */ void *node; /* the node in the tree */ }; /** * xmlParserError: * * This is an error that the XML (or HTML) parser can generate */ typedef enum { XML_ERR_OK = 0, XML_ERR_INTERNAL_ERROR, /* 1 */ XML_ERR_NO_MEMORY, /* 2 */ XML_ERR_DOCUMENT_START, /* 3 */ XML_ERR_DOCUMENT_EMPTY, /* 4 */ XML_ERR_DOCUMENT_END, /* 5 */ XML_ERR_INVALID_HEX_CHARREF, /* 6 */ XML_ERR_INVALID_DEC_CHARREF, /* 7 */ XML_ERR_INVALID_CHARREF, /* 8 */ XML_ERR_INVALID_CHAR, /* 9 */ XML_ERR_CHARREF_AT_EOF, /* 10 */ XML_ERR_CHARREF_IN_PROLOG, /* 11 */ XML_ERR_CHARREF_IN_EPILOG, /* 12 */ XML_ERR_CHARREF_IN_DTD, /* 13 */ XML_ERR_ENTITYREF_AT_EOF, /* 14 */ XML_ERR_ENTITYREF_IN_PROLOG, /* 15 */ XML_ERR_ENTITYREF_IN_EPILOG, /* 16 */ XML_ERR_ENTITYREF_IN_DTD, /* 17 */ XML_ERR_PEREF_AT_EOF, /* 18 */ XML_ERR_PEREF_IN_PROLOG, /* 19 */ XML_ERR_PEREF_IN_EPILOG, /* 20 */ XML_ERR_PEREF_IN_INT_SUBSET, /* 21 */ XML_ERR_ENTITYREF_NO_NAME, /* 22 */ XML_ERR_ENTITYREF_SEMICOL_MISSING, /* 23 */ XML_ERR_PEREF_NO_NAME, /* 24 */ XML_ERR_PEREF_SEMICOL_MISSING, /* 25 */ XML_ERR_UNDECLARED_ENTITY, /* 26 */ XML_WAR_UNDECLARED_ENTITY, /* 27 */ XML_ERR_UNPARSED_ENTITY, /* 28 */ XML_ERR_ENTITY_IS_EXTERNAL, /* 29 */ XML_ERR_ENTITY_IS_PARAMETER, /* 30 */ XML_ERR_UNKNOWN_ENCODING, /* 31 */ XML_ERR_UNSUPPORTED_ENCODING, /* 32 */ XML_ERR_STRING_NOT_STARTED, /* 33 */ XML_ERR_STRING_NOT_CLOSED, /* 34 */ XML_ERR_NS_DECL_ERROR, /* 35 */ XML_ERR_ENTITY_NOT_STARTED, /* 36 */ XML_ERR_ENTITY_NOT_FINISHED, /* 37 */ XML_ERR_LT_IN_ATTRIBUTE, /* 38 */ XML_ERR_ATTRIBUTE_NOT_STARTED, /* 39 */ XML_ERR_ATTRIBUTE_NOT_FINISHED, /* 40 */ XML_ERR_ATTRIBUTE_WITHOUT_VALUE, /* 41 */ XML_ERR_ATTRIBUTE_REDEFINED, /* 42 */ XML_ERR_LITERAL_NOT_STARTED, /* 43 */ XML_ERR_LITERAL_NOT_FINISHED, /* 44 */ XML_ERR_COMMENT_NOT_FINISHED, /* 45 */ XML_ERR_PI_NOT_STARTED, /* 46 */ XML_ERR_PI_NOT_FINISHED, /* 47 */ XML_ERR_NOTATION_NOT_STARTED, /* 48 */ XML_ERR_NOTATION_NOT_FINISHED, /* 49 */ XML_ERR_ATTLIST_NOT_STARTED, /* 50 */ XML_ERR_ATTLIST_NOT_FINISHED, /* 51 */ XML_ERR_MIXED_NOT_STARTED, /* 52 */ XML_ERR_MIXED_NOT_FINISHED, /* 53 */ XML_ERR_ELEMCONTENT_NOT_STARTED, /* 54 */ XML_ERR_ELEMCONTENT_NOT_FINISHED, /* 55 */ XML_ERR_XMLDECL_NOT_STARTED, /* 56 */ XML_ERR_XMLDECL_NOT_FINISHED, /* 57 */ XML_ERR_CONDSEC_NOT_STARTED, /* 58 */ XML_ERR_CONDSEC_NOT_FINISHED, /* 59 */ XML_ERR_EXT_SUBSET_NOT_FINISHED, /* 60 */ XML_ERR_DOCTYPE_NOT_FINISHED, /* 61 */ XML_ERR_MISPLACED_CDATA_END, /* 62 */ XML_ERR_CDATA_NOT_FINISHED, /* 63 */ XML_ERR_RESERVED_XML_NAME, /* 64 */ XML_ERR_SPACE_REQUIRED, /* 65 */ XML_ERR_SEPARATOR_REQUIRED, /* 66 */ XML_ERR_NMTOKEN_REQUIRED, /* 67 */ XML_ERR_NAME_REQUIRED, /* 68 */ XML_ERR_PCDATA_REQUIRED, /* 69 */ XML_ERR_URI_REQUIRED, /* 70 */ XML_ERR_PUBID_REQUIRED, /* 71 */ XML_ERR_LT_REQUIRED, /* 72 */ XML_ERR_GT_REQUIRED, /* 73 */ XML_ERR_LTSLASH_REQUIRED, /* 74 */ XML_ERR_EQUAL_REQUIRED, /* 75 */ XML_ERR_TAG_NAME_MISMATCH, /* 76 */ XML_ERR_TAG_NOT_FINISHED, /* 77 */ XML_ERR_STANDALONE_VALUE, /* 78 */ XML_ERR_ENCODING_NAME, /* 79 */ XML_ERR_HYPHEN_IN_COMMENT, /* 80 */ XML_ERR_INVALID_ENCODING, /* 81 */ XML_ERR_EXT_ENTITY_STANDALONE, /* 82 */ XML_ERR_CONDSEC_INVALID, /* 83 */ XML_ERR_VALUE_REQUIRED, /* 84 */ XML_ERR_NOT_WELL_BALANCED, /* 85 */ XML_ERR_EXTRA_CONTENT, /* 86 */ XML_ERR_ENTITY_CHAR_ERROR, /* 87 */ XML_ERR_ENTITY_PE_INTERNAL, /* 88 */ XML_ERR_ENTITY_LOOP, /* 89 */ XML_ERR_ENTITY_BOUNDARY, /* 90 */ XML_ERR_INVALID_URI, /* 91 */ XML_ERR_URI_FRAGMENT, /* 92 */ XML_WAR_CATALOG_PI, /* 93 */ XML_ERR_NO_DTD, /* 94 */ XML_ERR_CONDSEC_INVALID_KEYWORD, /* 95 */ XML_ERR_VERSION_MISSING, /* 96 */ XML_WAR_UNKNOWN_VERSION, /* 97 */ XML_WAR_LANG_VALUE, /* 98 */ XML_WAR_NS_URI, /* 99 */ XML_WAR_NS_URI_RELATIVE, /* 100 */ XML_ERR_MISSING_ENCODING, /* 101 */ XML_WAR_SPACE_VALUE, /* 102 */ XML_ERR_NOT_STANDALONE, /* 103 */ XML_ERR_ENTITY_PROCESSING, /* 104 */ XML_ERR_NOTATION_PROCESSING, /* 105 */ XML_WAR_NS_COLUMN, /* 106 */ XML_WAR_ENTITY_REDEFINED, /* 107 */ XML_ERR_UNKNOWN_VERSION, /* 108 */ XML_ERR_VERSION_MISMATCH, /* 109 */ XML_ERR_NAME_TOO_LONG, /* 110 */ XML_ERR_USER_STOP, /* 111 */ XML_NS_ERR_XML_NAMESPACE = 200, XML_NS_ERR_UNDEFINED_NAMESPACE, /* 201 */ XML_NS_ERR_QNAME, /* 202 */ XML_NS_ERR_ATTRIBUTE_REDEFINED, /* 203 */ XML_NS_ERR_EMPTY, /* 204 */ XML_NS_ERR_COLON, /* 205 */ XML_DTD_ATTRIBUTE_DEFAULT = 500, XML_DTD_ATTRIBUTE_REDEFINED, /* 501 */ XML_DTD_ATTRIBUTE_VALUE, /* 502 */ XML_DTD_CONTENT_ERROR, /* 503 */ XML_DTD_CONTENT_MODEL, /* 504 */ XML_DTD_CONTENT_NOT_DETERMINIST, /* 505 */ XML_DTD_DIFFERENT_PREFIX, /* 506 */ XML_DTD_ELEM_DEFAULT_NAMESPACE, /* 507 */ XML_DTD_ELEM_NAMESPACE, /* 508 */ XML_DTD_ELEM_REDEFINED, /* 509 */ XML_DTD_EMPTY_NOTATION, /* 510 */ XML_DTD_ENTITY_TYPE, /* 511 */ XML_DTD_ID_FIXED, /* 512 */ XML_DTD_ID_REDEFINED, /* 513 */ XML_DTD_ID_SUBSET, /* 514 */ XML_DTD_INVALID_CHILD, /* 515 */ XML_DTD_INVALID_DEFAULT, /* 516 */ XML_DTD_LOAD_ERROR, /* 517 */ XML_DTD_MISSING_ATTRIBUTE, /* 518 */ XML_DTD_MIXED_CORRUPT, /* 519 */ XML_DTD_MULTIPLE_ID, /* 520 */ XML_DTD_NO_DOC, /* 521 */ XML_DTD_NO_DTD, /* 522 */ XML_DTD_NO_ELEM_NAME, /* 523 */ XML_DTD_NO_PREFIX, /* 524 */ XML_DTD_NO_ROOT, /* 525 */ XML_DTD_NOTATION_REDEFINED, /* 526 */ XML_DTD_NOTATION_VALUE, /* 527 */ XML_DTD_NOT_EMPTY, /* 528 */ XML_DTD_NOT_PCDATA, /* 529 */ XML_DTD_NOT_STANDALONE, /* 530 */ XML_DTD_ROOT_NAME, /* 531 */ XML_DTD_STANDALONE_WHITE_SPACE, /* 532 */ XML_DTD_UNKNOWN_ATTRIBUTE, /* 533 */ XML_DTD_UNKNOWN_ELEM, /* 534 */ XML_DTD_UNKNOWN_ENTITY, /* 535 */ XML_DTD_UNKNOWN_ID, /* 536 */ XML_DTD_UNKNOWN_NOTATION, /* 537 */ XML_DTD_STANDALONE_DEFAULTED, /* 538 */ XML_DTD_XMLID_VALUE, /* 539 */ XML_DTD_XMLID_TYPE, /* 540 */ XML_DTD_DUP_TOKEN, /* 541 */ XML_HTML_STRUCURE_ERROR = 800, XML_HTML_UNKNOWN_TAG, /* 801 */ XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000, XML_RNGP_ATTR_CONFLICT, /* 1001 */ XML_RNGP_ATTRIBUTE_CHILDREN, /* 1002 */ XML_RNGP_ATTRIBUTE_CONTENT, /* 1003 */ XML_RNGP_ATTRIBUTE_EMPTY, /* 1004 */ XML_RNGP_ATTRIBUTE_NOOP, /* 1005 */ XML_RNGP_CHOICE_CONTENT, /* 1006 */ XML_RNGP_CHOICE_EMPTY, /* 1007 */ XML_RNGP_CREATE_FAILURE, /* 1008 */ XML_RNGP_DATA_CONTENT, /* 1009 */ XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, /* 1010 */ XML_RNGP_DEFINE_CREATE_FAILED, /* 1011 */ XML_RNGP_DEFINE_EMPTY, /* 1012 */ XML_RNGP_DEFINE_MISSING, /* 1013 */ XML_RNGP_DEFINE_NAME_MISSING, /* 1014 */ XML_RNGP_ELEM_CONTENT_EMPTY, /* 1015 */ XML_RNGP_ELEM_CONTENT_ERROR, /* 1016 */ XML_RNGP_ELEMENT_EMPTY, /* 1017 */ XML_RNGP_ELEMENT_CONTENT, /* 1018 */ XML_RNGP_ELEMENT_NAME, /* 1019 */ XML_RNGP_ELEMENT_NO_CONTENT, /* 1020 */ XML_RNGP_ELEM_TEXT_CONFLICT, /* 1021 */ XML_RNGP_EMPTY, /* 1022 */ XML_RNGP_EMPTY_CONSTRUCT, /* 1023 */ XML_RNGP_EMPTY_CONTENT, /* 1024 */ XML_RNGP_EMPTY_NOT_EMPTY, /* 1025 */ XML_RNGP_ERROR_TYPE_LIB, /* 1026 */ XML_RNGP_EXCEPT_EMPTY, /* 1027 */ XML_RNGP_EXCEPT_MISSING, /* 1028 */ XML_RNGP_EXCEPT_MULTIPLE, /* 1029 */ XML_RNGP_EXCEPT_NO_CONTENT, /* 1030 */ XML_RNGP_EXTERNALREF_EMTPY, /* 1031 */ XML_RNGP_EXTERNAL_REF_FAILURE, /* 1032 */ XML_RNGP_EXTERNALREF_RECURSE, /* 1033 */ XML_RNGP_FORBIDDEN_ATTRIBUTE, /* 1034 */ XML_RNGP_FOREIGN_ELEMENT, /* 1035 */ XML_RNGP_GRAMMAR_CONTENT, /* 1036 */ XML_RNGP_GRAMMAR_EMPTY, /* 1037 */ XML_RNGP_GRAMMAR_MISSING, /* 1038 */ XML_RNGP_GRAMMAR_NO_START, /* 1039 */ XML_RNGP_GROUP_ATTR_CONFLICT, /* 1040 */ XML_RNGP_HREF_ERROR, /* 1041 */ XML_RNGP_INCLUDE_EMPTY, /* 1042 */ XML_RNGP_INCLUDE_FAILURE, /* 1043 */ XML_RNGP_INCLUDE_RECURSE, /* 1044 */ XML_RNGP_INTERLEAVE_ADD, /* 1045 */ XML_RNGP_INTERLEAVE_CREATE_FAILED, /* 1046 */ XML_RNGP_INTERLEAVE_EMPTY, /* 1047 */ XML_RNGP_INTERLEAVE_NO_CONTENT, /* 1048 */ XML_RNGP_INVALID_DEFINE_NAME, /* 1049 */ XML_RNGP_INVALID_URI, /* 1050 */ XML_RNGP_INVALID_VALUE, /* 1051 */ XML_RNGP_MISSING_HREF, /* 1052 */ XML_RNGP_NAME_MISSING, /* 1053 */ XML_RNGP_NEED_COMBINE, /* 1054 */ XML_RNGP_NOTALLOWED_NOT_EMPTY, /* 1055 */ XML_RNGP_NSNAME_ATTR_ANCESTOR, /* 1056 */ XML_RNGP_NSNAME_NO_NS, /* 1057 */ XML_RNGP_PARAM_FORBIDDEN, /* 1058 */ XML_RNGP_PARAM_NAME_MISSING, /* 1059 */ XML_RNGP_PARENTREF_CREATE_FAILED, /* 1060 */ XML_RNGP_PARENTREF_NAME_INVALID, /* 1061 */ XML_RNGP_PARENTREF_NO_NAME, /* 1062 */ XML_RNGP_PARENTREF_NO_PARENT, /* 1063 */ XML_RNGP_PARENTREF_NOT_EMPTY, /* 1064 */ XML_RNGP_PARSE_ERROR, /* 1065 */ XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, /* 1066 */ XML_RNGP_PAT_ATTR_ATTR, /* 1067 */ XML_RNGP_PAT_ATTR_ELEM, /* 1068 */ XML_RNGP_PAT_DATA_EXCEPT_ATTR, /* 1069 */ XML_RNGP_PAT_DATA_EXCEPT_ELEM, /* 1070 */ XML_RNGP_PAT_DATA_EXCEPT_EMPTY, /* 1071 */ XML_RNGP_PAT_DATA_EXCEPT_GROUP, /* 1072 */ XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, /* 1073 */ XML_RNGP_PAT_DATA_EXCEPT_LIST, /* 1074 */ XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, /* 1075 */ XML_RNGP_PAT_DATA_EXCEPT_REF, /* 1076 */ XML_RNGP_PAT_DATA_EXCEPT_TEXT, /* 1077 */ XML_RNGP_PAT_LIST_ATTR, /* 1078 */ XML_RNGP_PAT_LIST_ELEM, /* 1079 */ XML_RNGP_PAT_LIST_INTERLEAVE, /* 1080 */ XML_RNGP_PAT_LIST_LIST, /* 1081 */ XML_RNGP_PAT_LIST_REF, /* 1082 */ XML_RNGP_PAT_LIST_TEXT, /* 1083 */ XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, /* 1084 */ XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, /* 1085 */ XML_RNGP_PAT_ONEMORE_GROUP_ATTR, /* 1086 */ XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, /* 1087 */ XML_RNGP_PAT_START_ATTR, /* 1088 */ XML_RNGP_PAT_START_DATA, /* 1089 */ XML_RNGP_PAT_START_EMPTY, /* 1090 */ XML_RNGP_PAT_START_GROUP, /* 1091 */ XML_RNGP_PAT_START_INTERLEAVE, /* 1092 */ XML_RNGP_PAT_START_LIST, /* 1093 */ XML_RNGP_PAT_START_ONEMORE, /* 1094 */ XML_RNGP_PAT_START_TEXT, /* 1095 */ XML_RNGP_PAT_START_VALUE, /* 1096 */ XML_RNGP_PREFIX_UNDEFINED, /* 1097 */ XML_RNGP_REF_CREATE_FAILED, /* 1098 */ XML_RNGP_REF_CYCLE, /* 1099 */ XML_RNGP_REF_NAME_INVALID, /* 1100 */ XML_RNGP_REF_NO_DEF, /* 1101 */ XML_RNGP_REF_NO_NAME, /* 1102 */ XML_RNGP_REF_NOT_EMPTY, /* 1103 */ XML_RNGP_START_CHOICE_AND_INTERLEAVE, /* 1104 */ XML_RNGP_START_CONTENT, /* 1105 */ XML_RNGP_START_EMPTY, /* 1106 */ XML_RNGP_START_MISSING, /* 1107 */ XML_RNGP_TEXT_EXPECTED, /* 1108 */ XML_RNGP_TEXT_HAS_CHILD, /* 1109 */ XML_RNGP_TYPE_MISSING, /* 1110 */ XML_RNGP_TYPE_NOT_FOUND, /* 1111 */ XML_RNGP_TYPE_VALUE, /* 1112 */ XML_RNGP_UNKNOWN_ATTRIBUTE, /* 1113 */ XML_RNGP_UNKNOWN_COMBINE, /* 1114 */ XML_RNGP_UNKNOWN_CONSTRUCT, /* 1115 */ XML_RNGP_UNKNOWN_TYPE_LIB, /* 1116 */ XML_RNGP_URI_FRAGMENT, /* 1117 */ XML_RNGP_URI_NOT_ABSOLUTE, /* 1118 */ XML_RNGP_VALUE_EMPTY, /* 1119 */ XML_RNGP_VALUE_NO_CONTENT, /* 1120 */ XML_RNGP_XMLNS_NAME, /* 1121 */ XML_RNGP_XML_NS, /* 1122 */ XML_XPATH_EXPRESSION_OK = 1200, XML_XPATH_NUMBER_ERROR, /* 1201 */ XML_XPATH_UNFINISHED_LITERAL_ERROR, /* 1202 */ XML_XPATH_START_LITERAL_ERROR, /* 1203 */ XML_XPATH_VARIABLE_REF_ERROR, /* 1204 */ XML_XPATH_UNDEF_VARIABLE_ERROR, /* 1205 */ XML_XPATH_INVALID_PREDICATE_ERROR, /* 1206 */ XML_XPATH_EXPR_ERROR, /* 1207 */ XML_XPATH_UNCLOSED_ERROR, /* 1208 */ XML_XPATH_UNKNOWN_FUNC_ERROR, /* 1209 */ XML_XPATH_INVALID_OPERAND, /* 1210 */ XML_XPATH_INVALID_TYPE, /* 1211 */ XML_XPATH_INVALID_ARITY, /* 1212 */ XML_XPATH_INVALID_CTXT_SIZE, /* 1213 */ XML_XPATH_INVALID_CTXT_POSITION, /* 1214 */ XML_XPATH_MEMORY_ERROR, /* 1215 */ XML_XPTR_SYNTAX_ERROR, /* 1216 */ XML_XPTR_RESOURCE_ERROR, /* 1217 */ XML_XPTR_SUB_RESOURCE_ERROR, /* 1218 */ XML_XPATH_UNDEF_PREFIX_ERROR, /* 1219 */ XML_XPATH_ENCODING_ERROR, /* 1220 */ XML_XPATH_INVALID_CHAR_ERROR, /* 1221 */ XML_TREE_INVALID_HEX = 1300, XML_TREE_INVALID_DEC, /* 1301 */ XML_TREE_UNTERMINATED_ENTITY, /* 1302 */ XML_TREE_NOT_UTF8, /* 1303 */ XML_SAVE_NOT_UTF8 = 1400, XML_SAVE_CHAR_INVALID, /* 1401 */ XML_SAVE_NO_DOCTYPE, /* 1402 */ XML_SAVE_UNKNOWN_ENCODING, /* 1403 */ XML_REGEXP_COMPILE_ERROR = 1450, XML_IO_UNKNOWN = 1500, XML_IO_EACCES, /* 1501 */ XML_IO_EAGAIN, /* 1502 */ XML_IO_EBADF, /* 1503 */ XML_IO_EBADMSG, /* 1504 */ XML_IO_EBUSY, /* 1505 */ XML_IO_ECANCELED, /* 1506 */ XML_IO_ECHILD, /* 1507 */ XML_IO_EDEADLK, /* 1508 */ XML_IO_EDOM, /* 1509 */ XML_IO_EEXIST, /* 1510 */ XML_IO_EFAULT, /* 1511 */ XML_IO_EFBIG, /* 1512 */ XML_IO_EINPROGRESS, /* 1513 */ XML_IO_EINTR, /* 1514 */ XML_IO_EINVAL, /* 1515 */ XML_IO_EIO, /* 1516 */ XML_IO_EISDIR, /* 1517 */ XML_IO_EMFILE, /* 1518 */ XML_IO_EMLINK, /* 1519 */ XML_IO_EMSGSIZE, /* 1520 */ XML_IO_ENAMETOOLONG, /* 1521 */ XML_IO_ENFILE, /* 1522 */ XML_IO_ENODEV, /* 1523 */ XML_IO_ENOENT, /* 1524 */ XML_IO_ENOEXEC, /* 1525 */ XML_IO_ENOLCK, /* 1526 */ XML_IO_ENOMEM, /* 1527 */ XML_IO_ENOSPC, /* 1528 */ XML_IO_ENOSYS, /* 1529 */ XML_IO_ENOTDIR, /* 1530 */ XML_IO_ENOTEMPTY, /* 1531 */ XML_IO_ENOTSUP, /* 1532 */ XML_IO_ENOTTY, /* 1533 */ XML_IO_ENXIO, /* 1534 */ XML_IO_EPERM, /* 1535 */ XML_IO_EPIPE, /* 1536 */ XML_IO_ERANGE, /* 1537 */ XML_IO_EROFS, /* 1538 */ XML_IO_ESPIPE, /* 1539 */ XML_IO_ESRCH, /* 1540 */ XML_IO_ETIMEDOUT, /* 1541 */ XML_IO_EXDEV, /* 1542 */ XML_IO_NETWORK_ATTEMPT, /* 1543 */ XML_IO_ENCODER, /* 1544 */ XML_IO_FLUSH, /* 1545 */ XML_IO_WRITE, /* 1546 */ XML_IO_NO_INPUT, /* 1547 */ XML_IO_BUFFER_FULL, /* 1548 */ XML_IO_LOAD_ERROR, /* 1549 */ XML_IO_ENOTSOCK, /* 1550 */ XML_IO_EISCONN, /* 1551 */ XML_IO_ECONNREFUSED, /* 1552 */ XML_IO_ENETUNREACH, /* 1553 */ XML_IO_EADDRINUSE, /* 1554 */ XML_IO_EALREADY, /* 1555 */ XML_IO_EAFNOSUPPORT, /* 1556 */ XML_XINCLUDE_RECURSION=1600, XML_XINCLUDE_PARSE_VALUE, /* 1601 */ XML_XINCLUDE_ENTITY_DEF_MISMATCH, /* 1602 */ XML_XINCLUDE_NO_HREF, /* 1603 */ XML_XINCLUDE_NO_FALLBACK, /* 1604 */ XML_XINCLUDE_HREF_URI, /* 1605 */ XML_XINCLUDE_TEXT_FRAGMENT, /* 1606 */ XML_XINCLUDE_TEXT_DOCUMENT, /* 1607 */ XML_XINCLUDE_INVALID_CHAR, /* 1608 */ XML_XINCLUDE_BUILD_FAILED, /* 1609 */ XML_XINCLUDE_UNKNOWN_ENCODING, /* 1610 */ XML_XINCLUDE_MULTIPLE_ROOT, /* 1611 */ XML_XINCLUDE_XPTR_FAILED, /* 1612 */ XML_XINCLUDE_XPTR_RESULT, /* 1613 */ XML_XINCLUDE_INCLUDE_IN_INCLUDE, /* 1614 */ XML_XINCLUDE_FALLBACKS_IN_INCLUDE, /* 1615 */ XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, /* 1616 */ XML_XINCLUDE_DEPRECATED_NS, /* 1617 */ XML_XINCLUDE_FRAGMENT_ID, /* 1618 */ XML_CATALOG_MISSING_ATTR = 1650, XML_CATALOG_ENTRY_BROKEN, /* 1651 */ XML_CATALOG_PREFER_VALUE, /* 1652 */ XML_CATALOG_NOT_CATALOG, /* 1653 */ XML_CATALOG_RECURSION, /* 1654 */ XML_SCHEMAP_PREFIX_UNDEFINED = 1700, XML_SCHEMAP_ATTRFORMDEFAULT_VALUE, /* 1701 */ XML_SCHEMAP_ATTRGRP_NONAME_NOREF, /* 1702 */ XML_SCHEMAP_ATTR_NONAME_NOREF, /* 1703 */ XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF, /* 1704 */ XML_SCHEMAP_ELEMFORMDEFAULT_VALUE, /* 1705 */ XML_SCHEMAP_ELEM_NONAME_NOREF, /* 1706 */ XML_SCHEMAP_EXTENSION_NO_BASE, /* 1707 */ XML_SCHEMAP_FACET_NO_VALUE, /* 1708 */ XML_SCHEMAP_FAILED_BUILD_IMPORT, /* 1709 */ XML_SCHEMAP_GROUP_NONAME_NOREF, /* 1710 */ XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI, /* 1711 */ XML_SCHEMAP_IMPORT_REDEFINE_NSNAME, /* 1712 */ XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI, /* 1713 */ XML_SCHEMAP_INVALID_BOOLEAN, /* 1714 */ XML_SCHEMAP_INVALID_ENUM, /* 1715 */ XML_SCHEMAP_INVALID_FACET, /* 1716 */ XML_SCHEMAP_INVALID_FACET_VALUE, /* 1717 */ XML_SCHEMAP_INVALID_MAXOCCURS, /* 1718 */ XML_SCHEMAP_INVALID_MINOCCURS, /* 1719 */ XML_SCHEMAP_INVALID_REF_AND_SUBTYPE, /* 1720 */ XML_SCHEMAP_INVALID_WHITE_SPACE, /* 1721 */ XML_SCHEMAP_NOATTR_NOREF, /* 1722 */ XML_SCHEMAP_NOTATION_NO_NAME, /* 1723 */ XML_SCHEMAP_NOTYPE_NOREF, /* 1724 */ XML_SCHEMAP_REF_AND_SUBTYPE, /* 1725 */ XML_SCHEMAP_RESTRICTION_NONAME_NOREF, /* 1726 */ XML_SCHEMAP_SIMPLETYPE_NONAME, /* 1727 */ XML_SCHEMAP_TYPE_AND_SUBTYPE, /* 1728 */ XML_SCHEMAP_UNKNOWN_ALL_CHILD, /* 1729 */ XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD, /* 1730 */ XML_SCHEMAP_UNKNOWN_ATTR_CHILD, /* 1731 */ XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD, /* 1732 */ XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP, /* 1733 */ XML_SCHEMAP_UNKNOWN_BASE_TYPE, /* 1734 */ XML_SCHEMAP_UNKNOWN_CHOICE_CHILD, /* 1735 */ XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD, /* 1736 */ XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD, /* 1737 */ XML_SCHEMAP_UNKNOWN_ELEM_CHILD, /* 1738 */ XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD, /* 1739 */ XML_SCHEMAP_UNKNOWN_FACET_CHILD, /* 1740 */ XML_SCHEMAP_UNKNOWN_FACET_TYPE, /* 1741 */ XML_SCHEMAP_UNKNOWN_GROUP_CHILD, /* 1742 */ XML_SCHEMAP_UNKNOWN_IMPORT_CHILD, /* 1743 */ XML_SCHEMAP_UNKNOWN_LIST_CHILD, /* 1744 */ XML_SCHEMAP_UNKNOWN_NOTATION_CHILD, /* 1745 */ XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD, /* 1746 */ XML_SCHEMAP_UNKNOWN_REF, /* 1747 */ XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD, /* 1748 */ XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD, /* 1749 */ XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD, /* 1750 */ XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD, /* 1751 */ XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD, /* 1752 */ XML_SCHEMAP_UNKNOWN_TYPE, /* 1753 */ XML_SCHEMAP_UNKNOWN_UNION_CHILD, /* 1754 */ XML_SCHEMAP_ELEM_DEFAULT_FIXED, /* 1755 */ XML_SCHEMAP_REGEXP_INVALID, /* 1756 */ XML_SCHEMAP_FAILED_LOAD, /* 1757 */ XML_SCHEMAP_NOTHING_TO_PARSE, /* 1758 */ XML_SCHEMAP_NOROOT, /* 1759 */ XML_SCHEMAP_REDEFINED_GROUP, /* 1760 */ XML_SCHEMAP_REDEFINED_TYPE, /* 1761 */ XML_SCHEMAP_REDEFINED_ELEMENT, /* 1762 */ XML_SCHEMAP_REDEFINED_ATTRGROUP, /* 1763 */ XML_SCHEMAP_REDEFINED_ATTR, /* 1764 */ XML_SCHEMAP_REDEFINED_NOTATION, /* 1765 */ XML_SCHEMAP_FAILED_PARSE, /* 1766 */ XML_SCHEMAP_UNKNOWN_PREFIX, /* 1767 */ XML_SCHEMAP_DEF_AND_PREFIX, /* 1768 */ XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD, /* 1769 */ XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI, /* 1770 */ XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI, /* 1771 */ XML_SCHEMAP_NOT_SCHEMA, /* 1772 */ XML_SCHEMAP_UNKNOWN_MEMBER_TYPE, /* 1773 */ XML_SCHEMAP_INVALID_ATTR_USE, /* 1774 */ XML_SCHEMAP_RECURSIVE, /* 1775 */ XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE, /* 1776 */ XML_SCHEMAP_INVALID_ATTR_COMBINATION, /* 1777 */ XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION, /* 1778 */ XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD, /* 1779 */ XML_SCHEMAP_INVALID_ATTR_NAME, /* 1780 */ XML_SCHEMAP_REF_AND_CONTENT, /* 1781 */ XML_SCHEMAP_CT_PROPS_CORRECT_1, /* 1782 */ XML_SCHEMAP_CT_PROPS_CORRECT_2, /* 1783 */ XML_SCHEMAP_CT_PROPS_CORRECT_3, /* 1784 */ XML_SCHEMAP_CT_PROPS_CORRECT_4, /* 1785 */ XML_SCHEMAP_CT_PROPS_CORRECT_5, /* 1786 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, /* 1787 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1, /* 1788 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2, /* 1789 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2, /* 1790 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3, /* 1791 */ XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER, /* 1792 */ XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE, /* 1793 */ XML_SCHEMAP_UNION_NOT_EXPRESSIBLE, /* 1794 */ XML_SCHEMAP_SRC_IMPORT_3_1, /* 1795 */ XML_SCHEMAP_SRC_IMPORT_3_2, /* 1796 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1, /* 1797 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2, /* 1798 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3, /* 1799 */ XML_SCHEMAP_COS_CT_EXTENDS_1_3, /* 1800 */ XML_SCHEMAV_NOROOT = 1801, XML_SCHEMAV_UNDECLAREDELEM, /* 1802 */ XML_SCHEMAV_NOTTOPLEVEL, /* 1803 */ XML_SCHEMAV_MISSING, /* 1804 */ XML_SCHEMAV_WRONGELEM, /* 1805 */ XML_SCHEMAV_NOTYPE, /* 1806 */ XML_SCHEMAV_NOROLLBACK, /* 1807 */ XML_SCHEMAV_ISABSTRACT, /* 1808 */ XML_SCHEMAV_NOTEMPTY, /* 1809 */ XML_SCHEMAV_ELEMCONT, /* 1810 */ XML_SCHEMAV_HAVEDEFAULT, /* 1811 */ XML_SCHEMAV_NOTNILLABLE, /* 1812 */ XML_SCHEMAV_EXTRACONTENT, /* 1813 */ XML_SCHEMAV_INVALIDATTR, /* 1814 */ XML_SCHEMAV_INVALIDELEM, /* 1815 */ XML_SCHEMAV_NOTDETERMINIST, /* 1816 */ XML_SCHEMAV_CONSTRUCT, /* 1817 */ XML_SCHEMAV_INTERNAL, /* 1818 */ XML_SCHEMAV_NOTSIMPLE, /* 1819 */ XML_SCHEMAV_ATTRUNKNOWN, /* 1820 */ XML_SCHEMAV_ATTRINVALID, /* 1821 */ XML_SCHEMAV_VALUE, /* 1822 */ XML_SCHEMAV_FACET, /* 1823 */ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, /* 1824 */ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2, /* 1825 */ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3, /* 1826 */ XML_SCHEMAV_CVC_TYPE_3_1_1, /* 1827 */ XML_SCHEMAV_CVC_TYPE_3_1_2, /* 1828 */ XML_SCHEMAV_CVC_FACET_VALID, /* 1829 */ XML_SCHEMAV_CVC_LENGTH_VALID, /* 1830 */ XML_SCHEMAV_CVC_MINLENGTH_VALID, /* 1831 */ XML_SCHEMAV_CVC_MAXLENGTH_VALID, /* 1832 */ XML_SCHEMAV_CVC_MININCLUSIVE_VALID, /* 1833 */ XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID, /* 1834 */ XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID, /* 1835 */ XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID, /* 1836 */ XML_SCHEMAV_CVC_TOTALDIGITS_VALID, /* 1837 */ XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID, /* 1838 */ XML_SCHEMAV_CVC_PATTERN_VALID, /* 1839 */ XML_SCHEMAV_CVC_ENUMERATION_VALID, /* 1840 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, /* 1841 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2, /* 1842 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, /* 1843 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4, /* 1844 */ XML_SCHEMAV_CVC_ELT_1, /* 1845 */ XML_SCHEMAV_CVC_ELT_2, /* 1846 */ XML_SCHEMAV_CVC_ELT_3_1, /* 1847 */ XML_SCHEMAV_CVC_ELT_3_2_1, /* 1848 */ XML_SCHEMAV_CVC_ELT_3_2_2, /* 1849 */ XML_SCHEMAV_CVC_ELT_4_1, /* 1850 */ XML_SCHEMAV_CVC_ELT_4_2, /* 1851 */ XML_SCHEMAV_CVC_ELT_4_3, /* 1852 */ XML_SCHEMAV_CVC_ELT_5_1_1, /* 1853 */ XML_SCHEMAV_CVC_ELT_5_1_2, /* 1854 */ XML_SCHEMAV_CVC_ELT_5_2_1, /* 1855 */ XML_SCHEMAV_CVC_ELT_5_2_2_1, /* 1856 */ XML_SCHEMAV_CVC_ELT_5_2_2_2_1, /* 1857 */ XML_SCHEMAV_CVC_ELT_5_2_2_2_2, /* 1858 */ XML_SCHEMAV_CVC_ELT_6, /* 1859 */ XML_SCHEMAV_CVC_ELT_7, /* 1860 */ XML_SCHEMAV_CVC_ATTRIBUTE_1, /* 1861 */ XML_SCHEMAV_CVC_ATTRIBUTE_2, /* 1862 */ XML_SCHEMAV_CVC_ATTRIBUTE_3, /* 1863 */ XML_SCHEMAV_CVC_ATTRIBUTE_4, /* 1864 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1, /* 1865 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, /* 1866 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, /* 1867 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_4, /* 1868 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1, /* 1869 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2, /* 1870 */ XML_SCHEMAV_ELEMENT_CONTENT, /* 1871 */ XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING, /* 1872 */ XML_SCHEMAV_CVC_COMPLEX_TYPE_1, /* 1873 */ XML_SCHEMAV_CVC_AU, /* 1874 */ XML_SCHEMAV_CVC_TYPE_1, /* 1875 */ XML_SCHEMAV_CVC_TYPE_2, /* 1876 */ XML_SCHEMAV_CVC_IDC, /* 1877 */ XML_SCHEMAV_CVC_WILDCARD, /* 1878 */ XML_SCHEMAV_MISC, /* 1879 */ XML_XPTR_UNKNOWN_SCHEME = 1900, XML_XPTR_CHILDSEQ_START, /* 1901 */ XML_XPTR_EVAL_FAILED, /* 1902 */ XML_XPTR_EXTRA_OBJECTS, /* 1903 */ XML_C14N_CREATE_CTXT = 1950, XML_C14N_REQUIRES_UTF8, /* 1951 */ XML_C14N_CREATE_STACK, /* 1952 */ XML_C14N_INVALID_NODE, /* 1953 */ XML_C14N_UNKNOW_NODE, /* 1954 */ XML_C14N_RELATIVE_NAMESPACE, /* 1955 */ XML_FTP_PASV_ANSWER = 2000, XML_FTP_EPSV_ANSWER, /* 2001 */ XML_FTP_ACCNT, /* 2002 */ XML_FTP_URL_SYNTAX, /* 2003 */ XML_HTTP_URL_SYNTAX = 2020, XML_HTTP_USE_IP, /* 2021 */ XML_HTTP_UNKNOWN_HOST, /* 2022 */ XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000, XML_SCHEMAP_SRC_SIMPLE_TYPE_2, /* 3001 */ XML_SCHEMAP_SRC_SIMPLE_TYPE_3, /* 3002 */ XML_SCHEMAP_SRC_SIMPLE_TYPE_4, /* 3003 */ XML_SCHEMAP_SRC_RESOLVE, /* 3004 */ XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, /* 3005 */ XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE, /* 3006 */ XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES, /* 3007 */ XML_SCHEMAP_ST_PROPS_CORRECT_1, /* 3008 */ XML_SCHEMAP_ST_PROPS_CORRECT_2, /* 3009 */ XML_SCHEMAP_ST_PROPS_CORRECT_3, /* 3010 */ XML_SCHEMAP_COS_ST_RESTRICTS_1_1, /* 3011 */ XML_SCHEMAP_COS_ST_RESTRICTS_1_2, /* 3012 */ XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1, /* 3013 */ XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2, /* 3014 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_1, /* 3015 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1, /* 3016 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2, /* 3017 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1, /* 3018 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2, /* 3019 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3, /* 3020 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4, /* 3021 */ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5, /* 3022 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_1, /* 3023 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1, /* 3024 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2, /* 3025 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2, /* 3026 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1, /* 3027 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3, /* 3028 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4, /* 3029 */ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5, /* 3030 */ XML_SCHEMAP_COS_ST_DERIVED_OK_2_1, /* 3031 */ XML_SCHEMAP_COS_ST_DERIVED_OK_2_2, /* 3032 */ XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, /* 3033 */ XML_SCHEMAP_S4S_ELEM_MISSING, /* 3034 */ XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, /* 3035 */ XML_SCHEMAP_S4S_ATTR_MISSING, /* 3036 */ XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* 3037 */ XML_SCHEMAP_SRC_ELEMENT_1, /* 3038 */ XML_SCHEMAP_SRC_ELEMENT_2_1, /* 3039 */ XML_SCHEMAP_SRC_ELEMENT_2_2, /* 3040 */ XML_SCHEMAP_SRC_ELEMENT_3, /* 3041 */ XML_SCHEMAP_P_PROPS_CORRECT_1, /* 3042 */ XML_SCHEMAP_P_PROPS_CORRECT_2_1, /* 3043 */ XML_SCHEMAP_P_PROPS_CORRECT_2_2, /* 3044 */ XML_SCHEMAP_E_PROPS_CORRECT_2, /* 3045 */ XML_SCHEMAP_E_PROPS_CORRECT_3, /* 3046 */ XML_SCHEMAP_E_PROPS_CORRECT_4, /* 3047 */ XML_SCHEMAP_E_PROPS_CORRECT_5, /* 3048 */ XML_SCHEMAP_E_PROPS_CORRECT_6, /* 3049 */ XML_SCHEMAP_SRC_INCLUDE, /* 3050 */ XML_SCHEMAP_SRC_ATTRIBUTE_1, /* 3051 */ XML_SCHEMAP_SRC_ATTRIBUTE_2, /* 3052 */ XML_SCHEMAP_SRC_ATTRIBUTE_3_1, /* 3053 */ XML_SCHEMAP_SRC_ATTRIBUTE_3_2, /* 3054 */ XML_SCHEMAP_SRC_ATTRIBUTE_4, /* 3055 */ XML_SCHEMAP_NO_XMLNS, /* 3056 */ XML_SCHEMAP_NO_XSI, /* 3057 */ XML_SCHEMAP_COS_VALID_DEFAULT_1, /* 3058 */ XML_SCHEMAP_COS_VALID_DEFAULT_2_1, /* 3059 */ XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1, /* 3060 */ XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2, /* 3061 */ XML_SCHEMAP_CVC_SIMPLE_TYPE, /* 3062 */ XML_SCHEMAP_COS_CT_EXTENDS_1_1, /* 3063 */ XML_SCHEMAP_SRC_IMPORT_1_1, /* 3064 */ XML_SCHEMAP_SRC_IMPORT_1_2, /* 3065 */ XML_SCHEMAP_SRC_IMPORT_2, /* 3066 */ XML_SCHEMAP_SRC_IMPORT_2_1, /* 3067 */ XML_SCHEMAP_SRC_IMPORT_2_2, /* 3068 */ XML_SCHEMAP_INTERNAL, /* 3069 non-W3C */ XML_SCHEMAP_NOT_DETERMINISTIC, /* 3070 non-W3C */ XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1, /* 3071 */ XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2, /* 3072 */ XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3, /* 3073 */ XML_SCHEMAP_MG_PROPS_CORRECT_1, /* 3074 */ XML_SCHEMAP_MG_PROPS_CORRECT_2, /* 3075 */ XML_SCHEMAP_SRC_CT_1, /* 3076 */ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3, /* 3077 */ XML_SCHEMAP_AU_PROPS_CORRECT_2, /* 3078 */ XML_SCHEMAP_A_PROPS_CORRECT_2, /* 3079 */ XML_SCHEMAP_C_PROPS_CORRECT, /* 3080 */ XML_SCHEMAP_SRC_REDEFINE, /* 3081 */ XML_SCHEMAP_SRC_IMPORT, /* 3082 */ XML_SCHEMAP_WARN_SKIP_SCHEMA, /* 3083 */ XML_SCHEMAP_WARN_UNLOCATED_SCHEMA, /* 3084 */ XML_SCHEMAP_WARN_ATTR_REDECL_PROH, /* 3085 */ XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, /* 3085 */ XML_SCHEMAP_AG_PROPS_CORRECT, /* 3086 */ XML_SCHEMAP_COS_CT_EXTENDS_1_2, /* 3087 */ XML_SCHEMAP_AU_PROPS_CORRECT, /* 3088 */ XML_SCHEMAP_A_PROPS_CORRECT_3, /* 3089 */ XML_SCHEMAP_COS_ALL_LIMITED, /* 3090 */ XML_SCHEMATRONV_ASSERT = 4000, /* 4000 */ XML_SCHEMATRONV_REPORT, XML_MODULE_OPEN = 4900, /* 4900 */ XML_MODULE_CLOSE, /* 4901 */ XML_CHECK_FOUND_ELEMENT = 5000, XML_CHECK_FOUND_ATTRIBUTE, /* 5001 */ XML_CHECK_FOUND_TEXT, /* 5002 */ XML_CHECK_FOUND_CDATA, /* 5003 */ XML_CHECK_FOUND_ENTITYREF, /* 5004 */ XML_CHECK_FOUND_ENTITY, /* 5005 */ XML_CHECK_FOUND_PI, /* 5006 */ XML_CHECK_FOUND_COMMENT, /* 5007 */ XML_CHECK_FOUND_DOCTYPE, /* 5008 */ XML_CHECK_FOUND_FRAGMENT, /* 5009 */ XML_CHECK_FOUND_NOTATION, /* 5010 */ XML_CHECK_UNKNOWN_NODE, /* 5011 */ XML_CHECK_ENTITY_TYPE, /* 5012 */ XML_CHECK_NO_PARENT, /* 5013 */ XML_CHECK_NO_DOC, /* 5014 */ XML_CHECK_NO_NAME, /* 5015 */ XML_CHECK_NO_ELEM, /* 5016 */ XML_CHECK_WRONG_DOC, /* 5017 */ XML_CHECK_NO_PREV, /* 5018 */ XML_CHECK_WRONG_PREV, /* 5019 */ XML_CHECK_NO_NEXT, /* 5020 */ XML_CHECK_WRONG_NEXT, /* 5021 */ XML_CHECK_NOT_DTD, /* 5022 */ XML_CHECK_NOT_ATTR, /* 5023 */ XML_CHECK_NOT_ATTR_DECL, /* 5024 */ XML_CHECK_NOT_ELEM_DECL, /* 5025 */ XML_CHECK_NOT_ENTITY_DECL, /* 5026 */ XML_CHECK_NOT_NS_DECL, /* 5027 */ XML_CHECK_NO_HREF, /* 5028 */ XML_CHECK_WRONG_PARENT,/* 5029 */ XML_CHECK_NS_SCOPE, /* 5030 */ XML_CHECK_NS_ANCESTOR, /* 5031 */ XML_CHECK_NOT_UTF8, /* 5032 */ XML_CHECK_NO_DICT, /* 5033 */ XML_CHECK_NOT_NCNAME, /* 5034 */ XML_CHECK_OUTSIDE_DICT, /* 5035 */ XML_CHECK_WRONG_NAME, /* 5036 */ XML_CHECK_NAME_NOT_NULL, /* 5037 */ XML_I18N_NO_NAME = 6000, XML_I18N_NO_HANDLER, /* 6001 */ XML_I18N_EXCESS_HANDLER, /* 6002 */ XML_I18N_CONV_FAILED, /* 6003 */ XML_I18N_NO_OUTPUT, /* 6004 */ XML_BUF_OVERFLOW = 7000 } xmlParserErrors; /** * xmlGenericErrorFunc: * @ctx: a parsing context * @msg: the message * @...: the extra arguments of the varags to format the message * * Signature of the function to use when there is an error and * no parsing or validity context available . */ typedef void (XMLCDECL *xmlGenericErrorFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * xmlStructuredErrorFunc: * @userData: user provided data for the error callback * @error: the error being raised. * * Signature of the function to use when there is an error and * the module handles the new error reporting mechanism. */ typedef void (XMLCALL *xmlStructuredErrorFunc) (void *userData, xmlErrorPtr error); /* * Use the following function to reset the two global variables * xmlGenericError and xmlGenericErrorContext. */ XMLPUBFUN void XMLCALL xmlSetGenericErrorFunc (void *ctx, xmlGenericErrorFunc handler); XMLPUBFUN void XMLCALL initGenericErrorDefaultFunc (xmlGenericErrorFunc *handler); XMLPUBFUN void XMLCALL xmlSetStructuredErrorFunc (void *ctx, xmlStructuredErrorFunc handler); /* * Default message routines used by SAX and Valid context for error * and warning reporting. */ XMLPUBFUN void XMLCDECL xmlParserError (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN void XMLCDECL xmlParserWarning (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN void XMLCDECL xmlParserValidityError (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN void XMLCDECL xmlParserValidityWarning (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN void XMLCALL xmlParserPrintFileInfo (xmlParserInputPtr input); XMLPUBFUN void XMLCALL xmlParserPrintFileContext (xmlParserInputPtr input); /* * Extended error information routines */ XMLPUBFUN xmlErrorPtr XMLCALL xmlGetLastError (void); XMLPUBFUN void XMLCALL xmlResetLastError (void); XMLPUBFUN xmlErrorPtr XMLCALL xmlCtxtGetLastError (void *ctx); XMLPUBFUN void XMLCALL xmlCtxtResetLastError (void *ctx); XMLPUBFUN void XMLCALL xmlResetError (xmlErrorPtr err); XMLPUBFUN int XMLCALL xmlCopyError (xmlErrorPtr from, xmlErrorPtr to); #ifdef IN_LIBXML /* * Internal callback reporting routine */ XMLPUBFUN void XMLCALL __xmlRaiseError (xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel, void *data, void *ctx, void *node, int domain, int code, xmlErrorLevel level, const char *file, int line, const char *str1, const char *str2, const char *str3, int int1, int col, const char *msg, ...) LIBXML_ATTR_FORMAT(16,17); XMLPUBFUN void XMLCALL __xmlSimpleError (int domain, int code, xmlNodePtr node, const char *msg, const char *extra); #endif #ifdef __cplusplus } #endif #endif /* __XML_ERROR_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xpathInternals.h0000644000175000017500000004563112113312342020644 0ustar aronaron/* * Summary: internal interfaces for XML Path Language implementation * Description: internal interfaces for XML Path Language implementation * used to build new modules on top of XPath like XPointer and * XSLT * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_XPATH_INTERNALS_H__ #define __XML_XPATH_INTERNALS_H__ #include #include #ifdef LIBXML_XPATH_ENABLED #ifdef __cplusplus extern "C" { #endif /************************************************************************ * * * Helpers * * * ************************************************************************/ /* * Many of these macros may later turn into functions. They * shouldn't be used in #ifdef's preprocessor instructions. */ /** * xmlXPathSetError: * @ctxt: an XPath parser context * @err: an xmlXPathError code * * Raises an error. */ #define xmlXPathSetError(ctxt, err) \ { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \ if ((ctxt) != NULL) (ctxt)->error = (err); } /** * xmlXPathSetArityError: * @ctxt: an XPath parser context * * Raises an XPATH_INVALID_ARITY error. */ #define xmlXPathSetArityError(ctxt) \ xmlXPathSetError((ctxt), XPATH_INVALID_ARITY) /** * xmlXPathSetTypeError: * @ctxt: an XPath parser context * * Raises an XPATH_INVALID_TYPE error. */ #define xmlXPathSetTypeError(ctxt) \ xmlXPathSetError((ctxt), XPATH_INVALID_TYPE) /** * xmlXPathGetError: * @ctxt: an XPath parser context * * Get the error code of an XPath context. * * Returns the context error. */ #define xmlXPathGetError(ctxt) ((ctxt)->error) /** * xmlXPathCheckError: * @ctxt: an XPath parser context * * Check if an XPath error was raised. * * Returns true if an error has been raised, false otherwise. */ #define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK) /** * xmlXPathGetDocument: * @ctxt: an XPath parser context * * Get the document of an XPath context. * * Returns the context document. */ #define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc) /** * xmlXPathGetContextNode: * @ctxt: an XPath parser context * * Get the context node of an XPath context. * * Returns the context node. */ #define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node) XMLPUBFUN int XMLCALL xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt); XMLPUBFUN double XMLCALL xmlXPathPopNumber (xmlXPathParserContextPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlXPathPopString (xmlXPathParserContextPtr ctxt); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt); XMLPUBFUN void * XMLCALL xmlXPathPopExternal (xmlXPathParserContextPtr ctxt); /** * xmlXPathReturnBoolean: * @ctxt: an XPath parser context * @val: a boolean * * Pushes the boolean @val on the context stack. */ #define xmlXPathReturnBoolean(ctxt, val) \ valuePush((ctxt), xmlXPathNewBoolean(val)) /** * xmlXPathReturnTrue: * @ctxt: an XPath parser context * * Pushes true on the context stack. */ #define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1) /** * xmlXPathReturnFalse: * @ctxt: an XPath parser context * * Pushes false on the context stack. */ #define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0) /** * xmlXPathReturnNumber: * @ctxt: an XPath parser context * @val: a double * * Pushes the double @val on the context stack. */ #define xmlXPathReturnNumber(ctxt, val) \ valuePush((ctxt), xmlXPathNewFloat(val)) /** * xmlXPathReturnString: * @ctxt: an XPath parser context * @str: a string * * Pushes the string @str on the context stack. */ #define xmlXPathReturnString(ctxt, str) \ valuePush((ctxt), xmlXPathWrapString(str)) /** * xmlXPathReturnEmptyString: * @ctxt: an XPath parser context * * Pushes an empty string on the stack. */ #define xmlXPathReturnEmptyString(ctxt) \ valuePush((ctxt), xmlXPathNewCString("")) /** * xmlXPathReturnNodeSet: * @ctxt: an XPath parser context * @ns: a node-set * * Pushes the node-set @ns on the context stack. */ #define xmlXPathReturnNodeSet(ctxt, ns) \ valuePush((ctxt), xmlXPathWrapNodeSet(ns)) /** * xmlXPathReturnEmptyNodeSet: * @ctxt: an XPath parser context * * Pushes an empty node-set on the context stack. */ #define xmlXPathReturnEmptyNodeSet(ctxt) \ valuePush((ctxt), xmlXPathNewNodeSet(NULL)) /** * xmlXPathReturnExternal: * @ctxt: an XPath parser context * @val: user data * * Pushes user data on the context stack. */ #define xmlXPathReturnExternal(ctxt, val) \ valuePush((ctxt), xmlXPathWrapExternal(val)) /** * xmlXPathStackIsNodeSet: * @ctxt: an XPath parser context * * Check if the current value on the XPath stack is a node set or * an XSLT value tree. * * Returns true if the current object on the stack is a node-set. */ #define xmlXPathStackIsNodeSet(ctxt) \ (((ctxt)->value != NULL) \ && (((ctxt)->value->type == XPATH_NODESET) \ || ((ctxt)->value->type == XPATH_XSLT_TREE))) /** * xmlXPathStackIsExternal: * @ctxt: an XPath parser context * * Checks if the current value on the XPath stack is an external * object. * * Returns true if the current object on the stack is an external * object. */ #define xmlXPathStackIsExternal(ctxt) \ ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS)) /** * xmlXPathEmptyNodeSet: * @ns: a node-set * * Empties a node-set. */ #define xmlXPathEmptyNodeSet(ns) \ { while ((ns)->nodeNr > 0) (ns)->nodeTab[(ns)->nodeNr--] = NULL; } /** * CHECK_ERROR: * * Macro to return from the function if an XPath error was detected. */ #define CHECK_ERROR \ if (ctxt->error != XPATH_EXPRESSION_OK) return /** * CHECK_ERROR0: * * Macro to return 0 from the function if an XPath error was detected. */ #define CHECK_ERROR0 \ if (ctxt->error != XPATH_EXPRESSION_OK) return(0) /** * XP_ERROR: * @X: the error code * * Macro to raise an XPath error and return. */ #define XP_ERROR(X) \ { xmlXPathErr(ctxt, X); return; } /** * XP_ERROR0: * @X: the error code * * Macro to raise an XPath error and return 0. */ #define XP_ERROR0(X) \ { xmlXPathErr(ctxt, X); return(0); } /** * CHECK_TYPE: * @typeval: the XPath type * * Macro to check that the value on top of the XPath stack is of a given * type. */ #define CHECK_TYPE(typeval) \ if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ XP_ERROR(XPATH_INVALID_TYPE) /** * CHECK_TYPE0: * @typeval: the XPath type * * Macro to check that the value on top of the XPath stack is of a given * type. Return(0) in case of failure */ #define CHECK_TYPE0(typeval) \ if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ XP_ERROR0(XPATH_INVALID_TYPE) /** * CHECK_ARITY: * @x: the number of expected args * * Macro to check that the number of args passed to an XPath function matches. */ #define CHECK_ARITY(x) \ if (ctxt == NULL) return; \ if (nargs != (x)) \ XP_ERROR(XPATH_INVALID_ARITY); \ if (ctxt->valueNr < ctxt->valueFrame + (x)) \ XP_ERROR(XPATH_STACK_ERROR); /** * CAST_TO_STRING: * * Macro to try to cast the value on the top of the XPath stack to a string. */ #define CAST_TO_STRING \ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \ xmlXPathStringFunction(ctxt, 1); /** * CAST_TO_NUMBER: * * Macro to try to cast the value on the top of the XPath stack to a number. */ #define CAST_TO_NUMBER \ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \ xmlXPathNumberFunction(ctxt, 1); /** * CAST_TO_BOOLEAN: * * Macro to try to cast the value on the top of the XPath stack to a boolean. */ #define CAST_TO_BOOLEAN \ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \ xmlXPathBooleanFunction(ctxt, 1); /* * Variable Lookup forwarding. */ XMLPUBFUN void XMLCALL xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt, xmlXPathVariableLookupFunc f, void *data); /* * Function Lookup forwarding. */ XMLPUBFUN void XMLCALL xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, xmlXPathFuncLookupFunc f, void *funcCtxt); /* * Error reporting. */ XMLPUBFUN void XMLCALL xmlXPatherror (xmlXPathParserContextPtr ctxt, const char *file, int line, int no); XMLPUBFUN void XMLCALL xmlXPathErr (xmlXPathParserContextPtr ctxt, int error); #ifdef LIBXML_DEBUG_ENABLED XMLPUBFUN void XMLCALL xmlXPathDebugDumpObject (FILE *output, xmlXPathObjectPtr cur, int depth); XMLPUBFUN void XMLCALL xmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp, int depth); #endif /** * NodeSet handling. */ XMLPUBFUN int XMLCALL xmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathDistinctSorted (xmlNodeSetPtr nodes); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathDistinct (xmlNodeSetPtr nodes); XMLPUBFUN int XMLCALL xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); /** * Extending a context. */ XMLPUBFUN int XMLCALL xmlXPathRegisterNs (xmlXPathContextPtr ctxt, const xmlChar *prefix, const xmlChar *ns_uri); XMLPUBFUN const xmlChar * XMLCALL xmlXPathNsLookup (xmlXPathContextPtr ctxt, const xmlChar *prefix); XMLPUBFUN void XMLCALL xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt); XMLPUBFUN int XMLCALL xmlXPathRegisterFunc (xmlXPathContextPtr ctxt, const xmlChar *name, xmlXPathFunction f); XMLPUBFUN int XMLCALL xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathFunction f); XMLPUBFUN int XMLCALL xmlXPathRegisterVariable (xmlXPathContextPtr ctxt, const xmlChar *name, xmlXPathObjectPtr value); XMLPUBFUN int XMLCALL xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathObjectPtr value); XMLPUBFUN xmlXPathFunction XMLCALL xmlXPathFunctionLookup (xmlXPathContextPtr ctxt, const xmlChar *name); XMLPUBFUN xmlXPathFunction XMLCALL xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri); XMLPUBFUN void XMLCALL xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathVariableLookup (xmlXPathContextPtr ctxt, const xmlChar *name); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri); XMLPUBFUN void XMLCALL xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt); /** * Utilities to extend XPath. */ XMLPUBFUN xmlXPathParserContextPtr XMLCALL xmlXPathNewParserContext (const xmlChar *str, xmlXPathContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt); /* TODO: remap to xmlXPathValuePop and Push. */ XMLPUBFUN xmlXPathObjectPtr XMLCALL valuePop (xmlXPathParserContextPtr ctxt); XMLPUBFUN int XMLCALL valuePush (xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewString (const xmlChar *val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewCString (const char *val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapString (xmlChar *val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapCString (char * val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewFloat (double val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewBoolean (int val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewNodeSet (xmlNodePtr val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewValueTree (xmlNodePtr val); XMLPUBFUN int XMLCALL xmlXPathNodeSetAdd (xmlNodeSetPtr cur, xmlNodePtr val); XMLPUBFUN int XMLCALL xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur, xmlNodePtr val); XMLPUBFUN int XMLCALL xmlXPathNodeSetAddNs (xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns); XMLPUBFUN void XMLCALL xmlXPathNodeSetSort (xmlNodeSetPtr set); XMLPUBFUN void XMLCALL xmlXPathRoot (xmlXPathParserContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlXPathParseName (xmlXPathParserContextPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlXPathParseNCName (xmlXPathParserContextPtr ctxt); /* * Existing functions. */ XMLPUBFUN double XMLCALL xmlXPathStringEvalNumber (const xmlChar *str); XMLPUBFUN int XMLCALL xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr res); XMLPUBFUN void XMLCALL xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeSetMerge (xmlNodeSetPtr val1, xmlNodeSetPtr val2); XMLPUBFUN void XMLCALL xmlXPathNodeSetDel (xmlNodeSetPtr cur, xmlNodePtr val); XMLPUBFUN void XMLCALL xmlXPathNodeSetRemove (xmlNodeSetPtr cur, int val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewNodeSetList (xmlNodeSetPtr val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapNodeSet (xmlNodeSetPtr val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapExternal (void *val); XMLPUBFUN int XMLCALL xmlXPathEqualValues(xmlXPathParserContextPtr ctxt); XMLPUBFUN int XMLCALL xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt); XMLPUBFUN int XMLCALL xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict); XMLPUBFUN void XMLCALL xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathAddValues(xmlXPathParserContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathSubValues(xmlXPathParserContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathMultValues(xmlXPathParserContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathDivValues(xmlXPathParserContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathModValues(xmlXPathParserContextPtr ctxt); XMLPUBFUN int XMLCALL xmlXPathIsNodeType(const xmlChar *name); /* * Some of the axis navigation routines. */ XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); /* * The official core of XPath functions. */ XMLPUBFUN void XMLCALL xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN void XMLCALL xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs); /** * Really internal functions */ XMLPUBFUN void XMLCALL xmlXPathNodeSetFreeNs(xmlNsPtr ns); #ifdef __cplusplus } #endif #endif /* LIBXML_XPATH_ENABLED */ #endif /* ! __XML_XPATH_INTERNALS_H__ */ libxml2-2.9.1+dfsg1/include/libxml/parser.h0000644000175000017500000011544712113312342017137 0ustar aronaron/* * Summary: the core parser module * Description: Interfaces, constants and types related to the XML parser * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_PARSER_H__ #define __XML_PARSER_H__ #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * XML_DEFAULT_VERSION: * * The default version of XML used: 1.0 */ #define XML_DEFAULT_VERSION "1.0" /** * xmlParserInput: * * An xmlParserInput is an input flow for the XML processor. * Each entity parsed is associated an xmlParserInput (except the * few predefined ones). This is the case both for internal entities * - in which case the flow is already completely in memory - or * external entities - in which case we use the buf structure for * progressive reading and I18N conversions to the internal UTF-8 format. */ /** * xmlParserInputDeallocate: * @str: the string to deallocate * * Callback for freeing some parser input allocations. */ typedef void (* xmlParserInputDeallocate)(xmlChar *str); struct _xmlParserInput { /* Input buffer */ xmlParserInputBufferPtr buf; /* UTF-8 encoded buffer */ const char *filename; /* The file analyzed, if any */ const char *directory; /* the directory/base of the file */ const xmlChar *base; /* Base of the array to parse */ const xmlChar *cur; /* Current char being parsed */ const xmlChar *end; /* end of the array to parse */ int length; /* length if known */ int line; /* Current line */ int col; /* Current column */ /* * NOTE: consumed is only tested for equality in the parser code, * so even if there is an overflow this should not give troubles * for parsing very large instances. */ unsigned long consumed; /* How many xmlChars already consumed */ xmlParserInputDeallocate free; /* function to deallocate the base */ const xmlChar *encoding; /* the encoding string for entity */ const xmlChar *version; /* the version string for entity */ int standalone; /* Was that entity marked standalone */ int id; /* an unique identifier for the entity */ }; /** * xmlParserNodeInfo: * * The parser can be asked to collect Node informations, i.e. at what * place in the file they were detected. * NOTE: This is off by default and not very well tested. */ typedef struct _xmlParserNodeInfo xmlParserNodeInfo; typedef xmlParserNodeInfo *xmlParserNodeInfoPtr; struct _xmlParserNodeInfo { const struct _xmlNode* node; /* Position & line # that text that created the node begins & ends on */ unsigned long begin_pos; unsigned long begin_line; unsigned long end_pos; unsigned long end_line; }; typedef struct _xmlParserNodeInfoSeq xmlParserNodeInfoSeq; typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr; struct _xmlParserNodeInfoSeq { unsigned long maximum; unsigned long length; xmlParserNodeInfo* buffer; }; /** * xmlParserInputState: * * The parser is now working also as a state based parser. * The recursive one use the state info for entities processing. */ typedef enum { XML_PARSER_EOF = -1, /* nothing is to be parsed */ XML_PARSER_START = 0, /* nothing has been parsed */ XML_PARSER_MISC, /* Misc* before int subset */ XML_PARSER_PI, /* Within a processing instruction */ XML_PARSER_DTD, /* within some DTD content */ XML_PARSER_PROLOG, /* Misc* after internal subset */ XML_PARSER_COMMENT, /* within a comment */ XML_PARSER_START_TAG, /* within a start tag */ XML_PARSER_CONTENT, /* within the content */ XML_PARSER_CDATA_SECTION, /* within a CDATA section */ XML_PARSER_END_TAG, /* within a closing tag */ XML_PARSER_ENTITY_DECL, /* within an entity declaration */ XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */ XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */ XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */ XML_PARSER_EPILOG, /* the Misc* after the last end tag */ XML_PARSER_IGNORE, /* within an IGNORED section */ XML_PARSER_PUBLIC_LITERAL /* within a PUBLIC value */ } xmlParserInputState; /** * XML_DETECT_IDS: * * Bit in the loadsubset context field to tell to do ID/REFs lookups. * Use it to initialize xmlLoadExtDtdDefaultValue. */ #define XML_DETECT_IDS 2 /** * XML_COMPLETE_ATTRS: * * Bit in the loadsubset context field to tell to do complete the * elements attributes lists with the ones defaulted from the DTDs. * Use it to initialize xmlLoadExtDtdDefaultValue. */ #define XML_COMPLETE_ATTRS 4 /** * XML_SKIP_IDS: * * Bit in the loadsubset context field to tell to not do ID/REFs registration. * Used to initialize xmlLoadExtDtdDefaultValue in some special cases. */ #define XML_SKIP_IDS 8 /** * xmlParserMode: * * A parser can operate in various modes */ typedef enum { XML_PARSE_UNKNOWN = 0, XML_PARSE_DOM = 1, XML_PARSE_SAX = 2, XML_PARSE_PUSH_DOM = 3, XML_PARSE_PUSH_SAX = 4, XML_PARSE_READER = 5 } xmlParserMode; /** * xmlParserCtxt: * * The parser context. * NOTE This doesn't completely define the parser state, the (current ?) * design of the parser uses recursive function calls since this allow * and easy mapping from the production rules of the specification * to the actual code. The drawback is that the actual function call * also reflect the parser state. However most of the parsing routines * takes as the only argument the parser context pointer, so migrating * to a state based parser for progressive parsing shouldn't be too hard. */ struct _xmlParserCtxt { struct _xmlSAXHandler *sax; /* The SAX handler */ void *userData; /* For SAX interface only, used by DOM build */ xmlDocPtr myDoc; /* the document being built */ int wellFormed; /* is the document well formed */ int replaceEntities; /* shall we replace entities ? */ const xmlChar *version; /* the XML version string */ const xmlChar *encoding; /* the declared encoding, if any */ int standalone; /* standalone document */ int html; /* an HTML(1)/Docbook(2) document * 3 is HTML after * 10 is HTML after */ /* Input stream stack */ xmlParserInputPtr input; /* Current input stream */ int inputNr; /* Number of current input streams */ int inputMax; /* Max number of input streams */ xmlParserInputPtr *inputTab; /* stack of inputs */ /* Node analysis stack only used for DOM building */ xmlNodePtr node; /* Current parsed Node */ int nodeNr; /* Depth of the parsing stack */ int nodeMax; /* Max depth of the parsing stack */ xmlNodePtr *nodeTab; /* array of nodes */ int record_info; /* Whether node info should be kept */ xmlParserNodeInfoSeq node_seq; /* info about each node parsed */ int errNo; /* error code */ int hasExternalSubset; /* reference and external subset */ int hasPErefs; /* the internal subset has PE refs */ int external; /* are we parsing an external entity */ int valid; /* is the document valid */ int validate; /* shall we try to validate ? */ xmlValidCtxt vctxt; /* The validity context */ xmlParserInputState instate; /* current type of input */ int token; /* next char look-ahead */ char *directory; /* the data directory */ /* Node name stack */ const xmlChar *name; /* Current parsed Node */ int nameNr; /* Depth of the parsing stack */ int nameMax; /* Max depth of the parsing stack */ const xmlChar * *nameTab; /* array of nodes */ long nbChars; /* number of xmlChar processed */ long checkIndex; /* used by progressive parsing lookup */ int keepBlanks; /* ugly but ... */ int disableSAX; /* SAX callbacks are disabled */ int inSubset; /* Parsing is in int 1/ext 2 subset */ const xmlChar * intSubName; /* name of subset */ xmlChar * extSubURI; /* URI of external subset */ xmlChar * extSubSystem; /* SYSTEM ID of external subset */ /* xml:space values */ int * space; /* Should the parser preserve spaces */ int spaceNr; /* Depth of the parsing stack */ int spaceMax; /* Max depth of the parsing stack */ int * spaceTab; /* array of space infos */ int depth; /* to prevent entity substitution loops */ xmlParserInputPtr entity; /* used to check entities boundaries */ int charset; /* encoding of the in-memory content actually an xmlCharEncoding */ int nodelen; /* Those two fields are there to */ int nodemem; /* Speed up large node parsing */ int pedantic; /* signal pedantic warnings */ void *_private; /* For user data, libxml won't touch it */ int loadsubset; /* should the external subset be loaded */ int linenumbers; /* set line number in element content */ void *catalogs; /* document's own catalog */ int recovery; /* run in recovery mode */ int progressive; /* is this a progressive parsing */ xmlDictPtr dict; /* dictionnary for the parser */ const xmlChar * *atts; /* array for the attributes callbacks */ int maxatts; /* the size of the array */ int docdict; /* use strings from dict to build tree */ /* * pre-interned strings */ const xmlChar *str_xml; const xmlChar *str_xmlns; const xmlChar *str_xml_ns; /* * Everything below is used only by the new SAX mode */ int sax2; /* operating in the new SAX mode */ int nsNr; /* the number of inherited namespaces */ int nsMax; /* the size of the arrays */ const xmlChar * *nsTab; /* the array of prefix/namespace name */ int *attallocs; /* which attribute were allocated */ void * *pushTab; /* array of data for push */ xmlHashTablePtr attsDefault; /* defaulted attributes if any */ xmlHashTablePtr attsSpecial; /* non-CDATA attributes if any */ int nsWellFormed; /* is the document XML Nanespace okay */ int options; /* Extra options */ /* * Those fields are needed only for treaming parsing so far */ int dictNames; /* Use dictionary names for the tree */ int freeElemsNr; /* number of freed element nodes */ xmlNodePtr freeElems; /* List of freed element nodes */ int freeAttrsNr; /* number of freed attributes nodes */ xmlAttrPtr freeAttrs; /* List of freed attributes nodes */ /* * the complete error informations for the last error. */ xmlError lastError; xmlParserMode parseMode; /* the parser mode */ unsigned long nbentities; /* number of entities references */ unsigned long sizeentities; /* size of parsed entities */ /* for use by HTML non-recursive parser */ xmlParserNodeInfo *nodeInfo; /* Current NodeInfo */ int nodeInfoNr; /* Depth of the parsing stack */ int nodeInfoMax; /* Max depth of the parsing stack */ xmlParserNodeInfo *nodeInfoTab; /* array of nodeInfos */ int input_id; /* we need to label inputs */ unsigned long sizeentcopy; /* volume of entity copy */ }; /** * xmlSAXLocator: * * A SAX Locator. */ struct _xmlSAXLocator { const xmlChar *(*getPublicId)(void *ctx); const xmlChar *(*getSystemId)(void *ctx); int (*getLineNumber)(void *ctx); int (*getColumnNumber)(void *ctx); }; /** * xmlSAXHandler: * * A SAX handler is bunch of callbacks called by the parser when processing * of the input generate data or structure informations. */ /** * resolveEntitySAXFunc: * @ctx: the user data (XML parser context) * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * Callback: * The entity loader, to control the loading of external entities, * the application can either: * - override this resolveEntity() callback in the SAX block * - or better use the xmlSetExternalEntityLoader() function to * set up it's own entity resolution routine * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */ typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx, const xmlChar *publicId, const xmlChar *systemId); /** * internalSubsetSAXFunc: * @ctx: the user data (XML parser context) * @name: the root element name * @ExternalID: the external ID * @SystemID: the SYSTEM ID (e.g. filename or URL) * * Callback on internal subset declaration. */ typedef void (*internalSubsetSAXFunc) (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); /** * externalSubsetSAXFunc: * @ctx: the user data (XML parser context) * @name: the root element name * @ExternalID: the external ID * @SystemID: the SYSTEM ID (e.g. filename or URL) * * Callback on external subset declaration. */ typedef void (*externalSubsetSAXFunc) (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); /** * getEntitySAXFunc: * @ctx: the user data (XML parser context) * @name: The entity name * * Get an entity by name. * * Returns the xmlEntityPtr if found. */ typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx, const xmlChar *name); /** * getParameterEntitySAXFunc: * @ctx: the user data (XML parser context) * @name: The entity name * * Get a parameter entity by name. * * Returns the xmlEntityPtr if found. */ typedef xmlEntityPtr (*getParameterEntitySAXFunc) (void *ctx, const xmlChar *name); /** * entityDeclSAXFunc: * @ctx: the user data (XML parser context) * @name: the entity name * @type: the entity type * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @content: the entity value (without processing). * * An entity definition has been parsed. */ typedef void (*entityDeclSAXFunc) (void *ctx, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content); /** * notationDeclSAXFunc: * @ctx: the user data (XML parser context) * @name: The name of the notation * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * What to do when a notation declaration has been parsed. */ typedef void (*notationDeclSAXFunc)(void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId); /** * attributeDeclSAXFunc: * @ctx: the user data (XML parser context) * @elem: the name of the element * @fullname: the attribute name * @type: the attribute type * @def: the type of default value * @defaultValue: the attribute default value * @tree: the tree of enumerated value set * * An attribute definition has been parsed. */ typedef void (*attributeDeclSAXFunc)(void *ctx, const xmlChar *elem, const xmlChar *fullname, int type, int def, const xmlChar *defaultValue, xmlEnumerationPtr tree); /** * elementDeclSAXFunc: * @ctx: the user data (XML parser context) * @name: the element name * @type: the element type * @content: the element value tree * * An element definition has been parsed. */ typedef void (*elementDeclSAXFunc)(void *ctx, const xmlChar *name, int type, xmlElementContentPtr content); /** * unparsedEntityDeclSAXFunc: * @ctx: the user data (XML parser context) * @name: The name of the entity * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @notationName: the name of the notation * * What to do when an unparsed entity declaration is parsed. */ typedef void (*unparsedEntityDeclSAXFunc)(void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName); /** * setDocumentLocatorSAXFunc: * @ctx: the user data (XML parser context) * @loc: A SAX Locator * * Receive the document locator at startup, actually xmlDefaultSAXLocator. * Everything is available on the context, so this is useless in our case. */ typedef void (*setDocumentLocatorSAXFunc) (void *ctx, xmlSAXLocatorPtr loc); /** * startDocumentSAXFunc: * @ctx: the user data (XML parser context) * * Called when the document start being processed. */ typedef void (*startDocumentSAXFunc) (void *ctx); /** * endDocumentSAXFunc: * @ctx: the user data (XML parser context) * * Called when the document end has been detected. */ typedef void (*endDocumentSAXFunc) (void *ctx); /** * startElementSAXFunc: * @ctx: the user data (XML parser context) * @name: The element name, including namespace prefix * @atts: An array of name/value attributes pairs, NULL terminated * * Called when an opening tag has been processed. */ typedef void (*startElementSAXFunc) (void *ctx, const xmlChar *name, const xmlChar **atts); /** * endElementSAXFunc: * @ctx: the user data (XML parser context) * @name: The element name * * Called when the end of an element has been detected. */ typedef void (*endElementSAXFunc) (void *ctx, const xmlChar *name); /** * attributeSAXFunc: * @ctx: the user data (XML parser context) * @name: The attribute name, including namespace prefix * @value: The attribute value * * Handle an attribute that has been read by the parser. * The default handling is to convert the attribute into an * DOM subtree and past it in a new xmlAttr element added to * the element. */ typedef void (*attributeSAXFunc) (void *ctx, const xmlChar *name, const xmlChar *value); /** * referenceSAXFunc: * @ctx: the user data (XML parser context) * @name: The entity name * * Called when an entity reference is detected. */ typedef void (*referenceSAXFunc) (void *ctx, const xmlChar *name); /** * charactersSAXFunc: * @ctx: the user data (XML parser context) * @ch: a xmlChar string * @len: the number of xmlChar * * Receiving some chars from the parser. */ typedef void (*charactersSAXFunc) (void *ctx, const xmlChar *ch, int len); /** * ignorableWhitespaceSAXFunc: * @ctx: the user data (XML parser context) * @ch: a xmlChar string * @len: the number of xmlChar * * Receiving some ignorable whitespaces from the parser. * UNUSED: by default the DOM building will use characters. */ typedef void (*ignorableWhitespaceSAXFunc) (void *ctx, const xmlChar *ch, int len); /** * processingInstructionSAXFunc: * @ctx: the user data (XML parser context) * @target: the target name * @data: the PI data's * * A processing instruction has been parsed. */ typedef void (*processingInstructionSAXFunc) (void *ctx, const xmlChar *target, const xmlChar *data); /** * commentSAXFunc: * @ctx: the user data (XML parser context) * @value: the comment content * * A comment has been parsed. */ typedef void (*commentSAXFunc) (void *ctx, const xmlChar *value); /** * cdataBlockSAXFunc: * @ctx: the user data (XML parser context) * @value: The pcdata content * @len: the block length * * Called when a pcdata block has been parsed. */ typedef void (*cdataBlockSAXFunc) ( void *ctx, const xmlChar *value, int len); /** * warningSAXFunc: * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Display and format a warning messages, callback. */ typedef void (XMLCDECL *warningSAXFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * errorSAXFunc: * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Display and format an error messages, callback. */ typedef void (XMLCDECL *errorSAXFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * fatalErrorSAXFunc: * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Display and format fatal error messages, callback. * Note: so far fatalError() SAX callbacks are not used, error() * get all the callbacks for errors. */ typedef void (XMLCDECL *fatalErrorSAXFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * isStandaloneSAXFunc: * @ctx: the user data (XML parser context) * * Is this document tagged standalone? * * Returns 1 if true */ typedef int (*isStandaloneSAXFunc) (void *ctx); /** * hasInternalSubsetSAXFunc: * @ctx: the user data (XML parser context) * * Does this document has an internal subset. * * Returns 1 if true */ typedef int (*hasInternalSubsetSAXFunc) (void *ctx); /** * hasExternalSubsetSAXFunc: * @ctx: the user data (XML parser context) * * Does this document has an external subset? * * Returns 1 if true */ typedef int (*hasExternalSubsetSAXFunc) (void *ctx); /************************************************************************ * * * The SAX version 2 API extensions * * * ************************************************************************/ /** * XML_SAX2_MAGIC: * * Special constant found in SAX2 blocks initialized fields */ #define XML_SAX2_MAGIC 0xDEEDBEAF /** * startElementNsSAX2Func: * @ctx: the user data (XML parser context) * @localname: the local name of the element * @prefix: the element namespace prefix if available * @URI: the element namespace name if available * @nb_namespaces: number of namespace definitions on that node * @namespaces: pointer to the array of prefix/URI pairs namespace definitions * @nb_attributes: the number of attributes on that node * @nb_defaulted: the number of defaulted attributes. The defaulted * ones are at the end of the array * @attributes: pointer to the array of (localname/prefix/URI/value/end) * attribute values. * * SAX2 callback when an element start has been detected by the parser. * It provides the namespace informations for the element, as well as * the new namespace declarations on the element. */ typedef void (*startElementNsSAX2Func) (void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes); /** * endElementNsSAX2Func: * @ctx: the user data (XML parser context) * @localname: the local name of the element * @prefix: the element namespace prefix if available * @URI: the element namespace name if available * * SAX2 callback when an element end has been detected by the parser. * It provides the namespace informations for the element. */ typedef void (*endElementNsSAX2Func) (void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI); struct _xmlSAXHandler { internalSubsetSAXFunc internalSubset; isStandaloneSAXFunc isStandalone; hasInternalSubsetSAXFunc hasInternalSubset; hasExternalSubsetSAXFunc hasExternalSubset; resolveEntitySAXFunc resolveEntity; getEntitySAXFunc getEntity; entityDeclSAXFunc entityDecl; notationDeclSAXFunc notationDecl; attributeDeclSAXFunc attributeDecl; elementDeclSAXFunc elementDecl; unparsedEntityDeclSAXFunc unparsedEntityDecl; setDocumentLocatorSAXFunc setDocumentLocator; startDocumentSAXFunc startDocument; endDocumentSAXFunc endDocument; startElementSAXFunc startElement; endElementSAXFunc endElement; referenceSAXFunc reference; charactersSAXFunc characters; ignorableWhitespaceSAXFunc ignorableWhitespace; processingInstructionSAXFunc processingInstruction; commentSAXFunc comment; warningSAXFunc warning; errorSAXFunc error; fatalErrorSAXFunc fatalError; /* unused error() get all the errors */ getParameterEntitySAXFunc getParameterEntity; cdataBlockSAXFunc cdataBlock; externalSubsetSAXFunc externalSubset; unsigned int initialized; /* The following fields are extensions available only on version 2 */ void *_private; startElementNsSAX2Func startElementNs; endElementNsSAX2Func endElementNs; xmlStructuredErrorFunc serror; }; /* * SAX Version 1 */ typedef struct _xmlSAXHandlerV1 xmlSAXHandlerV1; typedef xmlSAXHandlerV1 *xmlSAXHandlerV1Ptr; struct _xmlSAXHandlerV1 { internalSubsetSAXFunc internalSubset; isStandaloneSAXFunc isStandalone; hasInternalSubsetSAXFunc hasInternalSubset; hasExternalSubsetSAXFunc hasExternalSubset; resolveEntitySAXFunc resolveEntity; getEntitySAXFunc getEntity; entityDeclSAXFunc entityDecl; notationDeclSAXFunc notationDecl; attributeDeclSAXFunc attributeDecl; elementDeclSAXFunc elementDecl; unparsedEntityDeclSAXFunc unparsedEntityDecl; setDocumentLocatorSAXFunc setDocumentLocator; startDocumentSAXFunc startDocument; endDocumentSAXFunc endDocument; startElementSAXFunc startElement; endElementSAXFunc endElement; referenceSAXFunc reference; charactersSAXFunc characters; ignorableWhitespaceSAXFunc ignorableWhitespace; processingInstructionSAXFunc processingInstruction; commentSAXFunc comment; warningSAXFunc warning; errorSAXFunc error; fatalErrorSAXFunc fatalError; /* unused error() get all the errors */ getParameterEntitySAXFunc getParameterEntity; cdataBlockSAXFunc cdataBlock; externalSubsetSAXFunc externalSubset; unsigned int initialized; }; /** * xmlExternalEntityLoader: * @URL: The System ID of the resource requested * @ID: The Public ID of the resource requested * @context: the XML parser context * * External entity loaders types. * * Returns the entity input parser. */ typedef xmlParserInputPtr (*xmlExternalEntityLoader) (const char *URL, const char *ID, xmlParserCtxtPtr context); #ifdef __cplusplus } #endif #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Init/Cleanup */ XMLPUBFUN void XMLCALL xmlInitParser (void); XMLPUBFUN void XMLCALL xmlCleanupParser (void); /* * Input functions */ XMLPUBFUN int XMLCALL xmlParserInputRead (xmlParserInputPtr in, int len); XMLPUBFUN int XMLCALL xmlParserInputGrow (xmlParserInputPtr in, int len); /* * Basic parsing Interfaces */ #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN xmlDocPtr XMLCALL xmlParseDoc (const xmlChar *cur); XMLPUBFUN xmlDocPtr XMLCALL xmlParseFile (const char *filename); XMLPUBFUN xmlDocPtr XMLCALL xmlParseMemory (const char *buffer, int size); #endif /* LIBXML_SAX1_ENABLED */ XMLPUBFUN int XMLCALL xmlSubstituteEntitiesDefault(int val); XMLPUBFUN int XMLCALL xmlKeepBlanksDefault (int val); XMLPUBFUN void XMLCALL xmlStopParser (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlPedanticParserDefault(int val); XMLPUBFUN int XMLCALL xmlLineNumbersDefault (int val); #ifdef LIBXML_SAX1_ENABLED /* * Recovery mode */ XMLPUBFUN xmlDocPtr XMLCALL xmlRecoverDoc (const xmlChar *cur); XMLPUBFUN xmlDocPtr XMLCALL xmlRecoverMemory (const char *buffer, int size); XMLPUBFUN xmlDocPtr XMLCALL xmlRecoverFile (const char *filename); #endif /* LIBXML_SAX1_ENABLED */ /* * Less common routines and SAX interfaces */ XMLPUBFUN int XMLCALL xmlParseDocument (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlParseExtParsedEnt (xmlParserCtxtPtr ctxt); #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN int XMLCALL xmlSAXUserParseFile (xmlSAXHandlerPtr sax, void *user_data, const char *filename); XMLPUBFUN int XMLCALL xmlSAXUserParseMemory (xmlSAXHandlerPtr sax, void *user_data, const char *buffer, int size); XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseDoc (xmlSAXHandlerPtr sax, const xmlChar *cur, int recovery); XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseMemory (xmlSAXHandlerPtr sax, const char *buffer, int size, int recovery); XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseMemoryWithData (xmlSAXHandlerPtr sax, const char *buffer, int size, int recovery, void *data); XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseFile (xmlSAXHandlerPtr sax, const char *filename, int recovery); XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseFileWithData (xmlSAXHandlerPtr sax, const char *filename, int recovery, void *data); XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseEntity (xmlSAXHandlerPtr sax, const char *filename); XMLPUBFUN xmlDocPtr XMLCALL xmlParseEntity (const char *filename); #endif /* LIBXML_SAX1_ENABLED */ #ifdef LIBXML_VALID_ENABLED XMLPUBFUN xmlDtdPtr XMLCALL xmlSAXParseDTD (xmlSAXHandlerPtr sax, const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN xmlDtdPtr XMLCALL xmlParseDTD (const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN xmlDtdPtr XMLCALL xmlIOParseDTD (xmlSAXHandlerPtr sax, xmlParserInputBufferPtr input, xmlCharEncoding enc); #endif /* LIBXML_VALID_ENABLE */ #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN int XMLCALL xmlParseBalancedChunkMemory(xmlDocPtr doc, xmlSAXHandlerPtr sax, void *user_data, int depth, const xmlChar *string, xmlNodePtr *lst); #endif /* LIBXML_SAX1_ENABLED */ XMLPUBFUN xmlParserErrors XMLCALL xmlParseInNodeContext (xmlNodePtr node, const char *data, int datalen, int options, xmlNodePtr *lst); #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN int XMLCALL xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc, xmlSAXHandlerPtr sax, void *user_data, int depth, const xmlChar *string, xmlNodePtr *lst, int recover); XMLPUBFUN int XMLCALL xmlParseExternalEntity (xmlDocPtr doc, xmlSAXHandlerPtr sax, void *user_data, int depth, const xmlChar *URL, const xmlChar *ID, xmlNodePtr *lst); #endif /* LIBXML_SAX1_ENABLED */ XMLPUBFUN int XMLCALL xmlParseCtxtExternalEntity(xmlParserCtxtPtr ctx, const xmlChar *URL, const xmlChar *ID, xmlNodePtr *lst); /* * Parser contexts handling. */ XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlNewParserCtxt (void); XMLPUBFUN int XMLCALL xmlInitParserCtxt (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlClearParserCtxt (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlFreeParserCtxt (xmlParserCtxtPtr ctxt); #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN void XMLCALL xmlSetupParserForBuffer (xmlParserCtxtPtr ctxt, const xmlChar* buffer, const char *filename); #endif /* LIBXML_SAX1_ENABLED */ XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateDocParserCtxt (const xmlChar *cur); #ifdef LIBXML_LEGACY_ENABLED /* * Reading/setting optional parsing features. */ XMLPUBFUN int XMLCALL xmlGetFeaturesList (int *len, const char **result); XMLPUBFUN int XMLCALL xmlGetFeature (xmlParserCtxtPtr ctxt, const char *name, void *result); XMLPUBFUN int XMLCALL xmlSetFeature (xmlParserCtxtPtr ctxt, const char *name, void *value); #endif /* LIBXML_LEGACY_ENABLED */ #ifdef LIBXML_PUSH_ENABLED /* * Interfaces for the Push mode. */ XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, const char *chunk, int size, const char *filename); XMLPUBFUN int XMLCALL xmlParseChunk (xmlParserCtxtPtr ctxt, const char *chunk, int size, int terminate); #endif /* LIBXML_PUSH_ENABLED */ /* * Special I/O mode. */ XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateIOParserCtxt (xmlSAXHandlerPtr sax, void *user_data, xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc); XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewIOInputStream (xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input, xmlCharEncoding enc); /* * Node infos. */ XMLPUBFUN const xmlParserNodeInfo* XMLCALL xmlParserFindNodeInfo (const xmlParserCtxtPtr ctxt, const xmlNodePtr node); XMLPUBFUN void XMLCALL xmlInitNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); XMLPUBFUN void XMLCALL xmlClearNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); XMLPUBFUN unsigned long XMLCALL xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq, const xmlNodePtr node); XMLPUBFUN void XMLCALL xmlParserAddNodeInfo (xmlParserCtxtPtr ctxt, const xmlParserNodeInfoPtr info); /* * External entities handling actually implemented in xmlIO. */ XMLPUBFUN void XMLCALL xmlSetExternalEntityLoader(xmlExternalEntityLoader f); XMLPUBFUN xmlExternalEntityLoader XMLCALL xmlGetExternalEntityLoader(void); XMLPUBFUN xmlParserInputPtr XMLCALL xmlLoadExternalEntity (const char *URL, const char *ID, xmlParserCtxtPtr ctxt); /* * Index lookup, actually implemented in the encoding module */ XMLPUBFUN long XMLCALL xmlByteConsumed (xmlParserCtxtPtr ctxt); /* * New set of simpler/more flexible APIs */ /** * xmlParserOption: * * This is the set of XML parser options that can be passed down * to the xmlReadDoc() and similar calls. */ typedef enum { XML_PARSE_RECOVER = 1<<0, /* recover on errors */ XML_PARSE_NOENT = 1<<1, /* substitute entities */ XML_PARSE_DTDLOAD = 1<<2, /* load the external subset */ XML_PARSE_DTDATTR = 1<<3, /* default DTD attributes */ XML_PARSE_DTDVALID = 1<<4, /* validate with the DTD */ XML_PARSE_NOERROR = 1<<5, /* suppress error reports */ XML_PARSE_NOWARNING = 1<<6, /* suppress warning reports */ XML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ XML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ XML_PARSE_SAX1 = 1<<9, /* use the SAX1 interface internally */ XML_PARSE_XINCLUDE = 1<<10,/* Implement XInclude substitition */ XML_PARSE_NONET = 1<<11,/* Forbid network access */ XML_PARSE_NODICT = 1<<12,/* Do not reuse the context dictionnary */ XML_PARSE_NSCLEAN = 1<<13,/* remove redundant namespaces declarations */ XML_PARSE_NOCDATA = 1<<14,/* merge CDATA as text nodes */ XML_PARSE_NOXINCNODE= 1<<15,/* do not generate XINCLUDE START/END nodes */ XML_PARSE_COMPACT = 1<<16,/* compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree) */ XML_PARSE_OLD10 = 1<<17,/* parse using XML-1.0 before update 5 */ XML_PARSE_NOBASEFIX = 1<<18,/* do not fixup XINCLUDE xml:base uris */ XML_PARSE_HUGE = 1<<19,/* relax any hardcoded limit from the parser */ XML_PARSE_OLDSAX = 1<<20,/* parse using SAX2 interface before 2.7.0 */ XML_PARSE_IGNORE_ENC= 1<<21,/* ignore internal document encoding hint */ XML_PARSE_BIG_LINES = 1<<22 /* Store big lines numbers in text PSVI field */ } xmlParserOption; XMLPUBFUN void XMLCALL xmlCtxtReset (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlCtxtResetPush (xmlParserCtxtPtr ctxt, const char *chunk, int size, const char *filename, const char *encoding); XMLPUBFUN int XMLCALL xmlCtxtUseOptions (xmlParserCtxtPtr ctxt, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlReadDoc (const xmlChar *cur, const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlReadFile (const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlReadMemory (const char *buffer, int size, const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlReadFd (int fd, const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlReadIO (xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlCtxtReadDoc (xmlParserCtxtPtr ctxt, const xmlChar *cur, const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlCtxtReadFile (xmlParserCtxtPtr ctxt, const char *filename, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlCtxtReadMemory (xmlParserCtxtPtr ctxt, const char *buffer, int size, const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlCtxtReadFd (xmlParserCtxtPtr ctxt, int fd, const char *URL, const char *encoding, int options); XMLPUBFUN xmlDocPtr XMLCALL xmlCtxtReadIO (xmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options); /* * Library wide options */ /** * xmlFeature: * * Used to examine the existance of features that can be enabled * or disabled at compile-time. * They used to be called XML_FEATURE_xxx but this clashed with Expat */ typedef enum { XML_WITH_THREAD = 1, XML_WITH_TREE = 2, XML_WITH_OUTPUT = 3, XML_WITH_PUSH = 4, XML_WITH_READER = 5, XML_WITH_PATTERN = 6, XML_WITH_WRITER = 7, XML_WITH_SAX1 = 8, XML_WITH_FTP = 9, XML_WITH_HTTP = 10, XML_WITH_VALID = 11, XML_WITH_HTML = 12, XML_WITH_LEGACY = 13, XML_WITH_C14N = 14, XML_WITH_CATALOG = 15, XML_WITH_XPATH = 16, XML_WITH_XPTR = 17, XML_WITH_XINCLUDE = 18, XML_WITH_ICONV = 19, XML_WITH_ISO8859X = 20, XML_WITH_UNICODE = 21, XML_WITH_REGEXP = 22, XML_WITH_AUTOMATA = 23, XML_WITH_EXPR = 24, XML_WITH_SCHEMAS = 25, XML_WITH_SCHEMATRON = 26, XML_WITH_MODULES = 27, XML_WITH_DEBUG = 28, XML_WITH_DEBUG_MEM = 29, XML_WITH_DEBUG_RUN = 30, XML_WITH_ZLIB = 31, XML_WITH_ICU = 32, XML_WITH_LZMA = 33, XML_WITH_NONE = 99999 /* just to be sure of allocation size */ } xmlFeature; XMLPUBFUN int XMLCALL xmlHasFeature (xmlFeature feature); #ifdef __cplusplus } #endif #endif /* __XML_PARSER_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlautomata.h0000644000175000017500000000756412113312342020177 0ustar aronaron/* * Summary: API to build regexp automata * Description: the API to build regexp automata * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_AUTOMATA_H__ #define __XML_AUTOMATA_H__ #include #include #ifdef LIBXML_REGEXP_ENABLED #ifdef LIBXML_AUTOMATA_ENABLED #include #ifdef __cplusplus extern "C" { #endif /** * xmlAutomataPtr: * * A libxml automata description, It can be compiled into a regexp */ typedef struct _xmlAutomata xmlAutomata; typedef xmlAutomata *xmlAutomataPtr; /** * xmlAutomataStatePtr: * * A state int the automata description, */ typedef struct _xmlAutomataState xmlAutomataState; typedef xmlAutomataState *xmlAutomataStatePtr; /* * Building API */ XMLPUBFUN xmlAutomataPtr XMLCALL xmlNewAutomata (void); XMLPUBFUN void XMLCALL xmlFreeAutomata (xmlAutomataPtr am); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataGetInitState (xmlAutomataPtr am); XMLPUBFUN int XMLCALL xmlAutomataSetFinalState (xmlAutomataPtr am, xmlAutomataStatePtr state); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewState (xmlAutomataPtr am); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewTransition (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewTransition2 (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewNegTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCountTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, int min, int max, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCountTrans2 (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, int min, int max, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewOnceTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, int min, int max, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewOnceTrans2 (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, int min, int max, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewAllTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int lax); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewEpsilon (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCountedTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int counter); XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCounterTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int counter); XMLPUBFUN int XMLCALL xmlAutomataNewCounter (xmlAutomataPtr am, int min, int max); XMLPUBFUN xmlRegexpPtr XMLCALL xmlAutomataCompile (xmlAutomataPtr am); XMLPUBFUN int XMLCALL xmlAutomataIsDeterminist (xmlAutomataPtr am); #ifdef __cplusplus } #endif #endif /* LIBXML_AUTOMATA_ENABLED */ #endif /* LIBXML_REGEXP_ENABLED */ #endif /* __XML_AUTOMATA_H__ */ libxml2-2.9.1+dfsg1/include/libxml/uri.h0000644000175000017500000000515012113312342016427 0ustar aronaron/** * Summary: library of generic URI related routines * Description: library of generic URI related routines * Implements RFC 2396 * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_URI_H__ #define __XML_URI_H__ #include #include #ifdef __cplusplus extern "C" { #endif /** * xmlURI: * * A parsed URI reference. This is a struct containing the various fields * as described in RFC 2396 but separated for further processing. * * Note: query is a deprecated field which is incorrectly unescaped. * query_raw takes precedence over query if the former is set. * See: http://mail.gnome.org/archives/xml/2007-April/thread.html#00127 */ typedef struct _xmlURI xmlURI; typedef xmlURI *xmlURIPtr; struct _xmlURI { char *scheme; /* the URI scheme */ char *opaque; /* opaque part */ char *authority; /* the authority part */ char *server; /* the server part */ char *user; /* the user part */ int port; /* the port number */ char *path; /* the path string */ char *query; /* the query string (deprecated - use with caution) */ char *fragment; /* the fragment identifier */ int cleanup; /* parsing potentially unclean URI */ char *query_raw; /* the query string (as it appears in the URI) */ }; /* * This function is in tree.h: * xmlChar * xmlNodeGetBase (xmlDocPtr doc, * xmlNodePtr cur); */ XMLPUBFUN xmlURIPtr XMLCALL xmlCreateURI (void); XMLPUBFUN xmlChar * XMLCALL xmlBuildURI (const xmlChar *URI, const xmlChar *base); XMLPUBFUN xmlChar * XMLCALL xmlBuildRelativeURI (const xmlChar *URI, const xmlChar *base); XMLPUBFUN xmlURIPtr XMLCALL xmlParseURI (const char *str); XMLPUBFUN xmlURIPtr XMLCALL xmlParseURIRaw (const char *str, int raw); XMLPUBFUN int XMLCALL xmlParseURIReference (xmlURIPtr uri, const char *str); XMLPUBFUN xmlChar * XMLCALL xmlSaveUri (xmlURIPtr uri); XMLPUBFUN void XMLCALL xmlPrintURI (FILE *stream, xmlURIPtr uri); XMLPUBFUN xmlChar * XMLCALL xmlURIEscapeStr (const xmlChar *str, const xmlChar *list); XMLPUBFUN char * XMLCALL xmlURIUnescapeString (const char *str, int len, char *target); XMLPUBFUN int XMLCALL xmlNormalizeURIPath (char *path); XMLPUBFUN xmlChar * XMLCALL xmlURIEscape (const xmlChar *str); XMLPUBFUN void XMLCALL xmlFreeURI (xmlURIPtr uri); XMLPUBFUN xmlChar* XMLCALL xmlCanonicPath (const xmlChar *path); XMLPUBFUN xmlChar* XMLCALL xmlPathToURI (const xmlChar *path); #ifdef __cplusplus } #endif #endif /* __XML_URI_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlregexp.h0000644000175000017500000001252212113312342017644 0ustar aronaron/* * Summary: regular expressions handling * Description: basic API for libxml regular expressions handling used * for XML Schemas and validation. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_REGEXP_H__ #define __XML_REGEXP_H__ #include #ifdef LIBXML_REGEXP_ENABLED #ifdef __cplusplus extern "C" { #endif /** * xmlRegexpPtr: * * A libxml regular expression, they can actually be far more complex * thank the POSIX regex expressions. */ typedef struct _xmlRegexp xmlRegexp; typedef xmlRegexp *xmlRegexpPtr; /** * xmlRegExecCtxtPtr: * * A libxml progressive regular expression evaluation context */ typedef struct _xmlRegExecCtxt xmlRegExecCtxt; typedef xmlRegExecCtxt *xmlRegExecCtxtPtr; #ifdef __cplusplus } #endif #include #include #ifdef __cplusplus extern "C" { #endif /* * The POSIX like API */ XMLPUBFUN xmlRegexpPtr XMLCALL xmlRegexpCompile (const xmlChar *regexp); XMLPUBFUN void XMLCALL xmlRegFreeRegexp(xmlRegexpPtr regexp); XMLPUBFUN int XMLCALL xmlRegexpExec (xmlRegexpPtr comp, const xmlChar *value); XMLPUBFUN void XMLCALL xmlRegexpPrint (FILE *output, xmlRegexpPtr regexp); XMLPUBFUN int XMLCALL xmlRegexpIsDeterminist(xmlRegexpPtr comp); /** * xmlRegExecCallbacks: * @exec: the regular expression context * @token: the current token string * @transdata: transition data * @inputdata: input data * * Callback function when doing a transition in the automata */ typedef void (*xmlRegExecCallbacks) (xmlRegExecCtxtPtr exec, const xmlChar *token, void *transdata, void *inputdata); /* * The progressive API */ XMLPUBFUN xmlRegExecCtxtPtr XMLCALL xmlRegNewExecCtxt (xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data); XMLPUBFUN void XMLCALL xmlRegFreeExecCtxt (xmlRegExecCtxtPtr exec); XMLPUBFUN int XMLCALL xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, void *data); XMLPUBFUN int XMLCALL xmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value, const xmlChar *value2, void *data); XMLPUBFUN int XMLCALL xmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, int *nbneg, xmlChar **values, int *terminal); XMLPUBFUN int XMLCALL xmlRegExecErrInfo (xmlRegExecCtxtPtr exec, const xmlChar **string, int *nbval, int *nbneg, xmlChar **values, int *terminal); #ifdef LIBXML_EXPR_ENABLED /* * Formal regular expression handling * Its goal is to do some formal work on content models */ /* expressions are used within a context */ typedef struct _xmlExpCtxt xmlExpCtxt; typedef xmlExpCtxt *xmlExpCtxtPtr; XMLPUBFUN void XMLCALL xmlExpFreeCtxt (xmlExpCtxtPtr ctxt); XMLPUBFUN xmlExpCtxtPtr XMLCALL xmlExpNewCtxt (int maxNodes, xmlDictPtr dict); XMLPUBFUN int XMLCALL xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt); /* Expressions are trees but the tree is opaque */ typedef struct _xmlExpNode xmlExpNode; typedef xmlExpNode *xmlExpNodePtr; typedef enum { XML_EXP_EMPTY = 0, XML_EXP_FORBID = 1, XML_EXP_ATOM = 2, XML_EXP_SEQ = 3, XML_EXP_OR = 4, XML_EXP_COUNT = 5 } xmlExpNodeType; /* * 2 core expressions shared by all for the empty language set * and for the set with just the empty token */ XMLPUBVAR xmlExpNodePtr forbiddenExp; XMLPUBVAR xmlExpNodePtr emptyExp; /* * Expressions are reference counted internally */ XMLPUBFUN void XMLCALL xmlExpFree (xmlExpCtxtPtr ctxt, xmlExpNodePtr expr); XMLPUBFUN void XMLCALL xmlExpRef (xmlExpNodePtr expr); /* * constructors can be either manual or from a string */ XMLPUBFUN xmlExpNodePtr XMLCALL xmlExpParse (xmlExpCtxtPtr ctxt, const char *expr); XMLPUBFUN xmlExpNodePtr XMLCALL xmlExpNewAtom (xmlExpCtxtPtr ctxt, const xmlChar *name, int len); XMLPUBFUN xmlExpNodePtr XMLCALL xmlExpNewOr (xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right); XMLPUBFUN xmlExpNodePtr XMLCALL xmlExpNewSeq (xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right); XMLPUBFUN xmlExpNodePtr XMLCALL xmlExpNewRange (xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max); /* * The really interesting APIs */ XMLPUBFUN int XMLCALL xmlExpIsNillable(xmlExpNodePtr expr); XMLPUBFUN int XMLCALL xmlExpMaxToken (xmlExpNodePtr expr); XMLPUBFUN int XMLCALL xmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr expr, const xmlChar**langList, int len); XMLPUBFUN int XMLCALL xmlExpGetStart (xmlExpCtxtPtr ctxt, xmlExpNodePtr expr, const xmlChar**tokList, int len); XMLPUBFUN xmlExpNodePtr XMLCALL xmlExpStringDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr expr, const xmlChar *str, int len); XMLPUBFUN xmlExpNodePtr XMLCALL xmlExpExpDerive (xmlExpCtxtPtr ctxt, xmlExpNodePtr expr, xmlExpNodePtr sub); XMLPUBFUN int XMLCALL xmlExpSubsume (xmlExpCtxtPtr ctxt, xmlExpNodePtr expr, xmlExpNodePtr sub); XMLPUBFUN void XMLCALL xmlExpDump (xmlBufferPtr buf, xmlExpNodePtr expr); #endif /* LIBXML_EXPR_ENABLED */ #ifdef __cplusplus } #endif #endif /* LIBXML_REGEXP_ENABLED */ #endif /*__XML_REGEXP_H__ */ libxml2-2.9.1+dfsg1/include/libxml/schemasInternals.h0000644000175000017500000006264512113312342021147 0ustar aronaron/* * Summary: internal interfaces for XML Schemas * Description: internal interfaces for the XML Schemas handling * and schema validity checking * The Schemas development is a Work In Progress. * Some of those interfaces are not garanteed to be API or ABI stable ! * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_SCHEMA_INTERNALS_H__ #define __XML_SCHEMA_INTERNALS_H__ #include #ifdef LIBXML_SCHEMAS_ENABLED #include #include #include #ifdef __cplusplus extern "C" { #endif typedef enum { XML_SCHEMAS_UNKNOWN = 0, XML_SCHEMAS_STRING, XML_SCHEMAS_NORMSTRING, XML_SCHEMAS_DECIMAL, XML_SCHEMAS_TIME, XML_SCHEMAS_GDAY, XML_SCHEMAS_GMONTH, XML_SCHEMAS_GMONTHDAY, XML_SCHEMAS_GYEAR, XML_SCHEMAS_GYEARMONTH, XML_SCHEMAS_DATE, XML_SCHEMAS_DATETIME, XML_SCHEMAS_DURATION, XML_SCHEMAS_FLOAT, XML_SCHEMAS_DOUBLE, XML_SCHEMAS_BOOLEAN, XML_SCHEMAS_TOKEN, XML_SCHEMAS_LANGUAGE, XML_SCHEMAS_NMTOKEN, XML_SCHEMAS_NMTOKENS, XML_SCHEMAS_NAME, XML_SCHEMAS_QNAME, XML_SCHEMAS_NCNAME, XML_SCHEMAS_ID, XML_SCHEMAS_IDREF, XML_SCHEMAS_IDREFS, XML_SCHEMAS_ENTITY, XML_SCHEMAS_ENTITIES, XML_SCHEMAS_NOTATION, XML_SCHEMAS_ANYURI, XML_SCHEMAS_INTEGER, XML_SCHEMAS_NPINTEGER, XML_SCHEMAS_NINTEGER, XML_SCHEMAS_NNINTEGER, XML_SCHEMAS_PINTEGER, XML_SCHEMAS_INT, XML_SCHEMAS_UINT, XML_SCHEMAS_LONG, XML_SCHEMAS_ULONG, XML_SCHEMAS_SHORT, XML_SCHEMAS_USHORT, XML_SCHEMAS_BYTE, XML_SCHEMAS_UBYTE, XML_SCHEMAS_HEXBINARY, XML_SCHEMAS_BASE64BINARY, XML_SCHEMAS_ANYTYPE, XML_SCHEMAS_ANYSIMPLETYPE } xmlSchemaValType; /* * XML Schemas defines multiple type of types. */ typedef enum { XML_SCHEMA_TYPE_BASIC = 1, /* A built-in datatype */ XML_SCHEMA_TYPE_ANY, XML_SCHEMA_TYPE_FACET, XML_SCHEMA_TYPE_SIMPLE, XML_SCHEMA_TYPE_COMPLEX, XML_SCHEMA_TYPE_SEQUENCE = 6, XML_SCHEMA_TYPE_CHOICE, XML_SCHEMA_TYPE_ALL, XML_SCHEMA_TYPE_SIMPLE_CONTENT, XML_SCHEMA_TYPE_COMPLEX_CONTENT, XML_SCHEMA_TYPE_UR, XML_SCHEMA_TYPE_RESTRICTION, XML_SCHEMA_TYPE_EXTENSION, XML_SCHEMA_TYPE_ELEMENT, XML_SCHEMA_TYPE_ATTRIBUTE, XML_SCHEMA_TYPE_ATTRIBUTEGROUP, XML_SCHEMA_TYPE_GROUP, XML_SCHEMA_TYPE_NOTATION, XML_SCHEMA_TYPE_LIST, XML_SCHEMA_TYPE_UNION, XML_SCHEMA_TYPE_ANY_ATTRIBUTE, XML_SCHEMA_TYPE_IDC_UNIQUE, XML_SCHEMA_TYPE_IDC_KEY, XML_SCHEMA_TYPE_IDC_KEYREF, XML_SCHEMA_TYPE_PARTICLE = 25, XML_SCHEMA_TYPE_ATTRIBUTE_USE, XML_SCHEMA_FACET_MININCLUSIVE = 1000, XML_SCHEMA_FACET_MINEXCLUSIVE, XML_SCHEMA_FACET_MAXINCLUSIVE, XML_SCHEMA_FACET_MAXEXCLUSIVE, XML_SCHEMA_FACET_TOTALDIGITS, XML_SCHEMA_FACET_FRACTIONDIGITS, XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION, XML_SCHEMA_FACET_WHITESPACE, XML_SCHEMA_FACET_LENGTH, XML_SCHEMA_FACET_MAXLENGTH, XML_SCHEMA_FACET_MINLENGTH, XML_SCHEMA_EXTRA_QNAMEREF = 2000, XML_SCHEMA_EXTRA_ATTR_USE_PROHIB } xmlSchemaTypeType; typedef enum { XML_SCHEMA_CONTENT_UNKNOWN = 0, XML_SCHEMA_CONTENT_EMPTY = 1, XML_SCHEMA_CONTENT_ELEMENTS, XML_SCHEMA_CONTENT_MIXED, XML_SCHEMA_CONTENT_SIMPLE, XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS, /* Obsolete */ XML_SCHEMA_CONTENT_BASIC, XML_SCHEMA_CONTENT_ANY } xmlSchemaContentType; typedef struct _xmlSchemaVal xmlSchemaVal; typedef xmlSchemaVal *xmlSchemaValPtr; typedef struct _xmlSchemaType xmlSchemaType; typedef xmlSchemaType *xmlSchemaTypePtr; typedef struct _xmlSchemaFacet xmlSchemaFacet; typedef xmlSchemaFacet *xmlSchemaFacetPtr; /** * Annotation */ typedef struct _xmlSchemaAnnot xmlSchemaAnnot; typedef xmlSchemaAnnot *xmlSchemaAnnotPtr; struct _xmlSchemaAnnot { struct _xmlSchemaAnnot *next; xmlNodePtr content; /* the annotation */ }; /** * XML_SCHEMAS_ANYATTR_SKIP: * * Skip unknown attribute from validation * Obsolete, not used anymore. */ #define XML_SCHEMAS_ANYATTR_SKIP 1 /** * XML_SCHEMAS_ANYATTR_LAX: * * Ignore validation non definition on attributes * Obsolete, not used anymore. */ #define XML_SCHEMAS_ANYATTR_LAX 2 /** * XML_SCHEMAS_ANYATTR_STRICT: * * Apply strict validation rules on attributes * Obsolete, not used anymore. */ #define XML_SCHEMAS_ANYATTR_STRICT 3 /** * XML_SCHEMAS_ANY_SKIP: * * Skip unknown attribute from validation */ #define XML_SCHEMAS_ANY_SKIP 1 /** * XML_SCHEMAS_ANY_LAX: * * Used by wildcards. * Validate if type found, don't worry if not found */ #define XML_SCHEMAS_ANY_LAX 2 /** * XML_SCHEMAS_ANY_STRICT: * * Used by wildcards. * Apply strict validation rules */ #define XML_SCHEMAS_ANY_STRICT 3 /** * XML_SCHEMAS_ATTR_USE_PROHIBITED: * * Used by wildcards. * The attribute is prohibited. */ #define XML_SCHEMAS_ATTR_USE_PROHIBITED 0 /** * XML_SCHEMAS_ATTR_USE_REQUIRED: * * The attribute is required. */ #define XML_SCHEMAS_ATTR_USE_REQUIRED 1 /** * XML_SCHEMAS_ATTR_USE_OPTIONAL: * * The attribute is optional. */ #define XML_SCHEMAS_ATTR_USE_OPTIONAL 2 /** * XML_SCHEMAS_ATTR_GLOBAL: * * allow elements in no namespace */ #define XML_SCHEMAS_ATTR_GLOBAL 1 << 0 /** * XML_SCHEMAS_ATTR_NSDEFAULT: * * allow elements in no namespace */ #define XML_SCHEMAS_ATTR_NSDEFAULT 1 << 7 /** * XML_SCHEMAS_ATTR_INTERNAL_RESOLVED: * * this is set when the "type" and "ref" references * have been resolved. */ #define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED 1 << 8 /** * XML_SCHEMAS_ATTR_FIXED: * * the attribute has a fixed value */ #define XML_SCHEMAS_ATTR_FIXED 1 << 9 /** * xmlSchemaAttribute: * An attribute definition. */ typedef struct _xmlSchemaAttribute xmlSchemaAttribute; typedef xmlSchemaAttribute *xmlSchemaAttributePtr; struct _xmlSchemaAttribute { xmlSchemaTypeType type; struct _xmlSchemaAttribute *next; /* the next attribute (not used?) */ const xmlChar *name; /* the name of the declaration */ const xmlChar *id; /* Deprecated; not used */ const xmlChar *ref; /* Deprecated; not used */ const xmlChar *refNs; /* Deprecated; not used */ const xmlChar *typeName; /* the local name of the type definition */ const xmlChar *typeNs; /* the ns URI of the type definition */ xmlSchemaAnnotPtr annot; xmlSchemaTypePtr base; /* Deprecated; not used */ int occurs; /* Deprecated; not used */ const xmlChar *defValue; /* The initial value of the value constraint */ xmlSchemaTypePtr subtypes; /* the type definition */ xmlNodePtr node; const xmlChar *targetNamespace; int flags; const xmlChar *refPrefix; /* Deprecated; not used */ xmlSchemaValPtr defVal; /* The compiled value constraint */ xmlSchemaAttributePtr refDecl; /* Deprecated; not used */ }; /** * xmlSchemaAttributeLink: * Used to build a list of attribute uses on complexType definitions. * WARNING: Deprecated; not used. */ typedef struct _xmlSchemaAttributeLink xmlSchemaAttributeLink; typedef xmlSchemaAttributeLink *xmlSchemaAttributeLinkPtr; struct _xmlSchemaAttributeLink { struct _xmlSchemaAttributeLink *next;/* the next attribute link ... */ struct _xmlSchemaAttribute *attr;/* the linked attribute */ }; /** * XML_SCHEMAS_WILDCARD_COMPLETE: * * If the wildcard is complete. */ #define XML_SCHEMAS_WILDCARD_COMPLETE 1 << 0 /** * xmlSchemaCharValueLink: * Used to build a list of namespaces on wildcards. */ typedef struct _xmlSchemaWildcardNs xmlSchemaWildcardNs; typedef xmlSchemaWildcardNs *xmlSchemaWildcardNsPtr; struct _xmlSchemaWildcardNs { struct _xmlSchemaWildcardNs *next;/* the next constraint link ... */ const xmlChar *value;/* the value */ }; /** * xmlSchemaWildcard. * A wildcard. */ typedef struct _xmlSchemaWildcard xmlSchemaWildcard; typedef xmlSchemaWildcard *xmlSchemaWildcardPtr; struct _xmlSchemaWildcard { xmlSchemaTypeType type; /* The kind of type */ const xmlChar *id; /* Deprecated; not used */ xmlSchemaAnnotPtr annot; xmlNodePtr node; int minOccurs; /* Deprecated; not used */ int maxOccurs; /* Deprecated; not used */ int processContents; int any; /* Indicates if the ns constraint is of ##any */ xmlSchemaWildcardNsPtr nsSet; /* The list of allowed namespaces */ xmlSchemaWildcardNsPtr negNsSet; /* The negated namespace */ int flags; }; /** * XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED: * * The attribute wildcard has been already builded. */ #define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED 1 << 0 /** * XML_SCHEMAS_ATTRGROUP_GLOBAL: * * The attribute wildcard has been already builded. */ #define XML_SCHEMAS_ATTRGROUP_GLOBAL 1 << 1 /** * XML_SCHEMAS_ATTRGROUP_MARKED: * * Marks the attr group as marked; used for circular checks. */ #define XML_SCHEMAS_ATTRGROUP_MARKED 1 << 2 /** * XML_SCHEMAS_ATTRGROUP_REDEFINED: * * The attr group was redefined. */ #define XML_SCHEMAS_ATTRGROUP_REDEFINED 1 << 3 /** * XML_SCHEMAS_ATTRGROUP_HAS_REFS: * * Whether this attr. group contains attr. group references. */ #define XML_SCHEMAS_ATTRGROUP_HAS_REFS 1 << 4 /** * An attribute group definition. * * xmlSchemaAttribute and xmlSchemaAttributeGroup start of structures * must be kept similar */ typedef struct _xmlSchemaAttributeGroup xmlSchemaAttributeGroup; typedef xmlSchemaAttributeGroup *xmlSchemaAttributeGroupPtr; struct _xmlSchemaAttributeGroup { xmlSchemaTypeType type; /* The kind of type */ struct _xmlSchemaAttribute *next;/* the next attribute if in a group ... */ const xmlChar *name; const xmlChar *id; const xmlChar *ref; /* Deprecated; not used */ const xmlChar *refNs; /* Deprecated; not used */ xmlSchemaAnnotPtr annot; xmlSchemaAttributePtr attributes; /* Deprecated; not used */ xmlNodePtr node; int flags; xmlSchemaWildcardPtr attributeWildcard; const xmlChar *refPrefix; /* Deprecated; not used */ xmlSchemaAttributeGroupPtr refItem; /* Deprecated; not used */ const xmlChar *targetNamespace; void *attrUses; }; /** * xmlSchemaTypeLink: * Used to build a list of types (e.g. member types of * simpleType with variety "union"). */ typedef struct _xmlSchemaTypeLink xmlSchemaTypeLink; typedef xmlSchemaTypeLink *xmlSchemaTypeLinkPtr; struct _xmlSchemaTypeLink { struct _xmlSchemaTypeLink *next;/* the next type link ... */ xmlSchemaTypePtr type;/* the linked type */ }; /** * xmlSchemaFacetLink: * Used to build a list of facets. */ typedef struct _xmlSchemaFacetLink xmlSchemaFacetLink; typedef xmlSchemaFacetLink *xmlSchemaFacetLinkPtr; struct _xmlSchemaFacetLink { struct _xmlSchemaFacetLink *next;/* the next facet link ... */ xmlSchemaFacetPtr facet;/* the linked facet */ }; /** * XML_SCHEMAS_TYPE_MIXED: * * the element content type is mixed */ #define XML_SCHEMAS_TYPE_MIXED 1 << 0 /** * XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION: * * the simple or complex type has a derivation method of "extension". */ #define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION 1 << 1 /** * XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION: * * the simple or complex type has a derivation method of "restriction". */ #define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION 1 << 2 /** * XML_SCHEMAS_TYPE_GLOBAL: * * the type is global */ #define XML_SCHEMAS_TYPE_GLOBAL 1 << 3 /** * XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD: * * the complexType owns an attribute wildcard, i.e. * it can be freed by the complexType */ #define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD 1 << 4 /* Obsolete. */ /** * XML_SCHEMAS_TYPE_VARIETY_ABSENT: * * the simpleType has a variety of "absent". * TODO: Actually not necessary :-/, since if * none of the variety flags occur then it's * automatically absent. */ #define XML_SCHEMAS_TYPE_VARIETY_ABSENT 1 << 5 /** * XML_SCHEMAS_TYPE_VARIETY_LIST: * * the simpleType has a variety of "list". */ #define XML_SCHEMAS_TYPE_VARIETY_LIST 1 << 6 /** * XML_SCHEMAS_TYPE_VARIETY_UNION: * * the simpleType has a variety of "union". */ #define XML_SCHEMAS_TYPE_VARIETY_UNION 1 << 7 /** * XML_SCHEMAS_TYPE_VARIETY_ATOMIC: * * the simpleType has a variety of "union". */ #define XML_SCHEMAS_TYPE_VARIETY_ATOMIC 1 << 8 /** * XML_SCHEMAS_TYPE_FINAL_EXTENSION: * * the complexType has a final of "extension". */ #define XML_SCHEMAS_TYPE_FINAL_EXTENSION 1 << 9 /** * XML_SCHEMAS_TYPE_FINAL_RESTRICTION: * * the simpleType/complexType has a final of "restriction". */ #define XML_SCHEMAS_TYPE_FINAL_RESTRICTION 1 << 10 /** * XML_SCHEMAS_TYPE_FINAL_LIST: * * the simpleType has a final of "list". */ #define XML_SCHEMAS_TYPE_FINAL_LIST 1 << 11 /** * XML_SCHEMAS_TYPE_FINAL_UNION: * * the simpleType has a final of "union". */ #define XML_SCHEMAS_TYPE_FINAL_UNION 1 << 12 /** * XML_SCHEMAS_TYPE_FINAL_DEFAULT: * * the simpleType has a final of "default". */ #define XML_SCHEMAS_TYPE_FINAL_DEFAULT 1 << 13 /** * XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE: * * Marks the item as a builtin primitive. */ #define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE 1 << 14 /** * XML_SCHEMAS_TYPE_MARKED: * * Marks the item as marked; used for circular checks. */ #define XML_SCHEMAS_TYPE_MARKED 1 << 16 /** * XML_SCHEMAS_TYPE_BLOCK_DEFAULT: * * the complexType did not specify 'block' so use the default of the * item. */ #define XML_SCHEMAS_TYPE_BLOCK_DEFAULT 1 << 17 /** * XML_SCHEMAS_TYPE_BLOCK_EXTENSION: * * the complexType has a 'block' of "extension". */ #define XML_SCHEMAS_TYPE_BLOCK_EXTENSION 1 << 18 /** * XML_SCHEMAS_TYPE_BLOCK_RESTRICTION: * * the complexType has a 'block' of "restriction". */ #define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION 1 << 19 /** * XML_SCHEMAS_TYPE_ABSTRACT: * * the simple/complexType is abstract. */ #define XML_SCHEMAS_TYPE_ABSTRACT 1 << 20 /** * XML_SCHEMAS_TYPE_FACETSNEEDVALUE: * * indicates if the facets need a computed value */ #define XML_SCHEMAS_TYPE_FACETSNEEDVALUE 1 << 21 /** * XML_SCHEMAS_TYPE_INTERNAL_RESOLVED: * * indicates that the type was typefixed */ #define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED 1 << 22 /** * XML_SCHEMAS_TYPE_INTERNAL_INVALID: * * indicates that the type is invalid */ #define XML_SCHEMAS_TYPE_INTERNAL_INVALID 1 << 23 /** * XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE: * * a whitespace-facet value of "preserve" */ #define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE 1 << 24 /** * XML_SCHEMAS_TYPE_WHITESPACE_REPLACE: * * a whitespace-facet value of "replace" */ #define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE 1 << 25 /** * XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE: * * a whitespace-facet value of "collapse" */ #define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE 1 << 26 /** * XML_SCHEMAS_TYPE_HAS_FACETS: * * has facets */ #define XML_SCHEMAS_TYPE_HAS_FACETS 1 << 27 /** * XML_SCHEMAS_TYPE_NORMVALUENEEDED: * * indicates if the facets (pattern) need a normalized value */ #define XML_SCHEMAS_TYPE_NORMVALUENEEDED 1 << 28 /** * XML_SCHEMAS_TYPE_FIXUP_1: * * First stage of fixup was done. */ #define XML_SCHEMAS_TYPE_FIXUP_1 1 << 29 /** * XML_SCHEMAS_TYPE_REDEFINED: * * The type was redefined. */ #define XML_SCHEMAS_TYPE_REDEFINED 1 << 30 /** * XML_SCHEMAS_TYPE_REDEFINING: * * The type redefines an other type. */ /* #define XML_SCHEMAS_TYPE_REDEFINING 1 << 31 */ /** * _xmlSchemaType: * * Schemas type definition. */ struct _xmlSchemaType { xmlSchemaTypeType type; /* The kind of type */ struct _xmlSchemaType *next; /* the next type if in a sequence ... */ const xmlChar *name; const xmlChar *id ; /* Deprecated; not used */ const xmlChar *ref; /* Deprecated; not used */ const xmlChar *refNs; /* Deprecated; not used */ xmlSchemaAnnotPtr annot; xmlSchemaTypePtr subtypes; xmlSchemaAttributePtr attributes; /* Deprecated; not used */ xmlNodePtr node; int minOccurs; /* Deprecated; not used */ int maxOccurs; /* Deprecated; not used */ int flags; xmlSchemaContentType contentType; const xmlChar *base; /* Base type's local name */ const xmlChar *baseNs; /* Base type's target namespace */ xmlSchemaTypePtr baseType; /* The base type component */ xmlSchemaFacetPtr facets; /* Local facets */ struct _xmlSchemaType *redef; /* Deprecated; not used */ int recurse; /* Obsolete */ xmlSchemaAttributeLinkPtr *attributeUses; /* Deprecated; not used */ xmlSchemaWildcardPtr attributeWildcard; int builtInType; /* Type of built-in types. */ xmlSchemaTypeLinkPtr memberTypes; /* member-types if a union type. */ xmlSchemaFacetLinkPtr facetSet; /* All facets (incl. inherited) */ const xmlChar *refPrefix; /* Deprecated; not used */ xmlSchemaTypePtr contentTypeDef; /* Used for the simple content of complex types. Could we use @subtypes for this? */ xmlRegexpPtr contModel; /* Holds the automaton of the content model */ const xmlChar *targetNamespace; void *attrUses; }; /* * xmlSchemaElement: * An element definition. * * xmlSchemaType, xmlSchemaFacet and xmlSchemaElement start of * structures must be kept similar */ /** * XML_SCHEMAS_ELEM_NILLABLE: * * the element is nillable */ #define XML_SCHEMAS_ELEM_NILLABLE 1 << 0 /** * XML_SCHEMAS_ELEM_GLOBAL: * * the element is global */ #define XML_SCHEMAS_ELEM_GLOBAL 1 << 1 /** * XML_SCHEMAS_ELEM_DEFAULT: * * the element has a default value */ #define XML_SCHEMAS_ELEM_DEFAULT 1 << 2 /** * XML_SCHEMAS_ELEM_FIXED: * * the element has a fixed value */ #define XML_SCHEMAS_ELEM_FIXED 1 << 3 /** * XML_SCHEMAS_ELEM_ABSTRACT: * * the element is abstract */ #define XML_SCHEMAS_ELEM_ABSTRACT 1 << 4 /** * XML_SCHEMAS_ELEM_TOPLEVEL: * * the element is top level * obsolete: use XML_SCHEMAS_ELEM_GLOBAL instead */ #define XML_SCHEMAS_ELEM_TOPLEVEL 1 << 5 /** * XML_SCHEMAS_ELEM_REF: * * the element is a reference to a type */ #define XML_SCHEMAS_ELEM_REF 1 << 6 /** * XML_SCHEMAS_ELEM_NSDEFAULT: * * allow elements in no namespace * Obsolete, not used anymore. */ #define XML_SCHEMAS_ELEM_NSDEFAULT 1 << 7 /** * XML_SCHEMAS_ELEM_INTERNAL_RESOLVED: * * this is set when "type", "ref", "substitutionGroup" * references have been resolved. */ #define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED 1 << 8 /** * XML_SCHEMAS_ELEM_CIRCULAR: * * a helper flag for the search of circular references. */ #define XML_SCHEMAS_ELEM_CIRCULAR 1 << 9 /** * XML_SCHEMAS_ELEM_BLOCK_ABSENT: * * the "block" attribute is absent */ #define XML_SCHEMAS_ELEM_BLOCK_ABSENT 1 << 10 /** * XML_SCHEMAS_ELEM_BLOCK_EXTENSION: * * disallowed substitutions are absent */ #define XML_SCHEMAS_ELEM_BLOCK_EXTENSION 1 << 11 /** * XML_SCHEMAS_ELEM_BLOCK_RESTRICTION: * * disallowed substitutions: "restriction" */ #define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION 1 << 12 /** * XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION: * * disallowed substitutions: "substituion" */ #define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION 1 << 13 /** * XML_SCHEMAS_ELEM_FINAL_ABSENT: * * substitution group exclusions are absent */ #define XML_SCHEMAS_ELEM_FINAL_ABSENT 1 << 14 /** * XML_SCHEMAS_ELEM_FINAL_EXTENSION: * * substitution group exclusions: "extension" */ #define XML_SCHEMAS_ELEM_FINAL_EXTENSION 1 << 15 /** * XML_SCHEMAS_ELEM_FINAL_RESTRICTION: * * substitution group exclusions: "restriction" */ #define XML_SCHEMAS_ELEM_FINAL_RESTRICTION 1 << 16 /** * XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD: * * the declaration is a substitution group head */ #define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD 1 << 17 /** * XML_SCHEMAS_ELEM_INTERNAL_CHECKED: * * this is set when the elem decl has been checked against * all constraints */ #define XML_SCHEMAS_ELEM_INTERNAL_CHECKED 1 << 18 typedef struct _xmlSchemaElement xmlSchemaElement; typedef xmlSchemaElement *xmlSchemaElementPtr; struct _xmlSchemaElement { xmlSchemaTypeType type; /* The kind of type */ struct _xmlSchemaType *next; /* Not used? */ const xmlChar *name; const xmlChar *id; /* Deprecated; not used */ const xmlChar *ref; /* Deprecated; not used */ const xmlChar *refNs; /* Deprecated; not used */ xmlSchemaAnnotPtr annot; xmlSchemaTypePtr subtypes; /* the type definition */ xmlSchemaAttributePtr attributes; xmlNodePtr node; int minOccurs; /* Deprecated; not used */ int maxOccurs; /* Deprecated; not used */ int flags; const xmlChar *targetNamespace; const xmlChar *namedType; const xmlChar *namedTypeNs; const xmlChar *substGroup; const xmlChar *substGroupNs; const xmlChar *scope; const xmlChar *value; /* The original value of the value constraint. */ struct _xmlSchemaElement *refDecl; /* This will now be used for the substitution group affiliation */ xmlRegexpPtr contModel; /* Obsolete for WXS, maybe used for RelaxNG */ xmlSchemaContentType contentType; const xmlChar *refPrefix; /* Deprecated; not used */ xmlSchemaValPtr defVal; /* The compiled value contraint. */ void *idcs; /* The identity-constraint defs */ }; /* * XML_SCHEMAS_FACET_UNKNOWN: * * unknown facet handling */ #define XML_SCHEMAS_FACET_UNKNOWN 0 /* * XML_SCHEMAS_FACET_PRESERVE: * * preserve the type of the facet */ #define XML_SCHEMAS_FACET_PRESERVE 1 /* * XML_SCHEMAS_FACET_REPLACE: * * replace the type of the facet */ #define XML_SCHEMAS_FACET_REPLACE 2 /* * XML_SCHEMAS_FACET_COLLAPSE: * * collapse the types of the facet */ #define XML_SCHEMAS_FACET_COLLAPSE 3 /** * A facet definition. */ struct _xmlSchemaFacet { xmlSchemaTypeType type; /* The kind of type */ struct _xmlSchemaFacet *next;/* the next type if in a sequence ... */ const xmlChar *value; /* The original value */ const xmlChar *id; /* Obsolete */ xmlSchemaAnnotPtr annot; xmlNodePtr node; int fixed; /* XML_SCHEMAS_FACET_PRESERVE, etc. */ int whitespace; xmlSchemaValPtr val; /* The compiled value */ xmlRegexpPtr regexp; /* The regex for patterns */ }; /** * A notation definition. */ typedef struct _xmlSchemaNotation xmlSchemaNotation; typedef xmlSchemaNotation *xmlSchemaNotationPtr; struct _xmlSchemaNotation { xmlSchemaTypeType type; /* The kind of type */ const xmlChar *name; xmlSchemaAnnotPtr annot; const xmlChar *identifier; const xmlChar *targetNamespace; }; /* * TODO: Actually all those flags used for the schema should sit * on the schema parser context, since they are used only * during parsing an XML schema document, and not available * on the component level as per spec. */ /** * XML_SCHEMAS_QUALIF_ELEM: * * Reflects elementFormDefault == qualified in * an XML schema document. */ #define XML_SCHEMAS_QUALIF_ELEM 1 << 0 /** * XML_SCHEMAS_QUALIF_ATTR: * * Reflects attributeFormDefault == qualified in * an XML schema document. */ #define XML_SCHEMAS_QUALIF_ATTR 1 << 1 /** * XML_SCHEMAS_FINAL_DEFAULT_EXTENSION: * * the schema has "extension" in the set of finalDefault. */ #define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION 1 << 2 /** * XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION: * * the schema has "restriction" in the set of finalDefault. */ #define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION 1 << 3 /** * XML_SCHEMAS_FINAL_DEFAULT_LIST: * * the cshema has "list" in the set of finalDefault. */ #define XML_SCHEMAS_FINAL_DEFAULT_LIST 1 << 4 /** * XML_SCHEMAS_FINAL_DEFAULT_UNION: * * the schema has "union" in the set of finalDefault. */ #define XML_SCHEMAS_FINAL_DEFAULT_UNION 1 << 5 /** * XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION: * * the schema has "extension" in the set of blockDefault. */ #define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION 1 << 6 /** * XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION: * * the schema has "restriction" in the set of blockDefault. */ #define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION 1 << 7 /** * XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION: * * the schema has "substitution" in the set of blockDefault. */ #define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION 1 << 8 /** * XML_SCHEMAS_INCLUDING_CONVERT_NS: * * the schema is currently including an other schema with * no target namespace. */ #define XML_SCHEMAS_INCLUDING_CONVERT_NS 1 << 9 /** * _xmlSchema: * * A Schemas definition */ struct _xmlSchema { const xmlChar *name; /* schema name */ const xmlChar *targetNamespace; /* the target namespace */ const xmlChar *version; const xmlChar *id; /* Obsolete */ xmlDocPtr doc; xmlSchemaAnnotPtr annot; int flags; xmlHashTablePtr typeDecl; xmlHashTablePtr attrDecl; xmlHashTablePtr attrgrpDecl; xmlHashTablePtr elemDecl; xmlHashTablePtr notaDecl; xmlHashTablePtr schemasImports; void *_private; /* unused by the library for users or bindings */ xmlHashTablePtr groupDecl; xmlDictPtr dict; void *includes; /* the includes, this is opaque for now */ int preserve; /* whether to free the document */ int counter; /* used to give ononymous components unique names */ xmlHashTablePtr idcDef; /* All identity-constraint defs. */ void *volatiles; /* Obsolete */ }; XMLPUBFUN void XMLCALL xmlSchemaFreeType (xmlSchemaTypePtr type); XMLPUBFUN void XMLCALL xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard); #ifdef __cplusplus } #endif #endif /* LIBXML_SCHEMAS_ENABLED */ #endif /* __XML_SCHEMA_INTERNALS_H__ */ libxml2-2.9.1+dfsg1/include/libxml/nanoftp.h0000644000175000017500000000726212113312342017303 0ustar aronaron/* * Summary: minimal FTP implementation * Description: minimal FTP implementation allowing to fetch resources * like external subset. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __NANO_FTP_H__ #define __NANO_FTP_H__ #include #ifdef LIBXML_FTP_ENABLED /* Needed for portability to Windows 64 bits */ #if defined(__MINGW32__) || defined(_WIN32_WCE) #include #else /** * SOCKET: * * macro used to provide portability of code to windows sockets */ #define SOCKET int /** * INVALID_SOCKET: * * macro used to provide portability of code to windows sockets * the value to be used when the socket is not valid */ #undef INVALID_SOCKET #define INVALID_SOCKET (-1) #endif #ifdef __cplusplus extern "C" { #endif /** * ftpListCallback: * @userData: user provided data for the callback * @filename: the file name (including "->" when links are shown) * @attrib: the attribute string * @owner: the owner string * @group: the group string * @size: the file size * @links: the link count * @year: the year * @month: the month * @day: the day * @hour: the hour * @minute: the minute * * A callback for the xmlNanoFTPList command. * Note that only one of year and day:minute are specified. */ typedef void (*ftpListCallback) (void *userData, const char *filename, const char *attrib, const char *owner, const char *group, unsigned long size, int links, int year, const char *month, int day, int hour, int minute); /** * ftpDataCallback: * @userData: the user provided context * @data: the data received * @len: its size in bytes * * A callback for the xmlNanoFTPGet command. */ typedef void (*ftpDataCallback) (void *userData, const char *data, int len); /* * Init */ XMLPUBFUN void XMLCALL xmlNanoFTPInit (void); XMLPUBFUN void XMLCALL xmlNanoFTPCleanup (void); /* * Creating/freeing contexts. */ XMLPUBFUN void * XMLCALL xmlNanoFTPNewCtxt (const char *URL); XMLPUBFUN void XMLCALL xmlNanoFTPFreeCtxt (void * ctx); XMLPUBFUN void * XMLCALL xmlNanoFTPConnectTo (const char *server, int port); /* * Opening/closing session connections. */ XMLPUBFUN void * XMLCALL xmlNanoFTPOpen (const char *URL); XMLPUBFUN int XMLCALL xmlNanoFTPConnect (void *ctx); XMLPUBFUN int XMLCALL xmlNanoFTPClose (void *ctx); XMLPUBFUN int XMLCALL xmlNanoFTPQuit (void *ctx); XMLPUBFUN void XMLCALL xmlNanoFTPScanProxy (const char *URL); XMLPUBFUN void XMLCALL xmlNanoFTPProxy (const char *host, int port, const char *user, const char *passwd, int type); XMLPUBFUN int XMLCALL xmlNanoFTPUpdateURL (void *ctx, const char *URL); /* * Rather internal commands. */ XMLPUBFUN int XMLCALL xmlNanoFTPGetResponse (void *ctx); XMLPUBFUN int XMLCALL xmlNanoFTPCheckResponse (void *ctx); /* * CD/DIR/GET handlers. */ XMLPUBFUN int XMLCALL xmlNanoFTPCwd (void *ctx, const char *directory); XMLPUBFUN int XMLCALL xmlNanoFTPDele (void *ctx, const char *file); XMLPUBFUN SOCKET XMLCALL xmlNanoFTPGetConnection (void *ctx); XMLPUBFUN int XMLCALL xmlNanoFTPCloseConnection(void *ctx); XMLPUBFUN int XMLCALL xmlNanoFTPList (void *ctx, ftpListCallback callback, void *userData, const char *filename); XMLPUBFUN SOCKET XMLCALL xmlNanoFTPGetSocket (void *ctx, const char *filename); XMLPUBFUN int XMLCALL xmlNanoFTPGet (void *ctx, ftpDataCallback callback, void *userData, const char *filename); XMLPUBFUN int XMLCALL xmlNanoFTPRead (void *ctx, void *dest, int len); #ifdef __cplusplus } #endif #endif /* LIBXML_FTP_ENABLED */ #endif /* __NANO_FTP_H__ */ libxml2-2.9.1+dfsg1/include/libxml/globals.h0000644000175000017500000003447312113312342017265 0ustar aronaron/* * Summary: interface for all global variables of the library * Description: all the global variables and thread handling for * those variables is handled by this module. * * The bottom of this file is automatically generated by build_glob.py * based on the description file global.data * * Copy: See Copyright for the status of this software. * * Author: Gary Pennington , Daniel Veillard */ #ifndef __XML_GLOBALS_H #define __XML_GLOBALS_H #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif XMLPUBFUN void XMLCALL xmlInitGlobals(void); XMLPUBFUN void XMLCALL xmlCleanupGlobals(void); /** * xmlParserInputBufferCreateFilenameFunc: * @URI: the URI to read from * @enc: the requested source encoding * * Signature for the function doing the lookup for a suitable input method * corresponding to an URI. * * Returns the new xmlParserInputBufferPtr in case of success or NULL if no * method was found. */ typedef xmlParserInputBufferPtr (*xmlParserInputBufferCreateFilenameFunc) (const char *URI, xmlCharEncoding enc); /** * xmlOutputBufferCreateFilenameFunc: * @URI: the URI to write to * @enc: the requested target encoding * * Signature for the function doing the lookup for a suitable output method * corresponding to an URI. * * Returns the new xmlOutputBufferPtr in case of success or NULL if no * method was found. */ typedef xmlOutputBufferPtr (*xmlOutputBufferCreateFilenameFunc) (const char *URI, xmlCharEncodingHandlerPtr encoder, int compression); XMLPUBFUN xmlParserInputBufferCreateFilenameFunc XMLCALL xmlParserInputBufferCreateFilenameDefault (xmlParserInputBufferCreateFilenameFunc func); XMLPUBFUN xmlOutputBufferCreateFilenameFunc XMLCALL xmlOutputBufferCreateFilenameDefault (xmlOutputBufferCreateFilenameFunc func); /* * Externally global symbols which need to be protected for backwards * compatibility support. */ #undef docbDefaultSAXHandler #undef htmlDefaultSAXHandler #undef oldXMLWDcompatibility #undef xmlBufferAllocScheme #undef xmlDefaultBufferSize #undef xmlDefaultSAXHandler #undef xmlDefaultSAXLocator #undef xmlDoValidityCheckingDefaultValue #undef xmlFree #undef xmlGenericError #undef xmlStructuredError #undef xmlGenericErrorContext #undef xmlStructuredErrorContext #undef xmlGetWarningsDefaultValue #undef xmlIndentTreeOutput #undef xmlTreeIndentString #undef xmlKeepBlanksDefaultValue #undef xmlLineNumbersDefaultValue #undef xmlLoadExtDtdDefaultValue #undef xmlMalloc #undef xmlMallocAtomic #undef xmlMemStrdup #undef xmlParserDebugEntities #undef xmlParserVersion #undef xmlPedanticParserDefaultValue #undef xmlRealloc #undef xmlSaveNoEmptyTags #undef xmlSubstituteEntitiesDefaultValue #undef xmlRegisterNodeDefaultValue #undef xmlDeregisterNodeDefaultValue #undef xmlLastError #undef xmlParserInputBufferCreateFilenameValue #undef xmlOutputBufferCreateFilenameValue /** * xmlRegisterNodeFunc: * @node: the current node * * Signature for the registration callback of a created node */ typedef void (*xmlRegisterNodeFunc) (xmlNodePtr node); /** * xmlDeregisterNodeFunc: * @node: the current node * * Signature for the deregistration callback of a discarded node */ typedef void (*xmlDeregisterNodeFunc) (xmlNodePtr node); typedef struct _xmlGlobalState xmlGlobalState; typedef xmlGlobalState *xmlGlobalStatePtr; struct _xmlGlobalState { const char *xmlParserVersion; xmlSAXLocator xmlDefaultSAXLocator; xmlSAXHandlerV1 xmlDefaultSAXHandler; xmlSAXHandlerV1 docbDefaultSAXHandler; xmlSAXHandlerV1 htmlDefaultSAXHandler; xmlFreeFunc xmlFree; xmlMallocFunc xmlMalloc; xmlStrdupFunc xmlMemStrdup; xmlReallocFunc xmlRealloc; xmlGenericErrorFunc xmlGenericError; xmlStructuredErrorFunc xmlStructuredError; void *xmlGenericErrorContext; int oldXMLWDcompatibility; xmlBufferAllocationScheme xmlBufferAllocScheme; int xmlDefaultBufferSize; int xmlSubstituteEntitiesDefaultValue; int xmlDoValidityCheckingDefaultValue; int xmlGetWarningsDefaultValue; int xmlKeepBlanksDefaultValue; int xmlLineNumbersDefaultValue; int xmlLoadExtDtdDefaultValue; int xmlParserDebugEntities; int xmlPedanticParserDefaultValue; int xmlSaveNoEmptyTags; int xmlIndentTreeOutput; const char *xmlTreeIndentString; xmlRegisterNodeFunc xmlRegisterNodeDefaultValue; xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue; xmlMallocFunc xmlMallocAtomic; xmlError xmlLastError; xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue; xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue; void *xmlStructuredErrorContext; }; #ifdef __cplusplus } #endif #include #ifdef __cplusplus extern "C" { #endif XMLPUBFUN void XMLCALL xmlInitializeGlobalState(xmlGlobalStatePtr gs); XMLPUBFUN void XMLCALL xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler); XMLPUBFUN void XMLCALL xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler); XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlRegisterNodeDefault(xmlRegisterNodeFunc func); XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func); XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func); XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func); XMLPUBFUN xmlOutputBufferCreateFilenameFunc XMLCALL xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func); XMLPUBFUN xmlParserInputBufferCreateFilenameFunc XMLCALL xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func); /** DOC_DISABLE */ /* * In general the memory allocation entry points are not kept * thread specific but this can be overridden by LIBXML_THREAD_ALLOC_ENABLED * - xmlMalloc * - xmlMallocAtomic * - xmlRealloc * - xmlMemStrdup * - xmlFree */ #ifdef LIBXML_THREAD_ALLOC_ENABLED #ifdef LIBXML_THREAD_ENABLED XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMalloc(void); #define xmlMalloc \ (*(__xmlMalloc())) #else XMLPUBVAR xmlMallocFunc xmlMalloc; #endif #ifdef LIBXML_THREAD_ENABLED XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMallocAtomic(void); #define xmlMallocAtomic \ (*(__xmlMallocAtomic())) #else XMLPUBVAR xmlMallocFunc xmlMallocAtomic; #endif #ifdef LIBXML_THREAD_ENABLED XMLPUBFUN xmlReallocFunc * XMLCALL __xmlRealloc(void); #define xmlRealloc \ (*(__xmlRealloc())) #else XMLPUBVAR xmlReallocFunc xmlRealloc; #endif #ifdef LIBXML_THREAD_ENABLED XMLPUBFUN xmlFreeFunc * XMLCALL __xmlFree(void); #define xmlFree \ (*(__xmlFree())) #else XMLPUBVAR xmlFreeFunc xmlFree; #endif #ifdef LIBXML_THREAD_ENABLED XMLPUBFUN xmlStrdupFunc * XMLCALL __xmlMemStrdup(void); #define xmlMemStrdup \ (*(__xmlMemStrdup())) #else XMLPUBVAR xmlStrdupFunc xmlMemStrdup; #endif #else /* !LIBXML_THREAD_ALLOC_ENABLED */ XMLPUBVAR xmlMallocFunc xmlMalloc; XMLPUBVAR xmlMallocFunc xmlMallocAtomic; XMLPUBVAR xmlReallocFunc xmlRealloc; XMLPUBVAR xmlFreeFunc xmlFree; XMLPUBVAR xmlStrdupFunc xmlMemStrdup; #endif /* LIBXML_THREAD_ALLOC_ENABLED */ #ifdef LIBXML_DOCB_ENABLED XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __docbDefaultSAXHandler(void); #ifdef LIBXML_THREAD_ENABLED #define docbDefaultSAXHandler \ (*(__docbDefaultSAXHandler())) #else XMLPUBVAR xmlSAXHandlerV1 docbDefaultSAXHandler; #endif #endif #ifdef LIBXML_HTML_ENABLED XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __htmlDefaultSAXHandler(void); #ifdef LIBXML_THREAD_ENABLED #define htmlDefaultSAXHandler \ (*(__htmlDefaultSAXHandler())) #else XMLPUBVAR xmlSAXHandlerV1 htmlDefaultSAXHandler; #endif #endif XMLPUBFUN xmlError * XMLCALL __xmlLastError(void); #ifdef LIBXML_THREAD_ENABLED #define xmlLastError \ (*(__xmlLastError())) #else XMLPUBVAR xmlError xmlLastError; #endif /* * Everything starting from the line below is * Automatically generated by build_glob.py. * Do not modify the previous line. */ XMLPUBFUN int * XMLCALL __oldXMLWDcompatibility(void); #ifdef LIBXML_THREAD_ENABLED #define oldXMLWDcompatibility \ (*(__oldXMLWDcompatibility())) #else XMLPUBVAR int oldXMLWDcompatibility; #endif XMLPUBFUN xmlBufferAllocationScheme * XMLCALL __xmlBufferAllocScheme(void); #ifdef LIBXML_THREAD_ENABLED #define xmlBufferAllocScheme \ (*(__xmlBufferAllocScheme())) #else XMLPUBVAR xmlBufferAllocationScheme xmlBufferAllocScheme; #endif XMLPUBFUN xmlBufferAllocationScheme XMLCALL xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v); XMLPUBFUN int * XMLCALL __xmlDefaultBufferSize(void); #ifdef LIBXML_THREAD_ENABLED #define xmlDefaultBufferSize \ (*(__xmlDefaultBufferSize())) #else XMLPUBVAR int xmlDefaultBufferSize; #endif XMLPUBFUN int XMLCALL xmlThrDefDefaultBufferSize(int v); XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __xmlDefaultSAXHandler(void); #ifdef LIBXML_THREAD_ENABLED #define xmlDefaultSAXHandler \ (*(__xmlDefaultSAXHandler())) #else XMLPUBVAR xmlSAXHandlerV1 xmlDefaultSAXHandler; #endif XMLPUBFUN xmlSAXLocator * XMLCALL __xmlDefaultSAXLocator(void); #ifdef LIBXML_THREAD_ENABLED #define xmlDefaultSAXLocator \ (*(__xmlDefaultSAXLocator())) #else XMLPUBVAR xmlSAXLocator xmlDefaultSAXLocator; #endif XMLPUBFUN int * XMLCALL __xmlDoValidityCheckingDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlDoValidityCheckingDefaultValue \ (*(__xmlDoValidityCheckingDefaultValue())) #else XMLPUBVAR int xmlDoValidityCheckingDefaultValue; #endif XMLPUBFUN int XMLCALL xmlThrDefDoValidityCheckingDefaultValue(int v); XMLPUBFUN xmlGenericErrorFunc * XMLCALL __xmlGenericError(void); #ifdef LIBXML_THREAD_ENABLED #define xmlGenericError \ (*(__xmlGenericError())) #else XMLPUBVAR xmlGenericErrorFunc xmlGenericError; #endif XMLPUBFUN xmlStructuredErrorFunc * XMLCALL __xmlStructuredError(void); #ifdef LIBXML_THREAD_ENABLED #define xmlStructuredError \ (*(__xmlStructuredError())) #else XMLPUBVAR xmlStructuredErrorFunc xmlStructuredError; #endif XMLPUBFUN void * * XMLCALL __xmlGenericErrorContext(void); #ifdef LIBXML_THREAD_ENABLED #define xmlGenericErrorContext \ (*(__xmlGenericErrorContext())) #else XMLPUBVAR void * xmlGenericErrorContext; #endif XMLPUBFUN void * * XMLCALL __xmlStructuredErrorContext(void); #ifdef LIBXML_THREAD_ENABLED #define xmlStructuredErrorContext \ (*(__xmlStructuredErrorContext())) #else XMLPUBVAR void * xmlStructuredErrorContext; #endif XMLPUBFUN int * XMLCALL __xmlGetWarningsDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlGetWarningsDefaultValue \ (*(__xmlGetWarningsDefaultValue())) #else XMLPUBVAR int xmlGetWarningsDefaultValue; #endif XMLPUBFUN int XMLCALL xmlThrDefGetWarningsDefaultValue(int v); XMLPUBFUN int * XMLCALL __xmlIndentTreeOutput(void); #ifdef LIBXML_THREAD_ENABLED #define xmlIndentTreeOutput \ (*(__xmlIndentTreeOutput())) #else XMLPUBVAR int xmlIndentTreeOutput; #endif XMLPUBFUN int XMLCALL xmlThrDefIndentTreeOutput(int v); XMLPUBFUN const char * * XMLCALL __xmlTreeIndentString(void); #ifdef LIBXML_THREAD_ENABLED #define xmlTreeIndentString \ (*(__xmlTreeIndentString())) #else XMLPUBVAR const char * xmlTreeIndentString; #endif XMLPUBFUN const char * XMLCALL xmlThrDefTreeIndentString(const char * v); XMLPUBFUN int * XMLCALL __xmlKeepBlanksDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlKeepBlanksDefaultValue \ (*(__xmlKeepBlanksDefaultValue())) #else XMLPUBVAR int xmlKeepBlanksDefaultValue; #endif XMLPUBFUN int XMLCALL xmlThrDefKeepBlanksDefaultValue(int v); XMLPUBFUN int * XMLCALL __xmlLineNumbersDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlLineNumbersDefaultValue \ (*(__xmlLineNumbersDefaultValue())) #else XMLPUBVAR int xmlLineNumbersDefaultValue; #endif XMLPUBFUN int XMLCALL xmlThrDefLineNumbersDefaultValue(int v); XMLPUBFUN int * XMLCALL __xmlLoadExtDtdDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlLoadExtDtdDefaultValue \ (*(__xmlLoadExtDtdDefaultValue())) #else XMLPUBVAR int xmlLoadExtDtdDefaultValue; #endif XMLPUBFUN int XMLCALL xmlThrDefLoadExtDtdDefaultValue(int v); XMLPUBFUN int * XMLCALL __xmlParserDebugEntities(void); #ifdef LIBXML_THREAD_ENABLED #define xmlParserDebugEntities \ (*(__xmlParserDebugEntities())) #else XMLPUBVAR int xmlParserDebugEntities; #endif XMLPUBFUN int XMLCALL xmlThrDefParserDebugEntities(int v); XMLPUBFUN const char * * XMLCALL __xmlParserVersion(void); #ifdef LIBXML_THREAD_ENABLED #define xmlParserVersion \ (*(__xmlParserVersion())) #else XMLPUBVAR const char * xmlParserVersion; #endif XMLPUBFUN int * XMLCALL __xmlPedanticParserDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlPedanticParserDefaultValue \ (*(__xmlPedanticParserDefaultValue())) #else XMLPUBVAR int xmlPedanticParserDefaultValue; #endif XMLPUBFUN int XMLCALL xmlThrDefPedanticParserDefaultValue(int v); XMLPUBFUN int * XMLCALL __xmlSaveNoEmptyTags(void); #ifdef LIBXML_THREAD_ENABLED #define xmlSaveNoEmptyTags \ (*(__xmlSaveNoEmptyTags())) #else XMLPUBVAR int xmlSaveNoEmptyTags; #endif XMLPUBFUN int XMLCALL xmlThrDefSaveNoEmptyTags(int v); XMLPUBFUN int * XMLCALL __xmlSubstituteEntitiesDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlSubstituteEntitiesDefaultValue \ (*(__xmlSubstituteEntitiesDefaultValue())) #else XMLPUBVAR int xmlSubstituteEntitiesDefaultValue; #endif XMLPUBFUN int XMLCALL xmlThrDefSubstituteEntitiesDefaultValue(int v); XMLPUBFUN xmlRegisterNodeFunc * XMLCALL __xmlRegisterNodeDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlRegisterNodeDefaultValue \ (*(__xmlRegisterNodeDefaultValue())) #else XMLPUBVAR xmlRegisterNodeFunc xmlRegisterNodeDefaultValue; #endif XMLPUBFUN xmlDeregisterNodeFunc * XMLCALL __xmlDeregisterNodeDefaultValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlDeregisterNodeDefaultValue \ (*(__xmlDeregisterNodeDefaultValue())) #else XMLPUBVAR xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue; #endif XMLPUBFUN xmlParserInputBufferCreateFilenameFunc * XMLCALL __xmlParserInputBufferCreateFilenameValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlParserInputBufferCreateFilenameValue \ (*(__xmlParserInputBufferCreateFilenameValue())) #else XMLPUBVAR xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue; #endif XMLPUBFUN xmlOutputBufferCreateFilenameFunc * XMLCALL __xmlOutputBufferCreateFilenameValue(void); #ifdef LIBXML_THREAD_ENABLED #define xmlOutputBufferCreateFilenameValue \ (*(__xmlOutputBufferCreateFilenameValue())) #else XMLPUBVAR xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue; #endif #ifdef __cplusplus } #endif #endif /* __XML_GLOBALS_H */ libxml2-2.9.1+dfsg1/include/libxml/list.h0000644000175000017500000000644612113312342016614 0ustar aronaron/* * Summary: lists interfaces * Description: this module implement the list support used in * various place in the library. * * Copy: See Copyright for the status of this software. * * Author: Gary Pennington */ #ifndef __XML_LINK_INCLUDE__ #define __XML_LINK_INCLUDE__ #include #ifdef __cplusplus extern "C" { #endif typedef struct _xmlLink xmlLink; typedef xmlLink *xmlLinkPtr; typedef struct _xmlList xmlList; typedef xmlList *xmlListPtr; /** * xmlListDeallocator: * @lk: the data to deallocate * * Callback function used to free data from a list. */ typedef void (*xmlListDeallocator) (xmlLinkPtr lk); /** * xmlListDataCompare: * @data0: the first data * @data1: the second data * * Callback function used to compare 2 data. * * Returns 0 is equality, -1 or 1 otherwise depending on the ordering. */ typedef int (*xmlListDataCompare) (const void *data0, const void *data1); /** * xmlListWalker: * @data: the data found in the list * @user: extra user provided data to the walker * * Callback function used when walking a list with xmlListWalk(). * * Returns 0 to stop walking the list, 1 otherwise. */ typedef int (*xmlListWalker) (const void *data, const void *user); /* Creation/Deletion */ XMLPUBFUN xmlListPtr XMLCALL xmlListCreate (xmlListDeallocator deallocator, xmlListDataCompare compare); XMLPUBFUN void XMLCALL xmlListDelete (xmlListPtr l); /* Basic Operators */ XMLPUBFUN void * XMLCALL xmlListSearch (xmlListPtr l, void *data); XMLPUBFUN void * XMLCALL xmlListReverseSearch (xmlListPtr l, void *data); XMLPUBFUN int XMLCALL xmlListInsert (xmlListPtr l, void *data) ; XMLPUBFUN int XMLCALL xmlListAppend (xmlListPtr l, void *data) ; XMLPUBFUN int XMLCALL xmlListRemoveFirst (xmlListPtr l, void *data); XMLPUBFUN int XMLCALL xmlListRemoveLast (xmlListPtr l, void *data); XMLPUBFUN int XMLCALL xmlListRemoveAll (xmlListPtr l, void *data); XMLPUBFUN void XMLCALL xmlListClear (xmlListPtr l); XMLPUBFUN int XMLCALL xmlListEmpty (xmlListPtr l); XMLPUBFUN xmlLinkPtr XMLCALL xmlListFront (xmlListPtr l); XMLPUBFUN xmlLinkPtr XMLCALL xmlListEnd (xmlListPtr l); XMLPUBFUN int XMLCALL xmlListSize (xmlListPtr l); XMLPUBFUN void XMLCALL xmlListPopFront (xmlListPtr l); XMLPUBFUN void XMLCALL xmlListPopBack (xmlListPtr l); XMLPUBFUN int XMLCALL xmlListPushFront (xmlListPtr l, void *data); XMLPUBFUN int XMLCALL xmlListPushBack (xmlListPtr l, void *data); /* Advanced Operators */ XMLPUBFUN void XMLCALL xmlListReverse (xmlListPtr l); XMLPUBFUN void XMLCALL xmlListSort (xmlListPtr l); XMLPUBFUN void XMLCALL xmlListWalk (xmlListPtr l, xmlListWalker walker, const void *user); XMLPUBFUN void XMLCALL xmlListReverseWalk (xmlListPtr l, xmlListWalker walker, const void *user); XMLPUBFUN void XMLCALL xmlListMerge (xmlListPtr l1, xmlListPtr l2); XMLPUBFUN xmlListPtr XMLCALL xmlListDup (const xmlListPtr old); XMLPUBFUN int XMLCALL xmlListCopy (xmlListPtr cur, const xmlListPtr old); /* Link operators */ XMLPUBFUN void * XMLCALL xmlLinkGetData (xmlLinkPtr lk); /* xmlListUnique() */ /* xmlListSwap */ #ifdef __cplusplus } #endif #endif /* __XML_LINK_INCLUDE__ */ libxml2-2.9.1+dfsg1/include/libxml/hash.h0000644000175000017500000001453412113312342016561 0ustar aronaron/* * Summary: Chained hash tables * Description: This module implements the hash table support used in * various places in the library. * * Copy: See Copyright for the status of this software. * * Author: Bjorn Reese */ #ifndef __XML_HASH_H__ #define __XML_HASH_H__ #ifdef __cplusplus extern "C" { #endif /* * The hash table. */ typedef struct _xmlHashTable xmlHashTable; typedef xmlHashTable *xmlHashTablePtr; #ifdef __cplusplus } #endif #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Recent version of gcc produce a warning when a function pointer is assigned * to an object pointer, or vice versa. The following macro is a dirty hack * to allow suppression of the warning. If your architecture has function * pointers which are a different size than a void pointer, there may be some * serious trouble within the library. */ /** * XML_CAST_FPTR: * @fptr: pointer to a function * * Macro to do a casting from an object pointer to a * function pointer without encountering a warning from * gcc * * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) * This macro violated ISO C aliasing rules (gcc4 on s390 broke) * so it is disabled now */ #define XML_CAST_FPTR(fptr) fptr /* * function types: */ /** * xmlHashDeallocator: * @payload: the data in the hash * @name: the name associated * * Callback to free data from a hash. */ typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name); /** * xmlHashCopier: * @payload: the data in the hash * @name: the name associated * * Callback to copy data from a hash. * * Returns a copy of the data or NULL in case of error. */ typedef void *(*xmlHashCopier)(void *payload, xmlChar *name); /** * xmlHashScanner: * @payload: the data in the hash * @data: extra scannner data * @name: the name associated * * Callback when scanning data in a hash with the simple scanner. */ typedef void (*xmlHashScanner)(void *payload, void *data, xmlChar *name); /** * xmlHashScannerFull: * @payload: the data in the hash * @data: extra scannner data * @name: the name associated * @name2: the second name associated * @name3: the third name associated * * Callback when scanning data in a hash with the full scanner. */ typedef void (*xmlHashScannerFull)(void *payload, void *data, const xmlChar *name, const xmlChar *name2, const xmlChar *name3); /* * Constructor and destructor. */ XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCreate (int size); XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCreateDict(int size, xmlDictPtr dict); XMLPUBFUN void XMLCALL xmlHashFree (xmlHashTablePtr table, xmlHashDeallocator f); /* * Add a new entry to the hash table. */ XMLPUBFUN int XMLCALL xmlHashAddEntry (xmlHashTablePtr table, const xmlChar *name, void *userdata); XMLPUBFUN int XMLCALL xmlHashUpdateEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata, xmlHashDeallocator f); XMLPUBFUN int XMLCALL xmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, void *userdata); XMLPUBFUN int XMLCALL xmlHashUpdateEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, void *userdata, xmlHashDeallocator f); XMLPUBFUN int XMLCALL xmlHashAddEntry3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, void *userdata); XMLPUBFUN int XMLCALL xmlHashUpdateEntry3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, void *userdata, xmlHashDeallocator f); /* * Remove an entry from the hash table. */ XMLPUBFUN int XMLCALL xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, xmlHashDeallocator f); XMLPUBFUN int XMLCALL xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, xmlHashDeallocator f); XMLPUBFUN int XMLCALL xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, xmlHashDeallocator f); /* * Retrieve the userdata. */ XMLPUBFUN void * XMLCALL xmlHashLookup (xmlHashTablePtr table, const xmlChar *name); XMLPUBFUN void * XMLCALL xmlHashLookup2 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2); XMLPUBFUN void * XMLCALL xmlHashLookup3 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3); XMLPUBFUN void * XMLCALL xmlHashQLookup (xmlHashTablePtr table, const xmlChar *name, const xmlChar *prefix); XMLPUBFUN void * XMLCALL xmlHashQLookup2 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *prefix, const xmlChar *name2, const xmlChar *prefix2); XMLPUBFUN void * XMLCALL xmlHashQLookup3 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *prefix, const xmlChar *name2, const xmlChar *prefix2, const xmlChar *name3, const xmlChar *prefix3); /* * Helpers. */ XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCopy (xmlHashTablePtr table, xmlHashCopier f); XMLPUBFUN int XMLCALL xmlHashSize (xmlHashTablePtr table); XMLPUBFUN void XMLCALL xmlHashScan (xmlHashTablePtr table, xmlHashScanner f, void *data); XMLPUBFUN void XMLCALL xmlHashScan3 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, xmlHashScanner f, void *data); XMLPUBFUN void XMLCALL xmlHashScanFull (xmlHashTablePtr table, xmlHashScannerFull f, void *data); XMLPUBFUN void XMLCALL xmlHashScanFull3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, xmlHashScannerFull f, void *data); #ifdef __cplusplus } #endif #endif /* ! __XML_HASH_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlschemas.h0000644000175000017500000001563512113312342020005 0ustar aronaron/* * Summary: incomplete XML Schemas structure implementation * Description: interface to the XML Schemas handling and schema validity * checking, it is incomplete right now. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_SCHEMA_H__ #define __XML_SCHEMA_H__ #include #ifdef LIBXML_SCHEMAS_ENABLED #include #ifdef __cplusplus extern "C" { #endif /** * This error codes are obsolete; not used any more. */ typedef enum { XML_SCHEMAS_ERR_OK = 0, XML_SCHEMAS_ERR_NOROOT = 1, XML_SCHEMAS_ERR_UNDECLAREDELEM, XML_SCHEMAS_ERR_NOTTOPLEVEL, XML_SCHEMAS_ERR_MISSING, XML_SCHEMAS_ERR_WRONGELEM, XML_SCHEMAS_ERR_NOTYPE, XML_SCHEMAS_ERR_NOROLLBACK, XML_SCHEMAS_ERR_ISABSTRACT, XML_SCHEMAS_ERR_NOTEMPTY, XML_SCHEMAS_ERR_ELEMCONT, XML_SCHEMAS_ERR_HAVEDEFAULT, XML_SCHEMAS_ERR_NOTNILLABLE, XML_SCHEMAS_ERR_EXTRACONTENT, XML_SCHEMAS_ERR_INVALIDATTR, XML_SCHEMAS_ERR_INVALIDELEM, XML_SCHEMAS_ERR_NOTDETERMINIST, XML_SCHEMAS_ERR_CONSTRUCT, XML_SCHEMAS_ERR_INTERNAL, XML_SCHEMAS_ERR_NOTSIMPLE, XML_SCHEMAS_ERR_ATTRUNKNOWN, XML_SCHEMAS_ERR_ATTRINVALID, XML_SCHEMAS_ERR_VALUE, XML_SCHEMAS_ERR_FACET, XML_SCHEMAS_ERR_, XML_SCHEMAS_ERR_XXX } xmlSchemaValidError; /* * ATTENTION: Change xmlSchemaSetValidOptions's check * for invalid values, if adding to the validation * options below. */ /** * xmlSchemaValidOption: * * This is the set of XML Schema validation options. */ typedef enum { XML_SCHEMA_VAL_VC_I_CREATE = 1<<0 /* Default/fixed: create an attribute node * or an element's text node on the instance. */ } xmlSchemaValidOption; /* XML_SCHEMA_VAL_XSI_ASSEMBLE = 1<<1, * assemble schemata using * xsi:schemaLocation and * xsi:noNamespaceSchemaLocation */ /** * The schemas related types are kept internal */ typedef struct _xmlSchema xmlSchema; typedef xmlSchema *xmlSchemaPtr; /** * xmlSchemaValidityErrorFunc: * @ctx: the validation context * @msg: the message * @...: extra arguments * * Signature of an error callback from an XSD validation */ typedef void (XMLCDECL *xmlSchemaValidityErrorFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * xmlSchemaValidityWarningFunc: * @ctx: the validation context * @msg: the message * @...: extra arguments * * Signature of a warning callback from an XSD validation */ typedef void (XMLCDECL *xmlSchemaValidityWarningFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * A schemas validation context */ typedef struct _xmlSchemaParserCtxt xmlSchemaParserCtxt; typedef xmlSchemaParserCtxt *xmlSchemaParserCtxtPtr; typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt; typedef xmlSchemaValidCtxt *xmlSchemaValidCtxtPtr; /** * xmlSchemaValidityLocatorFunc: * @ctx: user provided context * @file: returned file information * @line: returned line information * * A schemas validation locator, a callback called by the validator. * This is used when file or node informations are not available * to find out what file and line number are affected * * Returns: 0 in case of success and -1 in case of error */ typedef int (XMLCDECL *xmlSchemaValidityLocatorFunc) (void *ctx, const char **file, unsigned long *line); /* * Interfaces for parsing. */ XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL xmlSchemaNewParserCtxt (const char *URL); XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL xmlSchemaNewMemParserCtxt (const char *buffer, int size); XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL xmlSchemaNewDocParserCtxt (xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlSchemaFreeParserCtxt (xmlSchemaParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlSchemaSetParserErrors (xmlSchemaParserCtxtPtr ctxt, xmlSchemaValidityErrorFunc err, xmlSchemaValidityWarningFunc warn, void *ctx); XMLPUBFUN void XMLCALL xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx); XMLPUBFUN int XMLCALL xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt, xmlSchemaValidityErrorFunc * err, xmlSchemaValidityWarningFunc * warn, void **ctx); XMLPUBFUN int XMLCALL xmlSchemaIsValid (xmlSchemaValidCtxtPtr ctxt); XMLPUBFUN xmlSchemaPtr XMLCALL xmlSchemaParse (xmlSchemaParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlSchemaFree (xmlSchemaPtr schema); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlSchemaDump (FILE *output, xmlSchemaPtr schema); #endif /* LIBXML_OUTPUT_ENABLED */ /* * Interfaces for validating */ XMLPUBFUN void XMLCALL xmlSchemaSetValidErrors (xmlSchemaValidCtxtPtr ctxt, xmlSchemaValidityErrorFunc err, xmlSchemaValidityWarningFunc warn, void *ctx); XMLPUBFUN void XMLCALL xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx); XMLPUBFUN int XMLCALL xmlSchemaGetValidErrors (xmlSchemaValidCtxtPtr ctxt, xmlSchemaValidityErrorFunc *err, xmlSchemaValidityWarningFunc *warn, void **ctx); XMLPUBFUN int XMLCALL xmlSchemaSetValidOptions (xmlSchemaValidCtxtPtr ctxt, int options); XMLPUBFUN void XMLCALL xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt, const char *filename); XMLPUBFUN int XMLCALL xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt); XMLPUBFUN xmlSchemaValidCtxtPtr XMLCALL xmlSchemaNewValidCtxt (xmlSchemaPtr schema); XMLPUBFUN void XMLCALL xmlSchemaFreeValidCtxt (xmlSchemaValidCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlSchemaValidateDoc (xmlSchemaValidCtxtPtr ctxt, xmlDocPtr instance); XMLPUBFUN int XMLCALL xmlSchemaValidateOneElement (xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem); XMLPUBFUN int XMLCALL xmlSchemaValidateStream (xmlSchemaValidCtxtPtr ctxt, xmlParserInputBufferPtr input, xmlCharEncoding enc, xmlSAXHandlerPtr sax, void *user_data); XMLPUBFUN int XMLCALL xmlSchemaValidateFile (xmlSchemaValidCtxtPtr ctxt, const char * filename, int options); XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt); /* * Interface to insert Schemas SAX validation in a SAX stream */ typedef struct _xmlSchemaSAXPlug xmlSchemaSAXPlugStruct; typedef xmlSchemaSAXPlugStruct *xmlSchemaSAXPlugPtr; XMLPUBFUN xmlSchemaSAXPlugPtr XMLCALL xmlSchemaSAXPlug (xmlSchemaValidCtxtPtr ctxt, xmlSAXHandlerPtr *sax, void **user_data); XMLPUBFUN int XMLCALL xmlSchemaSAXUnplug (xmlSchemaSAXPlugPtr plug); XMLPUBFUN void XMLCALL xmlSchemaValidateSetLocator (xmlSchemaValidCtxtPtr vctxt, xmlSchemaValidityLocatorFunc f, void *ctxt); #ifdef __cplusplus } #endif #endif /* LIBXML_SCHEMAS_ENABLED */ #endif /* __XML_SCHEMA_H__ */ libxml2-2.9.1+dfsg1/include/libxml/catalog.h0000644000175000017500000001145112113312342017243 0ustar aronaron/** * Summary: interfaces to the Catalog handling system * Description: the catalog module implements the support for * XML Catalogs and SGML catalogs * * SGML Open Technical Resolution TR9401:1997. * http://www.jclark.com/sp/catalog.htm * * XML Catalogs Working Draft 06 August 2001 * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_CATALOG_H__ #define __XML_CATALOG_H__ #include #include #include #include #ifdef LIBXML_CATALOG_ENABLED #ifdef __cplusplus extern "C" { #endif /** * XML_CATALOGS_NAMESPACE: * * The namespace for the XML Catalogs elements. */ #define XML_CATALOGS_NAMESPACE \ (const xmlChar *) "urn:oasis:names:tc:entity:xmlns:xml:catalog" /** * XML_CATALOG_PI: * * The specific XML Catalog Processing Instuction name. */ #define XML_CATALOG_PI \ (const xmlChar *) "oasis-xml-catalog" /* * The API is voluntarily limited to general cataloging. */ typedef enum { XML_CATA_PREFER_NONE = 0, XML_CATA_PREFER_PUBLIC = 1, XML_CATA_PREFER_SYSTEM } xmlCatalogPrefer; typedef enum { XML_CATA_ALLOW_NONE = 0, XML_CATA_ALLOW_GLOBAL = 1, XML_CATA_ALLOW_DOCUMENT = 2, XML_CATA_ALLOW_ALL = 3 } xmlCatalogAllow; typedef struct _xmlCatalog xmlCatalog; typedef xmlCatalog *xmlCatalogPtr; /* * Operations on a given catalog. */ XMLPUBFUN xmlCatalogPtr XMLCALL xmlNewCatalog (int sgml); XMLPUBFUN xmlCatalogPtr XMLCALL xmlLoadACatalog (const char *filename); XMLPUBFUN xmlCatalogPtr XMLCALL xmlLoadSGMLSuperCatalog (const char *filename); XMLPUBFUN int XMLCALL xmlConvertSGMLCatalog (xmlCatalogPtr catal); XMLPUBFUN int XMLCALL xmlACatalogAdd (xmlCatalogPtr catal, const xmlChar *type, const xmlChar *orig, const xmlChar *replace); XMLPUBFUN int XMLCALL xmlACatalogRemove (xmlCatalogPtr catal, const xmlChar *value); XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolve (xmlCatalogPtr catal, const xmlChar *pubID, const xmlChar *sysID); XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID); XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID); XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolveURI (xmlCatalogPtr catal, const xmlChar *URI); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlACatalogDump (xmlCatalogPtr catal, FILE *out); #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN void XMLCALL xmlFreeCatalog (xmlCatalogPtr catal); XMLPUBFUN int XMLCALL xmlCatalogIsEmpty (xmlCatalogPtr catal); /* * Global operations. */ XMLPUBFUN void XMLCALL xmlInitializeCatalog (void); XMLPUBFUN int XMLCALL xmlLoadCatalog (const char *filename); XMLPUBFUN void XMLCALL xmlLoadCatalogs (const char *paths); XMLPUBFUN void XMLCALL xmlCatalogCleanup (void); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlCatalogDump (FILE *out); #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolve (const xmlChar *pubID, const xmlChar *sysID); XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolveSystem (const xmlChar *sysID); XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolvePublic (const xmlChar *pubID); XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolveURI (const xmlChar *URI); XMLPUBFUN int XMLCALL xmlCatalogAdd (const xmlChar *type, const xmlChar *orig, const xmlChar *replace); XMLPUBFUN int XMLCALL xmlCatalogRemove (const xmlChar *value); XMLPUBFUN xmlDocPtr XMLCALL xmlParseCatalogFile (const char *filename); XMLPUBFUN int XMLCALL xmlCatalogConvert (void); /* * Strictly minimal interfaces for per-document catalogs used * by the parser. */ XMLPUBFUN void XMLCALL xmlCatalogFreeLocal (void *catalogs); XMLPUBFUN void * XMLCALL xmlCatalogAddLocal (void *catalogs, const xmlChar *URL); XMLPUBFUN xmlChar * XMLCALL xmlCatalogLocalResolve (void *catalogs, const xmlChar *pubID, const xmlChar *sysID); XMLPUBFUN xmlChar * XMLCALL xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI); /* * Preference settings. */ XMLPUBFUN int XMLCALL xmlCatalogSetDebug (int level); XMLPUBFUN xmlCatalogPrefer XMLCALL xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer); XMLPUBFUN void XMLCALL xmlCatalogSetDefaults (xmlCatalogAllow allow); XMLPUBFUN xmlCatalogAllow XMLCALL xmlCatalogGetDefaults (void); /* DEPRECATED interfaces */ XMLPUBFUN const xmlChar * XMLCALL xmlCatalogGetSystem (const xmlChar *sysID); XMLPUBFUN const xmlChar * XMLCALL xmlCatalogGetPublic (const xmlChar *pubID); #ifdef __cplusplus } #endif #endif /* LIBXML_CATALOG_ENABLED */ #endif /* __XML_CATALOG_H__ */ libxml2-2.9.1+dfsg1/include/libxml/parserInternals.h0000644000175000017500000004176212113312342021015 0ustar aronaron/* * Summary: internals routines and limits exported by the parser. * Description: this module exports a number of internal parsing routines * they are not really all intended for applications but * can prove useful doing low level processing. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_PARSER_INTERNALS_H__ #define __XML_PARSER_INTERNALS_H__ #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * xmlParserMaxDepth: * * arbitrary depth limit for the XML documents that we allow to * process. This is not a limitation of the parser but a safety * boundary feature, use XML_PARSE_HUGE option to override it. */ XMLPUBVAR unsigned int xmlParserMaxDepth; /** * XML_MAX_TEXT_LENGTH: * * Maximum size allowed for a single text node when building a tree. * This is not a limitation of the parser but a safety boundary feature, * use XML_PARSE_HUGE option to override it. * Introduced in 2.9.0 */ #define XML_MAX_TEXT_LENGTH 10000000 /** * XML_MAX_NAME_LENGTH: * * Maximum size allowed for a markup identitier * This is not a limitation of the parser but a safety boundary feature, * use XML_PARSE_HUGE option to override it. * Note that with the use of parsing dictionaries overriding the limit * may result in more runtime memory usage in face of "unfriendly' content * Introduced in 2.9.0 */ #define XML_MAX_NAME_LENGTH 50000 /** * XML_MAX_DICTIONARY_LIMIT: * * Maximum size allowed by the parser for a dictionary by default * This is not a limitation of the parser but a safety boundary feature, * use XML_PARSE_HUGE option to override it. * Introduced in 2.9.0 */ #define XML_MAX_DICTIONARY_LIMIT 10000000 /** * XML_MAX_LOOKUP_LIMIT: * * Maximum size allowed by the parser for ahead lookup * This is an upper boundary enforced by the parser to avoid bad * behaviour on "unfriendly' content * Introduced in 2.9.0 */ #define XML_MAX_LOOKUP_LIMIT 10000000 /** * XML_MAX_NAMELEN: * * Identifiers can be longer, but this will be more costly * at runtime. */ #define XML_MAX_NAMELEN 100 /** * INPUT_CHUNK: * * The parser tries to always have that amount of input ready. * One of the point is providing context when reporting errors. */ #define INPUT_CHUNK 250 /************************************************************************ * * * UNICODE version of the macros. * * * ************************************************************************/ /** * IS_BYTE_CHAR: * @c: an byte value (int) * * Macro to check the following production in the XML spec: * * [2] Char ::= #x9 | #xA | #xD | [#x20...] * any byte character in the accepted range */ #define IS_BYTE_CHAR(c) xmlIsChar_ch(c) /** * IS_CHAR: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] * | [#x10000-#x10FFFF] * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ #define IS_CHAR(c) xmlIsCharQ(c) /** * IS_CHAR_CH: * @c: an xmlChar (usually an unsigned char) * * Behaves like IS_CHAR on single-byte value */ #define IS_CHAR_CH(c) xmlIsChar_ch(c) /** * IS_BLANK: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * [3] S ::= (#x20 | #x9 | #xD | #xA)+ */ #define IS_BLANK(c) xmlIsBlankQ(c) /** * IS_BLANK_CH: * @c: an xmlChar value (normally unsigned char) * * Behaviour same as IS_BLANK */ #define IS_BLANK_CH(c) xmlIsBlank_ch(c) /** * IS_BASECHAR: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * [85] BaseChar ::= ... long list see REC ... */ #define IS_BASECHAR(c) xmlIsBaseCharQ(c) /** * IS_DIGIT: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * [88] Digit ::= ... long list see REC ... */ #define IS_DIGIT(c) xmlIsDigitQ(c) /** * IS_DIGIT_CH: * @c: an xmlChar value (usually an unsigned char) * * Behaves like IS_DIGIT but with a single byte argument */ #define IS_DIGIT_CH(c) xmlIsDigit_ch(c) /** * IS_COMBINING: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * [87] CombiningChar ::= ... long list see REC ... */ #define IS_COMBINING(c) xmlIsCombiningQ(c) /** * IS_COMBINING_CH: * @c: an xmlChar (usually an unsigned char) * * Always false (all combining chars > 0xff) */ #define IS_COMBINING_CH(c) 0 /** * IS_EXTENDER: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * * [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | * #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | * [#x309D-#x309E] | [#x30FC-#x30FE] */ #define IS_EXTENDER(c) xmlIsExtenderQ(c) /** * IS_EXTENDER_CH: * @c: an xmlChar value (usually an unsigned char) * * Behaves like IS_EXTENDER but with a single-byte argument */ #define IS_EXTENDER_CH(c) xmlIsExtender_ch(c) /** * IS_IDEOGRAPHIC: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * * [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029] */ #define IS_IDEOGRAPHIC(c) xmlIsIdeographicQ(c) /** * IS_LETTER: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * * [84] Letter ::= BaseChar | Ideographic */ #define IS_LETTER(c) (IS_BASECHAR(c) || IS_IDEOGRAPHIC(c)) /** * IS_LETTER_CH: * @c: an xmlChar value (normally unsigned char) * * Macro behaves like IS_LETTER, but only check base chars * */ #define IS_LETTER_CH(c) xmlIsBaseChar_ch(c) /** * IS_ASCII_LETTER: * @c: an xmlChar value * * Macro to check [a-zA-Z] * */ #define IS_ASCII_LETTER(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \ ((0x61 <= (c)) && ((c) <= 0x7a))) /** * IS_ASCII_DIGIT: * @c: an xmlChar value * * Macro to check [0-9] * */ #define IS_ASCII_DIGIT(c) ((0x30 <= (c)) && ((c) <= 0x39)) /** * IS_PUBIDCHAR: * @c: an UNICODE value (int) * * Macro to check the following production in the XML spec: * * * [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] */ #define IS_PUBIDCHAR(c) xmlIsPubidCharQ(c) /** * IS_PUBIDCHAR_CH: * @c: an xmlChar value (normally unsigned char) * * Same as IS_PUBIDCHAR but for single-byte value */ #define IS_PUBIDCHAR_CH(c) xmlIsPubidChar_ch(c) /** * SKIP_EOL: * @p: and UTF8 string pointer * * Skips the end of line chars. */ #define SKIP_EOL(p) \ if (*(p) == 0x13) { p++ ; if (*(p) == 0x10) p++; } \ if (*(p) == 0x10) { p++ ; if (*(p) == 0x13) p++; } /** * MOVETO_ENDTAG: * @p: and UTF8 string pointer * * Skips to the next '>' char. */ #define MOVETO_ENDTAG(p) \ while ((*p) && (*(p) != '>')) (p)++ /** * MOVETO_STARTTAG: * @p: and UTF8 string pointer * * Skips to the next '<' char. */ #define MOVETO_STARTTAG(p) \ while ((*p) && (*(p) != '<')) (p)++ /** * Global variables used for predefined strings. */ XMLPUBVAR const xmlChar xmlStringText[]; XMLPUBVAR const xmlChar xmlStringTextNoenc[]; XMLPUBVAR const xmlChar xmlStringComment[]; /* * Function to finish the work of the macros where needed. */ XMLPUBFUN int XMLCALL xmlIsLetter (int c); /** * Parser context. */ XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateFileParserCtxt (const char *filename); XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateURLParserCtxt (const char *filename, int options); XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateMemoryParserCtxt(const char *buffer, int size); XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateEntityParserCtxt(const xmlChar *URL, const xmlChar *ID, const xmlChar *base); XMLPUBFUN int XMLCALL xmlSwitchEncoding (xmlParserCtxtPtr ctxt, xmlCharEncoding enc); XMLPUBFUN int XMLCALL xmlSwitchToEncoding (xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler); XMLPUBFUN int XMLCALL xmlSwitchInputEncoding (xmlParserCtxtPtr ctxt, xmlParserInputPtr input, xmlCharEncodingHandlerPtr handler); #ifdef IN_LIBXML /* internal error reporting */ XMLPUBFUN void XMLCALL __xmlErrEncoding (xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr, const char *msg, const xmlChar * str1, const xmlChar * str2); #endif /** * Input Streams. */ XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewStringInputStream (xmlParserCtxtPtr ctxt, const xmlChar *buffer); XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewEntityInputStream (xmlParserCtxtPtr ctxt, xmlEntityPtr entity); XMLPUBFUN int XMLCALL xmlPushInput (xmlParserCtxtPtr ctxt, xmlParserInputPtr input); XMLPUBFUN xmlChar XMLCALL xmlPopInput (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlFreeInputStream (xmlParserInputPtr input); XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewInputFromFile (xmlParserCtxtPtr ctxt, const char *filename); XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewInputStream (xmlParserCtxtPtr ctxt); /** * Namespaces. */ XMLPUBFUN xmlChar * XMLCALL xmlSplitQName (xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix); /** * Generic production rules. */ XMLPUBFUN const xmlChar * XMLCALL xmlParseName (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlParseNmtoken (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlParseEntityValue (xmlParserCtxtPtr ctxt, xmlChar **orig); XMLPUBFUN xmlChar * XMLCALL xmlParseAttValue (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlParseSystemLiteral (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlParsePubidLiteral (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseCharData (xmlParserCtxtPtr ctxt, int cdata); XMLPUBFUN xmlChar * XMLCALL xmlParseExternalID (xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict); XMLPUBFUN void XMLCALL xmlParseComment (xmlParserCtxtPtr ctxt); XMLPUBFUN const xmlChar * XMLCALL xmlParsePITarget (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParsePI (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseNotationDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseEntityDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlParseDefaultDecl (xmlParserCtxtPtr ctxt, xmlChar **value); XMLPUBFUN xmlEnumerationPtr XMLCALL xmlParseNotationType (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlEnumerationPtr XMLCALL xmlParseEnumerationType (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlParseEnumeratedType (xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree); XMLPUBFUN int XMLCALL xmlParseAttributeType (xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree); XMLPUBFUN void XMLCALL xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt); XMLPUBFUN xmlElementContentPtr XMLCALL xmlParseElementMixedContentDecl (xmlParserCtxtPtr ctxt, int inputchk); XMLPUBFUN xmlElementContentPtr XMLCALL xmlParseElementChildrenContentDecl (xmlParserCtxtPtr ctxt, int inputchk); XMLPUBFUN int XMLCALL xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlElementContentPtr *result); XMLPUBFUN int XMLCALL xmlParseElementDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseMarkupDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlParseCharRef (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlEntityPtr XMLCALL xmlParseEntityRef (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseReference (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParsePEReference (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseDocTypeDecl (xmlParserCtxtPtr ctxt); #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN const xmlChar * XMLCALL xmlParseAttribute (xmlParserCtxtPtr ctxt, xmlChar **value); XMLPUBFUN const xmlChar * XMLCALL xmlParseStartTag (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseEndTag (xmlParserCtxtPtr ctxt); #endif /* LIBXML_SAX1_ENABLED */ XMLPUBFUN void XMLCALL xmlParseCDSect (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseContent (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseElement (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlParseVersionNum (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlParseVersionInfo (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlParseEncName (xmlParserCtxtPtr ctxt); XMLPUBFUN const xmlChar * XMLCALL xmlParseEncodingDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlParseSDDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseXMLDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseTextDecl (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseMisc (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseExternalSubset (xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, const xmlChar *SystemID); /** * XML_SUBSTITUTE_NONE: * * If no entities need to be substituted. */ #define XML_SUBSTITUTE_NONE 0 /** * XML_SUBSTITUTE_REF: * * Whether general entities need to be substituted. */ #define XML_SUBSTITUTE_REF 1 /** * XML_SUBSTITUTE_PEREF: * * Whether parameter entities need to be substituted. */ #define XML_SUBSTITUTE_PEREF 2 /** * XML_SUBSTITUTE_BOTH: * * Both general and parameter entities need to be substituted. */ #define XML_SUBSTITUTE_BOTH 3 XMLPUBFUN xmlChar * XMLCALL xmlStringDecodeEntities (xmlParserCtxtPtr ctxt, const xmlChar *str, int what, xmlChar end, xmlChar end2, xmlChar end3); XMLPUBFUN xmlChar * XMLCALL xmlStringLenDecodeEntities (xmlParserCtxtPtr ctxt, const xmlChar *str, int len, int what, xmlChar end, xmlChar end2, xmlChar end3); /* * Generated by MACROS on top of parser.c c.f. PUSH_AND_POP. */ XMLPUBFUN int XMLCALL nodePush (xmlParserCtxtPtr ctxt, xmlNodePtr value); XMLPUBFUN xmlNodePtr XMLCALL nodePop (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL inputPush (xmlParserCtxtPtr ctxt, xmlParserInputPtr value); XMLPUBFUN xmlParserInputPtr XMLCALL inputPop (xmlParserCtxtPtr ctxt); XMLPUBFUN const xmlChar * XMLCALL namePop (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL namePush (xmlParserCtxtPtr ctxt, const xmlChar *value); /* * other commodities shared between parser.c and parserInternals. */ XMLPUBFUN int XMLCALL xmlSkipBlankChars (xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlStringCurrentChar (xmlParserCtxtPtr ctxt, const xmlChar *cur, int *len); XMLPUBFUN void XMLCALL xmlParserHandlePEReference(xmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlCheckLanguageID (const xmlChar *lang); /* * Really core function shared with HTML parser. */ XMLPUBFUN int XMLCALL xmlCurrentChar (xmlParserCtxtPtr ctxt, int *len); XMLPUBFUN int XMLCALL xmlCopyCharMultiByte (xmlChar *out, int val); XMLPUBFUN int XMLCALL xmlCopyChar (int len, xmlChar *out, int val); XMLPUBFUN void XMLCALL xmlNextChar (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParserInputShrink (xmlParserInputPtr in); #ifdef LIBXML_HTML_ENABLED /* * Actually comes from the HTML parser but launched from the init stuff. */ XMLPUBFUN void XMLCALL htmlInitAutoClose (void); XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreateFileParserCtxt(const char *filename, const char *encoding); #endif /* * Specific function to keep track of entities references * and used by the XSLT debugger. */ #ifdef LIBXML_LEGACY_ENABLED /** * xmlEntityReferenceFunc: * @ent: the entity * @firstNode: the fist node in the chunk * @lastNode: the last nod in the chunk * * Callback function used when one needs to be able to track back the * provenance of a chunk of nodes inherited from an entity replacement. */ typedef void (*xmlEntityReferenceFunc) (xmlEntityPtr ent, xmlNodePtr firstNode, xmlNodePtr lastNode); XMLPUBFUN void XMLCALL xmlSetEntityReferenceFunc (xmlEntityReferenceFunc func); XMLPUBFUN xmlChar * XMLCALL xmlParseQuotedString (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseNamespace (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlNamespaceParseNSDef (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlScanName (xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlNamespaceParseNCName (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParserHandleReference(xmlParserCtxtPtr ctxt); XMLPUBFUN xmlChar * XMLCALL xmlNamespaceParseQName (xmlParserCtxtPtr ctxt, xmlChar **prefix); /** * Entities */ XMLPUBFUN xmlChar * XMLCALL xmlDecodeEntities (xmlParserCtxtPtr ctxt, int len, int what, xmlChar end, xmlChar end2, xmlChar end3); XMLPUBFUN void XMLCALL xmlHandleEntity (xmlParserCtxtPtr ctxt, xmlEntityPtr entity); #endif /* LIBXML_LEGACY_ENABLED */ #ifdef IN_LIBXML /* * internal only */ XMLPUBFUN void XMLCALL xmlErrMemory (xmlParserCtxtPtr ctxt, const char *extra); #endif #ifdef __cplusplus } #endif #endif /* __XML_PARSER_INTERNALS_H__ */ libxml2-2.9.1+dfsg1/include/libxml/DOCBparser.h0000644000175000017500000000612512113312342017557 0ustar aronaron/* * Summary: old DocBook SGML parser * Description: interface for a DocBook SGML non-verifying parser * This code is DEPRECATED, and should not be used anymore. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __DOCB_PARSER_H__ #define __DOCB_PARSER_H__ #include #ifdef LIBXML_DOCB_ENABLED #include #include #ifndef IN_LIBXML #ifdef __GNUC__ #warning "The DOCBparser module has been deprecated in libxml2-2.6.0" #endif #endif #ifdef __cplusplus extern "C" { #endif /* * Most of the back-end structures from XML and SGML are shared. */ typedef xmlParserCtxt docbParserCtxt; typedef xmlParserCtxtPtr docbParserCtxtPtr; typedef xmlSAXHandler docbSAXHandler; typedef xmlSAXHandlerPtr docbSAXHandlerPtr; typedef xmlParserInput docbParserInput; typedef xmlParserInputPtr docbParserInputPtr; typedef xmlDocPtr docbDocPtr; /* * There is only few public functions. */ XMLPUBFUN int XMLCALL docbEncodeEntities(unsigned char *out, int *outlen, const unsigned char *in, int *inlen, int quoteChar); XMLPUBFUN docbDocPtr XMLCALL docbSAXParseDoc (xmlChar *cur, const char *encoding, docbSAXHandlerPtr sax, void *userData); XMLPUBFUN docbDocPtr XMLCALL docbParseDoc (xmlChar *cur, const char *encoding); XMLPUBFUN docbDocPtr XMLCALL docbSAXParseFile (const char *filename, const char *encoding, docbSAXHandlerPtr sax, void *userData); XMLPUBFUN docbDocPtr XMLCALL docbParseFile (const char *filename, const char *encoding); /** * Interfaces for the Push mode. */ XMLPUBFUN void XMLCALL docbFreeParserCtxt (docbParserCtxtPtr ctxt); XMLPUBFUN docbParserCtxtPtr XMLCALL docbCreatePushParserCtxt(docbSAXHandlerPtr sax, void *user_data, const char *chunk, int size, const char *filename, xmlCharEncoding enc); XMLPUBFUN int XMLCALL docbParseChunk (docbParserCtxtPtr ctxt, const char *chunk, int size, int terminate); XMLPUBFUN docbParserCtxtPtr XMLCALL docbCreateFileParserCtxt(const char *filename, const char *encoding); XMLPUBFUN int XMLCALL docbParseDocument (docbParserCtxtPtr ctxt); #ifdef __cplusplus } #endif #endif /* LIBXML_DOCB_ENABLED */ #endif /* __DOCB_PARSER_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlreader.h0000644000175000017500000003047612113312342017624 0ustar aronaron/* * Summary: the XMLReader implementation * Description: API of the XML streaming API based on C# interfaces. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_XMLREADER_H__ #define __XML_XMLREADER_H__ #include #include #include #ifdef LIBXML_SCHEMAS_ENABLED #include #include #endif #ifdef __cplusplus extern "C" { #endif /** * xmlParserSeverities: * * How severe an error callback is when the per-reader error callback API * is used. */ typedef enum { XML_PARSER_SEVERITY_VALIDITY_WARNING = 1, XML_PARSER_SEVERITY_VALIDITY_ERROR = 2, XML_PARSER_SEVERITY_WARNING = 3, XML_PARSER_SEVERITY_ERROR = 4 } xmlParserSeverities; #ifdef LIBXML_READER_ENABLED /** * xmlTextReaderMode: * * Internal state values for the reader. */ typedef enum { XML_TEXTREADER_MODE_INITIAL = 0, XML_TEXTREADER_MODE_INTERACTIVE = 1, XML_TEXTREADER_MODE_ERROR = 2, XML_TEXTREADER_MODE_EOF =3, XML_TEXTREADER_MODE_CLOSED = 4, XML_TEXTREADER_MODE_READING = 5 } xmlTextReaderMode; /** * xmlParserProperties: * * Some common options to use with xmlTextReaderSetParserProp, but it * is better to use xmlParserOption and the xmlReaderNewxxx and * xmlReaderForxxx APIs now. */ typedef enum { XML_PARSER_LOADDTD = 1, XML_PARSER_DEFAULTATTRS = 2, XML_PARSER_VALIDATE = 3, XML_PARSER_SUBST_ENTITIES = 4 } xmlParserProperties; /** * xmlReaderTypes: * * Predefined constants for the different types of nodes. */ typedef enum { XML_READER_TYPE_NONE = 0, XML_READER_TYPE_ELEMENT = 1, XML_READER_TYPE_ATTRIBUTE = 2, XML_READER_TYPE_TEXT = 3, XML_READER_TYPE_CDATA = 4, XML_READER_TYPE_ENTITY_REFERENCE = 5, XML_READER_TYPE_ENTITY = 6, XML_READER_TYPE_PROCESSING_INSTRUCTION = 7, XML_READER_TYPE_COMMENT = 8, XML_READER_TYPE_DOCUMENT = 9, XML_READER_TYPE_DOCUMENT_TYPE = 10, XML_READER_TYPE_DOCUMENT_FRAGMENT = 11, XML_READER_TYPE_NOTATION = 12, XML_READER_TYPE_WHITESPACE = 13, XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14, XML_READER_TYPE_END_ELEMENT = 15, XML_READER_TYPE_END_ENTITY = 16, XML_READER_TYPE_XML_DECLARATION = 17 } xmlReaderTypes; /** * xmlTextReader: * * Structure for an xmlReader context. */ typedef struct _xmlTextReader xmlTextReader; /** * xmlTextReaderPtr: * * Pointer to an xmlReader context. */ typedef xmlTextReader *xmlTextReaderPtr; /* * Constructors & Destructor */ XMLPUBFUN xmlTextReaderPtr XMLCALL xmlNewTextReader (xmlParserInputBufferPtr input, const char *URI); XMLPUBFUN xmlTextReaderPtr XMLCALL xmlNewTextReaderFilename(const char *URI); XMLPUBFUN void XMLCALL xmlFreeTextReader (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderSetup(xmlTextReaderPtr reader, xmlParserInputBufferPtr input, const char *URL, const char *encoding, int options); /* * Iterators */ XMLPUBFUN int XMLCALL xmlTextReaderRead (xmlTextReaderPtr reader); #ifdef LIBXML_WRITER_ENABLED XMLPUBFUN xmlChar * XMLCALL xmlTextReaderReadInnerXml(xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderReadOuterXml(xmlTextReaderPtr reader); #endif XMLPUBFUN xmlChar * XMLCALL xmlTextReaderReadString (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader); /* * Attributes of the node */ XMLPUBFUN int XMLCALL xmlTextReaderAttributeCount(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderDepth (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderHasAttributes(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderHasValue(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderIsDefault (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderNodeType (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderQuoteChar (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderReadState (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstBaseUri (xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstLocalName (xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstName (xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstPrefix (xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstXmlLang (xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstString (xmlTextReaderPtr reader, const xmlChar *str); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstValue (xmlTextReaderPtr reader); /* * use the Const version of the routine for * better performance and simpler code */ XMLPUBFUN xmlChar * XMLCALL xmlTextReaderBaseUri (xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderLocalName (xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderName (xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderNamespaceUri(xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderPrefix (xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderXmlLang (xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderValue (xmlTextReaderPtr reader); /* * Methods of the XmlTextReader */ XMLPUBFUN int XMLCALL xmlTextReaderClose (xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderGetAttributeNo (xmlTextReaderPtr reader, int no); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderGetAttribute (xmlTextReaderPtr reader, const xmlChar *name); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderGetAttributeNs (xmlTextReaderPtr reader, const xmlChar *localName, const xmlChar *namespaceURI); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlTextReaderGetRemainder (xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderLookupNamespace(xmlTextReaderPtr reader, const xmlChar *prefix); XMLPUBFUN int XMLCALL xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, int no); XMLPUBFUN int XMLCALL xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader, const xmlChar *name); XMLPUBFUN int XMLCALL xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName, const xmlChar *namespaceURI); XMLPUBFUN int XMLCALL xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderMoveToElement (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderNormalization (xmlTextReaderPtr reader); XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstEncoding (xmlTextReaderPtr reader); /* * Extensions */ XMLPUBFUN int XMLCALL xmlTextReaderSetParserProp (xmlTextReaderPtr reader, int prop, int value); XMLPUBFUN int XMLCALL xmlTextReaderGetParserProp (xmlTextReaderPtr reader, int prop); XMLPUBFUN xmlNodePtr XMLCALL xmlTextReaderCurrentNode (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader); XMLPUBFUN xmlNodePtr XMLCALL xmlTextReaderPreserve (xmlTextReaderPtr reader); #ifdef LIBXML_PATTERN_ENABLED XMLPUBFUN int XMLCALL xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern, const xmlChar **namespaces); #endif /* LIBXML_PATTERN_ENABLED */ XMLPUBFUN xmlDocPtr XMLCALL xmlTextReaderCurrentDoc (xmlTextReaderPtr reader); XMLPUBFUN xmlNodePtr XMLCALL xmlTextReaderExpand (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderNext (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderNextSibling (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderIsValid (xmlTextReaderPtr reader); #ifdef LIBXML_SCHEMAS_ENABLED XMLPUBFUN int XMLCALL xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng); XMLPUBFUN int XMLCALL xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader, xmlRelaxNGValidCtxtPtr ctxt, int options); XMLPUBFUN int XMLCALL xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema); XMLPUBFUN int XMLCALL xmlTextReaderSchemaValidate (xmlTextReaderPtr reader, const char *xsd); XMLPUBFUN int XMLCALL xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader, xmlSchemaValidCtxtPtr ctxt, int options); XMLPUBFUN int XMLCALL xmlTextReaderSetSchema (xmlTextReaderPtr reader, xmlSchemaPtr schema); #endif XMLPUBFUN const xmlChar * XMLCALL xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL xmlTextReaderStandalone (xmlTextReaderPtr reader); /* * Index lookup */ XMLPUBFUN long XMLCALL xmlTextReaderByteConsumed (xmlTextReaderPtr reader); /* * New more complete APIs for simpler creation and reuse of readers */ XMLPUBFUN xmlTextReaderPtr XMLCALL xmlReaderWalker (xmlDocPtr doc); XMLPUBFUN xmlTextReaderPtr XMLCALL xmlReaderForDoc (const xmlChar * cur, const char *URL, const char *encoding, int options); XMLPUBFUN xmlTextReaderPtr XMLCALL xmlReaderForFile (const char *filename, const char *encoding, int options); XMLPUBFUN xmlTextReaderPtr XMLCALL xmlReaderForMemory (const char *buffer, int size, const char *URL, const char *encoding, int options); XMLPUBFUN xmlTextReaderPtr XMLCALL xmlReaderForFd (int fd, const char *URL, const char *encoding, int options); XMLPUBFUN xmlTextReaderPtr XMLCALL xmlReaderForIO (xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options); XMLPUBFUN int XMLCALL xmlReaderNewWalker (xmlTextReaderPtr reader, xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlReaderNewDoc (xmlTextReaderPtr reader, const xmlChar * cur, const char *URL, const char *encoding, int options); XMLPUBFUN int XMLCALL xmlReaderNewFile (xmlTextReaderPtr reader, const char *filename, const char *encoding, int options); XMLPUBFUN int XMLCALL xmlReaderNewMemory (xmlTextReaderPtr reader, const char *buffer, int size, const char *URL, const char *encoding, int options); XMLPUBFUN int XMLCALL xmlReaderNewFd (xmlTextReaderPtr reader, int fd, const char *URL, const char *encoding, int options); XMLPUBFUN int XMLCALL xmlReaderNewIO (xmlTextReaderPtr reader, xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options); /* * Error handling extensions */ typedef void * xmlTextReaderLocatorPtr; /** * xmlTextReaderErrorFunc: * @arg: the user argument * @msg: the message * @severity: the severity of the error * @locator: a locator indicating where the error occured * * Signature of an error callback from a reader parser */ typedef void (XMLCALL *xmlTextReaderErrorFunc)(void *arg, const char *msg, xmlParserSeverities severity, xmlTextReaderLocatorPtr locator); XMLPUBFUN int XMLCALL xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator); XMLPUBFUN xmlChar * XMLCALL xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator); XMLPUBFUN void XMLCALL xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, xmlTextReaderErrorFunc f, void *arg); XMLPUBFUN void XMLCALL xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, xmlStructuredErrorFunc f, void *arg); XMLPUBFUN void XMLCALL xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, xmlTextReaderErrorFunc *f, void **arg); #endif /* LIBXML_READER_ENABLED */ #ifdef __cplusplus } #endif #endif /* __XML_XMLREADER_H__ */ libxml2-2.9.1+dfsg1/include/libxml/Makefile.in0000644000175000017500000004460112134171754017545 0ustar aronaron# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include/libxml DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/xmlversion.h.in $(xmlinc_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = xmlversion.h CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(xmlincdir)" HEADERS = $(xmlinc_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_THREAD_LIBS = @BASE_THREAD_LIBS@ C14N_OBJ = @C14N_OBJ@ CATALOG_OBJ = @CATALOG_OBJ@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@ CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@ DEBUG_OBJ = @DEBUG_OBJ@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCB_OBJ = @DOCB_OBJ@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTP_OBJ = @FTP_OBJ@ GREP = @GREP@ HAVE_ISINF = @HAVE_ISINF@ HAVE_ISNAN = @HAVE_ISNAN@ HTML_DIR = @HTML_DIR@ HTML_OBJ = @HTML_OBJ@ HTTP_OBJ = @HTTP_OBJ@ ICONV_LIBS = @ICONV_LIBS@ ICU_LIBS = @ICU_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_MAJOR_VERSION = @LIBXML_MAJOR_VERSION@ LIBXML_MICRO_VERSION = @LIBXML_MICRO_VERSION@ LIBXML_MINOR_VERSION = @LIBXML_MINOR_VERSION@ LIBXML_VERSION = @LIBXML_VERSION@ LIBXML_VERSION_EXTRA = @LIBXML_VERSION_EXTRA@ LIBXML_VERSION_INFO = @LIBXML_VERSION_INFO@ LIBXML_VERSION_NUMBER = @LIBXML_VERSION_NUMBER@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LZMA_CFLAGS = @LZMA_CFLAGS@ LZMA_LIBS = @LZMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODULE_EXTENSION = @MODULE_EXTENSION@ MODULE_PLATFORM_LIBS = @MODULE_PLATFORM_LIBS@ MV = @MV@ M_LIBS = @M_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PYTHON = @PYTHON@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_SITE_PACKAGES = @PYTHON_SITE_PACKAGES@ PYTHON_SUBDIR = @PYTHON_SUBDIR@ PYTHON_TESTS = @PYTHON_TESTS@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RDL_LIBS = @RDL_LIBS@ READER_TEST = @READER_TEST@ RELDATE = @RELDATE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STATIC_BINARIES = @STATIC_BINARIES@ STRIP = @STRIP@ TAR = @TAR@ TEST_C14N = @TEST_C14N@ TEST_CATALOG = @TEST_CATALOG@ TEST_DEBUG = @TEST_DEBUG@ TEST_HTML = @TEST_HTML@ TEST_MODULES = @TEST_MODULES@ TEST_PATTERN = @TEST_PATTERN@ TEST_PHTML = @TEST_PHTML@ TEST_PUSH = @TEST_PUSH@ TEST_REGEXPS = @TEST_REGEXPS@ TEST_SAX = @TEST_SAX@ TEST_SCHEMAS = @TEST_SCHEMAS@ TEST_SCHEMATRON = @TEST_SCHEMATRON@ TEST_THREADS = @TEST_THREADS@ TEST_VALID = @TEST_VALID@ TEST_VTIME = @TEST_VTIME@ TEST_XINCLUDE = @TEST_XINCLUDE@ TEST_XPATH = @TEST_XPATH@ TEST_XPTR = @TEST_XPTR@ THREAD_CFLAGS = @THREAD_CFLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ WITH_DOCB = @WITH_DOCB@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_LZMA = @WITH_LZMA@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ WITH_MODULES = @WITH_MODULES@ WITH_OUTPUT = @WITH_OUTPUT@ WITH_PATTERN = @WITH_PATTERN@ WITH_PUSH = @WITH_PUSH@ WITH_READER = @WITH_READER@ WITH_REGEXPS = @WITH_REGEXPS@ WITH_RUN_DEBUG = @WITH_RUN_DEBUG@ WITH_SAX1 = @WITH_SAX1@ WITH_SCHEMAS = @WITH_SCHEMAS@ WITH_SCHEMATRON = @WITH_SCHEMATRON@ WITH_THREADS = @WITH_THREADS@ WITH_THREAD_ALLOC = @WITH_THREAD_ALLOC@ WITH_TREE = @WITH_TREE@ WITH_TRIO = @WITH_TRIO@ WITH_VALID = @WITH_VALID@ WITH_WRITER = @WITH_WRITER@ WITH_XINCLUDE = @WITH_XINCLUDE@ WITH_XPATH = @WITH_XPATH@ WITH_XPTR = @WITH_XPTR@ WITH_ZLIB = @WITH_ZLIB@ XINCLUDE_OBJ = @XINCLUDE_OBJ@ XMLLINT = @XMLLINT@ XML_CFLAGS = @XML_CFLAGS@ XML_INCLUDEDIR = @XML_INCLUDEDIR@ XML_LIBDIR = @XML_LIBDIR@ XML_LIBS = @XML_LIBS@ XML_LIBTOOLLIBS = @XML_LIBTOOLLIBS@ XPATH_OBJ = @XPATH_OBJ@ XPTR_OBJ = @XPTR_OBJ@ XSLTPROC = @XSLTPROC@ Z_CFLAGS = @Z_CFLAGS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ xmlincdir = $(includedir)/libxml2/libxml xmlinc_HEADERS = \ SAX.h \ entities.h \ encoding.h \ parser.h \ parserInternals.h \ xmlerror.h \ HTMLparser.h \ HTMLtree.h \ debugXML.h \ tree.h \ list.h \ hash.h \ xpath.h \ xpathInternals.h \ xpointer.h \ xinclude.h \ xmlIO.h \ xmlmemory.h \ nanohttp.h \ nanoftp.h \ uri.h \ valid.h \ xlink.h \ xmlversion.h \ DOCBparser.h \ catalog.h \ threads.h \ globals.h \ c14n.h \ xmlautomata.h \ xmlregexp.h \ xmlmodule.h \ xmlschemas.h \ schemasInternals.h \ xmlschemastypes.h \ xmlstring.h \ xmlunicode.h \ xmlreader.h \ relaxng.h \ dict.h \ SAX2.h \ xmlexports.h \ xmlwriter.h \ chvalid.h \ pattern.h \ xmlsave.h \ schematron.h EXTRA_DIST = xmlversion.h.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/libxml/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu include/libxml/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): xmlversion.h: $(top_builddir)/config.status $(srcdir)/xmlversion.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-xmlincHEADERS: $(xmlinc_HEADERS) @$(NORMAL_INSTALL) @list='$(xmlinc_HEADERS)'; test -n "$(xmlincdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xmlincdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xmlincdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(xmlincdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(xmlincdir)" || exit $$?; \ done uninstall-xmlincHEADERS: @$(NORMAL_UNINSTALL) @list='$(xmlinc_HEADERS)'; test -n "$(xmlincdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xmlincdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(xmlincdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-xmlincHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-xmlincHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip install-xmlincHEADERS \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-xmlincHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libxml2-2.9.1+dfsg1/include/libxml/xmlversion.h.in0000644000175000017500000002070312113312342020444 0ustar aronaron/* * Summary: compile-time version informations * Description: compile-time version informations for the XML library * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_VERSION_H__ #define __XML_VERSION_H__ #include #ifdef __cplusplus extern "C" { #endif /* * use those to be sure nothing nasty will happen if * your library and includes mismatch */ #ifndef LIBXML2_COMPILING_MSCCDEF XMLPUBFUN void XMLCALL xmlCheckVersion(int version); #endif /* LIBXML2_COMPILING_MSCCDEF */ /** * LIBXML_DOTTED_VERSION: * * the version string like "1.2.3" */ #define LIBXML_DOTTED_VERSION "@VERSION@" /** * LIBXML_VERSION: * * the version number: 1.2.3 value is 10203 */ #define LIBXML_VERSION @LIBXML_VERSION_NUMBER@ /** * LIBXML_VERSION_STRING: * * the version number string, 1.2.3 value is "10203" */ #define LIBXML_VERSION_STRING "@LIBXML_VERSION_NUMBER@" /** * LIBXML_VERSION_EXTRA: * * extra version information, used to show a CVS compilation */ #define LIBXML_VERSION_EXTRA "@LIBXML_VERSION_EXTRA@" /** * LIBXML_TEST_VERSION: * * Macro to check that the libxml version in use is compatible with * the version the software has been compiled against */ #define LIBXML_TEST_VERSION xmlCheckVersion(@LIBXML_VERSION_NUMBER@); #ifndef VMS #if @WITH_TRIO@ /** * WITH_TRIO: * * defined if the trio support need to be configured in */ #define WITH_TRIO #else /** * WITHOUT_TRIO: * * defined if the trio support should not be configured in */ #define WITHOUT_TRIO #endif #else /* VMS */ /** * WITH_TRIO: * * defined if the trio support need to be configured in */ #define WITH_TRIO 1 #endif /* VMS */ /** * LIBXML_THREAD_ENABLED: * * Whether the thread support is configured in */ #if @WITH_THREADS@ #if defined(_REENTRANT) || defined(__MT__) || \ (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L)) #define LIBXML_THREAD_ENABLED #endif #endif /** * LIBXML_THREAD_ALLOC_ENABLED: * * Whether the allocation hooks are per-thread */ #if @WITH_THREAD_ALLOC@ #define LIBXML_THREAD_ALLOC_ENABLED #endif /** * LIBXML_TREE_ENABLED: * * Whether the DOM like tree manipulation API support is configured in */ #if @WITH_TREE@ #define LIBXML_TREE_ENABLED #endif /** * LIBXML_OUTPUT_ENABLED: * * Whether the serialization/saving support is configured in */ #if @WITH_OUTPUT@ #define LIBXML_OUTPUT_ENABLED #endif /** * LIBXML_PUSH_ENABLED: * * Whether the push parsing interfaces are configured in */ #if @WITH_PUSH@ #define LIBXML_PUSH_ENABLED #endif /** * LIBXML_READER_ENABLED: * * Whether the xmlReader parsing interface is configured in */ #if @WITH_READER@ #define LIBXML_READER_ENABLED #endif /** * LIBXML_PATTERN_ENABLED: * * Whether the xmlPattern node selection interface is configured in */ #if @WITH_PATTERN@ #define LIBXML_PATTERN_ENABLED #endif /** * LIBXML_WRITER_ENABLED: * * Whether the xmlWriter saving interface is configured in */ #if @WITH_WRITER@ #define LIBXML_WRITER_ENABLED #endif /** * LIBXML_SAX1_ENABLED: * * Whether the older SAX1 interface is configured in */ #if @WITH_SAX1@ #define LIBXML_SAX1_ENABLED #endif /** * LIBXML_FTP_ENABLED: * * Whether the FTP support is configured in */ #if @WITH_FTP@ #define LIBXML_FTP_ENABLED #endif /** * LIBXML_HTTP_ENABLED: * * Whether the HTTP support is configured in */ #if @WITH_HTTP@ #define LIBXML_HTTP_ENABLED #endif /** * LIBXML_VALID_ENABLED: * * Whether the DTD validation support is configured in */ #if @WITH_VALID@ #define LIBXML_VALID_ENABLED #endif /** * LIBXML_HTML_ENABLED: * * Whether the HTML support is configured in */ #if @WITH_HTML@ #define LIBXML_HTML_ENABLED #endif /** * LIBXML_LEGACY_ENABLED: * * Whether the deprecated APIs are compiled in for compatibility */ #if @WITH_LEGACY@ #define LIBXML_LEGACY_ENABLED #endif /** * LIBXML_C14N_ENABLED: * * Whether the Canonicalization support is configured in */ #if @WITH_C14N@ #define LIBXML_C14N_ENABLED #endif /** * LIBXML_CATALOG_ENABLED: * * Whether the Catalog support is configured in */ #if @WITH_CATALOG@ #define LIBXML_CATALOG_ENABLED #endif /** * LIBXML_DOCB_ENABLED: * * Whether the SGML Docbook support is configured in */ #if @WITH_DOCB@ #define LIBXML_DOCB_ENABLED #endif /** * LIBXML_XPATH_ENABLED: * * Whether XPath is configured in */ #if @WITH_XPATH@ #define LIBXML_XPATH_ENABLED #endif /** * LIBXML_XPTR_ENABLED: * * Whether XPointer is configured in */ #if @WITH_XPTR@ #define LIBXML_XPTR_ENABLED #endif /** * LIBXML_XINCLUDE_ENABLED: * * Whether XInclude is configured in */ #if @WITH_XINCLUDE@ #define LIBXML_XINCLUDE_ENABLED #endif /** * LIBXML_ICONV_ENABLED: * * Whether iconv support is available */ #if @WITH_ICONV@ #define LIBXML_ICONV_ENABLED #endif /** * LIBXML_ICU_ENABLED: * * Whether icu support is available */ #if @WITH_ICU@ #define LIBXML_ICU_ENABLED #endif /** * LIBXML_ISO8859X_ENABLED: * * Whether ISO-8859-* support is made available in case iconv is not */ #if @WITH_ISO8859X@ #define LIBXML_ISO8859X_ENABLED #endif /** * LIBXML_DEBUG_ENABLED: * * Whether Debugging module is configured in */ #if @WITH_DEBUG@ #define LIBXML_DEBUG_ENABLED #endif /** * DEBUG_MEMORY_LOCATION: * * Whether the memory debugging is configured in */ #if @WITH_MEM_DEBUG@ #define DEBUG_MEMORY_LOCATION #endif /** * LIBXML_DEBUG_RUNTIME: * * Whether the runtime debugging is configured in */ #if @WITH_RUN_DEBUG@ #define LIBXML_DEBUG_RUNTIME #endif /** * LIBXML_UNICODE_ENABLED: * * Whether the Unicode related interfaces are compiled in */ #if @WITH_REGEXPS@ #define LIBXML_UNICODE_ENABLED #endif /** * LIBXML_REGEXP_ENABLED: * * Whether the regular expressions interfaces are compiled in */ #if @WITH_REGEXPS@ #define LIBXML_REGEXP_ENABLED #endif /** * LIBXML_AUTOMATA_ENABLED: * * Whether the automata interfaces are compiled in */ #if @WITH_REGEXPS@ #define LIBXML_AUTOMATA_ENABLED #endif /** * LIBXML_EXPR_ENABLED: * * Whether the formal expressions interfaces are compiled in */ #if @WITH_SCHEMAS@ #define LIBXML_EXPR_ENABLED #endif /** * LIBXML_SCHEMAS_ENABLED: * * Whether the Schemas validation interfaces are compiled in */ #if @WITH_SCHEMAS@ #define LIBXML_SCHEMAS_ENABLED #endif /** * LIBXML_SCHEMATRON_ENABLED: * * Whether the Schematron validation interfaces are compiled in */ #if @WITH_SCHEMATRON@ #define LIBXML_SCHEMATRON_ENABLED #endif /** * LIBXML_MODULES_ENABLED: * * Whether the module interfaces are compiled in */ #if @WITH_MODULES@ #define LIBXML_MODULES_ENABLED /** * LIBXML_MODULE_EXTENSION: * * the string suffix used by dynamic modules (usually shared libraries) */ #define LIBXML_MODULE_EXTENSION "@MODULE_EXTENSION@" #endif /** * LIBXML_ZLIB_ENABLED: * * Whether the Zlib support is compiled in */ #if @WITH_ZLIB@ #define LIBXML_ZLIB_ENABLED #endif /** * LIBXML_LZMA_ENABLED: * * Whether the Lzma support is compiled in */ #if @WITH_LZMA@ #define LIBXML_LZMA_ENABLED #endif #ifdef __GNUC__ #ifdef HAVE_ANSIDECL_H #include #endif /** * ATTRIBUTE_UNUSED: * * Macro used to signal to GCC unused function parameters */ #ifndef ATTRIBUTE_UNUSED # if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) # define ATTRIBUTE_UNUSED __attribute__((unused)) # else # define ATTRIBUTE_UNUSED # endif #endif /** * LIBXML_ATTR_ALLOC_SIZE: * * Macro used to indicate to GCC this is an allocator function */ #ifndef LIBXML_ATTR_ALLOC_SIZE # if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) # define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) # else # define LIBXML_ATTR_ALLOC_SIZE(x) # endif #else # define LIBXML_ATTR_ALLOC_SIZE(x) #endif /** * LIBXML_ATTR_FORMAT: * * Macro used to indicate to GCC the parameter are printf like */ #ifndef LIBXML_ATTR_FORMAT # if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) # define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) # else # define LIBXML_ATTR_FORMAT(fmt,args) # endif #else # define LIBXML_ATTR_FORMAT(fmt,args) #endif #else /* ! __GNUC__ */ /** * ATTRIBUTE_UNUSED: * * Macro used to signal to GCC unused function parameters */ #define ATTRIBUTE_UNUSED /** * LIBXML_ATTR_ALLOC_SIZE: * * Macro used to indicate to GCC this is an allocator function */ #define LIBXML_ATTR_ALLOC_SIZE(x) /** * LIBXML_ATTR_FORMAT: * * Macro used to indicate to GCC the parameter are printf like */ #define LIBXML_ATTR_FORMAT(fmt,args) #endif /* __GNUC__ */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif libxml2-2.9.1+dfsg1/include/libxml/xlink.h0000644000175000017500000001166012113312342016760 0ustar aronaron/* * Summary: unfinished XLink detection module * Description: unfinished XLink detection module * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_XLINK_H__ #define __XML_XLINK_H__ #include #include #ifdef LIBXML_XPTR_ENABLED #ifdef __cplusplus extern "C" { #endif /** * Various defines for the various Link properties. * * NOTE: the link detection layer will try to resolve QName expansion * of namespaces. If "foo" is the prefix for "http://foo.com/" * then the link detection layer will expand role="foo:myrole" * to "http://foo.com/:myrole". * NOTE: the link detection layer will expand URI-Refences found on * href attributes by using the base mechanism if found. */ typedef xmlChar *xlinkHRef; typedef xmlChar *xlinkRole; typedef xmlChar *xlinkTitle; typedef enum { XLINK_TYPE_NONE = 0, XLINK_TYPE_SIMPLE, XLINK_TYPE_EXTENDED, XLINK_TYPE_EXTENDED_SET } xlinkType; typedef enum { XLINK_SHOW_NONE = 0, XLINK_SHOW_NEW, XLINK_SHOW_EMBED, XLINK_SHOW_REPLACE } xlinkShow; typedef enum { XLINK_ACTUATE_NONE = 0, XLINK_ACTUATE_AUTO, XLINK_ACTUATE_ONREQUEST } xlinkActuate; /** * xlinkNodeDetectFunc: * @ctx: user data pointer * @node: the node to check * * This is the prototype for the link detection routine. * It calls the default link detection callbacks upon link detection. */ typedef void (*xlinkNodeDetectFunc) (void *ctx, xmlNodePtr node); /* * The link detection module interact with the upper layers using * a set of callback registered at parsing time. */ /** * xlinkSimpleLinkFunk: * @ctx: user data pointer * @node: the node carrying the link * @href: the target of the link * @role: the role string * @title: the link title * * This is the prototype for a simple link detection callback. */ typedef void (*xlinkSimpleLinkFunk) (void *ctx, xmlNodePtr node, const xlinkHRef href, const xlinkRole role, const xlinkTitle title); /** * xlinkExtendedLinkFunk: * @ctx: user data pointer * @node: the node carrying the link * @nbLocators: the number of locators detected on the link * @hrefs: pointer to the array of locator hrefs * @roles: pointer to the array of locator roles * @nbArcs: the number of arcs detected on the link * @from: pointer to the array of source roles found on the arcs * @to: pointer to the array of target roles found on the arcs * @show: array of values for the show attributes found on the arcs * @actuate: array of values for the actuate attributes found on the arcs * @nbTitles: the number of titles detected on the link * @title: array of titles detected on the link * @langs: array of xml:lang values for the titles * * This is the prototype for a extended link detection callback. */ typedef void (*xlinkExtendedLinkFunk)(void *ctx, xmlNodePtr node, int nbLocators, const xlinkHRef *hrefs, const xlinkRole *roles, int nbArcs, const xlinkRole *from, const xlinkRole *to, xlinkShow *show, xlinkActuate *actuate, int nbTitles, const xlinkTitle *titles, const xmlChar **langs); /** * xlinkExtendedLinkSetFunk: * @ctx: user data pointer * @node: the node carrying the link * @nbLocators: the number of locators detected on the link * @hrefs: pointer to the array of locator hrefs * @roles: pointer to the array of locator roles * @nbTitles: the number of titles detected on the link * @title: array of titles detected on the link * @langs: array of xml:lang values for the titles * * This is the prototype for a extended link set detection callback. */ typedef void (*xlinkExtendedLinkSetFunk) (void *ctx, xmlNodePtr node, int nbLocators, const xlinkHRef *hrefs, const xlinkRole *roles, int nbTitles, const xlinkTitle *titles, const xmlChar **langs); /** * This is the structure containing a set of Links detection callbacks. * * There is no default xlink callbacks, if one want to get link * recognition activated, those call backs must be provided before parsing. */ typedef struct _xlinkHandler xlinkHandler; typedef xlinkHandler *xlinkHandlerPtr; struct _xlinkHandler { xlinkSimpleLinkFunk simple; xlinkExtendedLinkFunk extended; xlinkExtendedLinkSetFunk set; }; /* * The default detection routine, can be overridden, they call the default * detection callbacks. */ XMLPUBFUN xlinkNodeDetectFunc XMLCALL xlinkGetDefaultDetect (void); XMLPUBFUN void XMLCALL xlinkSetDefaultDetect (xlinkNodeDetectFunc func); /* * Routines to set/get the default handlers. */ XMLPUBFUN xlinkHandlerPtr XMLCALL xlinkGetDefaultHandler (void); XMLPUBFUN void XMLCALL xlinkSetDefaultHandler (xlinkHandlerPtr handler); /* * Link detection module itself. */ XMLPUBFUN xlinkType XMLCALL xlinkIsLink (xmlDocPtr doc, xmlNodePtr node); #ifdef __cplusplus } #endif #endif /* LIBXML_XPTR_ENABLED */ #endif /* __XML_XLINK_H__ */ libxml2-2.9.1+dfsg1/include/libxml/dict.h0000644000175000017500000000346212113312342016557 0ustar aronaron/* * Summary: string dictionnary * Description: dictionary of reusable strings, just used to avoid allocation * and freeing operations. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_DICT_H__ #define __XML_DICT_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif /* * The dictionnary. */ typedef struct _xmlDict xmlDict; typedef xmlDict *xmlDictPtr; /* * Initializer */ XMLPUBFUN int XMLCALL xmlInitializeDict(void); /* * Constructor and destructor. */ XMLPUBFUN xmlDictPtr XMLCALL xmlDictCreate (void); XMLPUBFUN size_t XMLCALL xmlDictSetLimit (xmlDictPtr dict, size_t limit); XMLPUBFUN size_t XMLCALL xmlDictGetUsage (xmlDictPtr dict); XMLPUBFUN xmlDictPtr XMLCALL xmlDictCreateSub(xmlDictPtr sub); XMLPUBFUN int XMLCALL xmlDictReference(xmlDictPtr dict); XMLPUBFUN void XMLCALL xmlDictFree (xmlDictPtr dict); /* * Lookup of entry in the dictionnary. */ XMLPUBFUN const xmlChar * XMLCALL xmlDictLookup (xmlDictPtr dict, const xmlChar *name, int len); XMLPUBFUN const xmlChar * XMLCALL xmlDictExists (xmlDictPtr dict, const xmlChar *name, int len); XMLPUBFUN const xmlChar * XMLCALL xmlDictQLookup (xmlDictPtr dict, const xmlChar *prefix, const xmlChar *name); XMLPUBFUN int XMLCALL xmlDictOwns (xmlDictPtr dict, const xmlChar *str); XMLPUBFUN int XMLCALL xmlDictSize (xmlDictPtr dict); /* * Cleanup function */ XMLPUBFUN void XMLCALL xmlDictCleanup (void); #ifdef __cplusplus } #endif #endif /* ! __XML_DICT_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlmodule.h0000644000175000017500000000222212113312342017633 0ustar aronaron/* * Summary: dynamic module loading * Description: basic API for dynamic module loading, used by * libexslt added in 2.6.17 * * Copy: See Copyright for the status of this software. * * Author: Joel W. Reed */ #ifndef __XML_MODULE_H__ #define __XML_MODULE_H__ #include #ifdef LIBXML_MODULES_ENABLED #ifdef __cplusplus extern "C" { #endif /** * xmlModulePtr: * * A handle to a dynamically loaded module */ typedef struct _xmlModule xmlModule; typedef xmlModule *xmlModulePtr; /** * xmlModuleOption: * * enumeration of options that can be passed down to xmlModuleOpen() */ typedef enum { XML_MODULE_LAZY = 1, /* lazy binding */ XML_MODULE_LOCAL= 2 /* local binding */ } xmlModuleOption; XMLPUBFUN xmlModulePtr XMLCALL xmlModuleOpen (const char *filename, int options); XMLPUBFUN int XMLCALL xmlModuleSymbol (xmlModulePtr module, const char* name, void **result); XMLPUBFUN int XMLCALL xmlModuleClose (xmlModulePtr module); XMLPUBFUN int XMLCALL xmlModuleFree (xmlModulePtr module); #ifdef __cplusplus } #endif #endif /* LIBXML_MODULES_ENABLED */ #endif /*__XML_MODULE_H__ */ libxml2-2.9.1+dfsg1/include/libxml/nanohttp.h0000644000175000017500000000372512113312342017471 0ustar aronaron/* * Summary: minimal HTTP implementation * Description: minimal HTTP implementation allowing to fetch resources * like external subset. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __NANO_HTTP_H__ #define __NANO_HTTP_H__ #include #ifdef LIBXML_HTTP_ENABLED #ifdef __cplusplus extern "C" { #endif XMLPUBFUN void XMLCALL xmlNanoHTTPInit (void); XMLPUBFUN void XMLCALL xmlNanoHTTPCleanup (void); XMLPUBFUN void XMLCALL xmlNanoHTTPScanProxy (const char *URL); XMLPUBFUN int XMLCALL xmlNanoHTTPFetch (const char *URL, const char *filename, char **contentType); XMLPUBFUN void * XMLCALL xmlNanoHTTPMethod (const char *URL, const char *method, const char *input, char **contentType, const char *headers, int ilen); XMLPUBFUN void * XMLCALL xmlNanoHTTPMethodRedir (const char *URL, const char *method, const char *input, char **contentType, char **redir, const char *headers, int ilen); XMLPUBFUN void * XMLCALL xmlNanoHTTPOpen (const char *URL, char **contentType); XMLPUBFUN void * XMLCALL xmlNanoHTTPOpenRedir (const char *URL, char **contentType, char **redir); XMLPUBFUN int XMLCALL xmlNanoHTTPReturnCode (void *ctx); XMLPUBFUN const char * XMLCALL xmlNanoHTTPAuthHeader (void *ctx); XMLPUBFUN const char * XMLCALL xmlNanoHTTPRedir (void *ctx); XMLPUBFUN int XMLCALL xmlNanoHTTPContentLength( void * ctx ); XMLPUBFUN const char * XMLCALL xmlNanoHTTPEncoding (void *ctx); XMLPUBFUN const char * XMLCALL xmlNanoHTTPMimeType (void *ctx); XMLPUBFUN int XMLCALL xmlNanoHTTPRead (void *ctx, void *dest, int len); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN int XMLCALL xmlNanoHTTPSave (void *ctxt, const char *filename); #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN void XMLCALL xmlNanoHTTPClose (void *ctx); #ifdef __cplusplus } #endif #endif /* LIBXML_HTTP_ENABLED */ #endif /* __NANO_HTTP_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xinclude.h0000644000175000017500000000562712113312342017454 0ustar aronaron/* * Summary: implementation of XInclude * Description: API to handle XInclude processing, * implements the * World Wide Web Consortium Last Call Working Draft 10 November 2003 * http://www.w3.org/TR/2003/WD-xinclude-20031110 * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_XINCLUDE_H__ #define __XML_XINCLUDE_H__ #include #include #ifdef LIBXML_XINCLUDE_ENABLED #ifdef __cplusplus extern "C" { #endif /** * XINCLUDE_NS: * * Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude */ #define XINCLUDE_NS (const xmlChar *) "http://www.w3.org/2003/XInclude" /** * XINCLUDE_OLD_NS: * * Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude */ #define XINCLUDE_OLD_NS (const xmlChar *) "http://www.w3.org/2001/XInclude" /** * XINCLUDE_NODE: * * Macro defining "include" */ #define XINCLUDE_NODE (const xmlChar *) "include" /** * XINCLUDE_FALLBACK: * * Macro defining "fallback" */ #define XINCLUDE_FALLBACK (const xmlChar *) "fallback" /** * XINCLUDE_HREF: * * Macro defining "href" */ #define XINCLUDE_HREF (const xmlChar *) "href" /** * XINCLUDE_PARSE: * * Macro defining "parse" */ #define XINCLUDE_PARSE (const xmlChar *) "parse" /** * XINCLUDE_PARSE_XML: * * Macro defining "xml" */ #define XINCLUDE_PARSE_XML (const xmlChar *) "xml" /** * XINCLUDE_PARSE_TEXT: * * Macro defining "text" */ #define XINCLUDE_PARSE_TEXT (const xmlChar *) "text" /** * XINCLUDE_PARSE_ENCODING: * * Macro defining "encoding" */ #define XINCLUDE_PARSE_ENCODING (const xmlChar *) "encoding" /** * XINCLUDE_PARSE_XPOINTER: * * Macro defining "xpointer" */ #define XINCLUDE_PARSE_XPOINTER (const xmlChar *) "xpointer" typedef struct _xmlXIncludeCtxt xmlXIncludeCtxt; typedef xmlXIncludeCtxt *xmlXIncludeCtxtPtr; /* * standalone processing */ XMLPUBFUN int XMLCALL xmlXIncludeProcess (xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlXIncludeProcessFlags (xmlDocPtr doc, int flags); XMLPUBFUN int XMLCALL xmlXIncludeProcessFlagsData(xmlDocPtr doc, int flags, void *data); XMLPUBFUN int XMLCALL xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, int flags, void *data); XMLPUBFUN int XMLCALL xmlXIncludeProcessTree (xmlNodePtr tree); XMLPUBFUN int XMLCALL xmlXIncludeProcessTreeFlags(xmlNodePtr tree, int flags); /* * contextual processing */ XMLPUBFUN xmlXIncludeCtxtPtr XMLCALL xmlXIncludeNewContext (xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlXIncludeSetFlags (xmlXIncludeCtxtPtr ctxt, int flags); XMLPUBFUN void XMLCALL xmlXIncludeFreeContext (xmlXIncludeCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlXIncludeProcessNode (xmlXIncludeCtxtPtr ctxt, xmlNodePtr tree); #ifdef __cplusplus } #endif #endif /* LIBXML_XINCLUDE_ENABLED */ #endif /* __XML_XINCLUDE_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xpointer.h0000644000175000017500000000643712113312342017511 0ustar aronaron/* * Summary: API to handle XML Pointers * Description: API to handle XML Pointers * Base implementation was made accordingly to * W3C Candidate Recommendation 7 June 2000 * http://www.w3.org/TR/2000/CR-xptr-20000607 * * Added support for the element() scheme described in: * W3C Proposed Recommendation 13 November 2002 * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_XPTR_H__ #define __XML_XPTR_H__ #include #ifdef LIBXML_XPTR_ENABLED #include #include #ifdef __cplusplus extern "C" { #endif /* * A Location Set */ typedef struct _xmlLocationSet xmlLocationSet; typedef xmlLocationSet *xmlLocationSetPtr; struct _xmlLocationSet { int locNr; /* number of locations in the set */ int locMax; /* size of the array as allocated */ xmlXPathObjectPtr *locTab;/* array of locations */ }; /* * Handling of location sets. */ XMLPUBFUN xmlLocationSetPtr XMLCALL xmlXPtrLocationSetCreate (xmlXPathObjectPtr val); XMLPUBFUN void XMLCALL xmlXPtrFreeLocationSet (xmlLocationSetPtr obj); XMLPUBFUN xmlLocationSetPtr XMLCALL xmlXPtrLocationSetMerge (xmlLocationSetPtr val1, xmlLocationSetPtr val2); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRange (xmlNodePtr start, int startindex, xmlNodePtr end, int endindex); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangePoints (xmlXPathObjectPtr start, xmlXPathObjectPtr end); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangeNodePoint (xmlNodePtr start, xmlXPathObjectPtr end); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangePointNode (xmlXPathObjectPtr start, xmlNodePtr end); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangeNodes (xmlNodePtr start, xmlNodePtr end); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewLocationSetNodes (xmlNodePtr start, xmlNodePtr end); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangeNodeObject (xmlNodePtr start, xmlXPathObjectPtr end); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewCollapsedRange (xmlNodePtr start); XMLPUBFUN void XMLCALL xmlXPtrLocationSetAdd (xmlLocationSetPtr cur, xmlXPathObjectPtr val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrWrapLocationSet (xmlLocationSetPtr val); XMLPUBFUN void XMLCALL xmlXPtrLocationSetDel (xmlLocationSetPtr cur, xmlXPathObjectPtr val); XMLPUBFUN void XMLCALL xmlXPtrLocationSetRemove (xmlLocationSetPtr cur, int val); /* * Functions. */ XMLPUBFUN xmlXPathContextPtr XMLCALL xmlXPtrNewContext (xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrEval (const xmlChar *str, xmlXPathContextPtr ctx); XMLPUBFUN void XMLCALL xmlXPtrRangeToFunction (xmlXPathParserContextPtr ctxt, int nargs); XMLPUBFUN xmlNodePtr XMLCALL xmlXPtrBuildNodeList (xmlXPathObjectPtr obj); XMLPUBFUN void XMLCALL xmlXPtrEvalRangePredicate (xmlXPathParserContextPtr ctxt); #ifdef __cplusplus } #endif #endif /* LIBXML_XPTR_ENABLED */ #endif /* __XML_XPTR_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xpath.h0000644000175000017500000004001612126244144016764 0ustar aronaron/* * Summary: XML Path Language implementation * Description: API for the XML Path Language implementation * * XML Path Language implementation * XPath is a language for addressing parts of an XML document, * designed to be used by both XSLT and XPointer * http://www.w3.org/TR/xpath * * Implements * W3C Recommendation 16 November 1999 * http://www.w3.org/TR/1999/REC-xpath-19991116 * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_XPATH_H__ #define __XML_XPATH_H__ #include #ifdef LIBXML_XPATH_ENABLED #include #include #include #endif /* LIBXML_XPATH_ENABLED */ #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) #ifdef __cplusplus extern "C" { #endif #endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */ #ifdef LIBXML_XPATH_ENABLED typedef struct _xmlXPathContext xmlXPathContext; typedef xmlXPathContext *xmlXPathContextPtr; typedef struct _xmlXPathParserContext xmlXPathParserContext; typedef xmlXPathParserContext *xmlXPathParserContextPtr; /** * The set of XPath error codes. */ typedef enum { XPATH_EXPRESSION_OK = 0, XPATH_NUMBER_ERROR, XPATH_UNFINISHED_LITERAL_ERROR, XPATH_START_LITERAL_ERROR, XPATH_VARIABLE_REF_ERROR, XPATH_UNDEF_VARIABLE_ERROR, XPATH_INVALID_PREDICATE_ERROR, XPATH_EXPR_ERROR, XPATH_UNCLOSED_ERROR, XPATH_UNKNOWN_FUNC_ERROR, XPATH_INVALID_OPERAND, XPATH_INVALID_TYPE, XPATH_INVALID_ARITY, XPATH_INVALID_CTXT_SIZE, XPATH_INVALID_CTXT_POSITION, XPATH_MEMORY_ERROR, XPTR_SYNTAX_ERROR, XPTR_RESOURCE_ERROR, XPTR_SUB_RESOURCE_ERROR, XPATH_UNDEF_PREFIX_ERROR, XPATH_ENCODING_ERROR, XPATH_INVALID_CHAR_ERROR, XPATH_INVALID_CTXT, XPATH_STACK_ERROR, XPATH_FORBID_VARIABLE_ERROR } xmlXPathError; /* * A node-set (an unordered collection of nodes without duplicates). */ typedef struct _xmlNodeSet xmlNodeSet; typedef xmlNodeSet *xmlNodeSetPtr; struct _xmlNodeSet { int nodeNr; /* number of nodes in the set */ int nodeMax; /* size of the array as allocated */ xmlNodePtr *nodeTab; /* array of nodes in no particular order */ /* @@ with_ns to check wether namespace nodes should be looked at @@ */ }; /* * An expression is evaluated to yield an object, which * has one of the following four basic types: * - node-set * - boolean * - number * - string * * @@ XPointer will add more types ! */ typedef enum { XPATH_UNDEFINED = 0, XPATH_NODESET = 1, XPATH_BOOLEAN = 2, XPATH_NUMBER = 3, XPATH_STRING = 4, XPATH_POINT = 5, XPATH_RANGE = 6, XPATH_LOCATIONSET = 7, XPATH_USERS = 8, XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */ } xmlXPathObjectType; typedef struct _xmlXPathObject xmlXPathObject; typedef xmlXPathObject *xmlXPathObjectPtr; struct _xmlXPathObject { xmlXPathObjectType type; xmlNodeSetPtr nodesetval; int boolval; double floatval; xmlChar *stringval; void *user; int index; void *user2; int index2; }; /** * xmlXPathConvertFunc: * @obj: an XPath object * @type: the number of the target type * * A conversion function is associated to a type and used to cast * the new type to primitive values. * * Returns -1 in case of error, 0 otherwise */ typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type); /* * Extra type: a name and a conversion function. */ typedef struct _xmlXPathType xmlXPathType; typedef xmlXPathType *xmlXPathTypePtr; struct _xmlXPathType { const xmlChar *name; /* the type name */ xmlXPathConvertFunc func; /* the conversion function */ }; /* * Extra variable: a name and a value. */ typedef struct _xmlXPathVariable xmlXPathVariable; typedef xmlXPathVariable *xmlXPathVariablePtr; struct _xmlXPathVariable { const xmlChar *name; /* the variable name */ xmlXPathObjectPtr value; /* the value */ }; /** * xmlXPathEvalFunc: * @ctxt: an XPath parser context * @nargs: the number of arguments passed to the function * * An XPath evaluation function, the parameters are on the XPath context stack. */ typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt, int nargs); /* * Extra function: a name and a evaluation function. */ typedef struct _xmlXPathFunct xmlXPathFunct; typedef xmlXPathFunct *xmlXPathFuncPtr; struct _xmlXPathFunct { const xmlChar *name; /* the function name */ xmlXPathEvalFunc func; /* the evaluation function */ }; /** * xmlXPathAxisFunc: * @ctxt: the XPath interpreter context * @cur: the previous node being explored on that axis * * An axis traversal function. To traverse an axis, the engine calls * the first time with cur == NULL and repeat until the function returns * NULL indicating the end of the axis traversal. * * Returns the next node in that axis or NULL if at the end of the axis. */ typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr cur); /* * Extra axis: a name and an axis function. */ typedef struct _xmlXPathAxis xmlXPathAxis; typedef xmlXPathAxis *xmlXPathAxisPtr; struct _xmlXPathAxis { const xmlChar *name; /* the axis name */ xmlXPathAxisFunc func; /* the search function */ }; /** * xmlXPathFunction: * @ctxt: the XPath interprestation context * @nargs: the number of arguments * * An XPath function. * The arguments (if any) are popped out from the context stack * and the result is pushed on the stack. */ typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs); /* * Function and Variable Lookup. */ /** * xmlXPathVariableLookupFunc: * @ctxt: an XPath context * @name: name of the variable * @ns_uri: the namespace name hosting this variable * * Prototype for callbacks used to plug variable lookup in the XPath * engine. * * Returns the XPath object value or NULL if not found. */ typedef xmlXPathObjectPtr (*xmlXPathVariableLookupFunc) (void *ctxt, const xmlChar *name, const xmlChar *ns_uri); /** * xmlXPathFuncLookupFunc: * @ctxt: an XPath context * @name: name of the function * @ns_uri: the namespace name hosting this function * * Prototype for callbacks used to plug function lookup in the XPath * engine. * * Returns the XPath function or NULL if not found. */ typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt, const xmlChar *name, const xmlChar *ns_uri); /** * xmlXPathFlags: * Flags for XPath engine compilation and runtime */ /** * XML_XPATH_CHECKNS: * * check namespaces at compilation */ #define XML_XPATH_CHECKNS (1<<0) /** * XML_XPATH_NOVAR: * * forbid variables in expression */ #define XML_XPATH_NOVAR (1<<1) /** * xmlXPathContext: * * Expression evaluation occurs with respect to a context. * he context consists of: * - a node (the context node) * - a node list (the context node list) * - a set of variable bindings * - a function library * - the set of namespace declarations in scope for the expression * Following the switch to hash tables, this need to be trimmed up at * the next binary incompatible release. * The node may be modified when the context is passed to libxml2 * for an XPath evaluation so you may need to initialize it again * before the next call. */ struct _xmlXPathContext { xmlDocPtr doc; /* The current document */ xmlNodePtr node; /* The current node */ int nb_variables_unused; /* unused (hash table) */ int max_variables_unused; /* unused (hash table) */ xmlHashTablePtr varHash; /* Hash table of defined variables */ int nb_types; /* number of defined types */ int max_types; /* max number of types */ xmlXPathTypePtr types; /* Array of defined types */ int nb_funcs_unused; /* unused (hash table) */ int max_funcs_unused; /* unused (hash table) */ xmlHashTablePtr funcHash; /* Hash table of defined funcs */ int nb_axis; /* number of defined axis */ int max_axis; /* max number of axis */ xmlXPathAxisPtr axis; /* Array of defined axis */ /* the namespace nodes of the context node */ xmlNsPtr *namespaces; /* Array of namespaces */ int nsNr; /* number of namespace in scope */ void *user; /* function to free */ /* extra variables */ int contextSize; /* the context size */ int proximityPosition; /* the proximity position */ /* extra stuff for XPointer */ int xptr; /* is this an XPointer context? */ xmlNodePtr here; /* for here() */ xmlNodePtr origin; /* for origin() */ /* the set of namespace declarations in scope for the expression */ xmlHashTablePtr nsHash; /* The namespaces hash table */ xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */ void *varLookupData; /* variable lookup data */ /* Possibility to link in an extra item */ void *extra; /* needed for XSLT */ /* The function name and URI when calling a function */ const xmlChar *function; const xmlChar *functionURI; /* function lookup function and data */ xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */ void *funcLookupData; /* function lookup data */ /* temporary namespace lists kept for walking the namespace axis */ xmlNsPtr *tmpNsList; /* Array of namespaces */ int tmpNsNr; /* number of namespaces in scope */ /* error reporting mechanism */ void *userData; /* user specific data block */ xmlStructuredErrorFunc error; /* the callback in case of errors */ xmlError lastError; /* the last error */ xmlNodePtr debugNode; /* the source node XSLT */ /* dictionary */ xmlDictPtr dict; /* dictionary if any */ int flags; /* flags to control compilation */ /* Cache for reusal of XPath objects */ void *cache; }; /* * The structure of a compiled expression form is not public. */ typedef struct _xmlXPathCompExpr xmlXPathCompExpr; typedef xmlXPathCompExpr *xmlXPathCompExprPtr; /** * xmlXPathParserContext: * * An XPath parser context. It contains pure parsing informations, * an xmlXPathContext, and the stack of objects. */ struct _xmlXPathParserContext { const xmlChar *cur; /* the current char being parsed */ const xmlChar *base; /* the full expression */ int error; /* error code */ xmlXPathContextPtr context; /* the evaluation context */ xmlXPathObjectPtr value; /* the current value */ int valueNr; /* number of values stacked */ int valueMax; /* max number of values stacked */ xmlXPathObjectPtr *valueTab; /* stack of values */ xmlXPathCompExprPtr comp; /* the precompiled expression */ int xptr; /* it this an XPointer expression */ xmlNodePtr ancestor; /* used for walking preceding axis */ int valueFrame; /* used to limit Pop on the stack */ }; /************************************************************************ * * * Public API * * * ************************************************************************/ /** * Objects and Nodesets handling */ XMLPUBVAR double xmlXPathNAN; XMLPUBVAR double xmlXPathPINF; XMLPUBVAR double xmlXPathNINF; /* These macros may later turn into functions */ /** * xmlXPathNodeSetGetLength: * @ns: a node-set * * Implement a functionality similar to the DOM NodeList.length. * * Returns the number of nodes in the node-set. */ #define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0) /** * xmlXPathNodeSetItem: * @ns: a node-set * @index: index of a node in the set * * Implements a functionality similar to the DOM NodeList.item(). * * Returns the xmlNodePtr at the given @index in @ns or NULL if * @index is out of range (0 to length-1) */ #define xmlXPathNodeSetItem(ns, index) \ ((((ns) != NULL) && \ ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \ (ns)->nodeTab[(index)] \ : NULL) /** * xmlXPathNodeSetIsEmpty: * @ns: a node-set * * Checks whether @ns is empty or not. * * Returns %TRUE if @ns is an empty node-set. */ #define xmlXPathNodeSetIsEmpty(ns) \ (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL)) XMLPUBFUN void XMLCALL xmlXPathFreeObject (xmlXPathObjectPtr obj); XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeSetCreate (xmlNodePtr val); XMLPUBFUN void XMLCALL xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj); XMLPUBFUN void XMLCALL xmlXPathFreeNodeSet (xmlNodeSetPtr obj); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathObjectCopy (xmlXPathObjectPtr val); XMLPUBFUN int XMLCALL xmlXPathCmpNodes (xmlNodePtr node1, xmlNodePtr node2); /** * Conversion functions to basic types. */ XMLPUBFUN int XMLCALL xmlXPathCastNumberToBoolean (double val); XMLPUBFUN int XMLCALL xmlXPathCastStringToBoolean (const xmlChar * val); XMLPUBFUN int XMLCALL xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns); XMLPUBFUN int XMLCALL xmlXPathCastToBoolean (xmlXPathObjectPtr val); XMLPUBFUN double XMLCALL xmlXPathCastBooleanToNumber (int val); XMLPUBFUN double XMLCALL xmlXPathCastStringToNumber (const xmlChar * val); XMLPUBFUN double XMLCALL xmlXPathCastNodeToNumber (xmlNodePtr node); XMLPUBFUN double XMLCALL xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns); XMLPUBFUN double XMLCALL xmlXPathCastToNumber (xmlXPathObjectPtr val); XMLPUBFUN xmlChar * XMLCALL xmlXPathCastBooleanToString (int val); XMLPUBFUN xmlChar * XMLCALL xmlXPathCastNumberToString (double val); XMLPUBFUN xmlChar * XMLCALL xmlXPathCastNodeToString (xmlNodePtr node); XMLPUBFUN xmlChar * XMLCALL xmlXPathCastNodeSetToString (xmlNodeSetPtr ns); XMLPUBFUN xmlChar * XMLCALL xmlXPathCastToString (xmlXPathObjectPtr val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathConvertBoolean (xmlXPathObjectPtr val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathConvertNumber (xmlXPathObjectPtr val); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathConvertString (xmlXPathObjectPtr val); /** * Context handling. */ XMLPUBFUN xmlXPathContextPtr XMLCALL xmlXPathNewContext (xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlXPathFreeContext (xmlXPathContextPtr ctxt); XMLPUBFUN int XMLCALL xmlXPathContextSetCache(xmlXPathContextPtr ctxt, int active, int value, int options); /** * Evaluation functions. */ XMLPUBFUN long XMLCALL xmlXPathOrderDocElems (xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlXPathSetContextNode (xmlNodePtr node, xmlXPathContextPtr ctx); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNodeEval (xmlNodePtr node, const xmlChar *str, xmlXPathContextPtr ctx); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathEval (const xmlChar *str, xmlXPathContextPtr ctx); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathEvalExpression (const xmlChar *str, xmlXPathContextPtr ctxt); XMLPUBFUN int XMLCALL xmlXPathEvalPredicate (xmlXPathContextPtr ctxt, xmlXPathObjectPtr res); /** * Separate compilation/evaluation entry points. */ XMLPUBFUN xmlXPathCompExprPtr XMLCALL xmlXPathCompile (const xmlChar *str); XMLPUBFUN xmlXPathCompExprPtr XMLCALL xmlXPathCtxtCompile (xmlXPathContextPtr ctxt, const xmlChar *str); XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathCompiledEval (xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx); XMLPUBFUN int XMLCALL xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt); XMLPUBFUN void XMLCALL xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp); #endif /* LIBXML_XPATH_ENABLED */ #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN void XMLCALL xmlXPathInit (void); XMLPUBFUN int XMLCALL xmlXPathIsNaN (double val); XMLPUBFUN int XMLCALL xmlXPathIsInf (double val); #ifdef __cplusplus } #endif #endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*/ #endif /* ! __XML_XPATH_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlversion.h0000644000175000017500000001771512134171764020066 0ustar aronaron/* * Summary: compile-time version informations * Description: compile-time version informations for the XML library * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_VERSION_H__ #define __XML_VERSION_H__ #include #ifdef __cplusplus extern "C" { #endif /* * use those to be sure nothing nasty will happen if * your library and includes mismatch */ #ifndef LIBXML2_COMPILING_MSCCDEF XMLPUBFUN void XMLCALL xmlCheckVersion(int version); #endif /* LIBXML2_COMPILING_MSCCDEF */ /** * LIBXML_DOTTED_VERSION: * * the version string like "1.2.3" */ #define LIBXML_DOTTED_VERSION "2.9.1" /** * LIBXML_VERSION: * * the version number: 1.2.3 value is 10203 */ #define LIBXML_VERSION 20901 /** * LIBXML_VERSION_STRING: * * the version number string, 1.2.3 value is "10203" */ #define LIBXML_VERSION_STRING "20901" /** * LIBXML_VERSION_EXTRA: * * extra version information, used to show a CVS compilation */ #define LIBXML_VERSION_EXTRA "-GITv2.9.0-69-gc0a8dd1" /** * LIBXML_TEST_VERSION: * * Macro to check that the libxml version in use is compatible with * the version the software has been compiled against */ #define LIBXML_TEST_VERSION xmlCheckVersion(20901); #ifndef VMS #if 0 /** * WITH_TRIO: * * defined if the trio support need to be configured in */ #define WITH_TRIO #else /** * WITHOUT_TRIO: * * defined if the trio support should not be configured in */ #define WITHOUT_TRIO #endif #else /* VMS */ /** * WITH_TRIO: * * defined if the trio support need to be configured in */ #define WITH_TRIO 1 #endif /* VMS */ /** * LIBXML_THREAD_ENABLED: * * Whether the thread support is configured in */ #if 1 #if defined(_REENTRANT) || defined(__MT__) || \ (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L)) #define LIBXML_THREAD_ENABLED #endif #endif /** * LIBXML_THREAD_ALLOC_ENABLED: * * Whether the allocation hooks are per-thread */ #if 0 #define LIBXML_THREAD_ALLOC_ENABLED #endif /** * LIBXML_TREE_ENABLED: * * Whether the DOM like tree manipulation API support is configured in */ #if 1 #define LIBXML_TREE_ENABLED #endif /** * LIBXML_OUTPUT_ENABLED: * * Whether the serialization/saving support is configured in */ #if 1 #define LIBXML_OUTPUT_ENABLED #endif /** * LIBXML_PUSH_ENABLED: * * Whether the push parsing interfaces are configured in */ #if 1 #define LIBXML_PUSH_ENABLED #endif /** * LIBXML_READER_ENABLED: * * Whether the xmlReader parsing interface is configured in */ #if 1 #define LIBXML_READER_ENABLED #endif /** * LIBXML_PATTERN_ENABLED: * * Whether the xmlPattern node selection interface is configured in */ #if 1 #define LIBXML_PATTERN_ENABLED #endif /** * LIBXML_WRITER_ENABLED: * * Whether the xmlWriter saving interface is configured in */ #if 1 #define LIBXML_WRITER_ENABLED #endif /** * LIBXML_SAX1_ENABLED: * * Whether the older SAX1 interface is configured in */ #if 1 #define LIBXML_SAX1_ENABLED #endif /** * LIBXML_FTP_ENABLED: * * Whether the FTP support is configured in */ #if 1 #define LIBXML_FTP_ENABLED #endif /** * LIBXML_HTTP_ENABLED: * * Whether the HTTP support is configured in */ #if 1 #define LIBXML_HTTP_ENABLED #endif /** * LIBXML_VALID_ENABLED: * * Whether the DTD validation support is configured in */ #if 1 #define LIBXML_VALID_ENABLED #endif /** * LIBXML_HTML_ENABLED: * * Whether the HTML support is configured in */ #if 1 #define LIBXML_HTML_ENABLED #endif /** * LIBXML_LEGACY_ENABLED: * * Whether the deprecated APIs are compiled in for compatibility */ #if 1 #define LIBXML_LEGACY_ENABLED #endif /** * LIBXML_C14N_ENABLED: * * Whether the Canonicalization support is configured in */ #if 1 #define LIBXML_C14N_ENABLED #endif /** * LIBXML_CATALOG_ENABLED: * * Whether the Catalog support is configured in */ #if 1 #define LIBXML_CATALOG_ENABLED #endif /** * LIBXML_DOCB_ENABLED: * * Whether the SGML Docbook support is configured in */ #if 1 #define LIBXML_DOCB_ENABLED #endif /** * LIBXML_XPATH_ENABLED: * * Whether XPath is configured in */ #if 1 #define LIBXML_XPATH_ENABLED #endif /** * LIBXML_XPTR_ENABLED: * * Whether XPointer is configured in */ #if 1 #define LIBXML_XPTR_ENABLED #endif /** * LIBXML_XINCLUDE_ENABLED: * * Whether XInclude is configured in */ #if 1 #define LIBXML_XINCLUDE_ENABLED #endif /** * LIBXML_ICONV_ENABLED: * * Whether iconv support is available */ #if 1 #define LIBXML_ICONV_ENABLED #endif /** * LIBXML_ICU_ENABLED: * * Whether icu support is available */ #if 0 #define LIBXML_ICU_ENABLED #endif /** * LIBXML_ISO8859X_ENABLED: * * Whether ISO-8859-* support is made available in case iconv is not */ #if 1 #define LIBXML_ISO8859X_ENABLED #endif /** * LIBXML_DEBUG_ENABLED: * * Whether Debugging module is configured in */ #if 1 #define LIBXML_DEBUG_ENABLED #endif /** * DEBUG_MEMORY_LOCATION: * * Whether the memory debugging is configured in */ #if 0 #define DEBUG_MEMORY_LOCATION #endif /** * LIBXML_DEBUG_RUNTIME: * * Whether the runtime debugging is configured in */ #if 0 #define LIBXML_DEBUG_RUNTIME #endif /** * LIBXML_UNICODE_ENABLED: * * Whether the Unicode related interfaces are compiled in */ #if 1 #define LIBXML_UNICODE_ENABLED #endif /** * LIBXML_REGEXP_ENABLED: * * Whether the regular expressions interfaces are compiled in */ #if 1 #define LIBXML_REGEXP_ENABLED #endif /** * LIBXML_AUTOMATA_ENABLED: * * Whether the automata interfaces are compiled in */ #if 1 #define LIBXML_AUTOMATA_ENABLED #endif /** * LIBXML_EXPR_ENABLED: * * Whether the formal expressions interfaces are compiled in */ #if 1 #define LIBXML_EXPR_ENABLED #endif /** * LIBXML_SCHEMAS_ENABLED: * * Whether the Schemas validation interfaces are compiled in */ #if 1 #define LIBXML_SCHEMAS_ENABLED #endif /** * LIBXML_SCHEMATRON_ENABLED: * * Whether the Schematron validation interfaces are compiled in */ #if 1 #define LIBXML_SCHEMATRON_ENABLED #endif /** * LIBXML_MODULES_ENABLED: * * Whether the module interfaces are compiled in */ #if 1 #define LIBXML_MODULES_ENABLED /** * LIBXML_MODULE_EXTENSION: * * the string suffix used by dynamic modules (usually shared libraries) */ #define LIBXML_MODULE_EXTENSION ".so" #endif /** * LIBXML_ZLIB_ENABLED: * * Whether the Zlib support is compiled in */ #if 1 #define LIBXML_ZLIB_ENABLED #endif /** * LIBXML_LZMA_ENABLED: * * Whether the Lzma support is compiled in */ #if 1 #define LIBXML_LZMA_ENABLED #endif #ifdef __GNUC__ #ifdef HAVE_ANSIDECL_H #include #endif /** * ATTRIBUTE_UNUSED: * * Macro used to signal to GCC unused function parameters */ #ifndef ATTRIBUTE_UNUSED # if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) # define ATTRIBUTE_UNUSED __attribute__((unused)) # else # define ATTRIBUTE_UNUSED # endif #endif /** * LIBXML_ATTR_ALLOC_SIZE: * * Macro used to indicate to GCC this is an allocator function */ #ifndef LIBXML_ATTR_ALLOC_SIZE # if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) # define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) # else # define LIBXML_ATTR_ALLOC_SIZE(x) # endif #else # define LIBXML_ATTR_ALLOC_SIZE(x) #endif /** * LIBXML_ATTR_FORMAT: * * Macro used to indicate to GCC the parameter are printf like */ #ifndef LIBXML_ATTR_FORMAT # if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) # define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) # else # define LIBXML_ATTR_FORMAT(fmt,args) # endif #else # define LIBXML_ATTR_FORMAT(fmt,args) #endif #else /* ! __GNUC__ */ /** * ATTRIBUTE_UNUSED: * * Macro used to signal to GCC unused function parameters */ #define ATTRIBUTE_UNUSED /** * LIBXML_ATTR_ALLOC_SIZE: * * Macro used to indicate to GCC this is an allocator function */ #define LIBXML_ATTR_ALLOC_SIZE(x) /** * LIBXML_ATTR_FORMAT: * * Macro used to indicate to GCC the parameter are printf like */ #define LIBXML_ATTR_FORMAT(fmt,args) #endif /* __GNUC__ */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif libxml2-2.9.1+dfsg1/include/libxml/pattern.h0000644000175000017500000000503211234335462017317 0ustar aronaron/* * Summary: pattern expression handling * Description: allows to compile and test pattern expressions for nodes * either in a tree or based on a parser state. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_PATTERN_H__ #define __XML_PATTERN_H__ #include #include #include #ifdef LIBXML_PATTERN_ENABLED #ifdef __cplusplus extern "C" { #endif /** * xmlPattern: * * A compiled (XPath based) pattern to select nodes */ typedef struct _xmlPattern xmlPattern; typedef xmlPattern *xmlPatternPtr; /** * xmlPatternFlags: * * This is the set of options affecting the behaviour of pattern * matching with this module * */ typedef enum { XML_PATTERN_DEFAULT = 0, /* simple pattern match */ XML_PATTERN_XPATH = 1<<0, /* standard XPath pattern */ XML_PATTERN_XSSEL = 1<<1, /* XPath subset for schema selector */ XML_PATTERN_XSFIELD = 1<<2 /* XPath subset for schema field */ } xmlPatternFlags; XMLPUBFUN void XMLCALL xmlFreePattern (xmlPatternPtr comp); XMLPUBFUN void XMLCALL xmlFreePatternList (xmlPatternPtr comp); XMLPUBFUN xmlPatternPtr XMLCALL xmlPatterncompile (const xmlChar *pattern, xmlDict *dict, int flags, const xmlChar **namespaces); XMLPUBFUN int XMLCALL xmlPatternMatch (xmlPatternPtr comp, xmlNodePtr node); /* streaming interfaces */ typedef struct _xmlStreamCtxt xmlStreamCtxt; typedef xmlStreamCtxt *xmlStreamCtxtPtr; XMLPUBFUN int XMLCALL xmlPatternStreamable (xmlPatternPtr comp); XMLPUBFUN int XMLCALL xmlPatternMaxDepth (xmlPatternPtr comp); XMLPUBFUN int XMLCALL xmlPatternMinDepth (xmlPatternPtr comp); XMLPUBFUN int XMLCALL xmlPatternFromRoot (xmlPatternPtr comp); XMLPUBFUN xmlStreamCtxtPtr XMLCALL xmlPatternGetStreamCtxt (xmlPatternPtr comp); XMLPUBFUN void XMLCALL xmlFreeStreamCtxt (xmlStreamCtxtPtr stream); XMLPUBFUN int XMLCALL xmlStreamPushNode (xmlStreamCtxtPtr stream, const xmlChar *name, const xmlChar *ns, int nodeType); XMLPUBFUN int XMLCALL xmlStreamPush (xmlStreamCtxtPtr stream, const xmlChar *name, const xmlChar *ns); XMLPUBFUN int XMLCALL xmlStreamPushAttr (xmlStreamCtxtPtr stream, const xmlChar *name, const xmlChar *ns); XMLPUBFUN int XMLCALL xmlStreamPop (xmlStreamCtxtPtr stream); XMLPUBFUN int XMLCALL xmlStreamWantsAnyNode (xmlStreamCtxtPtr stream); #ifdef __cplusplus } #endif #endif /* LIBXML_PATTERN_ENABLED */ #endif /* __XML_PATTERN_H__ */ libxml2-2.9.1+dfsg1/include/libxml/HTMLtree.h0000644000175000017500000000707612113312342017265 0ustar aronaron/* * Summary: specific APIs to process HTML tree, especially serialization * Description: this module implements a few function needed to process * tree in an HTML specific way. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __HTML_TREE_H__ #define __HTML_TREE_H__ #include #include #include #include #ifdef LIBXML_HTML_ENABLED #ifdef __cplusplus extern "C" { #endif /** * HTML_TEXT_NODE: * * Macro. A text node in a HTML document is really implemented * the same way as a text node in an XML document. */ #define HTML_TEXT_NODE XML_TEXT_NODE /** * HTML_ENTITY_REF_NODE: * * Macro. An entity reference in a HTML document is really implemented * the same way as an entity reference in an XML document. */ #define HTML_ENTITY_REF_NODE XML_ENTITY_REF_NODE /** * HTML_COMMENT_NODE: * * Macro. A comment in a HTML document is really implemented * the same way as a comment in an XML document. */ #define HTML_COMMENT_NODE XML_COMMENT_NODE /** * HTML_PRESERVE_NODE: * * Macro. A preserved node in a HTML document is really implemented * the same way as a CDATA section in an XML document. */ #define HTML_PRESERVE_NODE XML_CDATA_SECTION_NODE /** * HTML_PI_NODE: * * Macro. A processing instruction in a HTML document is really implemented * the same way as a processing instruction in an XML document. */ #define HTML_PI_NODE XML_PI_NODE XMLPUBFUN htmlDocPtr XMLCALL htmlNewDoc (const xmlChar *URI, const xmlChar *ExternalID); XMLPUBFUN htmlDocPtr XMLCALL htmlNewDocNoDtD (const xmlChar *URI, const xmlChar *ExternalID); XMLPUBFUN const xmlChar * XMLCALL htmlGetMetaEncoding (htmlDocPtr doc); XMLPUBFUN int XMLCALL htmlSetMetaEncoding (htmlDocPtr doc, const xmlChar *encoding); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL htmlDocDumpMemory (xmlDocPtr cur, xmlChar **mem, int *size); XMLPUBFUN void XMLCALL htmlDocDumpMemoryFormat (xmlDocPtr cur, xmlChar **mem, int *size, int format); XMLPUBFUN int XMLCALL htmlDocDump (FILE *f, xmlDocPtr cur); XMLPUBFUN int XMLCALL htmlSaveFile (const char *filename, xmlDocPtr cur); XMLPUBFUN int XMLCALL htmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur); XMLPUBFUN void XMLCALL htmlNodeDumpFile (FILE *out, xmlDocPtr doc, xmlNodePtr cur); XMLPUBFUN int XMLCALL htmlNodeDumpFileFormat (FILE *out, xmlDocPtr doc, xmlNodePtr cur, const char *encoding, int format); XMLPUBFUN int XMLCALL htmlSaveFileEnc (const char *filename, xmlDocPtr cur, const char *encoding); XMLPUBFUN int XMLCALL htmlSaveFileFormat (const char *filename, xmlDocPtr cur, const char *encoding, int format); XMLPUBFUN void XMLCALL htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, const char *encoding, int format); XMLPUBFUN void XMLCALL htmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding); XMLPUBFUN void XMLCALL htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding, int format); XMLPUBFUN void XMLCALL htmlNodeDumpOutput (xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, const char *encoding); #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN int XMLCALL htmlIsBooleanAttr (const xmlChar *name); #ifdef __cplusplus } #endif #endif /* LIBXML_HTML_ENABLED */ #endif /* __HTML_TREE_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlwriter.h0000644000175000017500000005142112113312342017667 0ustar aronaron/* * Summary: text writing API for XML * Description: text writing API for XML * * Copy: See Copyright for the status of this software. * * Author: Alfred Mickautsch */ #ifndef __XML_XMLWRITER_H__ #define __XML_XMLWRITER_H__ #include #ifdef LIBXML_WRITER_ENABLED #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct _xmlTextWriter xmlTextWriter; typedef xmlTextWriter *xmlTextWriterPtr; /* * Constructors & Destructor */ XMLPUBFUN xmlTextWriterPtr XMLCALL xmlNewTextWriter(xmlOutputBufferPtr out); XMLPUBFUN xmlTextWriterPtr XMLCALL xmlNewTextWriterFilename(const char *uri, int compression); XMLPUBFUN xmlTextWriterPtr XMLCALL xmlNewTextWriterMemory(xmlBufferPtr buf, int compression); XMLPUBFUN xmlTextWriterPtr XMLCALL xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt, int compression); XMLPUBFUN xmlTextWriterPtr XMLCALL xmlNewTextWriterDoc(xmlDocPtr * doc, int compression); XMLPUBFUN xmlTextWriterPtr XMLCALL xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression); XMLPUBFUN void XMLCALL xmlFreeTextWriter(xmlTextWriterPtr writer); /* * Functions */ /* * Document */ XMLPUBFUN int XMLCALL xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version, const char *encoding, const char *standalone); XMLPUBFUN int XMLCALL xmlTextWriterEndDocument(xmlTextWriterPtr writer); /* * Comments */ XMLPUBFUN int XMLCALL xmlTextWriterStartComment(xmlTextWriterPtr writer); XMLPUBFUN int XMLCALL xmlTextWriterEndComment(xmlTextWriterPtr writer); XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer, const char *format, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(2,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content); /* * Elements */ XMLPUBFUN int XMLCALL xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name); XMLPUBFUN int XMLCALL xmlTextWriterStartElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI); XMLPUBFUN int XMLCALL xmlTextWriterEndElement(xmlTextWriterPtr writer); XMLPUBFUN int XMLCALL xmlTextWriterFullEndElement(xmlTextWriterPtr writer); /* * Elements conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) LIBXML_ATTR_FORMAT(3,4); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(3,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content); XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, ...) LIBXML_ATTR_FORMAT(5,6); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(5,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteElementNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const xmlChar * content); /* * Text */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(2,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content, int len); XMLPUBFUN int XMLCALL xmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content); XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatString(xmlTextWriterPtr writer, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(2,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content); XMLPUBFUN int XMLCALL xmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data, int start, int len); XMLPUBFUN int XMLCALL xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data, int start, int len); /* * Attributes */ XMLPUBFUN int XMLCALL xmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name); XMLPUBFUN int XMLCALL xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI); XMLPUBFUN int XMLCALL xmlTextWriterEndAttribute(xmlTextWriterPtr writer); /* * Attributes conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) LIBXML_ATTR_FORMAT(3,4); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(3,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content); XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, ...) LIBXML_ATTR_FORMAT(5,6); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(5,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer, const xmlChar * prefix, const xmlChar * name, const xmlChar * namespaceURI, const xmlChar * content); /* * PI's */ XMLPUBFUN int XMLCALL xmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target); XMLPUBFUN int XMLCALL xmlTextWriterEndPI(xmlTextWriterPtr writer); /* * PI conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target, const char *format, ...) LIBXML_ATTR_FORMAT(3,4); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer, const xmlChar * target, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(3,0); XMLPUBFUN int XMLCALL xmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target, const xmlChar * content); /** * xmlTextWriterWriteProcessingInstruction: * * This macro maps to xmlTextWriterWritePI */ #define xmlTextWriterWriteProcessingInstruction xmlTextWriterWritePI /* * CDATA */ XMLPUBFUN int XMLCALL xmlTextWriterStartCDATA(xmlTextWriterPtr writer); XMLPUBFUN int XMLCALL xmlTextWriterEndCDATA(xmlTextWriterPtr writer); /* * CDATA conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format, ...) LIBXML_ATTR_FORMAT(2,3); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(2,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content); /* * DTD */ XMLPUBFUN int XMLCALL xmlTextWriterStartDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid); XMLPUBFUN int XMLCALL xmlTextWriterEndDTD(xmlTextWriterPtr writer); /* * DTD conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const char *format, ...) LIBXML_ATTR_FORMAT(5,6); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(5,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteDTD(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * subset); /** * xmlTextWriterWriteDocType: * * this macro maps to xmlTextWriterWriteDTD */ #define xmlTextWriterWriteDocType xmlTextWriterWriteDTD /* * DTD element definition */ XMLPUBFUN int XMLCALL xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name); XMLPUBFUN int XMLCALL xmlTextWriterEndDTDElement(xmlTextWriterPtr writer); /* * DTD element definition conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) LIBXML_ATTR_FORMAT(3,4); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(3,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDElement(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content); /* * DTD attribute list definition */ XMLPUBFUN int XMLCALL xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name); XMLPUBFUN int XMLCALL xmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer); /* * DTD attribute list definition conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name, const char *format, ...) LIBXML_ATTR_FORMAT(3,4); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(3,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * content); /* * DTD entity definition */ XMLPUBFUN int XMLCALL xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name); XMLPUBFUN int XMLCALL xmlTextWriterEndDTDEntity(xmlTextWriterPtr writer); /* * DTD entity definition conveniency functions */ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const char *format, ...) LIBXML_ATTR_FORMAT(4,5); XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const char *format, va_list argptr) LIBXML_ATTR_FORMAT(4,0); XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const xmlChar * content); XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * ndataid); XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * ndataid); XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer, int pe, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid, const xmlChar * ndataid, const xmlChar * content); /* * DTD notation definition */ XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer, const xmlChar * name, const xmlChar * pubid, const xmlChar * sysid); /* * Indentation */ XMLPUBFUN int XMLCALL xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent); XMLPUBFUN int XMLCALL xmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str); XMLPUBFUN int XMLCALL xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar); /* * misc */ XMLPUBFUN int XMLCALL xmlTextWriterFlush(xmlTextWriterPtr writer); #ifdef __cplusplus } #endif #endif /* LIBXML_WRITER_ENABLED */ #endif /* __XML_XMLWRITER_H__ */ libxml2-2.9.1+dfsg1/include/libxml/tree.h0000644000175000017500000011172312113312342016573 0ustar aronaron/* * Summary: interfaces for tree manipulation * Description: this module describes the structures found in an tree resulting * from an XML or HTML parsing, as well as the API provided for * various processing on that tree * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_TREE_H__ #define __XML_TREE_H__ #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Some of the basic types pointer to structures: */ /* xmlIO.h */ typedef struct _xmlParserInputBuffer xmlParserInputBuffer; typedef xmlParserInputBuffer *xmlParserInputBufferPtr; typedef struct _xmlOutputBuffer xmlOutputBuffer; typedef xmlOutputBuffer *xmlOutputBufferPtr; /* parser.h */ typedef struct _xmlParserInput xmlParserInput; typedef xmlParserInput *xmlParserInputPtr; typedef struct _xmlParserCtxt xmlParserCtxt; typedef xmlParserCtxt *xmlParserCtxtPtr; typedef struct _xmlSAXLocator xmlSAXLocator; typedef xmlSAXLocator *xmlSAXLocatorPtr; typedef struct _xmlSAXHandler xmlSAXHandler; typedef xmlSAXHandler *xmlSAXHandlerPtr; /* entities.h */ typedef struct _xmlEntity xmlEntity; typedef xmlEntity *xmlEntityPtr; /** * BASE_BUFFER_SIZE: * * default buffer size 4000. */ #define BASE_BUFFER_SIZE 4096 /** * LIBXML_NAMESPACE_DICT: * * Defines experimental behaviour: * 1) xmlNs gets an additional field @context (a xmlDoc) * 2) when creating a tree, xmlNs->href is stored in the dict of xmlDoc. */ /* #define LIBXML_NAMESPACE_DICT */ /** * xmlBufferAllocationScheme: * * A buffer allocation scheme can be defined to either match exactly the * need or double it's allocated size each time it is found too small. */ typedef enum { XML_BUFFER_ALLOC_DOUBLEIT, /* double each time one need to grow */ XML_BUFFER_ALLOC_EXACT, /* grow only to the minimal size */ XML_BUFFER_ALLOC_IMMUTABLE, /* immutable buffer */ XML_BUFFER_ALLOC_IO, /* special allocation scheme used for I/O */ XML_BUFFER_ALLOC_HYBRID /* exact up to a threshold, and doubleit thereafter */ } xmlBufferAllocationScheme; /** * xmlBuffer: * * A buffer structure, this old construct is limited to 2GB and * is being deprecated, use API with xmlBuf instead */ typedef struct _xmlBuffer xmlBuffer; typedef xmlBuffer *xmlBufferPtr; struct _xmlBuffer { xmlChar *content; /* The buffer content UTF8 */ unsigned int use; /* The buffer size used */ unsigned int size; /* The buffer size */ xmlBufferAllocationScheme alloc; /* The realloc method */ xmlChar *contentIO; /* in IO mode we may have a different base */ }; /** * xmlBuf: * * A buffer structure, new one, the actual structure internals are not public */ typedef struct _xmlBuf xmlBuf; /** * xmlBufPtr: * * A pointer to a buffer structure, the actual structure internals are not * public */ typedef xmlBuf *xmlBufPtr; /* * A few public routines for xmlBuf. As those are expected to be used * mostly internally the bulk of the routines are internal in buf.h */ XMLPUBFUN xmlChar* XMLCALL xmlBufContent (const xmlBufPtr buf); XMLPUBFUN xmlChar* XMLCALL xmlBufEnd (const xmlBufPtr buf); XMLPUBFUN size_t XMLCALL xmlBufUse (const xmlBufPtr buf); XMLPUBFUN size_t XMLCALL xmlBufShrink (xmlBufPtr buf, size_t len); /* * LIBXML2_NEW_BUFFER: * * Macro used to express that the API use the new buffers for * xmlParserInputBuffer and xmlOutputBuffer. The change was * introduced in 2.9.0. */ #define LIBXML2_NEW_BUFFER /** * XML_XML_NAMESPACE: * * This is the namespace for the special xml: prefix predefined in the * XML Namespace specification. */ #define XML_XML_NAMESPACE \ (const xmlChar *) "http://www.w3.org/XML/1998/namespace" /** * XML_XML_ID: * * This is the name for the special xml:id attribute */ #define XML_XML_ID (const xmlChar *) "xml:id" /* * The different element types carried by an XML tree. * * NOTE: This is synchronized with DOM Level1 values * See http://www.w3.org/TR/REC-DOM-Level-1/ * * Actually this had diverged a bit, and now XML_DOCUMENT_TYPE_NODE should * be deprecated to use an XML_DTD_NODE. */ typedef enum { XML_ELEMENT_NODE= 1, XML_ATTRIBUTE_NODE= 2, XML_TEXT_NODE= 3, XML_CDATA_SECTION_NODE= 4, XML_ENTITY_REF_NODE= 5, XML_ENTITY_NODE= 6, XML_PI_NODE= 7, XML_COMMENT_NODE= 8, XML_DOCUMENT_NODE= 9, XML_DOCUMENT_TYPE_NODE= 10, XML_DOCUMENT_FRAG_NODE= 11, XML_NOTATION_NODE= 12, XML_HTML_DOCUMENT_NODE= 13, XML_DTD_NODE= 14, XML_ELEMENT_DECL= 15, XML_ATTRIBUTE_DECL= 16, XML_ENTITY_DECL= 17, XML_NAMESPACE_DECL= 18, XML_XINCLUDE_START= 19, XML_XINCLUDE_END= 20 #ifdef LIBXML_DOCB_ENABLED ,XML_DOCB_DOCUMENT_NODE= 21 #endif } xmlElementType; /** * xmlNotation: * * A DTD Notation definition. */ typedef struct _xmlNotation xmlNotation; typedef xmlNotation *xmlNotationPtr; struct _xmlNotation { const xmlChar *name; /* Notation name */ const xmlChar *PublicID; /* Public identifier, if any */ const xmlChar *SystemID; /* System identifier, if any */ }; /** * xmlAttributeType: * * A DTD Attribute type definition. */ typedef enum { XML_ATTRIBUTE_CDATA = 1, XML_ATTRIBUTE_ID, XML_ATTRIBUTE_IDREF , XML_ATTRIBUTE_IDREFS, XML_ATTRIBUTE_ENTITY, XML_ATTRIBUTE_ENTITIES, XML_ATTRIBUTE_NMTOKEN, XML_ATTRIBUTE_NMTOKENS, XML_ATTRIBUTE_ENUMERATION, XML_ATTRIBUTE_NOTATION } xmlAttributeType; /** * xmlAttributeDefault: * * A DTD Attribute default definition. */ typedef enum { XML_ATTRIBUTE_NONE = 1, XML_ATTRIBUTE_REQUIRED, XML_ATTRIBUTE_IMPLIED, XML_ATTRIBUTE_FIXED } xmlAttributeDefault; /** * xmlEnumeration: * * List structure used when there is an enumeration in DTDs. */ typedef struct _xmlEnumeration xmlEnumeration; typedef xmlEnumeration *xmlEnumerationPtr; struct _xmlEnumeration { struct _xmlEnumeration *next; /* next one */ const xmlChar *name; /* Enumeration name */ }; /** * xmlAttribute: * * An Attribute declaration in a DTD. */ typedef struct _xmlAttribute xmlAttribute; typedef xmlAttribute *xmlAttributePtr; struct _xmlAttribute { void *_private; /* application data */ xmlElementType type; /* XML_ATTRIBUTE_DECL, must be second ! */ const xmlChar *name; /* Attribute name */ struct _xmlNode *children; /* NULL */ struct _xmlNode *last; /* NULL */ struct _xmlDtd *parent; /* -> DTD */ struct _xmlNode *next; /* next sibling link */ struct _xmlNode *prev; /* previous sibling link */ struct _xmlDoc *doc; /* the containing document */ struct _xmlAttribute *nexth; /* next in hash table */ xmlAttributeType atype; /* The attribute type */ xmlAttributeDefault def; /* the default */ const xmlChar *defaultValue; /* or the default value */ xmlEnumerationPtr tree; /* or the enumeration tree if any */ const xmlChar *prefix; /* the namespace prefix if any */ const xmlChar *elem; /* Element holding the attribute */ }; /** * xmlElementContentType: * * Possible definitions of element content types. */ typedef enum { XML_ELEMENT_CONTENT_PCDATA = 1, XML_ELEMENT_CONTENT_ELEMENT, XML_ELEMENT_CONTENT_SEQ, XML_ELEMENT_CONTENT_OR } xmlElementContentType; /** * xmlElementContentOccur: * * Possible definitions of element content occurrences. */ typedef enum { XML_ELEMENT_CONTENT_ONCE = 1, XML_ELEMENT_CONTENT_OPT, XML_ELEMENT_CONTENT_MULT, XML_ELEMENT_CONTENT_PLUS } xmlElementContentOccur; /** * xmlElementContent: * * An XML Element content as stored after parsing an element definition * in a DTD. */ typedef struct _xmlElementContent xmlElementContent; typedef xmlElementContent *xmlElementContentPtr; struct _xmlElementContent { xmlElementContentType type; /* PCDATA, ELEMENT, SEQ or OR */ xmlElementContentOccur ocur; /* ONCE, OPT, MULT or PLUS */ const xmlChar *name; /* Element name */ struct _xmlElementContent *c1; /* first child */ struct _xmlElementContent *c2; /* second child */ struct _xmlElementContent *parent; /* parent */ const xmlChar *prefix; /* Namespace prefix */ }; /** * xmlElementTypeVal: * * The different possibilities for an element content type. */ typedef enum { XML_ELEMENT_TYPE_UNDEFINED = 0, XML_ELEMENT_TYPE_EMPTY = 1, XML_ELEMENT_TYPE_ANY, XML_ELEMENT_TYPE_MIXED, XML_ELEMENT_TYPE_ELEMENT } xmlElementTypeVal; #ifdef __cplusplus } #endif #include #ifdef __cplusplus extern "C" { #endif /** * xmlElement: * * An XML Element declaration from a DTD. */ typedef struct _xmlElement xmlElement; typedef xmlElement *xmlElementPtr; struct _xmlElement { void *_private; /* application data */ xmlElementType type; /* XML_ELEMENT_DECL, must be second ! */ const xmlChar *name; /* Element name */ struct _xmlNode *children; /* NULL */ struct _xmlNode *last; /* NULL */ struct _xmlDtd *parent; /* -> DTD */ struct _xmlNode *next; /* next sibling link */ struct _xmlNode *prev; /* previous sibling link */ struct _xmlDoc *doc; /* the containing document */ xmlElementTypeVal etype; /* The type */ xmlElementContentPtr content; /* the allowed element content */ xmlAttributePtr attributes; /* List of the declared attributes */ const xmlChar *prefix; /* the namespace prefix if any */ #ifdef LIBXML_REGEXP_ENABLED xmlRegexpPtr contModel; /* the validating regexp */ #else void *contModel; #endif }; /** * XML_LOCAL_NAMESPACE: * * A namespace declaration node. */ #define XML_LOCAL_NAMESPACE XML_NAMESPACE_DECL typedef xmlElementType xmlNsType; /** * xmlNs: * * An XML namespace. * Note that prefix == NULL is valid, it defines the default namespace * within the subtree (until overridden). * * xmlNsType is unified with xmlElementType. */ typedef struct _xmlNs xmlNs; typedef xmlNs *xmlNsPtr; struct _xmlNs { struct _xmlNs *next; /* next Ns link for this node */ xmlNsType type; /* global or local */ const xmlChar *href; /* URL for the namespace */ const xmlChar *prefix; /* prefix for the namespace */ void *_private; /* application data */ struct _xmlDoc *context; /* normally an xmlDoc */ }; /** * xmlDtd: * * An XML DTD, as defined by parent link */ struct _xmlNode *next; /* next sibling link */ struct _xmlNode *prev; /* previous sibling link */ struct _xmlDoc *doc; /* the containing document */ /* End of common part */ void *notations; /* Hash table for notations if any */ void *elements; /* Hash table for elements if any */ void *attributes; /* Hash table for attributes if any */ void *entities; /* Hash table for entities if any */ const xmlChar *ExternalID; /* External identifier for PUBLIC DTD */ const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC DTD */ void *pentities; /* Hash table for param entities if any */ }; /** * xmlAttr: * * An attribute on an XML node. */ typedef struct _xmlAttr xmlAttr; typedef xmlAttr *xmlAttrPtr; struct _xmlAttr { void *_private; /* application data */ xmlElementType type; /* XML_ATTRIBUTE_NODE, must be second ! */ const xmlChar *name; /* the name of the property */ struct _xmlNode *children; /* the value of the property */ struct _xmlNode *last; /* NULL */ struct _xmlNode *parent; /* child->parent link */ struct _xmlAttr *next; /* next sibling link */ struct _xmlAttr *prev; /* previous sibling link */ struct _xmlDoc *doc; /* the containing document */ xmlNs *ns; /* pointer to the associated namespace */ xmlAttributeType atype; /* the attribute type if validating */ void *psvi; /* for type/PSVI informations */ }; /** * xmlID: * * An XML ID instance. */ typedef struct _xmlID xmlID; typedef xmlID *xmlIDPtr; struct _xmlID { struct _xmlID *next; /* next ID */ const xmlChar *value; /* The ID name */ xmlAttrPtr attr; /* The attribute holding it */ const xmlChar *name; /* The attribute if attr is not available */ int lineno; /* The line number if attr is not available */ struct _xmlDoc *doc; /* The document holding the ID */ }; /** * xmlRef: * * An XML IDREF instance. */ typedef struct _xmlRef xmlRef; typedef xmlRef *xmlRefPtr; struct _xmlRef { struct _xmlRef *next; /* next Ref */ const xmlChar *value; /* The Ref name */ xmlAttrPtr attr; /* The attribute holding it */ const xmlChar *name; /* The attribute if attr is not available */ int lineno; /* The line number if attr is not available */ }; /** * xmlNode: * * A node in an XML tree. */ typedef struct _xmlNode xmlNode; typedef xmlNode *xmlNodePtr; struct _xmlNode { void *_private; /* application data */ xmlElementType type; /* type number, must be second ! */ const xmlChar *name; /* the name of the node, or the entity */ struct _xmlNode *children; /* parent->childs link */ struct _xmlNode *last; /* last child link */ struct _xmlNode *parent; /* child->parent link */ struct _xmlNode *next; /* next sibling link */ struct _xmlNode *prev; /* previous sibling link */ struct _xmlDoc *doc; /* the containing document */ /* End of common part */ xmlNs *ns; /* pointer to the associated namespace */ xmlChar *content; /* the content */ struct _xmlAttr *properties;/* properties list */ xmlNs *nsDef; /* namespace definitions on this node */ void *psvi; /* for type/PSVI informations */ unsigned short line; /* line number */ unsigned short extra; /* extra data for XPath/XSLT */ }; /** * XML_GET_CONTENT: * * Macro to extract the content pointer of a node. */ #define XML_GET_CONTENT(n) \ ((n)->type == XML_ELEMENT_NODE ? NULL : (n)->content) /** * XML_GET_LINE: * * Macro to extract the line number of an element node. */ #define XML_GET_LINE(n) \ (xmlGetLineNo(n)) /** * xmlDocProperty * * Set of properties of the document as found by the parser * Some of them are linked to similary named xmlParserOption */ typedef enum { XML_DOC_WELLFORMED = 1<<0, /* document is XML well formed */ XML_DOC_NSVALID = 1<<1, /* document is Namespace valid */ XML_DOC_OLD10 = 1<<2, /* parsed with old XML-1.0 parser */ XML_DOC_DTDVALID = 1<<3, /* DTD validation was successful */ XML_DOC_XINCLUDE = 1<<4, /* XInclude substitution was done */ XML_DOC_USERBUILT = 1<<5, /* Document was built using the API and not by parsing an instance */ XML_DOC_INTERNAL = 1<<6, /* built for internal processing */ XML_DOC_HTML = 1<<7 /* parsed or built HTML document */ } xmlDocProperties; /** * xmlDoc: * * An XML document. */ typedef struct _xmlDoc xmlDoc; typedef xmlDoc *xmlDocPtr; struct _xmlDoc { void *_private; /* application data */ xmlElementType type; /* XML_DOCUMENT_NODE, must be second ! */ char *name; /* name/filename/URI of the document */ struct _xmlNode *children; /* the document tree */ struct _xmlNode *last; /* last child link */ struct _xmlNode *parent; /* child->parent link */ struct _xmlNode *next; /* next sibling link */ struct _xmlNode *prev; /* previous sibling link */ struct _xmlDoc *doc; /* autoreference to itself */ /* End of common part */ int compression;/* level of zlib compression */ int standalone; /* standalone document (no external refs) 1 if standalone="yes" 0 if standalone="no" -1 if there is no XML declaration -2 if there is an XML declaration, but no standalone attribute was specified */ struct _xmlDtd *intSubset; /* the document internal subset */ struct _xmlDtd *extSubset; /* the document external subset */ struct _xmlNs *oldNs; /* Global namespace, the old way */ const xmlChar *version; /* the XML version string */ const xmlChar *encoding; /* external initial encoding, if any */ void *ids; /* Hash table for ID attributes if any */ void *refs; /* Hash table for IDREFs attributes if any */ const xmlChar *URL; /* The URI for that document */ int charset; /* encoding of the in-memory content actually an xmlCharEncoding */ struct _xmlDict *dict; /* dict used to allocate names or NULL */ void *psvi; /* for type/PSVI informations */ int parseFlags; /* set of xmlParserOption used to parse the document */ int properties; /* set of xmlDocProperties for this document set at the end of parsing */ }; typedef struct _xmlDOMWrapCtxt xmlDOMWrapCtxt; typedef xmlDOMWrapCtxt *xmlDOMWrapCtxtPtr; /** * xmlDOMWrapAcquireNsFunction: * @ctxt: a DOM wrapper context * @node: the context node (element or attribute) * @nsName: the requested namespace name * @nsPrefix: the requested namespace prefix * * A function called to acquire namespaces (xmlNs) from the wrapper. * * Returns an xmlNsPtr or NULL in case of an error. */ typedef xmlNsPtr (*xmlDOMWrapAcquireNsFunction) (xmlDOMWrapCtxtPtr ctxt, xmlNodePtr node, const xmlChar *nsName, const xmlChar *nsPrefix); /** * xmlDOMWrapCtxt: * * Context for DOM wrapper-operations. */ struct _xmlDOMWrapCtxt { void * _private; /* * The type of this context, just in case we need specialized * contexts in the future. */ int type; /* * Internal namespace map used for various operations. */ void * namespaceMap; /* * Use this one to acquire an xmlNsPtr intended for node->ns. * (Note that this is not intended for elem->nsDef). */ xmlDOMWrapAcquireNsFunction getNsForNodeFunc; }; /** * xmlChildrenNode: * * Macro for compatibility naming layer with libxml1. Maps * to "children." */ #ifndef xmlChildrenNode #define xmlChildrenNode children #endif /** * xmlRootNode: * * Macro for compatibility naming layer with libxml1. Maps * to "children". */ #ifndef xmlRootNode #define xmlRootNode children #endif /* * Variables. */ /* * Some helper functions */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) XMLPUBFUN int XMLCALL xmlValidateNCName (const xmlChar *value, int space); #endif #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN int XMLCALL xmlValidateQName (const xmlChar *value, int space); XMLPUBFUN int XMLCALL xmlValidateName (const xmlChar *value, int space); XMLPUBFUN int XMLCALL xmlValidateNMToken (const xmlChar *value, int space); #endif XMLPUBFUN xmlChar * XMLCALL xmlBuildQName (const xmlChar *ncname, const xmlChar *prefix, xmlChar *memory, int len); XMLPUBFUN xmlChar * XMLCALL xmlSplitQName2 (const xmlChar *name, xmlChar **prefix); XMLPUBFUN const xmlChar * XMLCALL xmlSplitQName3 (const xmlChar *name, int *len); /* * Handling Buffers, the old ones see @xmlBuf for the new ones. */ XMLPUBFUN void XMLCALL xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme); XMLPUBFUN xmlBufferAllocationScheme XMLCALL xmlGetBufferAllocationScheme(void); XMLPUBFUN xmlBufferPtr XMLCALL xmlBufferCreate (void); XMLPUBFUN xmlBufferPtr XMLCALL xmlBufferCreateSize (size_t size); XMLPUBFUN xmlBufferPtr XMLCALL xmlBufferCreateStatic (void *mem, size_t size); XMLPUBFUN int XMLCALL xmlBufferResize (xmlBufferPtr buf, unsigned int size); XMLPUBFUN void XMLCALL xmlBufferFree (xmlBufferPtr buf); XMLPUBFUN int XMLCALL xmlBufferDump (FILE *file, xmlBufferPtr buf); XMLPUBFUN int XMLCALL xmlBufferAdd (xmlBufferPtr buf, const xmlChar *str, int len); XMLPUBFUN int XMLCALL xmlBufferAddHead (xmlBufferPtr buf, const xmlChar *str, int len); XMLPUBFUN int XMLCALL xmlBufferCat (xmlBufferPtr buf, const xmlChar *str); XMLPUBFUN int XMLCALL xmlBufferCCat (xmlBufferPtr buf, const char *str); XMLPUBFUN int XMLCALL xmlBufferShrink (xmlBufferPtr buf, unsigned int len); XMLPUBFUN int XMLCALL xmlBufferGrow (xmlBufferPtr buf, unsigned int len); XMLPUBFUN void XMLCALL xmlBufferEmpty (xmlBufferPtr buf); XMLPUBFUN const xmlChar* XMLCALL xmlBufferContent (const xmlBufferPtr buf); XMLPUBFUN xmlChar* XMLCALL xmlBufferDetach (xmlBufferPtr buf); XMLPUBFUN void XMLCALL xmlBufferSetAllocationScheme(xmlBufferPtr buf, xmlBufferAllocationScheme scheme); XMLPUBFUN int XMLCALL xmlBufferLength (const xmlBufferPtr buf); /* * Creating/freeing new structures. */ XMLPUBFUN xmlDtdPtr XMLCALL xmlCreateIntSubset (xmlDocPtr doc, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN xmlDtdPtr XMLCALL xmlNewDtd (xmlDocPtr doc, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN xmlDtdPtr XMLCALL xmlGetIntSubset (xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlFreeDtd (xmlDtdPtr cur); #ifdef LIBXML_LEGACY_ENABLED XMLPUBFUN xmlNsPtr XMLCALL xmlNewGlobalNs (xmlDocPtr doc, const xmlChar *href, const xmlChar *prefix); #endif /* LIBXML_LEGACY_ENABLED */ XMLPUBFUN xmlNsPtr XMLCALL xmlNewNs (xmlNodePtr node, const xmlChar *href, const xmlChar *prefix); XMLPUBFUN void XMLCALL xmlFreeNs (xmlNsPtr cur); XMLPUBFUN void XMLCALL xmlFreeNsList (xmlNsPtr cur); XMLPUBFUN xmlDocPtr XMLCALL xmlNewDoc (const xmlChar *version); XMLPUBFUN void XMLCALL xmlFreeDoc (xmlDocPtr cur); XMLPUBFUN xmlAttrPtr XMLCALL xmlNewDocProp (xmlDocPtr doc, const xmlChar *name, const xmlChar *value); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN xmlAttrPtr XMLCALL xmlNewProp (xmlNodePtr node, const xmlChar *name, const xmlChar *value); #endif XMLPUBFUN xmlAttrPtr XMLCALL xmlNewNsProp (xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, const xmlChar *value); XMLPUBFUN xmlAttrPtr XMLCALL xmlNewNsPropEatName (xmlNodePtr node, xmlNsPtr ns, xmlChar *name, const xmlChar *value); XMLPUBFUN void XMLCALL xmlFreePropList (xmlAttrPtr cur); XMLPUBFUN void XMLCALL xmlFreeProp (xmlAttrPtr cur); XMLPUBFUN xmlAttrPtr XMLCALL xmlCopyProp (xmlNodePtr target, xmlAttrPtr cur); XMLPUBFUN xmlAttrPtr XMLCALL xmlCopyPropList (xmlNodePtr target, xmlAttrPtr cur); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlDtdPtr XMLCALL xmlCopyDtd (xmlDtdPtr dtd); #endif /* LIBXML_TREE_ENABLED */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN xmlDocPtr XMLCALL xmlCopyDoc (xmlDocPtr doc, int recursive); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ /* * Creating new nodes. */ XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocNode (xmlDocPtr doc, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocNodeEatName (xmlDocPtr doc, xmlNsPtr ns, xmlChar *name, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewNode (xmlNsPtr ns, const xmlChar *name); XMLPUBFUN xmlNodePtr XMLCALL xmlNewNodeEatName (xmlNsPtr ns, xmlChar *name); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN xmlNodePtr XMLCALL xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); #endif XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocText (xmlDocPtr doc, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewText (const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocPI (xmlDocPtr doc, const xmlChar *name, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewPI (const xmlChar *name, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocTextLen (xmlDocPtr doc, const xmlChar *content, int len); XMLPUBFUN xmlNodePtr XMLCALL xmlNewTextLen (const xmlChar *content, int len); XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocComment (xmlDocPtr doc, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewComment (const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewCDataBlock (xmlDocPtr doc, const xmlChar *content, int len); XMLPUBFUN xmlNodePtr XMLCALL xmlNewCharRef (xmlDocPtr doc, const xmlChar *name); XMLPUBFUN xmlNodePtr XMLCALL xmlNewReference (xmlDocPtr doc, const xmlChar *name); XMLPUBFUN xmlNodePtr XMLCALL xmlCopyNode (const xmlNodePtr node, int recursive); XMLPUBFUN xmlNodePtr XMLCALL xmlDocCopyNode (const xmlNodePtr node, xmlDocPtr doc, int recursive); XMLPUBFUN xmlNodePtr XMLCALL xmlDocCopyNodeList (xmlDocPtr doc, const xmlNodePtr node); XMLPUBFUN xmlNodePtr XMLCALL xmlCopyNodeList (const xmlNodePtr node); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlNodePtr XMLCALL xmlNewTextChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocRawNode (xmlDocPtr doc, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocFragment (xmlDocPtr doc); #endif /* LIBXML_TREE_ENABLED */ /* * Navigating. */ XMLPUBFUN long XMLCALL xmlGetLineNo (xmlNodePtr node); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) XMLPUBFUN xmlChar * XMLCALL xmlGetNodePath (xmlNodePtr node); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) */ XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement (xmlDocPtr doc); XMLPUBFUN xmlNodePtr XMLCALL xmlGetLastChild (xmlNodePtr parent); XMLPUBFUN int XMLCALL xmlNodeIsText (xmlNodePtr node); XMLPUBFUN int XMLCALL xmlIsBlankNode (xmlNodePtr node); /* * Changing the structure. */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) XMLPUBFUN xmlNodePtr XMLCALL xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ #ifdef LIBXML_TREE_ENABLED XMLPUBFUN void XMLCALL xmlNodeSetName (xmlNodePtr cur, const xmlChar *name); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN xmlNodePtr XMLCALL xmlAddChild (xmlNodePtr parent, xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlAddChildList (xmlNodePtr parent, xmlNodePtr cur); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) XMLPUBFUN xmlNodePtr XMLCALL xmlReplaceNode (xmlNodePtr old, xmlNodePtr cur); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN xmlNodePtr XMLCALL xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem); #endif /* LIBXML_TREE_ENABLED || LIBXML_HTML_ENABLED || LIBXML_SCHEMAS_ENABLED */ XMLPUBFUN xmlNodePtr XMLCALL xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem); XMLPUBFUN xmlNodePtr XMLCALL xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem); XMLPUBFUN void XMLCALL xmlUnlinkNode (xmlNodePtr cur); XMLPUBFUN xmlNodePtr XMLCALL xmlTextMerge (xmlNodePtr first, xmlNodePtr second); XMLPUBFUN int XMLCALL xmlTextConcat (xmlNodePtr node, const xmlChar *content, int len); XMLPUBFUN void XMLCALL xmlFreeNodeList (xmlNodePtr cur); XMLPUBFUN void XMLCALL xmlFreeNode (xmlNodePtr cur); XMLPUBFUN void XMLCALL xmlSetTreeDoc (xmlNodePtr tree, xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlSetListDoc (xmlNodePtr list, xmlDocPtr doc); /* * Namespaces. */ XMLPUBFUN xmlNsPtr XMLCALL xmlSearchNs (xmlDocPtr doc, xmlNodePtr node, const xmlChar *nameSpace); XMLPUBFUN xmlNsPtr XMLCALL xmlSearchNsByHref (xmlDocPtr doc, xmlNodePtr node, const xmlChar *href); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN xmlNsPtr * XMLCALL xmlGetNsList (xmlDocPtr doc, xmlNodePtr node); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) */ XMLPUBFUN void XMLCALL xmlSetNs (xmlNodePtr node, xmlNsPtr ns); XMLPUBFUN xmlNsPtr XMLCALL xmlCopyNamespace (xmlNsPtr cur); XMLPUBFUN xmlNsPtr XMLCALL xmlCopyNamespaceList (xmlNsPtr cur); /* * Changing the content. */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) XMLPUBFUN xmlAttrPtr XMLCALL xmlSetProp (xmlNodePtr node, const xmlChar *name, const xmlChar *value); XMLPUBFUN xmlAttrPtr XMLCALL xmlSetNsProp (xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, const xmlChar *value); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) */ XMLPUBFUN xmlChar * XMLCALL xmlGetNoNsProp (xmlNodePtr node, const xmlChar *name); XMLPUBFUN xmlChar * XMLCALL xmlGetProp (xmlNodePtr node, const xmlChar *name); XMLPUBFUN xmlAttrPtr XMLCALL xmlHasProp (xmlNodePtr node, const xmlChar *name); XMLPUBFUN xmlAttrPtr XMLCALL xmlHasNsProp (xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace); XMLPUBFUN xmlChar * XMLCALL xmlGetNsProp (xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace); XMLPUBFUN xmlNodePtr XMLCALL xmlStringGetNodeList (xmlDocPtr doc, const xmlChar *value); XMLPUBFUN xmlNodePtr XMLCALL xmlStringLenGetNodeList (xmlDocPtr doc, const xmlChar *value, int len); XMLPUBFUN xmlChar * XMLCALL xmlNodeListGetString (xmlDocPtr doc, xmlNodePtr list, int inLine); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlChar * XMLCALL xmlNodeListGetRawString (xmlDocPtr doc, xmlNodePtr list, int inLine); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN void XMLCALL xmlNodeSetContent (xmlNodePtr cur, const xmlChar *content); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN void XMLCALL xmlNodeSetContentLen (xmlNodePtr cur, const xmlChar *content, int len); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN void XMLCALL xmlNodeAddContent (xmlNodePtr cur, const xmlChar *content); XMLPUBFUN void XMLCALL xmlNodeAddContentLen (xmlNodePtr cur, const xmlChar *content, int len); XMLPUBFUN xmlChar * XMLCALL xmlNodeGetContent (xmlNodePtr cur); XMLPUBFUN int XMLCALL xmlNodeBufGetContent (xmlBufferPtr buffer, xmlNodePtr cur); XMLPUBFUN int XMLCALL xmlBufGetNodeContent (xmlBufPtr buf, xmlNodePtr cur); XMLPUBFUN xmlChar * XMLCALL xmlNodeGetLang (xmlNodePtr cur); XMLPUBFUN int XMLCALL xmlNodeGetSpacePreserve (xmlNodePtr cur); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN void XMLCALL xmlNodeSetLang (xmlNodePtr cur, const xmlChar *lang); XMLPUBFUN void XMLCALL xmlNodeSetSpacePreserve (xmlNodePtr cur, int val); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN xmlChar * XMLCALL xmlNodeGetBase (xmlDocPtr doc, xmlNodePtr cur); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) XMLPUBFUN void XMLCALL xmlNodeSetBase (xmlNodePtr cur, const xmlChar *uri); #endif /* * Removing content. */ XMLPUBFUN int XMLCALL xmlRemoveProp (xmlAttrPtr cur); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN int XMLCALL xmlUnsetNsProp (xmlNodePtr node, xmlNsPtr ns, const xmlChar *name); XMLPUBFUN int XMLCALL xmlUnsetProp (xmlNodePtr node, const xmlChar *name); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ /* * Internal, don't use. */ XMLPUBFUN void XMLCALL xmlBufferWriteCHAR (xmlBufferPtr buf, const xmlChar *string); XMLPUBFUN void XMLCALL xmlBufferWriteChar (xmlBufferPtr buf, const char *string); XMLPUBFUN void XMLCALL xmlBufferWriteQuotedString(xmlBufferPtr buf, const xmlChar *string); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void xmlAttrSerializeTxtContent(xmlBufferPtr buf, xmlDocPtr doc, xmlAttrPtr attr, const xmlChar *string); #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef LIBXML_TREE_ENABLED /* * Namespace handling. */ XMLPUBFUN int XMLCALL xmlReconciliateNs (xmlDocPtr doc, xmlNodePtr tree); #endif #ifdef LIBXML_OUTPUT_ENABLED /* * Saving. */ XMLPUBFUN void XMLCALL xmlDocDumpFormatMemory (xmlDocPtr cur, xmlChar **mem, int *size, int format); XMLPUBFUN void XMLCALL xmlDocDumpMemory (xmlDocPtr cur, xmlChar **mem, int *size); XMLPUBFUN void XMLCALL xmlDocDumpMemoryEnc (xmlDocPtr out_doc, xmlChar **doc_txt_ptr, int * doc_txt_len, const char *txt_encoding); XMLPUBFUN void XMLCALL xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, int * doc_txt_len, const char *txt_encoding, int format); XMLPUBFUN int XMLCALL xmlDocFormatDump (FILE *f, xmlDocPtr cur, int format); XMLPUBFUN int XMLCALL xmlDocDump (FILE *f, xmlDocPtr cur); XMLPUBFUN void XMLCALL xmlElemDump (FILE *f, xmlDocPtr doc, xmlNodePtr cur); XMLPUBFUN int XMLCALL xmlSaveFile (const char *filename, xmlDocPtr cur); XMLPUBFUN int XMLCALL xmlSaveFormatFile (const char *filename, xmlDocPtr cur, int format); XMLPUBFUN size_t XMLCALL xmlBufNodeDump (xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format); XMLPUBFUN int XMLCALL xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format); XMLPUBFUN int XMLCALL xmlSaveFileTo (xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding); XMLPUBFUN int XMLCALL xmlSaveFormatFileTo (xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding, int format); XMLPUBFUN void XMLCALL xmlNodeDumpOutput (xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format, const char *encoding); XMLPUBFUN int XMLCALL xmlSaveFormatFileEnc (const char *filename, xmlDocPtr cur, const char *encoding, int format); XMLPUBFUN int XMLCALL xmlSaveFileEnc (const char *filename, xmlDocPtr cur, const char *encoding); #endif /* LIBXML_OUTPUT_ENABLED */ /* * XHTML */ XMLPUBFUN int XMLCALL xmlIsXHTML (const xmlChar *systemID, const xmlChar *publicID); /* * Compression. */ XMLPUBFUN int XMLCALL xmlGetDocCompressMode (xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlSetDocCompressMode (xmlDocPtr doc, int mode); XMLPUBFUN int XMLCALL xmlGetCompressMode (void); XMLPUBFUN void XMLCALL xmlSetCompressMode (int mode); /* * DOM-wrapper helper functions. */ XMLPUBFUN xmlDOMWrapCtxtPtr XMLCALL xmlDOMWrapNewCtxt (void); XMLPUBFUN void XMLCALL xmlDOMWrapFreeCtxt (xmlDOMWrapCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt, xmlNodePtr elem, int options); XMLPUBFUN int XMLCALL xmlDOMWrapAdoptNode (xmlDOMWrapCtxtPtr ctxt, xmlDocPtr sourceDoc, xmlNodePtr node, xmlDocPtr destDoc, xmlNodePtr destParent, int options); XMLPUBFUN int XMLCALL xmlDOMWrapRemoveNode (xmlDOMWrapCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr node, int options); XMLPUBFUN int XMLCALL xmlDOMWrapCloneNode (xmlDOMWrapCtxtPtr ctxt, xmlDocPtr sourceDoc, xmlNodePtr node, xmlNodePtr *clonedNode, xmlDocPtr destDoc, xmlNodePtr destParent, int deep, int options); #ifdef LIBXML_TREE_ENABLED /* * 5 interfaces from DOM ElementTraversal, but different in entities * traversal. */ XMLPUBFUN unsigned long XMLCALL xmlChildElementCount (xmlNodePtr parent); XMLPUBFUN xmlNodePtr XMLCALL xmlNextElementSibling (xmlNodePtr node); XMLPUBFUN xmlNodePtr XMLCALL xmlFirstElementChild (xmlNodePtr parent); XMLPUBFUN xmlNodePtr XMLCALL xmlLastElementChild (xmlNodePtr parent); XMLPUBFUN xmlNodePtr XMLCALL xmlPreviousElementSibling (xmlNodePtr node); #endif #ifdef __cplusplus } #endif #ifndef __XML_PARSER_H__ #include #endif #endif /* __XML_TREE_H__ */ libxml2-2.9.1+dfsg1/include/libxml/valid.h0000644000175000017500000003246612113312342016741 0ustar aronaron/* * Summary: The DTD validation * Description: API for the DTD handling and the validity checking * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_VALID_H__ #define __XML_VALID_H__ #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Validation state added for non-determinist content model. */ typedef struct _xmlValidState xmlValidState; typedef xmlValidState *xmlValidStatePtr; /** * xmlValidityErrorFunc: * @ctx: usually an xmlValidCtxtPtr to a validity error context, * but comes from ctxt->userData (which normally contains such * a pointer); ctxt->userData can be changed by the user. * @msg: the string to format *printf like vararg * @...: remaining arguments to the format * * Callback called when a validity error is found. This is a message * oriented function similar to an *printf function. */ typedef void (XMLCDECL *xmlValidityErrorFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * xmlValidityWarningFunc: * @ctx: usually an xmlValidCtxtPtr to a validity error context, * but comes from ctxt->userData (which normally contains such * a pointer); ctxt->userData can be changed by the user. * @msg: the string to format *printf like vararg * @...: remaining arguments to the format * * Callback called when a validity warning is found. This is a message * oriented function similar to an *printf function. */ typedef void (XMLCDECL *xmlValidityWarningFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); #ifdef IN_LIBXML /** * XML_CTXT_FINISH_DTD_0: * * Special value for finishDtd field when embedded in an xmlParserCtxt */ #define XML_CTXT_FINISH_DTD_0 0xabcd1234 /** * XML_CTXT_FINISH_DTD_1: * * Special value for finishDtd field when embedded in an xmlParserCtxt */ #define XML_CTXT_FINISH_DTD_1 0xabcd1235 #endif /* * xmlValidCtxt: * An xmlValidCtxt is used for error reporting when validating. */ typedef struct _xmlValidCtxt xmlValidCtxt; typedef xmlValidCtxt *xmlValidCtxtPtr; struct _xmlValidCtxt { void *userData; /* user specific data block */ xmlValidityErrorFunc error; /* the callback in case of errors */ xmlValidityWarningFunc warning; /* the callback in case of warning */ /* Node analysis stack used when validating within entities */ xmlNodePtr node; /* Current parsed Node */ int nodeNr; /* Depth of the parsing stack */ int nodeMax; /* Max depth of the parsing stack */ xmlNodePtr *nodeTab; /* array of nodes */ unsigned int finishDtd; /* finished validating the Dtd ? */ xmlDocPtr doc; /* the document */ int valid; /* temporary validity check result */ /* state state used for non-determinist content validation */ xmlValidState *vstate; /* current state */ int vstateNr; /* Depth of the validation stack */ int vstateMax; /* Max depth of the validation stack */ xmlValidState *vstateTab; /* array of validation states */ #ifdef LIBXML_REGEXP_ENABLED xmlAutomataPtr am; /* the automata */ xmlAutomataStatePtr state; /* used to build the automata */ #else void *am; void *state; #endif }; /* * ALL notation declarations are stored in a table. * There is one table per DTD. */ typedef struct _xmlHashTable xmlNotationTable; typedef xmlNotationTable *xmlNotationTablePtr; /* * ALL element declarations are stored in a table. * There is one table per DTD. */ typedef struct _xmlHashTable xmlElementTable; typedef xmlElementTable *xmlElementTablePtr; /* * ALL attribute declarations are stored in a table. * There is one table per DTD. */ typedef struct _xmlHashTable xmlAttributeTable; typedef xmlAttributeTable *xmlAttributeTablePtr; /* * ALL IDs attributes are stored in a table. * There is one table per document. */ typedef struct _xmlHashTable xmlIDTable; typedef xmlIDTable *xmlIDTablePtr; /* * ALL Refs attributes are stored in a table. * There is one table per document. */ typedef struct _xmlHashTable xmlRefTable; typedef xmlRefTable *xmlRefTablePtr; /* Notation */ XMLPUBFUN xmlNotationPtr XMLCALL xmlAddNotationDecl (xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name, const xmlChar *PublicID, const xmlChar *SystemID); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlNotationTablePtr XMLCALL xmlCopyNotationTable (xmlNotationTablePtr table); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN void XMLCALL xmlFreeNotationTable (xmlNotationTablePtr table); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlDumpNotationDecl (xmlBufferPtr buf, xmlNotationPtr nota); XMLPUBFUN void XMLCALL xmlDumpNotationTable (xmlBufferPtr buf, xmlNotationTablePtr table); #endif /* LIBXML_OUTPUT_ENABLED */ /* Element Content */ /* the non Doc version are being deprecated */ XMLPUBFUN xmlElementContentPtr XMLCALL xmlNewElementContent (const xmlChar *name, xmlElementContentType type); XMLPUBFUN xmlElementContentPtr XMLCALL xmlCopyElementContent (xmlElementContentPtr content); XMLPUBFUN void XMLCALL xmlFreeElementContent (xmlElementContentPtr cur); /* the new versions with doc argument */ XMLPUBFUN xmlElementContentPtr XMLCALL xmlNewDocElementContent (xmlDocPtr doc, const xmlChar *name, xmlElementContentType type); XMLPUBFUN xmlElementContentPtr XMLCALL xmlCopyDocElementContent(xmlDocPtr doc, xmlElementContentPtr content); XMLPUBFUN void XMLCALL xmlFreeDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur); XMLPUBFUN void XMLCALL xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int englob); #ifdef LIBXML_OUTPUT_ENABLED /* DEPRECATED */ XMLPUBFUN void XMLCALL xmlSprintfElementContent(char *buf, xmlElementContentPtr content, int englob); #endif /* LIBXML_OUTPUT_ENABLED */ /* DEPRECATED */ /* Element */ XMLPUBFUN xmlElementPtr XMLCALL xmlAddElementDecl (xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name, xmlElementTypeVal type, xmlElementContentPtr content); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlElementTablePtr XMLCALL xmlCopyElementTable (xmlElementTablePtr table); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN void XMLCALL xmlFreeElementTable (xmlElementTablePtr table); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlDumpElementTable (xmlBufferPtr buf, xmlElementTablePtr table); XMLPUBFUN void XMLCALL xmlDumpElementDecl (xmlBufferPtr buf, xmlElementPtr elem); #endif /* LIBXML_OUTPUT_ENABLED */ /* Enumeration */ XMLPUBFUN xmlEnumerationPtr XMLCALL xmlCreateEnumeration (const xmlChar *name); XMLPUBFUN void XMLCALL xmlFreeEnumeration (xmlEnumerationPtr cur); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlEnumerationPtr XMLCALL xmlCopyEnumeration (xmlEnumerationPtr cur); #endif /* LIBXML_TREE_ENABLED */ /* Attribute */ XMLPUBFUN xmlAttributePtr XMLCALL xmlAddAttributeDecl (xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name, const xmlChar *ns, xmlAttributeType type, xmlAttributeDefault def, const xmlChar *defaultValue, xmlEnumerationPtr tree); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlAttributeTablePtr XMLCALL xmlCopyAttributeTable (xmlAttributeTablePtr table); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN void XMLCALL xmlFreeAttributeTable (xmlAttributeTablePtr table); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlDumpAttributeTable (xmlBufferPtr buf, xmlAttributeTablePtr table); XMLPUBFUN void XMLCALL xmlDumpAttributeDecl (xmlBufferPtr buf, xmlAttributePtr attr); #endif /* LIBXML_OUTPUT_ENABLED */ /* IDs */ XMLPUBFUN xmlIDPtr XMLCALL xmlAddID (xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, xmlAttrPtr attr); XMLPUBFUN void XMLCALL xmlFreeIDTable (xmlIDTablePtr table); XMLPUBFUN xmlAttrPtr XMLCALL xmlGetID (xmlDocPtr doc, const xmlChar *ID); XMLPUBFUN int XMLCALL xmlIsID (xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr); XMLPUBFUN int XMLCALL xmlRemoveID (xmlDocPtr doc, xmlAttrPtr attr); /* IDREFs */ XMLPUBFUN xmlRefPtr XMLCALL xmlAddRef (xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, xmlAttrPtr attr); XMLPUBFUN void XMLCALL xmlFreeRefTable (xmlRefTablePtr table); XMLPUBFUN int XMLCALL xmlIsRef (xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr); XMLPUBFUN int XMLCALL xmlRemoveRef (xmlDocPtr doc, xmlAttrPtr attr); XMLPUBFUN xmlListPtr XMLCALL xmlGetRefs (xmlDocPtr doc, const xmlChar *ID); /** * The public function calls related to validity checking. */ #ifdef LIBXML_VALID_ENABLED /* Allocate/Release Validation Contexts */ XMLPUBFUN xmlValidCtxtPtr XMLCALL xmlNewValidCtxt(void); XMLPUBFUN void XMLCALL xmlFreeValidCtxt(xmlValidCtxtPtr); XMLPUBFUN int XMLCALL xmlValidateRoot (xmlValidCtxtPtr ctxt, xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlValidateElementDecl (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlElementPtr elem); XMLPUBFUN xmlChar * XMLCALL xmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, const xmlChar *name, const xmlChar *value); XMLPUBFUN xmlChar * XMLCALL xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, const xmlChar *name, const xmlChar *value); XMLPUBFUN int XMLCALL xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlAttributePtr attr); XMLPUBFUN int XMLCALL xmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value); XMLPUBFUN int XMLCALL xmlValidateNotationDecl (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNotationPtr nota); XMLPUBFUN int XMLCALL xmlValidateDtd (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlDtdPtr dtd); XMLPUBFUN int XMLCALL xmlValidateDtdFinal (xmlValidCtxtPtr ctxt, xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlValidateDocument (xmlValidCtxtPtr ctxt, xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlValidateElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem); XMLPUBFUN int XMLCALL xmlValidateOneElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem); XMLPUBFUN int XMLCALL xmlValidateOneAttribute (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr, const xmlChar *value); XMLPUBFUN int XMLCALL xmlValidateOneNamespace (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value); XMLPUBFUN int XMLCALL xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc); #endif /* LIBXML_VALID_ENABLED */ #if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) XMLPUBFUN int XMLCALL xmlValidateNotationUse (xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *notationName); #endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ XMLPUBFUN int XMLCALL xmlIsMixedElement (xmlDocPtr doc, const xmlChar *name); XMLPUBFUN xmlAttributePtr XMLCALL xmlGetDtdAttrDesc (xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name); XMLPUBFUN xmlAttributePtr XMLCALL xmlGetDtdQAttrDesc (xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name, const xmlChar *prefix); XMLPUBFUN xmlNotationPtr XMLCALL xmlGetDtdNotationDesc (xmlDtdPtr dtd, const xmlChar *name); XMLPUBFUN xmlElementPtr XMLCALL xmlGetDtdQElementDesc (xmlDtdPtr dtd, const xmlChar *name, const xmlChar *prefix); XMLPUBFUN xmlElementPtr XMLCALL xmlGetDtdElementDesc (xmlDtdPtr dtd, const xmlChar *name); #ifdef LIBXML_VALID_ENABLED XMLPUBFUN int XMLCALL xmlValidGetPotentialChildren(xmlElementContent *ctree, const xmlChar **names, int *len, int max); XMLPUBFUN int XMLCALL xmlValidGetValidElements(xmlNode *prev, xmlNode *next, const xmlChar **names, int max); XMLPUBFUN int XMLCALL xmlValidateNameValue (const xmlChar *value); XMLPUBFUN int XMLCALL xmlValidateNamesValue (const xmlChar *value); XMLPUBFUN int XMLCALL xmlValidateNmtokenValue (const xmlChar *value); XMLPUBFUN int XMLCALL xmlValidateNmtokensValue(const xmlChar *value); #ifdef LIBXML_REGEXP_ENABLED /* * Validation based on the regexp support */ XMLPUBFUN int XMLCALL xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem); XMLPUBFUN int XMLCALL xmlValidatePushElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, const xmlChar *qname); XMLPUBFUN int XMLCALL xmlValidatePushCData (xmlValidCtxtPtr ctxt, const xmlChar *data, int len); XMLPUBFUN int XMLCALL xmlValidatePopElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, const xmlChar *qname); #endif /* LIBXML_REGEXP_ENABLED */ #endif /* LIBXML_VALID_ENABLED */ #ifdef __cplusplus } #endif #endif /* __XML_VALID_H__ */ libxml2-2.9.1+dfsg1/include/libxml/HTMLparser.h0000644000175000017500000002226612113312342017620 0ustar aronaron/* * Summary: interface for an HTML 4.0 non-verifying parser * Description: this module implements an HTML 4.0 non-verifying parser * with API compatible with the XML parser ones. It should * be able to parse "real world" HTML, even if severely * broken from a specification point of view. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __HTML_PARSER_H__ #define __HTML_PARSER_H__ #include #include #ifdef LIBXML_HTML_ENABLED #ifdef __cplusplus extern "C" { #endif /* * Most of the back-end structures from XML and HTML are shared. */ typedef xmlParserCtxt htmlParserCtxt; typedef xmlParserCtxtPtr htmlParserCtxtPtr; typedef xmlParserNodeInfo htmlParserNodeInfo; typedef xmlSAXHandler htmlSAXHandler; typedef xmlSAXHandlerPtr htmlSAXHandlerPtr; typedef xmlParserInput htmlParserInput; typedef xmlParserInputPtr htmlParserInputPtr; typedef xmlDocPtr htmlDocPtr; typedef xmlNodePtr htmlNodePtr; /* * Internal description of an HTML element, representing HTML 4.01 * and XHTML 1.0 (which share the same structure). */ typedef struct _htmlElemDesc htmlElemDesc; typedef htmlElemDesc *htmlElemDescPtr; struct _htmlElemDesc { const char *name; /* The tag name */ char startTag; /* Whether the start tag can be implied */ char endTag; /* Whether the end tag can be implied */ char saveEndTag; /* Whether the end tag should be saved */ char empty; /* Is this an empty element ? */ char depr; /* Is this a deprecated element ? */ char dtd; /* 1: only in Loose DTD, 2: only Frameset one */ char isinline; /* is this a block 0 or inline 1 element */ const char *desc; /* the description */ /* NRK Jan.2003 * New fields encapsulating HTML structure * * Bugs: * This is a very limited representation. It fails to tell us when * an element *requires* subelements (we only have whether they're * allowed or not), and it doesn't tell us where CDATA and PCDATA * are allowed. Some element relationships are not fully represented: * these are flagged with the word MODIFIER */ const char** subelts; /* allowed sub-elements of this element */ const char* defaultsubelt; /* subelement for suggested auto-repair if necessary or NULL */ const char** attrs_opt; /* Optional Attributes */ const char** attrs_depr; /* Additional deprecated attributes */ const char** attrs_req; /* Required attributes */ }; /* * Internal description of an HTML entity. */ typedef struct _htmlEntityDesc htmlEntityDesc; typedef htmlEntityDesc *htmlEntityDescPtr; struct _htmlEntityDesc { unsigned int value; /* the UNICODE value for the character */ const char *name; /* The entity name */ const char *desc; /* the description */ }; /* * There is only few public functions. */ XMLPUBFUN const htmlElemDesc * XMLCALL htmlTagLookup (const xmlChar *tag); XMLPUBFUN const htmlEntityDesc * XMLCALL htmlEntityLookup(const xmlChar *name); XMLPUBFUN const htmlEntityDesc * XMLCALL htmlEntityValueLookup(unsigned int value); XMLPUBFUN int XMLCALL htmlIsAutoClosed(htmlDocPtr doc, htmlNodePtr elem); XMLPUBFUN int XMLCALL htmlAutoCloseTag(htmlDocPtr doc, const xmlChar *name, htmlNodePtr elem); XMLPUBFUN const htmlEntityDesc * XMLCALL htmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str); XMLPUBFUN int XMLCALL htmlParseCharRef(htmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL htmlParseElement(htmlParserCtxtPtr ctxt); XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlNewParserCtxt(void); XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreateMemoryParserCtxt(const char *buffer, int size); XMLPUBFUN int XMLCALL htmlParseDocument(htmlParserCtxtPtr ctxt); XMLPUBFUN htmlDocPtr XMLCALL htmlSAXParseDoc (xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData); XMLPUBFUN htmlDocPtr XMLCALL htmlParseDoc (xmlChar *cur, const char *encoding); XMLPUBFUN htmlDocPtr XMLCALL htmlSAXParseFile(const char *filename, const char *encoding, htmlSAXHandlerPtr sax, void *userData); XMLPUBFUN htmlDocPtr XMLCALL htmlParseFile (const char *filename, const char *encoding); XMLPUBFUN int XMLCALL UTF8ToHtml (unsigned char *out, int *outlen, const unsigned char *in, int *inlen); XMLPUBFUN int XMLCALL htmlEncodeEntities(unsigned char *out, int *outlen, const unsigned char *in, int *inlen, int quoteChar); XMLPUBFUN int XMLCALL htmlIsScriptAttribute(const xmlChar *name); XMLPUBFUN int XMLCALL htmlHandleOmittedElem(int val); #ifdef LIBXML_PUSH_ENABLED /** * Interfaces for the Push mode. */ XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, void *user_data, const char *chunk, int size, const char *filename, xmlCharEncoding enc); XMLPUBFUN int XMLCALL htmlParseChunk (htmlParserCtxtPtr ctxt, const char *chunk, int size, int terminate); #endif /* LIBXML_PUSH_ENABLED */ XMLPUBFUN void XMLCALL htmlFreeParserCtxt (htmlParserCtxtPtr ctxt); /* * New set of simpler/more flexible APIs */ /** * xmlParserOption: * * This is the set of XML parser options that can be passed down * to the xmlReadDoc() and similar calls. */ typedef enum { HTML_PARSE_RECOVER = 1<<0, /* Relaxed parsing */ HTML_PARSE_NODEFDTD = 1<<2, /* do not default a doctype if not found */ HTML_PARSE_NOERROR = 1<<5, /* suppress error reports */ HTML_PARSE_NOWARNING= 1<<6, /* suppress warning reports */ HTML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ HTML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ HTML_PARSE_NONET = 1<<11,/* Forbid network access */ HTML_PARSE_NOIMPLIED= 1<<13,/* Do not add implied html/body... elements */ HTML_PARSE_COMPACT = 1<<16,/* compact small text nodes */ HTML_PARSE_IGNORE_ENC=1<<21 /* ignore internal document encoding hint */ } htmlParserOption; XMLPUBFUN void XMLCALL htmlCtxtReset (htmlParserCtxtPtr ctxt); XMLPUBFUN int XMLCALL htmlCtxtUseOptions (htmlParserCtxtPtr ctxt, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlReadDoc (const xmlChar *cur, const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlReadFile (const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlReadMemory (const char *buffer, int size, const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlReadFd (int fd, const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlReadIO (xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlCtxtReadDoc (xmlParserCtxtPtr ctxt, const xmlChar *cur, const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlCtxtReadFile (xmlParserCtxtPtr ctxt, const char *filename, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlCtxtReadMemory (xmlParserCtxtPtr ctxt, const char *buffer, int size, const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlCtxtReadFd (xmlParserCtxtPtr ctxt, int fd, const char *URL, const char *encoding, int options); XMLPUBFUN htmlDocPtr XMLCALL htmlCtxtReadIO (xmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options); /* NRK/Jan2003: further knowledge of HTML structure */ typedef enum { HTML_NA = 0 , /* something we don't check at all */ HTML_INVALID = 0x1 , HTML_DEPRECATED = 0x2 , HTML_VALID = 0x4 , HTML_REQUIRED = 0xc /* VALID bit set so ( & HTML_VALID ) is TRUE */ } htmlStatus ; /* Using htmlElemDesc rather than name here, to emphasise the fact that otherwise there's a lookup overhead */ XMLPUBFUN htmlStatus XMLCALL htmlAttrAllowed(const htmlElemDesc*, const xmlChar*, int) ; XMLPUBFUN int XMLCALL htmlElementAllowedHere(const htmlElemDesc*, const xmlChar*) ; XMLPUBFUN htmlStatus XMLCALL htmlElementStatusHere(const htmlElemDesc*, const htmlElemDesc*) ; XMLPUBFUN htmlStatus XMLCALL htmlNodeStatus(const htmlNodePtr, int) ; /** * htmlDefaultSubelement: * @elt: HTML element * * Returns the default subelement for this element */ #define htmlDefaultSubelement(elt) elt->defaultsubelt /** * htmlElementAllowedHereDesc: * @parent: HTML parent element * @elt: HTML element * * Checks whether an HTML element description may be a * direct child of the specified element. * * Returns 1 if allowed; 0 otherwise. */ #define htmlElementAllowedHereDesc(parent,elt) \ htmlElementAllowedHere((parent), (elt)->name) /** * htmlRequiredAttrs: * @elt: HTML element * * Returns the attributes required for the specified element. */ #define htmlRequiredAttrs(elt) (elt)->attrs_req #ifdef __cplusplus } #endif #endif /* LIBXML_HTML_ENABLED */ #endif /* __HTML_PARSER_H__ */ libxml2-2.9.1+dfsg1/include/libxml/debugXML.h0000644000175000017500000001204012113312342017273 0ustar aronaron/* * Summary: Tree debugging APIs * Description: Interfaces to a set of routines used for debugging the tree * produced by the XML parser. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __DEBUG_XML__ #define __DEBUG_XML__ #include #include #include #ifdef LIBXML_DEBUG_ENABLED #include #ifdef __cplusplus extern "C" { #endif /* * The standard Dump routines. */ XMLPUBFUN void XMLCALL xmlDebugDumpString (FILE *output, const xmlChar *str); XMLPUBFUN void XMLCALL xmlDebugDumpAttr (FILE *output, xmlAttrPtr attr, int depth); XMLPUBFUN void XMLCALL xmlDebugDumpAttrList (FILE *output, xmlAttrPtr attr, int depth); XMLPUBFUN void XMLCALL xmlDebugDumpOneNode (FILE *output, xmlNodePtr node, int depth); XMLPUBFUN void XMLCALL xmlDebugDumpNode (FILE *output, xmlNodePtr node, int depth); XMLPUBFUN void XMLCALL xmlDebugDumpNodeList (FILE *output, xmlNodePtr node, int depth); XMLPUBFUN void XMLCALL xmlDebugDumpDocumentHead(FILE *output, xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlDebugDumpDocument (FILE *output, xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlDebugDumpDTD (FILE *output, xmlDtdPtr dtd); XMLPUBFUN void XMLCALL xmlDebugDumpEntities (FILE *output, xmlDocPtr doc); /**************************************************************** * * * Checking routines * * * ****************************************************************/ XMLPUBFUN int XMLCALL xmlDebugCheckDocument (FILE * output, xmlDocPtr doc); /**************************************************************** * * * XML shell helpers * * * ****************************************************************/ XMLPUBFUN void XMLCALL xmlLsOneNode (FILE *output, xmlNodePtr node); XMLPUBFUN int XMLCALL xmlLsCountNode (xmlNodePtr node); XMLPUBFUN const char * XMLCALL xmlBoolToText (int boolval); /**************************************************************** * * * The XML shell related structures and functions * * * ****************************************************************/ #ifdef LIBXML_XPATH_ENABLED /** * xmlShellReadlineFunc: * @prompt: a string prompt * * This is a generic signature for the XML shell input function. * * Returns a string which will be freed by the Shell. */ typedef char * (* xmlShellReadlineFunc)(char *prompt); /** * xmlShellCtxt: * * A debugging shell context. * TODO: add the defined function tables. */ typedef struct _xmlShellCtxt xmlShellCtxt; typedef xmlShellCtxt *xmlShellCtxtPtr; struct _xmlShellCtxt { char *filename; xmlDocPtr doc; xmlNodePtr node; xmlXPathContextPtr pctxt; int loaded; FILE *output; xmlShellReadlineFunc input; }; /** * xmlShellCmd: * @ctxt: a shell context * @arg: a string argument * @node: a first node * @node2: a second node * * This is a generic signature for the XML shell functions. * * Returns an int, negative returns indicating errors. */ typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); XMLPUBFUN void XMLCALL xmlShellPrintXPathError (int errorType, const char *arg); XMLPUBFUN void XMLCALL xmlShellPrintXPathResult(xmlXPathObjectPtr list); XMLPUBFUN int XMLCALL xmlShellList (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); XMLPUBFUN int XMLCALL xmlShellBase (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); XMLPUBFUN int XMLCALL xmlShellDir (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); XMLPUBFUN int XMLCALL xmlShellLoad (xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, xmlNodePtr node2); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlShellPrintNode (xmlNodePtr node); XMLPUBFUN int XMLCALL xmlShellCat (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); XMLPUBFUN int XMLCALL xmlShellWrite (xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, xmlNodePtr node2); XMLPUBFUN int XMLCALL xmlShellSave (xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, xmlNodePtr node2); #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef LIBXML_VALID_ENABLED XMLPUBFUN int XMLCALL xmlShellValidate (xmlShellCtxtPtr ctxt, char *dtd, xmlNodePtr node, xmlNodePtr node2); #endif /* LIBXML_VALID_ENABLED */ XMLPUBFUN int XMLCALL xmlShellDu (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr tree, xmlNodePtr node2); XMLPUBFUN int XMLCALL xmlShellPwd (xmlShellCtxtPtr ctxt, char *buffer, xmlNodePtr node, xmlNodePtr node2); /* * The Shell interface. */ XMLPUBFUN void XMLCALL xmlShell (xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, FILE *output); #endif /* LIBXML_XPATH_ENABLED */ #ifdef __cplusplus } #endif #endif /* LIBXML_DEBUG_ENABLED */ #endif /* __DEBUG_XML__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlstring.h0000644000175000017500000001253512113312342017664 0ustar aronaron/* * Summary: set of routines to process strings * Description: type and interfaces needed for the internal string handling * of the library, especially UTF8 processing. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_STRING_H__ #define __XML_STRING_H__ #include #include #ifdef __cplusplus extern "C" { #endif /** * xmlChar: * * This is a basic byte in an UTF-8 encoded string. * It's unsigned allowing to pinpoint case where char * are assigned * to xmlChar * (possibly making serialization back impossible). */ typedef unsigned char xmlChar; /** * BAD_CAST: * * Macro to cast a string to an xmlChar * when one know its safe. */ #define BAD_CAST (xmlChar *) /* * xmlChar handling */ XMLPUBFUN xmlChar * XMLCALL xmlStrdup (const xmlChar *cur); XMLPUBFUN xmlChar * XMLCALL xmlStrndup (const xmlChar *cur, int len); XMLPUBFUN xmlChar * XMLCALL xmlCharStrndup (const char *cur, int len); XMLPUBFUN xmlChar * XMLCALL xmlCharStrdup (const char *cur); XMLPUBFUN xmlChar * XMLCALL xmlStrsub (const xmlChar *str, int start, int len); XMLPUBFUN const xmlChar * XMLCALL xmlStrchr (const xmlChar *str, xmlChar val); XMLPUBFUN const xmlChar * XMLCALL xmlStrstr (const xmlChar *str, const xmlChar *val); XMLPUBFUN const xmlChar * XMLCALL xmlStrcasestr (const xmlChar *str, const xmlChar *val); XMLPUBFUN int XMLCALL xmlStrcmp (const xmlChar *str1, const xmlChar *str2); XMLPUBFUN int XMLCALL xmlStrncmp (const xmlChar *str1, const xmlChar *str2, int len); XMLPUBFUN int XMLCALL xmlStrcasecmp (const xmlChar *str1, const xmlChar *str2); XMLPUBFUN int XMLCALL xmlStrncasecmp (const xmlChar *str1, const xmlChar *str2, int len); XMLPUBFUN int XMLCALL xmlStrEqual (const xmlChar *str1, const xmlChar *str2); XMLPUBFUN int XMLCALL xmlStrQEqual (const xmlChar *pref, const xmlChar *name, const xmlChar *str); XMLPUBFUN int XMLCALL xmlStrlen (const xmlChar *str); XMLPUBFUN xmlChar * XMLCALL xmlStrcat (xmlChar *cur, const xmlChar *add); XMLPUBFUN xmlChar * XMLCALL xmlStrncat (xmlChar *cur, const xmlChar *add, int len); XMLPUBFUN xmlChar * XMLCALL xmlStrncatNew (const xmlChar *str1, const xmlChar *str2, int len); XMLPUBFUN int XMLCALL xmlStrPrintf (xmlChar *buf, int len, const xmlChar *msg, ...); XMLPUBFUN int XMLCALL xmlStrVPrintf (xmlChar *buf, int len, const xmlChar *msg, va_list ap); XMLPUBFUN int XMLCALL xmlGetUTF8Char (const unsigned char *utf, int *len); XMLPUBFUN int XMLCALL xmlCheckUTF8 (const unsigned char *utf); XMLPUBFUN int XMLCALL xmlUTF8Strsize (const xmlChar *utf, int len); XMLPUBFUN xmlChar * XMLCALL xmlUTF8Strndup (const xmlChar *utf, int len); XMLPUBFUN const xmlChar * XMLCALL xmlUTF8Strpos (const xmlChar *utf, int pos); XMLPUBFUN int XMLCALL xmlUTF8Strloc (const xmlChar *utf, const xmlChar *utfchar); XMLPUBFUN xmlChar * XMLCALL xmlUTF8Strsub (const xmlChar *utf, int start, int len); XMLPUBFUN int XMLCALL xmlUTF8Strlen (const xmlChar *utf); XMLPUBFUN int XMLCALL xmlUTF8Size (const xmlChar *utf); XMLPUBFUN int XMLCALL xmlUTF8Charcmp (const xmlChar *utf1, const xmlChar *utf2); #ifdef __cplusplus } #endif #endif /* __XML_STRING_H__ */ libxml2-2.9.1+dfsg1/include/libxml/encoding.h0000644000175000017500000002015512113312342017420 0ustar aronaron/* * Summary: interface for the encoding conversion functions * Description: interface for the encoding conversion functions needed for * XML basic encoding and iconv() support. * * Related specs are * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies * [ISO-10646] UTF-8 and UTF-16 in Annexes * [ISO-8859-1] ISO Latin-1 characters codes. * [UNICODE] The Unicode Consortium, "The Unicode Standard -- * Worldwide Character Encoding -- Version 1.0", Addison- * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is * described in Unicode Technical Report #4. * [US-ASCII] Coded Character Set--7-bit American Standard Code for * Information Interchange, ANSI X3.4-1986. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_CHAR_ENCODING_H__ #define __XML_CHAR_ENCODING_H__ #include #ifdef LIBXML_ICONV_ENABLED #include #endif #ifdef LIBXML_ICU_ENABLED #include #endif #ifdef __cplusplus extern "C" { #endif /* * xmlCharEncoding: * * Predefined values for some standard encodings. * Libxml does not do beforehand translation on UTF8 and ISOLatinX. * It also supports ASCII, ISO-8859-1, and UTF16 (LE and BE) by default. * * Anything else would have to be translated to UTF8 before being * given to the parser itself. The BOM for UTF16 and the encoding * declaration are looked at and a converter is looked for at that * point. If not found the parser stops here as asked by the XML REC. A * converter can be registered by the user using xmlRegisterCharEncodingHandler * but the current form doesn't allow stateful transcoding (a serious * problem agreed !). If iconv has been found it will be used * automatically and allow stateful transcoding, the simplest is then * to be sure to enable iconv and to provide iconv libs for the encoding * support needed. * * Note that the generic "UTF-16" is not a predefined value. Instead, only * the specific UTF-16LE and UTF-16BE are present. */ typedef enum { XML_CHAR_ENCODING_ERROR= -1, /* No char encoding detected */ XML_CHAR_ENCODING_NONE= 0, /* No char encoding detected */ XML_CHAR_ENCODING_UTF8= 1, /* UTF-8 */ XML_CHAR_ENCODING_UTF16LE= 2, /* UTF-16 little endian */ XML_CHAR_ENCODING_UTF16BE= 3, /* UTF-16 big endian */ XML_CHAR_ENCODING_UCS4LE= 4, /* UCS-4 little endian */ XML_CHAR_ENCODING_UCS4BE= 5, /* UCS-4 big endian */ XML_CHAR_ENCODING_EBCDIC= 6, /* EBCDIC uh! */ XML_CHAR_ENCODING_UCS4_2143=7, /* UCS-4 unusual ordering */ XML_CHAR_ENCODING_UCS4_3412=8, /* UCS-4 unusual ordering */ XML_CHAR_ENCODING_UCS2= 9, /* UCS-2 */ XML_CHAR_ENCODING_8859_1= 10,/* ISO-8859-1 ISO Latin 1 */ XML_CHAR_ENCODING_8859_2= 11,/* ISO-8859-2 ISO Latin 2 */ XML_CHAR_ENCODING_8859_3= 12,/* ISO-8859-3 */ XML_CHAR_ENCODING_8859_4= 13,/* ISO-8859-4 */ XML_CHAR_ENCODING_8859_5= 14,/* ISO-8859-5 */ XML_CHAR_ENCODING_8859_6= 15,/* ISO-8859-6 */ XML_CHAR_ENCODING_8859_7= 16,/* ISO-8859-7 */ XML_CHAR_ENCODING_8859_8= 17,/* ISO-8859-8 */ XML_CHAR_ENCODING_8859_9= 18,/* ISO-8859-9 */ XML_CHAR_ENCODING_2022_JP= 19,/* ISO-2022-JP */ XML_CHAR_ENCODING_SHIFT_JIS=20,/* Shift_JIS */ XML_CHAR_ENCODING_EUC_JP= 21,/* EUC-JP */ XML_CHAR_ENCODING_ASCII= 22 /* pure ASCII */ } xmlCharEncoding; /** * xmlCharEncodingInputFunc: * @out: a pointer to an array of bytes to store the UTF-8 result * @outlen: the length of @out * @in: a pointer to an array of chars in the original encoding * @inlen: the length of @in * * Take a block of chars in the original encoding and try to convert * it to an UTF-8 block of chars out. * * Returns the number of bytes written, -1 if lack of space, or -2 * if the transcoding failed. * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictiable. * The value of @outlen after return is the number of octets consumed. */ typedef int (* xmlCharEncodingInputFunc)(unsigned char *out, int *outlen, const unsigned char *in, int *inlen); /** * xmlCharEncodingOutputFunc: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * * Take a block of UTF-8 chars in and try to convert it to another * encoding. * Note: a first call designed to produce heading info is called with * in = NULL. If stateful this should also initialize the encoder state. * * Returns the number of bytes written, -1 if lack of space, or -2 * if the transcoding failed. * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictiable. * The value of @outlen after return is the number of octets produced. */ typedef int (* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen, const unsigned char *in, int *inlen); /* * Block defining the handlers for non UTF-8 encodings. * If iconv is supported, there are two extra fields. */ #ifdef LIBXML_ICU_ENABLED struct _uconv_t { UConverter *uconv; /* for conversion between an encoding and UTF-16 */ UConverter *utf8; /* for conversion between UTF-8 and UTF-16 */ }; typedef struct _uconv_t uconv_t; #endif typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler; typedef xmlCharEncodingHandler *xmlCharEncodingHandlerPtr; struct _xmlCharEncodingHandler { char *name; xmlCharEncodingInputFunc input; xmlCharEncodingOutputFunc output; #ifdef LIBXML_ICONV_ENABLED iconv_t iconv_in; iconv_t iconv_out; #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED uconv_t *uconv_in; uconv_t *uconv_out; #endif /* LIBXML_ICU_ENABLED */ }; #ifdef __cplusplus } #endif #include #ifdef __cplusplus extern "C" { #endif /* * Interfaces for encoding handlers. */ XMLPUBFUN void XMLCALL xmlInitCharEncodingHandlers (void); XMLPUBFUN void XMLCALL xmlCleanupCharEncodingHandlers (void); XMLPUBFUN void XMLCALL xmlRegisterCharEncodingHandler (xmlCharEncodingHandlerPtr handler); XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL xmlGetCharEncodingHandler (xmlCharEncoding enc); XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL xmlFindCharEncodingHandler (const char *name); XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL xmlNewCharEncodingHandler (const char *name, xmlCharEncodingInputFunc input, xmlCharEncodingOutputFunc output); /* * Interfaces for encoding names and aliases. */ XMLPUBFUN int XMLCALL xmlAddEncodingAlias (const char *name, const char *alias); XMLPUBFUN int XMLCALL xmlDelEncodingAlias (const char *alias); XMLPUBFUN const char * XMLCALL xmlGetEncodingAlias (const char *alias); XMLPUBFUN void XMLCALL xmlCleanupEncodingAliases (void); XMLPUBFUN xmlCharEncoding XMLCALL xmlParseCharEncoding (const char *name); XMLPUBFUN const char * XMLCALL xmlGetCharEncodingName (xmlCharEncoding enc); /* * Interfaces directly used by the parsers. */ XMLPUBFUN xmlCharEncoding XMLCALL xmlDetectCharEncoding (const unsigned char *in, int len); XMLPUBFUN int XMLCALL xmlCharEncOutFunc (xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in); XMLPUBFUN int XMLCALL xmlCharEncInFunc (xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in); XMLPUBFUN int XMLCALL xmlCharEncFirstLine (xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in); XMLPUBFUN int XMLCALL xmlCharEncCloseFunc (xmlCharEncodingHandler *handler); /* * Export a few useful functions */ #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN int XMLCALL UTF8Toisolat1 (unsigned char *out, int *outlen, const unsigned char *in, int *inlen); #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN int XMLCALL isolat1ToUTF8 (unsigned char *out, int *outlen, const unsigned char *in, int *inlen); #ifdef __cplusplus } #endif #endif /* __XML_CHAR_ENCODING_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlIO.h0000644000175000017500000002456712113312342016675 0ustar aronaron/* * Summary: interface for the I/O interfaces used by the parser * Description: interface for the I/O interfaces used by the parser * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_IO_H__ #define __XML_IO_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* * Those are the functions and datatypes for the parser input * I/O structures. */ /** * xmlInputMatchCallback: * @filename: the filename or URI * * Callback used in the I/O Input API to detect if the current handler * can provide input fonctionnalities for this resource. * * Returns 1 if yes and 0 if another Input module should be used */ typedef int (XMLCALL *xmlInputMatchCallback) (char const *filename); /** * xmlInputOpenCallback: * @filename: the filename or URI * * Callback used in the I/O Input API to open the resource * * Returns an Input context or NULL in case or error */ typedef void * (XMLCALL *xmlInputOpenCallback) (char const *filename); /** * xmlInputReadCallback: * @context: an Input context * @buffer: the buffer to store data read * @len: the length of the buffer in bytes * * Callback used in the I/O Input API to read the resource * * Returns the number of bytes read or -1 in case of error */ typedef int (XMLCALL *xmlInputReadCallback) (void * context, char * buffer, int len); /** * xmlInputCloseCallback: * @context: an Input context * * Callback used in the I/O Input API to close the resource * * Returns 0 or -1 in case of error */ typedef int (XMLCALL *xmlInputCloseCallback) (void * context); #ifdef LIBXML_OUTPUT_ENABLED /* * Those are the functions and datatypes for the library output * I/O structures. */ /** * xmlOutputMatchCallback: * @filename: the filename or URI * * Callback used in the I/O Output API to detect if the current handler * can provide output fonctionnalities for this resource. * * Returns 1 if yes and 0 if another Output module should be used */ typedef int (XMLCALL *xmlOutputMatchCallback) (char const *filename); /** * xmlOutputOpenCallback: * @filename: the filename or URI * * Callback used in the I/O Output API to open the resource * * Returns an Output context or NULL in case or error */ typedef void * (XMLCALL *xmlOutputOpenCallback) (char const *filename); /** * xmlOutputWriteCallback: * @context: an Output context * @buffer: the buffer of data to write * @len: the length of the buffer in bytes * * Callback used in the I/O Output API to write to the resource * * Returns the number of bytes written or -1 in case of error */ typedef int (XMLCALL *xmlOutputWriteCallback) (void * context, const char * buffer, int len); /** * xmlOutputCloseCallback: * @context: an Output context * * Callback used in the I/O Output API to close the resource * * Returns 0 or -1 in case of error */ typedef int (XMLCALL *xmlOutputCloseCallback) (void * context); #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef __cplusplus } #endif #include #include #include #include #ifdef __cplusplus extern "C" { #endif struct _xmlParserInputBuffer { void* context; xmlInputReadCallback readcallback; xmlInputCloseCallback closecallback; xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ xmlBufPtr buffer; /* Local buffer encoded in UTF-8 */ xmlBufPtr raw; /* if encoder != NULL buffer for raw input */ int compressed; /* -1=unknown, 0=not compressed, 1=compressed */ int error; unsigned long rawconsumed;/* amount consumed from raw */ }; #ifdef LIBXML_OUTPUT_ENABLED struct _xmlOutputBuffer { void* context; xmlOutputWriteCallback writecallback; xmlOutputCloseCallback closecallback; xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ xmlBufPtr buffer; /* Local buffer encoded in UTF-8 or ISOLatin */ xmlBufPtr conv; /* if encoder != NULL buffer for output */ int written; /* total number of byte written */ int error; }; #endif /* LIBXML_OUTPUT_ENABLED */ /* * Interfaces for input */ XMLPUBFUN void XMLCALL xmlCleanupInputCallbacks (void); XMLPUBFUN int XMLCALL xmlPopInputCallbacks (void); XMLPUBFUN void XMLCALL xmlRegisterDefaultInputCallbacks (void); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlAllocParserInputBuffer (xmlCharEncoding enc); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlParserInputBufferCreateFilename (const char *URI, xmlCharEncoding enc); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlParserInputBufferCreateFile (FILE *file, xmlCharEncoding enc); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlParserInputBufferCreateFd (int fd, xmlCharEncoding enc); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlParserInputBufferCreateMem (const char *mem, int size, xmlCharEncoding enc); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlParserInputBufferCreateStatic (const char *mem, int size, xmlCharEncoding enc); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlParserInputBufferCreateIO (xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc); XMLPUBFUN int XMLCALL xmlParserInputBufferRead (xmlParserInputBufferPtr in, int len); XMLPUBFUN int XMLCALL xmlParserInputBufferGrow (xmlParserInputBufferPtr in, int len); XMLPUBFUN int XMLCALL xmlParserInputBufferPush (xmlParserInputBufferPtr in, int len, const char *buf); XMLPUBFUN void XMLCALL xmlFreeParserInputBuffer (xmlParserInputBufferPtr in); XMLPUBFUN char * XMLCALL xmlParserGetDirectory (const char *filename); XMLPUBFUN int XMLCALL xmlRegisterInputCallbacks (xmlInputMatchCallback matchFunc, xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc, xmlInputCloseCallback closeFunc); xmlParserInputBufferPtr __xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc); #ifdef LIBXML_OUTPUT_ENABLED /* * Interfaces for output */ XMLPUBFUN void XMLCALL xmlCleanupOutputCallbacks (void); XMLPUBFUN void XMLCALL xmlRegisterDefaultOutputCallbacks(void); XMLPUBFUN xmlOutputBufferPtr XMLCALL xmlAllocOutputBuffer (xmlCharEncodingHandlerPtr encoder); XMLPUBFUN xmlOutputBufferPtr XMLCALL xmlOutputBufferCreateFilename (const char *URI, xmlCharEncodingHandlerPtr encoder, int compression); XMLPUBFUN xmlOutputBufferPtr XMLCALL xmlOutputBufferCreateFile (FILE *file, xmlCharEncodingHandlerPtr encoder); XMLPUBFUN xmlOutputBufferPtr XMLCALL xmlOutputBufferCreateBuffer (xmlBufferPtr buffer, xmlCharEncodingHandlerPtr encoder); XMLPUBFUN xmlOutputBufferPtr XMLCALL xmlOutputBufferCreateFd (int fd, xmlCharEncodingHandlerPtr encoder); XMLPUBFUN xmlOutputBufferPtr XMLCALL xmlOutputBufferCreateIO (xmlOutputWriteCallback iowrite, xmlOutputCloseCallback ioclose, void *ioctx, xmlCharEncodingHandlerPtr encoder); /* Couple of APIs to get the output without digging into the buffers */ XMLPUBFUN const xmlChar * XMLCALL xmlOutputBufferGetContent (xmlOutputBufferPtr out); XMLPUBFUN size_t XMLCALL xmlOutputBufferGetSize (xmlOutputBufferPtr out); XMLPUBFUN int XMLCALL xmlOutputBufferWrite (xmlOutputBufferPtr out, int len, const char *buf); XMLPUBFUN int XMLCALL xmlOutputBufferWriteString (xmlOutputBufferPtr out, const char *str); XMLPUBFUN int XMLCALL xmlOutputBufferWriteEscape (xmlOutputBufferPtr out, const xmlChar *str, xmlCharEncodingOutputFunc escaping); XMLPUBFUN int XMLCALL xmlOutputBufferFlush (xmlOutputBufferPtr out); XMLPUBFUN int XMLCALL xmlOutputBufferClose (xmlOutputBufferPtr out); XMLPUBFUN int XMLCALL xmlRegisterOutputCallbacks (xmlOutputMatchCallback matchFunc, xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc, xmlOutputCloseCallback closeFunc); xmlOutputBufferPtr __xmlOutputBufferCreateFilename(const char *URI, xmlCharEncodingHandlerPtr encoder, int compression); #ifdef LIBXML_HTTP_ENABLED /* This function only exists if HTTP support built into the library */ XMLPUBFUN void XMLCALL xmlRegisterHTTPPostCallbacks (void ); #endif /* LIBXML_HTTP_ENABLED */ #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN xmlParserInputPtr XMLCALL xmlCheckHTTPInput (xmlParserCtxtPtr ctxt, xmlParserInputPtr ret); /* * A predefined entity loader disabling network accesses */ XMLPUBFUN xmlParserInputPtr XMLCALL xmlNoNetExternalEntityLoader (const char *URL, const char *ID, xmlParserCtxtPtr ctxt); /* * xmlNormalizeWindowsPath is obsolete, don't use it. * Check xmlCanonicPath in uri.h for a better alternative. */ XMLPUBFUN xmlChar * XMLCALL xmlNormalizeWindowsPath (const xmlChar *path); XMLPUBFUN int XMLCALL xmlCheckFilename (const char *path); /** * Default 'file://' protocol callbacks */ XMLPUBFUN int XMLCALL xmlFileMatch (const char *filename); XMLPUBFUN void * XMLCALL xmlFileOpen (const char *filename); XMLPUBFUN int XMLCALL xmlFileRead (void * context, char * buffer, int len); XMLPUBFUN int XMLCALL xmlFileClose (void * context); /** * Default 'http://' protocol callbacks */ #ifdef LIBXML_HTTP_ENABLED XMLPUBFUN int XMLCALL xmlIOHTTPMatch (const char *filename); XMLPUBFUN void * XMLCALL xmlIOHTTPOpen (const char *filename); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void * XMLCALL xmlIOHTTPOpenW (const char * post_uri, int compression ); #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN int XMLCALL xmlIOHTTPRead (void * context, char * buffer, int len); XMLPUBFUN int XMLCALL xmlIOHTTPClose (void * context); #endif /* LIBXML_HTTP_ENABLED */ /** * Default 'ftp://' protocol callbacks */ #ifdef LIBXML_FTP_ENABLED XMLPUBFUN int XMLCALL xmlIOFTPMatch (const char *filename); XMLPUBFUN void * XMLCALL xmlIOFTPOpen (const char *filename); XMLPUBFUN int XMLCALL xmlIOFTPRead (void * context, char * buffer, int len); XMLPUBFUN int XMLCALL xmlIOFTPClose (void * context); #endif /* LIBXML_FTP_ENABLED */ #ifdef __cplusplus } #endif #endif /* __XML_IO_H__ */ libxml2-2.9.1+dfsg1/include/libxml/Makefile.am0000644000175000017500000000152012113312342017510 0ustar aronaron## Process this file with automake to produce Makefile.in xmlincdir = $(includedir)/libxml2/libxml xmlinc_HEADERS = \ SAX.h \ entities.h \ encoding.h \ parser.h \ parserInternals.h \ xmlerror.h \ HTMLparser.h \ HTMLtree.h \ debugXML.h \ tree.h \ list.h \ hash.h \ xpath.h \ xpathInternals.h \ xpointer.h \ xinclude.h \ xmlIO.h \ xmlmemory.h \ nanohttp.h \ nanoftp.h \ uri.h \ valid.h \ xlink.h \ xmlversion.h \ DOCBparser.h \ catalog.h \ threads.h \ globals.h \ c14n.h \ xmlautomata.h \ xmlregexp.h \ xmlmodule.h \ xmlschemas.h \ schemasInternals.h \ xmlschemastypes.h \ xmlstring.h \ xmlunicode.h \ xmlreader.h \ relaxng.h \ dict.h \ SAX2.h \ xmlexports.h \ xmlwriter.h \ chvalid.h \ pattern.h \ xmlsave.h \ schematron.h EXTRA_DIST = xmlversion.h.in libxml2-2.9.1+dfsg1/include/libxml/schematron.h0000644000175000017500000001042312113312342017772 0ustar aronaron/* * Summary: XML Schemastron implementation * Description: interface to the XML Schematron validity checking. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_SCHEMATRON_H__ #define __XML_SCHEMATRON_H__ #include #ifdef LIBXML_SCHEMATRON_ENABLED #include #ifdef __cplusplus extern "C" { #endif typedef enum { XML_SCHEMATRON_OUT_QUIET = 1 << 0, /* quiet no report */ XML_SCHEMATRON_OUT_TEXT = 1 << 1, /* build a textual report */ XML_SCHEMATRON_OUT_XML = 1 << 2, /* output SVRL */ XML_SCHEMATRON_OUT_ERROR = 1 << 3, /* output via xmlStructuredErrorFunc */ XML_SCHEMATRON_OUT_FILE = 1 << 8, /* output to a file descriptor */ XML_SCHEMATRON_OUT_BUFFER = 1 << 9, /* output to a buffer */ XML_SCHEMATRON_OUT_IO = 1 << 10 /* output to I/O mechanism */ } xmlSchematronValidOptions; /** * The schemas related types are kept internal */ typedef struct _xmlSchematron xmlSchematron; typedef xmlSchematron *xmlSchematronPtr; /** * xmlSchematronValidityErrorFunc: * @ctx: the validation context * @msg: the message * @...: extra arguments * * Signature of an error callback from a Schematron validation */ typedef void (*xmlSchematronValidityErrorFunc) (void *ctx, const char *msg, ...); /** * xmlSchematronValidityWarningFunc: * @ctx: the validation context * @msg: the message * @...: extra arguments * * Signature of a warning callback from a Schematron validation */ typedef void (*xmlSchematronValidityWarningFunc) (void *ctx, const char *msg, ...); /** * A schemas validation context */ typedef struct _xmlSchematronParserCtxt xmlSchematronParserCtxt; typedef xmlSchematronParserCtxt *xmlSchematronParserCtxtPtr; typedef struct _xmlSchematronValidCtxt xmlSchematronValidCtxt; typedef xmlSchematronValidCtxt *xmlSchematronValidCtxtPtr; /* * Interfaces for parsing. */ XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL xmlSchematronNewParserCtxt (const char *URL); XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL xmlSchematronNewMemParserCtxt(const char *buffer, int size); XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL xmlSchematronNewDocParserCtxt(xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlSchematronFreeParserCtxt (xmlSchematronParserCtxtPtr ctxt); /***** XMLPUBFUN void XMLCALL xmlSchematronSetParserErrors(xmlSchematronParserCtxtPtr ctxt, xmlSchematronValidityErrorFunc err, xmlSchematronValidityWarningFunc warn, void *ctx); XMLPUBFUN int XMLCALL xmlSchematronGetParserErrors(xmlSchematronParserCtxtPtr ctxt, xmlSchematronValidityErrorFunc * err, xmlSchematronValidityWarningFunc * warn, void **ctx); XMLPUBFUN int XMLCALL xmlSchematronIsValid (xmlSchematronValidCtxtPtr ctxt); *****/ XMLPUBFUN xmlSchematronPtr XMLCALL xmlSchematronParse (xmlSchematronParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlSchematronFree (xmlSchematronPtr schema); /* * Interfaces for validating */ XMLPUBFUN void XMLCALL xmlSchematronSetValidStructuredErrors( xmlSchematronValidCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx); /****** XMLPUBFUN void XMLCALL xmlSchematronSetValidErrors (xmlSchematronValidCtxtPtr ctxt, xmlSchematronValidityErrorFunc err, xmlSchematronValidityWarningFunc warn, void *ctx); XMLPUBFUN int XMLCALL xmlSchematronGetValidErrors (xmlSchematronValidCtxtPtr ctxt, xmlSchematronValidityErrorFunc *err, xmlSchematronValidityWarningFunc *warn, void **ctx); XMLPUBFUN int XMLCALL xmlSchematronSetValidOptions(xmlSchematronValidCtxtPtr ctxt, int options); XMLPUBFUN int XMLCALL xmlSchematronValidCtxtGetOptions(xmlSchematronValidCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlSchematronValidateOneElement (xmlSchematronValidCtxtPtr ctxt, xmlNodePtr elem); *******/ XMLPUBFUN xmlSchematronValidCtxtPtr XMLCALL xmlSchematronNewValidCtxt (xmlSchematronPtr schema, int options); XMLPUBFUN void XMLCALL xmlSchematronFreeValidCtxt (xmlSchematronValidCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlSchematronValidateDoc (xmlSchematronValidCtxtPtr ctxt, xmlDocPtr instance); #ifdef __cplusplus } #endif #endif /* LIBXML_SCHEMATRON_ENABLED */ #endif /* __XML_SCHEMATRON_H__ */ libxml2-2.9.1+dfsg1/include/libxml/SAX2.h0000644000175000017500000001141612113312342016347 0ustar aronaron/* * Summary: SAX2 parser interface used to build the DOM tree * Description: those are the default SAX2 interfaces used by * the library when building DOM tree. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_SAX2_H__ #define __XML_SAX2_H__ #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif XMLPUBFUN const xmlChar * XMLCALL xmlSAX2GetPublicId (void *ctx); XMLPUBFUN const xmlChar * XMLCALL xmlSAX2GetSystemId (void *ctx); XMLPUBFUN void XMLCALL xmlSAX2SetDocumentLocator (void *ctx, xmlSAXLocatorPtr loc); XMLPUBFUN int XMLCALL xmlSAX2GetLineNumber (void *ctx); XMLPUBFUN int XMLCALL xmlSAX2GetColumnNumber (void *ctx); XMLPUBFUN int XMLCALL xmlSAX2IsStandalone (void *ctx); XMLPUBFUN int XMLCALL xmlSAX2HasInternalSubset (void *ctx); XMLPUBFUN int XMLCALL xmlSAX2HasExternalSubset (void *ctx); XMLPUBFUN void XMLCALL xmlSAX2InternalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN void XMLCALL xmlSAX2ExternalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN xmlEntityPtr XMLCALL xmlSAX2GetEntity (void *ctx, const xmlChar *name); XMLPUBFUN xmlEntityPtr XMLCALL xmlSAX2GetParameterEntity (void *ctx, const xmlChar *name); XMLPUBFUN xmlParserInputPtr XMLCALL xmlSAX2ResolveEntity (void *ctx, const xmlChar *publicId, const xmlChar *systemId); XMLPUBFUN void XMLCALL xmlSAX2EntityDecl (void *ctx, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content); XMLPUBFUN void XMLCALL xmlSAX2AttributeDecl (void *ctx, const xmlChar *elem, const xmlChar *fullname, int type, int def, const xmlChar *defaultValue, xmlEnumerationPtr tree); XMLPUBFUN void XMLCALL xmlSAX2ElementDecl (void *ctx, const xmlChar *name, int type, xmlElementContentPtr content); XMLPUBFUN void XMLCALL xmlSAX2NotationDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId); XMLPUBFUN void XMLCALL xmlSAX2UnparsedEntityDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName); XMLPUBFUN void XMLCALL xmlSAX2StartDocument (void *ctx); XMLPUBFUN void XMLCALL xmlSAX2EndDocument (void *ctx); #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) XMLPUBFUN void XMLCALL xmlSAX2StartElement (void *ctx, const xmlChar *fullname, const xmlChar **atts); XMLPUBFUN void XMLCALL xmlSAX2EndElement (void *ctx, const xmlChar *name); #endif /* LIBXML_SAX1_ENABLED or LIBXML_HTML_ENABLED */ XMLPUBFUN void XMLCALL xmlSAX2StartElementNs (void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes); XMLPUBFUN void XMLCALL xmlSAX2EndElementNs (void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI); XMLPUBFUN void XMLCALL xmlSAX2Reference (void *ctx, const xmlChar *name); XMLPUBFUN void XMLCALL xmlSAX2Characters (void *ctx, const xmlChar *ch, int len); XMLPUBFUN void XMLCALL xmlSAX2IgnorableWhitespace (void *ctx, const xmlChar *ch, int len); XMLPUBFUN void XMLCALL xmlSAX2ProcessingInstruction (void *ctx, const xmlChar *target, const xmlChar *data); XMLPUBFUN void XMLCALL xmlSAX2Comment (void *ctx, const xmlChar *value); XMLPUBFUN void XMLCALL xmlSAX2CDataBlock (void *ctx, const xmlChar *value, int len); #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN int XMLCALL xmlSAXDefaultVersion (int version); #endif /* LIBXML_SAX1_ENABLED */ XMLPUBFUN int XMLCALL xmlSAXVersion (xmlSAXHandler *hdlr, int version); XMLPUBFUN void XMLCALL xmlSAX2InitDefaultSAXHandler (xmlSAXHandler *hdlr, int warning); #ifdef LIBXML_HTML_ENABLED XMLPUBFUN void XMLCALL xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr); XMLPUBFUN void XMLCALL htmlDefaultSAXHandlerInit (void); #endif #ifdef LIBXML_DOCB_ENABLED XMLPUBFUN void XMLCALL xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr); XMLPUBFUN void XMLCALL docbDefaultSAXHandlerInit (void); #endif XMLPUBFUN void XMLCALL xmlDefaultSAXHandlerInit (void); #ifdef __cplusplus } #endif #endif /* __XML_SAX2_H__ */ libxml2-2.9.1+dfsg1/include/libxml/entities.h0000644000175000017500000001113712117307331017464 0ustar aronaron/* * Summary: interface for the XML entities handling * Description: this module provides some of the entity API needed * for the parser and applications. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_ENTITIES_H__ #define __XML_ENTITIES_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* * The different valid entity types. */ typedef enum { XML_INTERNAL_GENERAL_ENTITY = 1, XML_EXTERNAL_GENERAL_PARSED_ENTITY = 2, XML_EXTERNAL_GENERAL_UNPARSED_ENTITY = 3, XML_INTERNAL_PARAMETER_ENTITY = 4, XML_EXTERNAL_PARAMETER_ENTITY = 5, XML_INTERNAL_PREDEFINED_ENTITY = 6 } xmlEntityType; /* * An unit of storage for an entity, contains the string, the value * and the linkind data needed for the linking in the hash table. */ struct _xmlEntity { void *_private; /* application data */ xmlElementType type; /* XML_ENTITY_DECL, must be second ! */ const xmlChar *name; /* Entity name */ struct _xmlNode *children; /* First child link */ struct _xmlNode *last; /* Last child link */ struct _xmlDtd *parent; /* -> DTD */ struct _xmlNode *next; /* next sibling link */ struct _xmlNode *prev; /* previous sibling link */ struct _xmlDoc *doc; /* the containing document */ xmlChar *orig; /* content without ref substitution */ xmlChar *content; /* content or ndata if unparsed */ int length; /* the content length */ xmlEntityType etype; /* The entity type */ const xmlChar *ExternalID; /* External identifier for PUBLIC */ const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC Entity */ struct _xmlEntity *nexte; /* unused */ const xmlChar *URI; /* the full URI as computed */ int owner; /* does the entity own the childrens */ int checked; /* was the entity content checked */ /* this is also used to count entites * references done from that entity * and if it contains '<' */ }; /* * All entities are stored in an hash table. * There is 2 separate hash tables for global and parameter entities. */ typedef struct _xmlHashTable xmlEntitiesTable; typedef xmlEntitiesTable *xmlEntitiesTablePtr; /* * External functions: */ #ifdef LIBXML_LEGACY_ENABLED XMLPUBFUN void XMLCALL xmlInitializePredefinedEntities (void); #endif /* LIBXML_LEGACY_ENABLED */ XMLPUBFUN xmlEntityPtr XMLCALL xmlNewEntity (xmlDocPtr doc, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content); XMLPUBFUN xmlEntityPtr XMLCALL xmlAddDocEntity (xmlDocPtr doc, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content); XMLPUBFUN xmlEntityPtr XMLCALL xmlAddDtdEntity (xmlDocPtr doc, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content); XMLPUBFUN xmlEntityPtr XMLCALL xmlGetPredefinedEntity (const xmlChar *name); XMLPUBFUN xmlEntityPtr XMLCALL xmlGetDocEntity (xmlDocPtr doc, const xmlChar *name); XMLPUBFUN xmlEntityPtr XMLCALL xmlGetDtdEntity (xmlDocPtr doc, const xmlChar *name); XMLPUBFUN xmlEntityPtr XMLCALL xmlGetParameterEntity (xmlDocPtr doc, const xmlChar *name); #ifdef LIBXML_LEGACY_ENABLED XMLPUBFUN const xmlChar * XMLCALL xmlEncodeEntities (xmlDocPtr doc, const xmlChar *input); #endif /* LIBXML_LEGACY_ENABLED */ XMLPUBFUN xmlChar * XMLCALL xmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input); XMLPUBFUN xmlChar * XMLCALL xmlEncodeSpecialChars (xmlDocPtr doc, const xmlChar *input); XMLPUBFUN xmlEntitiesTablePtr XMLCALL xmlCreateEntitiesTable (void); #ifdef LIBXML_TREE_ENABLED XMLPUBFUN xmlEntitiesTablePtr XMLCALL xmlCopyEntitiesTable (xmlEntitiesTablePtr table); #endif /* LIBXML_TREE_ENABLED */ XMLPUBFUN void XMLCALL xmlFreeEntitiesTable (xmlEntitiesTablePtr table); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlDumpEntitiesTable (xmlBufferPtr buf, xmlEntitiesTablePtr table); XMLPUBFUN void XMLCALL xmlDumpEntityDecl (xmlBufferPtr buf, xmlEntityPtr ent); #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef LIBXML_LEGACY_ENABLED XMLPUBFUN void XMLCALL xmlCleanupPredefinedEntities(void); #endif /* LIBXML_LEGACY_ENABLED */ #ifdef __cplusplus } #endif # endif /* __XML_ENTITIES_H__ */ libxml2-2.9.1+dfsg1/include/libxml/relaxng.h0000644000175000017500000001350612113312342017274 0ustar aronaron/* * Summary: implementation of the Relax-NG validation * Description: implementation of the Relax-NG validation * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_RELAX_NG__ #define __XML_RELAX_NG__ #include #include #include #ifdef LIBXML_SCHEMAS_ENABLED #ifdef __cplusplus extern "C" { #endif typedef struct _xmlRelaxNG xmlRelaxNG; typedef xmlRelaxNG *xmlRelaxNGPtr; /** * xmlRelaxNGValidityErrorFunc: * @ctx: the validation context * @msg: the message * @...: extra arguments * * Signature of an error callback from a Relax-NG validation */ typedef void (XMLCDECL *xmlRelaxNGValidityErrorFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * xmlRelaxNGValidityWarningFunc: * @ctx: the validation context * @msg: the message * @...: extra arguments * * Signature of a warning callback from a Relax-NG validation */ typedef void (XMLCDECL *xmlRelaxNGValidityWarningFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * A schemas validation context */ typedef struct _xmlRelaxNGParserCtxt xmlRelaxNGParserCtxt; typedef xmlRelaxNGParserCtxt *xmlRelaxNGParserCtxtPtr; typedef struct _xmlRelaxNGValidCtxt xmlRelaxNGValidCtxt; typedef xmlRelaxNGValidCtxt *xmlRelaxNGValidCtxtPtr; /* * xmlRelaxNGValidErr: * * List of possible Relax NG validation errors */ typedef enum { XML_RELAXNG_OK = 0, XML_RELAXNG_ERR_MEMORY, XML_RELAXNG_ERR_TYPE, XML_RELAXNG_ERR_TYPEVAL, XML_RELAXNG_ERR_DUPID, XML_RELAXNG_ERR_TYPECMP, XML_RELAXNG_ERR_NOSTATE, XML_RELAXNG_ERR_NODEFINE, XML_RELAXNG_ERR_LISTEXTRA, XML_RELAXNG_ERR_LISTEMPTY, XML_RELAXNG_ERR_INTERNODATA, XML_RELAXNG_ERR_INTERSEQ, XML_RELAXNG_ERR_INTEREXTRA, XML_RELAXNG_ERR_ELEMNAME, XML_RELAXNG_ERR_ATTRNAME, XML_RELAXNG_ERR_ELEMNONS, XML_RELAXNG_ERR_ATTRNONS, XML_RELAXNG_ERR_ELEMWRONGNS, XML_RELAXNG_ERR_ATTRWRONGNS, XML_RELAXNG_ERR_ELEMEXTRANS, XML_RELAXNG_ERR_ATTREXTRANS, XML_RELAXNG_ERR_ELEMNOTEMPTY, XML_RELAXNG_ERR_NOELEM, XML_RELAXNG_ERR_NOTELEM, XML_RELAXNG_ERR_ATTRVALID, XML_RELAXNG_ERR_CONTENTVALID, XML_RELAXNG_ERR_EXTRACONTENT, XML_RELAXNG_ERR_INVALIDATTR, XML_RELAXNG_ERR_DATAELEM, XML_RELAXNG_ERR_VALELEM, XML_RELAXNG_ERR_LISTELEM, XML_RELAXNG_ERR_DATATYPE, XML_RELAXNG_ERR_VALUE, XML_RELAXNG_ERR_LIST, XML_RELAXNG_ERR_NOGRAMMAR, XML_RELAXNG_ERR_EXTRADATA, XML_RELAXNG_ERR_LACKDATA, XML_RELAXNG_ERR_INTERNAL, XML_RELAXNG_ERR_ELEMWRONG, XML_RELAXNG_ERR_TEXTWRONG } xmlRelaxNGValidErr; /* * xmlRelaxNGParserFlags: * * List of possible Relax NG Parser flags */ typedef enum { XML_RELAXNGP_NONE = 0, XML_RELAXNGP_FREE_DOC = 1, XML_RELAXNGP_CRNG = 2 } xmlRelaxNGParserFlag; XMLPUBFUN int XMLCALL xmlRelaxNGInitTypes (void); XMLPUBFUN void XMLCALL xmlRelaxNGCleanupTypes (void); /* * Interfaces for parsing. */ XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL xmlRelaxNGNewParserCtxt (const char *URL); XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL xmlRelaxNGNewMemParserCtxt (const char *buffer, int size); XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL xmlRelaxNGNewDocParserCtxt (xmlDocPtr doc); XMLPUBFUN int XMLCALL xmlRelaxParserSetFlag (xmlRelaxNGParserCtxtPtr ctxt, int flag); XMLPUBFUN void XMLCALL xmlRelaxNGFreeParserCtxt (xmlRelaxNGParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGValidityErrorFunc err, xmlRelaxNGValidityWarningFunc warn, void *ctx); XMLPUBFUN int XMLCALL xmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGValidityErrorFunc *err, xmlRelaxNGValidityWarningFunc *warn, void **ctx); XMLPUBFUN void XMLCALL xmlRelaxNGSetParserStructuredErrors( xmlRelaxNGParserCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx); XMLPUBFUN xmlRelaxNGPtr XMLCALL xmlRelaxNGParse (xmlRelaxNGParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlRelaxNGFree (xmlRelaxNGPtr schema); #ifdef LIBXML_OUTPUT_ENABLED XMLPUBFUN void XMLCALL xmlRelaxNGDump (FILE *output, xmlRelaxNGPtr schema); XMLPUBFUN void XMLCALL xmlRelaxNGDumpTree (FILE * output, xmlRelaxNGPtr schema); #endif /* LIBXML_OUTPUT_ENABLED */ /* * Interfaces for validating */ XMLPUBFUN void XMLCALL xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidityErrorFunc err, xmlRelaxNGValidityWarningFunc warn, void *ctx); XMLPUBFUN int XMLCALL xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidityErrorFunc *err, xmlRelaxNGValidityWarningFunc *warn, void **ctx); XMLPUBFUN void XMLCALL xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx); XMLPUBFUN xmlRelaxNGValidCtxtPtr XMLCALL xmlRelaxNGNewValidCtxt (xmlRelaxNGPtr schema); XMLPUBFUN void XMLCALL xmlRelaxNGFreeValidCtxt (xmlRelaxNGValidCtxtPtr ctxt); XMLPUBFUN int XMLCALL xmlRelaxNGValidateDoc (xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc); /* * Interfaces for progressive validation when possible */ XMLPUBFUN int XMLCALL xmlRelaxNGValidatePushElement (xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem); XMLPUBFUN int XMLCALL xmlRelaxNGValidatePushCData (xmlRelaxNGValidCtxtPtr ctxt, const xmlChar *data, int len); XMLPUBFUN int XMLCALL xmlRelaxNGValidatePopElement (xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem); XMLPUBFUN int XMLCALL xmlRelaxNGValidateFullElement (xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem); #ifdef __cplusplus } #endif #endif /* LIBXML_SCHEMAS_ENABLED */ #endif /* __XML_RELAX_NG__ */ libxml2-2.9.1+dfsg1/include/libxml/SAX.h0000644000175000017500000001036512113312342016267 0ustar aronaron/* * Summary: Old SAX version 1 handler, deprecated * Description: DEPRECATED set of SAX version 1 interfaces used to * build the DOM tree. * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_SAX_H__ #define __XML_SAX_H__ #include #include #include #include #include #ifdef LIBXML_LEGACY_ENABLED #ifdef __cplusplus extern "C" { #endif XMLPUBFUN const xmlChar * XMLCALL getPublicId (void *ctx); XMLPUBFUN const xmlChar * XMLCALL getSystemId (void *ctx); XMLPUBFUN void XMLCALL setDocumentLocator (void *ctx, xmlSAXLocatorPtr loc); XMLPUBFUN int XMLCALL getLineNumber (void *ctx); XMLPUBFUN int XMLCALL getColumnNumber (void *ctx); XMLPUBFUN int XMLCALL isStandalone (void *ctx); XMLPUBFUN int XMLCALL hasInternalSubset (void *ctx); XMLPUBFUN int XMLCALL hasExternalSubset (void *ctx); XMLPUBFUN void XMLCALL internalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN void XMLCALL externalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); XMLPUBFUN xmlEntityPtr XMLCALL getEntity (void *ctx, const xmlChar *name); XMLPUBFUN xmlEntityPtr XMLCALL getParameterEntity (void *ctx, const xmlChar *name); XMLPUBFUN xmlParserInputPtr XMLCALL resolveEntity (void *ctx, const xmlChar *publicId, const xmlChar *systemId); XMLPUBFUN void XMLCALL entityDecl (void *ctx, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content); XMLPUBFUN void XMLCALL attributeDecl (void *ctx, const xmlChar *elem, const xmlChar *fullname, int type, int def, const xmlChar *defaultValue, xmlEnumerationPtr tree); XMLPUBFUN void XMLCALL elementDecl (void *ctx, const xmlChar *name, int type, xmlElementContentPtr content); XMLPUBFUN void XMLCALL notationDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId); XMLPUBFUN void XMLCALL unparsedEntityDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName); XMLPUBFUN void XMLCALL startDocument (void *ctx); XMLPUBFUN void XMLCALL endDocument (void *ctx); XMLPUBFUN void XMLCALL attribute (void *ctx, const xmlChar *fullname, const xmlChar *value); XMLPUBFUN void XMLCALL startElement (void *ctx, const xmlChar *fullname, const xmlChar **atts); XMLPUBFUN void XMLCALL endElement (void *ctx, const xmlChar *name); XMLPUBFUN void XMLCALL reference (void *ctx, const xmlChar *name); XMLPUBFUN void XMLCALL characters (void *ctx, const xmlChar *ch, int len); XMLPUBFUN void XMLCALL ignorableWhitespace (void *ctx, const xmlChar *ch, int len); XMLPUBFUN void XMLCALL processingInstruction (void *ctx, const xmlChar *target, const xmlChar *data); XMLPUBFUN void XMLCALL globalNamespace (void *ctx, const xmlChar *href, const xmlChar *prefix); XMLPUBFUN void XMLCALL setNamespace (void *ctx, const xmlChar *name); XMLPUBFUN xmlNsPtr XMLCALL getNamespace (void *ctx); XMLPUBFUN int XMLCALL checkNamespace (void *ctx, xmlChar *nameSpace); XMLPUBFUN void XMLCALL namespaceDecl (void *ctx, const xmlChar *href, const xmlChar *prefix); XMLPUBFUN void XMLCALL comment (void *ctx, const xmlChar *value); XMLPUBFUN void XMLCALL cdataBlock (void *ctx, const xmlChar *value, int len); #ifdef LIBXML_SAX1_ENABLED XMLPUBFUN void XMLCALL initxmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr, int warning); #ifdef LIBXML_HTML_ENABLED XMLPUBFUN void XMLCALL inithtmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); #endif #ifdef LIBXML_DOCB_ENABLED XMLPUBFUN void XMLCALL initdocbDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); #endif #endif /* LIBXML_SAX1_ENABLED */ #ifdef __cplusplus } #endif #endif /* LIBXML_LEGACY_ENABLED */ #endif /* __XML_SAX_H__ */ libxml2-2.9.1+dfsg1/include/libxml/c14n.h0000644000175000017500000000604512113312342016401 0ustar aronaron/* * Summary: Provide Canonical XML and Exclusive XML Canonicalization * Description: the c14n modules provides a * * "Canonical XML" implementation * http://www.w3.org/TR/xml-c14n * * and an * * "Exclusive XML Canonicalization" implementation * http://www.w3.org/TR/xml-exc-c14n * Copy: See Copyright for the status of this software. * * Author: Aleksey Sanin */ #ifndef __XML_C14N_H__ #define __XML_C14N_H__ #ifdef LIBXML_C14N_ENABLED #ifdef LIBXML_OUTPUT_ENABLED #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #include #include /* * XML Canonicazation * http://www.w3.org/TR/xml-c14n * * Exclusive XML Canonicazation * http://www.w3.org/TR/xml-exc-c14n * * Canonical form of an XML document could be created if and only if * a) default attributes (if any) are added to all nodes * b) all character and parsed entity references are resolved * In order to achive this in libxml2 the document MUST be loaded with * following global setings: * * xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; * xmlSubstituteEntitiesDefault(1); * * or corresponding parser context setting: * xmlParserCtxtPtr ctxt; * * ... * ctxt->loadsubset = XML_DETECT_IDS | XML_COMPLETE_ATTRS; * ctxt->replaceEntities = 1; * ... */ /* * xmlC14NMode: * * Predefined values for C14N modes * */ typedef enum { XML_C14N_1_0 = 0, /* Origianal C14N 1.0 spec */ XML_C14N_EXCLUSIVE_1_0 = 1, /* Exclusive C14N 1.0 spec */ XML_C14N_1_1 = 2 /* C14N 1.1 spec */ } xmlC14NMode; XMLPUBFUN int XMLCALL xmlC14NDocSaveTo (xmlDocPtr doc, xmlNodeSetPtr nodes, int mode, /* a xmlC14NMode */ xmlChar **inclusive_ns_prefixes, int with_comments, xmlOutputBufferPtr buf); XMLPUBFUN int XMLCALL xmlC14NDocDumpMemory (xmlDocPtr doc, xmlNodeSetPtr nodes, int mode, /* a xmlC14NMode */ xmlChar **inclusive_ns_prefixes, int with_comments, xmlChar **doc_txt_ptr); XMLPUBFUN int XMLCALL xmlC14NDocSave (xmlDocPtr doc, xmlNodeSetPtr nodes, int mode, /* a xmlC14NMode */ xmlChar **inclusive_ns_prefixes, int with_comments, const char* filename, int compression); /** * This is the core C14N function */ /** * xmlC14NIsVisibleCallback: * @user_data: user data * @node: the curent node * @parent: the parent node * * Signature for a C14N callback on visible nodes * * Returns 1 if the node should be included */ typedef int (*xmlC14NIsVisibleCallback) (void* user_data, xmlNodePtr node, xmlNodePtr parent); XMLPUBFUN int XMLCALL xmlC14NExecute (xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback, void* user_data, int mode, /* a xmlC14NMode */ xmlChar **inclusive_ns_prefixes, int with_comments, xmlOutputBufferPtr buf); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* LIBXML_OUTPUT_ENABLED */ #endif /* LIBXML_C14N_ENABLED */ #endif /* __XML_C14N_H__ */ libxml2-2.9.1+dfsg1/include/libxml/xmlunicode.h0000644000175000017500000002341111234335462020012 0ustar aronaron/* * Summary: Unicode character APIs * Description: API for the Unicode character APIs * * This file is automatically generated from the * UCS description files of the Unicode Character Database * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html * using the genUnicode.py Python script. * * Generation date: Mon Mar 27 11:09:52 2006 * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt * Author: Daniel Veillard */ #ifndef __XML_UNICODE_H__ #define __XML_UNICODE_H__ #include #ifdef LIBXML_UNICODE_ENABLED #ifdef __cplusplus extern "C" { #endif XMLPUBFUN int XMLCALL xmlUCSIsAegeanNumbers (int code); XMLPUBFUN int XMLCALL xmlUCSIsAlphabeticPresentationForms (int code); XMLPUBFUN int XMLCALL xmlUCSIsArabic (int code); XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsA (int code); XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsB (int code); XMLPUBFUN int XMLCALL xmlUCSIsArmenian (int code); XMLPUBFUN int XMLCALL xmlUCSIsArrows (int code); XMLPUBFUN int XMLCALL xmlUCSIsBasicLatin (int code); XMLPUBFUN int XMLCALL xmlUCSIsBengali (int code); XMLPUBFUN int XMLCALL xmlUCSIsBlockElements (int code); XMLPUBFUN int XMLCALL xmlUCSIsBopomofo (int code); XMLPUBFUN int XMLCALL xmlUCSIsBopomofoExtended (int code); XMLPUBFUN int XMLCALL xmlUCSIsBoxDrawing (int code); XMLPUBFUN int XMLCALL xmlUCSIsBraillePatterns (int code); XMLPUBFUN int XMLCALL xmlUCSIsBuhid (int code); XMLPUBFUN int XMLCALL xmlUCSIsByzantineMusicalSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibility (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityForms (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographs (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographsSupplement (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKRadicalsSupplement (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKSymbolsandPunctuation (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographs (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionA (int code); XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionB (int code); XMLPUBFUN int XMLCALL xmlUCSIsCherokee (int code); XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarks (int code); XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarksforSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsCombiningHalfMarks (int code); XMLPUBFUN int XMLCALL xmlUCSIsCombiningMarksforSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsControlPictures (int code); XMLPUBFUN int XMLCALL xmlUCSIsCurrencySymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsCypriotSyllabary (int code); XMLPUBFUN int XMLCALL xmlUCSIsCyrillic (int code); XMLPUBFUN int XMLCALL xmlUCSIsCyrillicSupplement (int code); XMLPUBFUN int XMLCALL xmlUCSIsDeseret (int code); XMLPUBFUN int XMLCALL xmlUCSIsDevanagari (int code); XMLPUBFUN int XMLCALL xmlUCSIsDingbats (int code); XMLPUBFUN int XMLCALL xmlUCSIsEnclosedAlphanumerics (int code); XMLPUBFUN int XMLCALL xmlUCSIsEnclosedCJKLettersandMonths (int code); XMLPUBFUN int XMLCALL xmlUCSIsEthiopic (int code); XMLPUBFUN int XMLCALL xmlUCSIsGeneralPunctuation (int code); XMLPUBFUN int XMLCALL xmlUCSIsGeometricShapes (int code); XMLPUBFUN int XMLCALL xmlUCSIsGeorgian (int code); XMLPUBFUN int XMLCALL xmlUCSIsGothic (int code); XMLPUBFUN int XMLCALL xmlUCSIsGreek (int code); XMLPUBFUN int XMLCALL xmlUCSIsGreekExtended (int code); XMLPUBFUN int XMLCALL xmlUCSIsGreekandCoptic (int code); XMLPUBFUN int XMLCALL xmlUCSIsGujarati (int code); XMLPUBFUN int XMLCALL xmlUCSIsGurmukhi (int code); XMLPUBFUN int XMLCALL xmlUCSIsHalfwidthandFullwidthForms (int code); XMLPUBFUN int XMLCALL xmlUCSIsHangulCompatibilityJamo (int code); XMLPUBFUN int XMLCALL xmlUCSIsHangulJamo (int code); XMLPUBFUN int XMLCALL xmlUCSIsHangulSyllables (int code); XMLPUBFUN int XMLCALL xmlUCSIsHanunoo (int code); XMLPUBFUN int XMLCALL xmlUCSIsHebrew (int code); XMLPUBFUN int XMLCALL xmlUCSIsHighPrivateUseSurrogates (int code); XMLPUBFUN int XMLCALL xmlUCSIsHighSurrogates (int code); XMLPUBFUN int XMLCALL xmlUCSIsHiragana (int code); XMLPUBFUN int XMLCALL xmlUCSIsIPAExtensions (int code); XMLPUBFUN int XMLCALL xmlUCSIsIdeographicDescriptionCharacters (int code); XMLPUBFUN int XMLCALL xmlUCSIsKanbun (int code); XMLPUBFUN int XMLCALL xmlUCSIsKangxiRadicals (int code); XMLPUBFUN int XMLCALL xmlUCSIsKannada (int code); XMLPUBFUN int XMLCALL xmlUCSIsKatakana (int code); XMLPUBFUN int XMLCALL xmlUCSIsKatakanaPhoneticExtensions (int code); XMLPUBFUN int XMLCALL xmlUCSIsKhmer (int code); XMLPUBFUN int XMLCALL xmlUCSIsKhmerSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsLao (int code); XMLPUBFUN int XMLCALL xmlUCSIsLatin1Supplement (int code); XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedA (int code); XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedB (int code); XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedAdditional (int code); XMLPUBFUN int XMLCALL xmlUCSIsLetterlikeSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsLimbu (int code); XMLPUBFUN int XMLCALL xmlUCSIsLinearBIdeograms (int code); XMLPUBFUN int XMLCALL xmlUCSIsLinearBSyllabary (int code); XMLPUBFUN int XMLCALL xmlUCSIsLowSurrogates (int code); XMLPUBFUN int XMLCALL xmlUCSIsMalayalam (int code); XMLPUBFUN int XMLCALL xmlUCSIsMathematicalAlphanumericSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsMathematicalOperators (int code); XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsA (int code); XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsB (int code); XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbolsandArrows (int code); XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousTechnical (int code); XMLPUBFUN int XMLCALL xmlUCSIsMongolian (int code); XMLPUBFUN int XMLCALL xmlUCSIsMusicalSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsMyanmar (int code); XMLPUBFUN int XMLCALL xmlUCSIsNumberForms (int code); XMLPUBFUN int XMLCALL xmlUCSIsOgham (int code); XMLPUBFUN int XMLCALL xmlUCSIsOldItalic (int code); XMLPUBFUN int XMLCALL xmlUCSIsOpticalCharacterRecognition (int code); XMLPUBFUN int XMLCALL xmlUCSIsOriya (int code); XMLPUBFUN int XMLCALL xmlUCSIsOsmanya (int code); XMLPUBFUN int XMLCALL xmlUCSIsPhoneticExtensions (int code); XMLPUBFUN int XMLCALL xmlUCSIsPrivateUse (int code); XMLPUBFUN int XMLCALL xmlUCSIsPrivateUseArea (int code); XMLPUBFUN int XMLCALL xmlUCSIsRunic (int code); XMLPUBFUN int XMLCALL xmlUCSIsShavian (int code); XMLPUBFUN int XMLCALL xmlUCSIsSinhala (int code); XMLPUBFUN int XMLCALL xmlUCSIsSmallFormVariants (int code); XMLPUBFUN int XMLCALL xmlUCSIsSpacingModifierLetters (int code); XMLPUBFUN int XMLCALL xmlUCSIsSpecials (int code); XMLPUBFUN int XMLCALL xmlUCSIsSuperscriptsandSubscripts (int code); XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsA (int code); XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsB (int code); XMLPUBFUN int XMLCALL xmlUCSIsSupplementalMathematicalOperators (int code); XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaA (int code); XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaB (int code); XMLPUBFUN int XMLCALL xmlUCSIsSyriac (int code); XMLPUBFUN int XMLCALL xmlUCSIsTagalog (int code); XMLPUBFUN int XMLCALL xmlUCSIsTagbanwa (int code); XMLPUBFUN int XMLCALL xmlUCSIsTags (int code); XMLPUBFUN int XMLCALL xmlUCSIsTaiLe (int code); XMLPUBFUN int XMLCALL xmlUCSIsTaiXuanJingSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsTamil (int code); XMLPUBFUN int XMLCALL xmlUCSIsTelugu (int code); XMLPUBFUN int XMLCALL xmlUCSIsThaana (int code); XMLPUBFUN int XMLCALL xmlUCSIsThai (int code); XMLPUBFUN int XMLCALL xmlUCSIsTibetan (int code); XMLPUBFUN int XMLCALL xmlUCSIsUgaritic (int code); XMLPUBFUN int XMLCALL xmlUCSIsUnifiedCanadianAboriginalSyllabics (int code); XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectors (int code); XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectorsSupplement (int code); XMLPUBFUN int XMLCALL xmlUCSIsYiRadicals (int code); XMLPUBFUN int XMLCALL xmlUCSIsYiSyllables (int code); XMLPUBFUN int XMLCALL xmlUCSIsYijingHexagramSymbols (int code); XMLPUBFUN int XMLCALL xmlUCSIsBlock (int code, const char *block); XMLPUBFUN int XMLCALL xmlUCSIsCatC (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatCc (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatCf (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatCo (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatCs (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatL (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatLl (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatLm (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatLo (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatLt (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatLu (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatM (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatMc (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatMe (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatMn (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatN (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatNd (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatNl (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatNo (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatP (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatPc (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatPd (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatPe (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatPf (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatPi (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatPo (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatPs (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatS (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatSc (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatSk (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatSm (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatSo (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatZ (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatZl (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatZp (int code); XMLPUBFUN int XMLCALL xmlUCSIsCatZs (int code); XMLPUBFUN int XMLCALL xmlUCSIsCat (int code, const char *cat); #ifdef __cplusplus } #endif #endif /* LIBXML_UNICODE_ENABLED */ #endif /* __XML_UNICODE_H__ */ libxml2-2.9.1+dfsg1/include/wsockcompat.h0000644000175000017500000000551512113312342016700 0ustar aronaron/* include/wsockcompat.h * Windows -> Berkeley Sockets compatibility things. */ #if !defined __XML_WSOCKCOMPAT_H__ #define __XML_WSOCKCOMPAT_H__ #ifdef _WIN32_WCE #include #else #undef HAVE_ERRNO_H #include /* the following is a workaround a problem for 'inline' keyword in said header when compiled with Borland C++ 6 */ #if defined(__BORLANDC__) && !defined(__cplusplus) #define inline __inline #define _inline __inline #endif #include /* Check if ws2tcpip.h is a recent version which provides getaddrinfo() */ #if defined(GetAddrInfo) #include #define HAVE_GETADDRINFO #endif #endif #if defined( __MINGW32__ ) || defined( _MSC_VER ) /* Include here to ensure that it doesn't get included later * (e.g. by iconv.h) and overwrites the definition of EWOULDBLOCK. */ #include #undef EWOULDBLOCK #endif #if !defined SOCKLEN_T #define SOCKLEN_T int #endif #define EWOULDBLOCK WSAEWOULDBLOCK #define ESHUTDOWN WSAESHUTDOWN #if (!defined(_MSC_VER) || (_MSC_VER < 1600)) #define EINPROGRESS WSAEINPROGRESS #define EALREADY WSAEALREADY #define ENOTSOCK WSAENOTSOCK #define EDESTADDRREQ WSAEDESTADDRREQ #define EMSGSIZE WSAEMSGSIZE #define EPROTOTYPE WSAEPROTOTYPE #define ENOPROTOOPT WSAENOPROTOOPT #define EPROTONOSUPPORT WSAEPROTONOSUPPORT #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT #define EOPNOTSUPP WSAEOPNOTSUPP #define EPFNOSUPPORT WSAEPFNOSUPPORT #define EAFNOSUPPORT WSAEAFNOSUPPORT #define EADDRINUSE WSAEADDRINUSE #define EADDRNOTAVAIL WSAEADDRNOTAVAIL #define ENETDOWN WSAENETDOWN #define ENETUNREACH WSAENETUNREACH #define ENETRESET WSAENETRESET #define ECONNABORTED WSAECONNABORTED #define ECONNRESET WSAECONNRESET #define ENOBUFS WSAENOBUFS #define EISCONN WSAEISCONN #define ENOTCONN WSAENOTCONN #define ETOOMANYREFS WSAETOOMANYREFS #define ETIMEDOUT WSAETIMEDOUT #define ECONNREFUSED WSAECONNREFUSED #define ELOOP WSAELOOP #define EHOSTDOWN WSAEHOSTDOWN #define EHOSTUNREACH WSAEHOSTUNREACH #define EPROCLIM WSAEPROCLIM #define EUSERS WSAEUSERS #define EDQUOT WSAEDQUOT #define ESTALE WSAESTALE #define EREMOTE WSAEREMOTE /* These cause conflicts with the codes from errno.h. Since they are not used in the relevant code (nanoftp, nanohttp), we can leave them disabled. #define ENAMETOOLONG WSAENAMETOOLONG #define ENOTEMPTY WSAENOTEMPTY */ #endif /* _MSC_VER */ #endif /* __XML_WSOCKCOMPAT_H__ */ libxml2-2.9.1+dfsg1/include/Makefile.am0000644000175000017500000000016411234335462016237 0ustar aronaron## Process this file with automake to produce Makefile.in SUBDIRS=libxml EXTRA_DIST = win32config.h wsockcompat.h libxml2-2.9.1+dfsg1/libxml.spec.in0000644000175000017500000001076212113312342015322 0ustar aronaronSummary: Library providing XML and HTML support Name: libxml2 Version: @VERSION@ Release: 1%{?dist}%{?extra_release} License: MIT Group: Development/Libraries Source: ftp://xmlsoft.org/libxml2/libxml2-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-root BuildRequires: python python-devel zlib-devel pkgconfig xz-devel URL: http://xmlsoft.org/ %description This library allows to manipulate XML files. It includes support to read, modify and write XML and HTML files. There is DTDs support this includes parsing and validation even with complex DtDs, either at parse time or later once the document has been modified. The output can be a simple SAX stream or and in-memory DOM like representations. In this case one can use the built-in XPath and XPointer implementation to select sub nodes or ranges. A flexible Input/Output mechanism is available, with existing HTTP and FTP modules and combined to an URI library. %package devel Summary: Libraries, includes, etc. to develop XML and HTML applications Group: Development/Libraries Requires: libxml2 = %{version}-%{release} Requires: zlib-devel Requires: xz-devel Requires: pkgconfig %description devel Libraries, include files, etc you can use to develop XML applications. This library allows to manipulate XML files. It includes support to read, modify and write XML and HTML files. There is DTDs support this includes parsing and validation even with complex DtDs, either at parse time or later once the document has been modified. The output can be a simple SAX stream or and in-memory DOM like representations. In this case one can use the built-in XPath and XPointer implementation to select sub nodes or ranges. A flexible Input/Output mechanism is available, with existing HTTP and FTP modules and combined to an URI library. %package static Summary: Static library for libxml2 Group: Development/Libraries Requires: libxml2 = %{version}-%{release} %description static Static library for libxml2 provided for specific uses or shaving a few microseconds when parsing, do not link to them for generic purpose packages. %package python Summary: Python bindings for the libxml2 library Group: Development/Libraries Requires: libxml2 = %{version}-%{release} %description python The libxml2-python package contains a module that permits applications written in the Python programming language to use the interface supplied by the libxml2 library to manipulate XML files. This library allows to manipulate XML files. It includes support to read, modify and write XML and HTML files. There is DTDs support this includes parsing and validation even with complex DTDs, either at parse time or later once the document has been modified. %prep %setup -q %build %configure make %{_smp_mflags} %install rm -fr %{buildroot} make install DESTDIR=%{buildroot} rm -f $RPM_BUILD_ROOT%{_libdir}/*.la rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-%{version}/* rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libxml2-python-%{version}/* (cd doc/examples ; make clean ; rm -rf .deps Makefile) gzip -9 -c doc/libxml2-api.xml > doc/libxml2-api.xml.gz %check make runtests %clean rm -fr %{buildroot} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %defattr(-, root, root) %doc AUTHORS NEWS README Copyright TODO %doc %{_mandir}/man1/xmllint.1* %doc %{_mandir}/man1/xmlcatalog.1* %doc %{_mandir}/man3/libxml.3* %{_libdir}/lib*.so.* %{_bindir}/xmllint %{_bindir}/xmlcatalog %files devel %defattr(-, root, root) %doc %{_mandir}/man1/xml2-config.1* %doc AUTHORS NEWS README Copyright %doc doc/*.html doc/html doc/*.gif doc/*.png %doc doc/tutorial doc/libxml2-api.xml.gz %doc doc/examples %doc %dir %{_datadir}/gtk-doc/html/libxml2 %doc %{_datadir}/gtk-doc/html/libxml2/*.devhelp %doc %{_datadir}/gtk-doc/html/libxml2/*.html %doc %{_datadir}/gtk-doc/html/libxml2/*.png %doc %{_datadir}/gtk-doc/html/libxml2/*.css %{_libdir}/lib*.so %{_libdir}/*.sh %{_includedir}/* %{_bindir}/xml2-config %{_datadir}/aclocal/libxml.m4 %{_libdir}/pkgconfig/libxml-2.0.pc %files static %defattr(-, root, root) %{_libdir}/*a %files python %defattr(-, root, root) %{_libdir}/python*/site-packages/libxml2.py* %{_libdir}/python*/site-packages/drv_libxml2.py* %{_libdir}/python*/site-packages/libxml2mod* %doc python/TODO %doc python/libxml2class.txt %doc python/tests/*.py %doc doc/*.py %doc doc/python.html %changelog * @RELDATE@ Daniel Veillard - upstream release @VERSION@ see http://xmlsoft.org/news.html libxml2-2.9.1+dfsg1/TODO_SCHEMAS0000644000175000017500000000163211234335462014414 0ustar aronaron- implement counted transitions at the automata level - Unicode: + upgrade to 3.2 + improve the python script to generate better test expressions to check the list of ranges. - Implement the interface at the SAX level - Implement the missing parts in the Structure part + all content model + enumerations + countless others c.f. the TODO scattered in the code - Complete the Built-In datatype collections and Facets implementations - Regression tests based on + the primer: http://www.w3.org/TR/xmlschema-0/ + the Schemas Test Collection: http://www.w3.org/2001/05/xmlschema-test-collection/ + archives of the schemas-dev list - Integrity constraints: + what's that ? How need to read about it - "formal" checking, i.e. go through the full Structure spec and bind code and associated parts of the Schemas spec - go though the erratas http://www.w3.org/2001/05/xmlschema-errata libxml2-2.9.1+dfsg1/testAutomata.c0000644000175000017500000001674212113312343015376 0ustar aronaron/* * testRegexp.c: simple module for testing regular expressions * * See Copyright for the status of this software. * * Daniel Veillard */ #include "libxml.h" #ifdef LIBXML_AUTOMATA_ENABLED #include #include #include static int scanNumber(char **ptr) { int ret = 0; char *cur; cur = *ptr; while ((*cur >= '0') && (*cur <= '9')) { ret = ret * 10 + (*cur - '0'); cur++; } *ptr = cur; return(ret); } static void testRegexpFile(const char *filename) { FILE *input; char expr[5000]; int len; int ret; int i; xmlAutomataPtr am; xmlAutomataStatePtr states[1000]; xmlRegexpPtr regexp = NULL; xmlRegExecCtxtPtr exec = NULL; for (i = 0;i<1000;i++) states[i] = NULL; input = fopen(filename, "r"); if (input == NULL) { xmlGenericError(xmlGenericErrorContext, "Cannot open %s for reading\n", filename); return; } am = xmlNewAutomata(); if (am == NULL) { xmlGenericError(xmlGenericErrorContext, "Cannot create automata\n"); fclose(input); return; } states[0] = xmlAutomataGetInitState(am); if (states[0] == NULL) { xmlGenericError(xmlGenericErrorContext, "Cannot get start state\n"); xmlFreeAutomata(am); fclose(input); return; } ret = 0; while (fgets(expr, 4500, input) != NULL) { if (expr[0] == '#') continue; len = strlen(expr); len--; while ((len >= 0) && ((expr[len] == '\n') || (expr[len] == '\t') || (expr[len] == '\r') || (expr[len] == ' '))) len--; expr[len + 1] = 0; if (len >= 0) { if ((am != NULL) && (expr[0] == 't') && (expr[1] == ' ')) { char *ptr = &expr[2]; int from, to; from = scanNumber(&ptr); if (*ptr != ' ') { xmlGenericError(xmlGenericErrorContext, "Bad line %s\n", expr); break; } if (states[from] == NULL) states[from] = xmlAutomataNewState(am); ptr++; to = scanNumber(&ptr); if (*ptr != ' ') { xmlGenericError(xmlGenericErrorContext, "Bad line %s\n", expr); break; } if (states[to] == NULL) states[to] = xmlAutomataNewState(am); ptr++; xmlAutomataNewTransition(am, states[from], states[to], BAD_CAST ptr, NULL); } else if ((am != NULL) && (expr[0] == 'e') && (expr[1] == ' ')) { char *ptr = &expr[2]; int from, to; from = scanNumber(&ptr); if (*ptr != ' ') { xmlGenericError(xmlGenericErrorContext, "Bad line %s\n", expr); break; } if (states[from] == NULL) states[from] = xmlAutomataNewState(am); ptr++; to = scanNumber(&ptr); if (states[to] == NULL) states[to] = xmlAutomataNewState(am); xmlAutomataNewEpsilon(am, states[from], states[to]); } else if ((am != NULL) && (expr[0] == 'f') && (expr[1] == ' ')) { char *ptr = &expr[2]; int state; state = scanNumber(&ptr); if (states[state] == NULL) { xmlGenericError(xmlGenericErrorContext, "Bad state %d : %s\n", state, expr); break; } xmlAutomataSetFinalState(am, states[state]); } else if ((am != NULL) && (expr[0] == 'c') && (expr[1] == ' ')) { char *ptr = &expr[2]; int from, to; int min, max; from = scanNumber(&ptr); if (*ptr != ' ') { xmlGenericError(xmlGenericErrorContext, "Bad line %s\n", expr); break; } if (states[from] == NULL) states[from] = xmlAutomataNewState(am); ptr++; to = scanNumber(&ptr); if (*ptr != ' ') { xmlGenericError(xmlGenericErrorContext, "Bad line %s\n", expr); break; } if (states[to] == NULL) states[to] = xmlAutomataNewState(am); ptr++; min = scanNumber(&ptr); if (*ptr != ' ') { xmlGenericError(xmlGenericErrorContext, "Bad line %s\n", expr); break; } ptr++; max = scanNumber(&ptr); if (*ptr != ' ') { xmlGenericError(xmlGenericErrorContext, "Bad line %s\n", expr); break; } ptr++; xmlAutomataNewCountTrans(am, states[from], states[to], BAD_CAST ptr, min, max, NULL); } else if ((am != NULL) && (expr[0] == '-') && (expr[1] == '-')) { /* end of the automata */ regexp = xmlAutomataCompile(am); xmlFreeAutomata(am); am = NULL; if (regexp == NULL) { xmlGenericError(xmlGenericErrorContext, "Failed to compile the automata"); break; } } else if ((expr[0] == '=') && (expr[1] == '>')) { if (regexp == NULL) { printf("=> failed not compiled\n"); } else { if (exec == NULL) exec = xmlRegNewExecCtxt(regexp, NULL, NULL); if (ret == 0) { ret = xmlRegExecPushString(exec, NULL, NULL); } if (ret == 1) printf("=> Passed\n"); else if ((ret == 0) || (ret == -1)) printf("=> Failed\n"); else if (ret < 0) printf("=> Error\n"); xmlRegFreeExecCtxt(exec); exec = NULL; } ret = 0; } else if (regexp != NULL) { if (exec == NULL) exec = xmlRegNewExecCtxt(regexp, NULL, NULL); ret = xmlRegExecPushString(exec, BAD_CAST expr, NULL); } else { xmlGenericError(xmlGenericErrorContext, "Unexpected line %s\n", expr); } } } fclose(input); if (regexp != NULL) xmlRegFreeRegexp(regexp); if (exec != NULL) xmlRegFreeExecCtxt(exec); if (am != NULL) xmlFreeAutomata(am); } int main(int argc, char **argv) { xmlInitMemory(); if (argc == 1) { int ret; xmlAutomataPtr am; xmlAutomataStatePtr start, cur; xmlRegexpPtr regexp; xmlRegExecCtxtPtr exec; am = xmlNewAutomata(); start = xmlAutomataGetInitState(am); /* generate a[ba]*a */ cur = xmlAutomataNewTransition(am, start, NULL, BAD_CAST"a", NULL); xmlAutomataNewTransition(am, cur, cur, BAD_CAST"b", NULL); xmlAutomataNewTransition(am, cur, cur, BAD_CAST"a", NULL); cur = xmlAutomataNewCountTrans(am, cur, NULL, BAD_CAST"a", 2, 3, NULL); xmlAutomataSetFinalState(am, cur); /* compile it in a regexp and free the automata */ regexp = xmlAutomataCompile(am); xmlFreeAutomata(am); /* test the regexp */ xmlRegexpPrint(stdout, regexp); exec = xmlRegNewExecCtxt(regexp, NULL, NULL); ret = xmlRegExecPushString(exec, BAD_CAST"a", NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); ret =xmlRegExecPushString(exec, BAD_CAST"b", NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); if (ret == 0) { ret = xmlRegExecPushString(exec, NULL, NULL); if (ret == 1) printf("final\n"); else if (ret < 0) printf("error\n"); } xmlRegFreeExecCtxt(exec); /* free the regexp */ xmlRegFreeRegexp(regexp); } else { int i; for (i = 1;i < argc;i++) testRegexpFile(argv[i]); } xmlCleanupParser(); xmlMemoryDump(); return(0); } #else #include int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { printf("%s : Automata support not compiled in\n", argv[0]); return(0); } #endif /* LIBXML_AUTOMATA_ENABLED */ libxml2-2.9.1+dfsg1/xmlschemas.c0000644000175000017500000311136312117757562015111 0ustar aronaron/* * schemas.c : implementation of the XML Schema handling and * schema validity checking * * See Copyright for the status of this software. * * Daniel Veillard */ /* * TODO: * - when types are redefined in includes, check that all * types in the redef list are equal * -> need a type equality operation. * - if we don't intend to use the schema for schemas, we * need to validate all schema attributes (ref, type, name) * against their types. * - Eliminate item creation for: ?? * * URGENT TODO: * - For xsi-driven schema acquisition, augment the IDCs after every * acquisition episode (xmlSchemaAugmentIDC). * * NOTES: * - Elimated item creation for: , , * , , , * * PROBLEMS: * - http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0337.html * IDC XPath expression and chameleon includes: the targetNamespace is changed, so * XPath will have trouble to resolve to this namespace, since not known. * * * CONSTRAINTS: * * Schema Component Constraint: * All Group Limited (cos-all-limited) * Status: complete * (1.2) * In xmlSchemaGroupDefReferenceTermFixup() and * (2) * In xmlSchemaParseModelGroup() * TODO: Actually this should go to component-level checks, * but is done here due to performance. Move it to an other layer * is schema construction via an API is implemented. */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_SCHEMAS_ENABLED #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LIBXML_PATTERN_ENABLED #include #endif #ifdef LIBXML_READER_ENABLED #include #endif /* #define DEBUG 1 */ /* #define DEBUG_CONTENT 1 */ /* #define DEBUG_TYPE 1 */ /* #define DEBUG_CONTENT_REGEXP 1 */ /* #define DEBUG_AUTOMATA 1 */ /* #define DEBUG_IDC */ /* #define DEBUG_IDC_NODE_TABLE */ /* #define WXS_ELEM_DECL_CONS_ENABLED */ #ifdef DEBUG_IDC #ifndef DEBUG_IDC_NODE_TABLE #define DEBUG_IDC_NODE_TABLE #endif #endif /* #define ENABLE_PARTICLE_RESTRICTION 1 */ #define ENABLE_REDEFINE /* #define ENABLE_NAMED_LOCALS */ /* #define ENABLE_IDC_NODE_TABLES_TEST */ #define DUMP_CONTENT_MODEL #ifdef LIBXML_READER_ENABLED /* #define XML_SCHEMA_READER_ENABLED */ #endif #define UNBOUNDED (1 << 30) #define TODO \ xmlGenericError(xmlGenericErrorContext, \ "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); #define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##" /* * The XML Schemas namespaces */ static const xmlChar *xmlSchemaNs = (const xmlChar *) "http://www.w3.org/2001/XMLSchema"; static const xmlChar *xmlSchemaInstanceNs = (const xmlChar *) "http://www.w3.org/2001/XMLSchema-instance"; static const xmlChar *xmlNamespaceNs = (const xmlChar *) "http://www.w3.org/2000/xmlns/"; /* * Come casting macros. */ #define ACTXT_CAST (xmlSchemaAbstractCtxtPtr) #define PCTXT_CAST (xmlSchemaParserCtxtPtr) #define VCTXT_CAST (xmlSchemaValidCtxtPtr) #define WXS_BASIC_CAST (xmlSchemaBasicItemPtr) #define WXS_TREE_CAST (xmlSchemaTreeItemPtr) #define WXS_PTC_CAST (xmlSchemaParticlePtr) #define WXS_TYPE_CAST (xmlSchemaTypePtr) #define WXS_ELEM_CAST (xmlSchemaElementPtr) #define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr) #define WXS_ATTR_CAST (xmlSchemaAttributePtr) #define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr) #define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr) #define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr) #define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr) #define WXS_IDC_CAST (xmlSchemaIDCPtr) #define WXS_QNAME_CAST (xmlSchemaQNameRefPtr) #define WXS_LIST_CAST (xmlSchemaItemListPtr) /* * Macros to query common properties of components. */ #define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i)) #define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i)) /* * Macros for element declarations. */ #define WXS_ELEM_TYPEDEF(e) (e)->subtypes #define WXS_SUBST_HEAD(item) (item)->refDecl /* * Macros for attribute declarations. */ #define WXS_ATTR_TYPEDEF(a) (a)->subtypes /* * Macros for attribute uses. */ #define WXS_ATTRUSE_DECL(au) WXS_ATTR_CAST (WXS_ATTR_USE_CAST (au))->attrDecl #define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au)) #define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name #define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace /* * Macros for attribute groups. */ #define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) #define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) /* * Macros for particles. */ #define WXS_PARTICLE(p) WXS_PTC_CAST (p) #define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children #define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p)) #define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children /* * Macros for model groups definitions. */ #define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children /* * Macros for model groups. */ #define WXS_IS_MODEL_GROUP(i) \ (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \ ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \ ((i)->type == XML_SCHEMA_TYPE_ALL)) #define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children /* * Macros for schema buckets. */ #define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \ ((t) == XML_SCHEMA_SCHEMA_REDEFINE)) #define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \ ((t) == XML_SCHEMA_SCHEMA_IMPORT)) #define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b)) #define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b)) /* * Macros for complex/simple types. */ #define WXS_IS_ANYTYPE(i) \ (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \ ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE)) #define WXS_IS_COMPLEX(i) \ (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \ ((i)->builtInType == XML_SCHEMAS_ANYTYPE)) #define WXS_IS_SIMPLE(item) \ ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \ ((item->type == XML_SCHEMA_TYPE_BASIC) && \ (item->builtInType != XML_SCHEMAS_ANYTYPE))) #define WXS_IS_ANY_SIMPLE_TYPE(i) \ (((i)->type == XML_SCHEMA_TYPE_BASIC) && \ ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) #define WXS_IS_RESTRICTION(t) \ ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION) #define WXS_IS_EXTENSION(t) \ ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION) #define WXS_IS_TYPE_NOT_FIXED(i) \ (((i)->type != XML_SCHEMA_TYPE_BASIC) && \ (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0)) #define WXS_IS_TYPE_NOT_FIXED_1(item) \ (((item)->type != XML_SCHEMA_TYPE_BASIC) && \ (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0)) #define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) #define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0) /* * Macros for exclusively for complex types. */ #define WXS_HAS_COMPLEX_CONTENT(item) \ ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \ (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \ (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) #define WXS_HAS_SIMPLE_CONTENT(item) \ ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \ (item->contentType == XML_SCHEMA_CONTENT_BASIC)) #define WXS_HAS_MIXED_CONTENT(item) \ (item->contentType == XML_SCHEMA_CONTENT_MIXED) #define WXS_EMPTIABLE(t) \ (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes)) #define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes #define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes #define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t)) /* * Macros for exclusively for simple types. */ #define WXS_LIST_ITEMTYPE(t) (t)->subtypes #define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC) #define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST) #define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION) /* * Misc parser context macros. */ #define WXS_CONSTRUCTOR(ctx) (ctx)->constructor #define WXS_HAS_BUCKETS(ctx) \ ( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \ (WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) ) #define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups #define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket #define WXS_SCHEMA(ctx) (ctx)->schema #define WXS_ADD_LOCAL(ctx, item) \ xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item) #define WXS_ADD_GLOBAL(ctx, item) \ xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item) #define WXS_ADD_PENDING(ctx, item) \ xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item) /* * xmlSchemaItemList macros. */ #define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0)) /* * Misc macros. */ #define IS_SCHEMA(node, type) \ ((node != NULL) && (node->ns != NULL) && \ (xmlStrEqual(node->name, (const xmlChar *) type)) && \ (xmlStrEqual(node->ns->href, xmlSchemaNs))) #define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; } /* * Since we put the default/fixed values into the dict, we can * use pointer comparison for those values. * REMOVED: (xmlStrEqual((v1), (v2))) */ #define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2)) #define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED) #define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0)) #define HFAILURE if (res == -1) goto exit_failure; #define HERROR if (res != 0) goto exit_error; #define HSTOP(ctx) if ((ctx)->stop) goto exit; /* * Some flags used for various schema constraints. */ #define SUBSET_RESTRICTION 1<<0 #define SUBSET_EXTENSION 1<<1 #define SUBSET_SUBSTITUTION 1<<2 #define SUBSET_LIST 1<<3 #define SUBSET_UNION 1<<4 typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo; typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr; typedef struct _xmlSchemaItemList xmlSchemaItemList; typedef xmlSchemaItemList *xmlSchemaItemListPtr; struct _xmlSchemaItemList { void **items; /* used for dynamic addition of schemata */ int nbItems; /* used for dynamic addition of schemata */ int sizeItems; /* used for dynamic addition of schemata */ }; #define XML_SCHEMA_CTXT_PARSER 1 #define XML_SCHEMA_CTXT_VALIDATOR 2 typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt; typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr; struct _xmlSchemaAbstractCtxt { int type; /* E.g. XML_SCHEMA_CTXT_VALIDATOR */ }; typedef struct _xmlSchemaBucket xmlSchemaBucket; typedef xmlSchemaBucket *xmlSchemaBucketPtr; #define XML_SCHEMA_SCHEMA_MAIN 0 #define XML_SCHEMA_SCHEMA_IMPORT 1 #define XML_SCHEMA_SCHEMA_INCLUDE 2 #define XML_SCHEMA_SCHEMA_REDEFINE 3 /** * xmlSchemaSchemaRelation: * * Used to create a graph of schema relationships. */ typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation; typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr; struct _xmlSchemaSchemaRelation { xmlSchemaSchemaRelationPtr next; int type; /* E.g. XML_SCHEMA_SCHEMA_IMPORT */ const xmlChar *importNamespace; xmlSchemaBucketPtr bucket; }; #define XML_SCHEMA_BUCKET_MARKED 1<<0 #define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1 struct _xmlSchemaBucket { int type; int flags; const xmlChar *schemaLocation; const xmlChar *origTargetNamespace; const xmlChar *targetNamespace; xmlDocPtr doc; xmlSchemaSchemaRelationPtr relations; int located; int parsed; int imported; int preserveDoc; xmlSchemaItemListPtr globals; /* Global components. */ xmlSchemaItemListPtr locals; /* Local components. */ }; /** * xmlSchemaImport: * (extends xmlSchemaBucket) * * Reflects a schema. Holds some information * about the schema and its toplevel components. Duplicate * toplevel components are not checked at this level. */ typedef struct _xmlSchemaImport xmlSchemaImport; typedef xmlSchemaImport *xmlSchemaImportPtr; struct _xmlSchemaImport { int type; /* Main OR import OR include. */ int flags; const xmlChar *schemaLocation; /* The URI of the schema document. */ /* For chameleon includes, @origTargetNamespace will be NULL */ const xmlChar *origTargetNamespace; /* * For chameleon includes, @targetNamespace will be the * targetNamespace of the including schema. */ const xmlChar *targetNamespace; xmlDocPtr doc; /* The schema node-tree. */ /* @relations will hold any included/imported/redefined schemas. */ xmlSchemaSchemaRelationPtr relations; int located; int parsed; int imported; int preserveDoc; xmlSchemaItemListPtr globals; xmlSchemaItemListPtr locals; /* The imported schema. */ xmlSchemaPtr schema; }; /* * (extends xmlSchemaBucket) */ typedef struct _xmlSchemaInclude xmlSchemaInclude; typedef xmlSchemaInclude *xmlSchemaIncludePtr; struct _xmlSchemaInclude { int type; int flags; const xmlChar *schemaLocation; const xmlChar *origTargetNamespace; const xmlChar *targetNamespace; xmlDocPtr doc; xmlSchemaSchemaRelationPtr relations; int located; int parsed; int imported; int preserveDoc; xmlSchemaItemListPtr globals; /* Global components. */ xmlSchemaItemListPtr locals; /* Local components. */ /* The owning main or import schema bucket. */ xmlSchemaImportPtr ownerImport; }; /** * xmlSchemaBasicItem: * * The abstract base type for schema components. */ typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem; typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr; struct _xmlSchemaBasicItem { xmlSchemaTypeType type; }; /** * xmlSchemaAnnotItem: * * The abstract base type for annotated schema components. * (Extends xmlSchemaBasicItem) */ typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem; typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr; struct _xmlSchemaAnnotItem { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; }; /** * xmlSchemaTreeItem: * * The abstract base type for tree-like structured schema components. * (Extends xmlSchemaAnnotItem) */ typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; struct _xmlSchemaTreeItem { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; xmlSchemaTreeItemPtr next; xmlSchemaTreeItemPtr children; }; #define XML_SCHEMA_ATTR_USE_FIXED 1<<0 /** * xmlSchemaAttributeUsePtr: * * The abstract base type for tree-like structured schema components. * (Extends xmlSchemaTreeItem) */ typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse; typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr; struct _xmlSchemaAttributeUse { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; xmlSchemaAttributeUsePtr next; /* The next attr. use. */ /* * The attr. decl. OR a QName-ref. to an attr. decl. OR * a QName-ref. to an attribute group definition. */ xmlSchemaAttributePtr attrDecl; int flags; xmlNodePtr node; int occurs; /* required, optional */ const xmlChar * defValue; xmlSchemaValPtr defVal; }; /** * xmlSchemaAttributeUseProhibPtr: * * A helper component to reflect attribute prohibitions. * (Extends xmlSchemaBasicItem) */ typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib; typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr; struct _xmlSchemaAttributeUseProhib { xmlSchemaTypeType type; /* == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB */ xmlNodePtr node; const xmlChar *name; const xmlChar *targetNamespace; int isRef; }; /** * xmlSchemaRedef: */ typedef struct _xmlSchemaRedef xmlSchemaRedef; typedef xmlSchemaRedef *xmlSchemaRedefPtr; struct _xmlSchemaRedef { xmlSchemaRedefPtr next; xmlSchemaBasicItemPtr item; /* The redefining component. */ xmlSchemaBasicItemPtr reference; /* The referencing component. */ xmlSchemaBasicItemPtr target; /* The to-be-redefined component. */ const xmlChar *refName; /* The name of the to-be-redefined component. */ const xmlChar *refTargetNs; /* The target namespace of the to-be-redefined comp. */ xmlSchemaBucketPtr targetBucket; /* The redefined schema. */ }; /** * xmlSchemaConstructionCtxt: */ typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt; typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr; struct _xmlSchemaConstructionCtxt { xmlSchemaPtr mainSchema; /* The main schema. */ xmlSchemaBucketPtr mainBucket; /* The main schema bucket */ xmlDictPtr dict; xmlSchemaItemListPtr buckets; /* List of schema buckets. */ /* xmlSchemaItemListPtr relations; */ /* List of schema relations. */ xmlSchemaBucketPtr bucket; /* The current schema bucket */ xmlSchemaItemListPtr pending; /* All Components of all schemas that need to be fixed. */ xmlHashTablePtr substGroups; xmlSchemaRedefPtr redefs; xmlSchemaRedefPtr lastRedef; }; #define XML_SCHEMAS_PARSE_ERROR 1 #define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT struct _xmlSchemaParserCtxt { int type; void *errCtxt; /* user specific error context */ xmlSchemaValidityErrorFunc error; /* the callback in case of errors */ xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */ int err; int nberrors; xmlStructuredErrorFunc serror; xmlSchemaConstructionCtxtPtr constructor; int ownsConstructor; /* TODO: Move this to parser *flags*. */ /* xmlSchemaPtr topschema; */ /* xmlHashTablePtr namespaces; */ xmlSchemaPtr schema; /* The main schema in use */ int counter; const xmlChar *URL; xmlDocPtr doc; int preserve; /* Whether the doc should be freed */ const char *buffer; int size; /* * Used to build complex element content models */ xmlAutomataPtr am; xmlAutomataStatePtr start; xmlAutomataStatePtr end; xmlAutomataStatePtr state; xmlDictPtr dict; /* dictionnary for interned string names */ xmlSchemaTypePtr ctxtType; /* The current context simple/complex type */ int options; xmlSchemaValidCtxtPtr vctxt; int isS4S; int isRedefine; int xsiAssemble; int stop; /* If the parser should stop; i.e. a critical error. */ const xmlChar *targetNamespace; xmlSchemaBucketPtr redefined; /* The schema to be redefined. */ xmlSchemaRedefPtr redef; /* Used for redefinitions. */ int redefCounter; /* Used for redefinitions. */ xmlSchemaItemListPtr attrProhibs; }; /** * xmlSchemaQNameRef: * * A component reference item (not a schema component) * (Extends xmlSchemaBasicItem) */ typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef; typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr; struct _xmlSchemaQNameRef { xmlSchemaTypeType type; xmlSchemaBasicItemPtr item; /* The resolved referenced item. */ xmlSchemaTypeType itemType; const xmlChar *name; const xmlChar *targetNamespace; xmlNodePtr node; }; /** * xmlSchemaParticle: * * A particle component. * (Extends xmlSchemaTreeItem) */ typedef struct _xmlSchemaParticle xmlSchemaParticle; typedef xmlSchemaParticle *xmlSchemaParticlePtr; struct _xmlSchemaParticle { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; xmlSchemaTreeItemPtr next; /* next particle */ xmlSchemaTreeItemPtr children; /* the "term" (e.g. a model group, a group definition, a XML_SCHEMA_EXTRA_QNAMEREF (if a reference), etc.) */ int minOccurs; int maxOccurs; xmlNodePtr node; }; /** * xmlSchemaModelGroup: * * A model group component. * (Extends xmlSchemaTreeItem) */ typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; struct _xmlSchemaModelGroup { xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_SEQUENCE, XML_SCHEMA_TYPE_CHOICE, XML_SCHEMA_TYPE_ALL */ xmlSchemaAnnotPtr annot; xmlSchemaTreeItemPtr next; /* not used */ xmlSchemaTreeItemPtr children; /* first particle (OR "element decl" OR "wildcard") */ xmlNodePtr node; }; #define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0 #define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1 /** * xmlSchemaModelGroupDef: * * A model group definition component. * (Extends xmlSchemaTreeItem) */ typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef; typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr; struct _xmlSchemaModelGroupDef { xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_GROUP */ xmlSchemaAnnotPtr annot; xmlSchemaTreeItemPtr next; /* not used */ xmlSchemaTreeItemPtr children; /* the "model group" */ const xmlChar *name; const xmlChar *targetNamespace; xmlNodePtr node; int flags; }; typedef struct _xmlSchemaIDC xmlSchemaIDC; typedef xmlSchemaIDC *xmlSchemaIDCPtr; /** * xmlSchemaIDCSelect: * * The identity-constraint "field" and "selector" item, holding the * XPath expression. */ typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect; typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr; struct _xmlSchemaIDCSelect { xmlSchemaIDCSelectPtr next; xmlSchemaIDCPtr idc; int index; /* an index position if significant for IDC key-sequences */ const xmlChar *xpath; /* the XPath expression */ void *xpathComp; /* the compiled XPath expression */ }; /** * xmlSchemaIDC: * * The identity-constraint definition component. * (Extends xmlSchemaAnnotItem) */ struct _xmlSchemaIDC { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; xmlSchemaIDCPtr next; xmlNodePtr node; const xmlChar *name; const xmlChar *targetNamespace; xmlSchemaIDCSelectPtr selector; xmlSchemaIDCSelectPtr fields; int nbFields; xmlSchemaQNameRefPtr ref; }; /** * xmlSchemaIDCAug: * * The augmented IDC information used for validation. */ typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug; typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr; struct _xmlSchemaIDCAug { xmlSchemaIDCAugPtr next; /* next in a list */ xmlSchemaIDCPtr def; /* the IDC definition */ int keyrefDepth; /* the lowest tree level to which IDC tables need to be bubbled upwards */ }; /** * xmlSchemaPSVIIDCKeySequence: * * The key sequence of a node table item. */ typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey; typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr; struct _xmlSchemaPSVIIDCKey { xmlSchemaTypePtr type; xmlSchemaValPtr val; }; /** * xmlSchemaPSVIIDCNode: * * The node table item of a node table. */ typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode; typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr; struct _xmlSchemaPSVIIDCNode { xmlNodePtr node; xmlSchemaPSVIIDCKeyPtr *keys; int nodeLine; int nodeQNameID; }; /** * xmlSchemaPSVIIDCBinding: * * The identity-constraint binding item of the [identity-constraint table]. */ typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding; typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr; struct _xmlSchemaPSVIIDCBinding { xmlSchemaPSVIIDCBindingPtr next; /* next binding of a specific node */ xmlSchemaIDCPtr definition; /* the IDC definition */ xmlSchemaPSVIIDCNodePtr *nodeTable; /* array of key-sequences */ int nbNodes; /* number of entries in the node table */ int sizeNodes; /* size of the node table */ xmlSchemaItemListPtr dupls; }; #define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1 #define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2 #define XPATH_STATE_OBJ_MATCHES -2 #define XPATH_STATE_OBJ_BLOCKED -3 typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher; typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr; /** * xmlSchemaIDCStateObj: * * The state object used to evaluate XPath expressions. */ typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj; typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr; struct _xmlSchemaIDCStateObj { int type; xmlSchemaIDCStateObjPtr next; /* next if in a list */ int depth; /* depth of creation */ int *history; /* list of (depth, state-id) tuples */ int nbHistory; int sizeHistory; xmlSchemaIDCMatcherPtr matcher; /* the correspondent field/selector matcher */ xmlSchemaIDCSelectPtr sel; void *xpathCtxt; }; #define IDC_MATCHER 0 /** * xmlSchemaIDCMatcher: * * Used to evaluate IDC selectors (and fields). */ struct _xmlSchemaIDCMatcher { int type; int depth; /* the tree depth at creation time */ xmlSchemaIDCMatcherPtr next; /* next in the list */ xmlSchemaIDCMatcherPtr nextCached; /* next in the cache list */ xmlSchemaIDCAugPtr aidc; /* the augmented IDC item */ int idcType; xmlSchemaPSVIIDCKeyPtr **keySeqs; /* the key-sequences of the target elements */ int sizeKeySeqs; xmlSchemaItemListPtr targets; /* list of target-node (xmlSchemaPSVIIDCNodePtr) entries */ }; /* * Element info flags. */ #define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES 1<<0 #define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1 #define XML_SCHEMA_ELEM_INFO_NILLED 1<<2 #define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE 1<<3 #define XML_SCHEMA_NODE_INFO_VALUE_NEEDED 1<<4 #define XML_SCHEMA_ELEM_INFO_EMPTY 1<<5 #define XML_SCHEMA_ELEM_INFO_HAS_CONTENT 1<<6 #define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT 1<<7 #define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT 1<<8 #define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED 1<<9 #define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE 1<<10 /** * xmlSchemaNodeInfo: * * Holds information of an element node. */ struct _xmlSchemaNodeInfo { int nodeType; xmlNodePtr node; int nodeLine; const xmlChar *localName; const xmlChar *nsName; const xmlChar *value; xmlSchemaValPtr val; /* the pre-computed value if any */ xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ int flags; /* combination of node info flags */ int valNeeded; int normVal; xmlSchemaElementPtr decl; /* the element/attribute declaration */ int depth; xmlSchemaPSVIIDCBindingPtr idcTable; /* the table of PSVI IDC bindings for the scope element*/ xmlSchemaIDCMatcherPtr idcMatchers; /* the IDC matchers for the scope element */ xmlRegExecCtxtPtr regexCtxt; const xmlChar **nsBindings; /* Namespace bindings on this element */ int nbNsBindings; int sizeNsBindings; int hasKeyrefs; int appliedXPath; /* Indicates that an XPath has been applied. */ }; #define XML_SCHEMAS_ATTR_UNKNOWN 1 #define XML_SCHEMAS_ATTR_ASSESSED 2 #define XML_SCHEMAS_ATTR_PROHIBITED 3 #define XML_SCHEMAS_ATTR_ERR_MISSING 4 #define XML_SCHEMAS_ATTR_INVALID_VALUE 5 #define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6 #define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7 #define XML_SCHEMAS_ATTR_DEFAULT 8 #define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9 #define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10 #define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11 #define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12 #define XML_SCHEMAS_ATTR_WILD_SKIP 13 #define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14 #define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15 #define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16 #define XML_SCHEMAS_ATTR_META 17 /* * @metaType values of xmlSchemaAttrInfo. */ #define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1 #define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2 #define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3 #define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4 #define XML_SCHEMA_ATTR_INFO_META_XMLNS 5 typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo; typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr; struct _xmlSchemaAttrInfo { int nodeType; xmlNodePtr node; int nodeLine; const xmlChar *localName; const xmlChar *nsName; const xmlChar *value; xmlSchemaValPtr val; /* the pre-computed value if any */ xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ int flags; /* combination of node info flags */ xmlSchemaAttributePtr decl; /* the attribute declaration */ xmlSchemaAttributeUsePtr use; /* the attribute use */ int state; int metaType; const xmlChar *vcValue; /* the value constraint value */ xmlSchemaNodeInfoPtr parent; }; #define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1 /** * xmlSchemaValidCtxt: * * A Schemas validation context */ struct _xmlSchemaValidCtxt { int type; void *errCtxt; /* user specific data block */ xmlSchemaValidityErrorFunc error; /* the callback in case of errors */ xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */ xmlStructuredErrorFunc serror; xmlSchemaPtr schema; /* The schema in use */ xmlDocPtr doc; xmlParserInputBufferPtr input; xmlCharEncoding enc; xmlSAXHandlerPtr sax; xmlParserCtxtPtr parserCtxt; void *user_data; /* TODO: What is this for? */ char *filename; int err; int nberrors; xmlNodePtr node; xmlNodePtr cur; /* xmlSchemaTypePtr type; */ xmlRegExecCtxtPtr regexp; xmlSchemaValPtr value; int valueWS; int options; xmlNodePtr validationRoot; xmlSchemaParserCtxtPtr pctxt; int xsiAssemble; int depth; xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */ int sizeElemInfos; xmlSchemaNodeInfoPtr inode; /* the current element information */ xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */ xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */ xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */ xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */ xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/ int nbIdcNodes; int sizeIdcNodes; xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */ int nbIdcKeys; int sizeIdcKeys; int flags; xmlDictPtr dict; #ifdef LIBXML_READER_ENABLED xmlTextReaderPtr reader; #endif xmlSchemaAttrInfoPtr *attrInfos; int nbAttrInfos; int sizeAttrInfos; int skipDepth; xmlSchemaItemListPtr nodeQNames; int hasKeyrefs; int createIDCNodeTables; int psviExposeIDCNodeTables; /* Locator for error reporting in streaming mode */ xmlSchemaValidityLocatorFunc locFunc; void *locCtxt; }; /** * xmlSchemaSubstGroup: * * */ typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup; typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr; struct _xmlSchemaSubstGroup { xmlSchemaElementPtr head; xmlSchemaItemListPtr members; }; /************************************************************************ * * * Some predeclarations * * * ************************************************************************/ static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node); static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node); static int xmlSchemaTypeFixup(xmlSchemaTypePtr type, xmlSchemaAbstractCtxtPtr ctxt); static const xmlChar * xmlSchemaFacetTypeToString(xmlSchemaTypeType type); static int xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node); static int xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl, xmlSchemaParserCtxtPtr ctxt); static void xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt); static xmlSchemaWhitespaceValueType xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type); static xmlSchemaTreeItemPtr xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaTypeType type, int withParticle); static const xmlChar * xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item); static xmlSchemaTypeLinkPtr xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type); static void xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt, const char *funcName, const char *message); static int xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt, xmlSchemaTypePtr type, xmlSchemaTypePtr baseType, int subset); static void xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl, xmlSchemaParserCtxtPtr ctxt); static void xmlSchemaComponentListFree(xmlSchemaItemListPtr list); static xmlSchemaQNameRefPtr xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node); /************************************************************************ * * * Helper functions * * * ************************************************************************/ /** * xmlSchemaItemTypeToStr: * @type: the type of the schema item * * Returns the component name of a schema item. */ static const xmlChar * xmlSchemaItemTypeToStr(xmlSchemaTypeType type) { switch (type) { case XML_SCHEMA_TYPE_BASIC: return(BAD_CAST "simple type definition"); case XML_SCHEMA_TYPE_SIMPLE: return(BAD_CAST "simple type definition"); case XML_SCHEMA_TYPE_COMPLEX: return(BAD_CAST "complex type definition"); case XML_SCHEMA_TYPE_ELEMENT: return(BAD_CAST "element declaration"); case XML_SCHEMA_TYPE_ATTRIBUTE_USE: return(BAD_CAST "attribute use"); case XML_SCHEMA_TYPE_ATTRIBUTE: return(BAD_CAST "attribute declaration"); case XML_SCHEMA_TYPE_GROUP: return(BAD_CAST "model group definition"); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return(BAD_CAST "attribute group definition"); case XML_SCHEMA_TYPE_NOTATION: return(BAD_CAST "notation declaration"); case XML_SCHEMA_TYPE_SEQUENCE: return(BAD_CAST "model group (sequence)"); case XML_SCHEMA_TYPE_CHOICE: return(BAD_CAST "model group (choice)"); case XML_SCHEMA_TYPE_ALL: return(BAD_CAST "model group (all)"); case XML_SCHEMA_TYPE_PARTICLE: return(BAD_CAST "particle"); case XML_SCHEMA_TYPE_IDC_UNIQUE: return(BAD_CAST "unique identity-constraint"); /* return(BAD_CAST "IDC (unique)"); */ case XML_SCHEMA_TYPE_IDC_KEY: return(BAD_CAST "key identity-constraint"); /* return(BAD_CAST "IDC (key)"); */ case XML_SCHEMA_TYPE_IDC_KEYREF: return(BAD_CAST "keyref identity-constraint"); /* return(BAD_CAST "IDC (keyref)"); */ case XML_SCHEMA_TYPE_ANY: return(BAD_CAST "wildcard (any)"); case XML_SCHEMA_EXTRA_QNAMEREF: return(BAD_CAST "[helper component] QName reference"); case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: return(BAD_CAST "[helper component] attribute use prohibition"); default: return(BAD_CAST "Not a schema component"); } } /** * xmlSchemaGetComponentTypeStr: * @type: the type of the schema item * * Returns the component name of a schema item. */ static const xmlChar * xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item) { switch (item->type) { case XML_SCHEMA_TYPE_BASIC: if (WXS_IS_COMPLEX(WXS_TYPE_CAST item)) return(BAD_CAST "complex type definition"); else return(BAD_CAST "simple type definition"); default: return(xmlSchemaItemTypeToStr(item->type)); } } /** * xmlSchemaGetComponentNode: * @item: a schema component * * Returns node associated with the schema component. * NOTE that such a node need not be available; plus, a component's * node need not to reflect the component directly, since there is no * one-to-one relationship between the XML Schema representation and * the component representation. */ static xmlNodePtr xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item) { switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: return (((xmlSchemaElementPtr) item)->node); case XML_SCHEMA_TYPE_ATTRIBUTE: return (((xmlSchemaAttributePtr) item)->node); case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: return (((xmlSchemaTypePtr) item)->node); case XML_SCHEMA_TYPE_ANY: case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: return (((xmlSchemaWildcardPtr) item)->node); case XML_SCHEMA_TYPE_PARTICLE: return (((xmlSchemaParticlePtr) item)->node); case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: return (((xmlSchemaModelGroupPtr) item)->node); case XML_SCHEMA_TYPE_GROUP: return (((xmlSchemaModelGroupDefPtr) item)->node); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return (((xmlSchemaAttributeGroupPtr) item)->node); case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_KEYREF: return (((xmlSchemaIDCPtr) item)->node); case XML_SCHEMA_EXTRA_QNAMEREF: return(((xmlSchemaQNameRefPtr) item)->node); /* TODO: What to do with NOTATIONs? case XML_SCHEMA_TYPE_NOTATION: return (((xmlSchemaNotationPtr) item)->node); */ case XML_SCHEMA_TYPE_ATTRIBUTE_USE: return (((xmlSchemaAttributeUsePtr) item)->node); default: return (NULL); } } #if 0 /** * xmlSchemaGetNextComponent: * @item: a schema component * * Returns the next sibling of the schema component. */ static xmlSchemaBasicItemPtr xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item) { switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next); case XML_SCHEMA_TYPE_ATTRIBUTE: return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next); case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next); case XML_SCHEMA_TYPE_ANY: case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: return (NULL); case XML_SCHEMA_TYPE_PARTICLE: return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next); case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: return (NULL); case XML_SCHEMA_TYPE_GROUP: return (NULL); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next); case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_KEYREF: return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next); default: return (NULL); } } #endif /** * xmlSchemaFormatQName: * @buf: the string buffer * @namespaceName: the namespace name * @localName: the local name * * Returns the given QName in the format "{namespaceName}localName" or * just "localName" if @namespaceName is NULL. * * Returns the localName if @namespaceName is NULL, a formatted * string otherwise. */ static const xmlChar* xmlSchemaFormatQName(xmlChar **buf, const xmlChar *namespaceName, const xmlChar *localName) { FREE_AND_NULL(*buf) if (namespaceName != NULL) { *buf = xmlStrdup(BAD_CAST "{"); *buf = xmlStrcat(*buf, namespaceName); *buf = xmlStrcat(*buf, BAD_CAST "}"); } if (localName != NULL) { if (namespaceName == NULL) return(localName); *buf = xmlStrcat(*buf, localName); } else { *buf = xmlStrcat(*buf, BAD_CAST "(NULL)"); } return ((const xmlChar *) *buf); } static const xmlChar* xmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName) { if (ns != NULL) return (xmlSchemaFormatQName(buf, ns->href, localName)); else return (xmlSchemaFormatQName(buf, NULL, localName)); } static const xmlChar * xmlSchemaGetComponentName(xmlSchemaBasicItemPtr item) { switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: return (((xmlSchemaElementPtr) item)->name); case XML_SCHEMA_TYPE_ATTRIBUTE: return (((xmlSchemaAttributePtr) item)->name); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return (((xmlSchemaAttributeGroupPtr) item)->name); case XML_SCHEMA_TYPE_BASIC: case XML_SCHEMA_TYPE_SIMPLE: case XML_SCHEMA_TYPE_COMPLEX: return (((xmlSchemaTypePtr) item)->name); case XML_SCHEMA_TYPE_GROUP: return (((xmlSchemaModelGroupDefPtr) item)->name); case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEYREF: return (((xmlSchemaIDCPtr) item)->name); case XML_SCHEMA_TYPE_ATTRIBUTE_USE: if (WXS_ATTRUSE_DECL(item) != NULL) { return(xmlSchemaGetComponentName( WXS_BASIC_CAST WXS_ATTRUSE_DECL(item))); } else return(NULL); case XML_SCHEMA_EXTRA_QNAMEREF: return (((xmlSchemaQNameRefPtr) item)->name); case XML_SCHEMA_TYPE_NOTATION: return (((xmlSchemaNotationPtr) item)->name); default: /* * Other components cannot have names. */ break; } return (NULL); } #define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name #define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace /* static const xmlChar * xmlSchemaGetQNameRefName(void *ref) { return(((xmlSchemaQNameRefPtr) ref)->name); } static const xmlChar * xmlSchemaGetQNameRefTargetNs(void *ref) { return(((xmlSchemaQNameRefPtr) ref)->targetNamespace); } */ static const xmlChar * xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr item) { switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: return (((xmlSchemaElementPtr) item)->targetNamespace); case XML_SCHEMA_TYPE_ATTRIBUTE: return (((xmlSchemaAttributePtr) item)->targetNamespace); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return (((xmlSchemaAttributeGroupPtr) item)->targetNamespace); case XML_SCHEMA_TYPE_BASIC: return (BAD_CAST "http://www.w3.org/2001/XMLSchema"); case XML_SCHEMA_TYPE_SIMPLE: case XML_SCHEMA_TYPE_COMPLEX: return (((xmlSchemaTypePtr) item)->targetNamespace); case XML_SCHEMA_TYPE_GROUP: return (((xmlSchemaModelGroupDefPtr) item)->targetNamespace); case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEYREF: return (((xmlSchemaIDCPtr) item)->targetNamespace); case XML_SCHEMA_TYPE_ATTRIBUTE_USE: if (WXS_ATTRUSE_DECL(item) != NULL) { return(xmlSchemaGetComponentTargetNs( WXS_BASIC_CAST WXS_ATTRUSE_DECL(item))); } /* TODO: Will returning NULL break something? */ break; case XML_SCHEMA_EXTRA_QNAMEREF: return (((xmlSchemaQNameRefPtr) item)->targetNamespace); case XML_SCHEMA_TYPE_NOTATION: return (((xmlSchemaNotationPtr) item)->targetNamespace); default: /* * Other components cannot have names. */ break; } return (NULL); } static const xmlChar* xmlSchemaGetComponentQName(xmlChar **buf, void *item) { return (xmlSchemaFormatQName(buf, xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr) item), xmlSchemaGetComponentName((xmlSchemaBasicItemPtr) item))); } static const xmlChar* xmlSchemaGetComponentDesignation(xmlChar **buf, void *item) { xmlChar *str = NULL; *buf = xmlStrcat(*buf, WXS_ITEM_TYPE_NAME(item)); *buf = xmlStrcat(*buf, BAD_CAST " '"); *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, (xmlSchemaBasicItemPtr) item)); *buf = xmlStrcat(*buf, BAD_CAST "'"); FREE_AND_NULL(str); return(*buf); } static const xmlChar* xmlSchemaGetIDCDesignation(xmlChar **buf, xmlSchemaIDCPtr idc) { return(xmlSchemaGetComponentDesignation(buf, idc)); } /** * xmlSchemaWildcardPCToString: * @pc: the type of processContents * * Returns a string representation of the type of * processContents. */ static const xmlChar * xmlSchemaWildcardPCToString(int pc) { switch (pc) { case XML_SCHEMAS_ANY_SKIP: return (BAD_CAST "skip"); case XML_SCHEMAS_ANY_LAX: return (BAD_CAST "lax"); case XML_SCHEMAS_ANY_STRICT: return (BAD_CAST "strict"); default: return (BAD_CAST "invalid process contents"); } } /** * xmlSchemaGetCanonValueWhtspExt: * @val: the precomputed value * @retValue: the returned value * @ws: the whitespace type of the value * * Get a the cononical representation of the value. * The caller has to free the returned retValue. * * Returns 0 if the value could be built and -1 in case of * API errors or if the value type is not supported yet. */ static int xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr val, xmlSchemaWhitespaceValueType ws, xmlChar **retValue) { int list; xmlSchemaValType valType; const xmlChar *value, *value2 = NULL; if ((retValue == NULL) || (val == NULL)) return (-1); list = xmlSchemaValueGetNext(val) ? 1 : 0; *retValue = NULL; do { value = NULL; valType = xmlSchemaGetValType(val); switch (valType) { case XML_SCHEMAS_STRING: case XML_SCHEMAS_NORMSTRING: case XML_SCHEMAS_ANYSIMPLETYPE: value = xmlSchemaValueGetAsString(val); if (value != NULL) { if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) value2 = xmlSchemaCollapseString(value); else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) value2 = xmlSchemaWhiteSpaceReplace(value); if (value2 != NULL) value = value2; } break; default: if (xmlSchemaGetCanonValue(val, &value2) == -1) { if (value2 != NULL) xmlFree((xmlChar *) value2); goto internal_error; } value = value2; } if (*retValue == NULL) if (value == NULL) { if (! list) *retValue = xmlStrdup(BAD_CAST ""); } else *retValue = xmlStrdup(value); else if (value != NULL) { /* List. */ *retValue = xmlStrcat((xmlChar *) *retValue, BAD_CAST " "); *retValue = xmlStrcat((xmlChar *) *retValue, value); } FREE_AND_NULL(value2) val = xmlSchemaValueGetNext(val); } while (val != NULL); return (0); internal_error: if (*retValue != NULL) xmlFree((xmlChar *) (*retValue)); if (value2 != NULL) xmlFree((xmlChar *) value2); return (-1); } /** * xmlSchemaFormatItemForReport: * @buf: the string buffer * @itemDes: the designation of the item * @itemName: the name of the item * @item: the item as an object * @itemNode: the node of the item * @local: the local name * @parsing: if the function is used during the parse * * Returns a representation of the given item used * for error reports. * * The following order is used to build the resulting * designation if the arguments are not NULL: * 1a. If itemDes not NULL -> itemDes * 1b. If (itemDes not NULL) and (itemName not NULL) * -> itemDes + itemName * 2. If the preceding was NULL and (item not NULL) -> item * 3. If the preceding was NULL and (itemNode not NULL) -> itemNode * * If the itemNode is an attribute node, the name of the attribute * will be appended to the result. * * Returns the formatted string and sets @buf to the resulting value. */ static xmlChar* xmlSchemaFormatItemForReport(xmlChar **buf, const xmlChar *itemDes, xmlSchemaBasicItemPtr item, xmlNodePtr itemNode) { xmlChar *str = NULL; int named = 1; if (*buf != NULL) { xmlFree(*buf); *buf = NULL; } if (itemDes != NULL) { *buf = xmlStrdup(itemDes); } else if (item != NULL) { switch (item->type) { case XML_SCHEMA_TYPE_BASIC: { xmlSchemaTypePtr type = WXS_TYPE_CAST item; if (WXS_IS_ATOMIC(type)) *buf = xmlStrdup(BAD_CAST "atomic type 'xs:"); else if (WXS_IS_LIST(type)) *buf = xmlStrdup(BAD_CAST "list type 'xs:"); else if (WXS_IS_UNION(type)) *buf = xmlStrdup(BAD_CAST "union type 'xs:"); else *buf = xmlStrdup(BAD_CAST "simple type 'xs:"); *buf = xmlStrcat(*buf, type->name); *buf = xmlStrcat(*buf, BAD_CAST "'"); } break; case XML_SCHEMA_TYPE_SIMPLE: { xmlSchemaTypePtr type = WXS_TYPE_CAST item; if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { *buf = xmlStrdup(BAD_CAST""); } else { *buf = xmlStrdup(BAD_CAST "local "); } if (WXS_IS_ATOMIC(type)) *buf = xmlStrcat(*buf, BAD_CAST "atomic type"); else if (WXS_IS_LIST(type)) *buf = xmlStrcat(*buf, BAD_CAST "list type"); else if (WXS_IS_UNION(type)) *buf = xmlStrcat(*buf, BAD_CAST "union type"); else *buf = xmlStrcat(*buf, BAD_CAST "simple type"); if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { *buf = xmlStrcat(*buf, BAD_CAST " '"); *buf = xmlStrcat(*buf, type->name); *buf = xmlStrcat(*buf, BAD_CAST "'"); } } break; case XML_SCHEMA_TYPE_COMPLEX: { xmlSchemaTypePtr type = WXS_TYPE_CAST item; if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) *buf = xmlStrdup(BAD_CAST ""); else *buf = xmlStrdup(BAD_CAST "local "); *buf = xmlStrcat(*buf, BAD_CAST "complex type"); if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { *buf = xmlStrcat(*buf, BAD_CAST " '"); *buf = xmlStrcat(*buf, type->name); *buf = xmlStrcat(*buf, BAD_CAST "'"); } } break; case XML_SCHEMA_TYPE_ATTRIBUTE_USE: { xmlSchemaAttributeUsePtr ause; ause = WXS_ATTR_USE_CAST item; *buf = xmlStrdup(BAD_CAST "attribute use "); if (WXS_ATTRUSE_DECL(ause) != NULL) { *buf = xmlStrcat(*buf, BAD_CAST "'"); *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, WXS_ATTRUSE_DECL(ause))); FREE_AND_NULL(str) *buf = xmlStrcat(*buf, BAD_CAST "'"); } else { *buf = xmlStrcat(*buf, BAD_CAST "(unknown)"); } } break; case XML_SCHEMA_TYPE_ATTRIBUTE: { xmlSchemaAttributePtr attr; attr = (xmlSchemaAttributePtr) item; *buf = xmlStrdup(BAD_CAST "attribute decl."); *buf = xmlStrcat(*buf, BAD_CAST " '"); *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, attr->targetNamespace, attr->name)); FREE_AND_NULL(str) *buf = xmlStrcat(*buf, BAD_CAST "'"); } break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: xmlSchemaGetComponentDesignation(buf, item); break; case XML_SCHEMA_TYPE_ELEMENT: { xmlSchemaElementPtr elem; elem = (xmlSchemaElementPtr) item; *buf = xmlStrdup(BAD_CAST "element decl."); *buf = xmlStrcat(*buf, BAD_CAST " '"); *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, elem->targetNamespace, elem->name)); *buf = xmlStrcat(*buf, BAD_CAST "'"); } break; case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_KEYREF: if (item->type == XML_SCHEMA_TYPE_IDC_UNIQUE) *buf = xmlStrdup(BAD_CAST "unique '"); else if (item->type == XML_SCHEMA_TYPE_IDC_KEY) *buf = xmlStrdup(BAD_CAST "key '"); else *buf = xmlStrdup(BAD_CAST "keyRef '"); *buf = xmlStrcat(*buf, ((xmlSchemaIDCPtr) item)->name); *buf = xmlStrcat(*buf, BAD_CAST "'"); break; case XML_SCHEMA_TYPE_ANY: case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: *buf = xmlStrdup(xmlSchemaWildcardPCToString( ((xmlSchemaWildcardPtr) item)->processContents)); *buf = xmlStrcat(*buf, BAD_CAST " wildcard"); break; case XML_SCHEMA_FACET_MININCLUSIVE: case XML_SCHEMA_FACET_MINEXCLUSIVE: case XML_SCHEMA_FACET_MAXINCLUSIVE: case XML_SCHEMA_FACET_MAXEXCLUSIVE: case XML_SCHEMA_FACET_TOTALDIGITS: case XML_SCHEMA_FACET_FRACTIONDIGITS: case XML_SCHEMA_FACET_PATTERN: case XML_SCHEMA_FACET_ENUMERATION: case XML_SCHEMA_FACET_WHITESPACE: case XML_SCHEMA_FACET_LENGTH: case XML_SCHEMA_FACET_MAXLENGTH: case XML_SCHEMA_FACET_MINLENGTH: *buf = xmlStrdup(BAD_CAST "facet '"); *buf = xmlStrcat(*buf, xmlSchemaFacetTypeToString(item->type)); *buf = xmlStrcat(*buf, BAD_CAST "'"); break; case XML_SCHEMA_TYPE_GROUP: { *buf = xmlStrdup(BAD_CAST "model group def."); *buf = xmlStrcat(*buf, BAD_CAST " '"); *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item)); *buf = xmlStrcat(*buf, BAD_CAST "'"); FREE_AND_NULL(str) } break; case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: case XML_SCHEMA_TYPE_PARTICLE: *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item)); break; case XML_SCHEMA_TYPE_NOTATION: { *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item)); *buf = xmlStrcat(*buf, BAD_CAST " '"); *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item)); *buf = xmlStrcat(*buf, BAD_CAST "'"); FREE_AND_NULL(str); } default: named = 0; } } else named = 0; if ((named == 0) && (itemNode != NULL)) { xmlNodePtr elem; if (itemNode->type == XML_ATTRIBUTE_NODE) elem = itemNode->parent; else elem = itemNode; *buf = xmlStrdup(BAD_CAST "Element '"); if (elem->ns != NULL) { *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, elem->ns->href, elem->name)); FREE_AND_NULL(str) } else *buf = xmlStrcat(*buf, elem->name); *buf = xmlStrcat(*buf, BAD_CAST "'"); } if ((itemNode != NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) { *buf = xmlStrcat(*buf, BAD_CAST ", attribute '"); if (itemNode->ns != NULL) { *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, itemNode->ns->href, itemNode->name)); FREE_AND_NULL(str) } else *buf = xmlStrcat(*buf, itemNode->name); *buf = xmlStrcat(*buf, BAD_CAST "'"); } FREE_AND_NULL(str) return (*buf); } /** * xmlSchemaFormatFacetEnumSet: * @buf: the string buffer * @type: the type holding the enumeration facets * * Builds a string consisting of all enumeration elements. * * Returns a string of all enumeration elements. */ static const xmlChar * xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt, xmlChar **buf, xmlSchemaTypePtr type) { xmlSchemaFacetPtr facet; xmlSchemaWhitespaceValueType ws; xmlChar *value = NULL; int res, found = 0; if (*buf != NULL) xmlFree(*buf); *buf = NULL; do { /* * Use the whitespace type of the base type. */ ws = xmlSchemaGetWhiteSpaceFacetValue(type->baseType); for (facet = type->facets; facet != NULL; facet = facet->next) { if (facet->type != XML_SCHEMA_FACET_ENUMERATION) continue; found = 1; res = xmlSchemaGetCanonValueWhtspExt(facet->val, ws, &value); if (res == -1) { xmlSchemaInternalErr(actxt, "xmlSchemaFormatFacetEnumSet", "compute the canonical lexical representation"); if (*buf != NULL) xmlFree(*buf); *buf = NULL; return (NULL); } if (*buf == NULL) *buf = xmlStrdup(BAD_CAST "'"); else *buf = xmlStrcat(*buf, BAD_CAST ", '"); *buf = xmlStrcat(*buf, BAD_CAST value); *buf = xmlStrcat(*buf, BAD_CAST "'"); if (value != NULL) { xmlFree((xmlChar *)value); value = NULL; } } /* * The enumeration facet of a type restricts the enumeration * facet of the ancestor type; i.e., such restricted enumerations * do not belong to the set of the given type. Thus we break * on the first found enumeration. */ if (found) break; type = type->baseType; } while ((type != NULL) && (type->type != XML_SCHEMA_TYPE_BASIC)); return ((const xmlChar *) *buf); } /************************************************************************ * * * Error functions * * * ************************************************************************/ #if 0 static void xmlSchemaErrMemory(const char *msg) { __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL, msg); } #endif static void xmlSchemaPSimpleErr(const char *msg) { __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL, msg); } /** * xmlSchemaPErrMemory: * @node: a context node * @extra: extra informations * * Handle an out of memory condition */ static void xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt, const char *extra, xmlNodePtr node) { if (ctxt != NULL) ctxt->nberrors++; __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL, extra); } /** * xmlSchemaPErr: * @ctxt: the parsing context * @node: the context node * @error: the error code * @msg: the error message * @str1: extra data * @str2: extra data * * Handle a parser error */ static void xmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error, const char *msg, const xmlChar * str1, const xmlChar * str2) { xmlGenericErrorFunc channel = NULL; xmlStructuredErrorFunc schannel = NULL; void *data = NULL; if (ctxt != NULL) { ctxt->nberrors++; ctxt->err = error; channel = ctxt->error; data = ctxt->errCtxt; schannel = ctxt->serror; } __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, str1, str2); } /** * xmlSchemaPErr2: * @ctxt: the parsing context * @node: the context node * @node: the current child * @error: the error code * @msg: the error message * @str1: extra data * @str2: extra data * * Handle a parser error */ static void xmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, xmlNodePtr child, int error, const char *msg, const xmlChar * str1, const xmlChar * str2) { if (child != NULL) xmlSchemaPErr(ctxt, child, error, msg, str1, str2); else xmlSchemaPErr(ctxt, node, error, msg, str1, str2); } /** * xmlSchemaPErrExt: * @ctxt: the parsing context * @node: the context node * @error: the error code * @strData1: extra data * @strData2: extra data * @strData3: extra data * @msg: the message * @str1: extra parameter for the message display * @str2: extra parameter for the message display * @str3: extra parameter for the message display * @str4: extra parameter for the message display * @str5: extra parameter for the message display * * Handle a parser error */ static void xmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error, const xmlChar * strData1, const xmlChar * strData2, const xmlChar * strData3, const char *msg, const xmlChar * str1, const xmlChar * str2, const xmlChar * str3, const xmlChar * str4, const xmlChar * str5) { xmlGenericErrorFunc channel = NULL; xmlStructuredErrorFunc schannel = NULL; void *data = NULL; if (ctxt != NULL) { ctxt->nberrors++; ctxt->err = error; channel = ctxt->error; data = ctxt->errCtxt; schannel = ctxt->serror; } __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, error, XML_ERR_ERROR, NULL, 0, (const char *) strData1, (const char *) strData2, (const char *) strData3, 0, 0, msg, str1, str2, str3, str4, str5); } /************************************************************************ * * * Allround error functions * * * ************************************************************************/ /** * xmlSchemaVTypeErrMemory: * @node: a context node * @extra: extra informations * * Handle an out of memory condition */ static void xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt, const char *extra, xmlNodePtr node) { if (ctxt != NULL) { ctxt->nberrors++; ctxt->err = XML_SCHEMAV_INTERNAL; } __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL, extra); } static void xmlSchemaPSimpleInternalErr(xmlNodePtr node, const char *msg, const xmlChar *str) { __xmlSimpleError(XML_FROM_SCHEMASP, XML_SCHEMAP_INTERNAL, node, msg, (const char *) str); } #define WXS_ERROR_TYPE_ERROR 1 #define WXS_ERROR_TYPE_WARNING 2 /** * xmlSchemaErr3: * @ctxt: the validation context * @node: the context node * @error: the error code * @msg: the error message * @str1: extra data * @str2: extra data * @str3: extra data * * Handle a validation error */ static void xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt, xmlErrorLevel errorLevel, int error, xmlNodePtr node, int line, const char *msg, const xmlChar *str1, const xmlChar *str2, const xmlChar *str3, const xmlChar *str4) { xmlStructuredErrorFunc schannel = NULL; xmlGenericErrorFunc channel = NULL; void *data = NULL; if (ctxt != NULL) { if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) { xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt; const char *file = NULL; if (errorLevel != XML_ERR_WARNING) { vctxt->nberrors++; vctxt->err = error; channel = vctxt->error; } else { channel = vctxt->warning; } schannel = vctxt->serror; data = vctxt->errCtxt; /* * Error node. If we specify a line number, then * do not channel any node to the error function. */ if (line == 0) { if ((node == NULL) && (vctxt->depth >= 0) && (vctxt->inode != NULL)) { node = vctxt->inode->node; } /* * Get filename and line if no node-tree. */ if ((node == NULL) && (vctxt->parserCtxt != NULL) && (vctxt->parserCtxt->input != NULL)) { file = vctxt->parserCtxt->input->filename; line = vctxt->parserCtxt->input->line; } } else { /* * Override the given node's (if any) position * and channel only the given line number. */ node = NULL; /* * Get filename. */ if (vctxt->doc != NULL) file = (const char *) vctxt->doc->URL; else if ((vctxt->parserCtxt != NULL) && (vctxt->parserCtxt->input != NULL)) file = vctxt->parserCtxt->input->filename; } if (vctxt->locFunc != NULL) { if ((file == NULL) || (line == 0)) { unsigned long l; const char *f; vctxt->locFunc(vctxt->locCtxt, &f, &l); if (file == NULL) file = f; if (line == 0) line = (int) l; } } if ((file == NULL) && (vctxt->filename != NULL)) file = vctxt->filename; __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASV, error, errorLevel, file, line, (const char *) str1, (const char *) str2, (const char *) str3, 0, 0, msg, str1, str2, str3, str4); } else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) { xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt; if (errorLevel != XML_ERR_WARNING) { pctxt->nberrors++; pctxt->err = error; channel = pctxt->error; } else { channel = pctxt->warning; } schannel = pctxt->serror; data = pctxt->errCtxt; __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, error, errorLevel, NULL, 0, (const char *) str1, (const char *) str2, (const char *) str3, 0, 0, msg, str1, str2, str3, str4); } else { TODO } } } /** * xmlSchemaErr3: * @ctxt: the validation context * @node: the context node * @error: the error code * @msg: the error message * @str1: extra data * @str2: extra data * @str3: extra data * * Handle a validation error */ static void xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt, int error, xmlNodePtr node, const char *msg, const xmlChar *str1, const xmlChar *str2, const xmlChar *str3) { xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0, msg, str1, str2, str3, NULL); } static void xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt, int error, xmlNodePtr node, const char *msg, const xmlChar *str1, const xmlChar *str2, const xmlChar *str3, const xmlChar *str4) { xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0, msg, str1, str2, str3, str4); } static void xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt, int error, xmlNodePtr node, const char *msg, const xmlChar *str1, const xmlChar *str2) { xmlSchemaErr4(actxt, error, node, msg, str1, str2, NULL, NULL); } static xmlChar * xmlSchemaFormatNodeForError(xmlChar ** msg, xmlSchemaAbstractCtxtPtr actxt, xmlNodePtr node) { xmlChar *str = NULL; *msg = NULL; if ((node != NULL) && (node->type != XML_ELEMENT_NODE) && (node->type != XML_ATTRIBUTE_NODE)) { /* * Don't try to format other nodes than element and * attribute nodes. * Play save and return an empty string. */ *msg = xmlStrdup(BAD_CAST ""); return(*msg); } if (node != NULL) { /* * Work on tree nodes. */ if (node->type == XML_ATTRIBUTE_NODE) { xmlNodePtr elem = node->parent; *msg = xmlStrdup(BAD_CAST "Element '"); if (elem->ns != NULL) *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, elem->ns->href, elem->name)); else *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, NULL, elem->name)); FREE_AND_NULL(str); *msg = xmlStrcat(*msg, BAD_CAST "', "); *msg = xmlStrcat(*msg, BAD_CAST "attribute '"); } else { *msg = xmlStrdup(BAD_CAST "Element '"); } if (node->ns != NULL) *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, node->ns->href, node->name)); else *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, NULL, node->name)); FREE_AND_NULL(str); *msg = xmlStrcat(*msg, BAD_CAST "': "); } else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) { xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt; /* * Work on node infos. */ if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) { xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth]; *msg = xmlStrdup(BAD_CAST "Element '"); *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, ielem->nsName, ielem->localName)); FREE_AND_NULL(str); *msg = xmlStrcat(*msg, BAD_CAST "', "); *msg = xmlStrcat(*msg, BAD_CAST "attribute '"); } else { *msg = xmlStrdup(BAD_CAST "Element '"); } *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, vctxt->inode->nsName, vctxt->inode->localName)); FREE_AND_NULL(str); *msg = xmlStrcat(*msg, BAD_CAST "': "); } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) { /* * Hmm, no node while parsing? * Return an empty string, in case NULL will break something. */ *msg = xmlStrdup(BAD_CAST ""); } else { TODO return (NULL); } /* * VAL TODO: The output of the given schema component is currently * disabled. */ #if 0 if ((type != NULL) && (xmlSchemaIsGlobalItem(type))) { *msg = xmlStrcat(*msg, BAD_CAST " ["); *msg = xmlStrcat(*msg, xmlSchemaFormatItemForReport(&str, NULL, type, NULL, 0)); FREE_AND_NULL(str) *msg = xmlStrcat(*msg, BAD_CAST "]"); } #endif return (*msg); } static void xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt, const char *funcName, const char *message, const xmlChar *str1, const xmlChar *str2) { xmlChar *msg = NULL; if (actxt == NULL) return; msg = xmlStrdup(BAD_CAST "Internal error: "); msg = xmlStrcat(msg, BAD_CAST funcName); msg = xmlStrcat(msg, BAD_CAST ", "); msg = xmlStrcat(msg, BAD_CAST message); msg = xmlStrcat(msg, BAD_CAST ".\n"); if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) xmlSchemaErr(actxt, XML_SCHEMAV_INTERNAL, NULL, (const char *) msg, str1, str2); else if (actxt->type == XML_SCHEMA_CTXT_PARSER) xmlSchemaErr(actxt, XML_SCHEMAP_INTERNAL, NULL, (const char *) msg, str1, str2); FREE_AND_NULL(msg) } static void xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt, const char *funcName, const char *message) { xmlSchemaInternalErr2(actxt, funcName, message, NULL, NULL); } #if 0 static void xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt, const char *funcName, const char *message, const xmlChar *str1, const xmlChar *str2) { xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName, message, str1, str2); } #endif static void xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt, xmlParserErrors error, xmlNodePtr node, xmlSchemaBasicItemPtr item, const char *message, const xmlChar *str1, const xmlChar *str2, const xmlChar *str3, const xmlChar *str4) { xmlChar *msg = NULL; if ((node == NULL) && (item != NULL) && (actxt->type == XML_SCHEMA_CTXT_PARSER)) { node = WXS_ITEM_NODE(item); xmlSchemaFormatItemForReport(&msg, NULL, item, NULL); msg = xmlStrcat(msg, BAD_CAST ": "); } else xmlSchemaFormatNodeForError(&msg, actxt, node); msg = xmlStrcat(msg, (const xmlChar *) message); msg = xmlStrcat(msg, BAD_CAST ".\n"); xmlSchemaErr4(actxt, error, node, (const char *) msg, str1, str2, str3, str4); FREE_AND_NULL(msg) } static void xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt, xmlParserErrors error, xmlNodePtr node, xmlSchemaBasicItemPtr item, const char *message, const xmlChar *str1, const xmlChar *str2) { xmlSchemaCustomErr4(actxt, error, node, item, message, str1, str2, NULL, NULL); } static void xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt, xmlParserErrors error, xmlNodePtr node, xmlSchemaTypePtr type ATTRIBUTE_UNUSED, const char *message, const xmlChar *str1, const xmlChar *str2, const xmlChar *str3) { xmlChar *msg = NULL; xmlSchemaFormatNodeForError(&msg, actxt, node); msg = xmlStrcat(msg, (const xmlChar *) message); msg = xmlStrcat(msg, BAD_CAST ".\n"); /* URGENT TODO: Set the error code to something sane. */ xmlSchemaErr4Line(actxt, XML_ERR_WARNING, error, node, 0, (const char *) msg, str1, str2, str3, NULL); FREE_AND_NULL(msg) } static void xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt, xmlParserErrors error, xmlSchemaPSVIIDCNodePtr idcNode, xmlSchemaTypePtr type ATTRIBUTE_UNUSED, const char *message, const xmlChar *str1, const xmlChar *str2) { xmlChar *msg = NULL, *qname = NULL; msg = xmlStrdup(BAD_CAST "Element '%s': "); msg = xmlStrcat(msg, (const xmlChar *) message); msg = xmlStrcat(msg, BAD_CAST ".\n"); xmlSchemaErr4Line(ACTXT_CAST vctxt, XML_ERR_ERROR, error, NULL, idcNode->nodeLine, (const char *) msg, xmlSchemaFormatQName(&qname, vctxt->nodeQNames->items[idcNode->nodeQNameID +1], vctxt->nodeQNames->items[idcNode->nodeQNameID]), str1, str2, NULL); FREE_AND_NULL(qname); FREE_AND_NULL(msg); } static int xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt, xmlNodePtr node) { if (node != NULL) return (node->type); if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) && (((xmlSchemaValidCtxtPtr) actxt)->inode != NULL)) return ( ((xmlSchemaValidCtxtPtr) actxt)->inode->nodeType); return (-1); } static int xmlSchemaIsGlobalItem(xmlSchemaTypePtr item) { switch (item->type) { case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: if (item->flags & XML_SCHEMAS_TYPE_GLOBAL) return(1); break; case XML_SCHEMA_TYPE_GROUP: return (1); case XML_SCHEMA_TYPE_ELEMENT: if ( ((xmlSchemaElementPtr) item)->flags & XML_SCHEMAS_ELEM_GLOBAL) return(1); break; case XML_SCHEMA_TYPE_ATTRIBUTE: if ( ((xmlSchemaAttributePtr) item)->flags & XML_SCHEMAS_ATTR_GLOBAL) return(1); break; /* Note that attribute groups are always global. */ default: return(1); } return (0); } static void xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt, xmlParserErrors error, xmlNodePtr node, const xmlChar *value, xmlSchemaTypePtr type, int displayValue) { xmlChar *msg = NULL; xmlSchemaFormatNodeForError(&msg, actxt, node); if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) == XML_ATTRIBUTE_NODE)) msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of "); else msg = xmlStrcat(msg, BAD_CAST "The character content is not a valid " "value of "); if (! xmlSchemaIsGlobalItem(type)) msg = xmlStrcat(msg, BAD_CAST "the local "); else msg = xmlStrcat(msg, BAD_CAST "the "); if (WXS_IS_ATOMIC(type)) msg = xmlStrcat(msg, BAD_CAST "atomic type"); else if (WXS_IS_LIST(type)) msg = xmlStrcat(msg, BAD_CAST "list type"); else if (WXS_IS_UNION(type)) msg = xmlStrcat(msg, BAD_CAST "union type"); if (xmlSchemaIsGlobalItem(type)) { xmlChar *str = NULL; msg = xmlStrcat(msg, BAD_CAST " '"); if (type->builtInType != 0) { msg = xmlStrcat(msg, BAD_CAST "xs:"); msg = xmlStrcat(msg, type->name); } else msg = xmlStrcat(msg, xmlSchemaFormatQName(&str, type->targetNamespace, type->name)); msg = xmlStrcat(msg, BAD_CAST "'"); FREE_AND_NULL(str); } msg = xmlStrcat(msg, BAD_CAST ".\n"); if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) == XML_ATTRIBUTE_NODE)) xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL); else xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); FREE_AND_NULL(msg) } static const xmlChar * xmlSchemaFormatErrorNodeQName(xmlChar ** str, xmlSchemaNodeInfoPtr ni, xmlNodePtr node) { if (node != NULL) { if (node->ns != NULL) return (xmlSchemaFormatQName(str, node->ns->href, node->name)); else return (xmlSchemaFormatQName(str, NULL, node->name)); } else if (ni != NULL) return (xmlSchemaFormatQName(str, ni->nsName, ni->localName)); return (NULL); } static void xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt, xmlParserErrors error, xmlSchemaAttrInfoPtr ni, xmlNodePtr node) { xmlChar *msg = NULL, *str = NULL; xmlSchemaFormatNodeForError(&msg, actxt, node); msg = xmlStrcat(msg, BAD_CAST "The attribute '%s' is not allowed.\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, xmlSchemaFormatErrorNodeQName(&str, (xmlSchemaNodeInfoPtr) ni, node), NULL); FREE_AND_NULL(str) FREE_AND_NULL(msg) } static void xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt, xmlParserErrors error, xmlNodePtr node, xmlSchemaTypePtr type ATTRIBUTE_UNUSED, const char *message, int nbval, int nbneg, xmlChar **values) { xmlChar *str = NULL, *msg = NULL; xmlChar *localName, *nsName; const xmlChar *cur, *end; int i; xmlSchemaFormatNodeForError(&msg, actxt, node); msg = xmlStrcat(msg, (const xmlChar *) message); msg = xmlStrcat(msg, BAD_CAST "."); /* * Note that is does not make sense to report that we have a * wildcard here, since the wildcard might be unfolded into * multiple transitions. */ if (nbval + nbneg > 0) { if (nbval + nbneg > 1) { str = xmlStrdup(BAD_CAST " Expected is one of ( "); } else str = xmlStrdup(BAD_CAST " Expected is ( "); nsName = NULL; for (i = 0; i < nbval + nbneg; i++) { cur = values[i]; if (cur == NULL) continue; if ((cur[0] == 'n') && (cur[1] == 'o') && (cur[2] == 't') && (cur[3] == ' ')) { cur += 4; str = xmlStrcat(str, BAD_CAST "##other"); } /* * Get the local name. */ localName = NULL; end = cur; if (*end == '*') { localName = xmlStrdup(BAD_CAST "*"); end++; } else { while ((*end != 0) && (*end != '|')) end++; localName = xmlStrncat(localName, BAD_CAST cur, end - cur); } if (*end != 0) { end++; /* * Skip "*|*" if they come with negated expressions, since * they represent the same negated wildcard. */ if ((nbneg == 0) || (*end != '*') || (*localName != '*')) { /* * Get the namespace name. */ cur = end; if (*end == '*') { nsName = xmlStrdup(BAD_CAST "{*}"); } else { while (*end != 0) end++; if (i >= nbval) nsName = xmlStrdup(BAD_CAST "{##other:"); else nsName = xmlStrdup(BAD_CAST "{"); nsName = xmlStrncat(nsName, BAD_CAST cur, end - cur); nsName = xmlStrcat(nsName, BAD_CAST "}"); } str = xmlStrcat(str, BAD_CAST nsName); FREE_AND_NULL(nsName) } else { FREE_AND_NULL(localName); continue; } } str = xmlStrcat(str, BAD_CAST localName); FREE_AND_NULL(localName); if (i < nbval + nbneg -1) str = xmlStrcat(str, BAD_CAST ", "); } str = xmlStrcat(str, BAD_CAST " ).\n"); msg = xmlStrcat(msg, BAD_CAST str); FREE_AND_NULL(str) } else msg = xmlStrcat(msg, BAD_CAST "\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); xmlFree(msg); } static void xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt, xmlParserErrors error, xmlNodePtr node, const xmlChar *value, unsigned long length, xmlSchemaTypePtr type, xmlSchemaFacetPtr facet, const char *message, const xmlChar *str1, const xmlChar *str2) { xmlChar *str = NULL, *msg = NULL; xmlSchemaTypeType facetType; int nodeType = xmlSchemaEvalErrorNodeType(actxt, node); xmlSchemaFormatNodeForError(&msg, actxt, node); if (error == XML_SCHEMAV_CVC_ENUMERATION_VALID) { facetType = XML_SCHEMA_FACET_ENUMERATION; /* * If enumerations are validated, one must not expect the * facet to be given. */ } else facetType = facet->type; msg = xmlStrcat(msg, BAD_CAST "["); msg = xmlStrcat(msg, BAD_CAST "facet '"); msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facetType)); msg = xmlStrcat(msg, BAD_CAST "'] "); if (message == NULL) { /* * Use a default message. */ if ((facetType == XML_SCHEMA_FACET_LENGTH) || (facetType == XML_SCHEMA_FACET_MINLENGTH) || (facetType == XML_SCHEMA_FACET_MAXLENGTH)) { char len[25], actLen[25]; /* FIXME, TODO: What is the max expected string length of the * this value? */ if (nodeType == XML_ATTRIBUTE_NODE) msg = xmlStrcat(msg, BAD_CAST "The value '%s' has a length of '%s'; "); else msg = xmlStrcat(msg, BAD_CAST "The value has a length of '%s'; "); snprintf(len, 24, "%lu", xmlSchemaGetFacetValueAsULong(facet)); snprintf(actLen, 24, "%lu", length); if (facetType == XML_SCHEMA_FACET_LENGTH) msg = xmlStrcat(msg, BAD_CAST "this differs from the allowed length of '%s'.\n"); else if (facetType == XML_SCHEMA_FACET_MAXLENGTH) msg = xmlStrcat(msg, BAD_CAST "this exceeds the allowed maximum length of '%s'.\n"); else if (facetType == XML_SCHEMA_FACET_MINLENGTH) msg = xmlStrcat(msg, BAD_CAST "this underruns the allowed minimum length of '%s'.\n"); if (nodeType == XML_ATTRIBUTE_NODE) xmlSchemaErr3(actxt, error, node, (const char *) msg, value, (const xmlChar *) actLen, (const xmlChar *) len); else xmlSchemaErr(actxt, error, node, (const char *) msg, (const xmlChar *) actLen, (const xmlChar *) len); } else if (facetType == XML_SCHEMA_FACET_ENUMERATION) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not an element " "of the set {%s}.\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, value, xmlSchemaFormatFacetEnumSet(actxt, &str, type)); } else if (facetType == XML_SCHEMA_FACET_PATTERN) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not accepted " "by the pattern '%s'.\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, value, facet->value); } else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' is less than the " "minimum value allowed ('%s').\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, value, facet->value); } else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' is greater than the " "maximum value allowed ('%s').\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, value, facet->value); } else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be greater than " "'%s'.\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, value, facet->value); } else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be less than " "'%s'.\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, value, facet->value); } else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more " "digits than are allowed ('%s').\n"); xmlSchemaErr(actxt, error, node, (const char*) msg, value, facet->value); } else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more fractional " "digits than are allowed ('%s').\n"); xmlSchemaErr(actxt, error, node, (const char*) msg, value, facet->value); } else if (nodeType == XML_ATTRIBUTE_NODE) { msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not facet-valid.\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL); } else { msg = xmlStrcat(msg, BAD_CAST "The value is not facet-valid.\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); } } else { msg = xmlStrcat(msg, (const xmlChar *) message); msg = xmlStrcat(msg, BAD_CAST ".\n"); xmlSchemaErr(actxt, error, node, (const char *) msg, str1, str2); } FREE_AND_NULL(str) xmlFree(msg); } #define VERROR(err, type, msg) \ xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL); #define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg); #define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg); #define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg); #define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg); /** * xmlSchemaPMissingAttrErr: * @ctxt: the schema validation context * @ownerDes: the designation of the owner * @ownerName: the name of the owner * @ownerItem: the owner as a schema object * @ownerElem: the owner as an element node * @node: the parent element node of the missing attribute node * @type: the corresponding type of the attribute node * * Reports an illegal attribute. */ static void xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr ownerItem, xmlNodePtr ownerElem, const char *name, const char *message) { xmlChar *des = NULL; xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); if (message != NULL) xmlSchemaPErr(ctxt, ownerElem, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message); else xmlSchemaPErr(ctxt, ownerElem, error, "%s: The attribute '%s' is required but missing.\n", BAD_CAST des, BAD_CAST name); FREE_AND_NULL(des); } /** * xmlSchemaPResCompAttrErr: * @ctxt: the schema validation context * @error: the error code * @ownerDes: the designation of the owner * @ownerItem: the owner as a schema object * @ownerElem: the owner as an element node * @name: the name of the attribute holding the QName * @refName: the referenced local name * @refURI: the referenced namespace URI * @message: optional message * * Used to report QName attribute values that failed to resolve * to schema components. */ static void xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr ownerItem, xmlNodePtr ownerElem, const char *name, const xmlChar *refName, const xmlChar *refURI, xmlSchemaTypeType refType, const char *refTypeStr) { xmlChar *des = NULL, *strA = NULL; xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); if (refTypeStr == NULL) refTypeStr = (const char *) xmlSchemaItemTypeToStr(refType); xmlSchemaPErrExt(ctxt, ownerElem, error, NULL, NULL, NULL, "%s, attribute '%s': The QName value '%s' does not resolve to a(n) " "%s.\n", BAD_CAST des, BAD_CAST name, xmlSchemaFormatQName(&strA, refURI, refName), BAD_CAST refTypeStr, NULL); FREE_AND_NULL(des) FREE_AND_NULL(strA) } /** * xmlSchemaPCustomAttrErr: * @ctxt: the schema parser context * @error: the error code * @ownerDes: the designation of the owner * @ownerItem: the owner as a schema object * @attr: the illegal attribute node * * Reports an illegal attribute during the parse. */ static void xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlChar **ownerDes, xmlSchemaBasicItemPtr ownerItem, xmlAttrPtr attr, const char *msg) { xmlChar *des = NULL; if (ownerDes == NULL) xmlSchemaFormatItemForReport(&des, NULL, ownerItem, attr->parent); else if (*ownerDes == NULL) { xmlSchemaFormatItemForReport(ownerDes, NULL, ownerItem, attr->parent); des = *ownerDes; } else des = *ownerDes; if (attr == NULL) { xmlSchemaPErrExt(ctxt, NULL, error, NULL, NULL, NULL, "%s, attribute '%s': %s.\n", BAD_CAST des, (const xmlChar *) "Unknown", (const xmlChar *) msg, NULL, NULL); } else { xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL, "%s, attribute '%s': %s.\n", BAD_CAST des, attr->name, (const xmlChar *) msg, NULL, NULL); } if (ownerDes == NULL) FREE_AND_NULL(des); } /** * xmlSchemaPIllegalAttrErr: * @ctxt: the schema parser context * @error: the error code * @ownerDes: the designation of the attribute's owner * @ownerItem: the attribute's owner item * @attr: the illegal attribute node * * Reports an illegal attribute during the parse. */ static void xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr ownerComp ATTRIBUTE_UNUSED, xmlAttrPtr attr) { xmlChar *strA = NULL, *strB = NULL; xmlSchemaFormatNodeForError(&strA, ACTXT_CAST ctxt, attr->parent); xmlSchemaErr4(ACTXT_CAST ctxt, error, (xmlNodePtr) attr, "%sThe attribute '%s' is not allowed.\n", BAD_CAST strA, xmlSchemaFormatQNameNs(&strB, attr->ns, attr->name), NULL, NULL); FREE_AND_NULL(strA); FREE_AND_NULL(strB); } /** * xmlSchemaPCustomErr: * @ctxt: the schema parser context * @error: the error code * @itemDes: the designation of the schema item * @item: the schema item * @itemElem: the node of the schema item * @message: the error message * @str1: an optional param for the error message * @str2: an optional param for the error message * @str3: an optional param for the error message * * Reports an error during parsing. */ static void xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr item, xmlNodePtr itemElem, const char *message, const xmlChar *str1, const xmlChar *str2, const xmlChar *str3) { xmlChar *des = NULL, *msg = NULL; xmlSchemaFormatItemForReport(&des, NULL, item, itemElem); msg = xmlStrdup(BAD_CAST "%s: "); msg = xmlStrcat(msg, (const xmlChar *) message); msg = xmlStrcat(msg, BAD_CAST ".\n"); if ((itemElem == NULL) && (item != NULL)) itemElem = WXS_ITEM_NODE(item); xmlSchemaPErrExt(ctxt, itemElem, error, NULL, NULL, NULL, (const char *) msg, BAD_CAST des, str1, str2, str3, NULL); FREE_AND_NULL(des); FREE_AND_NULL(msg); } /** * xmlSchemaPCustomErr: * @ctxt: the schema parser context * @error: the error code * @itemDes: the designation of the schema item * @item: the schema item * @itemElem: the node of the schema item * @message: the error message * @str1: the optional param for the error message * * Reports an error during parsing. */ static void xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr item, xmlNodePtr itemElem, const char *message, const xmlChar *str1) { xmlSchemaPCustomErrExt(ctxt, error, item, itemElem, message, str1, NULL, NULL); } /** * xmlSchemaPAttrUseErr: * @ctxt: the schema parser context * @error: the error code * @itemDes: the designation of the schema type * @item: the schema type * @itemElem: the node of the schema type * @attr: the invalid schema attribute * @message: the error message * @str1: the optional param for the error message * * Reports an attribute use error during parsing. */ static void xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlNodePtr node, xmlSchemaBasicItemPtr ownerItem, const xmlSchemaAttributeUsePtr attruse, const char *message, const xmlChar *str1, const xmlChar *str2, const xmlChar *str3,const xmlChar *str4) { xmlChar *str = NULL, *msg = NULL; xmlSchemaFormatItemForReport(&msg, NULL, ownerItem, NULL); msg = xmlStrcat(msg, BAD_CAST ", "); msg = xmlStrcat(msg, BAD_CAST xmlSchemaFormatItemForReport(&str, NULL, WXS_BASIC_CAST attruse, NULL)); FREE_AND_NULL(str); msg = xmlStrcat(msg, BAD_CAST ": "); msg = xmlStrcat(msg, (const xmlChar *) message); msg = xmlStrcat(msg, BAD_CAST ".\n"); xmlSchemaErr4(ACTXT_CAST ctxt, error, node, (const char *) msg, str1, str2, str3, str4); xmlFree(msg); } /** * xmlSchemaPIllegalFacetAtomicErr: * @ctxt: the schema parser context * @error: the error code * @type: the schema type * @baseType: the base type of type * @facet: the illegal facet * * Reports an illegal facet for atomic simple types. */ static void xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaTypePtr type, xmlSchemaTypePtr baseType, xmlSchemaFacetPtr facet) { xmlChar *des = NULL, *strT = NULL; xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node); xmlSchemaPErrExt(ctxt, type->node, error, NULL, NULL, NULL, "%s: The facet '%s' is not allowed on types derived from the " "type %s.\n", BAD_CAST des, xmlSchemaFacetTypeToString(facet->type), xmlSchemaFormatItemForReport(&strT, NULL, WXS_BASIC_CAST baseType, NULL), NULL, NULL); FREE_AND_NULL(des); FREE_AND_NULL(strT); } /** * xmlSchemaPIllegalFacetListUnionErr: * @ctxt: the schema parser context * @error: the error code * @itemDes: the designation of the schema item involved * @item: the schema item involved * @facet: the illegal facet * * Reports an illegal facet for and . */ static void xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaTypePtr type, xmlSchemaFacetPtr facet) { xmlChar *des = NULL; xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node); xmlSchemaPErr(ctxt, type->node, error, "%s: The facet '%s' is not allowed.\n", BAD_CAST des, xmlSchemaFacetTypeToString(facet->type)); FREE_AND_NULL(des); } /** * xmlSchemaPMutualExclAttrErr: * @ctxt: the schema validation context * @error: the error code * @elemDes: the designation of the parent element node * @attr: the bad attribute node * @type: the corresponding type of the attribute node * * Reports an illegal attribute. */ static void xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr ownerItem, xmlAttrPtr attr, const char *name1, const char *name2) { xmlChar *des = NULL; xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST ownerItem, attr->parent); xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL, "%s: The attributes '%s' and '%s' are mutually exclusive.\n", BAD_CAST des, BAD_CAST name1, BAD_CAST name2, NULL, NULL); FREE_AND_NULL(des); } /** * xmlSchemaPSimpleTypeErr: * @ctxt: the schema validation context * @error: the error code * @type: the type specifier * @ownerDes: the designation of the owner * @ownerItem: the schema object if existent * @node: the validated node * @value: the validated value * * Reports a simple type validation error. * TODO: Should this report the value of an element as well? */ static void xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr ownerItem ATTRIBUTE_UNUSED, xmlNodePtr node, xmlSchemaTypePtr type, const char *expected, const xmlChar *value, const char *message, const xmlChar *str1, const xmlChar *str2) { xmlChar *msg = NULL; xmlSchemaFormatNodeForError(&msg, ACTXT_CAST ctxt, node); if (message == NULL) { /* * Use default messages. */ if (type != NULL) { if (node->type == XML_ATTRIBUTE_NODE) msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of "); else msg = xmlStrcat(msg, BAD_CAST "The character content is not a " "valid value of "); if (! xmlSchemaIsGlobalItem(type)) msg = xmlStrcat(msg, BAD_CAST "the local "); else msg = xmlStrcat(msg, BAD_CAST "the "); if (WXS_IS_ATOMIC(type)) msg = xmlStrcat(msg, BAD_CAST "atomic type"); else if (WXS_IS_LIST(type)) msg = xmlStrcat(msg, BAD_CAST "list type"); else if (WXS_IS_UNION(type)) msg = xmlStrcat(msg, BAD_CAST "union type"); if (xmlSchemaIsGlobalItem(type)) { xmlChar *str = NULL; msg = xmlStrcat(msg, BAD_CAST " '"); if (type->builtInType != 0) { msg = xmlStrcat(msg, BAD_CAST "xs:"); msg = xmlStrcat(msg, type->name); } else msg = xmlStrcat(msg, xmlSchemaFormatQName(&str, type->targetNamespace, type->name)); msg = xmlStrcat(msg, BAD_CAST "'."); FREE_AND_NULL(str); } } else { if (node->type == XML_ATTRIBUTE_NODE) msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not valid."); else msg = xmlStrcat(msg, BAD_CAST "The character content is not " "valid."); } if (expected) { msg = xmlStrcat(msg, BAD_CAST " Expected is '"); msg = xmlStrcat(msg, BAD_CAST expected); msg = xmlStrcat(msg, BAD_CAST "'.\n"); } else msg = xmlStrcat(msg, BAD_CAST "\n"); if (node->type == XML_ATTRIBUTE_NODE) xmlSchemaPErr(ctxt, node, error, (const char *) msg, value, NULL); else xmlSchemaPErr(ctxt, node, error, (const char *) msg, NULL, NULL); } else { msg = xmlStrcat(msg, BAD_CAST message); msg = xmlStrcat(msg, BAD_CAST ".\n"); xmlSchemaPErrExt(ctxt, node, error, NULL, NULL, NULL, (const char*) msg, str1, str2, NULL, NULL, NULL); } /* Cleanup. */ FREE_AND_NULL(msg) } /** * xmlSchemaPContentErr: * @ctxt: the schema parser context * @error: the error code * @onwerDes: the designation of the holder of the content * @ownerItem: the owner item of the holder of the content * @ownerElem: the node of the holder of the content * @child: the invalid child node * @message: the optional error message * @content: the optional string describing the correct content * * Reports an error concerning the content of a schema element. */ static void xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt, xmlParserErrors error, xmlSchemaBasicItemPtr ownerItem, xmlNodePtr ownerElem, xmlNodePtr child, const char *message, const char *content) { xmlChar *des = NULL; xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); if (message != NULL) xmlSchemaPErr2(ctxt, ownerElem, child, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message); else { if (content != NULL) { xmlSchemaPErr2(ctxt, ownerElem, child, error, "%s: The content is not valid. Expected is %s.\n", BAD_CAST des, BAD_CAST content); } else { xmlSchemaPErr2(ctxt, ownerElem, child, error, "%s: The content is not valid.\n", BAD_CAST des, NULL); } } FREE_AND_NULL(des) } /************************************************************************ * * * Streamable error functions * * * ************************************************************************/ /************************************************************************ * * * Validation helper functions * * * ************************************************************************/ /************************************************************************ * * * Allocation functions * * * ************************************************************************/ /** * xmlSchemaNewSchemaForParserCtxt: * @ctxt: a schema validation context * * Allocate a new Schema structure. * * Returns the newly allocated structure or NULL in case or error */ static xmlSchemaPtr xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt) { xmlSchemaPtr ret; ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating schema", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchema)); ret->dict = ctxt->dict; xmlDictReference(ret->dict); return (ret); } /** * xmlSchemaNewFacet: * * Allocate a new Facet structure. * * Returns the newly allocated structure or NULL in case or error */ xmlSchemaFacetPtr xmlSchemaNewFacet(void) { xmlSchemaFacetPtr ret; ret = (xmlSchemaFacetPtr) xmlMalloc(sizeof(xmlSchemaFacet)); if (ret == NULL) { return (NULL); } memset(ret, 0, sizeof(xmlSchemaFacet)); return (ret); } /** * xmlSchemaNewAnnot: * @ctxt: a schema validation context * @node: a node * * Allocate a new annotation structure. * * Returns the newly allocated structure or NULL in case or error */ static xmlSchemaAnnotPtr xmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node) { xmlSchemaAnnotPtr ret; ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating annotation", node); return (NULL); } memset(ret, 0, sizeof(xmlSchemaAnnot)); ret->content = node; return (ret); } static xmlSchemaItemListPtr xmlSchemaItemListCreate(void) { xmlSchemaItemListPtr ret; ret = xmlMalloc(sizeof(xmlSchemaItemList)); if (ret == NULL) { xmlSchemaPErrMemory(NULL, "allocating an item list structure", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaItemList)); return (ret); } static void xmlSchemaItemListClear(xmlSchemaItemListPtr list) { if (list->items != NULL) { xmlFree(list->items); list->items = NULL; } list->nbItems = 0; list->sizeItems = 0; } static int xmlSchemaItemListAdd(xmlSchemaItemListPtr list, void *item) { if (list->items == NULL) { list->items = (void **) xmlMalloc( 20 * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); return(-1); } list->sizeItems = 20; } else if (list->sizeItems <= list->nbItems) { list->sizeItems *= 2; list->items = (void **) xmlRealloc(list->items, list->sizeItems * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "growing item list", NULL); list->sizeItems = 0; return(-1); } } list->items[list->nbItems++] = item; return(0); } static int xmlSchemaItemListAddSize(xmlSchemaItemListPtr list, int initialSize, void *item) { if (list->items == NULL) { if (initialSize <= 0) initialSize = 1; list->items = (void **) xmlMalloc( initialSize * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); return(-1); } list->sizeItems = initialSize; } else if (list->sizeItems <= list->nbItems) { list->sizeItems *= 2; list->items = (void **) xmlRealloc(list->items, list->sizeItems * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "growing item list", NULL); list->sizeItems = 0; return(-1); } } list->items[list->nbItems++] = item; return(0); } static int xmlSchemaItemListInsert(xmlSchemaItemListPtr list, void *item, int idx) { if (list->items == NULL) { list->items = (void **) xmlMalloc( 20 * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); return(-1); } list->sizeItems = 20; } else if (list->sizeItems <= list->nbItems) { list->sizeItems *= 2; list->items = (void **) xmlRealloc(list->items, list->sizeItems * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "growing item list", NULL); list->sizeItems = 0; return(-1); } } /* * Just append if the index is greater/equal than the item count. */ if (idx >= list->nbItems) { list->items[list->nbItems++] = item; } else { int i; for (i = list->nbItems; i > idx; i--) list->items[i] = list->items[i-1]; list->items[idx] = item; list->nbItems++; } return(0); } #if 0 /* enable if ever needed */ static int xmlSchemaItemListInsertSize(xmlSchemaItemListPtr list, int initialSize, void *item, int idx) { if (list->items == NULL) { if (initialSize <= 0) initialSize = 1; list->items = (void **) xmlMalloc( initialSize * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); return(-1); } list->sizeItems = initialSize; } else if (list->sizeItems <= list->nbItems) { list->sizeItems *= 2; list->items = (void **) xmlRealloc(list->items, list->sizeItems * sizeof(void *)); if (list->items == NULL) { xmlSchemaPErrMemory(NULL, "growing item list", NULL); list->sizeItems = 0; return(-1); } } /* * Just append if the index is greater/equal than the item count. */ if (idx >= list->nbItems) { list->items[list->nbItems++] = item; } else { int i; for (i = list->nbItems; i > idx; i--) list->items[i] = list->items[i-1]; list->items[idx] = item; list->nbItems++; } return(0); } #endif static int xmlSchemaItemListRemove(xmlSchemaItemListPtr list, int idx) { int i; if ((list->items == NULL) || (idx >= list->nbItems)) { xmlSchemaPSimpleErr("Internal error: xmlSchemaItemListRemove, " "index error.\n"); return(-1); } if (list->nbItems == 1) { /* TODO: Really free the list? */ xmlFree(list->items); list->items = NULL; list->nbItems = 0; list->sizeItems = 0; } else if (list->nbItems -1 == idx) { list->nbItems--; } else { for (i = idx; i < list->nbItems -1; i++) list->items[i] = list->items[i+1]; list->nbItems--; } return(0); } /** * xmlSchemaItemListFree: * @annot: a schema type structure * * Deallocate a annotation structure */ static void xmlSchemaItemListFree(xmlSchemaItemListPtr list) { if (list == NULL) return; if (list->items != NULL) xmlFree(list->items); xmlFree(list); } static void xmlSchemaBucketFree(xmlSchemaBucketPtr bucket) { if (bucket == NULL) return; if (bucket->globals != NULL) { xmlSchemaComponentListFree(bucket->globals); xmlSchemaItemListFree(bucket->globals); } if (bucket->locals != NULL) { xmlSchemaComponentListFree(bucket->locals); xmlSchemaItemListFree(bucket->locals); } if (bucket->relations != NULL) { xmlSchemaSchemaRelationPtr prev, cur = bucket->relations; do { prev = cur; cur = cur->next; xmlFree(prev); } while (cur != NULL); } if ((! bucket->preserveDoc) && (bucket->doc != NULL)) { xmlFreeDoc(bucket->doc); } if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) { if (WXS_IMPBUCKET(bucket)->schema != NULL) xmlSchemaFree(WXS_IMPBUCKET(bucket)->schema); } xmlFree(bucket); } static xmlSchemaBucketPtr xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt, int type, const xmlChar *targetNamespace) { xmlSchemaBucketPtr ret; int size; xmlSchemaPtr mainSchema; if (WXS_CONSTRUCTOR(pctxt)->mainSchema == NULL) { PERROR_INT("xmlSchemaBucketCreate", "no main schema on constructor"); return(NULL); } mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema; /* Create the schema bucket. */ if (WXS_IS_BUCKET_INCREDEF(type)) size = sizeof(xmlSchemaInclude); else size = sizeof(xmlSchemaImport); ret = (xmlSchemaBucketPtr) xmlMalloc(size); if (ret == NULL) { xmlSchemaPErrMemory(NULL, "allocating schema bucket", NULL); return(NULL); } memset(ret, 0, size); ret->targetNamespace = targetNamespace; ret->type = type; ret->globals = xmlSchemaItemListCreate(); if (ret->globals == NULL) { xmlFree(ret); return(NULL); } ret->locals = xmlSchemaItemListCreate(); if (ret->locals == NULL) { xmlFree(ret); return(NULL); } /* * The following will assure that only the first bucket is marked as * XML_SCHEMA_SCHEMA_MAIN and it points to the *main* schema. * For each following import buckets an xmlSchema will be created. * An xmlSchema will be created for every distinct targetNamespace. * We assign the targetNamespace to the schemata here. */ if (! WXS_HAS_BUCKETS(pctxt)) { if (WXS_IS_BUCKET_INCREDEF(type)) { PERROR_INT("xmlSchemaBucketCreate", "first bucket but it's an include or redefine"); xmlSchemaBucketFree(ret); return(NULL); } /* Force the type to be XML_SCHEMA_SCHEMA_MAIN. */ ret->type = XML_SCHEMA_SCHEMA_MAIN; /* Point to the *main* schema. */ WXS_CONSTRUCTOR(pctxt)->mainBucket = ret; WXS_IMPBUCKET(ret)->schema = mainSchema; /* * Ensure that the main schema gets a targetNamespace. */ mainSchema->targetNamespace = targetNamespace; } else { if (type == XML_SCHEMA_SCHEMA_MAIN) { PERROR_INT("xmlSchemaBucketCreate", "main bucket but it's not the first one"); xmlSchemaBucketFree(ret); return(NULL); } else if (type == XML_SCHEMA_SCHEMA_IMPORT) { /* * Create a schema for imports and assign the * targetNamespace. */ WXS_IMPBUCKET(ret)->schema = xmlSchemaNewSchema(pctxt); if (WXS_IMPBUCKET(ret)->schema == NULL) { xmlSchemaBucketFree(ret); return(NULL); } WXS_IMPBUCKET(ret)->schema->targetNamespace = targetNamespace; } } if (WXS_IS_BUCKET_IMPMAIN(type)) { int res; /* * Imports go into the "schemasImports" slot of the main *schema*. * Note that we create an import entry for the main schema as well; i.e., * even if there's only one schema, we'll get an import. */ if (mainSchema->schemasImports == NULL) { mainSchema->schemasImports = xmlHashCreateDict(5, WXS_CONSTRUCTOR(pctxt)->dict); if (mainSchema->schemasImports == NULL) { xmlSchemaBucketFree(ret); return(NULL); } } if (targetNamespace == NULL) res = xmlHashAddEntry(mainSchema->schemasImports, XML_SCHEMAS_NO_NAMESPACE, ret); else res = xmlHashAddEntry(mainSchema->schemasImports, targetNamespace, ret); if (res != 0) { PERROR_INT("xmlSchemaBucketCreate", "failed to add the schema bucket to the hash"); xmlSchemaBucketFree(ret); return(NULL); } } else { /* Set the @ownerImport of an include bucket. */ if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type)) WXS_INCBUCKET(ret)->ownerImport = WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket); else WXS_INCBUCKET(ret)->ownerImport = WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport; /* Includes got into the "includes" slot of the *main* schema. */ if (mainSchema->includes == NULL) { mainSchema->includes = xmlSchemaItemListCreate(); if (mainSchema->includes == NULL) { xmlSchemaBucketFree(ret); return(NULL); } } xmlSchemaItemListAdd(mainSchema->includes, ret); } /* * Add to list of all buckets; this is used for lookup * during schema construction time only. */ if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->buckets, ret) == -1) return(NULL); return(ret); } static int xmlSchemaAddItemSize(xmlSchemaItemListPtr *list, int initialSize, void *item) { if (*list == NULL) { *list = xmlSchemaItemListCreate(); if (*list == NULL) return(-1); } xmlSchemaItemListAddSize(*list, initialSize, item); return(0); } /** * xmlSchemaFreeAnnot: * @annot: a schema type structure * * Deallocate a annotation structure */ static void xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot) { if (annot == NULL) return; if (annot->next == NULL) { xmlFree(annot); } else { xmlSchemaAnnotPtr prev; do { prev = annot; annot = annot->next; xmlFree(prev); } while (annot != NULL); } } /** * xmlSchemaFreeNotation: * @schema: a schema notation structure * * Deallocate a Schema Notation structure. */ static void xmlSchemaFreeNotation(xmlSchemaNotationPtr nota) { if (nota == NULL) return; xmlFree(nota); } /** * xmlSchemaFreeAttribute: * @attr: an attribute declaration * * Deallocates an attribute declaration structure. */ static void xmlSchemaFreeAttribute(xmlSchemaAttributePtr attr) { if (attr == NULL) return; if (attr->annot != NULL) xmlSchemaFreeAnnot(attr->annot); if (attr->defVal != NULL) xmlSchemaFreeValue(attr->defVal); xmlFree(attr); } /** * xmlSchemaFreeAttributeUse: * @use: an attribute use * * Deallocates an attribute use structure. */ static void xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use) { if (use == NULL) return; if (use->annot != NULL) xmlSchemaFreeAnnot(use->annot); if (use->defVal != NULL) xmlSchemaFreeValue(use->defVal); xmlFree(use); } /** * xmlSchemaFreeAttributeUseProhib: * @prohib: an attribute use prohibition * * Deallocates an attribute use structure. */ static void xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib) { if (prohib == NULL) return; xmlFree(prohib); } /** * xmlSchemaFreeWildcardNsSet: * set: a schema wildcard namespace * * Deallocates a list of wildcard constraint structures. */ static void xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr set) { xmlSchemaWildcardNsPtr next; while (set != NULL) { next = set->next; xmlFree(set); set = next; } } /** * xmlSchemaFreeWildcard: * @wildcard: a wildcard structure * * Deallocates a wildcard structure. */ void xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard) { if (wildcard == NULL) return; if (wildcard->annot != NULL) xmlSchemaFreeAnnot(wildcard->annot); if (wildcard->nsSet != NULL) xmlSchemaFreeWildcardNsSet(wildcard->nsSet); if (wildcard->negNsSet != NULL) xmlFree(wildcard->negNsSet); xmlFree(wildcard); } /** * xmlSchemaFreeAttributeGroup: * @schema: a schema attribute group structure * * Deallocate a Schema Attribute Group structure. */ static void xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr) { if (attrGr == NULL) return; if (attrGr->annot != NULL) xmlSchemaFreeAnnot(attrGr->annot); if (attrGr->attrUses != NULL) xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses); xmlFree(attrGr); } /** * xmlSchemaFreeQNameRef: * @item: a QName reference structure * * Deallocatea a QName reference structure. */ static void xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr item) { xmlFree(item); } /** * xmlSchemaFreeTypeLinkList: * @alink: a type link * * Deallocate a list of types. */ static void xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr link) { xmlSchemaTypeLinkPtr next; while (link != NULL) { next = link->next; xmlFree(link); link = next; } } static void xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto) { xmlSchemaIDCStateObjPtr next; while (sto != NULL) { next = sto->next; if (sto->history != NULL) xmlFree(sto->history); if (sto->xpathCtxt != NULL) xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt); xmlFree(sto); sto = next; } } /** * xmlSchemaFreeIDC: * @idc: a identity-constraint definition * * Deallocates an identity-constraint definition. */ static void xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef) { xmlSchemaIDCSelectPtr cur, prev; if (idcDef == NULL) return; if (idcDef->annot != NULL) xmlSchemaFreeAnnot(idcDef->annot); /* Selector */ if (idcDef->selector != NULL) { if (idcDef->selector->xpathComp != NULL) xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp); xmlFree(idcDef->selector); } /* Fields */ if (idcDef->fields != NULL) { cur = idcDef->fields; do { prev = cur; cur = cur->next; if (prev->xpathComp != NULL) xmlFreePattern((xmlPatternPtr) prev->xpathComp); xmlFree(prev); } while (cur != NULL); } xmlFree(idcDef); } /** * xmlSchemaFreeElement: * @schema: a schema element structure * * Deallocate a Schema Element structure. */ static void xmlSchemaFreeElement(xmlSchemaElementPtr elem) { if (elem == NULL) return; if (elem->annot != NULL) xmlSchemaFreeAnnot(elem->annot); if (elem->contModel != NULL) xmlRegFreeRegexp(elem->contModel); if (elem->defVal != NULL) xmlSchemaFreeValue(elem->defVal); xmlFree(elem); } /** * xmlSchemaFreeFacet: * @facet: a schema facet structure * * Deallocate a Schema Facet structure. */ void xmlSchemaFreeFacet(xmlSchemaFacetPtr facet) { if (facet == NULL) return; if (facet->val != NULL) xmlSchemaFreeValue(facet->val); if (facet->regexp != NULL) xmlRegFreeRegexp(facet->regexp); if (facet->annot != NULL) xmlSchemaFreeAnnot(facet->annot); xmlFree(facet); } /** * xmlSchemaFreeType: * @type: a schema type structure * * Deallocate a Schema Type structure. */ void xmlSchemaFreeType(xmlSchemaTypePtr type) { if (type == NULL) return; if (type->annot != NULL) xmlSchemaFreeAnnot(type->annot); if (type->facets != NULL) { xmlSchemaFacetPtr facet, next; facet = type->facets; while (facet != NULL) { next = facet->next; xmlSchemaFreeFacet(facet); facet = next; } } if (type->attrUses != NULL) xmlSchemaItemListFree((xmlSchemaItemListPtr) type->attrUses); if (type->memberTypes != NULL) xmlSchemaFreeTypeLinkList(type->memberTypes); if (type->facetSet != NULL) { xmlSchemaFacetLinkPtr next, link; link = type->facetSet; do { next = link->next; xmlFree(link); link = next; } while (link != NULL); } if (type->contModel != NULL) xmlRegFreeRegexp(type->contModel); xmlFree(type); } /** * xmlSchemaFreeModelGroupDef: * @item: a schema model group definition * * Deallocates a schema model group definition. */ static void xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr item) { if (item->annot != NULL) xmlSchemaFreeAnnot(item->annot); xmlFree(item); } /** * xmlSchemaFreeModelGroup: * @item: a schema model group * * Deallocates a schema model group structure. */ static void xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr item) { if (item->annot != NULL) xmlSchemaFreeAnnot(item->annot); xmlFree(item); } static void xmlSchemaComponentListFree(xmlSchemaItemListPtr list) { if ((list == NULL) || (list->nbItems == 0)) return; { xmlSchemaTreeItemPtr item; xmlSchemaTreeItemPtr *items = (xmlSchemaTreeItemPtr *) list->items; int i; for (i = 0; i < list->nbItems; i++) { item = items[i]; if (item == NULL) continue; switch (item->type) { case XML_SCHEMA_TYPE_SIMPLE: case XML_SCHEMA_TYPE_COMPLEX: xmlSchemaFreeType((xmlSchemaTypePtr) item); break; case XML_SCHEMA_TYPE_ATTRIBUTE: xmlSchemaFreeAttribute((xmlSchemaAttributePtr) item); break; case XML_SCHEMA_TYPE_ATTRIBUTE_USE: xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr) item); break; case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: xmlSchemaFreeAttributeUseProhib( (xmlSchemaAttributeUseProhibPtr) item); break; case XML_SCHEMA_TYPE_ELEMENT: xmlSchemaFreeElement((xmlSchemaElementPtr) item); break; case XML_SCHEMA_TYPE_PARTICLE: if (item->annot != NULL) xmlSchemaFreeAnnot(item->annot); xmlFree(item); break; case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr) item); break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: xmlSchemaFreeAttributeGroup( (xmlSchemaAttributeGroupPtr) item); break; case XML_SCHEMA_TYPE_GROUP: xmlSchemaFreeModelGroupDef( (xmlSchemaModelGroupDefPtr) item); break; case XML_SCHEMA_TYPE_ANY: case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) item); break; case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEYREF: xmlSchemaFreeIDC((xmlSchemaIDCPtr) item); break; case XML_SCHEMA_TYPE_NOTATION: xmlSchemaFreeNotation((xmlSchemaNotationPtr) item); break; case XML_SCHEMA_EXTRA_QNAMEREF: xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr) item); break; default: { /* TODO: This should never be hit. */ xmlSchemaPSimpleInternalErr(NULL, "Internal error: xmlSchemaComponentListFree, " "unexpected component type '%s'\n", (const xmlChar *) WXS_ITEM_TYPE_NAME(item)); } break; } } list->nbItems = 0; } } /** * xmlSchemaFree: * @schema: a schema structure * * Deallocate a Schema structure. */ void xmlSchemaFree(xmlSchemaPtr schema) { if (schema == NULL) return; /* @volatiles is not used anymore :-/ */ if (schema->volatiles != NULL) TODO /* * Note that those slots are not responsible for freeing * schema components anymore; this will now be done by * the schema buckets. */ if (schema->notaDecl != NULL) xmlHashFree(schema->notaDecl, NULL); if (schema->attrDecl != NULL) xmlHashFree(schema->attrDecl, NULL); if (schema->attrgrpDecl != NULL) xmlHashFree(schema->attrgrpDecl, NULL); if (schema->elemDecl != NULL) xmlHashFree(schema->elemDecl, NULL); if (schema->typeDecl != NULL) xmlHashFree(schema->typeDecl, NULL); if (schema->groupDecl != NULL) xmlHashFree(schema->groupDecl, NULL); if (schema->idcDef != NULL) xmlHashFree(schema->idcDef, NULL); if (schema->schemasImports != NULL) xmlHashFree(schema->schemasImports, (xmlHashDeallocator) xmlSchemaBucketFree); if (schema->includes != NULL) { xmlSchemaItemListPtr list = (xmlSchemaItemListPtr) schema->includes; int i; for (i = 0; i < list->nbItems; i++) { xmlSchemaBucketFree((xmlSchemaBucketPtr) list->items[i]); } xmlSchemaItemListFree(list); } if (schema->annot != NULL) xmlSchemaFreeAnnot(schema->annot); /* Never free the doc here, since this will be done by the buckets. */ xmlDictFree(schema->dict); xmlFree(schema); } /************************************************************************ * * * Debug functions * * * ************************************************************************/ #ifdef LIBXML_OUTPUT_ENABLED static void xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output); /* forward */ /** * xmlSchemaElementDump: * @elem: an element * @output: the file output * * Dump the element */ static void xmlSchemaElementDump(xmlSchemaElementPtr elem, FILE * output, const xmlChar * name ATTRIBUTE_UNUSED, const xmlChar * namespace ATTRIBUTE_UNUSED, const xmlChar * context ATTRIBUTE_UNUSED) { if (elem == NULL) return; fprintf(output, "Element"); if (elem->flags & XML_SCHEMAS_ELEM_GLOBAL) fprintf(output, " (global)"); fprintf(output, ": '%s' ", elem->name); if (namespace != NULL) fprintf(output, "ns '%s'", namespace); fprintf(output, "\n"); #if 0 if ((elem->minOccurs != 1) || (elem->maxOccurs != 1)) { fprintf(output, " min %d ", elem->minOccurs); if (elem->maxOccurs >= UNBOUNDED) fprintf(output, "max: unbounded\n"); else if (elem->maxOccurs != 1) fprintf(output, "max: %d\n", elem->maxOccurs); else fprintf(output, "\n"); } #endif /* * Misc other properties. */ if ((elem->flags & XML_SCHEMAS_ELEM_NILLABLE) || (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) || (elem->flags & XML_SCHEMAS_ELEM_FIXED) || (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) { fprintf(output, " props: "); if (elem->flags & XML_SCHEMAS_ELEM_FIXED) fprintf(output, "[fixed] "); if (elem->flags & XML_SCHEMAS_ELEM_DEFAULT) fprintf(output, "[default] "); if (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) fprintf(output, "[abstract] "); if (elem->flags & XML_SCHEMAS_ELEM_NILLABLE) fprintf(output, "[nillable] "); fprintf(output, "\n"); } /* * Default/fixed value. */ if (elem->value != NULL) fprintf(output, " value: '%s'\n", elem->value); /* * Type. */ if (elem->namedType != NULL) { fprintf(output, " type: '%s' ", elem->namedType); if (elem->namedTypeNs != NULL) fprintf(output, "ns '%s'\n", elem->namedTypeNs); else fprintf(output, "\n"); } else if (elem->subtypes != NULL) { /* * Dump local types. */ xmlSchemaTypeDump(elem->subtypes, output); } /* * Substitution group. */ if (elem->substGroup != NULL) { fprintf(output, " substitutionGroup: '%s' ", elem->substGroup); if (elem->substGroupNs != NULL) fprintf(output, "ns '%s'\n", elem->substGroupNs); else fprintf(output, "\n"); } } /** * xmlSchemaAnnotDump: * @output: the file output * @annot: a annotation * * Dump the annotation */ static void xmlSchemaAnnotDump(FILE * output, xmlSchemaAnnotPtr annot) { xmlChar *content; if (annot == NULL) return; content = xmlNodeGetContent(annot->content); if (content != NULL) { fprintf(output, " Annot: %s\n", content); xmlFree(content); } else fprintf(output, " Annot: empty\n"); } /** * xmlSchemaContentModelDump: * @particle: the schema particle * @output: the file output * @depth: the depth used for intentation * * Dump a SchemaType structure */ static void xmlSchemaContentModelDump(xmlSchemaParticlePtr particle, FILE * output, int depth) { xmlChar *str = NULL; xmlSchemaTreeItemPtr term; char shift[100]; int i; if (particle == NULL) return; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; fprintf(output, "%s", shift); if (particle->children == NULL) { fprintf(output, "MISSING particle term\n"); return; } term = particle->children; if (term == NULL) { fprintf(output, "(NULL)"); } else { switch (term->type) { case XML_SCHEMA_TYPE_ELEMENT: fprintf(output, "ELEM '%s'", xmlSchemaFormatQName(&str, ((xmlSchemaElementPtr)term)->targetNamespace, ((xmlSchemaElementPtr)term)->name)); FREE_AND_NULL(str); break; case XML_SCHEMA_TYPE_SEQUENCE: fprintf(output, "SEQUENCE"); break; case XML_SCHEMA_TYPE_CHOICE: fprintf(output, "CHOICE"); break; case XML_SCHEMA_TYPE_ALL: fprintf(output, "ALL"); break; case XML_SCHEMA_TYPE_ANY: fprintf(output, "ANY"); break; default: fprintf(output, "UNKNOWN\n"); return; } } if (particle->minOccurs != 1) fprintf(output, " min: %d", particle->minOccurs); if (particle->maxOccurs >= UNBOUNDED) fprintf(output, " max: unbounded"); else if (particle->maxOccurs != 1) fprintf(output, " max: %d", particle->maxOccurs); fprintf(output, "\n"); if (term && ((term->type == XML_SCHEMA_TYPE_SEQUENCE) || (term->type == XML_SCHEMA_TYPE_CHOICE) || (term->type == XML_SCHEMA_TYPE_ALL)) && (term->children != NULL)) { xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children, output, depth +1); } if (particle->next != NULL) xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next, output, depth); } /** * xmlSchemaAttrUsesDump: * @uses: attribute uses list * @output: the file output * * Dumps a list of attribute use components. */ static void xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses, FILE * output) { xmlSchemaAttributeUsePtr use; xmlSchemaAttributeUseProhibPtr prohib; xmlSchemaQNameRefPtr ref; const xmlChar *name, *tns; xmlChar *str = NULL; int i; if ((uses == NULL) || (uses->nbItems == 0)) return; fprintf(output, " attributes:\n"); for (i = 0; i < uses->nbItems; i++) { use = uses->items[i]; if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) { fprintf(output, " [prohibition] "); prohib = (xmlSchemaAttributeUseProhibPtr) use; name = prohib->name; tns = prohib->targetNamespace; } else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) { fprintf(output, " [reference] "); ref = (xmlSchemaQNameRefPtr) use; name = ref->name; tns = ref->targetNamespace; } else { fprintf(output, " [use] "); name = WXS_ATTRUSE_DECL_NAME(use); tns = WXS_ATTRUSE_DECL_TNS(use); } fprintf(output, "'%s'\n", (const char *) xmlSchemaFormatQName(&str, tns, name)); FREE_AND_NULL(str); } } /** * xmlSchemaTypeDump: * @output: the file output * @type: a type structure * * Dump a SchemaType structure */ static void xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output) { if (type == NULL) { fprintf(output, "Type: NULL\n"); return; } fprintf(output, "Type: "); if (type->name != NULL) fprintf(output, "'%s' ", type->name); else fprintf(output, "(no name) "); if (type->targetNamespace != NULL) fprintf(output, "ns '%s' ", type->targetNamespace); switch (type->type) { case XML_SCHEMA_TYPE_BASIC: fprintf(output, "[basic] "); break; case XML_SCHEMA_TYPE_SIMPLE: fprintf(output, "[simple] "); break; case XML_SCHEMA_TYPE_COMPLEX: fprintf(output, "[complex] "); break; case XML_SCHEMA_TYPE_SEQUENCE: fprintf(output, "[sequence] "); break; case XML_SCHEMA_TYPE_CHOICE: fprintf(output, "[choice] "); break; case XML_SCHEMA_TYPE_ALL: fprintf(output, "[all] "); break; case XML_SCHEMA_TYPE_UR: fprintf(output, "[ur] "); break; case XML_SCHEMA_TYPE_RESTRICTION: fprintf(output, "[restriction] "); break; case XML_SCHEMA_TYPE_EXTENSION: fprintf(output, "[extension] "); break; default: fprintf(output, "[unknown type %d] ", type->type); break; } fprintf(output, "content: "); switch (type->contentType) { case XML_SCHEMA_CONTENT_UNKNOWN: fprintf(output, "[unknown] "); break; case XML_SCHEMA_CONTENT_EMPTY: fprintf(output, "[empty] "); break; case XML_SCHEMA_CONTENT_ELEMENTS: fprintf(output, "[element] "); break; case XML_SCHEMA_CONTENT_MIXED: fprintf(output, "[mixed] "); break; case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS: /* not used. */ break; case XML_SCHEMA_CONTENT_BASIC: fprintf(output, "[basic] "); break; case XML_SCHEMA_CONTENT_SIMPLE: fprintf(output, "[simple] "); break; case XML_SCHEMA_CONTENT_ANY: fprintf(output, "[any] "); break; } fprintf(output, "\n"); if (type->base != NULL) { fprintf(output, " base type: '%s'", type->base); if (type->baseNs != NULL) fprintf(output, " ns '%s'\n", type->baseNs); else fprintf(output, "\n"); } if (type->attrUses != NULL) xmlSchemaAttrUsesDump(type->attrUses, output); if (type->annot != NULL) xmlSchemaAnnotDump(output, type->annot); #ifdef DUMP_CONTENT_MODEL if ((type->type == XML_SCHEMA_TYPE_COMPLEX) && (type->subtypes != NULL)) { xmlSchemaContentModelDump((xmlSchemaParticlePtr) type->subtypes, output, 1); } #endif } /** * xmlSchemaDump: * @output: the file output * @schema: a schema structure * * Dump a Schema structure. */ void xmlSchemaDump(FILE * output, xmlSchemaPtr schema) { if (output == NULL) return; if (schema == NULL) { fprintf(output, "Schemas: NULL\n"); return; } fprintf(output, "Schemas: "); if (schema->name != NULL) fprintf(output, "%s, ", schema->name); else fprintf(output, "no name, "); if (schema->targetNamespace != NULL) fprintf(output, "%s", (const char *) schema->targetNamespace); else fprintf(output, "no target namespace"); fprintf(output, "\n"); if (schema->annot != NULL) xmlSchemaAnnotDump(output, schema->annot); xmlHashScan(schema->typeDecl, (xmlHashScanner) xmlSchemaTypeDump, output); xmlHashScanFull(schema->elemDecl, (xmlHashScannerFull) xmlSchemaElementDump, output); } #ifdef DEBUG_IDC_NODE_TABLE /** * xmlSchemaDebugDumpIDCTable: * @vctxt: the WXS validation context * * Displays the current IDC table for debug purposes. */ static void xmlSchemaDebugDumpIDCTable(FILE * output, const xmlChar *namespaceName, const xmlChar *localName, xmlSchemaPSVIIDCBindingPtr bind) { xmlChar *str = NULL; const xmlChar *value; xmlSchemaPSVIIDCNodePtr tab; xmlSchemaPSVIIDCKeyPtr key; int i, j, res; fprintf(output, "IDC: TABLES on '%s'\n", xmlSchemaFormatQName(&str, namespaceName, localName)); FREE_AND_NULL(str) if (bind == NULL) return; do { fprintf(output, "IDC: BINDING '%s' (%d)\n", xmlSchemaGetComponentQName(&str, bind->definition), bind->nbNodes); FREE_AND_NULL(str) for (i = 0; i < bind->nbNodes; i++) { tab = bind->nodeTable[i]; fprintf(output, " ( "); for (j = 0; j < bind->definition->nbFields; j++) { key = tab->keys[j]; if ((key != NULL) && (key->val != NULL)) { res = xmlSchemaGetCanonValue(key->val, &value); if (res >= 0) fprintf(output, "'%s' ", value); else fprintf(output, "CANON-VALUE-FAILED "); if (res == 0) FREE_AND_NULL(value) } else if (key != NULL) fprintf(output, "(no val), "); else fprintf(output, "(key missing), "); } fprintf(output, ")\n"); } if (bind->dupls && bind->dupls->nbItems) { fprintf(output, "IDC: dupls (%d):\n", bind->dupls->nbItems); for (i = 0; i < bind->dupls->nbItems; i++) { tab = bind->dupls->items[i]; fprintf(output, " ( "); for (j = 0; j < bind->definition->nbFields; j++) { key = tab->keys[j]; if ((key != NULL) && (key->val != NULL)) { res = xmlSchemaGetCanonValue(key->val, &value); if (res >= 0) fprintf(output, "'%s' ", value); else fprintf(output, "CANON-VALUE-FAILED "); if (res == 0) FREE_AND_NULL(value) } else if (key != NULL) fprintf(output, "(no val), "); else fprintf(output, "(key missing), "); } fprintf(output, ")\n"); } } bind = bind->next; } while (bind != NULL); } #endif /* DEBUG_IDC */ #endif /* LIBXML_OUTPUT_ENABLED */ /************************************************************************ * * * Utilities * * * ************************************************************************/ /** * xmlSchemaGetPropNode: * @node: the element node * @name: the name of the attribute * * Seeks an attribute with a name of @name in * no namespace. * * Returns the attribute or NULL if not present. */ static xmlAttrPtr xmlSchemaGetPropNode(xmlNodePtr node, const char *name) { xmlAttrPtr prop; if ((node == NULL) || (name == NULL)) return(NULL); prop = node->properties; while (prop != NULL) { if ((prop->ns == NULL) && xmlStrEqual(prop->name, BAD_CAST name)) return(prop); prop = prop->next; } return (NULL); } /** * xmlSchemaGetPropNodeNs: * @node: the element node * @uri: the uri * @name: the name of the attribute * * Seeks an attribute with a local name of @name and * a namespace URI of @uri. * * Returns the attribute or NULL if not present. */ static xmlAttrPtr xmlSchemaGetPropNodeNs(xmlNodePtr node, const char *uri, const char *name) { xmlAttrPtr prop; if ((node == NULL) || (name == NULL)) return(NULL); prop = node->properties; while (prop != NULL) { if ((prop->ns != NULL) && xmlStrEqual(prop->name, BAD_CAST name) && xmlStrEqual(prop->ns->href, BAD_CAST uri)) return(prop); prop = prop->next; } return (NULL); } static const xmlChar * xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node) { xmlChar *val; const xmlChar *ret; val = xmlNodeGetContent(node); if (val == NULL) val = xmlStrdup((xmlChar *)""); ret = xmlDictLookup(ctxt->dict, val, -1); xmlFree(val); return(ret); } static const xmlChar * xmlSchemaGetNodeContentNoDict(xmlNodePtr node) { return((const xmlChar*) xmlNodeGetContent(node)); } /** * xmlSchemaGetProp: * @ctxt: the parser context * @node: the node * @name: the property name * * Read a attribute value and internalize the string * * Returns the string or NULL if not present. */ static const xmlChar * xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, const char *name) { xmlChar *val; const xmlChar *ret; val = xmlGetNoNsProp(node, BAD_CAST name); if (val == NULL) return(NULL); ret = xmlDictLookup(ctxt->dict, val, -1); xmlFree(val); return(ret); } /************************************************************************ * * * Parsing functions * * * ************************************************************************/ #define WXS_FIND_GLOBAL_ITEM(slot) \ if (xmlStrEqual(nsName, schema->targetNamespace)) { \ ret = xmlHashLookup(schema->slot, name); \ if (ret != NULL) goto exit; \ } \ if (xmlHashSize(schema->schemasImports) > 1) { \ xmlSchemaImportPtr import; \ if (nsName == NULL) \ import = xmlHashLookup(schema->schemasImports, \ XML_SCHEMAS_NO_NAMESPACE); \ else \ import = xmlHashLookup(schema->schemasImports, nsName); \ if (import == NULL) \ goto exit; \ ret = xmlHashLookup(import->schema->slot, name); \ } /** * xmlSchemaGetElem: * @schema: the schema context * @name: the element name * @ns: the element namespace * * Lookup a global element declaration in the schema. * * Returns the element declaration or NULL if not found. */ static xmlSchemaElementPtr xmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name, const xmlChar * nsName) { xmlSchemaElementPtr ret = NULL; if ((name == NULL) || (schema == NULL)) return(NULL); if (schema != NULL) { WXS_FIND_GLOBAL_ITEM(elemDecl) } exit: #ifdef DEBUG if (ret == NULL) { if (nsName == NULL) fprintf(stderr, "Unable to lookup element decl. %s", name); else fprintf(stderr, "Unable to lookup element decl. %s:%s", name, nsName); } #endif return (ret); } /** * xmlSchemaGetType: * @schema: the main schema * @name: the type's name * nsName: the type's namespace * * Lookup a type in the schemas or the predefined types * * Returns the group definition or NULL if not found. */ static xmlSchemaTypePtr xmlSchemaGetType(xmlSchemaPtr schema, const xmlChar * name, const xmlChar * nsName) { xmlSchemaTypePtr ret = NULL; if (name == NULL) return (NULL); /* First try the built-in types. */ if ((nsName != NULL) && xmlStrEqual(nsName, xmlSchemaNs)) { ret = xmlSchemaGetPredefinedType(name, nsName); if (ret != NULL) goto exit; /* * Note that we try the parsed schemas as well here * since one might have parsed the S4S, which contain more * than the built-in types. * TODO: Can we optimize this? */ } if (schema != NULL) { WXS_FIND_GLOBAL_ITEM(typeDecl) } exit: #ifdef DEBUG if (ret == NULL) { if (nsName == NULL) fprintf(stderr, "Unable to lookup type %s", name); else fprintf(stderr, "Unable to lookup type %s:%s", name, nsName); } #endif return (ret); } /** * xmlSchemaGetAttributeDecl: * @schema: the context of the schema * @name: the name of the attribute * @ns: the target namespace of the attribute * * Lookup a an attribute in the schema or imported schemas * * Returns the attribute declaration or NULL if not found. */ static xmlSchemaAttributePtr xmlSchemaGetAttributeDecl(xmlSchemaPtr schema, const xmlChar * name, const xmlChar * nsName) { xmlSchemaAttributePtr ret = NULL; if ((name == NULL) || (schema == NULL)) return (NULL); if (schema != NULL) { WXS_FIND_GLOBAL_ITEM(attrDecl) } exit: #ifdef DEBUG if (ret == NULL) { if (nsName == NULL) fprintf(stderr, "Unable to lookup attribute %s", name); else fprintf(stderr, "Unable to lookup attribute %s:%s", name, nsName); } #endif return (ret); } /** * xmlSchemaGetAttributeGroup: * @schema: the context of the schema * @name: the name of the attribute group * @ns: the target namespace of the attribute group * * Lookup a an attribute group in the schema or imported schemas * * Returns the attribute group definition or NULL if not found. */ static xmlSchemaAttributeGroupPtr xmlSchemaGetAttributeGroup(xmlSchemaPtr schema, const xmlChar * name, const xmlChar * nsName) { xmlSchemaAttributeGroupPtr ret = NULL; if ((name == NULL) || (schema == NULL)) return (NULL); if (schema != NULL) { WXS_FIND_GLOBAL_ITEM(attrgrpDecl) } exit: /* TODO: if ((ret != NULL) && (ret->redef != NULL)) { * Return the last redefinition. * ret = ret->redef; } */ #ifdef DEBUG if (ret == NULL) { if (nsName == NULL) fprintf(stderr, "Unable to lookup attribute group %s", name); else fprintf(stderr, "Unable to lookup attribute group %s:%s", name, nsName); } #endif return (ret); } /** * xmlSchemaGetGroup: * @schema: the context of the schema * @name: the name of the group * @ns: the target namespace of the group * * Lookup a group in the schema or imported schemas * * Returns the group definition or NULL if not found. */ static xmlSchemaModelGroupDefPtr xmlSchemaGetGroup(xmlSchemaPtr schema, const xmlChar * name, const xmlChar * nsName) { xmlSchemaModelGroupDefPtr ret = NULL; if ((name == NULL) || (schema == NULL)) return (NULL); if (schema != NULL) { WXS_FIND_GLOBAL_ITEM(groupDecl) } exit: #ifdef DEBUG if (ret == NULL) { if (nsName == NULL) fprintf(stderr, "Unable to lookup group %s", name); else fprintf(stderr, "Unable to lookup group %s:%s", name, nsName); } #endif return (ret); } static xmlSchemaNotationPtr xmlSchemaGetNotation(xmlSchemaPtr schema, const xmlChar *name, const xmlChar *nsName) { xmlSchemaNotationPtr ret = NULL; if ((name == NULL) || (schema == NULL)) return (NULL); if (schema != NULL) { WXS_FIND_GLOBAL_ITEM(notaDecl) } exit: return (ret); } static xmlSchemaIDCPtr xmlSchemaGetIDC(xmlSchemaPtr schema, const xmlChar *name, const xmlChar *nsName) { xmlSchemaIDCPtr ret = NULL; if ((name == NULL) || (schema == NULL)) return (NULL); if (schema != NULL) { WXS_FIND_GLOBAL_ITEM(idcDef) } exit: return (ret); } /** * xmlSchemaGetNamedComponent: * @schema: the schema * @name: the name of the group * @ns: the target namespace of the group * * Lookup a group in the schema or imported schemas * * Returns the group definition or NULL if not found. */ static xmlSchemaBasicItemPtr xmlSchemaGetNamedComponent(xmlSchemaPtr schema, xmlSchemaTypeType itemType, const xmlChar *name, const xmlChar *targetNs) { switch (itemType) { case XML_SCHEMA_TYPE_GROUP: return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(schema, name, targetNs)); case XML_SCHEMA_TYPE_ELEMENT: return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(schema, name, targetNs)); default: TODO return (NULL); } } /************************************************************************ * * * Parsing functions * * * ************************************************************************/ #define IS_BLANK_NODE(n) \ (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1))) /** * xmlSchemaIsBlank: * @str: a string * @len: the length of the string or -1 * * Check if a string is ignorable * * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise */ static int xmlSchemaIsBlank(xmlChar * str, int len) { if (str == NULL) return (1); if (len < 0) { while (*str != 0) { if (!(IS_BLANK_CH(*str))) return (0); str++; } } else while ((*str != 0) && (len != 0)) { if (!(IS_BLANK_CH(*str))) return (0); str++; len--; } return (1); } #define WXS_COMP_NAME(c, t) ((t) (c))->name #define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace /* * xmlSchemaFindRedefCompInGraph: * ATTENTION TODO: This uses pointer comp. for strings. */ static xmlSchemaBasicItemPtr xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket, xmlSchemaTypeType type, const xmlChar *name, const xmlChar *nsName) { xmlSchemaBasicItemPtr ret; int i; if ((bucket == NULL) || (name == NULL)) return(NULL); if ((bucket->globals == NULL) || (bucket->globals->nbItems == 0)) goto subschemas; /* * Search in global components. */ for (i = 0; i < bucket->globals->nbItems; i++) { ret = bucket->globals->items[i]; if (ret->type == type) { switch (type) { case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: if ((WXS_COMP_NAME(ret, xmlSchemaTypePtr) == name) && (WXS_COMP_TNS(ret, xmlSchemaTypePtr) == nsName)) { return(ret); } break; case XML_SCHEMA_TYPE_GROUP: if ((WXS_COMP_NAME(ret, xmlSchemaModelGroupDefPtr) == name) && (WXS_COMP_TNS(ret, xmlSchemaModelGroupDefPtr) == nsName)) { return(ret); } break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: if ((WXS_COMP_NAME(ret, xmlSchemaAttributeGroupPtr) == name) && (WXS_COMP_TNS(ret, xmlSchemaAttributeGroupPtr) == nsName)) { return(ret); } break; default: /* Should not be hit. */ return(NULL); } } } subschemas: /* * Process imported/included schemas. */ if (bucket->relations != NULL) { xmlSchemaSchemaRelationPtr rel = bucket->relations; /* * TODO: Marking the bucket will not avoid multiple searches * in the same schema, but avoids at least circularity. */ bucket->flags |= XML_SCHEMA_BUCKET_MARKED; do { if ((rel->bucket != NULL) && ((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) { ret = xmlSchemaFindRedefCompInGraph(rel->bucket, type, name, nsName); if (ret != NULL) return(ret); } rel = rel->next; } while (rel != NULL); bucket->flags ^= XML_SCHEMA_BUCKET_MARKED; } return(NULL); } /** * xmlSchemaAddNotation: * @ctxt: a schema parser context * @schema: the schema being built * @name: the item name * * Add an XML schema annotation declaration * *WARNING* this interface is highly subject to change * * Returns the new struture or NULL in case of error */ static xmlSchemaNotationPtr xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, const xmlChar *name, const xmlChar *nsName, xmlNodePtr node ATTRIBUTE_UNUSED) { xmlSchemaNotationPtr ret = NULL; if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) return (NULL); ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "add annotation", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaNotation)); ret->type = XML_SCHEMA_TYPE_NOTATION; ret->name = name; ret->targetNamespace = nsName; /* TODO: do we need the node to be set? * ret->node = node;*/ WXS_ADD_GLOBAL(ctxt, ret); return (ret); } /** * xmlSchemaAddAttribute: * @ctxt: a schema parser context * @schema: the schema being built * @name: the item name * @namespace: the namespace * * Add an XML schema Attrribute declaration * *WARNING* this interface is highly subject to change * * Returns the new struture or NULL in case of error */ static xmlSchemaAttributePtr xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, const xmlChar * name, const xmlChar * nsName, xmlNodePtr node, int topLevel) { xmlSchemaAttributePtr ret = NULL; if ((ctxt == NULL) || (schema == NULL)) return (NULL); ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating attribute", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaAttribute)); ret->type = XML_SCHEMA_TYPE_ATTRIBUTE; ret->node = node; ret->name = name; ret->targetNamespace = nsName; if (topLevel) WXS_ADD_GLOBAL(ctxt, ret); else WXS_ADD_LOCAL(ctxt, ret); WXS_ADD_PENDING(ctxt, ret); return (ret); } /** * xmlSchemaAddAttributeUse: * @ctxt: a schema parser context * @schema: the schema being built * @name: the item name * @namespace: the namespace * * Add an XML schema Attrribute declaration * *WARNING* this interface is highly subject to change * * Returns the new struture or NULL in case of error */ static xmlSchemaAttributeUsePtr xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt, xmlNodePtr node) { xmlSchemaAttributeUsePtr ret = NULL; if (pctxt == NULL) return (NULL); ret = (xmlSchemaAttributeUsePtr) xmlMalloc(sizeof(xmlSchemaAttributeUse)); if (ret == NULL) { xmlSchemaPErrMemory(pctxt, "allocating attribute", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaAttributeUse)); ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE; ret->node = node; WXS_ADD_LOCAL(pctxt, ret); return (ret); } /* * xmlSchemaAddRedef: * * Adds a redefinition information. This is used at a later stage to: * resolve references to the redefined components and to check constraints. */ static xmlSchemaRedefPtr xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt, xmlSchemaBucketPtr targetBucket, void *item, const xmlChar *refName, const xmlChar *refTargetNs) { xmlSchemaRedefPtr ret; ret = (xmlSchemaRedefPtr) xmlMalloc(sizeof(xmlSchemaRedef)); if (ret == NULL) { xmlSchemaPErrMemory(pctxt, "allocating redefinition info", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaRedef)); ret->item = item; ret->targetBucket = targetBucket; ret->refName = refName; ret->refTargetNs = refTargetNs; if (WXS_CONSTRUCTOR(pctxt)->redefs == NULL) WXS_CONSTRUCTOR(pctxt)->redefs = ret; else WXS_CONSTRUCTOR(pctxt)->lastRedef->next = ret; WXS_CONSTRUCTOR(pctxt)->lastRedef = ret; return (ret); } /** * xmlSchemaAddAttributeGroupDefinition: * @ctxt: a schema parser context * @schema: the schema being built * @name: the item name * @nsName: the target namespace * @node: the corresponding node * * Add an XML schema Attrribute Group definition. * * Returns the new struture or NULL in case of error */ static xmlSchemaAttributeGroupPtr xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar *nsName, xmlNodePtr node) { xmlSchemaAttributeGroupPtr ret = NULL; if ((pctxt == NULL) || (name == NULL)) return (NULL); ret = (xmlSchemaAttributeGroupPtr) xmlMalloc(sizeof(xmlSchemaAttributeGroup)); if (ret == NULL) { xmlSchemaPErrMemory(pctxt, "allocating attribute group", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaAttributeGroup)); ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP; ret->name = name; ret->targetNamespace = nsName; ret->node = node; /* TODO: Remove the flag. */ ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL; if (pctxt->isRedefine) { pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined, ret, name, nsName); if (pctxt->redef == NULL) { xmlFree(ret); return(NULL); } pctxt->redefCounter = 0; } WXS_ADD_GLOBAL(pctxt, ret); WXS_ADD_PENDING(pctxt, ret); return (ret); } /** * xmlSchemaAddElement: * @ctxt: a schema parser context * @schema: the schema being built * @name: the type name * @namespace: the type namespace * * Add an XML schema Element declaration * *WARNING* this interface is highly subject to change * * Returns the new struture or NULL in case of error */ static xmlSchemaElementPtr xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt, const xmlChar * name, const xmlChar * nsName, xmlNodePtr node, int topLevel) { xmlSchemaElementPtr ret = NULL; if ((ctxt == NULL) || (name == NULL)) return (NULL); ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating element", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaElement)); ret->type = XML_SCHEMA_TYPE_ELEMENT; ret->name = name; ret->targetNamespace = nsName; ret->node = node; if (topLevel) WXS_ADD_GLOBAL(ctxt, ret); else WXS_ADD_LOCAL(ctxt, ret); WXS_ADD_PENDING(ctxt, ret); return (ret); } /** * xmlSchemaAddType: * @ctxt: a schema parser context * @schema: the schema being built * @name: the item name * @namespace: the namespace * * Add an XML schema item * *WARNING* this interface is highly subject to change * * Returns the new struture or NULL in case of error */ static xmlSchemaTypePtr xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlSchemaTypeType type, const xmlChar * name, const xmlChar * nsName, xmlNodePtr node, int topLevel) { xmlSchemaTypePtr ret = NULL; if ((ctxt == NULL) || (schema == NULL)) return (NULL); ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating type", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaType)); ret->type = type; ret->name = name; ret->targetNamespace = nsName; ret->node = node; if (topLevel) { if (ctxt->isRedefine) { ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined, ret, name, nsName); if (ctxt->redef == NULL) { xmlFree(ret); return(NULL); } ctxt->redefCounter = 0; } WXS_ADD_GLOBAL(ctxt, ret); } else WXS_ADD_LOCAL(ctxt, ret); WXS_ADD_PENDING(ctxt, ret); return (ret); } static xmlSchemaQNameRefPtr xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypeType refType, const xmlChar *refName, const xmlChar *refNs) { xmlSchemaQNameRefPtr ret; ret = (xmlSchemaQNameRefPtr) xmlMalloc(sizeof(xmlSchemaQNameRef)); if (ret == NULL) { xmlSchemaPErrMemory(pctxt, "allocating QName reference item", NULL); return (NULL); } ret->node = NULL; ret->type = XML_SCHEMA_EXTRA_QNAMEREF; ret->name = refName; ret->targetNamespace = refNs; ret->item = NULL; ret->itemType = refType; /* * Store the reference item in the schema. */ WXS_ADD_LOCAL(pctxt, ret); return (ret); } static xmlSchemaAttributeUseProhibPtr xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt) { xmlSchemaAttributeUseProhibPtr ret; ret = (xmlSchemaAttributeUseProhibPtr) xmlMalloc(sizeof(xmlSchemaAttributeUseProhib)); if (ret == NULL) { xmlSchemaPErrMemory(pctxt, "allocating attribute use prohibition", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaAttributeUseProhib)); ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB; WXS_ADD_LOCAL(pctxt, ret); return (ret); } /** * xmlSchemaAddModelGroup: * @ctxt: a schema parser context * @schema: the schema being built * @type: the "compositor" type of the model group * @node: the node in the schema doc * * Adds a schema model group * *WARNING* this interface is highly subject to change * * Returns the new struture or NULL in case of error */ static xmlSchemaModelGroupPtr xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlSchemaTypeType type, xmlNodePtr node) { xmlSchemaModelGroupPtr ret = NULL; if ((ctxt == NULL) || (schema == NULL)) return (NULL); ret = (xmlSchemaModelGroupPtr) xmlMalloc(sizeof(xmlSchemaModelGroup)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating model group component", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaModelGroup)); ret->type = type; ret->node = node; WXS_ADD_LOCAL(ctxt, ret); if ((type == XML_SCHEMA_TYPE_SEQUENCE) || (type == XML_SCHEMA_TYPE_CHOICE)) WXS_ADD_PENDING(ctxt, ret); return (ret); } /** * xmlSchemaAddParticle: * @ctxt: a schema parser context * @schema: the schema being built * @node: the corresponding node in the schema doc * @min: the minOccurs * @max: the maxOccurs * * Adds an XML schema particle component. * *WARNING* this interface is highly subject to change * * Returns the new struture or NULL in case of error */ static xmlSchemaParticlePtr xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int min, int max) { xmlSchemaParticlePtr ret = NULL; if (ctxt == NULL) return (NULL); #ifdef DEBUG fprintf(stderr, "Adding particle component\n"); #endif ret = (xmlSchemaParticlePtr) xmlMalloc(sizeof(xmlSchemaParticle)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating particle component", NULL); return (NULL); } ret->type = XML_SCHEMA_TYPE_PARTICLE; ret->annot = NULL; ret->node = node; ret->minOccurs = min; ret->maxOccurs = max; ret->next = NULL; ret->children = NULL; WXS_ADD_LOCAL(ctxt, ret); /* * Note that addition to pending components will be done locally * to the specific parsing function, since the most particles * need not to be fixed up (i.e. the reference to be resolved). * REMOVED: WXS_ADD_PENDING(ctxt, ret); */ return (ret); } /** * xmlSchemaAddModelGroupDefinition: * @ctxt: a schema validation context * @schema: the schema being built * @name: the group name * * Add an XML schema Group definition * * Returns the new struture or NULL in case of error */ static xmlSchemaModelGroupDefPtr xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, const xmlChar *name, const xmlChar *nsName, xmlNodePtr node) { xmlSchemaModelGroupDefPtr ret = NULL; if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) return (NULL); ret = (xmlSchemaModelGroupDefPtr) xmlMalloc(sizeof(xmlSchemaModelGroupDef)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "adding group", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaModelGroupDef)); ret->name = name; ret->type = XML_SCHEMA_TYPE_GROUP; ret->node = node; ret->targetNamespace = nsName; if (ctxt->isRedefine) { ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined, ret, name, nsName); if (ctxt->redef == NULL) { xmlFree(ret); return(NULL); } ctxt->redefCounter = 0; } WXS_ADD_GLOBAL(ctxt, ret); WXS_ADD_PENDING(ctxt, ret); return (ret); } /** * xmlSchemaNewWildcardNs: * @ctxt: a schema validation context * * Creates a new wildcard namespace constraint. * * Returns the new struture or NULL in case of error */ static xmlSchemaWildcardNsPtr xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt) { xmlSchemaWildcardNsPtr ret; ret = (xmlSchemaWildcardNsPtr) xmlMalloc(sizeof(xmlSchemaWildcardNs)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "creating wildcard namespace constraint", NULL); return (NULL); } ret->value = NULL; ret->next = NULL; return (ret); } static xmlSchemaIDCPtr xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, const xmlChar *name, const xmlChar *nsName, int category, xmlNodePtr node) { xmlSchemaIDCPtr ret = NULL; if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) return (NULL); ret = (xmlSchemaIDCPtr) xmlMalloc(sizeof(xmlSchemaIDC)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "allocating an identity-constraint definition", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaIDC)); /* The target namespace of the parent element declaration. */ ret->targetNamespace = nsName; ret->name = name; ret->type = category; ret->node = node; WXS_ADD_GLOBAL(ctxt, ret); /* * Only keyrefs need to be fixup up. */ if (category == XML_SCHEMA_TYPE_IDC_KEYREF) WXS_ADD_PENDING(ctxt, ret); return (ret); } /** * xmlSchemaAddWildcard: * @ctxt: a schema validation context * @schema: a schema * * Adds a wildcard. * It corresponds to a xsd:anyAttribute and xsd:any. * * Returns the new struture or NULL in case of error */ static xmlSchemaWildcardPtr xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlSchemaTypeType type, xmlNodePtr node) { xmlSchemaWildcardPtr ret = NULL; if ((ctxt == NULL) || (schema == NULL)) return (NULL); ret = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); if (ret == NULL) { xmlSchemaPErrMemory(ctxt, "adding wildcard", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaWildcard)); ret->type = type; ret->node = node; WXS_ADD_LOCAL(ctxt, ret); return (ret); } static void xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr group) { if (group == NULL) return; if (group->members != NULL) xmlSchemaItemListFree(group->members); xmlFree(group); } static xmlSchemaSubstGroupPtr xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt, xmlSchemaElementPtr head) { xmlSchemaSubstGroupPtr ret; /* Init subst group hash. */ if (WXS_SUBST_GROUPS(pctxt) == NULL) { WXS_SUBST_GROUPS(pctxt) = xmlHashCreateDict(10, pctxt->dict); if (WXS_SUBST_GROUPS(pctxt) == NULL) return(NULL); } /* Create a new substitution group. */ ret = (xmlSchemaSubstGroupPtr) xmlMalloc(sizeof(xmlSchemaSubstGroup)); if (ret == NULL) { xmlSchemaPErrMemory(NULL, "allocating a substitution group container", NULL); return(NULL); } memset(ret, 0, sizeof(xmlSchemaSubstGroup)); ret->head = head; /* Create list of members. */ ret->members = xmlSchemaItemListCreate(); if (ret->members == NULL) { xmlSchemaSubstGroupFree(ret); return(NULL); } /* Add subst group to hash. */ if (xmlHashAddEntry2(WXS_SUBST_GROUPS(pctxt), head->name, head->targetNamespace, ret) != 0) { PERROR_INT("xmlSchemaSubstGroupAdd", "failed to add a new substitution container"); xmlSchemaSubstGroupFree(ret); return(NULL); } return(ret); } static xmlSchemaSubstGroupPtr xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt, xmlSchemaElementPtr head) { if (WXS_SUBST_GROUPS(pctxt) == NULL) return(NULL); return(xmlHashLookup2(WXS_SUBST_GROUPS(pctxt), head->name, head->targetNamespace)); } /** * xmlSchemaAddElementSubstitutionMember: * @pctxt: a schema parser context * @head: the head of the substitution group * @member: the new member of the substitution group * * Allocate a new annotation structure. * * Returns the newly allocated structure or NULL in case or error */ static int xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt, xmlSchemaElementPtr head, xmlSchemaElementPtr member) { xmlSchemaSubstGroupPtr substGroup = NULL; if ((pctxt == NULL) || (head == NULL) || (member == NULL)) return (-1); substGroup = xmlSchemaSubstGroupGet(pctxt, head); if (substGroup == NULL) substGroup = xmlSchemaSubstGroupAdd(pctxt, head); if (substGroup == NULL) return(-1); if (xmlSchemaItemListAdd(substGroup->members, member) == -1) return(-1); return(0); } /************************************************************************ * * * Utilities for parsing * * * ************************************************************************/ /** * xmlSchemaPValAttrNodeQNameValue: * @ctxt: a schema parser context * @schema: the schema context * @ownerDes: the designation of the parent element * @ownerItem: the parent as a schema object * @value: the QName value * @local: the resulting local part if found, the attribute value otherwise * @uri: the resulting namespace URI if found * * Extracts the local name and the URI of a QName value and validates it. * This one is intended to be used on attribute values that * should resolve to schema components. * * Returns 0, in case the QName is valid, a positive error code * if not valid and -1 if an internal error occurs. */ static int xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlSchemaBasicItemPtr ownerItem, xmlAttrPtr attr, const xmlChar *value, const xmlChar **uri, const xmlChar **local) { const xmlChar *pref; xmlNsPtr ns; int len, ret; *uri = NULL; *local = NULL; ret = xmlValidateQName(value, 1); if (ret > 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, ownerItem, (xmlNodePtr) attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value, NULL, NULL, NULL); *local = value; return (ctxt->err); } else if (ret < 0) return (-1); if (!strchr((char *) value, ':')) { ns = xmlSearchNs(attr->doc, attr->parent, NULL); if (ns) *uri = xmlDictLookup(ctxt->dict, ns->href, -1); else if (schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) { /* TODO: move XML_SCHEMAS_INCLUDING_CONVERT_NS to the * parser context. */ /* * This one takes care of included schemas with no * target namespace. */ *uri = ctxt->targetNamespace; } *local = xmlDictLookup(ctxt->dict, value, -1); return (0); } /* * At this point xmlSplitQName3 has to return a local name. */ *local = xmlSplitQName3(value, &len); *local = xmlDictLookup(ctxt->dict, *local, -1); pref = xmlDictLookup(ctxt->dict, value, len); ns = xmlSearchNs(attr->doc, attr->parent, pref); if (ns == NULL) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, ownerItem, (xmlNodePtr) attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value, "The value '%s' of simple type 'xs:QName' has no " "corresponding namespace declaration in scope", value, NULL); return (ctxt->err); } else { *uri = xmlDictLookup(ctxt->dict, ns->href, -1); } return (0); } /** * xmlSchemaPValAttrNodeQName: * @ctxt: a schema parser context * @schema: the schema context * @ownerDes: the designation of the owner element * @ownerItem: the owner as a schema object * @attr: the attribute node * @local: the resulting local part if found, the attribute value otherwise * @uri: the resulting namespace URI if found * * Extracts and validates the QName of an attribute value. * This one is intended to be used on attribute values that * should resolve to schema components. * * Returns 0, in case the QName is valid, a positive error code * if not valid and -1 if an internal error occurs. */ static int xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlSchemaBasicItemPtr ownerItem, xmlAttrPtr attr, const xmlChar **uri, const xmlChar **local) { const xmlChar *value; value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); return (xmlSchemaPValAttrNodeQNameValue(ctxt, schema, ownerItem, attr, value, uri, local)); } /** * xmlSchemaPValAttrQName: * @ctxt: a schema parser context * @schema: the schema context * @ownerDes: the designation of the parent element * @ownerItem: the owner as a schema object * @ownerElem: the parent node of the attribute * @name: the name of the attribute * @local: the resulting local part if found, the attribute value otherwise * @uri: the resulting namespace URI if found * * Extracts and validates the QName of an attribute value. * * Returns 0, in case the QName is valid, a positive error code * if not valid and -1 if an internal error occurs. */ static int xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlSchemaBasicItemPtr ownerItem, xmlNodePtr ownerElem, const char *name, const xmlChar **uri, const xmlChar **local) { xmlAttrPtr attr; attr = xmlSchemaGetPropNode(ownerElem, name); if (attr == NULL) { *local = NULL; *uri = NULL; return (0); } return (xmlSchemaPValAttrNodeQName(ctxt, schema, ownerItem, attr, uri, local)); } /** * xmlSchemaPValAttrID: * @ctxt: a schema parser context * @schema: the schema context * @ownerDes: the designation of the parent element * @ownerItem: the owner as a schema object * @ownerElem: the parent node of the attribute * @name: the name of the attribute * * Extracts and validates the ID of an attribute value. * * Returns 0, in case the ID is valid, a positive error code * if not valid and -1 if an internal error occurs. */ static int xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr) { int ret; const xmlChar *value; if (attr == NULL) return(0); value = xmlSchemaGetNodeContentNoDict((xmlNodePtr) attr); ret = xmlValidateNCName(value, 1); if (ret == 0) { /* * NOTE: the IDness might have already be declared in the DTD */ if (attr->atype != XML_ATTRIBUTE_ID) { xmlIDPtr res; xmlChar *strip; /* * TODO: Use xmlSchemaStrip here; it's not exported at this * moment. */ strip = xmlSchemaCollapseString(value); if (strip != NULL) { xmlFree((xmlChar *) value); value = strip; } res = xmlAddID(NULL, attr->doc, value, attr); if (res == NULL) { ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_ID), NULL, NULL, "Duplicate value '%s' of simple " "type 'xs:ID'", value, NULL); } else attr->atype = XML_ATTRIBUTE_ID; } } else if (ret > 0) { ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_ID), NULL, NULL, "The value '%s' of simple type 'xs:ID' is " "not a valid 'xs:NCName'", value, NULL); } if (value != NULL) xmlFree((xmlChar *)value); return (ret); } static int xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr ownerElem, const xmlChar *name) { xmlAttrPtr attr; attr = xmlSchemaGetPropNode(ownerElem, (const char *) name); if (attr == NULL) return(0); return(xmlSchemaPValAttrNodeID(ctxt, attr)); } /** * xmlGetMaxOccurs: * @ctxt: a schema validation context * @node: a subtree containing XML Schema informations * * Get the maxOccurs property * * Returns the default if not found, or the value */ static int xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int min, int max, int def, const char *expected) { const xmlChar *val, *cur; int ret = 0; xmlAttrPtr attr; attr = xmlSchemaGetPropNode(node, "maxOccurs"); if (attr == NULL) return (def); val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (xmlStrEqual(val, (const xmlChar *) "unbounded")) { if (max != UNBOUNDED) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* XML_SCHEMAP_INVALID_MINOCCURS, */ NULL, (xmlNodePtr) attr, NULL, expected, val, NULL, NULL, NULL); return (def); } else return (UNBOUNDED); /* encoding it with -1 might be another option */ } cur = val; while (IS_BLANK_CH(*cur)) cur++; if (*cur == 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* XML_SCHEMAP_INVALID_MINOCCURS, */ NULL, (xmlNodePtr) attr, NULL, expected, val, NULL, NULL, NULL); return (def); } while ((*cur >= '0') && (*cur <= '9')) { ret = ret * 10 + (*cur - '0'); cur++; } while (IS_BLANK_CH(*cur)) cur++; /* * TODO: Restrict the maximal value to Integer. */ if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* XML_SCHEMAP_INVALID_MINOCCURS, */ NULL, (xmlNodePtr) attr, NULL, expected, val, NULL, NULL, NULL); return (def); } return (ret); } /** * xmlGetMinOccurs: * @ctxt: a schema validation context * @node: a subtree containing XML Schema informations * * Get the minOccurs property * * Returns the default if not found, or the value */ static int xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int min, int max, int def, const char *expected) { const xmlChar *val, *cur; int ret = 0; xmlAttrPtr attr; attr = xmlSchemaGetPropNode(node, "minOccurs"); if (attr == NULL) return (def); val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); cur = val; while (IS_BLANK_CH(*cur)) cur++; if (*cur == 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* XML_SCHEMAP_INVALID_MINOCCURS, */ NULL, (xmlNodePtr) attr, NULL, expected, val, NULL, NULL, NULL); return (def); } while ((*cur >= '0') && (*cur <= '9')) { ret = ret * 10 + (*cur - '0'); cur++; } while (IS_BLANK_CH(*cur)) cur++; /* * TODO: Restrict the maximal value to Integer. */ if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* XML_SCHEMAP_INVALID_MINOCCURS, */ NULL, (xmlNodePtr) attr, NULL, expected, val, NULL, NULL, NULL); return (def); } return (ret); } /** * xmlSchemaPGetBoolNodeValue: * @ctxt: a schema validation context * @ownerDes: owner designation * @ownerItem: the owner as a schema item * @node: the node holding the value * * Converts a boolean string value into 1 or 0. * * Returns 0 or 1. */ static int xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt, xmlSchemaBasicItemPtr ownerItem, xmlNodePtr node) { xmlChar *value = NULL; int res = 0; value = xmlNodeGetContent(node); /* * 3.2.2.1 Lexical representation * An instance of a datatype that is defined as �boolean� * can have the following legal literals {true, false, 1, 0}. */ if (xmlStrEqual(BAD_CAST value, BAD_CAST "true")) res = 1; else if (xmlStrEqual(BAD_CAST value, BAD_CAST "false")) res = 0; else if (xmlStrEqual(BAD_CAST value, BAD_CAST "1")) res = 1; else if (xmlStrEqual(BAD_CAST value, BAD_CAST "0")) res = 0; else { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_INVALID_BOOLEAN, ownerItem, node, xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), NULL, BAD_CAST value, NULL, NULL, NULL); } if (value != NULL) xmlFree(value); return (res); } /** * xmlGetBooleanProp: * @ctxt: a schema validation context * @node: a subtree containing XML Schema informations * @name: the attribute name * @def: the default value * * Evaluate if a boolean property is set * * Returns the default if not found, 0 if found to be false, * 1 if found to be true */ static int xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, const char *name, int def) { const xmlChar *val; val = xmlSchemaGetProp(ctxt, node, name); if (val == NULL) return (def); /* * 3.2.2.1 Lexical representation * An instance of a datatype that is defined as �boolean� * can have the following legal literals {true, false, 1, 0}. */ if (xmlStrEqual(val, BAD_CAST "true")) def = 1; else if (xmlStrEqual(val, BAD_CAST "false")) def = 0; else if (xmlStrEqual(val, BAD_CAST "1")) def = 1; else if (xmlStrEqual(val, BAD_CAST "0")) def = 0; else { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_INVALID_BOOLEAN, NULL, (xmlNodePtr) xmlSchemaGetPropNode(node, name), xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), NULL, val, NULL, NULL, NULL); } return (def); } /************************************************************************ * * * Shema extraction from an Infoset * * * ************************************************************************/ static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, int topLevel); static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, int topLevel); static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaTypeType parentType); static xmlSchemaBasicItemPtr xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaItemListPtr uses, int parentType); static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node); static xmlSchemaWildcardPtr xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node); /** * xmlSchemaPValAttrNodeValue: * * @ctxt: a schema parser context * @ownerDes: the designation of the parent element * @ownerItem: the schema object owner if existent * @attr: the schema attribute node being validated * @value: the value * @type: the built-in type to be validated against * * Validates a value against the given built-in type. * This one is intended to be used internally for validation * of schema attribute values during parsing of the schema. * * Returns 0 if the value is valid, a positive error code * number otherwise and -1 in case of an internal or API error. */ static int xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt, xmlSchemaBasicItemPtr ownerItem, xmlAttrPtr attr, const xmlChar *value, xmlSchemaTypePtr type) { int ret = 0; /* * NOTE: Should we move this to xmlschematypes.c? Hmm, but this * one is really meant to be used internally, so better not. */ if ((pctxt == NULL) || (type == NULL) || (attr == NULL)) return (-1); if (type->type != XML_SCHEMA_TYPE_BASIC) { PERROR_INT("xmlSchemaPValAttrNodeValue", "the given type is not a built-in type"); return (-1); } switch (type->builtInType) { case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_QNAME: case XML_SCHEMAS_ANYURI: case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: ret = xmlSchemaValPredefTypeNode(type, value, NULL, (xmlNodePtr) attr); break; default: { PERROR_INT("xmlSchemaPValAttrNodeValue", "validation using the given type is not supported while " "parsing a schema"); return (-1); } } /* * TODO: Should we use the S4S error codes instead? */ if (ret < 0) { PERROR_INT("xmlSchemaPValAttrNodeValue", "failed to validate a schema attribute value"); return (-1); } else if (ret > 0) { if (WXS_IS_LIST(type)) ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; else ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; xmlSchemaPSimpleTypeErr(pctxt, ret, ownerItem, (xmlNodePtr) attr, type, NULL, value, NULL, NULL, NULL); } return (ret); } /** * xmlSchemaPValAttrNode: * * @ctxt: a schema parser context * @ownerDes: the designation of the parent element * @ownerItem: the schema object owner if existent * @attr: the schema attribute node being validated * @type: the built-in type to be validated against * @value: the resulting value if any * * Extracts and validates a value against the given built-in type. * This one is intended to be used internally for validation * of schema attribute values during parsing of the schema. * * Returns 0 if the value is valid, a positive error code * number otherwise and -1 in case of an internal or API error. */ static int xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt, xmlSchemaBasicItemPtr ownerItem, xmlAttrPtr attr, xmlSchemaTypePtr type, const xmlChar **value) { const xmlChar *val; if ((ctxt == NULL) || (type == NULL) || (attr == NULL)) return (-1); val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (value != NULL) *value = val; return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem, attr, val, type)); } /** * xmlSchemaPValAttr: * * @ctxt: a schema parser context * @node: the element node of the attribute * @ownerDes: the designation of the parent element * @ownerItem: the schema object owner if existent * @ownerElem: the owner element node * @name: the name of the schema attribute node * @type: the built-in type to be validated against * @value: the resulting value if any * * Extracts and validates a value against the given built-in type. * This one is intended to be used internally for validation * of schema attribute values during parsing of the schema. * * Returns 0 if the value is valid, a positive error code * number otherwise and -1 in case of an internal or API error. */ static int xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt, xmlSchemaBasicItemPtr ownerItem, xmlNodePtr ownerElem, const char *name, xmlSchemaTypePtr type, const xmlChar **value) { xmlAttrPtr attr; if ((ctxt == NULL) || (type == NULL)) { if (value != NULL) *value = NULL; return (-1); } if (type->type != XML_SCHEMA_TYPE_BASIC) { if (value != NULL) *value = NULL; xmlSchemaPErr(ctxt, ownerElem, XML_SCHEMAP_INTERNAL, "Internal error: xmlSchemaPValAttr, the given " "type '%s' is not a built-in type.\n", type->name, NULL); return (-1); } attr = xmlSchemaGetPropNode(ownerElem, name); if (attr == NULL) { if (value != NULL) *value = NULL; return (0); } return (xmlSchemaPValAttrNode(ctxt, ownerItem, attr, type, value)); } static int xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema ATTRIBUTE_UNUSED, xmlNodePtr node, xmlAttrPtr attr, const xmlChar *namespaceName) { /* TODO: Pointer comparison instead? */ if (xmlStrEqual(pctxt->targetNamespace, namespaceName)) return (0); if (xmlStrEqual(xmlSchemaNs, namespaceName)) return (0); /* * Check if the referenced namespace was ed. */ if (WXS_BUCKET(pctxt)->relations != NULL) { xmlSchemaSchemaRelationPtr rel; rel = WXS_BUCKET(pctxt)->relations; do { if (WXS_IS_BUCKET_IMPMAIN(rel->type) && xmlStrEqual(namespaceName, rel->importNamespace)) return (0); rel = rel->next; } while (rel != NULL); } /* * No matching ed namespace found. */ { xmlNodePtr n = (attr != NULL) ? (xmlNodePtr) attr : node; if (namespaceName == NULL) xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_SRC_RESOLVE, n, NULL, "References from this schema to components in no " "namespace are not allowed, since not indicated by an " "import statement", NULL, NULL); else xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_SRC_RESOLVE, n, NULL, "References from this schema to components in the " "namespace '%s' are not allowed, since not indicated by an " "import statement", namespaceName, NULL); } return (XML_SCHEMAP_SRC_RESOLVE); } /** * xmlSchemaParseLocalAttributes: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * @type: the hosting type where the attributes will be anchored * * Parses attribute uses and attribute declarations and * attribute group references. */ static int xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr *child, xmlSchemaItemListPtr *list, int parentType, int *hasRefs) { void *item; while ((IS_SCHEMA((*child), "attribute")) || (IS_SCHEMA((*child), "attributeGroup"))) { if (IS_SCHEMA((*child), "attribute")) { item = xmlSchemaParseLocalAttribute(ctxt, schema, *child, *list, parentType); } else { item = xmlSchemaParseAttributeGroupRef(ctxt, schema, *child); if ((item != NULL) && (hasRefs != NULL)) *hasRefs = 1; } if (item != NULL) { if (*list == NULL) { /* TODO: Customize grow factor. */ *list = xmlSchemaItemListCreate(); if (*list == NULL) return(-1); } if (xmlSchemaItemListAddSize(*list, 2, item) == -1) return(-1); } *child = (*child)->next; } return (0); } /** * xmlSchemaParseAnnotation: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Attrribute declaration * *WARNING* this interface is highly subject to change * * Returns -1 in case of error, 0 if the declaration is improper and * 1 in case of success. */ static xmlSchemaAnnotPtr xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int needed) { xmlSchemaAnnotPtr ret; xmlNodePtr child = NULL; xmlAttrPtr attr; int barked = 0; /* * INFO: S4S completed. */ /* * id = ID * {any attributes with non-schema namespace . . .}> * Content: (appinfo | documentation)* */ if ((ctxt == NULL) || (node == NULL)) return (NULL); if (needed) ret = xmlSchemaNewAnnot(ctxt, node); else ret = NULL; attr = node->properties; while (attr != NULL) { if (((attr->ns == NULL) && (!xmlStrEqual(attr->name, BAD_CAST "id"))) || ((attr->ns != NULL) && xmlStrEqual(attr->ns->href, xmlSchemaNs))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * And now for the children... */ child = node->children; while (child != NULL) { if (IS_SCHEMA(child, "appinfo")) { /* TODO: make available the content of "appinfo". */ /* * source = anyURI * {any attributes with non-schema namespace . . .}> * Content: ({any})* */ attr = child->properties; while (attr != NULL) { if (((attr->ns == NULL) && (!xmlStrEqual(attr->name, BAD_CAST "source"))) || ((attr->ns != NULL) && xmlStrEqual(attr->ns->href, xmlSchemaNs))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttr(ctxt, NULL, child, "source", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL); child = child->next; } else if (IS_SCHEMA(child, "documentation")) { /* TODO: make available the content of "documentation". */ /* * source = anyURI * {any attributes with non-schema namespace . . .}> * Content: ({any})* */ attr = child->properties; while (attr != NULL) { if (attr->ns == NULL) { if (!xmlStrEqual(attr->name, BAD_CAST "source")) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else { if (xmlStrEqual(attr->ns->href, xmlSchemaNs) || (xmlStrEqual(attr->name, BAD_CAST "lang") && (!xmlStrEqual(attr->ns->href, XML_XML_NAMESPACE)))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } attr = attr->next; } /* * Attribute "xml:lang". */ attr = xmlSchemaGetPropNodeNs(child, (const char *) XML_XML_NAMESPACE, "lang"); if (attr != NULL) xmlSchemaPValAttrNode(ctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE), NULL); child = child->next; } else { if (!barked) xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(appinfo | documentation)*"); barked = 1; child = child->next; } } return (ret); } /** * xmlSchemaParseFacet: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Facet declaration * *WARNING* this interface is highly subject to change * * Returns the new type structure or NULL in case of error */ static xmlSchemaFacetPtr xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaFacetPtr facet; xmlNodePtr child = NULL; const xmlChar *value; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); facet = xmlSchemaNewFacet(); if (facet == NULL) { xmlSchemaPErrMemory(ctxt, "allocating facet", node); return (NULL); } facet->node = node; value = xmlSchemaGetProp(ctxt, node, "value"); if (value == NULL) { xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE, "Facet %s has no value\n", node->name, NULL); xmlSchemaFreeFacet(facet); return (NULL); } if (IS_SCHEMA(node, "minInclusive")) { facet->type = XML_SCHEMA_FACET_MININCLUSIVE; } else if (IS_SCHEMA(node, "minExclusive")) { facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE; } else if (IS_SCHEMA(node, "maxInclusive")) { facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE; } else if (IS_SCHEMA(node, "maxExclusive")) { facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE; } else if (IS_SCHEMA(node, "totalDigits")) { facet->type = XML_SCHEMA_FACET_TOTALDIGITS; } else if (IS_SCHEMA(node, "fractionDigits")) { facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS; } else if (IS_SCHEMA(node, "pattern")) { facet->type = XML_SCHEMA_FACET_PATTERN; } else if (IS_SCHEMA(node, "enumeration")) { facet->type = XML_SCHEMA_FACET_ENUMERATION; } else if (IS_SCHEMA(node, "whiteSpace")) { facet->type = XML_SCHEMA_FACET_WHITESPACE; } else if (IS_SCHEMA(node, "length")) { facet->type = XML_SCHEMA_FACET_LENGTH; } else if (IS_SCHEMA(node, "maxLength")) { facet->type = XML_SCHEMA_FACET_MAXLENGTH; } else if (IS_SCHEMA(node, "minLength")) { facet->type = XML_SCHEMA_FACET_MINLENGTH; } else { xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_TYPE, "Unknown facet type %s\n", node->name, NULL); xmlSchemaFreeFacet(facet); return (NULL); } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); facet->value = value; if ((facet->type != XML_SCHEMA_FACET_PATTERN) && (facet->type != XML_SCHEMA_FACET_ENUMERATION)) { const xmlChar *fixed; fixed = xmlSchemaGetProp(ctxt, node, "fixed"); if (fixed != NULL) { if (xmlStrEqual(fixed, BAD_CAST "true")) facet->fixed = 1; } } child = node->children; if (IS_SCHEMA(child, "annotation")) { facet->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (child != NULL) { xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_CHILD, "Facet %s has unexpected child content\n", node->name, NULL); } return (facet); } /** * xmlSchemaParseWildcardNs: * @ctxt: a schema parser context * @wildc: the wildcard, already created * @node: a subtree containing XML Schema informations * * Parses the attribute "processContents" and "namespace" * of a xsd:anyAttribute and xsd:any. * *WARNING* this interface is highly subject to change * * Returns 0 if everything goes fine, a positive error code * if something is not valid and -1 if an internal error occurs. */ static int xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema ATTRIBUTE_UNUSED, xmlSchemaWildcardPtr wildc, xmlNodePtr node) { const xmlChar *pc, *ns, *dictnsItem; int ret = 0; xmlChar *nsItem; xmlSchemaWildcardNsPtr tmp, lastNs = NULL; xmlAttrPtr attr; pc = xmlSchemaGetProp(ctxt, node, "processContents"); if ((pc == NULL) || (xmlStrEqual(pc, (const xmlChar *) "strict"))) { wildc->processContents = XML_SCHEMAS_ANY_STRICT; } else if (xmlStrEqual(pc, (const xmlChar *) "skip")) { wildc->processContents = XML_SCHEMAS_ANY_SKIP; } else if (xmlStrEqual(pc, (const xmlChar *) "lax")) { wildc->processContents = XML_SCHEMAS_ANY_LAX; } else { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, node, NULL, "(strict | skip | lax)", pc, NULL, NULL, NULL); wildc->processContents = XML_SCHEMAS_ANY_STRICT; ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; } /* * Build the namespace constraints. */ attr = xmlSchemaGetPropNode(node, "namespace"); ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if ((attr == NULL) || (xmlStrEqual(ns, BAD_CAST "##any"))) wildc->any = 1; else if (xmlStrEqual(ns, BAD_CAST "##other")) { wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); if (wildc->negNsSet == NULL) { return (-1); } wildc->negNsSet->value = ctxt->targetNamespace; } else { const xmlChar *end, *cur; cur = ns; do { while (IS_BLANK_CH(*cur)) cur++; end = cur; while ((*end != 0) && (!(IS_BLANK_CH(*end)))) end++; if (end == cur) break; nsItem = xmlStrndup(cur, end - cur); if ((xmlStrEqual(nsItem, BAD_CAST "##other")) || (xmlStrEqual(nsItem, BAD_CAST "##any"))) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER, NULL, (xmlNodePtr) attr, NULL, "((##any | ##other) | List of (xs:anyURI | " "(##targetNamespace | ##local)))", nsItem, NULL, NULL, NULL); ret = XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER; } else { if (xmlStrEqual(nsItem, BAD_CAST "##targetNamespace")) { dictnsItem = ctxt->targetNamespace; } else if (xmlStrEqual(nsItem, BAD_CAST "##local")) { dictnsItem = NULL; } else { /* * Validate the item (anyURI). */ xmlSchemaPValAttrNodeValue(ctxt, NULL, attr, nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI)); dictnsItem = xmlDictLookup(ctxt->dict, nsItem, -1); } /* * Avoid dublicate namespaces. */ tmp = wildc->nsSet; while (tmp != NULL) { if (dictnsItem == tmp->value) break; tmp = tmp->next; } if (tmp == NULL) { tmp = xmlSchemaNewWildcardNsConstraint(ctxt); if (tmp == NULL) { xmlFree(nsItem); return (-1); } tmp->value = dictnsItem; tmp->next = NULL; if (wildc->nsSet == NULL) wildc->nsSet = tmp; else if (lastNs != NULL) lastNs->next = tmp; lastNs = tmp; } } xmlFree(nsItem); cur = end; } while (*cur != 0); } return (ret); } static int xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr item ATTRIBUTE_UNUSED, xmlNodePtr node, int minOccurs, int maxOccurs) { if ((maxOccurs == 0) && ( minOccurs == 0)) return (0); if (maxOccurs != UNBOUNDED) { /* * TODO: Maybe we should better not create the particle, * if min/max is invalid, since it could confuse the build of the * content model. */ /* * 3.9.6 Schema Component Constraint: Particle Correct * */ if (maxOccurs < 1) { /* * 2.2 {max occurs} must be greater than or equal to 1. */ xmlSchemaPCustomAttrErr(ctxt, XML_SCHEMAP_P_PROPS_CORRECT_2_2, NULL, NULL, xmlSchemaGetPropNode(node, "maxOccurs"), "The value must be greater than or equal to 1"); return (XML_SCHEMAP_P_PROPS_CORRECT_2_2); } else if (minOccurs > maxOccurs) { /* * 2.1 {min occurs} must not be greater than {max occurs}. */ xmlSchemaPCustomAttrErr(ctxt, XML_SCHEMAP_P_PROPS_CORRECT_2_1, NULL, NULL, xmlSchemaGetPropNode(node, "minOccurs"), "The value must not be greater than the value of 'maxOccurs'"); return (XML_SCHEMAP_P_PROPS_CORRECT_2_1); } } return (0); } /** * xmlSchemaParseAny: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * Parsea a XML schema element. A particle and wildcard * will be created (except if minOccurs==maxOccurs==0, in this case * nothing will be created). * *WARNING* this interface is highly subject to change * * Returns the particle or NULL in case of error or if minOccurs==maxOccurs==0 */ static xmlSchemaParticlePtr xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaParticlePtr particle; xmlNodePtr child = NULL; xmlSchemaWildcardPtr wild; int min, max; xmlAttrPtr attr; xmlSchemaAnnotPtr annot = NULL; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * minOccurs/maxOccurs. */ max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)"); min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); /* * Create & parse the wildcard. */ wild = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY, node); if (wild == NULL) return (NULL); xmlSchemaParseWildcardNs(ctxt, schema, wild, node); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } /* * No component if minOccurs==maxOccurs==0. */ if ((min == 0) && (max == 0)) { /* Don't free the wildcard, since it's already on the list. */ return (NULL); } /* * Create the particle. */ particle = xmlSchemaAddParticle(ctxt, node, min, max); if (particle == NULL) return (NULL); particle->annot = annot; particle->children = (xmlSchemaTreeItemPtr) wild; return (particle); } /** * xmlSchemaParseNotation: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Notation declaration * * Returns the new structure or NULL in case of error */ static xmlSchemaNotationPtr xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { const xmlChar *name; xmlSchemaNotationPtr ret; xmlNodePtr child = NULL; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); name = xmlSchemaGetProp(ctxt, node, "name"); if (name == NULL) { xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME, "Notation has no name\n", NULL, NULL); return (NULL); } ret = xmlSchemaAddNotation(ctxt, schema, name, ctxt->targetNamespace, node); if (ret == NULL) return (NULL); xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); child = node->children; if (IS_SCHEMA(child, "annotation")) { ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } return (ret); } /** * xmlSchemaParseAnyAttribute: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema AnyAttrribute declaration * *WARNING* this interface is highly subject to change * * Returns a wildcard or NULL. */ static xmlSchemaWildcardPtr xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaWildcardPtr ret; xmlNodePtr child = NULL; xmlAttrPtr attr; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); ret = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE, node); if (ret == NULL) { return (NULL); } /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * Parse the namespace list. */ if (xmlSchemaParseWildcardNs(ctxt, schema, ret, node) != 0) return (NULL); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } return (ret); } /** * xmlSchemaParseAttribute: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Attrribute declaration * *WARNING* this interface is highly subject to change * * Returns the attribute declaration. */ static xmlSchemaBasicItemPtr xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaItemListPtr uses, int parentType) { const xmlChar *attrValue, *name = NULL, *ns = NULL; xmlSchemaAttributeUsePtr use = NULL; xmlNodePtr child = NULL; xmlAttrPtr attr; const xmlChar *tmpNs = NULL, *tmpName = NULL, *defValue = NULL; int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL; int nberrors, hasForm = 0, defValueType = 0; #define WXS_ATTR_DEF_VAL_DEFAULT 1 #define WXS_ATTR_DEF_VAL_FIXED 2 /* * 3.2.3 Constraints on XML Representations of Attribute Declarations */ if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); attr = xmlSchemaGetPropNode(node, "ref"); if (attr != NULL) { if (xmlSchemaPValAttrNodeQName(pctxt, schema, NULL, attr, &tmpNs, &tmpName) != 0) { return (NULL); } if (xmlSchemaCheckReference(pctxt, schema, node, attr, tmpNs) != 0) return(NULL); isRef = 1; } nberrors = pctxt->nberrors; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if (isRef) { if (xmlStrEqual(attr->name, BAD_CAST "id")) { xmlSchemaPValAttrNodeID(pctxt, attr); goto attr_next; } else if (xmlStrEqual(attr->name, BAD_CAST "ref")) { goto attr_next; } } else { if (xmlStrEqual(attr->name, BAD_CAST "name")) { goto attr_next; } else if (xmlStrEqual(attr->name, BAD_CAST "id")) { xmlSchemaPValAttrNodeID(pctxt, attr); goto attr_next; } else if (xmlStrEqual(attr->name, BAD_CAST "type")) { xmlSchemaPValAttrNodeQName(pctxt, schema, NULL, attr, &tmpNs, &tmpName); goto attr_next; } else if (xmlStrEqual(attr->name, BAD_CAST "form")) { /* * Evaluate the target namespace */ hasForm = 1; attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); if (xmlStrEqual(attrValue, BAD_CAST "qualified")) { ns = pctxt->targetNamespace; } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) { xmlSchemaPSimpleTypeErr(pctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(qualified | unqualified)", attrValue, NULL, NULL, NULL); } goto attr_next; } } if (xmlStrEqual(attr->name, BAD_CAST "use")) { attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); /* TODO: Maybe we need to normalize the value beforehand. */ if (xmlStrEqual(attrValue, BAD_CAST "optional")) occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL; else if (xmlStrEqual(attrValue, BAD_CAST "prohibited")) occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED; else if (xmlStrEqual(attrValue, BAD_CAST "required")) occurs = XML_SCHEMAS_ATTR_USE_REQUIRED; else { xmlSchemaPSimpleTypeErr(pctxt, XML_SCHEMAP_INVALID_ATTR_USE, NULL, (xmlNodePtr) attr, NULL, "(optional | prohibited | required)", attrValue, NULL, NULL, NULL); } goto attr_next; } else if (xmlStrEqual(attr->name, BAD_CAST "default")) { /* * 3.2.3 : 1 * default and fixed must not both be present. */ if (defValue) { xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1, NULL, attr, "default", "fixed"); } else { defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); defValueType = WXS_ATTR_DEF_VAL_DEFAULT; } goto attr_next; } else if (xmlStrEqual(attr->name, BAD_CAST "fixed")) { /* * 3.2.3 : 1 * default and fixed must not both be present. */ if (defValue) { xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1, NULL, attr, "default", "fixed"); } else { defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); defValueType = WXS_ATTR_DEF_VAL_FIXED; } goto attr_next; } } else if (! xmlStrEqual(attr->ns->href, xmlSchemaNs)) goto attr_next; xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); attr_next: attr = attr->next; } /* * 3.2.3 : 2 * If default and use are both present, use must have * the actual value optional. */ if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) && (occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) { xmlSchemaPSimpleTypeErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_2, NULL, node, NULL, "(optional | prohibited | required)", NULL, "The value of the attribute 'use' must be 'optional' " "if the attribute 'default' is present", NULL, NULL); } /* * We want correct attributes. */ if (nberrors != pctxt->nberrors) return(NULL); if (! isRef) { xmlSchemaAttributePtr attrDecl; /* TODO: move XML_SCHEMAS_QUALIF_ATTR to the parser. */ if ((! hasForm) && (schema->flags & XML_SCHEMAS_QUALIF_ATTR)) ns = pctxt->targetNamespace; /* * 3.2.6 Schema Component Constraint: xsi: Not Allowed * TODO: Move this to the component layer. */ if (xmlStrEqual(ns, xmlSchemaInstanceNs)) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NO_XSI, node, NULL, "The target namespace must not match '%s'", xmlSchemaInstanceNs, NULL); } attr = xmlSchemaGetPropNode(node, "name"); if (attr == NULL) { xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } if (xmlSchemaPValAttrNode(pctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { return (NULL); } /* * 3.2.6 Schema Component Constraint: xmlns Not Allowed * TODO: Move this to the component layer. */ if (xmlStrEqual(name, BAD_CAST "xmlns")) { xmlSchemaPSimpleTypeErr(pctxt, XML_SCHEMAP_NO_XMLNS, NULL, (xmlNodePtr) attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL, "The value of the attribute must not match 'xmlns'", NULL, NULL); return (NULL); } if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) goto check_children; /* * Create the attribute use component. */ use = xmlSchemaAddAttributeUse(pctxt, node); if (use == NULL) return(NULL); use->occurs = occurs; /* * Create the attribute declaration. */ attrDecl = xmlSchemaAddAttribute(pctxt, schema, name, ns, node, 0); if (attrDecl == NULL) return (NULL); if (tmpName != NULL) { attrDecl->typeName = tmpName; attrDecl->typeNs = tmpNs; } use->attrDecl = attrDecl; /* * Value constraint. */ if (defValue != NULL) { attrDecl->defValue = defValue; if (defValueType == WXS_ATTR_DEF_VAL_FIXED) attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED; } } else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) { xmlSchemaQNameRefPtr ref; /* * Create the attribute use component. */ use = xmlSchemaAddAttributeUse(pctxt, node); if (use == NULL) return(NULL); /* * We need to resolve the reference at later stage. */ WXS_ADD_PENDING(pctxt, use); use->occurs = occurs; /* * Create a QName reference to the attribute declaration. */ ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE, tmpName, tmpNs); if (ref == NULL) return(NULL); /* * Assign the reference. This will be substituted for the * referenced attribute declaration when the QName is resolved. */ use->attrDecl = WXS_ATTR_CAST ref; /* * Value constraint. */ if (defValue != NULL) use->defValue = defValue; if (defValueType == WXS_ATTR_DEF_VAL_FIXED) use->flags |= XML_SCHEMA_ATTR_USE_FIXED; } check_children: /* * And now for the children... */ child = node->children; if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) { xmlSchemaAttributeUseProhibPtr prohib; if (IS_SCHEMA(child, "annotation")) { xmlSchemaParseAnnotation(pctxt, child, 0); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } /* * Check for pointlessness of attribute prohibitions. */ if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) { xmlSchemaCustomWarning(ACTXT_CAST pctxt, XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, node, NULL, "Skipping attribute use prohibition, since it is " "pointless inside an ", NULL, NULL, NULL); return(NULL); } else if (parentType == XML_SCHEMA_TYPE_EXTENSION) { xmlSchemaCustomWarning(ACTXT_CAST pctxt, XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, node, NULL, "Skipping attribute use prohibition, since it is " "pointless when extending a type", NULL, NULL, NULL); return(NULL); } if (! isRef) { tmpName = name; tmpNs = ns; } /* * Check for duplicate attribute prohibitions. */ if (uses) { int i; for (i = 0; i < uses->nbItems; i++) { use = uses->items[i]; if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) && (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) && (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace)) { xmlChar *str = NULL; xmlSchemaCustomWarning(ACTXT_CAST pctxt, XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, node, NULL, "Skipping duplicate attribute use prohibition '%s'", xmlSchemaFormatQName(&str, tmpNs, tmpName), NULL, NULL); FREE_AND_NULL(str) return(NULL); } } } /* * Create the attribute prohibition helper component. */ prohib = xmlSchemaAddAttributeUseProhib(pctxt); if (prohib == NULL) return(NULL); prohib->node = node; prohib->name = tmpName; prohib->targetNamespace = tmpNs; if (isRef) { /* * We need at least to resolve to the attribute declaration. */ WXS_ADD_PENDING(pctxt, prohib); } return(WXS_BASIC_CAST prohib); } else { if (IS_SCHEMA(child, "annotation")) { /* * TODO: Should this go into the attr decl? */ use->annot = xmlSchemaParseAnnotation(pctxt, child, 1); child = child->next; } if (isRef) { if (child != NULL) { if (IS_SCHEMA(child, "simpleType")) /* * 3.2.3 : 3.2 * If ref is present, then all of , * form and type must be absent. */ xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_3_2, NULL, node, child, NULL, "(annotation?)"); else xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } } else { if (IS_SCHEMA(child, "simpleType")) { if (WXS_ATTRUSE_DECL(use)->typeName != NULL) { /* * 3.2.3 : 4 * type and must not both be present. */ xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4, NULL, node, child, "The attribute 'type' and the child " "are mutually exclusive", NULL); } else WXS_ATTRUSE_TYPEDEF(use) = xmlSchemaParseSimpleType(pctxt, schema, child, 0); child = child->next; } if (child != NULL) xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, simpleType?)"); } } return (WXS_BASIC_CAST use); } static xmlSchemaAttributePtr xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node) { const xmlChar *attrValue; xmlSchemaAttributePtr ret; xmlNodePtr child = NULL; xmlAttrPtr attr; /* * Note that the w3c spec assumes the schema to be validated with schema * for schemas beforehand. * * 3.2.3 Constraints on XML Representations of Attribute Declarations */ if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); /* * 3.2.3 : 3.1 * One of ref or name must be present, but not both */ attr = xmlSchemaGetPropNode(node, "name"); if (attr == NULL) { xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } if (xmlSchemaPValAttrNode(pctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) { return (NULL); } /* * 3.2.6 Schema Component Constraint: xmlns Not Allowed * TODO: Move this to the component layer. */ if (xmlStrEqual(attrValue, BAD_CAST "xmlns")) { xmlSchemaPSimpleTypeErr(pctxt, XML_SCHEMAP_NO_XMLNS, NULL, (xmlNodePtr) attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL, "The value of the attribute must not match 'xmlns'", NULL, NULL); return (NULL); } /* * 3.2.6 Schema Component Constraint: xsi: Not Allowed * TODO: Move this to the component layer. * Or better leave it here and add it to the component layer * if we have a schema construction API. */ if (xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NO_XSI, node, NULL, "The target namespace must not match '%s'", xmlSchemaInstanceNs, NULL); } ret = xmlSchemaAddAttribute(pctxt, schema, attrValue, pctxt->targetNamespace, node, 1); if (ret == NULL) return (NULL); ret->flags |= XML_SCHEMAS_ATTR_GLOBAL; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "default")) && (!xmlStrEqual(attr->name, BAD_CAST "fixed")) && (!xmlStrEqual(attr->name, BAD_CAST "name")) && (!xmlStrEqual(attr->name, BAD_CAST "type"))) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrQName(pctxt, schema, NULL, node, "type", &ret->typeNs, &ret->typeName); xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); /* * Attribute "fixed". */ ret->defValue = xmlSchemaGetProp(pctxt, node, "fixed"); if (ret->defValue != NULL) ret->flags |= XML_SCHEMAS_ATTR_FIXED; /* * Attribute "default". */ attr = xmlSchemaGetPropNode(node, "default"); if (attr != NULL) { /* * 3.2.3 : 1 * default and fixed must not both be present. */ if (ret->flags & XML_SCHEMAS_ATTR_FIXED) { xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1, WXS_BASIC_CAST ret, attr, "default", "fixed"); } else ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); } /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1); child = child->next; } if (IS_SCHEMA(child, "simpleType")) { if (ret->typeName != NULL) { /* * 3.2.3 : 4 * type and must not both be present. */ xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4, NULL, node, child, "The attribute 'type' and the child " "are mutually exclusive", NULL); } else ret->subtypes = xmlSchemaParseSimpleType(pctxt, schema, child, 0); child = child->next; } if (child != NULL) xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, simpleType?)"); return (ret); } /** * xmlSchemaParseAttributeGroupRef: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * Parse an attribute group definition reference. * Note that a reference to an attribute group does not * correspond to any component at all. * *WARNING* this interface is highly subject to change * * Returns the attribute group or NULL in case of error. */ static xmlSchemaQNameRefPtr xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaQNameRefPtr ret; xmlNodePtr child = NULL; xmlAttrPtr attr; const xmlChar *refNs = NULL, *ref = NULL; if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); attr = xmlSchemaGetPropNode(node, "ref"); if (attr == NULL) { xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "ref", NULL); return (NULL); } xmlSchemaPValAttrNodeQName(pctxt, schema, NULL, attr, &refNs, &ref); if (xmlSchemaCheckReference(pctxt, schema, node, attr, refNs) != 0) return(NULL); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) && (!xmlStrEqual(attr->name, BAD_CAST "id"))) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* Attribute ID */ xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * TODO: We do not have a place to store the annotation, do we? */ xmlSchemaParseAnnotation(pctxt, child, 0); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } /* * Handle attribute group redefinitions. */ if (pctxt->isRedefine && pctxt->redef && (pctxt->redef->item->type == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) && (ref == pctxt->redef->refName) && (refNs == pctxt->redef->refTargetNs)) { /* * SPEC src-redefine: * (7.1) "If it has an among its contents * the �actual value� of whose ref [attribute] is the same * as the �actual value� of its own name attribute plus * target namespace, then it must have exactly one such group." */ if (pctxt->redefCounter != 0) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_SRC_REDEFINE, node, NULL, "The redefining attribute group definition " "'%s' must not contain more than one " "reference to the redefined definition", xmlSchemaFormatQName(&str, refNs, ref), NULL); FREE_AND_NULL(str); return(NULL); } pctxt->redefCounter++; /* * URGENT TODO: How to ensure that the reference will not be * handled by the normal component resolution mechanism? */ ret = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs); if (ret == NULL) return(NULL); ret->node = node; pctxt->redef->reference = WXS_BASIC_CAST ret; } else { /* * Create a QName-reference helper component. We will substitute this * component for the attribute uses of the referenced attribute group * definition. */ ret = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs); if (ret == NULL) return(NULL); ret->node = node; /* Add to pending items, to be able to resolve the reference. */ WXS_ADD_PENDING(pctxt, ret); } return (ret); } /** * xmlSchemaParseAttributeGroupDefinition: * @pctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Attribute Group declaration * *WARNING* this interface is highly subject to change * * Returns the attribute group definition or NULL in case of error. */ static xmlSchemaAttributeGroupPtr xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node) { const xmlChar *name; xmlSchemaAttributeGroupPtr ret; xmlNodePtr child = NULL; xmlAttrPtr attr; int hasRefs = 0; if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); attr = xmlSchemaGetPropNode(node, "name"); if (attr == NULL) { xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } /* * The name is crucial, exit if invalid. */ if (xmlSchemaPValAttrNode(pctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { return (NULL); } ret = xmlSchemaAddAttributeGroupDefinition(pctxt, schema, name, pctxt->targetNamespace, node); if (ret == NULL) return (NULL); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && (!xmlStrEqual(attr->name, BAD_CAST "id"))) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* Attribute ID */ xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1); child = child->next; } /* * Parse contained attribute decls/refs. */ if (xmlSchemaParseLocalAttributes(pctxt, schema, &child, (xmlSchemaItemListPtr *) &(ret->attrUses), XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1) return(NULL); if (hasRefs) ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS; /* * Parse the attribute wildcard. */ if (IS_SCHEMA(child, "anyAttribute")) { ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt, schema, child); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))"); } return (ret); } /** * xmlSchemaPValAttrFormDefault: * @value: the value * @flags: the flags to be modified * @flagQualified: the specific flag for "qualified" * * Returns 0 if the value is valid, 1 otherwise. */ static int xmlSchemaPValAttrFormDefault(const xmlChar *value, int *flags, int flagQualified) { if (xmlStrEqual(value, BAD_CAST "qualified")) { if ((*flags & flagQualified) == 0) *flags |= flagQualified; } else if (!xmlStrEqual(value, BAD_CAST "unqualified")) return (1); return (0); } /** * xmlSchemaPValAttrBlockFinal: * @value: the value * @flags: the flags to be modified * @flagAll: the specific flag for "#all" * @flagExtension: the specific flag for "extension" * @flagRestriction: the specific flag for "restriction" * @flagSubstitution: the specific flag for "substitution" * @flagList: the specific flag for "list" * @flagUnion: the specific flag for "union" * * Validates the value of the attribute "final" and "block". The value * is converted into the specified flag values and returned in @flags. * * Returns 0 if the value is valid, 1 otherwise. */ static int xmlSchemaPValAttrBlockFinal(const xmlChar *value, int *flags, int flagAll, int flagExtension, int flagRestriction, int flagSubstitution, int flagList, int flagUnion) { int ret = 0; /* * TODO: This does not check for dublicate entries. */ if ((flags == NULL) || (value == NULL)) return (-1); if (value[0] == 0) return (0); if (xmlStrEqual(value, BAD_CAST "#all")) { if (flagAll != -1) *flags |= flagAll; else { if (flagExtension != -1) *flags |= flagExtension; if (flagRestriction != -1) *flags |= flagRestriction; if (flagSubstitution != -1) *flags |= flagSubstitution; if (flagList != -1) *flags |= flagList; if (flagUnion != -1) *flags |= flagUnion; } } else { const xmlChar *end, *cur = value; xmlChar *item; do { while (IS_BLANK_CH(*cur)) cur++; end = cur; while ((*end != 0) && (!(IS_BLANK_CH(*end)))) end++; if (end == cur) break; item = xmlStrndup(cur, end - cur); if (xmlStrEqual(item, BAD_CAST "extension")) { if (flagExtension != -1) { if ((*flags & flagExtension) == 0) *flags |= flagExtension; } else ret = 1; } else if (xmlStrEqual(item, BAD_CAST "restriction")) { if (flagRestriction != -1) { if ((*flags & flagRestriction) == 0) *flags |= flagRestriction; } else ret = 1; } else if (xmlStrEqual(item, BAD_CAST "substitution")) { if (flagSubstitution != -1) { if ((*flags & flagSubstitution) == 0) *flags |= flagSubstitution; } else ret = 1; } else if (xmlStrEqual(item, BAD_CAST "list")) { if (flagList != -1) { if ((*flags & flagList) == 0) *flags |= flagList; } else ret = 1; } else if (xmlStrEqual(item, BAD_CAST "union")) { if (flagUnion != -1) { if ((*flags & flagUnion) == 0) *flags |= flagUnion; } else ret = 1; } else ret = 1; if (item != NULL) xmlFree(item); cur = end; } while ((ret == 0) && (*cur != 0)); } return (ret); } static int xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt, xmlSchemaIDCPtr idc, xmlSchemaIDCSelectPtr selector, xmlAttrPtr attr, int isField) { xmlNodePtr node; /* * c-selector-xpath: * Schema Component Constraint: Selector Value OK * * TODO: 1 The {selector} must be a valid XPath expression, as defined * in [XPath]. */ if (selector == NULL) { xmlSchemaPErr(ctxt, idc->node, XML_SCHEMAP_INTERNAL, "Internal error: xmlSchemaCheckCSelectorXPath, " "the selector is not specified.\n", NULL, NULL); return (-1); } if (attr == NULL) node = idc->node; else node = (xmlNodePtr) attr; if (selector->xpath == NULL) { xmlSchemaPCustomErr(ctxt, /* TODO: Adjust error code. */ XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, node, "The XPath expression of the selector is not valid", NULL); return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE); } else { const xmlChar **nsArray = NULL; xmlNsPtr *nsList = NULL; /* * Compile the XPath expression. */ /* * TODO: We need the array of in-scope namespaces for compilation. * TODO: Call xmlPatterncompile with different options for selector/ * field. */ if (attr == NULL) nsList = NULL; else nsList = xmlGetNsList(attr->doc, attr->parent); /* * Build an array of prefixes and namespaces. */ if (nsList != NULL) { int i, count = 0; for (i = 0; nsList[i] != NULL; i++) count++; nsArray = (const xmlChar **) xmlMalloc( (count * 2 + 1) * sizeof(const xmlChar *)); if (nsArray == NULL) { xmlSchemaPErrMemory(ctxt, "allocating a namespace array", NULL); xmlFree(nsList); return (-1); } for (i = 0; i < count; i++) { nsArray[2 * i] = nsList[i]->href; nsArray[2 * i + 1] = nsList[i]->prefix; } nsArray[count * 2] = NULL; xmlFree(nsList); } /* * TODO: Differentiate between "selector" and "field". */ if (isField) selector->xpathComp = (void *) xmlPatterncompile(selector->xpath, NULL, XML_PATTERN_XSFIELD, nsArray); else selector->xpathComp = (void *) xmlPatterncompile(selector->xpath, NULL, XML_PATTERN_XSSEL, nsArray); if (nsArray != NULL) xmlFree((xmlChar **) nsArray); if (selector->xpathComp == NULL) { xmlSchemaPCustomErr(ctxt, /* TODO: Adjust error code? */ XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, node, "The XPath expression '%s' could not be " "compiled", selector->xpath); return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE); } } return (0); } #define ADD_ANNOTATION(annot) \ xmlSchemaAnnotPtr cur = item->annot; \ if (item->annot == NULL) { \ item->annot = annot; \ return (annot); \ } \ cur = item->annot; \ if (cur->next != NULL) { \ cur = cur->next; \ } \ cur->next = annot; /** * xmlSchemaAssignAnnotation: * @item: the schema component * @annot: the annotation * * Adds the annotation to the given schema component. * * Returns the given annotaion. */ static xmlSchemaAnnotPtr xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem, xmlSchemaAnnotPtr annot) { if ((annItem == NULL) || (annot == NULL)) return (NULL); switch (annItem->type) { case XML_SCHEMA_TYPE_ELEMENT: { xmlSchemaElementPtr item = (xmlSchemaElementPtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_ATTRIBUTE: { xmlSchemaAttributePtr item = (xmlSchemaAttributePtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: case XML_SCHEMA_TYPE_ANY: { xmlSchemaWildcardPtr item = (xmlSchemaWildcardPtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_PARTICLE: case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_KEYREF: case XML_SCHEMA_TYPE_IDC_UNIQUE: { xmlSchemaAnnotItemPtr item = (xmlSchemaAnnotItemPtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: { xmlSchemaAttributeGroupPtr item = (xmlSchemaAttributeGroupPtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_NOTATION: { xmlSchemaNotationPtr item = (xmlSchemaNotationPtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_FACET_MININCLUSIVE: case XML_SCHEMA_FACET_MINEXCLUSIVE: case XML_SCHEMA_FACET_MAXINCLUSIVE: case XML_SCHEMA_FACET_MAXEXCLUSIVE: case XML_SCHEMA_FACET_TOTALDIGITS: case XML_SCHEMA_FACET_FRACTIONDIGITS: case XML_SCHEMA_FACET_PATTERN: case XML_SCHEMA_FACET_ENUMERATION: case XML_SCHEMA_FACET_WHITESPACE: case XML_SCHEMA_FACET_LENGTH: case XML_SCHEMA_FACET_MAXLENGTH: case XML_SCHEMA_FACET_MINLENGTH: { xmlSchemaFacetPtr item = (xmlSchemaFacetPtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_SIMPLE: case XML_SCHEMA_TYPE_COMPLEX: { xmlSchemaTypePtr item = (xmlSchemaTypePtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_GROUP: { xmlSchemaModelGroupDefPtr item = (xmlSchemaModelGroupDefPtr) annItem; ADD_ANNOTATION(annot) } break; case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: { xmlSchemaModelGroupPtr item = (xmlSchemaModelGroupPtr) annItem; ADD_ANNOTATION(annot) } break; default: xmlSchemaPCustomErr(NULL, XML_SCHEMAP_INTERNAL, NULL, NULL, "Internal error: xmlSchemaAddAnnotation, " "The item is not a annotated schema component", NULL); break; } return (annot); } /** * xmlSchemaParseIDCSelectorAndField: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * Parses a XML Schema identity-contraint definition's * and elements. * * Returns the parsed identity-constraint definition. */ static xmlSchemaIDCSelectPtr xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt, xmlSchemaIDCPtr idc, xmlNodePtr node, int isField) { xmlSchemaIDCSelectPtr item; xmlNodePtr child = NULL; xmlAttrPtr attr; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "xpath"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* * Create the item. */ item = (xmlSchemaIDCSelectPtr) xmlMalloc(sizeof(xmlSchemaIDCSelect)); if (item == NULL) { xmlSchemaPErrMemory(ctxt, "allocating a 'selector' of an identity-constraint definition", NULL); return (NULL); } memset(item, 0, sizeof(xmlSchemaIDCSelect)); /* * Attribute "xpath" (mandatory). */ attr = xmlSchemaGetPropNode(node, "xpath"); if (attr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); } else { item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); /* * URGENT TODO: "field"s have an other syntax than "selector"s. */ if (xmlSchemaCheckCSelectorXPath(ctxt, idc, item, attr, isField) == -1) { xmlSchemaPErr(ctxt, (xmlNodePtr) attr, XML_SCHEMAP_INTERNAL, "Internal error: xmlSchemaParseIDCSelectorAndField, " "validating the XPath expression of a IDC selector.\n", NULL, NULL); } } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * Add the annotation to the parent IDC. */ xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc, xmlSchemaParseAnnotation(ctxt, child, 1)); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } return (item); } /** * xmlSchemaParseIDC: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * Parses a XML Schema identity-contraint definition. * * Returns the parsed identity-constraint definition. */ static xmlSchemaIDCPtr xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaTypeType idcCategory, const xmlChar *targetNamespace) { xmlSchemaIDCPtr item = NULL; xmlNodePtr child = NULL; xmlAttrPtr attr; const xmlChar *name = NULL; xmlSchemaIDCSelectPtr field = NULL, lastField = NULL; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "name")) && ((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) || (!xmlStrEqual(attr->name, BAD_CAST "refer")))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* * Attribute "name" (mandatory). */ attr = xmlSchemaGetPropNode(node, "name"); if (attr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { return (NULL); } /* Create the component. */ item = xmlSchemaAddIDC(ctxt, schema, name, targetNamespace, idcCategory, node); if (item == NULL) return(NULL); xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) { /* * Attribute "refer" (mandatory). */ attr = xmlSchemaGetPropNode(node, "refer"); if (attr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "refer", NULL); } else { /* * Create a reference item. */ item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY, NULL, NULL); if (item->ref == NULL) return (NULL); xmlSchemaPValAttrNodeQName(ctxt, schema, NULL, attr, &(item->ref->targetNamespace), &(item->ref->name)); xmlSchemaCheckReference(ctxt, schema, node, attr, item->ref->targetNamespace); } } /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (child == NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, NULL, node, child, "A child element is missing", "(annotation?, (selector, field+))"); } /* * Child element . */ if (IS_SCHEMA(child, "selector")) { item->selector = xmlSchemaParseIDCSelectorAndField(ctxt, item, child, 0); child = child->next; /* * Child elements . */ if (IS_SCHEMA(child, "field")) { do { field = xmlSchemaParseIDCSelectorAndField(ctxt, item, child, 1); if (field != NULL) { field->index = item->nbFields; item->nbFields++; if (lastField != NULL) lastField->next = field; else item->fields = field; lastField = field; } child = child->next; } while (IS_SCHEMA(child, "field")); } else { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (selector, field+))"); } } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (selector, field+))"); } return (item); } /** * xmlSchemaParseElement: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * @topLevel: indicates if this is global declaration * * Parses a XML schema element declaration. * *WARNING* this interface is highly subject to change * * Returns the element declaration or a particle; NULL in case * of an error or if the particle has minOccurs==maxOccurs==0. */ static xmlSchemaBasicItemPtr xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, int *isElemRef, int topLevel) { xmlSchemaElementPtr decl = NULL; xmlSchemaParticlePtr particle = NULL; xmlSchemaAnnotPtr annot = NULL; xmlNodePtr child = NULL; xmlAttrPtr attr, nameAttr; int min, max, isRef = 0; xmlChar *des = NULL; /* 3.3.3 Constraints on XML Representations of Element Declarations */ /* TODO: Complete implementation of 3.3.6 */ if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); if (isElemRef != NULL) *isElemRef = 0; /* * If we get a "ref" attribute on a local we will assume it's * a reference - even if there's a "name" attribute; this seems to be more * robust. */ nameAttr = xmlSchemaGetPropNode(node, "name"); attr = xmlSchemaGetPropNode(node, "ref"); if ((topLevel) || (attr == NULL)) { if (nameAttr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } } else isRef = 1; xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); child = node->children; if (IS_SCHEMA(child, "annotation")) { annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } /* * Skip particle part if a global declaration. */ if (topLevel) goto declaration_part; /* * The particle part ================================================== */ min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)"); xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); particle = xmlSchemaAddParticle(ctxt, node, min, max); if (particle == NULL) goto return_null; /* ret->flags |= XML_SCHEMAS_ELEM_REF; */ if (isRef) { const xmlChar *refNs = NULL, *ref = NULL; xmlSchemaQNameRefPtr refer = NULL; /* * The reference part ============================================= */ if (isElemRef != NULL) *isElemRef = 1; xmlSchemaPValAttrNodeQName(ctxt, schema, NULL, attr, &refNs, &ref); xmlSchemaCheckReference(ctxt, schema, node, attr, refNs); /* * SPEC (3.3.3 : 2.1) "One of ref or name must be present, but not both" */ if (nameAttr != NULL) { xmlSchemaPMutualExclAttrErr(ctxt, XML_SCHEMAP_SRC_ELEMENT_2_1, NULL, nameAttr, "ref", "name"); } /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if (xmlStrEqual(attr->name, BAD_CAST "ref") || xmlStrEqual(attr->name, BAD_CAST "name") || xmlStrEqual(attr->name, BAD_CAST "id") || xmlStrEqual(attr->name, BAD_CAST "maxOccurs") || xmlStrEqual(attr->name, BAD_CAST "minOccurs")) { attr = attr->next; continue; } else { /* SPEC (3.3.3 : 2.2) */ xmlSchemaPCustomAttrErr(ctxt, XML_SCHEMAP_SRC_ELEMENT_2_2, NULL, NULL, attr, "Only the attributes 'minOccurs', 'maxOccurs' and " "'id' are allowed in addition to 'ref'"); break; } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* * No children except expected. */ if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } if ((min == 0) && (max == 0)) goto return_null; /* * Create the reference item and attach it to the particle. */ refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT, ref, refNs); if (refer == NULL) goto return_null; particle->children = (xmlSchemaTreeItemPtr) refer; particle->annot = annot; /* * Add the particle to pending components, since the reference * need to be resolved. */ WXS_ADD_PENDING(ctxt, particle); return ((xmlSchemaBasicItemPtr) particle); } /* * The declaration part =============================================== */ declaration_part: { const xmlChar *ns = NULL, *fixed, *name, *attrValue; xmlSchemaIDCPtr curIDC = NULL, lastIDC = NULL; if (xmlSchemaPValAttrNode(ctxt, NULL, nameAttr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) goto return_null; /* * Evaluate the target namespace. */ if (topLevel) { ns = ctxt->targetNamespace; } else { attr = xmlSchemaGetPropNode(node, "form"); if (attr != NULL) { attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (xmlStrEqual(attrValue, BAD_CAST "qualified")) { ns = ctxt->targetNamespace; } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(qualified | unqualified)", attrValue, NULL, NULL, NULL); } } else if (schema->flags & XML_SCHEMAS_QUALIF_ELEM) ns = ctxt->targetNamespace; } decl = xmlSchemaAddElement(ctxt, name, ns, node, topLevel); if (decl == NULL) { goto return_null; } /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && (!xmlStrEqual(attr->name, BAD_CAST "type")) && (!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "default")) && (!xmlStrEqual(attr->name, BAD_CAST "fixed")) && (!xmlStrEqual(attr->name, BAD_CAST "block")) && (!xmlStrEqual(attr->name, BAD_CAST "nillable"))) { if (topLevel == 0) { if ((!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && (!xmlStrEqual(attr->name, BAD_CAST "form"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if ((!xmlStrEqual(attr->name, BAD_CAST "final")) && (!xmlStrEqual(attr->name, BAD_CAST "abstract")) && (!xmlStrEqual(attr->name, BAD_CAST "substitutionGroup"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* * Extract/validate attributes. */ if (topLevel) { /* * Process top attributes of global element declarations here. */ decl->flags |= XML_SCHEMAS_ELEM_GLOBAL; decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL; xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "substitutionGroup", &(decl->substGroupNs), &(decl->substGroup)); if (xmlGetBooleanProp(ctxt, node, "abstract", 0)) decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT; /* * Attribute "final". */ attr = xmlSchemaGetPropNode(node, "final"); if (attr == NULL) { if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION; } else { attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags), -1, XML_SCHEMAS_ELEM_FINAL_EXTENSION, XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(#all | List of (extension | restriction))", attrValue, NULL, NULL, NULL); } } } /* * Attribute "block". */ attr = xmlSchemaGetPropNode(node, "block"); if (attr == NULL) { /* * Apply default "block" values. */ if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION; if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION; if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION) decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION; } else { attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags), -1, XML_SCHEMAS_ELEM_BLOCK_EXTENSION, XML_SCHEMAS_ELEM_BLOCK_RESTRICTION, XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(#all | List of (extension | " "restriction | substitution))", attrValue, NULL, NULL, NULL); } } if (xmlGetBooleanProp(ctxt, node, "nillable", 0)) decl->flags |= XML_SCHEMAS_ELEM_NILLABLE; attr = xmlSchemaGetPropNode(node, "type"); if (attr != NULL) { xmlSchemaPValAttrNodeQName(ctxt, schema, NULL, attr, &(decl->namedTypeNs), &(decl->namedType)); xmlSchemaCheckReference(ctxt, schema, node, attr, decl->namedTypeNs); } decl->value = xmlSchemaGetProp(ctxt, node, "default"); attr = xmlSchemaGetPropNode(node, "fixed"); if (attr != NULL) { fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (decl->value != NULL) { /* * 3.3.3 : 1 * default and fixed must not both be present. */ xmlSchemaPMutualExclAttrErr(ctxt, XML_SCHEMAP_SRC_ELEMENT_1, NULL, attr, "default", "fixed"); } else { decl->flags |= XML_SCHEMAS_ELEM_FIXED; decl->value = fixed; } } /* * And now for the children... */ if (IS_SCHEMA(child, "complexType")) { /* * 3.3.3 : 3 * "type" and either or are mutually * exclusive */ if (decl->namedType != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_SRC_ELEMENT_3, NULL, node, child, "The attribute 'type' and the child are " "mutually exclusive", NULL); } else WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt, schema, child, 0); child = child->next; } else if (IS_SCHEMA(child, "simpleType")) { /* * 3.3.3 : 3 * "type" and either or are * mutually exclusive */ if (decl->namedType != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_SRC_ELEMENT_3, NULL, node, child, "The attribute 'type' and the child are " "mutually exclusive", NULL); } else WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt, schema, child, 0); child = child->next; } while ((IS_SCHEMA(child, "unique")) || (IS_SCHEMA(child, "key")) || (IS_SCHEMA(child, "keyref"))) { if (IS_SCHEMA(child, "unique")) { curIDC = xmlSchemaParseIDC(ctxt, schema, child, XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace); } else if (IS_SCHEMA(child, "key")) { curIDC = xmlSchemaParseIDC(ctxt, schema, child, XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace); } else if (IS_SCHEMA(child, "keyref")) { curIDC = xmlSchemaParseIDC(ctxt, schema, child, XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace); } if (lastIDC != NULL) lastIDC->next = curIDC; else decl->idcs = (void *) curIDC; lastIDC = curIDC; child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, ((simpleType | complexType)?, " "(unique | key | keyref)*))"); } decl->annot = annot; } /* * NOTE: Element Declaration Representation OK 4. will be checked at a * different layer. */ FREE_AND_NULL(des) if (topLevel) return ((xmlSchemaBasicItemPtr) decl); else { particle->children = (xmlSchemaTreeItemPtr) decl; return ((xmlSchemaBasicItemPtr) particle); } return_null: FREE_AND_NULL(des); if (annot != NULL) { if (particle != NULL) particle->annot = NULL; if (decl != NULL) decl->annot = NULL; xmlSchemaFreeAnnot(annot); } return (NULL); } /** * xmlSchemaParseUnion: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Union definition * *WARNING* this interface is highly subject to change * * Returns -1 in case of internal error, 0 in case of success and a positive * error code otherwise. */ static int xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaTypePtr type; xmlNodePtr child = NULL; xmlAttrPtr attr; const xmlChar *cur = NULL; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (-1); /* Not a component, don't create it. */ type = ctxt->ctxtType; /* * Mark the simple type as being of variety "union". */ type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION; /* * SPEC (Base type) (2) "If the or alternative is chosen, * then the �simple ur-type definition�." */ type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "memberTypes"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * Attribute "memberTypes". This is a list of QNames. * TODO: Check the value to contain anything. */ attr = xmlSchemaGetPropNode(node, "memberTypes"); if (attr != NULL) { const xmlChar *end; xmlChar *tmp; const xmlChar *localName, *nsName; xmlSchemaTypeLinkPtr link, lastLink = NULL; xmlSchemaQNameRefPtr ref; cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); type->base = cur; do { while (IS_BLANK_CH(*cur)) cur++; end = cur; while ((*end != 0) && (!(IS_BLANK_CH(*end)))) end++; if (end == cur) break; tmp = xmlStrndup(cur, end - cur); if (xmlSchemaPValAttrNodeQNameValue(ctxt, schema, NULL, attr, BAD_CAST tmp, &nsName, &localName) == 0) { /* * Create the member type link. */ link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink)); if (link == NULL) { xmlSchemaPErrMemory(ctxt, "xmlSchemaParseUnion, " "allocating a type link", NULL); return (-1); } link->type = NULL; link->next = NULL; if (lastLink == NULL) type->memberTypes = link; else lastLink->next = link; lastLink = link; /* * Create a reference item. */ ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE, localName, nsName); if (ref == NULL) { FREE_AND_NULL(tmp) return (-1); } /* * Assign the reference to the link, it will be resolved * later during fixup of the union simple type. */ link->type = (xmlSchemaTypePtr) ref; } FREE_AND_NULL(tmp) cur = end; } while (*cur != 0); } /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * Add the annotation to the simple type ancestor. */ xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, xmlSchemaParseAnnotation(ctxt, child, 1)); child = child->next; } if (IS_SCHEMA(child, "simpleType")) { xmlSchemaTypePtr subtype, last = NULL; /* * Anchor the member types in the "subtypes" field of the * simple type. */ while (IS_SCHEMA(child, "simpleType")) { subtype = (xmlSchemaTypePtr) xmlSchemaParseSimpleType(ctxt, schema, child, 0); if (subtype != NULL) { if (last == NULL) { type->subtypes = subtype; last = subtype; } else { last->next = subtype; last = subtype; } last->next = NULL; } child = child->next; } } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, simpleType*)"); } if ((attr == NULL) && (type->subtypes == NULL)) { /* * src-union-memberTypes-or-simpleTypes * Either the memberTypes [attribute] of the element must * be non-empty or there must be at least one simpleType [child]. */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES, NULL, node, "Either the attribute 'memberTypes' or " "at least one child must be present", NULL); } return (0); } /** * xmlSchemaParseList: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema List definition * *WARNING* this interface is highly subject to change * * Returns -1 in case of error, 0 if the declaration is improper and * 1 in case of success. */ static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaTypePtr type; xmlNodePtr child = NULL; xmlAttrPtr attr; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); /* Not a component, don't create it. */ type = ctxt->ctxtType; /* * Mark the type as being of variety "list". */ type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; /* * SPEC (Base type) (2) "If the or alternative is chosen, * then the �simple ur-type definition�." */ type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "itemType"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * Attribute "itemType". NOTE that we will use the "ref" and "refNs" * fields for holding the reference to the itemType. * * REVAMP TODO: Use the "base" and "baseNs" fields, since we will remove * the "ref" fields. */ xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "itemType", &(type->baseNs), &(type->base)); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, xmlSchemaParseAnnotation(ctxt, child, 1)); child = child->next; } if (IS_SCHEMA(child, "simpleType")) { /* * src-list-itemType-or-simpleType * Either the itemType [attribute] or the [child] of * the element must be present, but not both. */ if (type->base != NULL) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_SIMPLE_TYPE_1, NULL, node, "The attribute 'itemType' and the child " "are mutually exclusive", NULL); } else { type->subtypes = xmlSchemaParseSimpleType(ctxt, schema, child, 0); } child = child->next; } else if (type->base == NULL) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_SIMPLE_TYPE_1, NULL, node, "Either the attribute 'itemType' or the child " "must be present", NULL); } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, simpleType?)"); } if ((type->base == NULL) && (type->subtypes == NULL) && (xmlSchemaGetPropNode(node, "itemType") == NULL)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_SIMPLE_TYPE_1, NULL, node, "Either the attribute 'itemType' or the child " "must be present", NULL); } return (NULL); } /** * xmlSchemaParseSimpleType: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Simple Type definition * *WARNING* this interface is highly subject to change * * Returns -1 in case of error, 0 if the declaration is improper and * 1 in case of success. */ static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, int topLevel) { xmlSchemaTypePtr type, oldCtxtType; xmlNodePtr child = NULL; const xmlChar *attrValue = NULL; xmlAttrPtr attr; int hasRestriction = 0; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); if (topLevel) { attr = xmlSchemaGetPropNode(node, "name"); if (attr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } else { if (xmlSchemaPValAttrNode(ctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) return (NULL); /* * Skip built-in types. */ if (ctxt->isS4S) { xmlSchemaTypePtr biType; if (ctxt->isRedefine) { /* * REDEFINE: Disallow redefinition of built-in-types. * TODO: It seems that the spec does not say anything * about this case. */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, NULL, node, "Redefinition of built-in simple types is not " "supported", NULL); return(NULL); } biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs); if (biType != NULL) return (biType); } } } /* * TargetNamespace: * SPEC "The �actual value� of the targetNamespace [attribute] * of the ancestor element information item if present, * otherwise �absent�. */ if (topLevel == 0) { #ifdef ENABLE_NAMED_LOCALS char buf[40]; #endif /* * Parse as local simple type definition. */ #ifdef ENABLE_NAMED_LOCALS snprintf(buf, 39, "#ST%d", ctxt->counter++ + 1); type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE, xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1), ctxt->targetNamespace, node, 0); #else type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE, NULL, ctxt->targetNamespace, node, 0); #endif if (type == NULL) return (NULL); type->type = XML_SCHEMA_TYPE_SIMPLE; type->contentType = XML_SCHEMA_CONTENT_SIMPLE; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if (!xmlStrEqual(attr->name, BAD_CAST "id")) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } } else { /* * Parse as global simple type definition. * * Note that attrValue is the value of the attribute "name" here. */ type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE, attrValue, ctxt->targetNamespace, node, 1); if (type == NULL) return (NULL); type->type = XML_SCHEMA_TYPE_SIMPLE; type->contentType = XML_SCHEMA_CONTENT_SIMPLE; type->flags |= XML_SCHEMAS_TYPE_GLOBAL; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "name")) && (!xmlStrEqual(attr->name, BAD_CAST "final"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* * Attribute "final". */ attr = xmlSchemaGetPropNode(node, "final"); if (attr == NULL) { if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST) type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION) type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION; } else { attrValue = xmlSchemaGetProp(ctxt, node, "final"); if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags), -1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1, XML_SCHEMAS_TYPE_FINAL_LIST, XML_SCHEMAS_TYPE_FINAL_UNION) != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, WXS_BASIC_CAST type, (xmlNodePtr) attr, NULL, "(#all | List of (list | union | restriction)", attrValue, NULL, NULL, NULL); } } } type->targetNamespace = ctxt->targetNamespace; xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * And now for the children... */ oldCtxtType = ctxt->ctxtType; ctxt->ctxtType = type; child = node->children; if (IS_SCHEMA(child, "annotation")) { type->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (child == NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, NULL, node, child, NULL, "(annotation?, (restriction | list | union))"); } else if (IS_SCHEMA(child, "restriction")) { xmlSchemaParseRestriction(ctxt, schema, child, XML_SCHEMA_TYPE_SIMPLE); hasRestriction = 1; child = child->next; } else if (IS_SCHEMA(child, "list")) { xmlSchemaParseList(ctxt, schema, child); child = child->next; } else if (IS_SCHEMA(child, "union")) { xmlSchemaParseUnion(ctxt, schema, child); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (restriction | list | union))"); } /* * REDEFINE: SPEC src-redefine (5) * "Within the [children], each must have a * among its [children] ... the �actual value� of whose * base [attribute] must be the same as the �actual value� of its own * name attribute plus target namespace;" */ if (topLevel && ctxt->isRedefine && (! hasRestriction)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, NULL, node, "This is a redefinition, thus the " " must have a child", NULL); } ctxt->ctxtType = oldCtxtType; return (type); } /** * xmlSchemaParseModelGroupDefRef: * @ctxt: the parser context * @schema: the schema being built * @node: the node * * Parses a reference to a model group definition. * * We will return a particle component with a qname-component or * NULL in case of an error. */ static xmlSchemaTreeItemPtr xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaParticlePtr item; xmlNodePtr child = NULL; xmlAttrPtr attr; const xmlChar *ref = NULL, *refNs = NULL; int min, max; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); attr = xmlSchemaGetPropNode(node, "ref"); if (attr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "ref", NULL); return (NULL); } else if (xmlSchemaPValAttrNodeQName(ctxt, schema, NULL, attr, &refNs, &ref) != 0) { return (NULL); } xmlSchemaCheckReference(ctxt, schema, node, attr, refNs); min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)"); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) && (!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); item = xmlSchemaAddParticle(ctxt, node, min, max); if (item == NULL) return (NULL); /* * Create a qname-reference and set as the term; it will be substituted * for the model group after the reference has been resolved. */ item->children = (xmlSchemaTreeItemPtr) xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP, ref, refNs); xmlSchemaPCheckParticleCorrect_2(ctxt, item, node, min, max); /* * And now for the children... */ child = node->children; /* TODO: Is annotation even allowed for a model group reference? */ if (IS_SCHEMA(child, "annotation")) { /* * TODO: What to do exactly with the annotation? */ item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } /* * Corresponds to no component at all if minOccurs==maxOccurs==0. */ if ((min == 0) && (max == 0)) return (NULL); return ((xmlSchemaTreeItemPtr) item); } /** * xmlSchemaParseModelGroupDefinition: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * Parses a XML schema model group definition. * * Note that the contraint src-redefine (6.2) can't be applied until * references have been resolved. So we will do this at the * component fixup level. * * *WARNING* this interface is highly subject to change * * Returns -1 in case of error, 0 if the declaration is improper and * 1 in case of success. */ static xmlSchemaModelGroupDefPtr xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlSchemaModelGroupDefPtr item; xmlNodePtr child = NULL; xmlAttrPtr attr; const xmlChar *name; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); attr = xmlSchemaGetPropNode(node, "name"); if (attr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { return (NULL); } item = xmlSchemaAddModelGroupDefinition(ctxt, schema, name, ctxt->targetNamespace, node); if (item == NULL) return (NULL); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && (!xmlStrEqual(attr->name, BAD_CAST "id"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (IS_SCHEMA(child, "all")) { item->children = xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_ALL, 0); child = child->next; } else if (IS_SCHEMA(child, "choice")) { item->children = xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_CHOICE, 0); child = child->next; } else if (IS_SCHEMA(child, "sequence")) { item->children = xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_SEQUENCE, 0); child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (all | choice | sequence)?)"); } return (item); } /** * xmlSchemaCleanupDoc: * @ctxt: a schema validation context * @node: the root of the document. * * removes unwanted nodes in a schemas document tree */ static void xmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr root) { xmlNodePtr delete, cur; if ((ctxt == NULL) || (root == NULL)) return; /* * Remove all the blank text nodes */ delete = NULL; cur = root; while (cur != NULL) { if (delete != NULL) { xmlUnlinkNode(delete); xmlFreeNode(delete); delete = NULL; } if (cur->type == XML_TEXT_NODE) { if (IS_BLANK_NODE(cur)) { if (xmlNodeGetSpacePreserve(cur) != 1) { delete = cur; } } } else if ((cur->type != XML_ELEMENT_NODE) && (cur->type != XML_CDATA_SECTION_NODE)) { delete = cur; goto skip_children; } /* * Skip to next node */ if (cur->children != NULL) { if ((cur->children->type != XML_ENTITY_DECL) && (cur->children->type != XML_ENTITY_REF_NODE) && (cur->children->type != XML_ENTITY_NODE)) { cur = cur->children; continue; } } skip_children: if (cur->next != NULL) { cur = cur->next; continue; } do { cur = cur->parent; if (cur == NULL) break; if (cur == root) { cur = NULL; break; } if (cur->next != NULL) { cur = cur->next; break; } } while (cur != NULL); } if (delete != NULL) { xmlUnlinkNode(delete); xmlFreeNode(delete); delete = NULL; } } static void xmlSchemaClearSchemaDefaults(xmlSchemaPtr schema) { if (schema->flags & XML_SCHEMAS_QUALIF_ELEM) schema->flags ^= XML_SCHEMAS_QUALIF_ELEM; if (schema->flags & XML_SCHEMAS_QUALIF_ATTR) schema->flags ^= XML_SCHEMAS_QUALIF_ATTR; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST) schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION) schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION; if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION; if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION; if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION) schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION; } static int xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlAttrPtr attr; const xmlChar *val; int res = 0, oldErrs = ctxt->nberrors; /* * Those flags should be moved to the parser context flags, * since they are not visible at the component level. I.e. * they are used if processing schema *documents* only. */ res = xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); HFAILURE; /* * Since the version is of type xs:token, we won't bother to * check it. */ /* REMOVED: attr = xmlSchemaGetPropNode(node, "version"); if (attr != NULL) { res = xmlSchemaPValAttrNode(ctxt, NULL, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_TOKEN), &val); HFAILURE; } */ attr = xmlSchemaGetPropNode(node, "targetNamespace"); if (attr != NULL) { res = xmlSchemaPValAttrNode(ctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL); HFAILURE; if (res != 0) { ctxt->stop = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; goto exit; } } attr = xmlSchemaGetPropNode(node, "elementFormDefault"); if (attr != NULL) { val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); res = xmlSchemaPValAttrFormDefault(val, &schema->flags, XML_SCHEMAS_QUALIF_ELEM); HFAILURE; if (res != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_ELEMFORMDEFAULT_VALUE, NULL, (xmlNodePtr) attr, NULL, "(qualified | unqualified)", val, NULL, NULL, NULL); } } attr = xmlSchemaGetPropNode(node, "attributeFormDefault"); if (attr != NULL) { val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); res = xmlSchemaPValAttrFormDefault(val, &schema->flags, XML_SCHEMAS_QUALIF_ATTR); HFAILURE; if (res != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_ATTRFORMDEFAULT_VALUE, NULL, (xmlNodePtr) attr, NULL, "(qualified | unqualified)", val, NULL, NULL, NULL); } } attr = xmlSchemaGetPropNode(node, "finalDefault"); if (attr != NULL) { val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1, XML_SCHEMAS_FINAL_DEFAULT_EXTENSION, XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION, -1, XML_SCHEMAS_FINAL_DEFAULT_LIST, XML_SCHEMAS_FINAL_DEFAULT_UNION); HFAILURE; if (res != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(#all | List of (extension | restriction | list | union))", val, NULL, NULL, NULL); } } attr = xmlSchemaGetPropNode(node, "blockDefault"); if (attr != NULL) { val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1, XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION, XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION, XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1); HFAILURE; if (res != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(#all | List of (extension | restriction | substitution))", val, NULL, NULL, NULL); } } exit: if (oldErrs != ctxt->nberrors) res = ctxt->err; return(res); exit_failure: return(-1); } /** * xmlSchemaParseSchemaTopLevel: * @ctxt: a schema validation context * @schema: the schemas * @nodes: the list of top level nodes * * Returns the internal XML Schema structure built from the resource or * NULL in case of error */ static int xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr nodes) { xmlNodePtr child; xmlSchemaAnnotPtr annot; int res = 0, oldErrs, tmpOldErrs; if ((ctxt == NULL) || (schema == NULL) || (nodes == NULL)) return(-1); oldErrs = ctxt->nberrors; child = nodes; while ((IS_SCHEMA(child, "include")) || (IS_SCHEMA(child, "import")) || (IS_SCHEMA(child, "redefine")) || (IS_SCHEMA(child, "annotation"))) { if (IS_SCHEMA(child, "annotation")) { annot = xmlSchemaParseAnnotation(ctxt, child, 1); if (schema->annot == NULL) schema->annot = annot; else xmlSchemaFreeAnnot(annot); } else if (IS_SCHEMA(child, "import")) { tmpOldErrs = ctxt->nberrors; res = xmlSchemaParseImport(ctxt, schema, child); HFAILURE; HSTOP(ctxt); if (tmpOldErrs != ctxt->nberrors) goto exit; } else if (IS_SCHEMA(child, "include")) { tmpOldErrs = ctxt->nberrors; res = xmlSchemaParseInclude(ctxt, schema, child); HFAILURE; HSTOP(ctxt); if (tmpOldErrs != ctxt->nberrors) goto exit; } else if (IS_SCHEMA(child, "redefine")) { tmpOldErrs = ctxt->nberrors; res = xmlSchemaParseRedefine(ctxt, schema, child); HFAILURE; HSTOP(ctxt); if (tmpOldErrs != ctxt->nberrors) goto exit; } child = child->next; } /* * URGENT TODO: Change the functions to return int results. * We need especially to catch internal errors. */ while (child != NULL) { if (IS_SCHEMA(child, "complexType")) { xmlSchemaParseComplexType(ctxt, schema, child, 1); child = child->next; } else if (IS_SCHEMA(child, "simpleType")) { xmlSchemaParseSimpleType(ctxt, schema, child, 1); child = child->next; } else if (IS_SCHEMA(child, "element")) { xmlSchemaParseElement(ctxt, schema, child, NULL, 1); child = child->next; } else if (IS_SCHEMA(child, "attribute")) { xmlSchemaParseGlobalAttribute(ctxt, schema, child); child = child->next; } else if (IS_SCHEMA(child, "attributeGroup")) { xmlSchemaParseAttributeGroupDefinition(ctxt, schema, child); child = child->next; } else if (IS_SCHEMA(child, "group")) { xmlSchemaParseModelGroupDefinition(ctxt, schema, child); child = child->next; } else if (IS_SCHEMA(child, "notation")) { xmlSchemaParseNotation(ctxt, schema, child); child = child->next; } else { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, child->parent, child, NULL, "((include | import | redefine | annotation)*, " "(((simpleType | complexType | group | attributeGroup) " "| element | attribute | notation), annotation*)*)"); child = child->next; } while (IS_SCHEMA(child, "annotation")) { /* * TODO: We should add all annotations. */ annot = xmlSchemaParseAnnotation(ctxt, child, 1); if (schema->annot == NULL) schema->annot = annot; else xmlSchemaFreeAnnot(annot); child = child->next; } } exit: ctxt->ctxtType = NULL; if (oldErrs != ctxt->nberrors) res = ctxt->err; return(res); exit_failure: return(-1); } static xmlSchemaSchemaRelationPtr xmlSchemaSchemaRelationCreate(void) { xmlSchemaSchemaRelationPtr ret; ret = (xmlSchemaSchemaRelationPtr) xmlMalloc(sizeof(xmlSchemaSchemaRelation)); if (ret == NULL) { xmlSchemaPErrMemory(NULL, "allocating schema relation", NULL); return(NULL); } memset(ret, 0, sizeof(xmlSchemaSchemaRelation)); return(ret); } #if 0 static void xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel) { xmlFree(rel); } #endif static void xmlSchemaRedefListFree(xmlSchemaRedefPtr redef) { xmlSchemaRedefPtr prev; while (redef != NULL) { prev = redef; redef = redef->next; xmlFree(prev); } } static void xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con) { /* * After the construction context has been freed, there will be * no schema graph available any more. Only the schema buckets * will stay alive, which are put into the "schemasImports" and * "includes" slots of the xmlSchema. */ if (con->buckets != NULL) xmlSchemaItemListFree(con->buckets); if (con->pending != NULL) xmlSchemaItemListFree(con->pending); if (con->substGroups != NULL) xmlHashFree(con->substGroups, (xmlHashDeallocator) xmlSchemaSubstGroupFree); if (con->redefs != NULL) xmlSchemaRedefListFree(con->redefs); if (con->dict != NULL) xmlDictFree(con->dict); xmlFree(con); } static xmlSchemaConstructionCtxtPtr xmlSchemaConstructionCtxtCreate(xmlDictPtr dict) { xmlSchemaConstructionCtxtPtr ret; ret = (xmlSchemaConstructionCtxtPtr) xmlMalloc(sizeof(xmlSchemaConstructionCtxt)); if (ret == NULL) { xmlSchemaPErrMemory(NULL, "allocating schema construction context", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaConstructionCtxt)); ret->buckets = xmlSchemaItemListCreate(); if (ret->buckets == NULL) { xmlSchemaPErrMemory(NULL, "allocating list of schema buckets", NULL); xmlFree(ret); return (NULL); } ret->pending = xmlSchemaItemListCreate(); if (ret->pending == NULL) { xmlSchemaPErrMemory(NULL, "allocating list of pending global components", NULL); xmlSchemaConstructionCtxtFree(ret); return (NULL); } ret->dict = dict; xmlDictReference(dict); return(ret); } static xmlSchemaParserCtxtPtr xmlSchemaParserCtxtCreate(void) { xmlSchemaParserCtxtPtr ret; ret = (xmlSchemaParserCtxtPtr) xmlMalloc(sizeof(xmlSchemaParserCtxt)); if (ret == NULL) { xmlSchemaPErrMemory(NULL, "allocating schema parser context", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaParserCtxt)); ret->type = XML_SCHEMA_CTXT_PARSER; ret->attrProhibs = xmlSchemaItemListCreate(); if (ret->attrProhibs == NULL) { xmlFree(ret); return(NULL); } return(ret); } /** * xmlSchemaNewParserCtxtUseDict: * @URL: the location of the schema * @dict: the dictionary to be used * * Create an XML Schemas parse context for that file/resource expected * to contain an XML Schemas file. * * Returns the parser context or NULL in case of error */ static xmlSchemaParserCtxtPtr xmlSchemaNewParserCtxtUseDict(const char *URL, xmlDictPtr dict) { xmlSchemaParserCtxtPtr ret; ret = xmlSchemaParserCtxtCreate(); if (ret == NULL) return (NULL); ret->dict = dict; xmlDictReference(dict); if (URL != NULL) ret->URL = xmlDictLookup(dict, (const xmlChar *) URL, -1); return (ret); } static int xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt) { if (vctxt->pctxt == NULL) { if (vctxt->schema != NULL) vctxt->pctxt = xmlSchemaNewParserCtxtUseDict("*", vctxt->schema->dict); else vctxt->pctxt = xmlSchemaNewParserCtxt("*"); if (vctxt->pctxt == NULL) { VERROR_INT("xmlSchemaCreatePCtxtOnVCtxt", "failed to create a temp. parser context"); return (-1); } /* TODO: Pass user data. */ xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error, vctxt->warning, vctxt->errCtxt); xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror, vctxt->errCtxt); } return (0); } /** * xmlSchemaGetSchemaBucket: * @pctxt: the schema parser context * @schemaLocation: the URI of the schema document * * Returns a schema bucket if it was already parsed. * * Returns a schema bucket if it was already parsed from * @schemaLocation, NULL otherwise. */ static xmlSchemaBucketPtr xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt, const xmlChar *schemaLocation) { xmlSchemaBucketPtr cur; xmlSchemaItemListPtr list; list = pctxt->constructor->buckets; if (list->nbItems == 0) return(NULL); else { int i; for (i = 0; i < list->nbItems; i++) { cur = (xmlSchemaBucketPtr) list->items[i]; /* Pointer comparison! */ if (cur->schemaLocation == schemaLocation) return(cur); } } return(NULL); } static xmlSchemaBucketPtr xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt, const xmlChar *schemaLocation, const xmlChar *targetNamespace) { xmlSchemaBucketPtr cur; xmlSchemaItemListPtr list; list = pctxt->constructor->buckets; if (list->nbItems == 0) return(NULL); else { int i; for (i = 0; i < list->nbItems; i++) { cur = (xmlSchemaBucketPtr) list->items[i]; /* Pointer comparison! */ if ((cur->origTargetNamespace == NULL) && (cur->schemaLocation == schemaLocation) && (cur->targetNamespace == targetNamespace)) return(cur); } } return(NULL); } #define IS_BAD_SCHEMA_DOC(b) \ (((b)->doc == NULL) && ((b)->schemaLocation != NULL)) static xmlSchemaBucketPtr xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt, const xmlChar *targetNamespace, int imported) { xmlSchemaBucketPtr cur; xmlSchemaItemListPtr list; list = pctxt->constructor->buckets; if (list->nbItems == 0) return(NULL); else { int i; for (i = 0; i < list->nbItems; i++) { cur = (xmlSchemaBucketPtr) list->items[i]; if ((! IS_BAD_SCHEMA_DOC(cur)) && (cur->origTargetNamespace == targetNamespace) && ((imported && cur->imported) || ((!imported) && (!cur->imported)))) return(cur); } } return(NULL); } static int xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlSchemaBucketPtr bucket) { int oldFlags; xmlDocPtr oldDoc; xmlNodePtr node; int ret, oldErrs; xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket; /* * Save old values; reset the *main* schema. * URGENT TODO: This is not good; move the per-document information * to the parser. Get rid of passing the main schema to the * parsing functions. */ oldFlags = schema->flags; oldDoc = schema->doc; if (schema->flags != 0) xmlSchemaClearSchemaDefaults(schema); schema->doc = bucket->doc; pctxt->schema = schema; /* * Keep the current target namespace on the parser *not* on the * main schema. */ pctxt->targetNamespace = bucket->targetNamespace; WXS_CONSTRUCTOR(pctxt)->bucket = bucket; if ((bucket->targetNamespace != NULL) && xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) { /* * We are parsing the schema for schemas! */ pctxt->isS4S = 1; } /* Mark it as parsed, even if parsing fails. */ bucket->parsed++; /* Compile the schema doc. */ node = xmlDocGetRootElement(bucket->doc); ret = xmlSchemaParseSchemaElement(pctxt, schema, node); if (ret != 0) goto exit; /* An empty schema; just get out. */ if (node->children == NULL) goto exit; oldErrs = pctxt->nberrors; ret = xmlSchemaParseSchemaTopLevel(pctxt, schema, node->children); if (ret != 0) goto exit; /* * TODO: Not nice, but I'm not 100% sure we will get always an error * as a result of the obove functions; so better rely on pctxt->err * as well. */ if ((ret == 0) && (oldErrs != pctxt->nberrors)) { ret = pctxt->err; goto exit; } exit: WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket; /* Restore schema values. */ schema->doc = oldDoc; schema->flags = oldFlags; return(ret); } static int xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlSchemaBucketPtr bucket) { xmlSchemaParserCtxtPtr newpctxt; int res = 0; if (bucket == NULL) return(0); if (bucket->parsed) { PERROR_INT("xmlSchemaParseNewDoc", "reparsing a schema doc"); return(-1); } if (bucket->doc == NULL) { PERROR_INT("xmlSchemaParseNewDoc", "parsing a schema doc, but there's no doc"); return(-1); } if (pctxt->constructor == NULL) { PERROR_INT("xmlSchemaParseNewDoc", "no constructor"); return(-1); } /* Create and init the temporary parser context. */ newpctxt = xmlSchemaNewParserCtxtUseDict( (const char *) bucket->schemaLocation, pctxt->dict); if (newpctxt == NULL) return(-1); newpctxt->constructor = pctxt->constructor; /* * TODO: Can we avoid that the parser knows about the main schema? * It would be better if he knows about the current schema bucket * only. */ newpctxt->schema = schema; xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning, pctxt->errCtxt); xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror, pctxt->errCtxt); newpctxt->counter = pctxt->counter; res = xmlSchemaParseNewDocWithContext(newpctxt, schema, bucket); /* Channel back errors and cleanup the temporary parser context. */ if (res != 0) pctxt->err = res; pctxt->nberrors += newpctxt->nberrors; pctxt->counter = newpctxt->counter; newpctxt->constructor = NULL; /* Free the parser context. */ xmlSchemaFreeParserCtxt(newpctxt); return(res); } static void xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket, xmlSchemaSchemaRelationPtr rel) { xmlSchemaSchemaRelationPtr cur = bucket->relations; if (cur == NULL) { bucket->relations = rel; return; } while (cur->next != NULL) cur = cur->next; cur->next = rel; } static const xmlChar * xmlSchemaBuildAbsoluteURI(xmlDictPtr dict, const xmlChar* location, xmlNodePtr ctxtNode) { /* * Build an absolue location URI. */ if (location != NULL) { if (ctxtNode == NULL) return(location); else { xmlChar *base, *URI; const xmlChar *ret = NULL; base = xmlNodeGetBase(ctxtNode->doc, ctxtNode); if (base == NULL) { URI = xmlBuildURI(location, ctxtNode->doc->URL); } else { URI = xmlBuildURI(location, base); xmlFree(base); } if (URI != NULL) { ret = xmlDictLookup(dict, URI, -1); xmlFree(URI); return(ret); } } } return(NULL); } /** * xmlSchemaAddSchemaDoc: * @pctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * Parse an included (and to-be-redefined) XML schema document. * * Returns 0 on success, a positive error code on errors and * -1 in case of an internal or API error. */ static int xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt, int type, /* import or include or redefine */ const xmlChar *schemaLocation, xmlDocPtr schemaDoc, const char *schemaBuffer, int schemaBufferLen, xmlNodePtr invokingNode, const xmlChar *sourceTargetNamespace, const xmlChar *importNamespace, xmlSchemaBucketPtr *bucket) { const xmlChar *targetNamespace = NULL; xmlSchemaSchemaRelationPtr relation = NULL; xmlDocPtr doc = NULL; int res = 0, err = 0, located = 0, preserveDoc = 0; xmlSchemaBucketPtr bkt = NULL; if (bucket != NULL) *bucket = NULL; switch (type) { case XML_SCHEMA_SCHEMA_IMPORT: case XML_SCHEMA_SCHEMA_MAIN: err = XML_SCHEMAP_SRC_IMPORT; break; case XML_SCHEMA_SCHEMA_INCLUDE: err = XML_SCHEMAP_SRC_INCLUDE; break; case XML_SCHEMA_SCHEMA_REDEFINE: err = XML_SCHEMAP_SRC_REDEFINE; break; } /* Special handling for the main schema: * skip the location and relation logic and just parse the doc. * We need just a bucket to be returned in this case. */ if ((type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt))) goto doc_load; /* Note that we expect the location to be an absulute URI. */ if (schemaLocation != NULL) { bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation); if ((bkt != NULL) && (pctxt->constructor->bucket == bkt)) { /* Report self-imports/inclusions/redefinitions. */ xmlSchemaCustomErr(ACTXT_CAST pctxt, err, invokingNode, NULL, "The schema must not import/include/redefine itself", NULL, NULL); goto exit; } } /* * Create a relation for the graph of schemas. */ relation = xmlSchemaSchemaRelationCreate(); if (relation == NULL) return(-1); xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket, relation); relation->type = type; /* * Save the namespace import information. */ if (WXS_IS_BUCKET_IMPMAIN(type)) { relation->importNamespace = importNamespace; if (schemaLocation == NULL) { /* * No location; this is just an import of the namespace. * Note that we don't assign a bucket to the relation * in this case. */ goto exit; } targetNamespace = importNamespace; } /* Did we already fetch the doc? */ if (bkt != NULL) { if ((WXS_IS_BUCKET_IMPMAIN(type)) && (! bkt->imported)) { /* * We included/redefined and then try to import a schema, * but the new location provided for import was different. */ if (schemaLocation == NULL) schemaLocation = BAD_CAST "in_memory_buffer"; if (!xmlStrEqual(schemaLocation, bkt->schemaLocation)) { xmlSchemaCustomErr(ACTXT_CAST pctxt, err, invokingNode, NULL, "The schema document '%s' cannot be imported, since " "it was already included or redefined", schemaLocation, NULL); goto exit; } } else if ((! WXS_IS_BUCKET_IMPMAIN(type)) && (bkt->imported)) { /* * We imported and then try to include/redefine a schema, * but the new location provided for the include/redefine * was different. */ if (schemaLocation == NULL) schemaLocation = BAD_CAST "in_memory_buffer"; if (!xmlStrEqual(schemaLocation, bkt->schemaLocation)) { xmlSchemaCustomErr(ACTXT_CAST pctxt, err, invokingNode, NULL, "The schema document '%s' cannot be included or " "redefined, since it was already imported", schemaLocation, NULL); goto exit; } } } if (WXS_IS_BUCKET_IMPMAIN(type)) { /* * Given that the schemaLocation [attribute] is only a hint, it is open * to applications to ignore all but the first for a given * namespace, regardless of the �actual value� of schemaLocation, but * such a strategy risks missing useful information when new * schemaLocations are offered. * * We will use the first that comes with a location. * Further s *with* a location, will result in an error. * TODO: Better would be to just report a warning here, but * we'll try it this way until someone complains. * * Schema Document Location Strategy: * 3 Based on the namespace name, identify an existing schema document, * either as a resource which is an XML document or a element * information item, in some local schema repository; * 5 Attempt to resolve the namespace name to locate such a resource. * * NOTE: (3) and (5) are not supported. */ if (bkt != NULL) { relation->bucket = bkt; goto exit; } bkt = xmlSchemaGetSchemaBucketByTNS(pctxt, importNamespace, 1); if (bkt != NULL) { relation->bucket = bkt; if (bkt->schemaLocation == NULL) { /* First given location of the schema; load the doc. */ bkt->schemaLocation = schemaLocation; } else { if (!xmlStrEqual(schemaLocation, bkt->schemaLocation)) { /* * Additional location given; just skip it. * URGENT TODO: We should report a warning here. * res = XML_SCHEMAP_SRC_IMPORT; */ if (schemaLocation == NULL) schemaLocation = BAD_CAST "in_memory_buffer"; xmlSchemaCustomWarning(ACTXT_CAST pctxt, XML_SCHEMAP_WARN_SKIP_SCHEMA, invokingNode, NULL, "Skipping import of schema located at '%s' for the " "namespace '%s', since this namespace was already " "imported with the schema located at '%s'", schemaLocation, importNamespace, bkt->schemaLocation); } goto exit; } } /* * No bucket + first location: load the doc and create a * bucket. */ } else { /* and */ if (bkt != NULL) { if ((bkt->origTargetNamespace == NULL) && (bkt->targetNamespace != sourceTargetNamespace)) { xmlSchemaBucketPtr chamel; /* * Chameleon include/redefine: skip loading only if it was * aleady build for the targetNamespace of the including * schema. */ /* * URGENT TODO: If the schema is a chameleon-include then copy * the components into the including schema and modify the * targetNamespace of those components, do nothing otherwise. * NOTE: This is currently worked-around by compiling the * chameleon for every destinct including targetNamespace; thus * not performant at the moment. * TODO: Check when the namespace in wildcards for chameleons * needs to be converted: before we built wildcard intersections * or after. * Answer: after! */ chamel = xmlSchemaGetChameleonSchemaBucket(pctxt, schemaLocation, sourceTargetNamespace); if (chamel != NULL) { /* A fitting chameleon was already parsed; NOP. */ relation->bucket = chamel; goto exit; } /* * We need to parse the chameleon again for a different * targetNamespace. * CHAMELEON TODO: Optimize this by only parsing the * chameleon once, and then copying the components to * the new targetNamespace. */ bkt = NULL; } else { relation->bucket = bkt; goto exit; } } } if ((bkt != NULL) && (bkt->doc != NULL)) { PERROR_INT("xmlSchemaAddSchemaDoc", "trying to load a schema doc, but a doc is already " "assigned to the schema bucket"); goto exit_failure; } doc_load: /* * Load the document. */ if (schemaDoc != NULL) { doc = schemaDoc; /* Don' free this one, since it was provided by the caller. */ preserveDoc = 1; /* TODO: Does the context or the doc hold the location? */ if (schemaDoc->URL != NULL) schemaLocation = xmlDictLookup(pctxt->dict, schemaDoc->URL, -1); else schemaLocation = BAD_CAST "in_memory_buffer"; } else if ((schemaLocation != NULL) || (schemaBuffer != NULL)) { xmlParserCtxtPtr parserCtxt; parserCtxt = xmlNewParserCtxt(); if (parserCtxt == NULL) { xmlSchemaPErrMemory(NULL, "xmlSchemaGetDoc, " "allocating a parser context", NULL); goto exit_failure; } if ((pctxt->dict != NULL) && (parserCtxt->dict != NULL)) { /* * TODO: Do we have to burden the schema parser dict with all * the content of the schema doc? */ xmlDictFree(parserCtxt->dict); parserCtxt->dict = pctxt->dict; xmlDictReference(parserCtxt->dict); } if (schemaLocation != NULL) { /* Parse from file. */ doc = xmlCtxtReadFile(parserCtxt, (const char *) schemaLocation, NULL, SCHEMAS_PARSE_OPTIONS); } else if (schemaBuffer != NULL) { /* Parse from memory buffer. */ doc = xmlCtxtReadMemory(parserCtxt, schemaBuffer, schemaBufferLen, NULL, NULL, SCHEMAS_PARSE_OPTIONS); schemaLocation = BAD_CAST "in_memory_buffer"; if (doc != NULL) doc->URL = xmlStrdup(schemaLocation); } /* * For : * 2.1 The referent is (a fragment of) a resource which is an * XML document (see clause 1.1), which in turn corresponds to * a element information item in a well-formed information * set, which in turn corresponds to a valid schema. * TODO: (2.1) fragments of XML documents are not supported. * * 2.2 The referent is a element information item in * a well-formed information set, which in turn corresponds * to a valid schema. * TODO: (2.2) is not supported. */ if (doc == NULL) { xmlErrorPtr lerr; lerr = xmlGetLastError(); /* * Check if this a parser error, or if the document could * just not be located. * TODO: Try to find specific error codes to react only on * localisation failures. */ if ((lerr == NULL) || (lerr->domain != XML_FROM_IO)) { /* * We assume a parser error here. */ located = 1; /* TODO: Error code ?? */ res = XML_SCHEMAP_SRC_IMPORT_2_1; xmlSchemaCustomErr(ACTXT_CAST pctxt, res, invokingNode, NULL, "Failed to parse the XML resource '%s'", schemaLocation, NULL); } } xmlFreeParserCtxt(parserCtxt); if ((doc == NULL) && located) goto exit_error; } else { xmlSchemaPErr(pctxt, NULL, XML_SCHEMAP_NOTHING_TO_PARSE, "No information for parsing was provided with the " "given schema parser context.\n", NULL, NULL); goto exit_failure; } /* * Preprocess the document. */ if (doc != NULL) { xmlNodePtr docElem = NULL; located = 1; docElem = xmlDocGetRootElement(doc); if (docElem == NULL) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOROOT, invokingNode, NULL, "The document '%s' has no document element", schemaLocation, NULL); goto exit_error; } /* * Remove all the blank text nodes. */ xmlSchemaCleanupDoc(pctxt, docElem); /* * Check the schema's top level element. */ if (!IS_SCHEMA(docElem, "schema")) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOT_SCHEMA, invokingNode, NULL, "The XML document '%s' is not a schema document", schemaLocation, NULL); goto exit_error; } /* * Note that we don't apply a type check for the * targetNamespace value here. */ targetNamespace = xmlSchemaGetProp(pctxt, docElem, "targetNamespace"); } /* after_doc_loading: */ if ((bkt == NULL) && located) { /* Only create a bucket if the schema was located. */ bkt = xmlSchemaBucketCreate(pctxt, type, targetNamespace); if (bkt == NULL) goto exit_failure; } if (bkt != NULL) { bkt->schemaLocation = schemaLocation; bkt->located = located; if (doc != NULL) { bkt->doc = doc; bkt->targetNamespace = targetNamespace; bkt->origTargetNamespace = targetNamespace; if (preserveDoc) bkt->preserveDoc = 1; } if (WXS_IS_BUCKET_IMPMAIN(type)) bkt->imported++; /* * Add it to the graph of schemas. */ if (relation != NULL) relation->bucket = bkt; } exit: /* * Return the bucket explicitely; this is needed for the * main schema. */ if (bucket != NULL) *bucket = bkt; return (0); exit_error: if ((doc != NULL) && (! preserveDoc)) { xmlFreeDoc(doc); if (bkt != NULL) bkt->doc = NULL; } return(pctxt->err); exit_failure: if ((doc != NULL) && (! preserveDoc)) { xmlFreeDoc(doc); if (bkt != NULL) bkt->doc = NULL; } return (-1); } /** * xmlSchemaParseImport: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Import definition * *WARNING* this interface is highly subject to change * * Returns 0 in case of success, a positive error code if * not valid and -1 in case of an internal error. */ static int xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node) { xmlNodePtr child; const xmlChar *namespaceName = NULL, *schemaLocation = NULL; const xmlChar *thisTargetNamespace; xmlAttrPtr attr; int ret = 0; xmlSchemaBucketPtr bucket = NULL; if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) return (-1); /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* * Extract and validate attributes. */ if (xmlSchemaPValAttr(pctxt, NULL, node, "namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), &namespaceName) != 0) { xmlSchemaPSimpleTypeErr(pctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, node, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL, namespaceName, NULL, NULL, NULL); return (pctxt->err); } if (xmlSchemaPValAttr(pctxt, NULL, node, "schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), &schemaLocation) != 0) { xmlSchemaPSimpleTypeErr(pctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, node, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL, namespaceName, NULL, NULL, NULL); return (pctxt->err); } /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * the annotation here is simply discarded ... * TODO: really? */ child = child->next; } if (child != NULL) { xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?)"); } /* * Apply additional constraints. * * Note that it is important to use the original @targetNamespace * (or none at all), to rule out imports of schemas _with_ a * @targetNamespace if the importing schema is a chameleon schema * (with no @targetNamespace). */ thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace; if (namespaceName != NULL) { /* * 1.1 If the namespace [attribute] is present, then its �actual value� * must not match the �actual value� of the enclosing 's * targetNamespace [attribute]. */ if (xmlStrEqual(thisTargetNamespace, namespaceName)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_SRC_IMPORT_1_1, NULL, node, "The value of the attribute 'namespace' must not match " "the target namespace '%s' of the importing schema", thisTargetNamespace); return (pctxt->err); } } else { /* * 1.2 If the namespace [attribute] is not present, then the enclosing * must have a targetNamespace [attribute]. */ if (thisTargetNamespace == NULL) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_SRC_IMPORT_1_2, NULL, node, "The attribute 'namespace' must be existent if " "the importing schema has no target namespace", NULL); return (pctxt->err); } } /* * Locate and acquire the schema document. */ if (schemaLocation != NULL) schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict, schemaLocation, node); ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT, schemaLocation, NULL, NULL, 0, node, thisTargetNamespace, namespaceName, &bucket); if (ret != 0) return(ret); /* * For : "It is *not* an error for the application * schema reference strategy to fail." * So just don't parse if no schema document was found. * Note that we will get no bucket if the schema could not be * located or if there was no schemaLocation. */ if ((bucket == NULL) && (schemaLocation != NULL)) { xmlSchemaCustomWarning(ACTXT_CAST pctxt, XML_SCHEMAP_WARN_UNLOCATED_SCHEMA, node, NULL, "Failed to locate a schema at location '%s'. " "Skipping the import", schemaLocation, NULL, NULL); } if ((bucket != NULL) && CAN_PARSE_SCHEMA(bucket)) { ret = xmlSchemaParseNewDoc(pctxt, schema, bucket); } return (ret); } static int xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlChar **schemaLocation, int type) { xmlAttrPtr attr; if ((pctxt == NULL) || (schema == NULL) || (node == NULL) || (schemaLocation == NULL)) return (-1); *schemaLocation = NULL; /* * Check for illegal attributes. * Applies for both and . */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); /* * Preliminary step, extract the URI-Reference and make an URI * from the base. */ /* * Attribute "schemaLocation" is mandatory. */ attr = xmlSchemaGetPropNode(node, "schemaLocation"); if (attr != NULL) { xmlChar *base = NULL; xmlChar *uri = NULL; if (xmlSchemaPValAttrNode(pctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), (const xmlChar **) schemaLocation) != 0) goto exit_error; base = xmlNodeGetBase(node->doc, node); if (base == NULL) { uri = xmlBuildURI(*schemaLocation, node->doc->URL); } else { uri = xmlBuildURI(*schemaLocation, base); xmlFree(base); } if (uri == NULL) { PERROR_INT("xmlSchemaParseIncludeOrRedefine", "could not build an URI from the schemaLocation") goto exit_failure; } (*schemaLocation) = (xmlChar *) xmlDictLookup(pctxt->dict, uri, -1); xmlFree(uri); } else { xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "schemaLocation", NULL); goto exit_error; } /* * Report self-inclusion and self-redefinition. */ if (xmlStrEqual(*schemaLocation, pctxt->URL)) { if (type == XML_SCHEMA_SCHEMA_REDEFINE) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_SRC_REDEFINE, NULL, node, "The schema document '%s' cannot redefine itself.", *schemaLocation); } else { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_SRC_INCLUDE, NULL, node, "The schema document '%s' cannot include itself.", *schemaLocation); } goto exit_error; } return(0); exit_error: return(pctxt->err); exit_failure: return(-1); } static int xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node, int type) { xmlNodePtr child = NULL; const xmlChar *schemaLocation = NULL; int res = 0; /* hasRedefinitions = 0 */ int isChameleon = 0, wasChameleon = 0; xmlSchemaBucketPtr bucket = NULL; if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) return (-1); /* * Parse attributes. Note that the returned schemaLocation will * be already converted to an absolute URI. */ res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt, schema, node, (xmlChar **) (&schemaLocation), type); if (res != 0) return(res); /* * Load and add the schema document. */ res = xmlSchemaAddSchemaDoc(pctxt, type, schemaLocation, NULL, NULL, 0, node, pctxt->targetNamespace, NULL, &bucket); if (res != 0) return(res); /* * If we get no schema bucket back, then this means that the schema * document could not be located or was broken XML or was not * a schema document. */ if ((bucket == NULL) || (bucket->doc == NULL)) { if (type == XML_SCHEMA_SCHEMA_INCLUDE) { /* * WARNING for : * We will raise an error if the schema cannot be located * for inclusions, since the that was the feedback from the * schema people. I.e. the following spec piece will *not* be * satisfied: * SPEC src-include: "It is not an error for the �actual value� of the * schemaLocation [attribute] to fail to resolve it all, in which * case no corresponding inclusion is performed. * So do we need a warning report here?" */ res = XML_SCHEMAP_SRC_INCLUDE; xmlSchemaCustomErr(ACTXT_CAST pctxt, res, node, NULL, "Failed to load the document '%s' for inclusion", schemaLocation, NULL); } else { /* * NOTE: This was changed to raise an error even if no redefinitions * are specified. * * SPEC src-redefine (1) * "If there are any element information items among the [children] * other than then the �actual value� of the * schemaLocation [attribute] must successfully resolve." * TODO: Ask the WG if a the location has always to resolve * here as well! */ res = XML_SCHEMAP_SRC_REDEFINE; xmlSchemaCustomErr(ACTXT_CAST pctxt, res, node, NULL, "Failed to load the document '%s' for redefinition", schemaLocation, NULL); } } else { /* * Check targetNamespace sanity before parsing the new schema. * TODO: Note that we won't check further content if the * targetNamespace was bad. */ if (bucket->origTargetNamespace != NULL) { /* * SPEC src-include (2.1) * "SII has a targetNamespace [attribute], and its �actual * value� is identical to the �actual value� of the targetNamespace * [attribute] of SII� (which must have such an [attribute])." */ if (pctxt->targetNamespace == NULL) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_SRC_INCLUDE, node, NULL, "The target namespace of the included/redefined schema " "'%s' has to be absent, since the including/redefining " "schema has no target namespace", schemaLocation, NULL); goto exit_error; } else if (!xmlStrEqual(bucket->origTargetNamespace, pctxt->targetNamespace)) { /* TODO: Change error function. */ xmlSchemaPCustomErrExt(pctxt, XML_SCHEMAP_SRC_INCLUDE, NULL, node, "The target namespace '%s' of the included/redefined " "schema '%s' differs from '%s' of the " "including/redefining schema", bucket->origTargetNamespace, schemaLocation, pctxt->targetNamespace); goto exit_error; } } else if (pctxt->targetNamespace != NULL) { /* * Chameleons: the original target namespace will * differ from the resulting namespace. */ isChameleon = 1; if (bucket->parsed && bucket->origTargetNamespace != NULL) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_SRC_INCLUDE, node, NULL, "The target namespace of the included/redefined schema " "'%s' has to be absent or the same as the " "including/redefining schema's target namespace", schemaLocation, NULL); goto exit_error; } bucket->targetNamespace = pctxt->targetNamespace; } } /* * Parse the schema. */ if (bucket && (!bucket->parsed) && (bucket->doc != NULL)) { if (isChameleon) { /* TODO: Get rid of this flag on the schema itself. */ if ((schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) { schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS; } else wasChameleon = 1; } xmlSchemaParseNewDoc(pctxt, schema, bucket); /* Restore chameleon flag. */ if (isChameleon && (!wasChameleon)) schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS; } /* * And now for the children... */ child = node->children; if (type == XML_SCHEMA_SCHEMA_REDEFINE) { /* * Parse (simpleType | complexType | group | attributeGroup))* */ pctxt->redefined = bucket; /* * How to proceed if the redefined schema was not located? */ pctxt->isRedefine = 1; while (IS_SCHEMA(child, "annotation") || IS_SCHEMA(child, "simpleType") || IS_SCHEMA(child, "complexType") || IS_SCHEMA(child, "group") || IS_SCHEMA(child, "attributeGroup")) { if (IS_SCHEMA(child, "annotation")) { /* * TODO: discard or not? */ } else if (IS_SCHEMA(child, "simpleType")) { xmlSchemaParseSimpleType(pctxt, schema, child, 1); } else if (IS_SCHEMA(child, "complexType")) { xmlSchemaParseComplexType(pctxt, schema, child, 1); /* hasRedefinitions = 1; */ } else if (IS_SCHEMA(child, "group")) { /* hasRedefinitions = 1; */ xmlSchemaParseModelGroupDefinition(pctxt, schema, child); } else if (IS_SCHEMA(child, "attributeGroup")) { /* hasRedefinitions = 1; */ xmlSchemaParseAttributeGroupDefinition(pctxt, schema, child); } child = child->next; } pctxt->redefined = NULL; pctxt->isRedefine = 0; } else { if (IS_SCHEMA(child, "annotation")) { /* * TODO: discard or not? */ child = child->next; } } if (child != NULL) { res = XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED; if (type == XML_SCHEMA_SCHEMA_REDEFINE) { xmlSchemaPContentErr(pctxt, res, NULL, node, child, NULL, "(annotation | (simpleType | complexType | group | attributeGroup))*"); } else { xmlSchemaPContentErr(pctxt, res, NULL, node, child, NULL, "(annotation?)"); } } return(res); exit_error: return(pctxt->err); } static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node) { int res; #ifndef ENABLE_REDEFINE TODO return(0); #endif res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node, XML_SCHEMA_SCHEMA_REDEFINE); if (res != 0) return(res); return(0); } static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node) { int res; res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node, XML_SCHEMA_SCHEMA_INCLUDE); if (res != 0) return(res); return(0); } /** * xmlSchemaParseModelGroup: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * @type: the "compositor" type * @particleNeeded: if a a model group with a particle * * parse a XML schema Sequence definition. * Applies parts of: * Schema Representation Constraint: * Redefinition Constraints and Semantics (src-redefine) * (6.1), (6.1.1), (6.1.2) * * Schema Component Constraint: * All Group Limited (cos-all-limited) (2) * TODO: Actually this should go to component-level checks, * but is done here due to performance. Move it to an other layer * is schema construction via an API is implemented. * * *WARNING* this interface is highly subject to change * * Returns -1 in case of error, 0 if the declaration is improper and * 1 in case of success. */ static xmlSchemaTreeItemPtr xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaTypeType type, int withParticle) { xmlSchemaModelGroupPtr item; xmlSchemaParticlePtr particle = NULL; xmlNodePtr child = NULL; xmlAttrPtr attr; int min = 1, max = 1, isElemRef, hasRefs = 0; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); /* * Create a model group with the given compositor. */ item = xmlSchemaAddModelGroup(ctxt, schema, type, node); if (item == NULL) return (NULL); if (withParticle) { if (type == XML_SCHEMA_TYPE_ALL) { min = xmlGetMinOccurs(ctxt, node, 0, 1, 1, "(0 | 1)"); max = xmlGetMaxOccurs(ctxt, node, 1, 1, 1, "1"); } else { /* choice + sequence */ min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)"); } xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); /* * Create a particle */ particle = xmlSchemaAddParticle(ctxt, node, min, max); if (particle == NULL) return (NULL); particle->children = (xmlSchemaTreeItemPtr) item; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && (!xmlStrEqual(attr->name, BAD_CAST "minOccurs"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } } else { /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if (!xmlStrEqual(attr->name, BAD_CAST "id")) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } } /* * Extract and validate attributes. */ xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } if (type == XML_SCHEMA_TYPE_ALL) { xmlSchemaParticlePtr part, last = NULL; while (IS_SCHEMA(child, "element")) { part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0); /* * SPEC cos-all-limited (2) * "The {max occurs} of all the particles in the {particles} * of the ('all') group must be 0 or 1. */ if (part != NULL) { if (isElemRef) hasRefs++; if (part->minOccurs > 1) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_COS_ALL_LIMITED, NULL, child, "Invalid value for minOccurs (must be 0 or 1)", NULL); /* Reset to 1. */ part->minOccurs = 1; } if (part->maxOccurs > 1) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_COS_ALL_LIMITED, NULL, child, "Invalid value for maxOccurs (must be 0 or 1)", NULL); /* Reset to 1. */ part->maxOccurs = 1; } if (last == NULL) item->children = (xmlSchemaTreeItemPtr) part; else last->next = (xmlSchemaTreeItemPtr) part; last = part; } child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (annotation?, element*)"); } } else { /* choice + sequence */ xmlSchemaTreeItemPtr part = NULL, last = NULL; while ((IS_SCHEMA(child, "element")) || (IS_SCHEMA(child, "group")) || (IS_SCHEMA(child, "any")) || (IS_SCHEMA(child, "choice")) || (IS_SCHEMA(child, "sequence"))) { if (IS_SCHEMA(child, "element")) { part = (xmlSchemaTreeItemPtr) xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0); if (part && isElemRef) hasRefs++; } else if (IS_SCHEMA(child, "group")) { part = xmlSchemaParseModelGroupDefRef(ctxt, schema, child); if (part != NULL) hasRefs++; /* * Handle redefinitions. */ if (ctxt->isRedefine && ctxt->redef && (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) && part && part->children) { if ((xmlSchemaGetQNameRefName(part->children) == ctxt->redef->refName) && (xmlSchemaGetQNameRefTargetNs(part->children) == ctxt->redef->refTargetNs)) { /* * SPEC src-redefine: * (6.1) "If it has a among its contents at * some level the �actual value� of whose ref * [attribute] is the same as the �actual value� of * its own name attribute plus target namespace, then * all of the following must be true:" * (6.1.1) "It must have exactly one such group." */ if (ctxt->redefCounter != 0) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_SRC_REDEFINE, child, NULL, "The redefining model group definition " "'%s' must not contain more than one " "reference to the redefined definition", xmlSchemaFormatQName(&str, ctxt->redef->refTargetNs, ctxt->redef->refName), NULL); FREE_AND_NULL(str) part = NULL; } else if (((WXS_PARTICLE(part))->minOccurs != 1) || ((WXS_PARTICLE(part))->maxOccurs != 1)) { xmlChar *str = NULL; /* * SPEC src-redefine: * (6.1.2) "The �actual value� of both that * group's minOccurs and maxOccurs [attribute] * must be 1 (or �absent�). */ xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_SRC_REDEFINE, child, NULL, "The redefining model group definition " "'%s' must not contain a reference to the " "redefined definition with a " "maxOccurs/minOccurs other than 1", xmlSchemaFormatQName(&str, ctxt->redef->refTargetNs, ctxt->redef->refName), NULL); FREE_AND_NULL(str) part = NULL; } ctxt->redef->reference = WXS_BASIC_CAST part; ctxt->redefCounter++; } } } else if (IS_SCHEMA(child, "any")) { part = (xmlSchemaTreeItemPtr) xmlSchemaParseAny(ctxt, schema, child); } else if (IS_SCHEMA(child, "choice")) { part = xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_CHOICE, 1); } else if (IS_SCHEMA(child, "sequence")) { part = xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_SEQUENCE, 1); } if (part != NULL) { if (last == NULL) item->children = part; else last->next = part; last = part; } child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (element | group | choice | sequence | any)*)"); } } if ((max == 0) && (min == 0)) return (NULL); if (hasRefs) { /* * We need to resolve references. */ WXS_ADD_PENDING(ctxt, item); } if (withParticle) return ((xmlSchemaTreeItemPtr) particle); else return ((xmlSchemaTreeItemPtr) item); } /** * xmlSchemaParseRestriction: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Restriction definition * *WARNING* this interface is highly subject to change * * Returns the type definition or NULL in case of error */ static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaTypeType parentType) { xmlSchemaTypePtr type; xmlNodePtr child = NULL; xmlAttrPtr attr; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); /* Not a component, don't create it. */ type = ctxt->ctxtType; type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "base"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } /* * Extract and validate attributes. */ xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * Attribute */ /* * Extract the base type. The "base" attribute is mandatory if inside * a complex type or if redefining. * * SPEC (1.2) "...otherwise ( has no " * among its [children]), the simple type definition which is * the {content type} of the type definition �resolved� to by * the �actual value� of the base [attribute]" */ if (xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base", &(type->baseNs), &(type->base)) == 0) { if ((type->base == NULL) && (type->type == XML_SCHEMA_TYPE_COMPLEX)) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "base", NULL); } else if ((ctxt->isRedefine) && (type->flags & XML_SCHEMAS_TYPE_GLOBAL)) { if (type->base == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "base", NULL); } else if ((! xmlStrEqual(type->base, type->name)) || (! xmlStrEqual(type->baseNs, type->targetNamespace))) { xmlChar *str1 = NULL, *str2 = NULL; /* * REDEFINE: SPEC src-redefine (5) * "Within the [children], each must have a * among its [children] ... the �actual value� of * whose base [attribute] must be the same as the �actual value� * of its own name attribute plus target namespace;" */ xmlSchemaPCustomErrExt(ctxt, XML_SCHEMAP_SRC_REDEFINE, NULL, node, "This is a redefinition, but the QName " "value '%s' of the 'base' attribute does not match the " "type's designation '%s'", xmlSchemaFormatQName(&str1, type->baseNs, type->base), xmlSchemaFormatQName(&str2, type->targetNamespace, type->name), NULL); FREE_AND_NULL(str1); FREE_AND_NULL(str2); /* Avoid confusion and erase the values. */ type->base = NULL; type->baseNs = NULL; } } } /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * Add the annotation to the simple type ancestor. */ xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, xmlSchemaParseAnnotation(ctxt, child, 1)); child = child->next; } if (parentType == XML_SCHEMA_TYPE_SIMPLE) { /* * Corresponds to . */ if (IS_SCHEMA(child, "simpleType")) { if (type->base != NULL) { /* * src-restriction-base-or-simpleType * Either the base [attribute] or the simpleType [child] of the * element must be present, but not both. */ xmlSchemaPContentErr(ctxt, XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, NULL, node, child, "The attribute 'base' and the child are " "mutually exclusive", NULL); } else { type->baseType = (xmlSchemaTypePtr) xmlSchemaParseSimpleType(ctxt, schema, child, 0); } child = child->next; } else if (type->base == NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, NULL, node, child, "Either the attribute 'base' or a child " "must be present", NULL); } } else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { /* * Corresponds to ... * followed by: * * Model groups , and . */ if (IS_SCHEMA(child, "all")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_ALL, 1); child = child->next; } else if (IS_SCHEMA(child, "choice")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_CHOICE, 1); child = child->next; } else if (IS_SCHEMA(child, "sequence")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_SEQUENCE, 1); child = child->next; /* * Model group reference . */ } else if (IS_SCHEMA(child, "group")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroupDefRef(ctxt, schema, child); /* * Note that the reference will be resolved in * xmlSchemaResolveTypeReferences(); */ child = child->next; } } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) { /* * Corresponds to ... * * "1.1 the simple type definition corresponding to the * among the [children] of if there is one;" */ if (IS_SCHEMA(child, "simpleType")) { /* * We will store the to-be-restricted simple type in * type->contentTypeDef *temporarily*. */ type->contentTypeDef = (xmlSchemaTypePtr) xmlSchemaParseSimpleType(ctxt, schema, child, 0); if ( type->contentTypeDef == NULL) return (NULL); child = child->next; } } if ((parentType == XML_SCHEMA_TYPE_SIMPLE) || (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) { xmlSchemaFacetPtr facet, lastfacet = NULL; /* * Corresponds to ... * ... */ /* * Add the facets to the simple type ancestor. */ /* * TODO: Datatypes: 4.1.3 Constraints on XML Representation of * Simple Type Definition Schema Representation Constraint: * *Single Facet Value* */ while ((IS_SCHEMA(child, "minInclusive")) || (IS_SCHEMA(child, "minExclusive")) || (IS_SCHEMA(child, "maxInclusive")) || (IS_SCHEMA(child, "maxExclusive")) || (IS_SCHEMA(child, "totalDigits")) || (IS_SCHEMA(child, "fractionDigits")) || (IS_SCHEMA(child, "pattern")) || (IS_SCHEMA(child, "enumeration")) || (IS_SCHEMA(child, "whiteSpace")) || (IS_SCHEMA(child, "length")) || (IS_SCHEMA(child, "maxLength")) || (IS_SCHEMA(child, "minLength"))) { facet = xmlSchemaParseFacet(ctxt, schema, child); if (facet != NULL) { if (lastfacet == NULL) type->facets = facet; else lastfacet->next = facet; lastfacet = facet; lastfacet->next = NULL; } child = child->next; } /* * Create links for derivation and validation. */ if (type->facets != NULL) { xmlSchemaFacetLinkPtr facetLink, lastFacetLink = NULL; facet = type->facets; do { facetLink = (xmlSchemaFacetLinkPtr) xmlMalloc(sizeof(xmlSchemaFacetLink)); if (facetLink == NULL) { xmlSchemaPErrMemory(ctxt, "allocating a facet link", NULL); xmlFree(facetLink); return (NULL); } facetLink->facet = facet; facetLink->next = NULL; if (lastFacetLink == NULL) type->facetSet = facetLink; else lastFacetLink->next = facetLink; lastFacetLink = facetLink; facet = facet->next; } while (facet != NULL); } } if (type->type == XML_SCHEMA_TYPE_COMPLEX) { /* * Attribute uses/declarations. */ if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, (xmlSchemaItemListPtr *) &(type->attrUses), XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1) return(NULL); /* * Attribute wildcard. */ if (IS_SCHEMA(child, "anyAttribute")) { type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child); child = child->next; } } if (child != NULL) { if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "annotation?, (group | all | choice | sequence)?, " "((attribute | attributeGroup)*, anyAttribute?))"); } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (simpleType?, (minExclusive | minInclusive | " "maxExclusive | maxInclusive | totalDigits | fractionDigits | " "length | minLength | maxLength | enumeration | whiteSpace | " "pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))"); } else { /* Simple type */ xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (simpleType?, (minExclusive | minInclusive | " "maxExclusive | maxInclusive | totalDigits | fractionDigits | " "length | minLength | maxLength | enumeration | whiteSpace | " "pattern)*))"); } } return (NULL); } /** * xmlSchemaParseExtension: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * Parses an , which is found inside a * or . * *WARNING* this interface is highly subject to change. * * TODO: Returns the type definition or NULL in case of error */ static xmlSchemaTypePtr xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaTypeType parentType) { xmlSchemaTypePtr type; xmlNodePtr child = NULL; xmlAttrPtr attr; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); /* Not a component, don't create it. */ type = ctxt->ctxtType; type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "base"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * Attribute "base" - mandatory. */ if ((xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base", &(type->baseNs), &(type->base)) == 0) && (type->base == NULL)) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "base", NULL); } /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * Add the annotation to the type ancestor. */ xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, xmlSchemaParseAnnotation(ctxt, child, 1)); child = child->next; } if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { /* * Corresponds to ... and: * * Model groups , , and . */ if (IS_SCHEMA(child, "all")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_ALL, 1); child = child->next; } else if (IS_SCHEMA(child, "choice")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_CHOICE, 1); child = child->next; } else if (IS_SCHEMA(child, "sequence")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_SEQUENCE, 1); child = child->next; } else if (IS_SCHEMA(child, "group")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroupDefRef(ctxt, schema, child); /* * Note that the reference will be resolved in * xmlSchemaResolveTypeReferences(); */ child = child->next; } } if (child != NULL) { /* * Attribute uses/declarations. */ if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, (xmlSchemaItemListPtr *) &(type->attrUses), XML_SCHEMA_TYPE_EXTENSION, NULL) == -1) return(NULL); /* * Attribute wildcard. */ if (IS_SCHEMA(child, "anyAttribute")) { ctxt->ctxtType->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child); child = child->next; } } if (child != NULL) { if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { /* Complex content extension. */ xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, ((group | all | choice | sequence)?, " "((attribute | attributeGroup)*, anyAttribute?)))"); } else { /* Simple content extension. */ xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, ((attribute | attributeGroup)*, " "anyAttribute?))"); } } return (NULL); } /** * xmlSchemaParseSimpleContent: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema SimpleContent definition * *WARNING* this interface is highly subject to change * * Returns the type definition or NULL in case of error */ static int xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, int *hasRestrictionOrExtension) { xmlSchemaTypePtr type; xmlNodePtr child = NULL; xmlAttrPtr attr; if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || (hasRestrictionOrExtension == NULL)) return (-1); *hasRestrictionOrExtension = 0; /* Not a component, don't create it. */ type = ctxt->ctxtType; type->contentType = XML_SCHEMA_CONTENT_SIMPLE; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * Add the annotation to the complex type ancestor. */ xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, xmlSchemaParseAnnotation(ctxt, child, 1)); child = child->next; } if (child == NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, NULL, node, NULL, NULL, "(annotation?, (restriction | extension))"); } if (child == NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, NULL, node, NULL, NULL, "(annotation?, (restriction | extension))"); } if (IS_SCHEMA(child, "restriction")) { xmlSchemaParseRestriction(ctxt, schema, child, XML_SCHEMA_TYPE_SIMPLE_CONTENT); (*hasRestrictionOrExtension) = 1; child = child->next; } else if (IS_SCHEMA(child, "extension")) { xmlSchemaParseExtension(ctxt, schema, child, XML_SCHEMA_TYPE_SIMPLE_CONTENT); (*hasRestrictionOrExtension) = 1; child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (restriction | extension))"); } return (0); } /** * xmlSchemaParseComplexContent: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema ComplexContent definition * *WARNING* this interface is highly subject to change * * Returns the type definition or NULL in case of error */ static int xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, int *hasRestrictionOrExtension) { xmlSchemaTypePtr type; xmlNodePtr child = NULL; xmlAttrPtr attr; if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || (hasRestrictionOrExtension == NULL)) return (-1); *hasRestrictionOrExtension = 0; /* Not a component, don't create it. */ type = ctxt->ctxtType; /* * Check for illegal attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && (!xmlStrEqual(attr->name, BAD_CAST "mixed"))) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); /* * Set the 'mixed' on the complex type ancestor. */ if (xmlGetBooleanProp(ctxt, node, "mixed", 0)) { if ((type->flags & XML_SCHEMAS_TYPE_MIXED) == 0) type->flags |= XML_SCHEMAS_TYPE_MIXED; } child = node->children; if (IS_SCHEMA(child, "annotation")) { /* * Add the annotation to the complex type ancestor. */ xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, xmlSchemaParseAnnotation(ctxt, child, 1)); child = child->next; } if (child == NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, NULL, node, NULL, NULL, "(annotation?, (restriction | extension))"); } if (child == NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, NULL, node, NULL, NULL, "(annotation?, (restriction | extension))"); } if (IS_SCHEMA(child, "restriction")) { xmlSchemaParseRestriction(ctxt, schema, child, XML_SCHEMA_TYPE_COMPLEX_CONTENT); (*hasRestrictionOrExtension) = 1; child = child->next; } else if (IS_SCHEMA(child, "extension")) { xmlSchemaParseExtension(ctxt, schema, child, XML_SCHEMA_TYPE_COMPLEX_CONTENT); (*hasRestrictionOrExtension) = 1; child = child->next; } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (restriction | extension))"); } return (0); } /** * xmlSchemaParseComplexType: * @ctxt: a schema validation context * @schema: the schema being built * @node: a subtree containing XML Schema informations * * parse a XML schema Complex Type definition * *WARNING* this interface is highly subject to change * * Returns the type definition or NULL in case of error */ static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, int topLevel) { xmlSchemaTypePtr type, ctxtType; xmlNodePtr child = NULL; const xmlChar *name = NULL; xmlAttrPtr attr; const xmlChar *attrValue; #ifdef ENABLE_NAMED_LOCALS char buf[40]; #endif int final = 0, block = 0, hasRestrictionOrExtension = 0; if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) return (NULL); ctxtType = ctxt->ctxtType; if (topLevel) { attr = xmlSchemaGetPropNode(node, "name"); if (attr == NULL) { xmlSchemaPMissingAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); return (NULL); } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr, xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { return (NULL); } } if (topLevel == 0) { /* * Parse as local complex type definition. */ #ifdef ENABLE_NAMED_LOCALS snprintf(buf, 39, "#CT%d", ctxt->counter++ + 1); type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_COMPLEX, xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1), ctxt->targetNamespace, node, 0); #else type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_COMPLEX, NULL, ctxt->targetNamespace, node, 0); #endif if (type == NULL) return (NULL); name = type->name; type->node = node; type->type = XML_SCHEMA_TYPE_COMPLEX; /* * TODO: We need the target namespace. */ } else { /* * Parse as global complex type definition. */ type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_COMPLEX, name, ctxt->targetNamespace, node, 1); if (type == NULL) return (NULL); type->node = node; type->type = XML_SCHEMA_TYPE_COMPLEX; type->flags |= XML_SCHEMAS_TYPE_GLOBAL; } type->targetNamespace = ctxt->targetNamespace; /* * Handle attributes. */ attr = node->properties; while (attr != NULL) { if (attr->ns == NULL) { if (xmlStrEqual(attr->name, BAD_CAST "id")) { /* * Attribute "id". */ xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); } else if (xmlStrEqual(attr->name, BAD_CAST "mixed")) { /* * Attribute "mixed". */ if (xmlSchemaPGetBoolNodeValue(ctxt, NULL, (xmlNodePtr) attr)) type->flags |= XML_SCHEMAS_TYPE_MIXED; } else if (topLevel) { /* * Attributes of global complex type definitions. */ if (xmlStrEqual(attr->name, BAD_CAST "name")) { /* Pass. */ } else if (xmlStrEqual(attr->name, BAD_CAST "abstract")) { /* * Attribute "abstract". */ if (xmlSchemaPGetBoolNodeValue(ctxt, NULL, (xmlNodePtr) attr)) type->flags |= XML_SCHEMAS_TYPE_ABSTRACT; } else if (xmlStrEqual(attr->name, BAD_CAST "final")) { /* * Attribute "final". */ attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags), -1, XML_SCHEMAS_TYPE_FINAL_EXTENSION, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1, -1, -1) != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(#all | List of (extension | restriction))", attrValue, NULL, NULL, NULL); } else final = 1; } else if (xmlStrEqual(attr->name, BAD_CAST "block")) { /* * Attribute "block". */ attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags), -1, XML_SCHEMAS_TYPE_BLOCK_EXTENSION, XML_SCHEMAS_TYPE_BLOCK_RESTRICTION, -1, -1, -1) != 0) { xmlSchemaPSimpleTypeErr(ctxt, XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, NULL, (xmlNodePtr) attr, NULL, "(#all | List of (extension | restriction)) ", attrValue, NULL, NULL, NULL); } else block = 1; } else { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { xmlSchemaPIllegalAttrErr(ctxt, XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); } attr = attr->next; } if (! block) { /* * Apply default "block" values. */ if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; } if (! final) { /* * Apply default "block" values. */ if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION; if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION; } /* * And now for the children... */ child = node->children; if (IS_SCHEMA(child, "annotation")) { type->annot = xmlSchemaParseAnnotation(ctxt, child, 1); child = child->next; } ctxt->ctxtType = type; if (IS_SCHEMA(child, "simpleContent")) { /* * ... * 3.4.3 : 2.2 * Specifying mixed='true' when the * alternative is chosen has no effect */ if (type->flags & XML_SCHEMAS_TYPE_MIXED) type->flags ^= XML_SCHEMAS_TYPE_MIXED; xmlSchemaParseSimpleContent(ctxt, schema, child, &hasRestrictionOrExtension); child = child->next; } else if (IS_SCHEMA(child, "complexContent")) { /* * ... */ type->contentType = XML_SCHEMA_CONTENT_EMPTY; xmlSchemaParseComplexContent(ctxt, schema, child, &hasRestrictionOrExtension); child = child->next; } else { /* * E.g ... or ... etc. * * SPEC * "...the third alternative (neither nor * ) is chosen. This case is understood as shorthand * for complex content restricting the �ur-type definition�, and the * details of the mappings should be modified as necessary. */ type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION; /* * Parse model groups. */ if (IS_SCHEMA(child, "all")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_ALL, 1); child = child->next; } else if (IS_SCHEMA(child, "choice")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_CHOICE, 1); child = child->next; } else if (IS_SCHEMA(child, "sequence")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroup(ctxt, schema, child, XML_SCHEMA_TYPE_SEQUENCE, 1); child = child->next; } else if (IS_SCHEMA(child, "group")) { type->subtypes = (xmlSchemaTypePtr) xmlSchemaParseModelGroupDefRef(ctxt, schema, child); /* * Note that the reference will be resolved in * xmlSchemaResolveTypeReferences(); */ child = child->next; } /* * Parse attribute decls/refs. */ if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, (xmlSchemaItemListPtr *) &(type->attrUses), XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1) return(NULL); /* * Parse attribute wildcard. */ if (IS_SCHEMA(child, "anyAttribute")) { type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child); child = child->next; } } if (child != NULL) { xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, NULL, node, child, NULL, "(annotation?, (simpleContent | complexContent | " "((group | all | choice | sequence)?, ((attribute | " "attributeGroup)*, anyAttribute?))))"); } /* * REDEFINE: SPEC src-redefine (5) */ if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, NULL, node, "This is a redefinition, thus the " " must have a or " "grand-child", NULL); } ctxt->ctxtType = ctxtType; return (type); } /************************************************************************ * * * Validating using Schemas * * * ************************************************************************/ /************************************************************************ * * * Reading/Writing Schemas * * * ************************************************************************/ #if 0 /* Will be enabled if it is clear what options are needed. */ /** * xmlSchemaParserCtxtSetOptions: * @ctxt: a schema parser context * @options: a combination of xmlSchemaParserOption * * Sets the options to be used during the parse. * * Returns 0 in case of success, -1 in case of an * API error. */ static int xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt, int options) { int i; if (ctxt == NULL) return (-1); /* * WARNING: Change the start value if adding to the * xmlSchemaParseOption. */ for (i = 1; i < (int) sizeof(int) * 8; i++) { if (options & 1<options = options; return (0); } /** * xmlSchemaValidCtxtGetOptions: * @ctxt: a schema parser context * * Returns the option combination of the parser context. */ static int xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt) { if (ctxt == NULL) return (-1); else return (ctxt->options); } #endif /** * xmlSchemaNewParserCtxt: * @URL: the location of the schema * * Create an XML Schemas parse context for that file/resource expected * to contain an XML Schemas file. * * Returns the parser context or NULL in case of error */ xmlSchemaParserCtxtPtr xmlSchemaNewParserCtxt(const char *URL) { xmlSchemaParserCtxtPtr ret; if (URL == NULL) return (NULL); ret = xmlSchemaParserCtxtCreate(); if (ret == NULL) return(NULL); ret->dict = xmlDictCreate(); ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1); return (ret); } /** * xmlSchemaNewMemParserCtxt: * @buffer: a pointer to a char array containing the schemas * @size: the size of the array * * Create an XML Schemas parse context for that memory buffer expected * to contain an XML Schemas file. * * Returns the parser context or NULL in case of error */ xmlSchemaParserCtxtPtr xmlSchemaNewMemParserCtxt(const char *buffer, int size) { xmlSchemaParserCtxtPtr ret; if ((buffer == NULL) || (size <= 0)) return (NULL); ret = xmlSchemaParserCtxtCreate(); if (ret == NULL) return(NULL); ret->buffer = buffer; ret->size = size; ret->dict = xmlDictCreate(); return (ret); } /** * xmlSchemaNewDocParserCtxt: * @doc: a preparsed document tree * * Create an XML Schemas parse context for that document. * NB. The document may be modified during the parsing process. * * Returns the parser context or NULL in case of error */ xmlSchemaParserCtxtPtr xmlSchemaNewDocParserCtxt(xmlDocPtr doc) { xmlSchemaParserCtxtPtr ret; if (doc == NULL) return (NULL); ret = xmlSchemaParserCtxtCreate(); if (ret == NULL) return(NULL); ret->doc = doc; ret->dict = xmlDictCreate(); /* The application has responsibility for the document */ ret->preserve = 1; return (ret); } /** * xmlSchemaFreeParserCtxt: * @ctxt: the schema parser context * * Free the resources associated to the schema parser context */ void xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt) { if (ctxt == NULL) return; if (ctxt->doc != NULL && !ctxt->preserve) xmlFreeDoc(ctxt->doc); if (ctxt->vctxt != NULL) { xmlSchemaFreeValidCtxt(ctxt->vctxt); } if (ctxt->ownsConstructor && (ctxt->constructor != NULL)) { xmlSchemaConstructionCtxtFree(ctxt->constructor); ctxt->constructor = NULL; ctxt->ownsConstructor = 0; } if (ctxt->attrProhibs != NULL) xmlSchemaItemListFree(ctxt->attrProhibs); xmlDictFree(ctxt->dict); xmlFree(ctxt); } /************************************************************************ * * * Building the content models * * * ************************************************************************/ /** * xmlSchemaBuildContentModelForSubstGroup: * * Returns 1 if nillable, 0 otherwise */ static int xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt, xmlSchemaParticlePtr particle, int counter, xmlAutomataStatePtr end) { xmlAutomataStatePtr start, tmp; xmlSchemaElementPtr elemDecl, member; xmlSchemaSubstGroupPtr substGroup; int i; int ret = 0; elemDecl = (xmlSchemaElementPtr) particle->children; /* * Wrap the substitution group with a CHOICE. */ start = pctxt->state; if (end == NULL) end = xmlAutomataNewState(pctxt->am); substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl); if (substGroup == NULL) { xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle), XML_SCHEMAP_INTERNAL, "Internal error: xmlSchemaBuildContentModelForSubstGroup, " "declaration is marked having a subst. group but none " "available.\n", elemDecl->name, NULL); return(0); } if (counter >= 0) { /* * NOTE that we put the declaration in, even if it's abstract. * However, an error will be raised during *validation* if an element * information item shall be validated against an abstract element * declaration. */ tmp = xmlAutomataNewCountedTrans(pctxt->am, start, NULL, counter); xmlAutomataNewTransition2(pctxt->am, tmp, end, elemDecl->name, elemDecl->targetNamespace, elemDecl); /* * Add subst. group members. */ for (i = 0; i < substGroup->members->nbItems; i++) { member = (xmlSchemaElementPtr) substGroup->members->items[i]; xmlAutomataNewTransition2(pctxt->am, tmp, end, member->name, member->targetNamespace, member); } } else if (particle->maxOccurs == 1) { /* * NOTE that we put the declaration in, even if it's abstract, */ xmlAutomataNewEpsilon(pctxt->am, xmlAutomataNewTransition2(pctxt->am, start, NULL, elemDecl->name, elemDecl->targetNamespace, elemDecl), end); /* * Add subst. group members. */ for (i = 0; i < substGroup->members->nbItems; i++) { member = (xmlSchemaElementPtr) substGroup->members->items[i]; /* * NOTE: This fixes bug #341150. xmlAutomataNewOnceTrans2() * was incorrectly used instead of xmlAutomataNewTransition2() * (seems like a copy&paste bug from the XML_SCHEMA_TYPE_ALL * section in xmlSchemaBuildAContentModel() ). * TODO: Check if xmlAutomataNewOnceTrans2() was instead * intended for the above "counter" section originally. I.e., * check xs:all with subst-groups. * * tmp = xmlAutomataNewOnceTrans2(pctxt->am, start, NULL, * member->name, member->targetNamespace, * 1, 1, member); */ tmp = xmlAutomataNewTransition2(pctxt->am, start, NULL, member->name, member->targetNamespace, member); xmlAutomataNewEpsilon(pctxt->am, tmp, end); } } else { xmlAutomataStatePtr hop; int maxOccurs = particle->maxOccurs == UNBOUNDED ? UNBOUNDED : particle->maxOccurs - 1; int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs); hop = xmlAutomataNewState(pctxt->am); xmlAutomataNewEpsilon(pctxt->am, xmlAutomataNewTransition2(pctxt->am, start, NULL, elemDecl->name, elemDecl->targetNamespace, elemDecl), hop); /* * Add subst. group members. */ for (i = 0; i < substGroup->members->nbItems; i++) { member = (xmlSchemaElementPtr) substGroup->members->items[i]; xmlAutomataNewEpsilon(pctxt->am, xmlAutomataNewTransition2(pctxt->am, start, NULL, member->name, member->targetNamespace, member), hop); } xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter); xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); } if (particle->minOccurs == 0) { xmlAutomataNewEpsilon(pctxt->am, start, end); ret = 1; } pctxt->state = end; return(ret); } /** * xmlSchemaBuildContentModelForElement: * * Returns 1 if nillable, 0 otherwise */ static int xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr particle) { int ret = 0; if (((xmlSchemaElementPtr) particle->children)->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) { /* * Substitution groups. */ ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1, NULL); } else { xmlSchemaElementPtr elemDecl; xmlAutomataStatePtr start; elemDecl = (xmlSchemaElementPtr) particle->children; if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) return(0); if (particle->maxOccurs == 1) { start = ctxt->state; ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, elemDecl->name, elemDecl->targetNamespace, elemDecl); } else if ((particle->maxOccurs >= UNBOUNDED) && (particle->minOccurs < 2)) { /* Special case. */ start = ctxt->state; ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, elemDecl->name, elemDecl->targetNamespace, elemDecl); ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state, elemDecl->name, elemDecl->targetNamespace, elemDecl); } else { int counter; int maxOccurs = particle->maxOccurs == UNBOUNDED ? UNBOUNDED : particle->maxOccurs - 1; int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs); ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, elemDecl->name, elemDecl->targetNamespace, elemDecl); xmlAutomataNewCountedTrans(ctxt->am, ctxt->state, start, counter); ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state, NULL, counter); } if (particle->minOccurs == 0) { xmlAutomataNewEpsilon(ctxt->am, start, ctxt->state); ret = 1; } } return(ret); } /** * xmlSchemaBuildAContentModel: * @ctxt: the schema parser context * @particle: the particle component * @name: the complex type's name whose content is being built * * Create the automaton for the {content type} of a complex type. * * Returns 1 if the content is nillable, 0 otherwise */ static int xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt, xmlSchemaParticlePtr particle) { int ret = 0, tmp2; if (particle == NULL) { PERROR_INT("xmlSchemaBuildAContentModel", "particle is NULL"); return(1); } if (particle->children == NULL) { /* * Just return in this case. A missing "term" of the particle * might arise due to an invalid "term" component. */ return(1); } switch (particle->children->type) { case XML_SCHEMA_TYPE_ANY: { xmlAutomataStatePtr start, end; xmlSchemaWildcardPtr wild; xmlSchemaWildcardNsPtr ns; wild = (xmlSchemaWildcardPtr) particle->children; start = pctxt->state; end = xmlAutomataNewState(pctxt->am); if (particle->maxOccurs == 1) { if (wild->any == 1) { /* * We need to add both transitions: * * 1. the {"*", "*"} for elements in a namespace. */ pctxt->state = xmlAutomataNewTransition2(pctxt->am, start, NULL, BAD_CAST "*", BAD_CAST "*", wild); xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); /* * 2. the {"*"} for elements in no namespace. */ pctxt->state = xmlAutomataNewTransition2(pctxt->am, start, NULL, BAD_CAST "*", NULL, wild); xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); } else if (wild->nsSet != NULL) { ns = wild->nsSet; do { pctxt->state = start; pctxt->state = xmlAutomataNewTransition2(pctxt->am, pctxt->state, NULL, BAD_CAST "*", ns->value, wild); xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); ns = ns->next; } while (ns != NULL); } else if (wild->negNsSet != NULL) { pctxt->state = xmlAutomataNewNegTrans(pctxt->am, start, end, BAD_CAST "*", wild->negNsSet->value, wild); } } else { int counter; xmlAutomataStatePtr hop; int maxOccurs = particle->maxOccurs == UNBOUNDED ? UNBOUNDED : particle->maxOccurs - 1; int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs); hop = xmlAutomataNewState(pctxt->am); if (wild->any == 1) { pctxt->state = xmlAutomataNewTransition2(pctxt->am, start, NULL, BAD_CAST "*", BAD_CAST "*", wild); xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); pctxt->state = xmlAutomataNewTransition2(pctxt->am, start, NULL, BAD_CAST "*", NULL, wild); xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); } else if (wild->nsSet != NULL) { ns = wild->nsSet; do { pctxt->state = xmlAutomataNewTransition2(pctxt->am, start, NULL, BAD_CAST "*", ns->value, wild); xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); ns = ns->next; } while (ns != NULL); } else if (wild->negNsSet != NULL) { pctxt->state = xmlAutomataNewNegTrans(pctxt->am, start, hop, BAD_CAST "*", wild->negNsSet->value, wild); } xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter); xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); } if (particle->minOccurs == 0) { xmlAutomataNewEpsilon(pctxt->am, start, end); ret = 1; } pctxt->state = end; break; } case XML_SCHEMA_TYPE_ELEMENT: ret = xmlSchemaBuildContentModelForElement(pctxt, particle); break; case XML_SCHEMA_TYPE_SEQUENCE:{ xmlSchemaTreeItemPtr sub; ret = 1; /* * If max and min occurances are default (1) then * simply iterate over the particles of the . */ if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) { sub = particle->children->children; while (sub != NULL) { tmp2 = xmlSchemaBuildAContentModel(pctxt, (xmlSchemaParticlePtr) sub); if (tmp2 != 1) ret = 0; sub = sub->next; } } else { xmlAutomataStatePtr oldstate = pctxt->state; if (particle->maxOccurs >= UNBOUNDED) { if (particle->minOccurs > 1) { xmlAutomataStatePtr tmp; int counter; pctxt->state = xmlAutomataNewEpsilon(pctxt->am, oldstate, NULL); oldstate = pctxt->state; counter = xmlAutomataNewCounter(pctxt->am, particle->minOccurs - 1, UNBOUNDED); sub = particle->children->children; while (sub != NULL) { tmp2 = xmlSchemaBuildAContentModel(pctxt, (xmlSchemaParticlePtr) sub); if (tmp2 != 1) ret = 0; sub = sub->next; } tmp = pctxt->state; xmlAutomataNewCountedTrans(pctxt->am, tmp, oldstate, counter); pctxt->state = xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL, counter); if (ret == 1) xmlAutomataNewEpsilon(pctxt->am, oldstate, pctxt->state); } else { pctxt->state = xmlAutomataNewEpsilon(pctxt->am, oldstate, NULL); oldstate = pctxt->state; sub = particle->children->children; while (sub != NULL) { tmp2 = xmlSchemaBuildAContentModel(pctxt, (xmlSchemaParticlePtr) sub); if (tmp2 != 1) ret = 0; sub = sub->next; } xmlAutomataNewEpsilon(pctxt->am, pctxt->state, oldstate); /* * epsilon needed to block previous trans from * being allowed to enter back from another * construct */ pctxt->state = xmlAutomataNewEpsilon(pctxt->am, pctxt->state, NULL); if (particle->minOccurs == 0) { xmlAutomataNewEpsilon(pctxt->am, oldstate, pctxt->state); ret = 1; } } } else if ((particle->maxOccurs > 1) || (particle->minOccurs > 1)) { xmlAutomataStatePtr tmp; int counter; pctxt->state = xmlAutomataNewEpsilon(pctxt->am, oldstate, NULL); oldstate = pctxt->state; counter = xmlAutomataNewCounter(pctxt->am, particle->minOccurs - 1, particle->maxOccurs - 1); sub = particle->children->children; while (sub != NULL) { tmp2 = xmlSchemaBuildAContentModel(pctxt, (xmlSchemaParticlePtr) sub); if (tmp2 != 1) ret = 0; sub = sub->next; } tmp = pctxt->state; xmlAutomataNewCountedTrans(pctxt->am, tmp, oldstate, counter); pctxt->state = xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL, counter); if ((particle->minOccurs == 0) || (ret == 1)) { xmlAutomataNewEpsilon(pctxt->am, oldstate, pctxt->state); ret = 1; } } else { sub = particle->children->children; while (sub != NULL) { tmp2 = xmlSchemaBuildAContentModel(pctxt, (xmlSchemaParticlePtr) sub); if (tmp2 != 1) ret = 0; sub = sub->next; } /* * epsilon needed to block previous trans from * being allowed to enter back from another * construct */ pctxt->state = xmlAutomataNewEpsilon(pctxt->am, pctxt->state, NULL); if (particle->minOccurs == 0) { xmlAutomataNewEpsilon(pctxt->am, oldstate, pctxt->state); ret = 1; } } } break; } case XML_SCHEMA_TYPE_CHOICE:{ xmlSchemaTreeItemPtr sub; xmlAutomataStatePtr start, end; ret = 0; start = pctxt->state; end = xmlAutomataNewState(pctxt->am); /* * iterate over the subtypes and remerge the end with an * epsilon transition */ if (particle->maxOccurs == 1) { sub = particle->children->children; while (sub != NULL) { pctxt->state = start; tmp2 = xmlSchemaBuildAContentModel(pctxt, (xmlSchemaParticlePtr) sub); if (tmp2 == 1) ret = 1; xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); sub = sub->next; } } else { int counter; xmlAutomataStatePtr hop, base; int maxOccurs = particle->maxOccurs == UNBOUNDED ? UNBOUNDED : particle->maxOccurs - 1; int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; /* * use a counter to keep track of the number of transtions * which went through the choice. */ counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs); hop = xmlAutomataNewState(pctxt->am); base = xmlAutomataNewState(pctxt->am); sub = particle->children->children; while (sub != NULL) { pctxt->state = base; tmp2 = xmlSchemaBuildAContentModel(pctxt, (xmlSchemaParticlePtr) sub); if (tmp2 == 1) ret = 1; xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); sub = sub->next; } xmlAutomataNewEpsilon(pctxt->am, start, base); xmlAutomataNewCountedTrans(pctxt->am, hop, base, counter); xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); if (ret == 1) xmlAutomataNewEpsilon(pctxt->am, base, end); } if (particle->minOccurs == 0) { xmlAutomataNewEpsilon(pctxt->am, start, end); ret = 1; } pctxt->state = end; break; } case XML_SCHEMA_TYPE_ALL:{ xmlAutomataStatePtr start, tmp; xmlSchemaParticlePtr sub; xmlSchemaElementPtr elemDecl; ret = 1; sub = (xmlSchemaParticlePtr) particle->children->children; if (sub == NULL) break; ret = 0; start = pctxt->state; tmp = xmlAutomataNewState(pctxt->am); xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp); pctxt->state = tmp; while (sub != NULL) { pctxt->state = tmp; elemDecl = (xmlSchemaElementPtr) sub->children; if (elemDecl == NULL) { PERROR_INT("xmlSchemaBuildAContentModel", " particle has no term"); return(ret); }; /* * NOTE: The {max occurs} of all the particles in the * {particles} of the group must be 0 or 1; this is * already ensured during the parse of the content of * . */ if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) { int counter; /* * This is an abstract group, we need to share * the same counter for all the element transitions * derived from the group */ counter = xmlAutomataNewCounter(pctxt->am, sub->minOccurs, sub->maxOccurs); xmlSchemaBuildContentModelForSubstGroup(pctxt, sub, counter, pctxt->state); } else { if ((sub->minOccurs == 1) && (sub->maxOccurs == 1)) { xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state, pctxt->state, elemDecl->name, elemDecl->targetNamespace, 1, 1, elemDecl); } else if ((sub->minOccurs == 0) && (sub->maxOccurs == 1)) { xmlAutomataNewCountTrans2(pctxt->am, pctxt->state, pctxt->state, elemDecl->name, elemDecl->targetNamespace, 0, 1, elemDecl); } } sub = (xmlSchemaParticlePtr) sub->next; } pctxt->state = xmlAutomataNewAllTrans(pctxt->am, pctxt->state, NULL, 0); if (particle->minOccurs == 0) { xmlAutomataNewEpsilon(pctxt->am, start, pctxt->state); ret = 1; } break; } case XML_SCHEMA_TYPE_GROUP: /* * If we hit a model group definition, then this means that * it was empty, thus was not substituted for the containing * model group. Just do nothing in this case. * TODO: But the group should be substituted and not occur at * all in the content model at this point. Fix this. */ ret = 1; break; default: xmlSchemaInternalErr2(ACTXT_CAST pctxt, "xmlSchemaBuildAContentModel", "found unexpected term of type '%s' in content model", WXS_ITEM_TYPE_NAME(particle->children), NULL); return(ret); } return(ret); } /** * xmlSchemaBuildContentModel: * @ctxt: the schema parser context * @type: the complex type definition * @name: the element name * * Builds the content model of the complex type. */ static void xmlSchemaBuildContentModel(xmlSchemaTypePtr type, xmlSchemaParserCtxtPtr ctxt) { if ((type->type != XML_SCHEMA_TYPE_COMPLEX) || (type->contModel != NULL) || ((type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) && (type->contentType != XML_SCHEMA_CONTENT_MIXED))) return; #ifdef DEBUG_CONTENT xmlGenericError(xmlGenericErrorContext, "Building content model for %s\n", name); #endif ctxt->am = NULL; ctxt->am = xmlNewAutomata(); if (ctxt->am == NULL) { xmlGenericError(xmlGenericErrorContext, "Cannot create automata for complex type %s\n", type->name); return; } ctxt->state = xmlAutomataGetInitState(ctxt->am); /* * Build the automaton. */ xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(type)); xmlAutomataSetFinalState(ctxt->am, ctxt->state); type->contModel = xmlAutomataCompile(ctxt->am); if (type->contModel == NULL) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL, WXS_BASIC_CAST type, type->node, "Failed to compile the content model", NULL); } else if (xmlRegexpIsDeterminist(type->contModel) != 1) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_NOT_DETERMINISTIC, /* XML_SCHEMAS_ERR_NOTDETERMINIST, */ WXS_BASIC_CAST type, type->node, "The content model is not determinist", NULL); } else { #ifdef DEBUG_CONTENT_REGEXP xmlGenericError(xmlGenericErrorContext, "Content model of %s:\n", type->name); xmlRegexpPrint(stderr, type->contModel); #endif } ctxt->state = NULL; xmlFreeAutomata(ctxt->am); ctxt->am = NULL; } /** * xmlSchemaResolveElementReferences: * @elem: the schema element context * @ctxt: the schema parser context * * Resolves the references of an element declaration * or particle, which has an element declaration as it's * term. */ static void xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl, xmlSchemaParserCtxtPtr ctxt) { if ((ctxt == NULL) || (elemDecl == NULL) || ((elemDecl != NULL) && (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED))) return; elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED; if ((elemDecl->subtypes == NULL) && (elemDecl->namedType != NULL)) { xmlSchemaTypePtr type; /* (type definition) ... otherwise the type definition �resolved� * to by the �actual value� of the type [attribute] ... */ type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType, elemDecl->namedTypeNs); if (type == NULL) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST elemDecl, elemDecl->node, "type", elemDecl->namedType, elemDecl->namedTypeNs, XML_SCHEMA_TYPE_BASIC, "type definition"); } else elemDecl->subtypes = type; } if (elemDecl->substGroup != NULL) { xmlSchemaElementPtr substHead; /* * FIXME TODO: Do we need a new field in _xmlSchemaElement for * substitutionGroup? */ substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup, elemDecl->substGroupNs); if (substHead == NULL) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST elemDecl, NULL, "substitutionGroup", elemDecl->substGroup, elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT, NULL); } else { xmlSchemaResolveElementReferences(substHead, ctxt); /* * Set the "substitution group affiliation". * NOTE that now we use the "refDecl" field for this. */ WXS_SUBST_HEAD(elemDecl) = substHead; /* * The type definitions is set to: * SPEC "...the {type definition} of the element * declaration �resolved� to by the �actual value� * of the substitutionGroup [attribute], if present" */ if (elemDecl->subtypes == NULL) elemDecl->subtypes = substHead->subtypes; } } /* * SPEC "The definition of anyType serves as the default type definition * for element declarations whose XML representation does not specify one." */ if ((elemDecl->subtypes == NULL) && (elemDecl->namedType == NULL) && (elemDecl->substGroup == NULL)) elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); } /** * xmlSchemaResolveUnionMemberTypes: * @ctxt: the schema parser context * @type: the schema simple type definition * * Checks and builds the "member type definitions" property of the union * simple type. This handles part (1), part (2) is done in * xmlSchemaFinishMemberTypeDefinitionsProperty() * * Returns -1 in case of an internal error, 0 otherwise. */ static int xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaTypePtr type) { xmlSchemaTypeLinkPtr link, lastLink, newLink; xmlSchemaTypePtr memberType; /* * SPEC (1) "If the alternative is chosen, then [Definition:] * define the explicit members as the type definitions �resolved� * to by the items in the �actual value� of the memberTypes [attribute], * if any, followed by the type definitions corresponding to the * s among the [children] of , if any." */ /* * Resolve references. */ link = type->memberTypes; lastLink = NULL; while (link != NULL) { const xmlChar *name, *nsName; name = ((xmlSchemaQNameRefPtr) link->type)->name; nsName = ((xmlSchemaQNameRefPtr) link->type)->targetNamespace; memberType = xmlSchemaGetType(ctxt->schema, name, nsName); if ((memberType == NULL) || (! WXS_IS_SIMPLE(memberType))) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST type, type->node, "memberTypes", name, nsName, XML_SCHEMA_TYPE_SIMPLE, NULL); /* * Remove the member type link. */ if (lastLink == NULL) type->memberTypes = link->next; else lastLink->next = link->next; newLink = link; link = link->next; xmlFree(newLink); } else { link->type = memberType; lastLink = link; link = link->next; } } /* * Add local simple types, */ memberType = type->subtypes; while (memberType != NULL) { link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink)); if (link == NULL) { xmlSchemaPErrMemory(ctxt, "allocating a type link", NULL); return (-1); } link->type = memberType; link->next = NULL; if (lastLink == NULL) type->memberTypes = link; else lastLink->next = link; lastLink = link; memberType = memberType->next; } return (0); } /** * xmlSchemaIsDerivedFromBuiltInType: * @ctxt: the schema parser context * @type: the type definition * @valType: the value type * * * Returns 1 if the type has the given value type, or * is derived from such a type. */ static int xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType) { if (type == NULL) return (0); if (WXS_IS_COMPLEX(type)) return (0); if (type->type == XML_SCHEMA_TYPE_BASIC) { if (type->builtInType == valType) return(1); if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) || (type->builtInType == XML_SCHEMAS_ANYTYPE)) return (0); return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); } return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); } #if 0 /** * xmlSchemaIsDerivedFromBuiltInType: * @ctxt: the schema parser context * @type: the type definition * @valType: the value type * * * Returns 1 if the type has the given value type, or * is derived from such a type. */ static int xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType) { if (type == NULL) return (0); if (WXS_IS_COMPLEX(type)) return (0); if (type->type == XML_SCHEMA_TYPE_BASIC) { if (type->builtInType == valType) return(1); return (0); } else return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); return (0); } static xmlSchemaTypePtr xmlSchemaQueryBuiltInType(xmlSchemaTypePtr type) { if (type == NULL) return (NULL); if (WXS_IS_COMPLEX(type)) return (NULL); if (type->type == XML_SCHEMA_TYPE_BASIC) return(type); return(xmlSchemaQueryBuiltInType(type->subtypes)); } #endif /** * xmlSchemaGetPrimitiveType: * @type: the simpleType definition * * Returns the primitive type of the given type or * NULL in case of error. */ static xmlSchemaTypePtr xmlSchemaGetPrimitiveType(xmlSchemaTypePtr type) { while (type != NULL) { /* * Note that anySimpleType is actually not a primitive type * but we need that here. */ if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) || (type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE)) return (type); type = type->baseType; } return (NULL); } #if 0 /** * xmlSchemaGetBuiltInTypeAncestor: * @type: the simpleType definition * * Returns the primitive type of the given type or * NULL in case of error. */ static xmlSchemaTypePtr xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr type) { if (WXS_IS_LIST(type) || WXS_IS_UNION(type)) return (0); while (type != NULL) { if (type->type == XML_SCHEMA_TYPE_BASIC) return (type); type = type->baseType; } return (NULL); } #endif /** * xmlSchemaCloneWildcardNsConstraints: * @ctxt: the schema parser context * @dest: the destination wildcard * @source: the source wildcard * * Clones the namespace constraints of source * and assignes them to dest. * Returns -1 on internal error, 0 otherwise. */ static int xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt, xmlSchemaWildcardPtr dest, xmlSchemaWildcardPtr source) { xmlSchemaWildcardNsPtr cur, tmp, last; if ((source == NULL) || (dest == NULL)) return(-1); dest->any = source->any; cur = source->nsSet; last = NULL; while (cur != NULL) { tmp = xmlSchemaNewWildcardNsConstraint(ctxt); if (tmp == NULL) return(-1); tmp->value = cur->value; if (last == NULL) dest->nsSet = tmp; else last->next = tmp; last = tmp; cur = cur->next; } if (dest->negNsSet != NULL) xmlSchemaFreeWildcardNsSet(dest->negNsSet); if (source->negNsSet != NULL) { dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); if (dest->negNsSet == NULL) return(-1); dest->negNsSet->value = source->negNsSet->value; } else dest->negNsSet = NULL; return(0); } /** * xmlSchemaUnionWildcards: * @ctxt: the schema parser context * @completeWild: the first wildcard * @curWild: the second wildcard * * Unions the namespace constraints of the given wildcards. * @completeWild will hold the resulting union. * Returns a positive error code on failure, -1 in case of an * internal error, 0 otherwise. */ static int xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt, xmlSchemaWildcardPtr completeWild, xmlSchemaWildcardPtr curWild) { xmlSchemaWildcardNsPtr cur, curB, tmp; /* * 1 If O1 and O2 are the same value, then that value must be the * value. */ if ((completeWild->any == curWild->any) && ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) && ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) { if ((completeWild->negNsSet == NULL) || (completeWild->negNsSet->value == curWild->negNsSet->value)) { if (completeWild->nsSet != NULL) { int found = 0; /* * Check equality of sets. */ cur = completeWild->nsSet; while (cur != NULL) { found = 0; curB = curWild->nsSet; while (curB != NULL) { if (cur->value == curB->value) { found = 1; break; } curB = curB->next; } if (!found) break; cur = cur->next; } if (found) return(0); } else return(0); } } /* * 2 If either O1 or O2 is any, then any must be the value */ if (completeWild->any != curWild->any) { if (completeWild->any == 0) { completeWild->any = 1; if (completeWild->nsSet != NULL) { xmlSchemaFreeWildcardNsSet(completeWild->nsSet); completeWild->nsSet = NULL; } if (completeWild->negNsSet != NULL) { xmlFree(completeWild->negNsSet); completeWild->negNsSet = NULL; } } return (0); } /* * 3 If both O1 and O2 are sets of (namespace names or �absent�), * then the union of those sets must be the value. */ if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) { int found; xmlSchemaWildcardNsPtr start; cur = curWild->nsSet; start = completeWild->nsSet; while (cur != NULL) { found = 0; curB = start; while (curB != NULL) { if (cur->value == curB->value) { found = 1; break; } curB = curB->next; } if (!found) { tmp = xmlSchemaNewWildcardNsConstraint(ctxt); if (tmp == NULL) return (-1); tmp->value = cur->value; tmp->next = completeWild->nsSet; completeWild->nsSet = tmp; } cur = cur->next; } return(0); } /* * 4 If the two are negations of different values (namespace names * or �absent�), then a pair of not and �absent� must be the value. */ if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) && (completeWild->negNsSet->value != curWild->negNsSet->value)) { completeWild->negNsSet->value = NULL; return(0); } /* * 5. */ if (((completeWild->negNsSet != NULL) && (completeWild->negNsSet->value != NULL) && (curWild->nsSet != NULL)) || ((curWild->negNsSet != NULL) && (curWild->negNsSet->value != NULL) && (completeWild->nsSet != NULL))) { int nsFound, absentFound = 0; if (completeWild->nsSet != NULL) { cur = completeWild->nsSet; curB = curWild->negNsSet; } else { cur = curWild->nsSet; curB = completeWild->negNsSet; } nsFound = 0; while (cur != NULL) { if (cur->value == NULL) absentFound = 1; else if (cur->value == curB->value) nsFound = 1; if (nsFound && absentFound) break; cur = cur->next; } if (nsFound && absentFound) { /* * 5.1 If the set S includes both the negated namespace * name and �absent�, then any must be the value. */ completeWild->any = 1; if (completeWild->nsSet != NULL) { xmlSchemaFreeWildcardNsSet(completeWild->nsSet); completeWild->nsSet = NULL; } if (completeWild->negNsSet != NULL) { xmlFree(completeWild->negNsSet); completeWild->negNsSet = NULL; } } else if (nsFound && (!absentFound)) { /* * 5.2 If the set S includes the negated namespace name * but not �absent�, then a pair of not and �absent� must * be the value. */ if (completeWild->nsSet != NULL) { xmlSchemaFreeWildcardNsSet(completeWild->nsSet); completeWild->nsSet = NULL; } if (completeWild->negNsSet == NULL) { completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); if (completeWild->negNsSet == NULL) return (-1); } completeWild->negNsSet->value = NULL; } else if ((!nsFound) && absentFound) { /* * 5.3 If the set S includes �absent� but not the negated * namespace name, then the union is not expressible. */ xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_UNION_NOT_EXPRESSIBLE, "The union of the wilcard is not expressible.\n", NULL, NULL); return(XML_SCHEMAP_UNION_NOT_EXPRESSIBLE); } else if ((!nsFound) && (!absentFound)) { /* * 5.4 If the set S does not include either the negated namespace * name or �absent�, then whichever of O1 or O2 is a pair of not * and a namespace name must be the value. */ if (completeWild->negNsSet == NULL) { if (completeWild->nsSet != NULL) { xmlSchemaFreeWildcardNsSet(completeWild->nsSet); completeWild->nsSet = NULL; } completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); if (completeWild->negNsSet == NULL) return (-1); completeWild->negNsSet->value = curWild->negNsSet->value; } } return (0); } /* * 6. */ if (((completeWild->negNsSet != NULL) && (completeWild->negNsSet->value == NULL) && (curWild->nsSet != NULL)) || ((curWild->negNsSet != NULL) && (curWild->negNsSet->value == NULL) && (completeWild->nsSet != NULL))) { if (completeWild->nsSet != NULL) { cur = completeWild->nsSet; } else { cur = curWild->nsSet; } while (cur != NULL) { if (cur->value == NULL) { /* * 6.1 If the set S includes �absent�, then any must be the * value. */ completeWild->any = 1; if (completeWild->nsSet != NULL) { xmlSchemaFreeWildcardNsSet(completeWild->nsSet); completeWild->nsSet = NULL; } if (completeWild->negNsSet != NULL) { xmlFree(completeWild->negNsSet); completeWild->negNsSet = NULL; } return (0); } cur = cur->next; } if (completeWild->negNsSet == NULL) { /* * 6.2 If the set S does not include �absent�, then a pair of not * and �absent� must be the value. */ if (completeWild->nsSet != NULL) { xmlSchemaFreeWildcardNsSet(completeWild->nsSet); completeWild->nsSet = NULL; } completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); if (completeWild->negNsSet == NULL) return (-1); completeWild->negNsSet->value = NULL; } return (0); } return (0); } /** * xmlSchemaIntersectWildcards: * @ctxt: the schema parser context * @completeWild: the first wildcard * @curWild: the second wildcard * * Intersects the namespace constraints of the given wildcards. * @completeWild will hold the resulting intersection. * Returns a positive error code on failure, -1 in case of an * internal error, 0 otherwise. */ static int xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt, xmlSchemaWildcardPtr completeWild, xmlSchemaWildcardPtr curWild) { xmlSchemaWildcardNsPtr cur, curB, prev, tmp; /* * 1 If O1 and O2 are the same value, then that value must be the * value. */ if ((completeWild->any == curWild->any) && ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) && ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) { if ((completeWild->negNsSet == NULL) || (completeWild->negNsSet->value == curWild->negNsSet->value)) { if (completeWild->nsSet != NULL) { int found = 0; /* * Check equality of sets. */ cur = completeWild->nsSet; while (cur != NULL) { found = 0; curB = curWild->nsSet; while (curB != NULL) { if (cur->value == curB->value) { found = 1; break; } curB = curB->next; } if (!found) break; cur = cur->next; } if (found) return(0); } else return(0); } } /* * 2 If either O1 or O2 is any, then the other must be the value. */ if ((completeWild->any != curWild->any) && (completeWild->any)) { if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1) return(-1); return(0); } /* * 3 If either O1 or O2 is a pair of not and a value (a namespace * name or �absent�) and the other is a set of (namespace names or * �absent�), then that set, minus the negated value if it was in * the set, minus �absent� if it was in the set, must be the value. */ if (((completeWild->negNsSet != NULL) && (curWild->nsSet != NULL)) || ((curWild->negNsSet != NULL) && (completeWild->nsSet != NULL))) { const xmlChar *neg; if (completeWild->nsSet == NULL) { neg = completeWild->negNsSet->value; if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1) return(-1); } else neg = curWild->negNsSet->value; /* * Remove absent and negated. */ prev = NULL; cur = completeWild->nsSet; while (cur != NULL) { if (cur->value == NULL) { if (prev == NULL) completeWild->nsSet = cur->next; else prev->next = cur->next; xmlFree(cur); break; } prev = cur; cur = cur->next; } if (neg != NULL) { prev = NULL; cur = completeWild->nsSet; while (cur != NULL) { if (cur->value == neg) { if (prev == NULL) completeWild->nsSet = cur->next; else prev->next = cur->next; xmlFree(cur); break; } prev = cur; cur = cur->next; } } return(0); } /* * 4 If both O1 and O2 are sets of (namespace names or �absent�), * then the intersection of those sets must be the value. */ if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) { int found; cur = completeWild->nsSet; prev = NULL; while (cur != NULL) { found = 0; curB = curWild->nsSet; while (curB != NULL) { if (cur->value == curB->value) { found = 1; break; } curB = curB->next; } if (!found) { if (prev == NULL) completeWild->nsSet = cur->next; else prev->next = cur->next; tmp = cur->next; xmlFree(cur); cur = tmp; continue; } prev = cur; cur = cur->next; } return(0); } /* 5 If the two are negations of different namespace names, * then the intersection is not expressible */ if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) && (completeWild->negNsSet->value != curWild->negNsSet->value) && (completeWild->negNsSet->value != NULL) && (curWild->negNsSet->value != NULL)) { xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE, "The intersection of the wilcard is not expressible.\n", NULL, NULL); return(XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE); } /* * 6 If the one is a negation of a namespace name and the other * is a negation of �absent�, then the one which is the negation * of a namespace name must be the value. */ if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) && (completeWild->negNsSet->value != curWild->negNsSet->value) && (completeWild->negNsSet->value == NULL)) { completeWild->negNsSet->value = curWild->negNsSet->value; } return(0); } /** * xmlSchemaIsWildcardNsConstraintSubset: * @ctxt: the schema parser context * @sub: the first wildcard * @super: the second wildcard * * Schema Component Constraint: Wildcard Subset (cos-ns-subset) * * Returns 0 if the namespace constraint of @sub is an intensional * subset of @super, 1 otherwise. */ static int xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub, xmlSchemaWildcardPtr super) { /* * 1 super must be any. */ if (super->any) return (0); /* * 2.1 sub must be a pair of not and a namespace name or �absent�. * 2.2 super must be a pair of not and the same value. */ if ((sub->negNsSet != NULL) && (super->negNsSet != NULL) && (sub->negNsSet->value == super->negNsSet->value)) return (0); /* * 3.1 sub must be a set whose members are either namespace names or �absent�. */ if (sub->nsSet != NULL) { /* * 3.2.1 super must be the same set or a superset thereof. */ if (super->nsSet != NULL) { xmlSchemaWildcardNsPtr cur, curB; int found = 0; cur = sub->nsSet; while (cur != NULL) { found = 0; curB = super->nsSet; while (curB != NULL) { if (cur->value == curB->value) { found = 1; break; } curB = curB->next; } if (!found) return (1); cur = cur->next; } if (found) return (0); } else if (super->negNsSet != NULL) { xmlSchemaWildcardNsPtr cur; /* * 3.2.2 super must be a pair of not and a namespace name or * �absent� and that value must not be in sub's set. */ cur = sub->nsSet; while (cur != NULL) { if (cur->value == super->negNsSet->value) return (1); cur = cur->next; } return (0); } } return (1); } static int xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse, int *fixed, const xmlChar **value, xmlSchemaValPtr *val) { *fixed = 0; *value = NULL; if (val != 0) *val = NULL; if (attruse->defValue != NULL) { *value = attruse->defValue; if (val != NULL) *val = attruse->defVal; if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED) *fixed = 1; return(1); } else if ((attruse->attrDecl != NULL) && (attruse->attrDecl->defValue != NULL)) { *value = attruse->attrDecl->defValue; if (val != NULL) *val = attruse->attrDecl->defVal; if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED) *fixed = 1; return(1); } return(0); } /** * xmlSchemaCheckCVCWildcardNamespace: * @wild: the wildcard * @ns: the namespace * * Validation Rule: Wildcard allows Namespace Name * (cvc-wildcard-namespace) * * Returns 0 if the given namespace matches the wildcard, * 1 otherwise and -1 on API errors. */ static int xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild, const xmlChar* ns) { if (wild == NULL) return(-1); if (wild->any) return(0); else if (wild->nsSet != NULL) { xmlSchemaWildcardNsPtr cur; cur = wild->nsSet; while (cur != NULL) { if (xmlStrEqual(cur->value, ns)) return(0); cur = cur->next; } } else if ((wild->negNsSet != NULL) && (ns != NULL) && (!xmlStrEqual(wild->negNsSet->value, ns))) return(0); return(1); } #define XML_SCHEMA_ACTION_DERIVE 0 #define XML_SCHEMA_ACTION_REDEFINE 1 #define WXS_ACTION_STR(a) \ ((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined" /* * Schema Component Constraint: * Derivation Valid (Restriction, Complex) * derivation-ok-restriction (2) - (4) * * ATTENTION: * In XML Schema 1.1 this will be: * Validation Rule: * Checking complex type subsumption (practicalSubsumption) (1, 2 and 3) * */ static int xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt, int action, xmlSchemaBasicItemPtr item, xmlSchemaBasicItemPtr baseItem, xmlSchemaItemListPtr uses, xmlSchemaItemListPtr baseUses, xmlSchemaWildcardPtr wild, xmlSchemaWildcardPtr baseWild) { xmlSchemaAttributeUsePtr cur = NULL, bcur; int i, j, found; /* err = 0; */ const xmlChar *bEffValue; int effFixed; if (uses != NULL) { for (i = 0; i < uses->nbItems; i++) { cur = uses->items[i]; found = 0; if (baseUses == NULL) goto not_found; for (j = 0; j < baseUses->nbItems; j++) { bcur = baseUses->items[j]; if ((WXS_ATTRUSE_DECL_NAME(cur) == WXS_ATTRUSE_DECL_NAME(bcur)) && (WXS_ATTRUSE_DECL_TNS(cur) == WXS_ATTRUSE_DECL_TNS(bcur))) { /* * (2.1) "If there is an attribute use in the {attribute * uses} of the {base type definition} (call this B) whose * {attribute declaration} has the same {name} and {target * namespace}, then all of the following must be true:" */ found = 1; if ((cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) && (bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED)) { xmlChar *str = NULL; /* * (2.1.1) "one of the following must be true:" * (2.1.1.1) "B's {required} is false." * (2.1.1.2) "R's {required} is true." */ xmlSchemaPAttrUseErr4(pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1, WXS_ITEM_NODE(item), item, cur, "The 'optional' attribute use is inconsistent " "with the corresponding 'required' attribute use of " "the %s %s", WXS_ACTION_STR(action), xmlSchemaGetComponentDesignation(&str, baseItem), NULL, NULL); FREE_AND_NULL(str); /* err = pctxt->err; */ } else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, WXS_ATTRUSE_TYPEDEF(cur), WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0) { xmlChar *strA = NULL, *strB = NULL, *strC = NULL; /* * SPEC (2.1.2) "R's {attribute declaration}'s * {type definition} must be validly derived from * B's {type definition} given the empty set as * defined in Type Derivation OK (Simple) (�3.14.6)." */ xmlSchemaPAttrUseErr4(pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2, WXS_ITEM_NODE(item), item, cur, "The attribute declaration's %s " "is not validly derived from " "the corresponding %s of the " "attribute declaration in the %s %s", xmlSchemaGetComponentDesignation(&strA, WXS_ATTRUSE_TYPEDEF(cur)), xmlSchemaGetComponentDesignation(&strB, WXS_ATTRUSE_TYPEDEF(bcur)), WXS_ACTION_STR(action), xmlSchemaGetComponentDesignation(&strC, baseItem)); /* xmlSchemaGetComponentDesignation(&str, baseItem), */ FREE_AND_NULL(strA); FREE_AND_NULL(strB); FREE_AND_NULL(strC); /* err = pctxt->err; */ } else { /* * 2.1.3 [Definition:] Let the effective value * constraint of an attribute use be its {value * constraint}, if present, otherwise its {attribute * declaration}'s {value constraint} . */ xmlSchemaGetEffectiveValueConstraint(bcur, &effFixed, &bEffValue, NULL); /* * 2.1.3 ... one of the following must be true * * 2.1.3.1 B's �effective value constraint� is * �absent� or default. */ if ((bEffValue != NULL) && (effFixed == 1)) { const xmlChar *rEffValue = NULL; xmlSchemaGetEffectiveValueConstraint(bcur, &effFixed, &rEffValue, NULL); /* * 2.1.3.2 R's �effective value constraint� is * fixed with the same string as B's. * MAYBE TODO: Compare the computed values. * Hmm, it says "same string" so * string-equality might really be sufficient. */ if ((effFixed == 0) || (! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue))) { xmlChar *str = NULL; xmlSchemaPAttrUseErr4(pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3, WXS_ITEM_NODE(item), item, cur, "The effective value constraint of the " "attribute use is inconsistent with " "its correspondent in the %s %s", WXS_ACTION_STR(action), xmlSchemaGetComponentDesignation(&str, baseItem), NULL, NULL); FREE_AND_NULL(str); /* err = pctxt->err; */ } } } break; } } not_found: if (!found) { /* * (2.2) "otherwise the {base type definition} must have an * {attribute wildcard} and the {target namespace} of the * R's {attribute declaration} must be �valid� with respect * to that wildcard, as defined in Wildcard allows Namespace * Name (�3.10.4)." */ if ((baseWild == NULL) || (xmlSchemaCheckCVCWildcardNamespace(baseWild, (WXS_ATTRUSE_DECL(cur))->targetNamespace) != 0)) { xmlChar *str = NULL; xmlSchemaPAttrUseErr4(pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2, WXS_ITEM_NODE(item), item, cur, "Neither a matching attribute use, " "nor a matching wildcard exists in the %s %s", WXS_ACTION_STR(action), xmlSchemaGetComponentDesignation(&str, baseItem), NULL, NULL); FREE_AND_NULL(str); /* err = pctxt->err; */ } } } } /* * SPEC derivation-ok-restriction (3): * (3) "For each attribute use in the {attribute uses} of the {base type * definition} whose {required} is true, there must be an attribute * use with an {attribute declaration} with the same {name} and * {target namespace} as its {attribute declaration} in the {attribute * uses} of the complex type definition itself whose {required} is true. */ if (baseUses != NULL) { for (j = 0; j < baseUses->nbItems; j++) { bcur = baseUses->items[j]; if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED) continue; found = 0; if (uses != NULL) { for (i = 0; i < uses->nbItems; i++) { cur = uses->items[i]; if ((WXS_ATTRUSE_DECL_NAME(cur) == WXS_ATTRUSE_DECL_NAME(bcur)) && (WXS_ATTRUSE_DECL_TNS(cur) == WXS_ATTRUSE_DECL_TNS(bcur))) { found = 1; break; } } } if (!found) { xmlChar *strA = NULL, *strB = NULL; xmlSchemaCustomErr4(ACTXT_CAST pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3, NULL, item, "A matching attribute use for the " "'required' %s of the %s %s is missing", xmlSchemaGetComponentDesignation(&strA, bcur), WXS_ACTION_STR(action), xmlSchemaGetComponentDesignation(&strB, baseItem), NULL); FREE_AND_NULL(strA); FREE_AND_NULL(strB); } } } /* * derivation-ok-restriction (4) */ if (wild != NULL) { /* * (4) "If there is an {attribute wildcard}, all of the * following must be true:" */ if (baseWild == NULL) { xmlChar *str = NULL; /* * (4.1) "The {base type definition} must also have one." */ xmlSchemaCustomErr4(ACTXT_CAST pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1, NULL, item, "The %s has an attribute wildcard, " "but the %s %s '%s' does not have one", WXS_ITEM_TYPE_NAME(item), WXS_ACTION_STR(action), WXS_ITEM_TYPE_NAME(baseItem), xmlSchemaGetComponentQName(&str, baseItem)); FREE_AND_NULL(str); return(pctxt->err); } else if ((baseWild->any == 0) && xmlSchemaCheckCOSNSSubset(wild, baseWild)) { xmlChar *str = NULL; /* * (4.2) "The complex type definition's {attribute wildcard}'s * {namespace constraint} must be a subset of the {base type * definition}'s {attribute wildcard}'s {namespace constraint}, * as defined by Wildcard Subset (�3.10.6)." */ xmlSchemaCustomErr4(ACTXT_CAST pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2, NULL, item, "The attribute wildcard is not a valid " "subset of the wildcard in the %s %s '%s'", WXS_ACTION_STR(action), WXS_ITEM_TYPE_NAME(baseItem), xmlSchemaGetComponentQName(&str, baseItem), NULL); FREE_AND_NULL(str); return(pctxt->err); } /* 4.3 Unless the {base type definition} is the �ur-type * definition�, the complex type definition's {attribute * wildcard}'s {process contents} must be identical to or * stronger than the {base type definition}'s {attribute * wildcard}'s {process contents}, where strict is stronger * than lax is stronger than skip. */ if ((! WXS_IS_ANYTYPE(baseItem)) && (wild->processContents < baseWild->processContents)) { xmlChar *str = NULL; xmlSchemaCustomErr4(ACTXT_CAST pctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3, NULL, baseItem, "The {process contents} of the attribute wildcard is " "weaker than the one in the %s %s '%s'", WXS_ACTION_STR(action), WXS_ITEM_TYPE_NAME(baseItem), xmlSchemaGetComponentQName(&str, baseItem), NULL); FREE_AND_NULL(str) return(pctxt->err); } } return(0); } static int xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt, xmlSchemaBasicItemPtr item, xmlSchemaWildcardPtr *completeWild, xmlSchemaItemListPtr list, xmlSchemaItemListPtr prohibs); /** * xmlSchemaFixupTypeAttributeUses: * @ctxt: the schema parser context * @type: the complex type definition * * * Builds the wildcard and the attribute uses on the given complex type. * Returns -1 if an internal error occurs, 0 otherwise. * * ATTENTION TODO: Experimantally this uses pointer comparisons for * strings, so recheck this if we start to hardcode some schemata, since * they might not be in the same dict. * NOTE: It is allowed to "extend" the xs:anyType type. */ static int xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { xmlSchemaTypePtr baseType = NULL; xmlSchemaAttributeUsePtr use; xmlSchemaItemListPtr uses, baseUses, prohibs = NULL; if (type->baseType == NULL) { PERROR_INT("xmlSchemaFixupTypeAttributeUses", "no base type"); return (-1); } baseType = type->baseType; if (WXS_IS_TYPE_NOT_FIXED(baseType)) if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1) return(-1); uses = type->attrUses; baseUses = baseType->attrUses; /* * Expand attribute group references. And build the 'complete' * wildcard, i.e. intersect multiple wildcards. * Move attribute prohibitions into a separate list. */ if (uses != NULL) { if (WXS_IS_RESTRICTION(type)) { /* * This one will transfer all attr. prohibitions * into pctxt->attrProhibs. */ if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST type, &(type->attributeWildcard), uses, pctxt->attrProhibs) == -1) { PERROR_INT("xmlSchemaFixupTypeAttributeUses", "failed to expand attributes"); } if (pctxt->attrProhibs->nbItems != 0) prohibs = pctxt->attrProhibs; } else { if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST type, &(type->attributeWildcard), uses, NULL) == -1) { PERROR_INT("xmlSchemaFixupTypeAttributeUses", "failed to expand attributes"); } } } /* * Inherit the attribute uses of the base type. */ if (baseUses != NULL) { int i, j; xmlSchemaAttributeUseProhibPtr pro; if (WXS_IS_RESTRICTION(type)) { int usesCount; xmlSchemaAttributeUsePtr tmp; if (uses != NULL) usesCount = uses->nbItems; else usesCount = 0; /* Restriction. */ for (i = 0; i < baseUses->nbItems; i++) { use = baseUses->items[i]; if (prohibs) { /* * Filter out prohibited uses. */ for (j = 0; j < prohibs->nbItems; j++) { pro = prohibs->items[j]; if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) && (WXS_ATTRUSE_DECL_TNS(use) == pro->targetNamespace)) { goto inherit_next; } } } if (usesCount) { /* * Filter out existing uses. */ for (j = 0; j < usesCount; j++) { tmp = uses->items[j]; if ((WXS_ATTRUSE_DECL_NAME(use) == WXS_ATTRUSE_DECL_NAME(tmp)) && (WXS_ATTRUSE_DECL_TNS(use) == WXS_ATTRUSE_DECL_TNS(tmp))) { goto inherit_next; } } } if (uses == NULL) { type->attrUses = xmlSchemaItemListCreate(); if (type->attrUses == NULL) goto exit_failure; uses = type->attrUses; } xmlSchemaItemListAddSize(uses, 2, use); inherit_next: {} } } else { /* Extension. */ for (i = 0; i < baseUses->nbItems; i++) { use = baseUses->items[i]; if (uses == NULL) { type->attrUses = xmlSchemaItemListCreate(); if (type->attrUses == NULL) goto exit_failure; uses = type->attrUses; } xmlSchemaItemListAddSize(uses, baseUses->nbItems, use); } } } /* * Shrink attr. uses. */ if (uses) { if (uses->nbItems == 0) { xmlSchemaItemListFree(uses); type->attrUses = NULL; } /* * TODO: We could shrink the size of the array * to fit the actual number of items. */ } /* * Compute the complete wildcard. */ if (WXS_IS_EXTENSION(type)) { if (baseType->attributeWildcard != NULL) { /* * (3.2.2.1) "If the �base wildcard� is non-�absent�, then * the appropriate case among the following:" */ if (type->attributeWildcard != NULL) { /* * Union the complete wildcard with the base wildcard. * SPEC {attribute wildcard} * (3.2.2.1.2) "otherwise a wildcard whose {process contents} * and {annotation} are those of the �complete wildcard�, * and whose {namespace constraint} is the intensional union * of the {namespace constraint} of the �complete wildcard� * and of the �base wildcard�, as defined in Attribute * Wildcard Union (�3.10.6)." */ if (xmlSchemaUnionWildcards(pctxt, type->attributeWildcard, baseType->attributeWildcard) == -1) goto exit_failure; } else { /* * (3.2.2.1.1) "If the �complete wildcard� is �absent�, * then the �base wildcard�." */ type->attributeWildcard = baseType->attributeWildcard; } } else { /* * (3.2.2.2) "otherwise (the �base wildcard� is �absent�) the * �complete wildcard" * NOOP */ } } else { /* * SPEC {attribute wildcard} * (3.1) "If the alternative is chosen, then the * �complete wildcard�;" * NOOP */ } return (0); exit_failure: return(-1); } /** * xmlSchemaTypeFinalContains: * @schema: the schema * @type: the type definition * @final: the final * * Evaluates if a type definition contains the given "final". * This does take "finalDefault" into account as well. * * Returns 1 if the type does containt the given "final", * 0 otherwise. */ static int xmlSchemaTypeFinalContains(xmlSchemaTypePtr type, int final) { if (type == NULL) return (0); if (type->flags & final) return (1); else return (0); } /** * xmlSchemaGetUnionSimpleTypeMemberTypes: * @type: the Union Simple Type * * Returns a list of member types of @type if existing, * returns NULL otherwise. */ static xmlSchemaTypeLinkPtr xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type) { while ((type != NULL) && (type->type == XML_SCHEMA_TYPE_SIMPLE)) { if (type->memberTypes != NULL) return (type->memberTypes); else type = type->baseType; } return (NULL); } /** * xmlSchemaGetParticleTotalRangeMin: * @particle: the particle * * Schema Component Constraint: Effective Total Range * (all and sequence) + (choice) * * Returns the minimun Effective Total Range. */ static int xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle) { if ((particle->children == NULL) || (particle->minOccurs == 0)) return (0); if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) { int min = -1, cur; xmlSchemaParticlePtr part = (xmlSchemaParticlePtr) particle->children->children; if (part == NULL) return (0); while (part != NULL) { if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || (part->children->type == XML_SCHEMA_TYPE_ANY)) cur = part->minOccurs; else cur = xmlSchemaGetParticleTotalRangeMin(part); if (cur == 0) return (0); if ((min > cur) || (min == -1)) min = cur; part = (xmlSchemaParticlePtr) part->next; } return (particle->minOccurs * min); } else { /* and */ int sum = 0; xmlSchemaParticlePtr part = (xmlSchemaParticlePtr) particle->children->children; if (part == NULL) return (0); do { if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || (part->children->type == XML_SCHEMA_TYPE_ANY)) sum += part->minOccurs; else sum += xmlSchemaGetParticleTotalRangeMin(part); part = (xmlSchemaParticlePtr) part->next; } while (part != NULL); return (particle->minOccurs * sum); } } #if 0 /** * xmlSchemaGetParticleTotalRangeMax: * @particle: the particle * * Schema Component Constraint: Effective Total Range * (all and sequence) + (choice) * * Returns the maximum Effective Total Range. */ static int xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle) { if ((particle->children == NULL) || (particle->children->children == NULL)) return (0); if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) { int max = -1, cur; xmlSchemaParticlePtr part = (xmlSchemaParticlePtr) particle->children->children; for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) { if (part->children == NULL) continue; if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || (part->children->type == XML_SCHEMA_TYPE_ANY)) cur = part->maxOccurs; else cur = xmlSchemaGetParticleTotalRangeMax(part); if (cur == UNBOUNDED) return (UNBOUNDED); if ((max < cur) || (max == -1)) max = cur; } /* TODO: Handle overflows? */ return (particle->maxOccurs * max); } else { /* and */ int sum = 0, cur; xmlSchemaParticlePtr part = (xmlSchemaParticlePtr) particle->children->children; for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) { if (part->children == NULL) continue; if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || (part->children->type == XML_SCHEMA_TYPE_ANY)) cur = part->maxOccurs; else cur = xmlSchemaGetParticleTotalRangeMax(part); if (cur == UNBOUNDED) return (UNBOUNDED); if ((cur > 0) && (particle->maxOccurs == UNBOUNDED)) return (UNBOUNDED); sum += cur; } /* TODO: Handle overflows? */ return (particle->maxOccurs * sum); } } #endif /** * xmlSchemaIsParticleEmptiable: * @particle: the particle * * Schema Component Constraint: Particle Emptiable * Checks whether the given particle is emptiable. * * Returns 1 if emptiable, 0 otherwise. */ static int xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle) { /* * SPEC (1) "Its {min occurs} is 0." */ if ((particle == NULL) || (particle->minOccurs == 0) || (particle->children == NULL)) return (1); /* * SPEC (2) "Its {term} is a group and the minimum part of the * effective total range of that group, [...] is 0." */ if (WXS_IS_MODEL_GROUP(particle->children)) { if (xmlSchemaGetParticleTotalRangeMin(particle) == 0) return (1); } return (0); } /** * xmlSchemaCheckCOSSTDerivedOK: * @actxt: a context * @type: the derived simple type definition * @baseType: the base type definition * @subset: the subset of ('restriction', ect.) * * Schema Component Constraint: * Type Derivation OK (Simple) (cos-st-derived-OK) * * Checks wheter @type can be validly * derived from @baseType. * * Returns 0 on success, an positive error code otherwise. */ static int xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt, xmlSchemaTypePtr type, xmlSchemaTypePtr baseType, int subset) { /* * 1 They are the same type definition. * TODO: The identy check might have to be more complex than this. */ if (type == baseType) return (0); /* * 2.1 restriction is not in the subset, or in the {final} * of its own {base type definition}; * * NOTE that this will be used also via "xsi:type". * * TODO: Revise this, it looks strange. How can the "type" * not be fixed or *in* fixing? */ if (WXS_IS_TYPE_NOT_FIXED(type)) if (xmlSchemaTypeFixup(type, actxt) == -1) return(-1); if (WXS_IS_TYPE_NOT_FIXED(baseType)) if (xmlSchemaTypeFixup(baseType, actxt) == -1) return(-1); if ((subset & SUBSET_RESTRICTION) || (xmlSchemaTypeFinalContains(type->baseType, XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) { return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_1); } /* 2.2 */ if (type->baseType == baseType) { /* * 2.2.1 D's �base type definition� is B. */ return (0); } /* * 2.2.2 D's �base type definition� is not the �ur-type definition� * and is validly derived from B given the subset, as defined by this * constraint. */ if ((! WXS_IS_ANYTYPE(type->baseType)) && (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType, baseType, subset) == 0)) { return (0); } /* * 2.2.3 D's {variety} is list or union and B is the �simple ur-type * definition�. */ if (WXS_IS_ANY_SIMPLE_TYPE(baseType) && (WXS_IS_LIST(type) || WXS_IS_UNION(type))) { return (0); } /* * 2.2.4 B's {variety} is union and D is validly derived from a type * definition in B's {member type definitions} given the subset, as * defined by this constraint. * * NOTE: This seems not to involve built-in types, since there is no * built-in Union Simple Type. */ if (WXS_IS_UNION(baseType)) { xmlSchemaTypeLinkPtr cur; cur = baseType->memberTypes; while (cur != NULL) { if (WXS_IS_TYPE_NOT_FIXED(cur->type)) if (xmlSchemaTypeFixup(cur->type, actxt) == -1) return(-1); if (xmlSchemaCheckCOSSTDerivedOK(actxt, type, cur->type, subset) == 0) { /* * It just has to be validly derived from at least one * member-type. */ return (0); } cur = cur->next; } } return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_2); } /** * xmlSchemaCheckTypeDefCircularInternal: * @pctxt: the schema parser context * @ctxtType: the type definition * @ancestor: an ancestor of @ctxtType * * Checks st-props-correct (2) + ct-props-correct (3). * Circular type definitions are not allowed. * * Returns XML_SCHEMAP_ST_PROPS_CORRECT_2 if the given type is * circular, 0 otherwise. */ static int xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr ctxtType, xmlSchemaTypePtr ancestor) { int ret; if ((ancestor == NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC)) return (0); if (ctxtType == ancestor) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_ST_PROPS_CORRECT_2, WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType), "The definition is circular", NULL); return (XML_SCHEMAP_ST_PROPS_CORRECT_2); } if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) { /* * Avoid inifinite recursion on circular types not yet checked. */ return (0); } ancestor->flags |= XML_SCHEMAS_TYPE_MARKED; ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType, ancestor->baseType); ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED; return (ret); } /** * xmlSchemaCheckTypeDefCircular: * @item: the complex/simple type definition * @ctxt: the parser context * @name: the name * * Checks for circular type definitions. */ static void xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr item, xmlSchemaParserCtxtPtr ctxt) { if ((item == NULL) || (item->type == XML_SCHEMA_TYPE_BASIC) || (item->baseType == NULL)) return; xmlSchemaCheckTypeDefCircularInternal(ctxt, item, item->baseType); } /* * Simple Type Definition Representation OK (src-simple-type) 4 * * "4 Circular union type definition is disallowed. That is, if the * alternative is chosen, there must not be any entries in the * memberTypes [attribute] at any depth which resolve to the component * corresponding to the ." * * Note that this should work on the *representation* of a component, * thus assumes any union types in the member types not being yet * substituted. At this stage we need the variety of the types * to be already computed. */ static int xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr ctxType, xmlSchemaTypeLinkPtr members) { xmlSchemaTypeLinkPtr member; xmlSchemaTypePtr memberType; member = members; while (member != NULL) { memberType = member->type; while ((memberType != NULL) && (memberType->type != XML_SCHEMA_TYPE_BASIC)) { if (memberType == ctxType) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_SRC_SIMPLE_TYPE_4, WXS_BASIC_CAST ctxType, NULL, "The union type definition is circular", NULL); return (XML_SCHEMAP_SRC_SIMPLE_TYPE_4); } if ((WXS_IS_UNION(memberType)) && ((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0)) { int res; memberType->flags |= XML_SCHEMAS_TYPE_MARKED; res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, ctxType, xmlSchemaGetUnionSimpleTypeMemberTypes(memberType)); memberType->flags ^= XML_SCHEMAS_TYPE_MARKED; if (res != 0) return(res); } memberType = memberType->baseType; } member = member->next; } return(0); } static int xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { if (! WXS_IS_UNION(type)) return(0); return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, type, type->memberTypes)); } /** * xmlSchemaResolveTypeReferences: * @item: the complex/simple type definition * @ctxt: the parser context * @name: the name * * Resolvese type definition references */ static void xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef, xmlSchemaParserCtxtPtr ctxt) { if (typeDef == NULL) return; /* * Resolve the base type. */ if (typeDef->baseType == NULL) { typeDef->baseType = xmlSchemaGetType(ctxt->schema, typeDef->base, typeDef->baseNs); if (typeDef->baseType == NULL) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST typeDef, typeDef->node, "base", typeDef->base, typeDef->baseNs, XML_SCHEMA_TYPE_SIMPLE, NULL); return; } } if (WXS_IS_SIMPLE(typeDef)) { if (WXS_IS_UNION(typeDef)) { /* * Resolve the memberTypes. */ xmlSchemaResolveUnionMemberTypes(ctxt, typeDef); return; } else if (WXS_IS_LIST(typeDef)) { /* * Resolve the itemType. */ if ((typeDef->subtypes == NULL) && (typeDef->base != NULL)) { typeDef->subtypes = xmlSchemaGetType(ctxt->schema, typeDef->base, typeDef->baseNs); if ((typeDef->subtypes == NULL) || (! WXS_IS_SIMPLE(typeDef->subtypes))) { typeDef->subtypes = NULL; xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST typeDef, typeDef->node, "itemType", typeDef->base, typeDef->baseNs, XML_SCHEMA_TYPE_SIMPLE, NULL); } } return; } } /* * The ball of letters below means, that if we have a particle * which has a QName-helper component as its {term}, we want * to resolve it... */ else if ((WXS_TYPE_CONTENTTYPE(typeDef) != NULL) && ((WXS_TYPE_CONTENTTYPE(typeDef))->type == XML_SCHEMA_TYPE_PARTICLE) && (WXS_TYPE_PARTICLE_TERM(typeDef) != NULL) && ((WXS_TYPE_PARTICLE_TERM(typeDef))->type == XML_SCHEMA_EXTRA_QNAMEREF)) { xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef); xmlSchemaModelGroupDefPtr groupDef; /* * URGENT TODO: Test this. */ WXS_TYPE_PARTICLE_TERM(typeDef) = NULL; /* * Resolve the MG definition reference. */ groupDef = WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema, ref->itemType, ref->name, ref->targetNamespace); if (groupDef == NULL) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), "ref", ref->name, ref->targetNamespace, ref->itemType, NULL); /* Remove the particle. */ WXS_TYPE_CONTENTTYPE(typeDef) = NULL; } else if (WXS_MODELGROUPDEF_MODEL(groupDef) == NULL) /* Remove the particle. */ WXS_TYPE_CONTENTTYPE(typeDef) = NULL; else { /* * Assign the MG definition's {model group} to the * particle's {term}. */ WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef); if (WXS_MODELGROUPDEF_MODEL(groupDef)->type == XML_SCHEMA_TYPE_ALL) { /* * SPEC cos-all-limited (1.2) * "1.2 the {term} property of a particle with * {max occurs}=1 which is part of a pair which constitutes * the {content type} of a complex type definition." */ if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) { xmlSchemaCustomErr(ACTXT_CAST ctxt, /* TODO: error code */ XML_SCHEMAP_COS_ALL_LIMITED, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), NULL, "The particle's {max occurs} must be 1, since the " "reference resolves to an 'all' model group", NULL, NULL); } } } } } /** * xmlSchemaCheckSTPropsCorrect: * @ctxt: the schema parser context * @type: the simple type definition * * Checks st-props-correct. * * Returns 0 if the properties are correct, * if not, a positive error code and -1 on internal * errors. */ static int xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt, xmlSchemaTypePtr type) { xmlSchemaTypePtr baseType = type->baseType; xmlChar *str = NULL; /* STATE: error funcs converted. */ /* * Schema Component Constraint: Simple Type Definition Properties Correct * * NOTE: This is somehow redundant, since we actually built a simple type * to have all the needed information; this acts as an self test. */ /* Base type: If the datatype has been �derived� by �restriction� * then the Simple Type Definition component from which it is �derived�, * otherwise the Simple Type Definition for anySimpleType (�4.1.6). */ if (baseType == NULL) { /* * TODO: Think about: "modulo the impact of Missing * Sub-components (�5.3)." */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_ST_PROPS_CORRECT_1, WXS_BASIC_CAST type, NULL, "No base type existent", NULL); return (XML_SCHEMAP_ST_PROPS_CORRECT_1); } if (! WXS_IS_SIMPLE(baseType)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_ST_PROPS_CORRECT_1, WXS_BASIC_CAST type, NULL, "The base type '%s' is not a simple type", xmlSchemaGetComponentQName(&str, baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_ST_PROPS_CORRECT_1); } if ((WXS_IS_LIST(type) || WXS_IS_UNION(type)) && (WXS_IS_RESTRICTION(type) == 0) && ((! WXS_IS_ANY_SIMPLE_TYPE(baseType)) && (baseType->type != XML_SCHEMA_TYPE_SIMPLE))) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_ST_PROPS_CORRECT_1, WXS_BASIC_CAST type, NULL, "A type, derived by list or union, must have " "the simple ur-type definition as base type, not '%s'", xmlSchemaGetComponentQName(&str, baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_ST_PROPS_CORRECT_1); } /* * Variety: One of {atomic, list, union}. */ if ((! WXS_IS_ATOMIC(type)) && (! WXS_IS_UNION(type)) && (! WXS_IS_LIST(type))) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_ST_PROPS_CORRECT_1, WXS_BASIC_CAST type, NULL, "The variety is absent", NULL); return (XML_SCHEMAP_ST_PROPS_CORRECT_1); } /* TODO: Finish this. Hmm, is this finished? */ /* * 3 The {final} of the {base type definition} must not contain restriction. */ if (xmlSchemaTypeFinalContains(baseType, XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_ST_PROPS_CORRECT_3, WXS_BASIC_CAST type, NULL, "The 'final' of its base type '%s' must not contain " "'restriction'", xmlSchemaGetComponentQName(&str, baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_ST_PROPS_CORRECT_3); } /* * 2 All simple type definitions must be derived ultimately from the �simple * ur-type definition (so� circular definitions are disallowed). That is, it * must be possible to reach a built-in primitive datatype or the �simple * ur-type definition� by repeatedly following the {base type definition}. * * NOTE: this is done in xmlSchemaCheckTypeDefCircular(). */ return (0); } /** * xmlSchemaCheckCOSSTRestricts: * @ctxt: the schema parser context * @type: the simple type definition * * Schema Component Constraint: * Derivation Valid (Restriction, Simple) (cos-st-restricts) * Checks if the given @type (simpleType) is derived validly by restriction. * STATUS: * * Returns -1 on internal errors, 0 if the type is validly derived, * a positive error code otherwise. */ static int xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { xmlChar *str = NULL; if (type->type != XML_SCHEMA_TYPE_SIMPLE) { PERROR_INT("xmlSchemaCheckCOSSTRestricts", "given type is not a user-derived simpleType"); return (-1); } if (WXS_IS_ATOMIC(type)) { xmlSchemaTypePtr primitive; /* * 1.1 The {base type definition} must be an atomic simple * type definition or a built-in primitive datatype. */ if (! WXS_IS_ATOMIC(type->baseType)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_1_1, WXS_BASIC_CAST type, NULL, "The base type '%s' is not an atomic simple type", xmlSchemaGetComponentQName(&str, type->baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_1_1); } /* 1.2 The {final} of the {base type definition} must not contain * restriction. */ /* OPTIMIZE TODO : This is already done in xmlSchemaCheckStPropsCorrect */ if (xmlSchemaTypeFinalContains(type->baseType, XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_1_2, WXS_BASIC_CAST type, NULL, "The final of its base type '%s' must not contain 'restriction'", xmlSchemaGetComponentQName(&str, type->baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_1_2); } /* * 1.3.1 DF must be an allowed constraining facet for the {primitive * type definition}, as specified in the appropriate subsection of 3.2 * Primitive datatypes. */ if (type->facets != NULL) { xmlSchemaFacetPtr facet; int ok = 1; primitive = xmlSchemaGetPrimitiveType(type); if (primitive == NULL) { PERROR_INT("xmlSchemaCheckCOSSTRestricts", "failed to get primitive type"); return (-1); } facet = type->facets; do { if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) { ok = 0; xmlSchemaPIllegalFacetAtomicErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1, type, primitive, facet); } facet = facet->next; } while (facet != NULL); if (ok == 0) return (XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1); } /* * SPEC (1.3.2) "If there is a facet of the same kind in the {facets} * of the {base type definition} (call this BF),then the DF's {value} * must be a valid restriction of BF's {value} as defined in * [XML Schemas: Datatypes]." * * NOTE (1.3.2) Facet derivation constraints are currently handled in * xmlSchemaDeriveAndValidateFacets() */ } else if (WXS_IS_LIST(type)) { xmlSchemaTypePtr itemType = NULL; itemType = type->subtypes; if ((itemType == NULL) || (! WXS_IS_SIMPLE(itemType))) { PERROR_INT("xmlSchemaCheckCOSSTRestricts", "failed to evaluate the item type"); return (-1); } if (WXS_IS_TYPE_NOT_FIXED(itemType)) xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt); /* * 2.1 The {item type definition} must have a {variety} of atomic or * union (in which case all the {member type definitions} * must be atomic). */ if ((! WXS_IS_ATOMIC(itemType)) && (! WXS_IS_UNION(itemType))) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_2_1, WXS_BASIC_CAST type, NULL, "The item type '%s' does not have a variety of atomic or union", xmlSchemaGetComponentQName(&str, itemType)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1); } else if (WXS_IS_UNION(itemType)) { xmlSchemaTypeLinkPtr member; member = itemType->memberTypes; while (member != NULL) { if (! WXS_IS_ATOMIC(member->type)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_2_1, WXS_BASIC_CAST type, NULL, "The item type is a union type, but the " "member type '%s' of this item type is not atomic", xmlSchemaGetComponentQName(&str, member->type)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1); } member = member->next; } } if (WXS_IS_ANY_SIMPLE_TYPE(type->baseType)) { xmlSchemaFacetPtr facet; /* * This is the case if we have: facets != NULL) { facet = type->facets; do { if (facet->type != XML_SCHEMA_FACET_WHITESPACE) { xmlSchemaPIllegalFacetListUnionErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2, type, facet); return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2); } facet = facet->next; } while (facet != NULL); } /* * MAYBE TODO: (Hmm, not really) Datatypes states: * A �list� datatype can be �derived� from an �atomic� datatype * whose �lexical space� allows space (such as string or anyURI)or * a �union� datatype any of whose {member type definitions}'s * �lexical space� allows space. */ } else { /* * This is the case if we have: baseType)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1, WXS_BASIC_CAST type, NULL, "The base type '%s' must be a list type", xmlSchemaGetComponentQName(&str, type->baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1); } /* * 2.3.2.2 The {final} of the {base type definition} must not * contain restriction. */ if (xmlSchemaTypeFinalContains(type->baseType, XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2, WXS_BASIC_CAST type, NULL, "The 'final' of the base type '%s' must not contain 'restriction'", xmlSchemaGetComponentQName(&str, type->baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2); } /* * 2.3.2.3 The {item type definition} must be validly derived * from the {base type definition}'s {item type definition} given * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6). */ { xmlSchemaTypePtr baseItemType; baseItemType = type->baseType->subtypes; if ((baseItemType == NULL) || (! WXS_IS_SIMPLE(baseItemType))) { PERROR_INT("xmlSchemaCheckCOSSTRestricts", "failed to eval the item type of a base type"); return (-1); } if ((itemType != baseItemType) && (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType, baseItemType, 0) != 0)) { xmlChar *strBIT = NULL, *strBT = NULL; xmlSchemaPCustomErrExt(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3, WXS_BASIC_CAST type, NULL, "The item type '%s' is not validly derived from " "the item type '%s' of the base type '%s'", xmlSchemaGetComponentQName(&str, itemType), xmlSchemaGetComponentQName(&strBIT, baseItemType), xmlSchemaGetComponentQName(&strBT, type->baseType)); FREE_AND_NULL(str) FREE_AND_NULL(strBIT) FREE_AND_NULL(strBT) return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3); } } if (type->facets != NULL) { xmlSchemaFacetPtr facet; int ok = 1; /* * 2.3.2.4 Only length, minLength, maxLength, whiteSpace, pattern * and enumeration facet components are allowed among the {facets}. */ facet = type->facets; do { switch (facet->type) { case XML_SCHEMA_FACET_LENGTH: case XML_SCHEMA_FACET_MINLENGTH: case XML_SCHEMA_FACET_MAXLENGTH: case XML_SCHEMA_FACET_WHITESPACE: /* * TODO: 2.5.1.2 List datatypes * The value of �whiteSpace� is fixed to the value collapse. */ case XML_SCHEMA_FACET_PATTERN: case XML_SCHEMA_FACET_ENUMERATION: break; default: { xmlSchemaPIllegalFacetListUnionErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4, type, facet); /* * We could return, but it's nicer to report all * invalid facets. */ ok = 0; } } facet = facet->next; } while (facet != NULL); if (ok == 0) return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4); /* * SPEC (2.3.2.5) (same as 1.3.2) * * NOTE (2.3.2.5) This is currently done in * xmlSchemaDeriveAndValidateFacets() */ } } } else if (WXS_IS_UNION(type)) { /* * 3.1 The {member type definitions} must all have {variety} of * atomic or list. */ xmlSchemaTypeLinkPtr member; member = type->memberTypes; while (member != NULL) { if (WXS_IS_TYPE_NOT_FIXED(member->type)) xmlSchemaTypeFixup(member->type, ACTXT_CAST pctxt); if ((! WXS_IS_ATOMIC(member->type)) && (! WXS_IS_LIST(member->type))) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_3_1, WXS_BASIC_CAST type, NULL, "The member type '%s' is neither an atomic, nor a list type", xmlSchemaGetComponentQName(&str, member->type)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_3_1); } member = member->next; } /* * 3.3.1 If the {base type definition} is the �simple ur-type * definition� */ if (type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) { /* * 3.3.1.1 All of the {member type definitions} must have a * {final} which does not contain union. */ member = type->memberTypes; while (member != NULL) { if (xmlSchemaTypeFinalContains(member->type, XML_SCHEMAS_TYPE_FINAL_UNION)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1, WXS_BASIC_CAST type, NULL, "The 'final' of member type '%s' contains 'union'", xmlSchemaGetComponentQName(&str, member->type)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1); } member = member->next; } /* * 3.3.1.2 The {facets} must be empty. */ if (type->facetSet != NULL) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2, WXS_BASIC_CAST type, NULL, "No facets allowed", NULL); return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2); } } else { /* * 3.3.2.1 The {base type definition} must have a {variety} of union. * I.e. the variety of "list" is inherited. */ if (! WXS_IS_UNION(type->baseType)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1, WXS_BASIC_CAST type, NULL, "The base type '%s' is not a union type", xmlSchemaGetComponentQName(&str, type->baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1); } /* * 3.3.2.2 The {final} of the {base type definition} must not contain restriction. */ if (xmlSchemaTypeFinalContains(type->baseType, XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2, WXS_BASIC_CAST type, NULL, "The 'final' of its base type '%s' must not contain 'restriction'", xmlSchemaGetComponentQName(&str, type->baseType)); FREE_AND_NULL(str) return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2); } /* * 3.3.2.3 The {member type definitions}, in order, must be validly * derived from the corresponding type definitions in the {base * type definition}'s {member type definitions} given the empty set, * as defined in Type Derivation OK (Simple) (�3.14.6). */ { xmlSchemaTypeLinkPtr baseMember; /* * OPTIMIZE: if the type is restricting, it has no local defined * member types and inherits the member types of the base type; * thus a check for equality can be skipped. */ /* * Even worse: I cannot see a scenario where a restricting * union simple type can have other member types as the member * types of it's base type. This check seems not necessary with * respect to the derivation process in libxml2. * But necessary if constructing types with an API. */ if (type->memberTypes != NULL) { member = type->memberTypes; baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(type->baseType); if ((member == NULL) && (baseMember != NULL)) { PERROR_INT("xmlSchemaCheckCOSSTRestricts", "different number of member types in base"); } while (member != NULL) { if (baseMember == NULL) { PERROR_INT("xmlSchemaCheckCOSSTRestricts", "different number of member types in base"); } else if ((member->type != baseMember->type) && (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, member->type, baseMember->type, 0) != 0)) { xmlChar *strBMT = NULL, *strBT = NULL; xmlSchemaPCustomErrExt(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3, WXS_BASIC_CAST type, NULL, "The member type %s is not validly " "derived from its corresponding member " "type %s of the base type %s", xmlSchemaGetComponentQName(&str, member->type), xmlSchemaGetComponentQName(&strBMT, baseMember->type), xmlSchemaGetComponentQName(&strBT, type->baseType)); FREE_AND_NULL(str) FREE_AND_NULL(strBMT) FREE_AND_NULL(strBT) return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3); } member = member->next; if (baseMember != NULL) baseMember = baseMember->next; } } } /* * 3.3.2.4 Only pattern and enumeration facet components are * allowed among the {facets}. */ if (type->facets != NULL) { xmlSchemaFacetPtr facet; int ok = 1; facet = type->facets; do { if ((facet->type != XML_SCHEMA_FACET_PATTERN) && (facet->type != XML_SCHEMA_FACET_ENUMERATION)) { xmlSchemaPIllegalFacetListUnionErr(pctxt, XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4, type, facet); ok = 0; } facet = facet->next; } while (facet != NULL); if (ok == 0) return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4); } /* * SPEC (3.3.2.5) (same as 1.3.2) * * NOTE (3.3.2.5) This is currently done in * xmlSchemaDeriveAndValidateFacets() */ } } return (0); } /** * xmlSchemaCheckSRCSimpleType: * @ctxt: the schema parser context * @type: the simple type definition * * Checks crc-simple-type constraints. * * Returns 0 if the constraints are satisfied, * if not a positive error code and -1 on internal * errors. */ #if 0 static int xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaTypePtr type) { /* * src-simple-type.1 The corresponding simple type definition, if any, * must satisfy the conditions set out in Constraints on Simple Type * Definition Schema Components (�3.14.6). */ if (WXS_IS_RESTRICTION(type)) { /* * src-simple-type.2 "If the alternative is chosen, * either it must have a base [attribute] or a among its * [children], but not both." * NOTE: This is checked in the parse function of . */ /* * */ } else if (WXS_IS_LIST(type)) { /* src-simple-type.3 "If the alternative is chosen, either it must have * an itemType [attribute] or a among its [children], * but not both." * * NOTE: This is checked in the parse function of . */ } else if (WXS_IS_UNION(type)) { /* * src-simple-type.4 is checked in xmlSchemaCheckUnionTypeDefCircular(). */ } return (0); } #endif static int xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt) { if (ctxt->vctxt == NULL) { ctxt->vctxt = xmlSchemaNewValidCtxt(NULL); if (ctxt->vctxt == NULL) { xmlSchemaPErr(ctxt, NULL, XML_SCHEMAP_INTERNAL, "Internal error: xmlSchemaCreateVCtxtOnPCtxt, " "failed to create a temp. validation context.\n", NULL, NULL); return (-1); } /* TODO: Pass user data. */ xmlSchemaSetValidErrors(ctxt->vctxt, ctxt->error, ctxt->warning, ctxt->errCtxt); xmlSchemaSetValidStructuredErrors(ctxt->vctxt, ctxt->serror, ctxt->errCtxt); } return (0); } static int xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt, xmlNodePtr node, xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *retVal, int fireErrors, int normalize, int isNormalized); /** * xmlSchemaParseCheckCOSValidDefault: * @pctxt: the schema parser context * @type: the simple type definition * @value: the default value * @node: an optional node (the holder of the value) * * Schema Component Constraint: Element Default Valid (Immediate) * (cos-valid-default) * This will be used by the parser only. For the validator there's * an other version. * * Returns 0 if the constraints are satisfied, * if not, a positive error code and -1 on internal * errors. */ static int xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt, xmlNodePtr node, xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val) { int ret = 0; /* * cos-valid-default: * Schema Component Constraint: Element Default Valid (Immediate) * For a string to be a valid default with respect to a type * definition the appropriate case among the following must be true: */ if WXS_IS_COMPLEX(type) { /* * Complex type. * * SPEC (2.1) "its {content type} must be a simple type definition * or mixed." * SPEC (2.2.2) "If the {content type} is mixed, then the {content * type}'s particle must be �emptiable� as defined by * Particle Emptiable (�3.9.6)." */ if ((! WXS_HAS_SIMPLE_CONTENT(type)) && ((! WXS_HAS_MIXED_CONTENT(type)) || (! WXS_EMPTIABLE(type)))) { /* NOTE that this covers (2.2.2) as well. */ xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_COS_VALID_DEFAULT_2_1, WXS_BASIC_CAST type, type->node, "For a string to be a valid default, the type definition " "must be a simple type or a complex type with mixed content " "and a particle emptiable", NULL); return(XML_SCHEMAP_COS_VALID_DEFAULT_2_1); } } /* * 1 If the type definition is a simple type definition, then the string * must be �valid� with respect to that definition as defined by String * Valid (�3.14.4). * * AND * * 2.2.1 If the {content type} is a simple type definition, then the * string must be �valid� with respect to that simple type definition * as defined by String Valid (�3.14.4). */ if (WXS_IS_SIMPLE(type)) ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node, type, value, val, 1, 1, 0); else if (WXS_HAS_SIMPLE_CONTENT(type)) ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node, type->contentTypeDef, value, val, 1, 1, 0); else return (ret); if (ret < 0) { PERROR_INT("xmlSchemaParseCheckCOSValidDefault", "calling xmlSchemaVCheckCVCSimpleType()"); } return (ret); } /** * xmlSchemaCheckCTPropsCorrect: * @ctxt: the schema parser context * @type: the complex type definition * *.(4.6) Constraints on Complex Type Definition Schema Components * Schema Component Constraint: * Complex Type Definition Properties Correct (ct-props-correct) * STATUS: (seems) complete * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { /* * TODO: Correct the error code; XML_SCHEMAP_SRC_CT_1 is used temporarily. * * SPEC (1) "The values of the properties of a complex type definition must * be as described in the property tableau in The Complex Type Definition * Schema Component (�3.4.1), modulo the impact of Missing * Sub-components (�5.3)." */ if ((type->baseType != NULL) && (WXS_IS_SIMPLE(type->baseType)) && (WXS_IS_EXTENSION(type) == 0)) { /* * SPEC (2) "If the {base type definition} is a simple type definition, * the {derivation method} must be extension." */ xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_SRC_CT_1, NULL, WXS_BASIC_CAST type, "If the base type is a simple type, the derivation method must be " "'extension'", NULL, NULL); return (XML_SCHEMAP_SRC_CT_1); } /* * SPEC (3) "Circular definitions are disallowed, except for the �ur-type * definition�. That is, it must be possible to reach the �ur-type * definition by repeatedly following the {base type definition}." * * NOTE (3) is done in xmlSchemaCheckTypeDefCircular(). */ /* * NOTE that (4) and (5) need the following: * - attribute uses need to be already inherited (apply attr. prohibitions) * - attribute group references need to be expanded already * - simple types need to be typefixed already */ if (type->attrUses && (((xmlSchemaItemListPtr) type->attrUses)->nbItems > 1)) { xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr) type->attrUses; xmlSchemaAttributeUsePtr use, tmp; int i, j, hasId = 0; for (i = uses->nbItems -1; i >= 0; i--) { use = uses->items[i]; /* * SPEC ct-props-correct * (4) "Two distinct attribute declarations in the * {attribute uses} must not have identical {name}s and * {target namespace}s." */ if (i > 0) { for (j = i -1; j >= 0; j--) { tmp = uses->items[j]; if ((WXS_ATTRUSE_DECL_NAME(use) == WXS_ATTRUSE_DECL_NAME(tmp)) && (WXS_ATTRUSE_DECL_TNS(use) == WXS_ATTRUSE_DECL_TNS(tmp))) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_AG_PROPS_CORRECT, NULL, WXS_BASIC_CAST type, "Duplicate %s", xmlSchemaGetComponentDesignation(&str, use), NULL); FREE_AND_NULL(str); /* * Remove the duplicate. */ if (xmlSchemaItemListRemove(uses, i) == -1) goto exit_failure; goto next_use; } } } /* * SPEC ct-props-correct * (5) "Two distinct attribute declarations in the * {attribute uses} must not have {type definition}s which * are or are derived from ID." */ if (WXS_ATTRUSE_TYPEDEF(use) != NULL) { if (xmlSchemaIsDerivedFromBuiltInType( WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) { if (hasId) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_AG_PROPS_CORRECT, NULL, WXS_BASIC_CAST type, "There must not exist more than one attribute " "declaration of type 'xs:ID' " "(or derived from 'xs:ID'). The %s violates this " "constraint", xmlSchemaGetComponentDesignation(&str, use), NULL); FREE_AND_NULL(str); if (xmlSchemaItemListRemove(uses, i) == -1) goto exit_failure; } hasId = 1; } } next_use: {} } } return (0); exit_failure: return(-1); } static int xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA, xmlSchemaTypePtr typeB) { /* * TODO: This should implement component-identity * in the future. */ if ((typeA == NULL) || (typeB == NULL)) return (0); return (typeA == typeB); } /** * xmlSchemaCheckCOSCTDerivedOK: * @ctxt: the schema parser context * @type: the to-be derived complex type definition * @baseType: the base complex type definition * @set: the given set * * Schema Component Constraint: * Type Derivation OK (Complex) (cos-ct-derived-ok) * * STATUS: completed * * Returns 0 if the constraints are satisfied, or 1 * if not. */ static int xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt, xmlSchemaTypePtr type, xmlSchemaTypePtr baseType, int set) { int equal = xmlSchemaAreEqualTypes(type, baseType); /* TODO: Error codes. */ /* * SPEC "For a complex type definition (call it D, for derived) * to be validly derived from a type definition (call this * B, for base) given a subset of {extension, restriction} * all of the following must be true:" */ if (! equal) { /* * SPEC (1) "If B and D are not the same type definition, then the * {derivation method} of D must not be in the subset." */ if (((set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(type))) || ((set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(type)))) return (1); } else { /* * SPEC (2.1) "B and D must be the same type definition." */ return (0); } /* * SPEC (2.2) "B must be D's {base type definition}." */ if (type->baseType == baseType) return (0); /* * SPEC (2.3.1) "D's {base type definition} must not be the �ur-type * definition�." */ if (WXS_IS_ANYTYPE(type->baseType)) return (1); if (WXS_IS_COMPLEX(type->baseType)) { /* * SPEC (2.3.2.1) "If D's {base type definition} is complex, then it * must be validly derived from B given the subset as defined by this * constraint." */ return (xmlSchemaCheckCOSCTDerivedOK(actxt, type->baseType, baseType, set)); } else { /* * SPEC (2.3.2.2) "If D's {base type definition} is simple, then it * must be validly derived from B given the subset as defined in Type * Derivation OK (Simple) (�3.14.6). */ return (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType, baseType, set)); } } /** * xmlSchemaCheckCOSDerivedOK: * @type: the derived simple type definition * @baseType: the base type definition * * Calls: * Type Derivation OK (Simple) AND Type Derivation OK (Complex) * * Checks wheter @type can be validly derived from @baseType. * * Returns 0 on success, an positive error code otherwise. */ static int xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt, xmlSchemaTypePtr type, xmlSchemaTypePtr baseType, int set) { if (WXS_IS_SIMPLE(type)) return (xmlSchemaCheckCOSSTDerivedOK(actxt, type, baseType, set)); else return (xmlSchemaCheckCOSCTDerivedOK(actxt, type, baseType, set)); } /** * xmlSchemaCheckCOSCTExtends: * @ctxt: the schema parser context * @type: the complex type definition * * (3.4.6) Constraints on Complex Type Definition Schema Components * Schema Component Constraint: * Derivation Valid (Extension) (cos-ct-extends) * * STATUS: * missing: * (1.5) * (1.4.3.2.2.2) "Particle Valid (Extension)" * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt, xmlSchemaTypePtr type) { xmlSchemaTypePtr base = type->baseType; /* * TODO: Correct the error code; XML_SCHEMAP_COS_CT_EXTENDS_1_1 is used * temporarily only. */ /* * SPEC (1) "If the {base type definition} is a complex type definition, * then all of the following must be true:" */ if (WXS_IS_COMPLEX(base)) { /* * SPEC (1.1) "The {final} of the {base type definition} must not * contain extension." */ if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_1, WXS_BASIC_CAST type, NULL, "The 'final' of the base type definition " "contains 'extension'", NULL); return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); } /* * ATTENTION: The constrains (1.2) and (1.3) are not applied, * since they are automatically satisfied through the * inheriting mechanism. * Note that even if redefining components, the inheriting mechanism * is used. */ #if 0 /* * SPEC (1.2) "Its {attribute uses} must be a subset of the {attribute * uses} * of the complex type definition itself, that is, for every attribute * use in the {attribute uses} of the {base type definition}, there * must be an attribute use in the {attribute uses} of the complex * type definition itself whose {attribute declaration} has the same * {name}, {target namespace} and {type definition} as its attribute * declaration" */ if (base->attrUses != NULL) { int i, j, found; xmlSchemaAttributeUsePtr use, buse; for (i = 0; i < (WXS_LIST_CAST base->attrUses)->nbItems; i ++) { buse = (WXS_LIST_CAST base->attrUses)->items[i]; found = 0; if (type->attrUses != NULL) { use = (WXS_LIST_CAST type->attrUses)->items[j]; for (j = 0; j < (WXS_LIST_CAST type->attrUses)->nbItems; j ++) { if ((WXS_ATTRUSE_DECL_NAME(use) == WXS_ATTRUSE_DECL_NAME(buse)) && (WXS_ATTRUSE_DECL_TNS(use) == WXS_ATTRUSE_DECL_TNS(buse)) && (WXS_ATTRUSE_TYPEDEF(use) == WXS_ATTRUSE_TYPEDEF(buse)) { found = 1; break; } } } if (! found) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_2, NULL, WXS_BASIC_CAST type, /* * TODO: The report does not indicate that also the * type needs to be the same. */ "This type is missing a matching correspondent " "for its {base type}'s %s in its {attribute uses}", xmlSchemaGetComponentDesignation(&str, buse->children), NULL); FREE_AND_NULL(str) } } } /* * SPEC (1.3) "If it has an {attribute wildcard}, the complex type * definition must also have one, and the base type definition's * {attribute wildcard}'s {namespace constraint} must be a subset * of the complex type definition's {attribute wildcard}'s {namespace * constraint}, as defined by Wildcard Subset (�3.10.6)." */ /* * MAYBE TODO: Enable if ever needed. But this will be needed only * if created the type via a schema construction API. */ if (base->attributeWildcard != NULL) { if (type->attributeWilcard == NULL) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_3, NULL, type, "The base %s has an attribute wildcard, " "but this type is missing an attribute wildcard", xmlSchemaGetComponentDesignation(&str, base)); FREE_AND_NULL(str) } else if (xmlSchemaCheckCOSNSSubset( base->attributeWildcard, type->attributeWildcard)) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_3, NULL, type, "The attribute wildcard is not a valid " "superset of the one in the base %s", xmlSchemaGetComponentDesignation(&str, base)); FREE_AND_NULL(str) } } #endif /* * SPEC (1.4) "One of the following must be true:" */ if ((type->contentTypeDef != NULL) && (type->contentTypeDef == base->contentTypeDef)) { /* * SPEC (1.4.1) "The {content type} of the {base type definition} * and the {content type} of the complex type definition itself * must be the same simple type definition" * PASS */ } else if ((type->contentType == XML_SCHEMA_CONTENT_EMPTY) && (base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) { /* * SPEC (1.4.2) "The {content type} of both the {base type * definition} and the complex type definition itself must * be empty." * PASS */ } else { /* * SPEC (1.4.3) "All of the following must be true:" */ if (type->subtypes == NULL) { /* * SPEC 1.4.3.1 The {content type} of the complex type * definition itself must specify a particle. */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_1, WXS_BASIC_CAST type, NULL, "The content type must specify a particle", NULL); return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); } /* * SPEC (1.4.3.2) "One of the following must be true:" */ if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) { /* * SPEC (1.4.3.2.1) "The {content type} of the {base type * definition} must be empty. * PASS */ } else { /* * SPEC (1.4.3.2.2) "All of the following must be true:" */ if ((type->contentType != base->contentType) || ((type->contentType != XML_SCHEMA_CONTENT_MIXED) && (type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) { /* * SPEC (1.4.3.2.2.1) "Both {content type}s must be mixed * or both must be element-only." */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_1, WXS_BASIC_CAST type, NULL, "The content type of both, the type and its base " "type, must either 'mixed' or 'element-only'", NULL); return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); } /* * URGENT TODO SPEC (1.4.3.2.2.2) "The particle of the * complex type definition must be a �valid extension� * of the {base type definition}'s particle, as defined * in Particle Valid (Extension) (�3.9.6)." * * NOTE that we won't check "Particle Valid (Extension)", * since it is ensured by the derivation process in * xmlSchemaTypeFixup(). We need to implement this when heading * for a construction API * TODO: !! This is needed to be checked if redefining a type !! */ } /* * URGENT TODO (1.5) */ } } else { /* * SPEC (2) "If the {base type definition} is a simple type definition, * then all of the following must be true:" */ if (type->contentTypeDef != base) { /* * SPEC (2.1) "The {content type} must be the same simple type * definition." */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_1, WXS_BASIC_CAST type, NULL, "The content type must be the simple base type", NULL); return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); } if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) { /* * SPEC (2.2) "The {final} of the {base type definition} must not * contain extension" * NOTE that this is the same as (1.1). */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_COS_CT_EXTENDS_1_1, WXS_BASIC_CAST type, NULL, "The 'final' of the base type definition " "contains 'extension'", NULL); return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); } } return (0); } /** * xmlSchemaCheckDerivationOKRestriction: * @ctxt: the schema parser context * @type: the complex type definition * * (3.4.6) Constraints on Complex Type Definition Schema Components * Schema Component Constraint: * Derivation Valid (Restriction, Complex) (derivation-ok-restriction) * * STATUS: * missing: * (5.4.2) ??? * * ATTENTION: * In XML Schema 1.1 this will be: * Validation Rule: Checking complex type subsumption * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaTypePtr type) { xmlSchemaTypePtr base; /* * TODO: Correct the error code; XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 is used * temporarily only. */ base = type->baseType; if (! WXS_IS_COMPLEX(base)) { xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, type->node, WXS_BASIC_CAST type, "The base type must be a complex type", NULL, NULL); return(ctxt->err); } if (base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) { /* * SPEC (1) "The {base type definition} must be a complex type * definition whose {final} does not contain restriction." */ xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, type->node, WXS_BASIC_CAST type, "The 'final' of the base type definition " "contains 'restriction'", NULL, NULL); return (ctxt->err); } /* * SPEC (2), (3) and (4) * Those are handled in a separate function, since the * same constraints are needed for redefinition of * attribute groups as well. */ if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt, XML_SCHEMA_ACTION_DERIVE, WXS_BASIC_CAST type, WXS_BASIC_CAST base, type->attrUses, base->attrUses, type->attributeWildcard, base->attributeWildcard) == -1) { return(-1); } /* * SPEC (5) "One of the following must be true:" */ if (base->builtInType == XML_SCHEMAS_ANYTYPE) { /* * SPEC (5.1) "The {base type definition} must be the * �ur-type definition�." * PASS */ } else if ((type->contentType == XML_SCHEMA_CONTENT_SIMPLE) || (type->contentType == XML_SCHEMA_CONTENT_BASIC)) { /* * SPEC (5.2.1) "The {content type} of the complex type definition * must be a simple type definition" * * SPEC (5.2.2) "One of the following must be true:" */ if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) || (base->contentType == XML_SCHEMA_CONTENT_BASIC)) { int err; /* * SPEC (5.2.2.1) "The {content type} of the {base type * definition} must be a simple type definition from which * the {content type} is validly derived given the empty * set as defined in Type Derivation OK (Simple) (�3.14.6)." * * ATTENTION TODO: This seems not needed if the type implicitely * derived from the base type. * */ err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt, type->contentTypeDef, base->contentTypeDef, 0); if (err != 0) { xmlChar *strA = NULL, *strB = NULL; if (err == -1) return(-1); xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, NULL, WXS_BASIC_CAST type, "The {content type} %s is not validly derived from the " "base type's {content type} %s", xmlSchemaGetComponentDesignation(&strA, type->contentTypeDef), xmlSchemaGetComponentDesignation(&strB, base->contentTypeDef)); FREE_AND_NULL(strA); FREE_AND_NULL(strB); return(ctxt->err); } } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) && (xmlSchemaIsParticleEmptiable( (xmlSchemaParticlePtr) base->subtypes))) { /* * SPEC (5.2.2.2) "The {base type definition} must be mixed * and have a particle which is �emptiable� as defined in * Particle Emptiable (�3.9.6)." * PASS */ } else { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, WXS_BASIC_CAST type, NULL, "The content type of the base type must be either " "a simple type or 'mixed' and an emptiable particle", NULL); return (ctxt->err); } } else if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) { /* * SPEC (5.3.1) "The {content type} of the complex type itself must * be empty" */ if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) { /* * SPEC (5.3.2.1) "The {content type} of the {base type * definition} must also be empty." * PASS */ } else if (((base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) || (base->contentType == XML_SCHEMA_CONTENT_MIXED)) && xmlSchemaIsParticleEmptiable( (xmlSchemaParticlePtr) base->subtypes)) { /* * SPEC (5.3.2.2) "The {content type} of the {base type * definition} must be elementOnly or mixed and have a particle * which is �emptiable� as defined in Particle Emptiable (�3.9.6)." * PASS */ } else { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, WXS_BASIC_CAST type, NULL, "The content type of the base type must be either " "empty or 'mixed' (or 'elements-only') and an emptiable " "particle", NULL); return (ctxt->err); } } else if ((type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) || WXS_HAS_MIXED_CONTENT(type)) { /* * SPEC (5.4.1.1) "The {content type} of the complex type definition * itself must be element-only" */ if (WXS_HAS_MIXED_CONTENT(type) && (! WXS_HAS_MIXED_CONTENT(base))) { /* * SPEC (5.4.1.2) "The {content type} of the complex type * definition itself and of the {base type definition} must be * mixed" */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, WXS_BASIC_CAST type, NULL, "If the content type is 'mixed', then the content type of the " "base type must also be 'mixed'", NULL); return (ctxt->err); } /* * SPEC (5.4.2) "The particle of the complex type definition itself * must be a �valid restriction� of the particle of the {content * type} of the {base type definition} as defined in Particle Valid * (Restriction) (�3.9.6). * * URGENT TODO: (5.4.2) */ } else { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, WXS_BASIC_CAST type, NULL, "The type is not a valid restriction of its base type", NULL); return (ctxt->err); } return (0); } /** * xmlSchemaCheckCTComponent: * @ctxt: the schema parser context * @type: the complex type definition * * (3.4.6) Constraints on Complex Type Definition Schema Components * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt, xmlSchemaTypePtr type) { int ret; /* * Complex Type Definition Properties Correct */ ret = xmlSchemaCheckCTPropsCorrect(ctxt, type); if (ret != 0) return (ret); if (WXS_IS_EXTENSION(type)) ret = xmlSchemaCheckCOSCTExtends(ctxt, type); else ret = xmlSchemaCheckDerivationOKRestriction(ctxt, type); return (ret); } /** * xmlSchemaCheckSRCCT: * @ctxt: the schema parser context * @type: the complex type definition * * (3.4.3) Constraints on XML Representations of Complex Type Definitions: * Schema Representation Constraint: * Complex Type Definition Representation OK (src-ct) * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt, xmlSchemaTypePtr type) { xmlSchemaTypePtr base; int ret = 0; /* * TODO: Adjust the error codes here, as I used * XML_SCHEMAP_SRC_CT_1 only yet. */ base = type->baseType; if (! WXS_HAS_SIMPLE_CONTENT(type)) { /* * 1 If the alternative is chosen, the type definition * �resolved� to by the �actual value� of the base [attribute] * must be a complex type definition; */ if (! WXS_IS_COMPLEX(base)) { xmlChar *str = NULL; xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_CT_1, WXS_BASIC_CAST type, type->node, "If using , the base type is expected to be " "a complex type. The base type '%s' is a simple type", xmlSchemaFormatQName(&str, base->targetNamespace, base->name)); FREE_AND_NULL(str) return (XML_SCHEMAP_SRC_CT_1); } } else { /* * SPEC * 2 If the alternative is chosen, all of the * following must be true: * 2.1 The type definition �resolved� to by the �actual value� of the * base [attribute] must be one of the following: */ if (WXS_IS_SIMPLE(base)) { if (WXS_IS_EXTENSION(type) == 0) { xmlChar *str = NULL; /* * 2.1.3 only if the alternative is also * chosen, a simple type definition. */ /* TODO: Change error code to ..._SRC_CT_2_1_3. */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_CT_1, WXS_BASIC_CAST type, NULL, "If using and , the base " "type must be a complex type. The base type '%s' is " "a simple type", xmlSchemaFormatQName(&str, base->targetNamespace, base->name)); FREE_AND_NULL(str) return (XML_SCHEMAP_SRC_CT_1); } } else { /* Base type is a complex type. */ if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) || (base->contentType == XML_SCHEMA_CONTENT_BASIC)) { /* * 2.1.1 a complex type definition whose {content type} is a * simple type definition; * PASS */ if (base->contentTypeDef == NULL) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL, WXS_BASIC_CAST type, NULL, "Internal error: xmlSchemaCheckSRCCT, " "'%s', base type has no content type", type->name); return (-1); } } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) && (WXS_IS_RESTRICTION(type))) { /* * 2.1.2 only if the alternative is also * chosen, a complex type definition whose {content type} * is mixed and a particle emptiable. */ if (! xmlSchemaIsParticleEmptiable( (xmlSchemaParticlePtr) base->subtypes)) { ret = XML_SCHEMAP_SRC_CT_1; } else /* * Attention: at this point the child is in * ->contentTypeDef (put there during parsing). */ if (type->contentTypeDef == NULL) { xmlChar *str = NULL; /* * 2.2 If clause 2.1.2 above is satisfied, then there * must be a among the [children] of * . */ /* TODO: Change error code to ..._SRC_CT_2_2. */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_CT_1, WXS_BASIC_CAST type, NULL, "A is expected among the children " "of , if is used and " "the base type '%s' is a complex type", xmlSchemaFormatQName(&str, base->targetNamespace, base->name)); FREE_AND_NULL(str) return (XML_SCHEMAP_SRC_CT_1); } } else { ret = XML_SCHEMAP_SRC_CT_1; } } if (ret > 0) { xmlChar *str = NULL; if (WXS_IS_RESTRICTION(type)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_CT_1, WXS_BASIC_CAST type, NULL, "If and is used, the " "base type must be a simple type or a complex type with " "mixed content and particle emptiable. The base type " "'%s' is none of those", xmlSchemaFormatQName(&str, base->targetNamespace, base->name)); } else { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_CT_1, WXS_BASIC_CAST type, NULL, "If and is used, the " "base type must be a simple type. The base type '%s' " "is a complex type", xmlSchemaFormatQName(&str, base->targetNamespace, base->name)); } FREE_AND_NULL(str) } } /* * SPEC (3) "The corresponding complex type definition component must * satisfy the conditions set out in Constraints on Complex Type * Definition Schema Components (�3.4.6);" * NOTE (3) will be done in xmlSchemaTypeFixup(). */ /* * SPEC (4) If clause 2.2.1 or clause 2.2.2 in the correspondence specification * above for {attribute wildcard} is satisfied, the intensional * intersection must be expressible, as defined in Attribute Wildcard * Intersection (�3.10.6). * NOTE (4) is done in xmlSchemaFixupTypeAttributeUses(). */ return (ret); } #ifdef ENABLE_PARTICLE_RESTRICTION /** * xmlSchemaCheckParticleRangeOK: * @ctxt: the schema parser context * @type: the complex type definition * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Occurrence Range OK (range-ok) * * STATUS: complete * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckParticleRangeOK(int rmin, int rmax, int bmin, int bmax) { if (rmin < bmin) return (1); if ((bmax != UNBOUNDED) && (rmax > bmax)) return (1); return (0); } /** * xmlSchemaCheckRCaseNameAndTypeOK: * @ctxt: the schema parser context * @r: the restricting element declaration particle * @b: the base element declaration particle * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Particle Restriction OK (Elt:Elt -- NameAndTypeOK) * (rcase-NameAndTypeOK) * * STATUS: * MISSING (3.2.3) * CLARIFY: (3.2.2) * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr r, xmlSchemaParticlePtr b) { xmlSchemaElementPtr elemR, elemB; /* TODO: Error codes (rcase-NameAndTypeOK). */ elemR = (xmlSchemaElementPtr) r->children; elemB = (xmlSchemaElementPtr) b->children; /* * SPEC (1) "The declarations' {name}s and {target namespace}s are * the same." */ if ((elemR != elemB) && ((! xmlStrEqual(elemR->name, elemB->name)) || (! xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace)))) return (1); /* * SPEC (2) "R's occurrence range is a valid restriction of B's * occurrence range as defined by Occurrence Range OK (�3.9.6)." */ if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, b->minOccurs, b->maxOccurs) != 0) return (1); /* * SPEC (3.1) "Both B's declaration's {scope} and R's declaration's * {scope} are global." */ if (elemR == elemB) return (0); /* * SPEC (3.2.1) "Either B's {nillable} is true or R's {nillable} is false." */ if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) && (elemR->flags & XML_SCHEMAS_ELEM_NILLABLE)) return (1); /* * SPEC (3.2.2) "either B's declaration's {value constraint} is absent, * or is not fixed, or R's declaration's {value constraint} is fixed * with the same value." */ if ((elemB->value != NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) && ((elemR->value == NULL) || ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) || /* TODO: Equality of the initial value or normalized or canonical? */ (! xmlStrEqual(elemR->value, elemB->value)))) return (1); /* * TODO: SPEC (3.2.3) "R's declaration's {identity-constraint * definitions} is a subset of B's declaration's {identity-constraint * definitions}, if any." */ if (elemB->idcs != NULL) { /* TODO */ } /* * SPEC (3.2.4) "R's declaration's {disallowed substitutions} is a * superset of B's declaration's {disallowed substitutions}." */ if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) && ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) || ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) && ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) || ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) && ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0))) return (1); /* * SPEC (3.2.5) "R's {type definition} is validly derived given * {extension, list, union} from B's {type definition}" * * BADSPEC TODO: What's the point of adding "list" and "union" to the * set, if the corresponding constraints handle "restriction" and * "extension" only? * */ { int set = 0; set |= SUBSET_EXTENSION; set |= SUBSET_LIST; set |= SUBSET_UNION; if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes, elemB->subtypes, set) != 0) return (1); } return (0); } /** * xmlSchemaCheckRCaseNSCompat: * @ctxt: the schema parser context * @r: the restricting element declaration particle * @b: the base wildcard particle * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Particle Derivation OK (Elt:Any -- NSCompat) * (rcase-NSCompat) * * STATUS: complete * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr r, xmlSchemaParticlePtr b) { /* TODO:Error codes (rcase-NSCompat). */ /* * SPEC "For an element declaration particle to be a �valid restriction� * of a wildcard particle all of the following must be true:" * * SPEC (1) "The element declaration's {target namespace} is �valid� * with respect to the wildcard's {namespace constraint} as defined by * Wildcard allows Namespace Name (�3.10.4)." */ if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr) b->children, ((xmlSchemaElementPtr) r->children)->targetNamespace) != 0) return (1); /* * SPEC (2) "R's occurrence range is a valid restriction of B's * occurrence range as defined by Occurrence Range OK (�3.9.6)." */ if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, b->minOccurs, b->maxOccurs) != 0) return (1); return (0); } /** * xmlSchemaCheckRCaseRecurseAsIfGroup: * @ctxt: the schema parser context * @r: the restricting element declaration particle * @b: the base model group particle * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup) * (rcase-RecurseAsIfGroup) * * STATUS: TODO * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr r, xmlSchemaParticlePtr b) { /* TODO: Error codes (rcase-RecurseAsIfGroup). */ TODO return (0); } /** * xmlSchemaCheckRCaseNSSubset: * @ctxt: the schema parser context * @r: the restricting wildcard particle * @b: the base wildcard particle * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Particle Derivation OK (Any:Any -- NSSubset) * (rcase-NSSubset) * * STATUS: complete * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr r, xmlSchemaParticlePtr b, int isAnyTypeBase) { /* TODO: Error codes (rcase-NSSubset). */ /* * SPEC (1) "R's occurrence range is a valid restriction of B's * occurrence range as defined by Occurrence Range OK (�3.9.6)." */ if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, b->minOccurs, b->maxOccurs)) return (1); /* * SPEC (2) "R's {namespace constraint} must be an intensional subset * of B's {namespace constraint} as defined by Wildcard Subset (�3.10.6)." */ if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr) r->children, (xmlSchemaWildcardPtr) b->children)) return (1); /* * SPEC (3) "Unless B is the content model wildcard of the �ur-type * definition�, R's {process contents} must be identical to or stronger * than B's {process contents}, where strict is stronger than lax is * stronger than skip." */ if (! isAnyTypeBase) { if ( ((xmlSchemaWildcardPtr) r->children)->processContents < ((xmlSchemaWildcardPtr) b->children)->processContents) return (1); } return (0); } /** * xmlSchemaCheckCOSParticleRestrict: * @ctxt: the schema parser context * @type: the complex type definition * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Particle Valid (Restriction) (cos-particle-restrict) * * STATUS: TODO * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr r, xmlSchemaParticlePtr b) { int ret = 0; /*part = WXS_TYPE_PARTICLE(type); basePart = WXS_TYPE_PARTICLE(base); */ TODO /* * SPEC (1) "They are the same particle." */ if (r == b) return (0); return (0); } #if 0 /** * xmlSchemaCheckRCaseNSRecurseCheckCardinality: * @ctxt: the schema parser context * @r: the model group particle * @b: the base wildcard particle * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Particle Derivation OK (All/Choice/Sequence:Any -- * NSRecurseCheckCardinality) * (rcase-NSRecurseCheckCardinality) * * STATUS: TODO: subst-groups * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr r, xmlSchemaParticlePtr b) { xmlSchemaParticlePtr part; /* TODO: Error codes (rcase-NSRecurseCheckCardinality). */ if ((r->children == NULL) || (r->children->children == NULL)) return (-1); /* * SPEC "For a group particle to be a �valid restriction� of a * wildcard particle..." * * SPEC (1) "Every member of the {particles} of the group is a �valid * restriction� of the wildcard as defined by * Particle Valid (Restriction) (�3.9.6)." */ part = (xmlSchemaParticlePtr) r->children->children; do { if (xmlSchemaCheckCOSParticleRestrict(ctxt, part, b)) return (1); part = (xmlSchemaParticlePtr) part->next; } while (part != NULL); /* * SPEC (2) "The effective total range of the group [...] is a * valid restriction of B's occurrence range as defined by * Occurrence Range OK (�3.9.6)." */ if (xmlSchemaCheckParticleRangeOK( xmlSchemaGetParticleTotalRangeMin(r), xmlSchemaGetParticleTotalRangeMax(r), b->minOccurs, b->maxOccurs) != 0) return (1); return (0); } #endif /** * xmlSchemaCheckRCaseRecurse: * @ctxt: the schema parser context * @r: the or model group particle * @b: the base or model group particle * * (3.9.6) Constraints on Particle Schema Components * Schema Component Constraint: * Particle Derivation OK (All:All,Sequence:Sequence -- Recurse) * (rcase-Recurse) * * STATUS: ? * TODO: subst-groups * * Returns 0 if the constraints are satisfied, a positive * error code if not and -1 if an internal error occured. */ static int xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt, xmlSchemaParticlePtr r, xmlSchemaParticlePtr b) { /* xmlSchemaParticlePtr part; */ /* TODO: Error codes (rcase-Recurse). */ if ((r->children == NULL) || (b->children == NULL) || (r->children->type != b->children->type)) return (-1); /* * SPEC "For an all or sequence group particle to be a �valid * restriction� of another group particle with the same {compositor}..." * * SPEC (1) "R's occurrence range is a valid restriction of B's * occurrence range as defined by Occurrence Range OK (�3.9.6)." */ if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, b->minOccurs, b->maxOccurs)) return (1); return (0); } #endif #define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \ xmlSchemaPCustomErrExt(pctxt, \ XML_SCHEMAP_INVALID_FACET_VALUE, \ WXS_BASIC_CAST fac1, fac1->node, \ "It is an error for both '%s' and '%s' to be specified on the "\ "same type definition", \ BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \ BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL); #define FACET_RESTR_ERR(fac1, msg) \ xmlSchemaPCustomErr(pctxt, \ XML_SCHEMAP_INVALID_FACET_VALUE, \ WXS_BASIC_CAST fac1, fac1->node, \ msg, NULL); #define FACET_RESTR_FIXED_ERR(fac) \ xmlSchemaPCustomErr(pctxt, \ XML_SCHEMAP_INVALID_FACET_VALUE, \ WXS_BASIC_CAST fac, fac->node, \ "The base type's facet is 'fixed', thus the value must not " \ "differ", NULL); static void xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt, xmlSchemaFacetPtr facet1, xmlSchemaFacetPtr facet2, int lessGreater, int orEqual, int ofBase) { xmlChar *msg = NULL; msg = xmlStrdup(BAD_CAST "'"); msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet1->type)); msg = xmlStrcat(msg, BAD_CAST "' has to be"); if (lessGreater == 0) msg = xmlStrcat(msg, BAD_CAST " equal to"); if (lessGreater == 1) msg = xmlStrcat(msg, BAD_CAST " greater than"); else msg = xmlStrcat(msg, BAD_CAST " less than"); if (orEqual) msg = xmlStrcat(msg, BAD_CAST " or equal to"); msg = xmlStrcat(msg, BAD_CAST " '"); msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet2->type)); if (ofBase) msg = xmlStrcat(msg, BAD_CAST "' of the base type"); else msg = xmlStrcat(msg, BAD_CAST "'"); xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_INVALID_FACET_VALUE, WXS_BASIC_CAST facet1, NULL, (const char *) msg, NULL); if (msg != NULL) xmlFree(msg); } /* * xmlSchemaDeriveAndValidateFacets: * * Schema Component Constraint: Simple Type Restriction (Facets) * (st-restrict-facets) */ static int xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { xmlSchemaTypePtr base = type->baseType; xmlSchemaFacetLinkPtr link, cur, last = NULL; xmlSchemaFacetPtr facet, bfacet, flength = NULL, ftotdig = NULL, ffracdig = NULL, fmaxlen = NULL, fminlen = NULL, /* facets of the current type */ fmininc = NULL, fmaxinc = NULL, fminexc = NULL, fmaxexc = NULL, bflength = NULL, bftotdig = NULL, bffracdig = NULL, bfmaxlen = NULL, bfminlen = NULL, /* facets of the base type */ bfmininc = NULL, bfmaxinc = NULL, bfminexc = NULL, bfmaxexc = NULL; int res; /* err = 0, fixedErr; */ /* * SPEC st-restrict-facets 1: * "The {variety} of R is the same as that of B." */ /* * SPEC st-restrict-facets 2: * "If {variety} is atomic, the {primitive type definition} * of R is the same as that of B." * * NOTE: we leave 1 & 2 out for now, since this will be * satisfied by the derivation process. * CONSTRUCTION TODO: Maybe needed if using a construction API. */ /* * SPEC st-restrict-facets 3: * "The {facets} of R are the union of S and the {facets} * of B, eliminating duplicates. To eliminate duplicates, * when a facet of the same kind occurs in both S and the * {facets} of B, the one in the {facets} of B is not * included, with the exception of enumeration and pattern * facets, for which multiple occurrences with distinct values * are allowed." */ if ((type->facetSet == NULL) && (base->facetSet == NULL)) return (0); last = type->facetSet; if (last != NULL) while (last->next != NULL) last = last->next; for (cur = type->facetSet; cur != NULL; cur = cur->next) { facet = cur->facet; switch (facet->type) { case XML_SCHEMA_FACET_LENGTH: flength = facet; break; case XML_SCHEMA_FACET_MINLENGTH: fminlen = facet; break; case XML_SCHEMA_FACET_MININCLUSIVE: fmininc = facet; break; case XML_SCHEMA_FACET_MINEXCLUSIVE: fminexc = facet; break; case XML_SCHEMA_FACET_MAXLENGTH: fmaxlen = facet; break; case XML_SCHEMA_FACET_MAXINCLUSIVE: fmaxinc = facet; break; case XML_SCHEMA_FACET_MAXEXCLUSIVE: fmaxexc = facet; break; case XML_SCHEMA_FACET_TOTALDIGITS: ftotdig = facet; break; case XML_SCHEMA_FACET_FRACTIONDIGITS: ffracdig = facet; break; default: break; } } for (cur = base->facetSet; cur != NULL; cur = cur->next) { facet = cur->facet; switch (facet->type) { case XML_SCHEMA_FACET_LENGTH: bflength = facet; break; case XML_SCHEMA_FACET_MINLENGTH: bfminlen = facet; break; case XML_SCHEMA_FACET_MININCLUSIVE: bfmininc = facet; break; case XML_SCHEMA_FACET_MINEXCLUSIVE: bfminexc = facet; break; case XML_SCHEMA_FACET_MAXLENGTH: bfmaxlen = facet; break; case XML_SCHEMA_FACET_MAXINCLUSIVE: bfmaxinc = facet; break; case XML_SCHEMA_FACET_MAXEXCLUSIVE: bfmaxexc = facet; break; case XML_SCHEMA_FACET_TOTALDIGITS: bftotdig = facet; break; case XML_SCHEMA_FACET_FRACTIONDIGITS: bffracdig = facet; break; default: break; } } /* * length and minLength or maxLength (2.2) + (3.2) */ if (flength && (fminlen || fmaxlen)) { FACET_RESTR_ERR(flength, "It is an error for both 'length' and " "either of 'minLength' or 'maxLength' to be specified on " "the same type definition") } /* * Mutual exclusions in the same derivation step. */ if ((fmaxinc) && (fmaxexc)) { /* * SCC "maxInclusive and maxExclusive" */ FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc) } if ((fmininc) && (fminexc)) { /* * SCC "minInclusive and minExclusive" */ FACET_RESTR_MUTUAL_ERR(fmininc, fminexc) } if (flength && bflength) { /* * SCC "length valid restriction" * The values have to be equal. */ res = xmlSchemaCompareValues(flength->val, bflength->val); if (res == -2) goto internal_error; if (res != 0) xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1); if ((res != 0) && (bflength->fixed)) { FACET_RESTR_FIXED_ERR(flength) } } if (fminlen && bfminlen) { /* * SCC "minLength valid restriction" * minLength >= BASE minLength */ res = xmlSchemaCompareValues(fminlen->val, bfminlen->val); if (res == -2) goto internal_error; if (res == -1) xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1); if ((res != 0) && (bfminlen->fixed)) { FACET_RESTR_FIXED_ERR(fminlen) } } if (fmaxlen && bfmaxlen) { /* * SCC "maxLength valid restriction" * maxLength <= BASE minLength */ res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val); if (res == -2) goto internal_error; if (res == 1) xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1); if ((res != 0) && (bfmaxlen->fixed)) { FACET_RESTR_FIXED_ERR(fmaxlen) } } /* * SCC "length and minLength or maxLength" */ if (! flength) flength = bflength; if (flength) { if (! fminlen) fminlen = bfminlen; if (fminlen) { /* (1.1) length >= minLength */ res = xmlSchemaCompareValues(flength->val, fminlen->val); if (res == -2) goto internal_error; if (res == -1) xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0); } if (! fmaxlen) fmaxlen = bfmaxlen; if (fmaxlen) { /* (2.1) length <= maxLength */ res = xmlSchemaCompareValues(flength->val, fmaxlen->val); if (res == -2) goto internal_error; if (res == 1) xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0); } } if (fmaxinc) { /* * "maxInclusive" */ if (fmininc) { /* SCC "maxInclusive >= minInclusive" */ res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val); if (res == -2) goto internal_error; if (res == -1) { xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0); } } /* * SCC "maxInclusive valid restriction" */ if (bfmaxinc) { /* maxInclusive <= BASE maxInclusive */ res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val); if (res == -2) goto internal_error; if (res == 1) xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1); if ((res != 0) && (bfmaxinc->fixed)) { FACET_RESTR_FIXED_ERR(fmaxinc) } } if (bfmaxexc) { /* maxInclusive < BASE maxExclusive */ res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val); if (res == -2) goto internal_error; if (res != -1) { xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1); } } if (bfmininc) { /* maxInclusive >= BASE minInclusive */ res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val); if (res == -2) goto internal_error; if (res == -1) { xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1); } } if (bfminexc) { /* maxInclusive > BASE minExclusive */ res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val); if (res == -2) goto internal_error; if (res != 1) { xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1); } } } if (fmaxexc) { /* * "maxExclusive >= minExclusive" */ if (fminexc) { res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val); if (res == -2) goto internal_error; if (res == -1) { xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0); } } /* * "maxExclusive valid restriction" */ if (bfmaxexc) { /* maxExclusive <= BASE maxExclusive */ res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val); if (res == -2) goto internal_error; if (res == 1) { xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1); } if ((res != 0) && (bfmaxexc->fixed)) { FACET_RESTR_FIXED_ERR(fmaxexc) } } if (bfmaxinc) { /* maxExclusive <= BASE maxInclusive */ res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val); if (res == -2) goto internal_error; if (res == 1) { xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1); } } if (bfmininc) { /* maxExclusive > BASE minInclusive */ res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val); if (res == -2) goto internal_error; if (res != 1) { xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1); } } if (bfminexc) { /* maxExclusive > BASE minExclusive */ res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val); if (res == -2) goto internal_error; if (res != 1) { xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1); } } } if (fminexc) { /* * "minExclusive < maxInclusive" */ if (fmaxinc) { res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val); if (res == -2) goto internal_error; if (res != -1) { xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0); } } /* * "minExclusive valid restriction" */ if (bfminexc) { /* minExclusive >= BASE minExclusive */ res = xmlSchemaCompareValues(fminexc->val, bfminexc->val); if (res == -2) goto internal_error; if (res == -1) { xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1); } if ((res != 0) && (bfminexc->fixed)) { FACET_RESTR_FIXED_ERR(fminexc) } } if (bfmaxinc) { /* minExclusive <= BASE maxInclusive */ res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val); if (res == -2) goto internal_error; if (res == 1) { xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1); } } if (bfmininc) { /* minExclusive >= BASE minInclusive */ res = xmlSchemaCompareValues(fminexc->val, bfmininc->val); if (res == -2) goto internal_error; if (res == -1) { xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1); } } if (bfmaxexc) { /* minExclusive < BASE maxExclusive */ res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val); if (res == -2) goto internal_error; if (res != -1) { xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1); } } } if (fmininc) { /* * "minInclusive < maxExclusive" */ if (fmaxexc) { res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val); if (res == -2) goto internal_error; if (res != -1) { xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0); } } /* * "minExclusive valid restriction" */ if (bfmininc) { /* minInclusive >= BASE minInclusive */ res = xmlSchemaCompareValues(fmininc->val, bfmininc->val); if (res == -2) goto internal_error; if (res == -1) { xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1); } if ((res != 0) && (bfmininc->fixed)) { FACET_RESTR_FIXED_ERR(fmininc) } } if (bfmaxinc) { /* minInclusive <= BASE maxInclusive */ res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val); if (res == -2) goto internal_error; if (res == 1) { xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1); } } if (bfminexc) { /* minInclusive > BASE minExclusive */ res = xmlSchemaCompareValues(fmininc->val, bfminexc->val); if (res == -2) goto internal_error; if (res != 1) xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1); } if (bfmaxexc) { /* minInclusive < BASE maxExclusive */ res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val); if (res == -2) goto internal_error; if (res != -1) xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1); } } if (ftotdig && bftotdig) { /* * SCC " totalDigits valid restriction" * totalDigits <= BASE totalDigits */ res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val); if (res == -2) goto internal_error; if (res == 1) xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig, -1, 1, 1); if ((res != 0) && (bftotdig->fixed)) { FACET_RESTR_FIXED_ERR(ftotdig) } } if (ffracdig && bffracdig) { /* * SCC "fractionDigits valid restriction" * fractionDigits <= BASE fractionDigits */ res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val); if (res == -2) goto internal_error; if (res == 1) xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig, -1, 1, 1); if ((res != 0) && (bffracdig->fixed)) { FACET_RESTR_FIXED_ERR(ffracdig) } } /* * SCC "fractionDigits less than or equal to totalDigits" */ if (! ftotdig) ftotdig = bftotdig; if (! ffracdig) ffracdig = bffracdig; if (ftotdig && ffracdig) { res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val); if (res == -2) goto internal_error; if (res == 1) xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig, -1, 1, 0); } /* * *Enumerations* won' be added here, since only the first set * of enumerations in the ancestor-or-self axis is used * for validation, plus we need to use the base type of those * enumerations for whitespace. * * *Patterns*: won't be add here, since they are ORed at * type level and ANDed at ancestor level. This will * happed during validation by walking the base axis * of the type. */ for (cur = base->facetSet; cur != NULL; cur = cur->next) { bfacet = cur->facet; /* * Special handling of enumerations and patterns. * TODO: hmm, they should not appear in the set, so remove this. */ if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) || (bfacet->type == XML_SCHEMA_FACET_ENUMERATION)) continue; /* * Search for a duplicate facet in the current type. */ link = type->facetSet; /* err = 0; */ /* fixedErr = 0; */ while (link != NULL) { facet = link->facet; if (facet->type == bfacet->type) { switch (facet->type) { case XML_SCHEMA_FACET_WHITESPACE: /* * The whitespace must be stronger. */ if (facet->whitespace < bfacet->whitespace) { FACET_RESTR_ERR(facet, "The 'whitespace' value has to be equal to " "or stronger than the 'whitespace' value of " "the base type") } if ((bfacet->fixed) && (facet->whitespace != bfacet->whitespace)) { FACET_RESTR_FIXED_ERR(facet) } break; default: break; } /* Duplicate found. */ break; } link = link->next; } /* * If no duplicate was found: add the base types's facet * to the set. */ if (link == NULL) { link = (xmlSchemaFacetLinkPtr) xmlMalloc(sizeof(xmlSchemaFacetLink)); if (link == NULL) { xmlSchemaPErrMemory(pctxt, "deriving facets, creating a facet link", NULL); return (-1); } link->facet = cur->facet; link->next = NULL; if (last == NULL) type->facetSet = link; else last->next = link; last = link; } } return (0); internal_error: PERROR_INT("xmlSchemaDeriveAndValidateFacets", "an error occured"); return (-1); } static int xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { xmlSchemaTypeLinkPtr link, lastLink, prevLink, subLink, newLink; /* * The actual value is then formed by replacing any union type * definition in the �explicit members� with the members of their * {member type definitions}, in order. * * TODO: There's a bug entry at * "http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0287.html" * which indicates that we'll keep the union types the future. */ link = type->memberTypes; while (link != NULL) { if (WXS_IS_TYPE_NOT_FIXED(link->type)) xmlSchemaTypeFixup(link->type, ACTXT_CAST pctxt); if (WXS_IS_UNION(link->type)) { subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(link->type); if (subLink != NULL) { link->type = subLink->type; if (subLink->next != NULL) { lastLink = link->next; subLink = subLink->next; prevLink = link; while (subLink != NULL) { newLink = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink)); if (newLink == NULL) { xmlSchemaPErrMemory(pctxt, "allocating a type link", NULL); return (-1); } newLink->type = subLink->type; prevLink->next = newLink; prevLink = newLink; newLink->next = lastLink; subLink = subLink->next; } } } } link = link->next; } return (0); } static void xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr type) { int has = 0, needVal = 0, normVal = 0; has = (type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0; if (has) { needVal = (type->baseType->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0; normVal = (type->baseType->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0; } if (type->facets != NULL) { xmlSchemaFacetPtr fac; for (fac = type->facets; fac != NULL; fac = fac->next) { switch (fac->type) { case XML_SCHEMA_FACET_WHITESPACE: break; case XML_SCHEMA_FACET_PATTERN: normVal = 1; has = 1; break; case XML_SCHEMA_FACET_ENUMERATION: needVal = 1; normVal = 1; has = 1; break; default: has = 1; break; } } } if (normVal) type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED; if (needVal) type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE; if (has) type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; if (has && (! needVal) && WXS_IS_ATOMIC(type)) { xmlSchemaTypePtr prim = xmlSchemaGetPrimitiveType(type); /* * OPTIMIZE VAL TODO: Some facets need a computed value. */ if ((prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) && (prim->builtInType != XML_SCHEMAS_STRING)) { type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE; } } } static int xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr type) { /* * Evaluate the whitespace-facet value. */ if (WXS_IS_LIST(type)) { type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; return (0); } else if (WXS_IS_UNION(type)) return (0); if (type->facetSet != NULL) { xmlSchemaFacetLinkPtr lin; for (lin = type->facetSet; lin != NULL; lin = lin->next) { if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) { switch (lin->facet->whitespace) { case XML_SCHEMAS_FACET_PRESERVE: type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE; break; case XML_SCHEMAS_FACET_REPLACE: type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE; break; case XML_SCHEMAS_FACET_COLLAPSE: type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; break; default: return (-1); } return (0); } } } /* * For all �atomic� datatypes other than string (and types �derived� * by �restriction� from it) the value of whiteSpace is fixed to * collapse */ { xmlSchemaTypePtr anc; for (anc = type->baseType; anc != NULL && anc->builtInType != XML_SCHEMAS_ANYTYPE; anc = anc->baseType) { if (anc->type == XML_SCHEMA_TYPE_BASIC) { if (anc->builtInType == XML_SCHEMAS_NORMSTRING) { type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE; } else if ((anc->builtInType == XML_SCHEMAS_STRING) || (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) { type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE; } else type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; break; } } } return (0); } static int xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { if (type->type != XML_SCHEMA_TYPE_SIMPLE) return(0); if (! WXS_IS_TYPE_NOT_FIXED_1(type)) return(0); type->flags |= XML_SCHEMAS_TYPE_FIXUP_1; if (WXS_IS_LIST(type)) { /* * Corresponds to ... */ if (type->subtypes == NULL) { /* * This one is really needed, so get out. */ PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", "list type has no item-type assigned"); return(-1); } } else if (WXS_IS_UNION(type)) { /* * Corresponds to ... */ if (type->memberTypes == NULL) { /* * This one is really needed, so get out. */ PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", "union type has no member-types assigned"); return(-1); } } else { /* * Corresponds to ... */ if (type->baseType == NULL) { PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", "type has no base-type assigned"); return(-1); } if (WXS_IS_TYPE_NOT_FIXED_1(type->baseType)) if (xmlSchemaFixupSimpleTypeStageOne(pctxt, type->baseType) == -1) return(-1); /* * Variety * If the alternative is chosen, then the * {variety} of the {base type definition}. */ if (WXS_IS_ATOMIC(type->baseType)) type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; else if (WXS_IS_LIST(type->baseType)) { type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; /* * Inherit the itemType. */ type->subtypes = type->baseType->subtypes; } else if (WXS_IS_UNION(type->baseType)) { type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION; /* * NOTE that we won't assign the memberTypes of the base, * since this will make trouble when freeing them; we will * use a lookup function to access them instead. */ } } return(0); } #ifdef DEBUG_TYPE static void xmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { if (type->node != NULL) { xmlGenericError(xmlGenericErrorContext, "Type of %s : %s:%d :", name, type->node->doc->URL, xmlGetLineNo(type->node)); } else { xmlGenericError(xmlGenericErrorContext, "Type of %s :", name); } if ((WXS_IS_SIMPLE(type)) || (WXS_IS_COMPLEX(type))) { switch (type->contentType) { case XML_SCHEMA_CONTENT_SIMPLE: xmlGenericError(xmlGenericErrorContext, "simple\n"); break; case XML_SCHEMA_CONTENT_ELEMENTS: xmlGenericError(xmlGenericErrorContext, "elements\n"); break; case XML_SCHEMA_CONTENT_UNKNOWN: xmlGenericError(xmlGenericErrorContext, "unknown !!!\n"); break; case XML_SCHEMA_CONTENT_EMPTY: xmlGenericError(xmlGenericErrorContext, "empty\n"); break; case XML_SCHEMA_CONTENT_MIXED: if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr) type->subtypes)) xmlGenericError(xmlGenericErrorContext, "mixed as emptiable particle\n"); else xmlGenericError(xmlGenericErrorContext, "mixed\n"); break; /* Removed, since not used. */ /* case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS: xmlGenericError(xmlGenericErrorContext, "mixed or elems\n"); break; */ case XML_SCHEMA_CONTENT_BASIC: xmlGenericError(xmlGenericErrorContext, "basic\n"); break; default: xmlGenericError(xmlGenericErrorContext, "not registered !!!\n"); break; } } } #endif /* * 3.14.6 Constraints on Simple Type Definition Schema Components */ static int xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { int res, olderrs = pctxt->nberrors; if (type->type != XML_SCHEMA_TYPE_SIMPLE) return(-1); if (! WXS_IS_TYPE_NOT_FIXED(type)) return(0); type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED; type->contentType = XML_SCHEMA_CONTENT_SIMPLE; if (type->baseType == NULL) { PERROR_INT("xmlSchemaFixupSimpleTypeStageTwo", "missing baseType"); goto exit_failure; } if (WXS_IS_TYPE_NOT_FIXED(type->baseType)) xmlSchemaTypeFixup(type->baseType, ACTXT_CAST pctxt); /* * If a member type of a union is a union itself, we need to substitute * that member type for its member types. * NOTE that this might change in WXS 1.1; i.e. we will keep the union * types in WXS 1.1. */ if ((type->memberTypes != NULL) && (xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt, type) == -1)) return(-1); /* * SPEC src-simple-type 1 * "The corresponding simple type definition, if any, must satisfy * the conditions set out in Constraints on Simple Type Definition * Schema Components (�3.14.6)." */ /* * Schema Component Constraint: Simple Type Definition Properties Correct * (st-props-correct) */ res = xmlSchemaCheckSTPropsCorrect(pctxt, type); HFAILURE HERROR /* * Schema Component Constraint: Derivation Valid (Restriction, Simple) * (cos-st-restricts) */ res = xmlSchemaCheckCOSSTRestricts(pctxt, type); HFAILURE HERROR /* * TODO: Removed the error report, since it got annoying to get an * extra error report, if anything failed until now. * Enable this if needed. * * xmlSchemaPErr(ctxt, type->node, * XML_SCHEMAP_SRC_SIMPLE_TYPE_1, * "Simple type '%s' does not satisfy the constraints " * "on simple type definitions.\n", * type->name, NULL); */ /* * Schema Component Constraint: Simple Type Restriction (Facets) * (st-restrict-facets) */ res = xmlSchemaCheckFacetValues(type, pctxt); HFAILURE HERROR if ((type->facetSet != NULL) || (type->baseType->facetSet != NULL)) { res = xmlSchemaDeriveAndValidateFacets(pctxt, type); HFAILURE HERROR } /* * Whitespace value. */ res = xmlSchemaTypeFixupWhitespace(type); HFAILURE HERROR xmlSchemaTypeFixupOptimFacets(type); exit_error: #ifdef DEBUG_TYPE xmlSchemaDebugFixedType(pctxt, type); #endif if (olderrs != pctxt->nberrors) return(pctxt->err); return(0); exit_failure: #ifdef DEBUG_TYPE xmlSchemaDebugFixedType(pctxt, type); #endif return(-1); } static int xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt, xmlSchemaTypePtr type) { int res = 0, olderrs = pctxt->nberrors; xmlSchemaTypePtr baseType = type->baseType; if (! WXS_IS_TYPE_NOT_FIXED(type)) return(0); type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED; if (baseType == NULL) { PERROR_INT("xmlSchemaFixupComplexType", "missing baseType"); goto exit_failure; } /* * Fixup the base type. */ if (WXS_IS_TYPE_NOT_FIXED(baseType)) xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt); if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) { /* * Skip fixup if the base type is invalid. * TODO: Generate a warning! */ return(0); } /* * This basically checks if the base type can be derived. */ res = xmlSchemaCheckSRCCT(pctxt, type); HFAILURE HERROR /* * Fixup the content type. */ if (type->contentType == XML_SCHEMA_CONTENT_SIMPLE) { /* * Corresponds to ... */ if ((WXS_IS_COMPLEX(baseType)) && (baseType->contentTypeDef != NULL) && (WXS_IS_RESTRICTION(type))) { xmlSchemaTypePtr contentBase, content; #ifdef ENABLE_NAMED_LOCALS char buf[30]; const xmlChar *tmpname; #endif /* * SPEC (1) If + base type is , * "whose own {content type} is a simple type..." */ if (type->contentTypeDef != NULL) { /* * SPEC (1.1) "the simple type definition corresponding to the * among the [children] of if there * is one;" * Note that this " among the [children]" was put * into ->contentTypeDef during parsing. */ contentBase = type->contentTypeDef; type->contentTypeDef = NULL; } else { /* * (1.2) "...otherwise ( has no * among its [children]), the simple type definition which * is the {content type} of the ... base type." */ contentBase = baseType->contentTypeDef; } /* * SPEC * "... a simple type definition which restricts the simple * type definition identified in clause 1.1 or clause 1.2 * with a set of facet components" * * Create the anonymous simple type, which will be the content * type of the complex type. */ #ifdef ENABLE_NAMED_LOCALS snprintf(buf, 29, "#scST%d", ++(pctxt->counter)); tmpname = xmlDictLookup(pctxt->dict, BAD_CAST buf, -1); content = xmlSchemaAddType(pctxt, pctxt->schema, XML_SCHEMA_TYPE_SIMPLE, tmpname, type->targetNamespace, type->node, 0); #else content = xmlSchemaAddType(pctxt, pctxt->schema, XML_SCHEMA_TYPE_SIMPLE, NULL, type->targetNamespace, type->node, 0); #endif if (content == NULL) goto exit_failure; /* * We will use the same node as for the * to have it somehow anchored in the schema doc. */ content->type = XML_SCHEMA_TYPE_SIMPLE; content->baseType = contentBase; /* * Move the facets, previously anchored on the * complexType during parsing. */ content->facets = type->facets; type->facets = NULL; content->facetSet = type->facetSet; type->facetSet = NULL; type->contentTypeDef = content; if (WXS_IS_TYPE_NOT_FIXED(contentBase)) xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt); /* * Fixup the newly created type. We don't need to check * for circularity here. */ res = xmlSchemaFixupSimpleTypeStageOne(pctxt, content); HFAILURE HERROR res = xmlSchemaFixupSimpleTypeStageTwo(pctxt, content); HFAILURE HERROR } else if ((WXS_IS_COMPLEX(baseType)) && (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) && (WXS_IS_RESTRICTION(type))) { /* * SPEC (2) If + base is a mixed with * an emptiable particle, then a simple type definition which * restricts the 's child. */ if ((type->contentTypeDef == NULL) || (type->contentTypeDef->baseType == NULL)) { /* * TODO: Check if this ever happens. */ xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_INTERNAL, WXS_BASIC_CAST type, NULL, "Internal error: xmlSchemaTypeFixup, " "complex type '%s': the " "is missing a child, but was not catched " "by xmlSchemaCheckSRCCT()", type->name); goto exit_failure; } } else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(type)) { /* * SPEC (3) If + base is with * content, "...then the {content type} of that * complex type definition" */ if (baseType->contentTypeDef == NULL) { /* * TODO: Check if this ever happens. xmlSchemaCheckSRCCT * should have catched this already. */ xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_INTERNAL, WXS_BASIC_CAST type, NULL, "Internal error: xmlSchemaTypeFixup, " "complex type '%s': the ed base type is " "a complex type with no simple content type", type->name); goto exit_failure; } type->contentTypeDef = baseType->contentTypeDef; } else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(type)) { /* * SPEC (4) + base is * "... then that simple type definition" */ type->contentTypeDef = baseType; } else { /* * TODO: Check if this ever happens. */ xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_INTERNAL, WXS_BASIC_CAST type, NULL, "Internal error: xmlSchemaTypeFixup, " "complex type '%s' with : unhandled " "derivation case", type->name); goto exit_failure; } } else { int dummySequence = 0; xmlSchemaParticlePtr particle = (xmlSchemaParticlePtr) type->subtypes; /* * Corresponds to ... * * NOTE that the effective mixed was already set during parsing of * and ; its flag value is * XML_SCHEMAS_TYPE_MIXED. * * Compute the "effective content": * (2.1.1) + (2.1.2) + (2.1.3) */ if ((particle == NULL) || ((particle->type == XML_SCHEMA_TYPE_PARTICLE) && ((particle->children->type == XML_SCHEMA_TYPE_ALL) || (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) || ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) && (particle->minOccurs == 0))) && ( ((xmlSchemaTreeItemPtr) particle->children)->children == NULL))) { if (type->flags & XML_SCHEMAS_TYPE_MIXED) { /* * SPEC (2.1.4) "If the �effective mixed� is true, then * a particle whose properties are as follows:..." * * Empty sequence model group with * minOccurs/maxOccurs = 1 (i.e. a "particle emptiable"). * NOTE that we sill assign it the node to * somehow anchor it in the doc. */ if ((particle == NULL) || (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) { /* * Create the particle. */ particle = xmlSchemaAddParticle(pctxt, type->node, 1, 1); if (particle == NULL) goto exit_failure; /* * Create the model group. */ /* URGENT TODO: avoid adding to pending items. */ particle->children = (xmlSchemaTreeItemPtr) xmlSchemaAddModelGroup(pctxt, pctxt->schema, XML_SCHEMA_TYPE_SEQUENCE, type->node); if (particle->children == NULL) goto exit_failure; type->subtypes = (xmlSchemaTypePtr) particle; } dummySequence = 1; type->contentType = XML_SCHEMA_CONTENT_ELEMENTS; } else { /* * SPEC (2.1.5) "otherwise empty" */ type->contentType = XML_SCHEMA_CONTENT_EMPTY; } } else { /* * SPEC (2.2) "otherwise the particle corresponding to the * , , or among the * [children]." */ type->contentType = XML_SCHEMA_CONTENT_ELEMENTS; } /* * Compute the "content type". */ if (WXS_IS_RESTRICTION(type)) { /* * SPEC (3.1) "If ..." * (3.1.1) + (3.1.2) */ if (type->contentType != XML_SCHEMA_CONTENT_EMPTY) { if (type->flags & XML_SCHEMAS_TYPE_MIXED) type->contentType = XML_SCHEMA_CONTENT_MIXED; } } else { /* * SPEC (3.2) "If ..." */ if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) { /* * SPEC (3.2.1) * "If the �effective content� is empty, then the * {content type} of the [...] base ..." */ type->contentType = baseType->contentType; type->subtypes = baseType->subtypes; /* * Fixes bug #347316: * This is the case when the base type has a simple * type definition as content. */ type->contentTypeDef = baseType->contentTypeDef; /* * NOTE that the effective mixed is ignored here. */ } else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) { /* * SPEC (3.2.2) */ if (type->flags & XML_SCHEMAS_TYPE_MIXED) type->contentType = XML_SCHEMA_CONTENT_MIXED; } else { /* * SPEC (3.2.3) */ if (type->flags & XML_SCHEMAS_TYPE_MIXED) type->contentType = XML_SCHEMA_CONTENT_MIXED; /* * "A model group whose {compositor} is sequence and whose * {particles} are..." */ if ((WXS_TYPE_PARTICLE(type) != NULL) && (WXS_TYPE_PARTICLE_TERM(type) != NULL) && ((WXS_TYPE_PARTICLE_TERM(type))->type == XML_SCHEMA_TYPE_ALL)) { /* * SPEC cos-all-limited (1) */ xmlSchemaCustomErr(ACTXT_CAST pctxt, /* TODO: error code */ XML_SCHEMAP_COS_ALL_LIMITED, WXS_ITEM_NODE(type), NULL, "The type has an 'all' model group in its " "{content type} and thus cannot be derived from " "a non-empty type, since this would produce a " "'sequence' model group containing the 'all' " "model group; 'all' model groups are not " "allowed to appear inside other model groups", NULL, NULL); } else if ((WXS_TYPE_PARTICLE(baseType) != NULL) && (WXS_TYPE_PARTICLE_TERM(baseType) != NULL) && ((WXS_TYPE_PARTICLE_TERM(baseType))->type == XML_SCHEMA_TYPE_ALL)) { /* * SPEC cos-all-limited (1) */ xmlSchemaCustomErr(ACTXT_CAST pctxt, /* TODO: error code */ XML_SCHEMAP_COS_ALL_LIMITED, WXS_ITEM_NODE(type), NULL, "A type cannot be derived by extension from a type " "which has an 'all' model group in its " "{content type}, since this would produce a " "'sequence' model group containing the 'all' " "model group; 'all' model groups are not " "allowed to appear inside other model groups", NULL, NULL); } else if (! dummySequence) { xmlSchemaTreeItemPtr effectiveContent = (xmlSchemaTreeItemPtr) type->subtypes; /* * Create the particle. */ particle = xmlSchemaAddParticle(pctxt, type->node, 1, 1); if (particle == NULL) goto exit_failure; /* * Create the "sequence" model group. */ particle->children = (xmlSchemaTreeItemPtr) xmlSchemaAddModelGroup(pctxt, pctxt->schema, XML_SCHEMA_TYPE_SEQUENCE, type->node); if (particle->children == NULL) goto exit_failure; WXS_TYPE_CONTENTTYPE(type) = (xmlSchemaTypePtr) particle; /* * SPEC "the particle of the {content type} of * the ... base ..." * Create a duplicate of the base type's particle * and assign its "term" to it. */ particle->children->children = (xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt, type->node, ((xmlSchemaParticlePtr) baseType->subtypes)->minOccurs, ((xmlSchemaParticlePtr) baseType->subtypes)->maxOccurs); if (particle->children->children == NULL) goto exit_failure; particle = (xmlSchemaParticlePtr) particle->children->children; particle->children = ((xmlSchemaParticlePtr) baseType->subtypes)->children; /* * SPEC "followed by the �effective content�." */ particle->next = effectiveContent; /* * This all will result in: * new-particle * --> new-sequence( * new-particle * --> base-model, * this-particle * --> this-model * ) */ } else { /* * This is the case when there is already an empty * with minOccurs==maxOccurs==1. * Just add the base types's content type. * NOTE that, although we miss to add an intermediate * , this should produce no difference to * neither the regex compilation of the content model, * nor to the complex type contraints. */ particle->children->children = (xmlSchemaTreeItemPtr) baseType->subtypes; } } } } /* * Now fixup attribute uses: * - expand attr. group references * - intersect attribute wildcards * - inherit attribute uses of the base type * - inherit or union attr. wildcards if extending * - apply attr. use prohibitions if restricting */ res = xmlSchemaFixupTypeAttributeUses(pctxt, type); HFAILURE HERROR /* * Apply the complex type component constraints; this will not * check attributes, since this is done in * xmlSchemaFixupTypeAttributeUses(). */ res = xmlSchemaCheckCTComponent(pctxt, type); HFAILURE HERROR #ifdef DEBUG_TYPE xmlSchemaDebugFixedType(pctxt, type); #endif if (olderrs != pctxt->nberrors) return(pctxt->err); else return(0); exit_error: type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID; #ifdef DEBUG_TYPE xmlSchemaDebugFixedType(pctxt, type); #endif return(pctxt->err); exit_failure: type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID; #ifdef DEBUG_TYPE xmlSchemaDebugFixedType(pctxt, type); #endif return(-1); } /** * xmlSchemaTypeFixup: * @typeDecl: the schema type definition * @ctxt: the schema parser context * * Fixes the content model of the type. * URGENT TODO: We need an int result! */ static int xmlSchemaTypeFixup(xmlSchemaTypePtr type, xmlSchemaAbstractCtxtPtr actxt) { if (type == NULL) return(0); if (actxt->type != XML_SCHEMA_CTXT_PARSER) { AERROR_INT("xmlSchemaTypeFixup", "this function needs a parser context"); return(-1); } if (! WXS_IS_TYPE_NOT_FIXED(type)) return(0); if (type->type == XML_SCHEMA_TYPE_COMPLEX) return(xmlSchemaFixupComplexType(PCTXT_CAST actxt, type)); else if (type->type == XML_SCHEMA_TYPE_SIMPLE) return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt, type)); return(0); } /** * xmlSchemaCheckFacet: * @facet: the facet * @typeDecl: the schema type definition * @pctxt: the schema parser context or NULL * @name: the optional name of the type * * Checks and computes the values of facets. * * Returns 0 if valid, a positive error code if not valid and * -1 in case of an internal or API error. */ int xmlSchemaCheckFacet(xmlSchemaFacetPtr facet, xmlSchemaTypePtr typeDecl, xmlSchemaParserCtxtPtr pctxt, const xmlChar * name ATTRIBUTE_UNUSED) { int ret = 0, ctxtGiven; if ((facet == NULL) || (typeDecl == NULL)) return(-1); /* * TODO: will the parser context be given if used from * the relaxNG module? */ if (pctxt == NULL) ctxtGiven = 0; else ctxtGiven = 1; switch (facet->type) { case XML_SCHEMA_FACET_MININCLUSIVE: case XML_SCHEMA_FACET_MINEXCLUSIVE: case XML_SCHEMA_FACET_MAXINCLUSIVE: case XML_SCHEMA_FACET_MAXEXCLUSIVE: case XML_SCHEMA_FACET_ENUMERATION: { /* * Okay we need to validate the value * at that point. */ xmlSchemaTypePtr base; /* 4.3.5.5 Constraints on enumeration Schema Components * Schema Component Constraint: enumeration valid restriction * It is an �error� if any member of {value} is not in the * �value space� of {base type definition}. * * minInclusive, maxInclusive, minExclusive, maxExclusive: * The value �must� be in the * �value space� of the �base type�. */ /* * This function is intended to deliver a compiled value * on the facet. In this implementation of XML Schemata the * type holding a facet, won't be a built-in type. * Thus to ensure that other API * calls (relaxng) do work, if the given type is a built-in * type, we will assume that the given built-in type *is * already* the base type. */ if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) { base = typeDecl->baseType; if (base == NULL) { PERROR_INT("xmlSchemaCheckFacet", "a type user derived type has no base type"); return (-1); } } else base = typeDecl; if (! ctxtGiven) { /* * A context is needed if called from RelaxNG. */ pctxt = xmlSchemaNewParserCtxt("*"); if (pctxt == NULL) return (-1); } /* * NOTE: This call does not check the content nodes, * since they are not available: * facet->node is just the node holding the facet * definition, *not* the attribute holding the *value* * of the facet. */ ret = xmlSchemaVCheckCVCSimpleType( ACTXT_CAST pctxt, facet->node, base, facet->value, &(facet->val), 1, 1, 0); if (ret != 0) { if (ret < 0) { /* No error message for RelaxNG. */ if (ctxtGiven) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_INTERNAL, facet->node, NULL, "Internal error: xmlSchemaCheckFacet, " "failed to validate the value '%s' of the " "facet '%s' against the base type", facet->value, xmlSchemaFacetTypeToString(facet->type)); } goto internal_error; } ret = XML_SCHEMAP_INVALID_FACET_VALUE; /* No error message for RelaxNG. */ if (ctxtGiven) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, ret, facet->node, WXS_BASIC_CAST facet, "The value '%s' of the facet does not validate " "against the base type '%s'", facet->value, xmlSchemaFormatQName(&str, base->targetNamespace, base->name)); FREE_AND_NULL(str); } goto exit; } else if (facet->val == NULL) { if (ctxtGiven) { PERROR_INT("xmlSchemaCheckFacet", "value was not computed"); } TODO } break; } case XML_SCHEMA_FACET_PATTERN: facet->regexp = xmlRegexpCompile(facet->value); if (facet->regexp == NULL) { ret = XML_SCHEMAP_REGEXP_INVALID; /* No error message for RelaxNG. */ if (ctxtGiven) { xmlSchemaCustomErr(ACTXT_CAST pctxt, ret, facet->node, WXS_BASIC_CAST typeDecl, "The value '%s' of the facet 'pattern' is not a " "valid regular expression", facet->value, NULL); } } break; case XML_SCHEMA_FACET_TOTALDIGITS: case XML_SCHEMA_FACET_FRACTIONDIGITS: case XML_SCHEMA_FACET_LENGTH: case XML_SCHEMA_FACET_MAXLENGTH: case XML_SCHEMA_FACET_MINLENGTH: if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { ret = xmlSchemaValidatePredefinedType( xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER), facet->value, &(facet->val)); } else { ret = xmlSchemaValidatePredefinedType( xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER), facet->value, &(facet->val)); } if (ret != 0) { if (ret < 0) { /* No error message for RelaxNG. */ if (ctxtGiven) { PERROR_INT("xmlSchemaCheckFacet", "validating facet value"); } goto internal_error; } ret = XML_SCHEMAP_INVALID_FACET_VALUE; /* No error message for RelaxNG. */ if (ctxtGiven) { /* error code */ xmlSchemaCustomErr4(ACTXT_CAST pctxt, ret, facet->node, WXS_BASIC_CAST typeDecl, "The value '%s' of the facet '%s' is not a valid '%s'", facet->value, xmlSchemaFacetTypeToString(facet->type), (facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ? BAD_CAST "nonNegativeInteger" : BAD_CAST "positiveInteger", NULL); } } break; case XML_SCHEMA_FACET_WHITESPACE:{ if (xmlStrEqual(facet->value, BAD_CAST "preserve")) { facet->whitespace = XML_SCHEMAS_FACET_PRESERVE; } else if (xmlStrEqual(facet->value, BAD_CAST "replace")) { facet->whitespace = XML_SCHEMAS_FACET_REPLACE; } else if (xmlStrEqual(facet->value, BAD_CAST "collapse")) { facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE; } else { ret = XML_SCHEMAP_INVALID_FACET_VALUE; /* No error message for RelaxNG. */ if (ctxtGiven) { /* error was previously: XML_SCHEMAP_INVALID_WHITE_SPACE */ xmlSchemaCustomErr(ACTXT_CAST pctxt, ret, facet->node, WXS_BASIC_CAST typeDecl, "The value '%s' of the facet 'whitespace' is not " "valid", facet->value, NULL); } } } default: break; } exit: if ((! ctxtGiven) && (pctxt != NULL)) xmlSchemaFreeParserCtxt(pctxt); return (ret); internal_error: if ((! ctxtGiven) && (pctxt != NULL)) xmlSchemaFreeParserCtxt(pctxt); return (-1); } /** * xmlSchemaCheckFacetValues: * @typeDecl: the schema type definition * @ctxt: the schema parser context * * Checks the default values types, especially for facets */ static int xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl, xmlSchemaParserCtxtPtr pctxt) { int res, olderrs = pctxt->nberrors; const xmlChar *name = typeDecl->name; /* * NOTE: It is intended to use the facets list, instead * of facetSet. */ if (typeDecl->facets != NULL) { xmlSchemaFacetPtr facet = typeDecl->facets; /* * Temporarily assign the "schema" to the validation context * of the parser context. This is needed for NOTATION validation. */ if (pctxt->vctxt == NULL) { if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1) return(-1); } pctxt->vctxt->schema = pctxt->schema; while (facet != NULL) { res = xmlSchemaCheckFacet(facet, typeDecl, pctxt, name); HFAILURE facet = facet->next; } pctxt->vctxt->schema = NULL; } if (olderrs != pctxt->nberrors) return(pctxt->err); return(0); exit_failure: return(-1); } /** * xmlSchemaGetCircModelGrDefRef: * @ctxtMGroup: the searched model group * @selfMGroup: the second searched model group * @particle: the first particle * * This one is intended to be used by * xmlSchemaCheckGroupDefCircular only. * * Returns the particle with the circular model group definition reference, * otherwise NULL. */ static xmlSchemaTreeItemPtr xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef, xmlSchemaTreeItemPtr particle) { xmlSchemaTreeItemPtr circ = NULL; xmlSchemaTreeItemPtr term; xmlSchemaModelGroupDefPtr gdef; for (; particle != NULL; particle = particle->next) { term = particle->children; if (term == NULL) continue; switch (term->type) { case XML_SCHEMA_TYPE_GROUP: gdef = (xmlSchemaModelGroupDefPtr) term; if (gdef == groupDef) return (particle); /* * Mark this model group definition to avoid infinite * recursion on circular references not yet examined. */ if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED) continue; if (gdef->children != NULL) { gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED; circ = xmlSchemaGetCircModelGrDefRef(groupDef, gdef->children->children); gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED; if (circ != NULL) return (circ); } break; case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children); if (circ != NULL) return (circ); break; default: break; } } return (NULL); } /** * xmlSchemaCheckGroupDefCircular: * @item: the model group definition * @ctxt: the parser context * @name: the name * * Checks for circular references to model group definitions. */ static void xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr item, xmlSchemaParserCtxtPtr ctxt) { /* * Schema Component Constraint: Model Group Correct * 2 Circular groups are disallowed. That is, within the {particles} * of a group there must not be at any depth a particle whose {term} * is the group itself. */ if ((item == NULL) || (item->type != XML_SCHEMA_TYPE_GROUP) || (item->children == NULL)) return; { xmlSchemaTreeItemPtr circ; circ = xmlSchemaGetCircModelGrDefRef(item, item->children->children); if (circ != NULL) { xmlChar *str = NULL; /* * TODO: The error report is not adequate: this constraint * is defined for model groups but not definitions, but since * there cannot be any circular model groups without a model group * definition (if not using a construction API), we check those * defintions only. */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_MG_PROPS_CORRECT_2, NULL, WXS_ITEM_NODE(circ), "Circular reference to the model group definition '%s' " "defined", xmlSchemaFormatQName(&str, item->targetNamespace, item->name)); FREE_AND_NULL(str) /* * NOTE: We will cut the reference to avoid further * confusion of the processor. This is a fatal error. */ circ->children = NULL; } } } /** * xmlSchemaModelGroupToModelGroupDefFixup: * @ctxt: the parser context * @mg: the model group * * Assigns the model group of model group definitions to the "term" * of the referencing particle. * In xmlSchemaResolveModelGroupParticleReferences the model group * definitions were assigned to the "term", since needed for the * circularity check. * * Schema Component Constraint: * All Group Limited (cos-all-limited) (1.2) */ static void xmlSchemaModelGroupToModelGroupDefFixup( xmlSchemaParserCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlSchemaModelGroupPtr mg) { xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg); while (particle != NULL) { if ((WXS_PARTICLE_TERM(particle) == NULL) || ((WXS_PARTICLE_TERM(particle))->type != XML_SCHEMA_TYPE_GROUP)) { particle = WXS_PTC_CAST particle->next; continue; } if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) == NULL) { /* * TODO: Remove the particle. */ WXS_PARTICLE_TERM(particle) = NULL; particle = WXS_PTC_CAST particle->next; continue; } /* * Assign the model group to the {term} of the particle. */ WXS_PARTICLE_TERM(particle) = WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)); particle = WXS_PTC_CAST particle->next; } } /** * xmlSchemaCheckAttrGroupCircularRecur: * @ctxtGr: the searched attribute group * @attr: the current attribute list to be processed * * This one is intended to be used by * xmlSchemaCheckAttrGroupCircular only. * * Returns the circular attribute grou reference, otherwise NULL. */ static xmlSchemaQNameRefPtr xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr, xmlSchemaItemListPtr list) { xmlSchemaAttributeGroupPtr gr; xmlSchemaQNameRefPtr ref, circ; int i; /* * We will search for an attribute group reference which * references the context attribute group. */ for (i = 0; i < list->nbItems; i++) { ref = list->items[i]; if ((ref->type == XML_SCHEMA_EXTRA_QNAMEREF) && (ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) && (ref->item != NULL)) { gr = WXS_ATTR_GROUP_CAST ref->item; if (gr == ctxtGr) return(ref); if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED) continue; /* * Mark as visited to avoid infinite recursion on * circular references not yet examined. */ if ((gr->attrUses) && (gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)) { gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED; circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr, (xmlSchemaItemListPtr) gr->attrUses); gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED; if (circ != NULL) return (circ); } } } return (NULL); } /** * xmlSchemaCheckAttrGroupCircular: * attrGr: the attribute group definition * @ctxt: the parser context * @name: the name * * Checks for circular references of attribute groups. */ static int xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr, xmlSchemaParserCtxtPtr ctxt) { /* * Schema Representation Constraint: * Attribute Group Definition Representation OK * 3 Circular group reference is disallowed outside . * That is, unless this element information item's parent is * , then among the [children], if any, there must * not be an with ref [attribute] which resolves * to the component corresponding to this . Indirect * circularity is also ruled out. That is, when QName resolution * (Schema Document) (�3.15.3) is applied to a �QName� arising from * any s with a ref [attribute] among the [children], * it must not be the case that a �QName� is encountered at any depth * which resolves to the component corresponding to this . */ if (attrGr->attrUses == NULL) return(0); else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0) return(0); else { xmlSchemaQNameRefPtr circ; circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr, (xmlSchemaItemListPtr) attrGr->attrUses); if (circ != NULL) { xmlChar *str = NULL; /* * TODO: Report the referenced attr group as QName. */ xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3, NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ), "Circular reference to the attribute group '%s' " "defined", xmlSchemaGetComponentQName(&str, attrGr)); FREE_AND_NULL(str); /* * NOTE: We will cut the reference to avoid further * confusion of the processor. * BADSPEC TODO: The spec should define how to process in this case. */ circ->item = NULL; return(ctxt->err); } } return(0); } static int xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt, xmlSchemaAttributeGroupPtr attrGr); /** * xmlSchemaExpandAttributeGroupRefs: * @pctxt: the parser context * @node: the node of the component holding the attribute uses * @completeWild: the intersected wildcard to be returned * @list: the attribute uses * * Substitutes contained attribute group references * for their attribute uses. Wilcards are intersected. * Attribute use prohibitions are removed from the list * and returned via the @prohibs list. * Pointlessness of attr. prohibs, if a matching attr. decl * is existent a well, are checked. */ static int xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt, xmlSchemaBasicItemPtr item, xmlSchemaWildcardPtr *completeWild, xmlSchemaItemListPtr list, xmlSchemaItemListPtr prohibs) { xmlSchemaAttributeGroupPtr gr; xmlSchemaAttributeUsePtr use; xmlSchemaItemListPtr sublist; int i, j; int created = (*completeWild == NULL) ? 0 : 1; if (prohibs) prohibs->nbItems = 0; for (i = 0; i < list->nbItems; i++) { use = list->items[i]; if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) { if (prohibs == NULL) { PERROR_INT("xmlSchemaExpandAttributeGroupRefs", "unexpected attr prohibition found"); return(-1); } /* * Remove from attribute uses. */ if (xmlSchemaItemListRemove(list, i) == -1) return(-1); i--; /* * Note that duplicate prohibitions were already * handled at parsing time. */ /* * Add to list of prohibitions. */ xmlSchemaItemListAddSize(prohibs, 2, use); continue; } if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) && ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP)) { if ((WXS_QNAME_CAST use)->item == NULL) return(-1); gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item; /* * Expand the referenced attr. group. * TODO: remove this, this is done in a previous step, so * already done here. */ if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) { if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1) return(-1); } /* * Build the 'complete' wildcard; i.e. intersect multiple * wildcards. */ if (gr->attributeWildcard != NULL) { if (*completeWild == NULL) { *completeWild = gr->attributeWildcard; } else { if (! created) { xmlSchemaWildcardPtr tmpWild; /* * Copy the first encountered wildcard as context, * except for the annotation. * * Although the complete wildcard might not correspond * to any node in the schema, we will anchor it on * the node of the owner component. */ tmpWild = xmlSchemaAddWildcard(pctxt, pctxt->schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE, WXS_ITEM_NODE(item)); if (tmpWild == NULL) return(-1); if (xmlSchemaCloneWildcardNsConstraints(pctxt, tmpWild, *completeWild) == -1) return (-1); tmpWild->processContents = (*completeWild)->processContents; *completeWild = tmpWild; created = 1; } if (xmlSchemaIntersectWildcards(pctxt, *completeWild, gr->attributeWildcard) == -1) return(-1); } } /* * Just remove the reference if the referenced group does not * contain any attribute uses. */ sublist = ((xmlSchemaItemListPtr) gr->attrUses); if ((sublist == NULL) || sublist->nbItems == 0) { if (xmlSchemaItemListRemove(list, i) == -1) return(-1); i--; continue; } /* * Add the attribute uses. */ list->items[i] = sublist->items[0]; if (sublist->nbItems != 1) { for (j = 1; j < sublist->nbItems; j++) { i++; if (xmlSchemaItemListInsert(list, sublist->items[j], i) == -1) return(-1); } } } } /* * Handle pointless prohibitions of declared attributes. */ if (prohibs && (prohibs->nbItems != 0) && (list->nbItems != 0)) { xmlSchemaAttributeUseProhibPtr prohib; for (i = prohibs->nbItems -1; i >= 0; i--) { prohib = prohibs->items[i]; for (j = 0; j < list->nbItems; j++) { use = list->items[j]; if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) && (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use))) { xmlChar *str = NULL; xmlSchemaCustomWarning(ACTXT_CAST pctxt, XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, prohib->node, NULL, "Skipping pointless attribute use prohibition " "'%s', since a corresponding attribute use " "exists already in the type definition", xmlSchemaFormatQName(&str, prohib->targetNamespace, prohib->name), NULL, NULL); FREE_AND_NULL(str); /* * Remove the prohibition. */ if (xmlSchemaItemListRemove(prohibs, i) == -1) return(-1); break; } } } } return(0); } /** * xmlSchemaAttributeGroupExpandRefs: * @pctxt: the parser context * @attrGr: the attribute group definition * * Computation of: * {attribute uses} property * {attribute wildcard} property * * Substitutes contained attribute group references * for their attribute uses. Wilcards are intersected. */ static int xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt, xmlSchemaAttributeGroupPtr attrGr) { if ((attrGr->attrUses == NULL) || (attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)) return(0); attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED; if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr, &(attrGr->attributeWildcard), attrGr->attrUses, NULL) == -1) return(-1); return(0); } /** * xmlSchemaAttributeGroupExpandRefs: * @pctxt: the parser context * @attrGr: the attribute group definition * * Substitutes contained attribute group references * for their attribute uses. Wilcards are intersected. * * Schema Component Constraint: * Attribute Group Definition Properties Correct (ag-props-correct) */ static int xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt, xmlSchemaAttributeGroupPtr attrGr) { /* * SPEC ag-props-correct * (1) "The values of the properties of an attribute group definition * must be as described in the property tableau in The Attribute * Group Definition Schema Component (�3.6.1), modulo the impact of * Missing Sub-components (�5.3);" */ if ((attrGr->attrUses != NULL) && (WXS_LIST_CAST attrGr->attrUses)->nbItems > 1) { xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses; xmlSchemaAttributeUsePtr use, tmp; int i, j, hasId = 0; for (i = uses->nbItems -1; i >= 0; i--) { use = uses->items[i]; /* * SPEC ag-props-correct * (2) "Two distinct members of the {attribute uses} must not have * {attribute declaration}s both of whose {name}s match and whose * {target namespace}s are identical." */ if (i > 0) { for (j = i -1; j >= 0; j--) { tmp = uses->items[j]; if ((WXS_ATTRUSE_DECL_NAME(use) == WXS_ATTRUSE_DECL_NAME(tmp)) && (WXS_ATTRUSE_DECL_TNS(use) == WXS_ATTRUSE_DECL_TNS(tmp))) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_AG_PROPS_CORRECT, attrGr->node, WXS_BASIC_CAST attrGr, "Duplicate %s", xmlSchemaGetComponentDesignation(&str, use), NULL); FREE_AND_NULL(str); /* * Remove the duplicate. */ if (xmlSchemaItemListRemove(uses, i) == -1) return(-1); goto next_use; } } } /* * SPEC ag-props-correct * (3) "Two distinct members of the {attribute uses} must not have * {attribute declaration}s both of whose {type definition}s are or * are derived from ID." * TODO: Does 'derived' include member-types of unions? */ if (WXS_ATTRUSE_TYPEDEF(use) != NULL) { if (xmlSchemaIsDerivedFromBuiltInType( WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) { if (hasId) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_AG_PROPS_CORRECT, attrGr->node, WXS_BASIC_CAST attrGr, "There must not exist more than one attribute " "declaration of type 'xs:ID' " "(or derived from 'xs:ID'). The %s violates this " "constraint", xmlSchemaGetComponentDesignation(&str, use), NULL); FREE_AND_NULL(str); if (xmlSchemaItemListRemove(uses, i) == -1) return(-1); } hasId = 1; } } next_use: {} } } return(0); } /** * xmlSchemaResolveAttrGroupReferences: * @attrgrpDecl: the schema attribute definition * @ctxt: the schema parser context * @name: the attribute name * * Resolves references to attribute group definitions. */ static int xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr ref, xmlSchemaParserCtxtPtr ctxt) { xmlSchemaAttributeGroupPtr group; if (ref->item != NULL) return(0); group = xmlSchemaGetAttributeGroup(ctxt->schema, ref->name, ref->targetNamespace); if (group == NULL) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, NULL, ref->node, "ref", ref->name, ref->targetNamespace, ref->itemType, NULL); return(ctxt->err); } ref->item = WXS_BASIC_CAST group; return(0); } /** * xmlSchemaCheckAttrPropsCorrect: * @item: an schema attribute declaration/use * @ctxt: a schema parser context * @name: the name of the attribute * * * Schema Component Constraint: * Attribute Declaration Properties Correct (a-props-correct) * * Validates the value constraints of an attribute declaration/use. * NOTE that this needs the simle type definitions to be already * builded and checked. */ static int xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt, xmlSchemaAttributePtr attr) { /* * SPEC a-props-correct (1) * "The values of the properties of an attribute declaration must * be as described in the property tableau in The Attribute * Declaration Schema Component (�3.2.1), modulo the impact of * Missing Sub-components (�5.3)." */ if (WXS_ATTR_TYPEDEF(attr) == NULL) return(0); if (attr->defValue != NULL) { int ret; /* * SPEC a-props-correct (3) * "If the {type definition} is or is derived from ID then there * must not be a {value constraint}." */ if (xmlSchemaIsDerivedFromBuiltInType( WXS_ATTR_TYPEDEF(attr), XML_SCHEMAS_ID)) { xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_A_PROPS_CORRECT_3, NULL, WXS_BASIC_CAST attr, "Value constraints are not allowed if the type definition " "is or is derived from xs:ID", NULL, NULL); return(pctxt->err); } /* * SPEC a-props-correct (2) * "if there is a {value constraint}, the canonical lexical * representation of its value must be �valid� with respect * to the {type definition} as defined in String Valid (�3.14.4)." * TODO: Don't care about the *cononical* stuff here, this requirement * will be removed in WXS 1.1 anyway. */ ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, attr->node, WXS_ATTR_TYPEDEF(attr), attr->defValue, &(attr->defVal), 1, 1, 0); if (ret != 0) { if (ret < 0) { PERROR_INT("xmlSchemaCheckAttrPropsCorrect", "calling xmlSchemaVCheckCVCSimpleType()"); return(-1); } xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_A_PROPS_CORRECT_2, NULL, WXS_BASIC_CAST attr, "The value of the value constraint is not valid", NULL, NULL); return(pctxt->err); } } return(0); } static xmlSchemaElementPtr xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl, xmlSchemaElementPtr ancestor) { xmlSchemaElementPtr ret; if (WXS_SUBST_HEAD(ancestor) == NULL) return (NULL); if (WXS_SUBST_HEAD(ancestor) == elemDecl) return (ancestor); if (WXS_SUBST_HEAD(ancestor)->flags & XML_SCHEMAS_ELEM_CIRCULAR) return (NULL); WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR; ret = xmlSchemaCheckSubstGroupCircular(elemDecl, WXS_SUBST_HEAD(ancestor)); WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR; return (ret); } /** * xmlSchemaCheckElemPropsCorrect: * @ctxt: a schema parser context * @decl: the element declaration * @name: the name of the attribute * * Schema Component Constraint: * Element Declaration Properties Correct (e-props-correct) * * STATUS: * missing: (6) */ static int xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt, xmlSchemaElementPtr elemDecl) { int ret = 0; xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl); /* * SPEC (1) "The values of the properties of an element declaration * must be as described in the property tableau in The Element * Declaration Schema Component (�3.3.1), modulo the impact of Missing * Sub-components (�5.3)." */ if (WXS_SUBST_HEAD(elemDecl) != NULL) { xmlSchemaElementPtr head = WXS_SUBST_HEAD(elemDecl), circ; xmlSchemaCheckElementDeclComponent(head, pctxt); /* * SPEC (3) "If there is a non-�absent� {substitution group * affiliation}, then {scope} must be global." */ if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) { xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_E_PROPS_CORRECT_3, WXS_BASIC_CAST elemDecl, NULL, "Only global element declarations can have a " "substitution group affiliation", NULL); ret = XML_SCHEMAP_E_PROPS_CORRECT_3; } /* * TODO: SPEC (6) "Circular substitution groups are disallowed. * That is, it must not be possible to return to an element declaration * by repeatedly following the {substitution group affiliation} * property." */ if (head == elemDecl) circ = head; else if (WXS_SUBST_HEAD(head) != NULL) circ = xmlSchemaCheckSubstGroupCircular(head, head); else circ = NULL; if (circ != NULL) { xmlChar *strA = NULL, *strB = NULL; xmlSchemaPCustomErrExt(pctxt, XML_SCHEMAP_E_PROPS_CORRECT_6, WXS_BASIC_CAST circ, NULL, "The element declaration '%s' defines a circular " "substitution group to element declaration '%s'", xmlSchemaGetComponentQName(&strA, circ), xmlSchemaGetComponentQName(&strB, head), NULL); FREE_AND_NULL(strA) FREE_AND_NULL(strB) ret = XML_SCHEMAP_E_PROPS_CORRECT_6; } /* * SPEC (4) "If there is a {substitution group affiliation}, * the {type definition} * of the element declaration must be validly derived from the {type * definition} of the {substitution group affiliation}, given the value * of the {substitution group exclusions} of the {substitution group * affiliation}, as defined in Type Derivation OK (Complex) (�3.4.6) * (if the {type definition} is complex) or as defined in * Type Derivation OK (Simple) (�3.14.6) (if the {type definition} is * simple)." * * NOTE: {substitution group exclusions} means the values of the * attribute "final". */ if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) { int set = 0; if (head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION) set |= SUBSET_EXTENSION; if (head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION) set |= SUBSET_RESTRICTION; if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef, WXS_ELEM_TYPEDEF(head), set) != 0) { xmlChar *strA = NULL, *strB = NULL, *strC = NULL; ret = XML_SCHEMAP_E_PROPS_CORRECT_4; xmlSchemaPCustomErrExt(pctxt, XML_SCHEMAP_E_PROPS_CORRECT_4, WXS_BASIC_CAST elemDecl, NULL, "The type definition '%s' was " "either rejected by the substitution group " "affiliation '%s', or not validly derived from its type " "definition '%s'", xmlSchemaGetComponentQName(&strA, typeDef), xmlSchemaGetComponentQName(&strB, head), xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(head))); FREE_AND_NULL(strA) FREE_AND_NULL(strB) FREE_AND_NULL(strC) } } } /* * SPEC (5) "If the {type definition} or {type definition}'s * {content type} * is or is derived from ID then there must not be a {value constraint}. * Note: The use of ID as a type definition for elements goes beyond * XML 1.0, and should be avoided if backwards compatibility is desired" */ if ((elemDecl->value != NULL) && ((WXS_IS_SIMPLE(typeDef) && xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) || (WXS_IS_COMPLEX(typeDef) && WXS_HAS_SIMPLE_CONTENT(typeDef) && xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef, XML_SCHEMAS_ID)))) { ret = XML_SCHEMAP_E_PROPS_CORRECT_5; xmlSchemaPCustomErr(pctxt, XML_SCHEMAP_E_PROPS_CORRECT_5, WXS_BASIC_CAST elemDecl, NULL, "The type definition (or type definition's content type) is or " "is derived from ID; value constraints are not allowed in " "conjunction with such a type definition", NULL); } else if (elemDecl->value != NULL) { int vcret; xmlNodePtr node = NULL; /* * SPEC (2) "If there is a {value constraint}, the canonical lexical * representation of its value must be �valid� with respect to the * {type definition} as defined in Element Default Valid (Immediate) * (�3.3.6)." */ if (typeDef == NULL) { xmlSchemaPErr(pctxt, elemDecl->node, XML_SCHEMAP_INTERNAL, "Internal error: xmlSchemaCheckElemPropsCorrect, " "type is missing... skipping validation of " "the value constraint", NULL, NULL); return (-1); } if (elemDecl->node != NULL) { if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) node = (xmlNodePtr) xmlHasProp(elemDecl->node, BAD_CAST "fixed"); else node = (xmlNodePtr) xmlHasProp(elemDecl->node, BAD_CAST "default"); } vcret = xmlSchemaParseCheckCOSValidDefault(pctxt, node, typeDef, elemDecl->value, &(elemDecl->defVal)); if (vcret != 0) { if (vcret < 0) { PERROR_INT("xmlSchemaElemCheckValConstr", "failed to validate the value constraint of an " "element declaration"); return (-1); } return (vcret); } } return (ret); } /** * xmlSchemaCheckElemSubstGroup: * @ctxt: a schema parser context * @decl: the element declaration * @name: the name of the attribute * * Schema Component Constraint: * Substitution Group (cos-equiv-class) * * In Libxml2 the subst. groups will be precomputed, in terms of that * a list will be built for each subst. group head, holding all direct * referents to this head. * NOTE that this function needs: * 1. circular subst. groups to be checked beforehand * 2. the declaration's type to be derived from the head's type * * STATUS: * */ static void xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaElementPtr elemDecl) { if ((WXS_SUBST_HEAD(elemDecl) == NULL) || /* SPEC (1) "Its {abstract} is false." */ (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)) return; { xmlSchemaElementPtr head; xmlSchemaTypePtr headType, type; int set, methSet; /* * SPEC (2) "It is validly substitutable for HEAD subject to HEAD's * {disallowed substitutions} as the blocking constraint, as defined in * Substitution Group OK (Transitive) (�3.3.6)." */ for (head = WXS_SUBST_HEAD(elemDecl); head != NULL; head = WXS_SUBST_HEAD(head)) { set = 0; methSet = 0; /* * The blocking constraints. */ if (head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) continue; headType = head->subtypes; type = elemDecl->subtypes; if (headType == type) goto add_member; if (head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; if (head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; /* * SPEC: Substitution Group OK (Transitive) (2.3) * "The set of all {derivation method}s involved in the * derivation of D's {type definition} from C's {type definition} * does not intersect with the union of the blocking constraint, * C's {prohibited substitutions} (if C is complex, otherwise the * empty set) and the {prohibited substitutions} (respectively the * empty set) of any intermediate {type definition}s in the * derivation of D's {type definition} from C's {type definition}." */ /* * OPTIMIZE TODO: Optimize this a bit, since, if traversing the * subst.head axis, the methSet does not need to be computed for * the full depth over and over. */ /* * The set of all {derivation method}s involved in the derivation */ while ((type != NULL) && (type != headType)) { if ((WXS_IS_EXTENSION(type)) && ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; if (WXS_IS_RESTRICTION(type) && ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; type = type->baseType; } /* * The {prohibited substitutions} of all intermediate types + * the head's type. */ type = elemDecl->subtypes->baseType; while (type != NULL) { if (WXS_IS_COMPLEX(type)) { if ((type->flags & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) && ((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0)) set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; if ((type->flags & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) && ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; } else break; if (type == headType) break; type = type->baseType; } if ((set != 0) && (((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) && (methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) || ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) && (methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) { continue; } add_member: xmlSchemaAddElementSubstitutionMember(ctxt, head, elemDecl); if ((head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0) head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD; } } } #ifdef WXS_ELEM_DECL_CONS_ENABLED /* enable when finished */ /** * xmlSchemaCheckElementDeclComponent * @pctxt: the schema parser context * @ctxtComponent: the context component (an element declaration) * @ctxtParticle: the first particle of the context component * @searchParticle: the element declaration particle to be analysed * * Schema Component Constraint: Element Declarations Consistent */ static int xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt, xmlSchemaBasicItemPtr ctxtComponent, xmlSchemaParticlePtr ctxtParticle, xmlSchemaParticlePtr searchParticle, xmlSchemaParticlePtr curParticle, int search) { return(0); int ret = 0; xmlSchemaParticlePtr cur = curParticle; if (curParticle == NULL) { return(0); } if (WXS_PARTICLE_TERM(curParticle) == NULL) { /* * Just return in this case. A missing "term" of the particle * might arise due to an invalid "term" component. */ return(0); } while (cur != NULL) { switch (WXS_PARTICLE_TERM(cur)->type) { case XML_SCHEMA_TYPE_ANY: break; case XML_SCHEMA_TYPE_ELEMENT: if (search == 0) { ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent, ctxtParticle, cur, ctxtParticle, 1); if (ret != 0) return(ret); } else { xmlSchemaElementPtr elem = WXS_ELEM_CAST(WXS_PARTICLE_TERM(cur)); /* * SPEC Element Declarations Consistent: * "If the {particles} contains, either directly, * indirectly (that is, within the {particles} of a * contained model group, recursively) or �implicitly� * two or more element declaration particles with * the same {name} and {target namespace}, then * all their type definitions must be the same * top-level definition [...]" */ if (xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->name, WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->name) && xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace, WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace)) { xmlChar *strA = NULL, *strB = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, /* TODO: error code */ XML_SCHEMAP_COS_NONAMBIG, WXS_ITEM_NODE(cur), NULL, "In the content model of %s, there are multiple " "element declarations for '%s' with different " "type definitions", xmlSchemaGetComponentDesignation(&strA, ctxtComponent), xmlSchemaFormatQName(&strB, WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace, WXS_PARTICLE_TERM_AS_ELEM(cur)->name)); FREE_AND_NULL(strA); FREE_AND_NULL(strB); return(XML_SCHEMAP_COS_NONAMBIG); } } break; case XML_SCHEMA_TYPE_SEQUENCE: { break; } case XML_SCHEMA_TYPE_CHOICE:{ /* xmlSchemaTreeItemPtr sub; sub = WXS_PARTICLE_TERM(particle)->children; (xmlSchemaParticlePtr) while (sub != NULL) { ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent, ctxtParticle, ctxtElem); if (ret != 0) return(ret); sub = sub->next; } */ break; } case XML_SCHEMA_TYPE_ALL: break; case XML_SCHEMA_TYPE_GROUP: break; default: xmlSchemaInternalErr2(ACTXT_CAST pctxt, "xmlSchemaCheckElementDeclConsistent", "found unexpected term of type '%s' in content model", WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(cur)), NULL); return(-1); } cur = (xmlSchemaParticlePtr) cur->next; } exit: return(ret); } #endif /** * xmlSchemaCheckElementDeclComponent * @item: an schema element declaration/particle * @ctxt: a schema parser context * @name: the name of the attribute * * Validates the value constraints of an element declaration. * Adds substitution group members. */ static void xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl, xmlSchemaParserCtxtPtr ctxt) { if (elemDecl == NULL) return; if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) return; elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED; if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) { /* * Adds substitution group members. */ xmlSchemaCheckElemSubstGroup(ctxt, elemDecl); } } /** * xmlSchemaResolveModelGroupParticleReferences: * @particle: a particle component * @ctxt: a parser context * * Resolves references of a model group's {particles} to * model group definitions and to element declarations. */ static void xmlSchemaResolveModelGroupParticleReferences( xmlSchemaParserCtxtPtr ctxt, xmlSchemaModelGroupPtr mg) { xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg); xmlSchemaQNameRefPtr ref; xmlSchemaBasicItemPtr refItem; /* * URGENT TODO: Test this. */ while (particle != NULL) { if ((WXS_PARTICLE_TERM(particle) == NULL) || ((WXS_PARTICLE_TERM(particle))->type != XML_SCHEMA_EXTRA_QNAMEREF)) { goto next_particle; } ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle); /* * Resolve the reference. * NULL the {term} by default. */ particle->children = NULL; refItem = xmlSchemaGetNamedComponent(ctxt->schema, ref->itemType, ref->name, ref->targetNamespace); if (refItem == NULL) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, NULL, WXS_ITEM_NODE(particle), "ref", ref->name, ref->targetNamespace, ref->itemType, NULL); /* TODO: remove the particle. */ goto next_particle; } if (refItem->type == XML_SCHEMA_TYPE_GROUP) { if (WXS_MODELGROUPDEF_MODEL(refItem) == NULL) /* TODO: remove the particle. */ goto next_particle; /* * NOTE that we will assign the model group definition * itself to the "term" of the particle. This will ease * the check for circular model group definitions. After * that the "term" will be assigned the model group of the * model group definition. */ if ((WXS_MODELGROUPDEF_MODEL(refItem))->type == XML_SCHEMA_TYPE_ALL) { /* * SPEC cos-all-limited (1) * SPEC cos-all-limited (1.2) * "It appears only as the value of one or both of the * following properties:" * (1.1) "the {model group} property of a model group * definition." * (1.2) "the {term} property of a particle [... of] the " * {content type} of a complex type definition." */ xmlSchemaCustomErr(ACTXT_CAST ctxt, /* TODO: error code */ XML_SCHEMAP_COS_ALL_LIMITED, WXS_ITEM_NODE(particle), NULL, "A model group definition is referenced, but " "it contains an 'all' model group, which " "cannot be contained by model groups", NULL, NULL); /* TODO: remove the particle. */ goto next_particle; } particle->children = (xmlSchemaTreeItemPtr) refItem; } else { /* * TODO: Are referenced element declarations the only * other components we expect here? */ particle->children = (xmlSchemaTreeItemPtr) refItem; } next_particle: particle = WXS_PTC_CAST particle->next; } } static int xmlSchemaAreValuesEqual(xmlSchemaValPtr x, xmlSchemaValPtr y) { xmlSchemaTypePtr tx, ty, ptx, pty; int ret; while (x != NULL) { /* Same types. */ tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(x)); ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(y)); ptx = xmlSchemaGetPrimitiveType(tx); pty = xmlSchemaGetPrimitiveType(ty); /* * (1) if a datatype T' is �derived� by �restriction� from an * atomic datatype T then the �value space� of T' is a subset of * the �value space� of T. */ /* * (2) if datatypes T' and T'' are �derived� by �restriction� * from a common atomic ancestor T then the �value space�s of T' * and T'' may overlap. */ if (ptx != pty) return(0); /* * We assume computed values to be normalized, so do a fast * string comparison for string based types. */ if ((ptx->builtInType == XML_SCHEMAS_STRING) || WXS_IS_ANY_SIMPLE_TYPE(ptx)) { if (! xmlStrEqual( xmlSchemaValueGetAsString(x), xmlSchemaValueGetAsString(y))) return (0); } else { ret = xmlSchemaCompareValuesWhtsp( x, XML_SCHEMA_WHITESPACE_PRESERVE, y, XML_SCHEMA_WHITESPACE_PRESERVE); if (ret == -2) return(-1); if (ret != 0) return(0); } /* * Lists. */ x = xmlSchemaValueGetNext(x); if (x != NULL) { y = xmlSchemaValueGetNext(y); if (y == NULL) return (0); } else if (xmlSchemaValueGetNext(y) != NULL) return (0); else return (1); } return (0); } /** * xmlSchemaResolveAttrUseReferences: * @item: an attribute use * @ctxt: a parser context * * Resolves the referenced attribute declaration. */ static int xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause, xmlSchemaParserCtxtPtr ctxt) { if ((ctxt == NULL) || (ause == NULL)) return(-1); if ((ause->attrDecl == NULL) || (ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF)) return(0); { xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST ause->attrDecl; /* * TODO: Evaluate, what errors could occur if the declaration is not * found. */ ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema, ref->name, ref->targetNamespace); if (ause->attrDecl == NULL) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST ause, ause->node, "ref", ref->name, ref->targetNamespace, XML_SCHEMA_TYPE_ATTRIBUTE, NULL); return(ctxt->err);; } } return(0); } /** * xmlSchemaCheckAttrUsePropsCorrect: * @ctxt: a parser context * @use: an attribute use * * Schema Component Constraint: * Attribute Use Correct (au-props-correct) * */ static int xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt, xmlSchemaAttributeUsePtr use) { if ((ctxt == NULL) || (use == NULL)) return(-1); if ((use->defValue == NULL) || (WXS_ATTRUSE_DECL(use) == NULL) || ((WXS_ATTRUSE_DECL(use))->type != XML_SCHEMA_TYPE_ATTRIBUTE)) return(0); /* * SPEC au-props-correct (1) * "The values of the properties of an attribute use must be as * described in the property tableau in The Attribute Use Schema * Component (�3.5.1), modulo the impact of Missing * Sub-components (�5.3)." */ if (((WXS_ATTRUSE_DECL(use))->defValue != NULL) && ((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMAS_ATTR_FIXED) && ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_AU_PROPS_CORRECT_2, WXS_BASIC_CAST use, NULL, "The attribute declaration has a 'fixed' value constraint " ", thus the attribute use must also have a 'fixed' value " "constraint", NULL); return(ctxt->err); } /* * Compute and check the value constraint's value. */ if ((use->defVal != NULL) && (WXS_ATTRUSE_TYPEDEF(use) != NULL)) { int ret; /* * TODO: The spec seems to be missing a check of the * value constraint of the attribute use. We will do it here. */ /* * SPEC a-props-correct (3) */ if (xmlSchemaIsDerivedFromBuiltInType( WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) { xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_AU_PROPS_CORRECT, NULL, WXS_BASIC_CAST use, "Value constraints are not allowed if the type definition " "is or is derived from xs:ID", NULL, NULL); return(ctxt->err); } ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt, use->node, WXS_ATTRUSE_TYPEDEF(use), use->defValue, &(use->defVal), 1, 1, 0); if (ret != 0) { if (ret < 0) { PERROR_INT2("xmlSchemaCheckAttrUsePropsCorrect", "calling xmlSchemaVCheckCVCSimpleType()"); return(-1); } xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_AU_PROPS_CORRECT, NULL, WXS_BASIC_CAST use, "The value of the value constraint is not valid", NULL, NULL); return(ctxt->err); } } /* * SPEC au-props-correct (2) * "If the {attribute declaration} has a fixed * {value constraint}, then if the attribute use itself has a * {value constraint}, it must also be fixed and its value must match * that of the {attribute declaration}'s {value constraint}." */ if (((WXS_ATTRUSE_DECL(use))->defVal != NULL) && (((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0)) { if (! xmlSchemaAreValuesEqual(use->defVal, (WXS_ATTRUSE_DECL(use))->defVal)) { xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_AU_PROPS_CORRECT_2, WXS_BASIC_CAST use, NULL, "The 'fixed' value constraint of the attribute use " "must match the attribute declaration's value " "constraint '%s'", (WXS_ATTRUSE_DECL(use))->defValue); } return(ctxt->err); } return(0); } /** * xmlSchemaResolveAttrTypeReferences: * @item: an attribute declaration * @ctxt: a parser context * * Resolves the referenced type definition component. */ static int xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr item, xmlSchemaParserCtxtPtr ctxt) { /* * The simple type definition corresponding to the element * information item in the [children], if present, otherwise the simple * type definition �resolved� to by the �actual value� of the type * [attribute], if present, otherwise the �simple ur-type definition�. */ if (item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED) return(0); item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED; if (item->subtypes != NULL) return(0); if (item->typeName != NULL) { xmlSchemaTypePtr type; type = xmlSchemaGetType(ctxt->schema, item->typeName, item->typeNs); if ((type == NULL) || (! WXS_IS_SIMPLE(type))) { xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST item, item->node, "type", item->typeName, item->typeNs, XML_SCHEMA_TYPE_SIMPLE, NULL); return(ctxt->err); } else item->subtypes = type; } else { /* * The type defaults to the xs:anySimpleType. */ item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); } return(0); } /** * xmlSchemaResolveIDCKeyReferences: * @idc: the identity-constraint definition * @ctxt: the schema parser context * @name: the attribute name * * Resolve keyRef references to key/unique IDCs. * Schema Component Constraint: * Identity-constraint Definition Properties Correct (c-props-correct) */ static int xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc, xmlSchemaParserCtxtPtr pctxt) { if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) return(0); if (idc->ref->name != NULL) { idc->ref->item = (xmlSchemaBasicItemPtr) xmlSchemaGetIDC(pctxt->schema, idc->ref->name, idc->ref->targetNamespace); if (idc->ref->item == NULL) { /* * TODO: It is actually not an error to fail to resolve * at this stage. BUT we need to be that strict! */ xmlSchemaPResCompAttrErr(pctxt, XML_SCHEMAP_SRC_RESOLVE, WXS_BASIC_CAST idc, idc->node, "refer", idc->ref->name, idc->ref->targetNamespace, XML_SCHEMA_TYPE_IDC_KEY, NULL); return(pctxt->err); } else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) { /* * SPEC c-props-correct (1) */ xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_C_PROPS_CORRECT, NULL, WXS_BASIC_CAST idc, "The keyref references a keyref", NULL, NULL); idc->ref->item = NULL; return(pctxt->err); } else { if (idc->nbFields != ((xmlSchemaIDCPtr) idc->ref->item)->nbFields) { xmlChar *str = NULL; xmlSchemaIDCPtr refer; refer = (xmlSchemaIDCPtr) idc->ref->item; /* * SPEC c-props-correct(2) * "If the {identity-constraint category} is keyref, * the cardinality of the {fields} must equal that of * the {fields} of the {referenced key}. */ xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_C_PROPS_CORRECT, NULL, WXS_BASIC_CAST idc, "The cardinality of the keyref differs from the " "cardinality of the referenced key/unique '%s'", xmlSchemaFormatQName(&str, refer->targetNamespace, refer->name), NULL); FREE_AND_NULL(str) return(pctxt->err); } } } return(0); } static int xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib, xmlSchemaParserCtxtPtr pctxt) { if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name, prohib->targetNamespace) == NULL) { xmlSchemaPResCompAttrErr(pctxt, XML_SCHEMAP_SRC_RESOLVE, NULL, prohib->node, "ref", prohib->name, prohib->targetNamespace, XML_SCHEMA_TYPE_ATTRIBUTE, NULL); return(XML_SCHEMAP_SRC_RESOLVE); } return(0); } #define WXS_REDEFINED_TYPE(c) \ (((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED) #define WXS_REDEFINED_MODEL_GROUP_DEF(c) \ (((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED) #define WXS_REDEFINED_ATTR_GROUP(c) \ (((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED) static int xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt) { int err = 0; xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs; xmlSchemaBasicItemPtr prev, item; int wasRedefined; if (redef == NULL) return(0); do { item = redef->item; /* * First try to locate the redefined component in the * schema graph starting with the redefined schema. * NOTE: According to this schema bug entry: * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005OctDec/0019.html * it's not clear if the referenced component needs to originate * from the d schema _document_ or the schema; the latter * would include all imported and included sub-schemas of the * d schema. Currenlty we latter approach is used. * SUPPLEMENT: It seems that the WG moves towards the latter * approach, so we are doing it right. * */ prev = xmlSchemaFindRedefCompInGraph( redef->targetBucket, item->type, redef->refName, redef->refTargetNs); if (prev == NULL) { xmlChar *str = NULL; xmlNodePtr node; /* * SPEC src-redefine: * (6.2.1) "The �actual value� of its own name attribute plus * target namespace must successfully �resolve� to a model * group definition in I." * (7.2.1) "The �actual value� of its own name attribute plus * target namespace must successfully �resolve� to an attribute * group definition in I." * * Note that, if we are redefining with the use of references * to components, the spec assumes the src-resolve to be used; * but this won't assure that we search only *inside* the * redefined schema. */ if (redef->reference) node = WXS_ITEM_NODE(redef->reference); else node = WXS_ITEM_NODE(item); xmlSchemaCustomErr(ACTXT_CAST pctxt, /* * TODO: error code. * Probably XML_SCHEMAP_SRC_RESOLVE, if this is using the * reference kind. */ XML_SCHEMAP_SRC_REDEFINE, node, NULL, "The %s '%s' to be redefined could not be found in " "the redefined schema", WXS_ITEM_TYPE_NAME(item), xmlSchemaFormatQName(&str, redef->refTargetNs, redef->refName)); FREE_AND_NULL(str); err = pctxt->err; redef = redef->next; continue; } /* * TODO: Obtaining and setting the redefinition state is really * clumsy. */ wasRedefined = 0; switch (item->type) { case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: if ((WXS_TYPE_CAST prev)->flags & XML_SCHEMAS_TYPE_REDEFINED) { wasRedefined = 1; break; } /* Mark it as redefined. */ (WXS_TYPE_CAST prev)->flags |= XML_SCHEMAS_TYPE_REDEFINED; /* * Assign the redefined type to the * base type of the redefining type. * TODO: How */ ((xmlSchemaTypePtr) item)->baseType = (xmlSchemaTypePtr) prev; break; case XML_SCHEMA_TYPE_GROUP: if ((WXS_MODEL_GROUPDEF_CAST prev)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED) { wasRedefined = 1; break; } /* Mark it as redefined. */ (WXS_MODEL_GROUPDEF_CAST prev)->flags |= XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED; if (redef->reference != NULL) { /* * Overwrite the QName-reference with the * referenced model group def. */ (WXS_PTC_CAST redef->reference)->children = WXS_TREE_CAST prev; } redef->target = prev; break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: if ((WXS_ATTR_GROUP_CAST prev)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED) { wasRedefined = 1; break; } (WXS_ATTR_GROUP_CAST prev)->flags |= XML_SCHEMAS_ATTRGROUP_REDEFINED; if (redef->reference != NULL) { /* * Assign the redefined attribute group to the * QName-reference component. * This is the easy case, since we will just * expand the redefined group. */ (WXS_QNAME_CAST redef->reference)->item = prev; redef->target = NULL; } else { /* * This is the complicated case: we need * to apply src-redefine (7.2.2) at a later * stage, i.e. when attribute group references * have beed expanded and simple types have * beed fixed. */ redef->target = prev; } break; default: PERROR_INT("xmlSchemaResolveRedefReferences", "Unexpected redefined component type"); return(-1); } if (wasRedefined) { xmlChar *str = NULL; xmlNodePtr node; if (redef->reference) node = WXS_ITEM_NODE(redef->reference); else node = WXS_ITEM_NODE(redef->item); xmlSchemaCustomErr(ACTXT_CAST pctxt, /* TODO: error code. */ XML_SCHEMAP_SRC_REDEFINE, node, NULL, "The referenced %s was already redefined. Multiple " "redefinition of the same component is not supported", xmlSchemaGetComponentDesignation(&str, prev), NULL); FREE_AND_NULL(str) err = pctxt->err; redef = redef->next; continue; } redef = redef->next; } while (redef != NULL); return(err); } static int xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt) { int err = 0; xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs; xmlSchemaBasicItemPtr item; if (redef == NULL) return(0); do { if (redef->target == NULL) { redef = redef->next; continue; } item = redef->item; switch (item->type) { case XML_SCHEMA_TYPE_SIMPLE: case XML_SCHEMA_TYPE_COMPLEX: /* * Since the spec wants the {name} of the redefined * type to be 'absent', we'll NULL it. */ (WXS_TYPE_CAST redef->target)->name = NULL; /* * TODO: Seems like there's nothing more to do. The normal * inheritance mechanism is used. But not 100% sure. */ break; case XML_SCHEMA_TYPE_GROUP: /* * URGENT TODO: * SPEC src-redefine: * (6.2.2) "The {model group} of the model group definition * which corresponds to it per XML Representation of Model * Group Definition Schema Components (�3.7.2) must be a * �valid restriction� of the {model group} of that model * group definition in I, as defined in Particle Valid * (Restriction) (�3.9.6)." */ break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: /* * SPEC src-redefine: * (7.2.2) "The {attribute uses} and {attribute wildcard} of * the attribute group definition which corresponds to it * per XML Representation of Attribute Group Definition Schema * Components (�3.6.2) must be �valid restrictions� of the * {attribute uses} and {attribute wildcard} of that attribute * group definition in I, as defined in clause 2, clause 3 and * clause 4 of Derivation Valid (Restriction, Complex) * (�3.4.6) (where references to the base type definition are * understood as references to the attribute group definition * in I)." */ err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt, XML_SCHEMA_ACTION_REDEFINE, item, redef->target, (WXS_ATTR_GROUP_CAST item)->attrUses, (WXS_ATTR_GROUP_CAST redef->target)->attrUses, (WXS_ATTR_GROUP_CAST item)->attributeWildcard, (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard); if (err == -1) return(-1); break; default: break; } redef = redef->next; } while (redef != NULL); return(0); } static int xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt, xmlSchemaBucketPtr bucket) { xmlSchemaBasicItemPtr item; int err; xmlHashTablePtr *table; const xmlChar *name; int i; #define WXS_GET_GLOBAL_HASH(c, slot) { \ if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \ table = &(WXS_IMPBUCKET((c))->schema->slot); \ else \ table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); } /* * Add global components to the schema's hash tables. * This is the place where duplicate components will be * detected. * TODO: I think normally we should support imports of the * same namespace from multiple locations. We don't do currently, * but if we do then according to: * http://www.w3.org/Bugs/Public/show_bug.cgi?id=2224 * we would need, if imported directly, to import redefined * components as well to be able to catch clashing components. * (I hope I'll still know what this means after some months :-() */ if (bucket == NULL) return(-1); if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) return(0); bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED; for (i = 0; i < bucket->globals->nbItems; i++) { item = bucket->globals->items[i]; table = NULL; switch (item->type) { case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: if (WXS_REDEFINED_TYPE(item)) continue; name = (WXS_TYPE_CAST item)->name; WXS_GET_GLOBAL_HASH(bucket, typeDecl) break; case XML_SCHEMA_TYPE_ELEMENT: name = (WXS_ELEM_CAST item)->name; WXS_GET_GLOBAL_HASH(bucket, elemDecl) break; case XML_SCHEMA_TYPE_ATTRIBUTE: name = (WXS_ATTR_CAST item)->name; WXS_GET_GLOBAL_HASH(bucket, attrDecl) break; case XML_SCHEMA_TYPE_GROUP: if (WXS_REDEFINED_MODEL_GROUP_DEF(item)) continue; name = (WXS_MODEL_GROUPDEF_CAST item)->name; WXS_GET_GLOBAL_HASH(bucket, groupDecl) break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: if (WXS_REDEFINED_ATTR_GROUP(item)) continue; name = (WXS_ATTR_GROUP_CAST item)->name; WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl) break; case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEYREF: name = (WXS_IDC_CAST item)->name; WXS_GET_GLOBAL_HASH(bucket, idcDef) break; case XML_SCHEMA_TYPE_NOTATION: name = ((xmlSchemaNotationPtr) item)->name; WXS_GET_GLOBAL_HASH(bucket, notaDecl) break; default: PERROR_INT("xmlSchemaAddComponents", "Unexpected global component type"); continue; } if (*table == NULL) { *table = xmlHashCreateDict(10, pctxt->dict); if (*table == NULL) { PERROR_INT("xmlSchemaAddComponents", "failed to create a component hash table"); return(-1); } } err = xmlHashAddEntry(*table, name, item); if (err != 0) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_REDEFINED_TYPE, WXS_ITEM_NODE(item), WXS_BASIC_CAST item, "A global %s '%s' does already exist", WXS_ITEM_TYPE_NAME(item), xmlSchemaGetComponentQName(&str, item)); FREE_AND_NULL(str); } } /* * Process imported/included schemas. */ if (bucket->relations != NULL) { xmlSchemaSchemaRelationPtr rel = bucket->relations; do { if ((rel->bucket != NULL) && ((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) { if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1) return(-1); } rel = rel->next; } while (rel != NULL); } return(0); } static int xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt, xmlSchemaBucketPtr rootBucket) { xmlSchemaConstructionCtxtPtr con = pctxt->constructor; xmlSchemaTreeItemPtr item, *items; int nbItems, i, ret = 0; xmlSchemaBucketPtr oldbucket = con->bucket; xmlSchemaElementPtr elemDecl; #define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure; if ((con->pending == NULL) || (con->pending->nbItems == 0)) return(0); /* * Since xmlSchemaFixupComplexType() will create new particles * (local components), and those particle components need a bucket * on the constructor, we'll assure here that the constructor has * a bucket. * TODO: Think about storing locals _only_ on the main bucket. */ if (con->bucket == NULL) con->bucket = rootBucket; /* TODO: * SPEC (src-redefine): * (6.2) "If it has no such self-reference, then all of the * following must be true:" * (6.2.2) The {model group} of the model group definition which * corresponds to it per XML Representation of Model Group * Definition Schema Components (�3.7.2) must be a �valid * restriction� of the {model group} of that model group definition * in I, as defined in Particle Valid (Restriction) (�3.9.6)." */ xmlSchemaCheckSRCRedefineFirst(pctxt); /* * Add global components to the schemata's hash tables. */ xmlSchemaAddComponents(pctxt, rootBucket); pctxt->ctxtType = NULL; items = (xmlSchemaTreeItemPtr *) con->pending->items; nbItems = con->pending->nbItems; /* * Now that we have parsed *all* the schema document(s) and converted * them to schema components, we can resolve references, apply component * constraints, create the FSA from the content model, etc. */ /* * Resolve references of.. * * 1. element declarations: * - the type definition * - the substitution group affiliation * 2. simple/complex types: * - the base type definition * - the memberTypes of union types * - the itemType of list types * 3. attributes declarations and attribute uses: * - the type definition * - if an attribute use, then the attribute declaration * 4. attribute group references: * - the attribute group definition * 5. particles: * - the term of the particle (e.g. a model group) * 6. IDC key-references: * - the referenced IDC 'key' or 'unique' definition * 7. Attribute prohibitions which had a "ref" attribute. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: xmlSchemaResolveElementReferences( (xmlSchemaElementPtr) item, pctxt); FIXHFAILURE; break; case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: xmlSchemaResolveTypeReferences( (xmlSchemaTypePtr) item, pctxt); FIXHFAILURE; break; case XML_SCHEMA_TYPE_ATTRIBUTE: xmlSchemaResolveAttrTypeReferences( (xmlSchemaAttributePtr) item, pctxt); FIXHFAILURE; break; case XML_SCHEMA_TYPE_ATTRIBUTE_USE: xmlSchemaResolveAttrUseReferences( (xmlSchemaAttributeUsePtr) item, pctxt); FIXHFAILURE; break; case XML_SCHEMA_EXTRA_QNAMEREF: if ((WXS_QNAME_CAST item)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) { xmlSchemaResolveAttrGroupReferences( WXS_QNAME_CAST item, pctxt); } FIXHFAILURE; break; case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: xmlSchemaResolveModelGroupParticleReferences(pctxt, WXS_MODEL_GROUP_CAST item); FIXHFAILURE; break; case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEYREF: xmlSchemaResolveIDCKeyReferences( (xmlSchemaIDCPtr) item, pctxt); FIXHFAILURE; break; case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: /* * Handle attribue prohibition which had a * "ref" attribute. */ xmlSchemaResolveAttrUseProhibReferences( WXS_ATTR_PROHIB_CAST item, pctxt); FIXHFAILURE; break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Now that all references are resolved we * can check for circularity of... * 1. the base axis of type definitions * 2. nested model group definitions * 3. nested attribute group definitions * TODO: check for circual substitution groups. */ for (i = 0; i < nbItems; i++) { item = items[i]; /* * Let's better stop on the first error here. */ switch (item->type) { case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: xmlSchemaCheckTypeDefCircular( (xmlSchemaTypePtr) item, pctxt); FIXHFAILURE; if (pctxt->nberrors != 0) goto exit_error; break; case XML_SCHEMA_TYPE_GROUP: xmlSchemaCheckGroupDefCircular( (xmlSchemaModelGroupDefPtr) item, pctxt); FIXHFAILURE; if (pctxt->nberrors != 0) goto exit_error; break; case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: xmlSchemaCheckAttrGroupCircular( (xmlSchemaAttributeGroupPtr) item, pctxt); FIXHFAILURE; if (pctxt->nberrors != 0) goto exit_error; break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Model group definition references: * Such a reference is reflected by a particle at the component * level. Until now the 'term' of such particles pointed * to the model group definition; this was done, in order to * ease circularity checks. Now we need to set the 'term' of * such particles to the model group of the model group definition. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: xmlSchemaModelGroupToModelGroupDefFixup(pctxt, WXS_MODEL_GROUP_CAST item); break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Expand attribute group references of attribute group definitions. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: if ((! WXS_ATTR_GROUP_EXPANDED(item)) && WXS_ATTR_GROUP_HAS_REFS(item)) { xmlSchemaAttributeGroupExpandRefs(pctxt, WXS_ATTR_GROUP_CAST item); FIXHFAILURE; } break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * First compute the variety of simple types. This is needed as * a seperate step, since otherwise we won't be able to detect * circular union types in all cases. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_SIMPLE: if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr) item)) { xmlSchemaFixupSimpleTypeStageOne(pctxt, (xmlSchemaTypePtr) item); FIXHFAILURE; } break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Detect circular union types. Note that this needs the variety to * be already computed. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_SIMPLE: if (((xmlSchemaTypePtr) item)->memberTypes != NULL) { xmlSchemaCheckUnionTypeDefCircular(pctxt, (xmlSchemaTypePtr) item); FIXHFAILURE; } break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Do the complete type fixup for simple types. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_SIMPLE: if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) { xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST item); FIXHFAILURE; } break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * At this point we need build and check all simple types. */ /* * Apply contraints for attribute declarations. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_ATTRIBUTE: xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST item); FIXHFAILURE; break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Apply constraints for attribute uses. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_ATTRIBUTE_USE: if (((xmlSchemaAttributeUsePtr)item)->defValue != NULL) { xmlSchemaCheckAttrUsePropsCorrect(pctxt, WXS_ATTR_USE_CAST item); FIXHFAILURE; } break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Apply constraints for attribute group definitions. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: if (( (WXS_ATTR_GROUP_CAST item)->attrUses != NULL) && ( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST item)->attrUses)->nbItems > 1)) { xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST item); FIXHFAILURE; } break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Apply constraints for redefinitions. */ if (WXS_CONSTRUCTOR(pctxt)->redefs != NULL) xmlSchemaCheckSRCRedefineSecond(pctxt); if (pctxt->nberrors != 0) goto exit_error; /* * Complex types are builded and checked. */ for (i = 0; i < nbItems; i++) { item = con->pending->items[i]; switch (item->type) { case XML_SCHEMA_TYPE_COMPLEX: if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) { xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST item); FIXHFAILURE; } break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * The list could have changed, since xmlSchemaFixupComplexType() * will create particles and model groups in some cases. */ items = (xmlSchemaTreeItemPtr *) con->pending->items; nbItems = con->pending->nbItems; /* * Apply some constraints for element declarations. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: elemDecl = (xmlSchemaElementPtr) item; if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0) { xmlSchemaCheckElementDeclComponent( (xmlSchemaElementPtr) elemDecl, pctxt); FIXHFAILURE; } #ifdef WXS_ELEM_DECL_CONS_ENABLED /* * Schema Component Constraint: Element Declarations Consistent * Apply this constraint to local types of element declarations. */ if ((WXS_ELEM_TYPEDEF(elemDecl) != NULL) && (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) && (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl)))) { xmlSchemaCheckElementDeclConsistent(pctxt, WXS_BASIC_CAST elemDecl, WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)), NULL, NULL, 0); } #endif break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * Finally we can build the automaton from the content model of * complex types. */ for (i = 0; i < nbItems; i++) { item = items[i]; switch (item->type) { case XML_SCHEMA_TYPE_COMPLEX: xmlSchemaBuildContentModel((xmlSchemaTypePtr) item, pctxt); /* FIXHFAILURE; */ break; default: break; } } if (pctxt->nberrors != 0) goto exit_error; /* * URGENT TODO: cos-element-consistent */ goto exit; exit_error: ret = pctxt->err; goto exit; exit_failure: ret = -1; exit: /* * Reset the constructor. This is needed for XSI acquisition, since * those items will be processed over and over again for every XSI * if not cleared here. */ con->bucket = oldbucket; con->pending->nbItems = 0; if (con->substGroups != NULL) { xmlHashFree(con->substGroups, (xmlHashDeallocator) xmlSchemaSubstGroupFree); con->substGroups = NULL; } if (con->redefs != NULL) { xmlSchemaRedefListFree(con->redefs); con->redefs = NULL; } return(ret); } /** * xmlSchemaParse: * @ctxt: a schema validation context * * parse a schema definition resource and build an internal * XML Shema struture which can be used to validate instances. * * Returns the internal XML Schema structure built from the resource or * NULL in case of error */ xmlSchemaPtr xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt) { xmlSchemaPtr mainSchema = NULL; xmlSchemaBucketPtr bucket = NULL; int res; /* * This one is used if the schema to be parsed was specified via * the API; i.e. not automatically by the validated instance document. */ xmlSchemaInitTypes(); if (ctxt == NULL) return (NULL); /* TODO: Init the context. Is this all we need?*/ ctxt->nberrors = 0; ctxt->err = 0; ctxt->counter = 0; /* Create the *main* schema. */ mainSchema = xmlSchemaNewSchema(ctxt); if (mainSchema == NULL) goto exit_failure; /* * Create the schema constructor. */ if (ctxt->constructor == NULL) { ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict); if (ctxt->constructor == NULL) return(NULL); /* Take ownership of the constructor to be able to free it. */ ctxt->ownsConstructor = 1; } ctxt->constructor->mainSchema = mainSchema; /* * Locate and add the schema document. */ res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN, ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size, NULL, NULL, NULL, &bucket); if (res == -1) goto exit_failure; if (res != 0) goto exit; if (bucket == NULL) { /* TODO: Error code, actually we failed to *locate* the schema. */ if (ctxt->URL) xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD, NULL, NULL, "Failed to locate the main schema resource at '%s'", ctxt->URL, NULL); else xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD, NULL, NULL, "Failed to locate the main schema resource", NULL, NULL); goto exit; } /* Then do the parsing for good. */ if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1) goto exit_failure; if (ctxt->nberrors != 0) goto exit; mainSchema->doc = bucket->doc; mainSchema->preserve = ctxt->preserve; ctxt->schema = mainSchema; if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1) goto exit_failure; /* * TODO: This is not nice, since we cannot distinguish from the * result if there was an internal error or not. */ exit: if (ctxt->nberrors != 0) { if (mainSchema) { xmlSchemaFree(mainSchema); mainSchema = NULL; } if (ctxt->constructor) { xmlSchemaConstructionCtxtFree(ctxt->constructor); ctxt->constructor = NULL; ctxt->ownsConstructor = 0; } } ctxt->schema = NULL; return(mainSchema); exit_failure: /* * Quite verbose, but should catch internal errors, which were * not communitated. */ if (mainSchema) { xmlSchemaFree(mainSchema); mainSchema = NULL; } if (ctxt->constructor) { xmlSchemaConstructionCtxtFree(ctxt->constructor); ctxt->constructor = NULL; ctxt->ownsConstructor = 0; } PERROR_INT2("xmlSchemaParse", "An internal error occured"); ctxt->schema = NULL; return(NULL); } /** * xmlSchemaSetParserErrors: * @ctxt: a schema validation context * @err: the error callback * @warn: the warning callback * @ctx: contextual data for the callbacks * * Set the callback functions used to handle errors for a validation context */ void xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt, xmlSchemaValidityErrorFunc err, xmlSchemaValidityWarningFunc warn, void *ctx) { if (ctxt == NULL) return; ctxt->error = err; ctxt->warning = warn; ctxt->errCtxt = ctx; if (ctxt->vctxt != NULL) xmlSchemaSetValidErrors(ctxt->vctxt, err, warn, ctx); } /** * xmlSchemaSetParserStructuredErrors: * @ctxt: a schema parser context * @serror: the structured error function * @ctx: the functions context * * Set the structured error callback */ void xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx) { if (ctxt == NULL) return; ctxt->serror = serror; ctxt->errCtxt = ctx; if (ctxt->vctxt != NULL) xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror, ctx); } /** * xmlSchemaGetParserErrors: * @ctxt: a XMl-Schema parser context * @err: the error callback result * @warn: the warning callback result * @ctx: contextual data for the callbacks result * * Get the callback information used to handle errors for a parser context * * Returns -1 in case of failure, 0 otherwise */ int xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt, xmlSchemaValidityErrorFunc * err, xmlSchemaValidityWarningFunc * warn, void **ctx) { if (ctxt == NULL) return(-1); if (err != NULL) *err = ctxt->error; if (warn != NULL) *warn = ctxt->warning; if (ctx != NULL) *ctx = ctxt->errCtxt; return(0); } /** * xmlSchemaFacetTypeToString: * @type: the facet type * * Convert the xmlSchemaTypeType to a char string. * * Returns the char string representation of the facet type if the * type is a facet and an "Internal Error" string otherwise. */ static const xmlChar * xmlSchemaFacetTypeToString(xmlSchemaTypeType type) { switch (type) { case XML_SCHEMA_FACET_PATTERN: return (BAD_CAST "pattern"); case XML_SCHEMA_FACET_MAXEXCLUSIVE: return (BAD_CAST "maxExclusive"); case XML_SCHEMA_FACET_MAXINCLUSIVE: return (BAD_CAST "maxInclusive"); case XML_SCHEMA_FACET_MINEXCLUSIVE: return (BAD_CAST "minExclusive"); case XML_SCHEMA_FACET_MININCLUSIVE: return (BAD_CAST "minInclusive"); case XML_SCHEMA_FACET_WHITESPACE: return (BAD_CAST "whiteSpace"); case XML_SCHEMA_FACET_ENUMERATION: return (BAD_CAST "enumeration"); case XML_SCHEMA_FACET_LENGTH: return (BAD_CAST "length"); case XML_SCHEMA_FACET_MAXLENGTH: return (BAD_CAST "maxLength"); case XML_SCHEMA_FACET_MINLENGTH: return (BAD_CAST "minLength"); case XML_SCHEMA_FACET_TOTALDIGITS: return (BAD_CAST "totalDigits"); case XML_SCHEMA_FACET_FRACTIONDIGITS: return (BAD_CAST "fractionDigits"); default: break; } return (BAD_CAST "Internal Error"); } static xmlSchemaWhitespaceValueType xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type) { /* * The normalization type can be changed only for types which are derived * from xsd:string. */ if (type->type == XML_SCHEMA_TYPE_BASIC) { /* * Note that we assume a whitespace of preserve for anySimpleType. */ if ((type->builtInType == XML_SCHEMAS_STRING) || (type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) return(XML_SCHEMA_WHITESPACE_PRESERVE); else if (type->builtInType == XML_SCHEMAS_NORMSTRING) return(XML_SCHEMA_WHITESPACE_REPLACE); else { /* * For all �atomic� datatypes other than string (and types �derived� * by �restriction� from it) the value of whiteSpace is fixed to * collapse * Note that this includes built-in list datatypes. */ return(XML_SCHEMA_WHITESPACE_COLLAPSE); } } else if (WXS_IS_LIST(type)) { /* * For list types the facet "whiteSpace" is fixed to "collapse". */ return (XML_SCHEMA_WHITESPACE_COLLAPSE); } else if (WXS_IS_UNION(type)) { return (XML_SCHEMA_WHITESPACE_UNKNOWN); } else if (WXS_IS_ATOMIC(type)) { if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE) return (XML_SCHEMA_WHITESPACE_PRESERVE); else if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE) return (XML_SCHEMA_WHITESPACE_REPLACE); else return (XML_SCHEMA_WHITESPACE_COLLAPSE); } return (-1); } /************************************************************************ * * * Simple type validation * * * ************************************************************************/ /************************************************************************ * * * DOM Validation code * * * ************************************************************************/ /** * xmlSchemaAssembleByLocation: * @pctxt: a schema parser context * @vctxt: a schema validation context * @schema: the existing schema * @node: the node that fired the assembling * @nsName: the namespace name of the new schema * @location: the location of the schema * * Expands an existing schema by an additional schema. * * Returns 0 if the new schema is correct, a positive error code * number otherwise and -1 in case of an internal or API error. */ static int xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt, xmlSchemaPtr schema, xmlNodePtr node, const xmlChar *nsName, const xmlChar *location) { int ret = 0; xmlSchemaParserCtxtPtr pctxt; xmlSchemaBucketPtr bucket = NULL; if ((vctxt == NULL) || (schema == NULL)) return (-1); if (vctxt->pctxt == NULL) { VERROR_INT("xmlSchemaAssembleByLocation", "no parser context available"); return(-1); } pctxt = vctxt->pctxt; if (pctxt->constructor == NULL) { PERROR_INT("xmlSchemaAssembleByLocation", "no constructor"); return(-1); } /* * Acquire the schema document. */ location = xmlSchemaBuildAbsoluteURI(pctxt->dict, location, node); /* * Note that we pass XML_SCHEMA_SCHEMA_IMPORT here; * the process will automatically change this to * XML_SCHEMA_SCHEMA_MAIN if it is the first schema document. */ ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT, location, NULL, NULL, 0, node, NULL, nsName, &bucket); if (ret != 0) return(ret); if (bucket == NULL) { /* * Generate a warning that the document could not be located. */ xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC, node, NULL, "The document at location '%s' could not be acquired", location, NULL, NULL); return(ret); } /* * The first located schema will be handled as if all other * schemas imported by XSI were imported by this first schema. */ if ((bucket != NULL) && (WXS_CONSTRUCTOR(pctxt)->bucket == NULL)) WXS_CONSTRUCTOR(pctxt)->bucket = bucket; /* * TODO: Is this handled like an import? I.e. is it not an error * if the schema cannot be located? */ if ((bucket == NULL) || (! CAN_PARSE_SCHEMA(bucket))) return(0); /* * We will reuse the parser context for every schema imported * directly via XSI. So reset the context. */ pctxt->nberrors = 0; pctxt->err = 0; pctxt->doc = bucket->doc; ret = xmlSchemaParseNewDocWithContext(pctxt, schema, bucket); if (ret == -1) { pctxt->doc = NULL; goto exit_failure; } /* Paranoid error channelling. */ if ((ret == 0) && (pctxt->nberrors != 0)) ret = pctxt->err; if (pctxt->nberrors == 0) { /* * Only bother to fixup pending components, if there was * no error yet. * For every XSI acquired schema (and its sub-schemata) we will * fixup the components. */ xmlSchemaFixupComponents(pctxt, bucket); ret = pctxt->err; /* * Not nice, but we need somehow to channel the schema parser * error to the validation context. */ if ((ret != 0) && (vctxt->err == 0)) vctxt->err = ret; vctxt->nberrors += pctxt->nberrors; } else { /* Add to validation error sum. */ vctxt->nberrors += pctxt->nberrors; } pctxt->doc = NULL; return(ret); exit_failure: pctxt->doc = NULL; return (-1); } static xmlSchemaAttrInfoPtr xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt, int metaType) { if (vctxt->nbAttrInfos == 0) return (NULL); { int i; xmlSchemaAttrInfoPtr iattr; for (i = 0; i < vctxt->nbAttrInfos; i++) { iattr = vctxt->attrInfos[i]; if (iattr->metaType == metaType) return (iattr); } } return (NULL); } /** * xmlSchemaAssembleByXSI: * @vctxt: a schema validation context * * Expands an existing schema by an additional schema using * the xsi:schemaLocation or xsi:noNamespaceSchemaLocation attribute * of an instance. If xsi:noNamespaceSchemaLocation is used, @noNamespace * must be set to 1. * * Returns 0 if the new schema is correct, a positive error code * number otherwise and -1 in case of an internal or API error. */ static int xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt) { const xmlChar *cur, *end; const xmlChar *nsname = NULL, *location; int count = 0; int ret = 0; xmlSchemaAttrInfoPtr iattr; /* * Parse the value; we will assume an even number of values * to be given (this is how Xerces and XSV work). * * URGENT TODO: !! This needs to work for both * @noNamespaceSchemaLocation AND @schemaLocation on the same * element !! */ iattr = xmlSchemaGetMetaAttrInfo(vctxt, XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC); if (iattr == NULL) iattr = xmlSchemaGetMetaAttrInfo(vctxt, XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC); if (iattr == NULL) return (0); cur = iattr->value; do { /* * TODO: Move the string parsing mechanism away from here. */ if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) { /* * Get the namespace name. */ while (IS_BLANK_CH(*cur)) cur++; end = cur; while ((*end != 0) && (!(IS_BLANK_CH(*end)))) end++; if (end == cur) break; count++; /* TODO: Don't use the schema's dict. */ nsname = xmlDictLookup(vctxt->schema->dict, cur, end - cur); cur = end; } /* * Get the URI. */ while (IS_BLANK_CH(*cur)) cur++; end = cur; while ((*end != 0) && (!(IS_BLANK_CH(*end)))) end++; if (end == cur) { if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) { /* * If using @schemaLocation then tuples are expected. * I.e. the namespace name *and* the document's URI. */ xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC, iattr->node, NULL, "The value must consist of tuples: the target namespace " "name and the document's URI", NULL, NULL, NULL); } break; } count++; /* TODO: Don't use the schema's dict. */ location = xmlDictLookup(vctxt->schema->dict, cur, end - cur); cur = end; ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema, iattr->node, nsname, location); if (ret == -1) { VERROR_INT("xmlSchemaAssembleByXSI", "assembling schemata"); return (-1); } } while (*cur != 0); return (ret); } static const xmlChar * xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt, const xmlChar *prefix) { if (vctxt->sax != NULL) { int i, j; xmlSchemaNodeInfoPtr inode; for (i = vctxt->depth; i >= 0; i--) { if (vctxt->elemInfos[i]->nbNsBindings != 0) { inode = vctxt->elemInfos[i]; for (j = 0; j < inode->nbNsBindings * 2; j += 2) { if (((prefix == NULL) && (inode->nsBindings[j] == NULL)) || ((prefix != NULL) && xmlStrEqual(prefix, inode->nsBindings[j]))) { /* * Note that the namespace bindings are already * in a string dict. */ return (inode->nsBindings[j+1]); } } } } return (NULL); #ifdef LIBXML_READER_ENABLED } else if (vctxt->reader != NULL) { xmlChar *nsName; nsName = xmlTextReaderLookupNamespace(vctxt->reader, prefix); if (nsName != NULL) { const xmlChar *ret; ret = xmlDictLookup(vctxt->dict, nsName, -1); xmlFree(nsName); return (ret); } else return (NULL); #endif } else { xmlNsPtr ns; if ((vctxt->inode->node == NULL) || (vctxt->inode->node->doc == NULL)) { VERROR_INT("xmlSchemaLookupNamespace", "no node or node's doc avaliable"); return (NULL); } ns = xmlSearchNs(vctxt->inode->node->doc, vctxt->inode->node, prefix); if (ns != NULL) return (ns->href); return (NULL); } } /* * This one works on the schema of the validation context. */ static int xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt, xmlSchemaPtr schema, xmlNodePtr node, const xmlChar *value, xmlSchemaValPtr *val, int valNeeded) { int ret; if (vctxt && (vctxt->schema == NULL)) { VERROR_INT("xmlSchemaValidateNotation", "a schema is needed on the validation context"); return (-1); } ret = xmlValidateQName(value, 1); if (ret != 0) return (ret); { xmlChar *localName = NULL; xmlChar *prefix = NULL; localName = xmlSplitQName2(value, &prefix); if (prefix != NULL) { const xmlChar *nsName = NULL; if (vctxt != NULL) nsName = xmlSchemaLookupNamespace(vctxt, BAD_CAST prefix); else if (node != NULL) { xmlNsPtr ns = xmlSearchNs(node->doc, node, prefix); if (ns != NULL) nsName = ns->href; } else { xmlFree(prefix); xmlFree(localName); return (1); } if (nsName == NULL) { xmlFree(prefix); xmlFree(localName); return (1); } if (xmlSchemaGetNotation(schema, localName, nsName) != NULL) { if ((valNeeded) && (val != NULL)) { (*val) = xmlSchemaNewNOTATIONValue(xmlStrdup(localName), xmlStrdup(nsName)); if (*val == NULL) ret = -1; } } else ret = 1; xmlFree(prefix); xmlFree(localName); } else { if (xmlSchemaGetNotation(schema, value, NULL) != NULL) { if (valNeeded && (val != NULL)) { (*val) = xmlSchemaNewNOTATIONValue( BAD_CAST xmlStrdup(value), NULL); if (*val == NULL) ret = -1; } } else return (1); } } return (ret); } static int xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt, const xmlChar* lname, const xmlChar* nsname) { int i; lname = xmlDictLookup(vctxt->dict, lname, -1); if (lname == NULL) return(-1); if (nsname != NULL) { nsname = xmlDictLookup(vctxt->dict, nsname, -1); if (nsname == NULL) return(-1); } for (i = 0; i < vctxt->nodeQNames->nbItems; i += 2) { if ((vctxt->nodeQNames->items [i] == lname) && (vctxt->nodeQNames->items[i +1] == nsname)) /* Already there */ return(i); } /* Add new entry. */ i = vctxt->nodeQNames->nbItems; xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) lname); xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) nsname); return(i); } /************************************************************************ * * * Validation of identity-constraints (IDC) * * * ************************************************************************/ /** * xmlSchemaAugmentIDC: * @idcDef: the IDC definition * * Creates an augmented IDC definition item. * * Returns the item, or NULL on internal errors. */ static void xmlSchemaAugmentIDC(xmlSchemaIDCPtr idcDef, xmlSchemaValidCtxtPtr vctxt) { xmlSchemaIDCAugPtr aidc; aidc = (xmlSchemaIDCAugPtr) xmlMalloc(sizeof(xmlSchemaIDCAug)); if (aidc == NULL) { xmlSchemaVErrMemory(vctxt, "xmlSchemaAugmentIDC: allocating an augmented IDC definition", NULL); return; } aidc->keyrefDepth = -1; aidc->def = idcDef; aidc->next = NULL; if (vctxt->aidcs == NULL) vctxt->aidcs = aidc; else { aidc->next = vctxt->aidcs; vctxt->aidcs = aidc; } /* * Save if we have keyrefs at all. */ if ((vctxt->hasKeyrefs == 0) && (idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF)) vctxt->hasKeyrefs = 1; } /** * xmlSchemaAugmentImportedIDC: * @imported: the imported schema * * Creates an augmented IDC definition for the imported schema. */ static void xmlSchemaAugmentImportedIDC(xmlSchemaImportPtr imported, xmlSchemaValidCtxtPtr vctxt) { if (imported->schema->idcDef != NULL) { xmlHashScan(imported->schema->idcDef , (xmlHashScanner) xmlSchemaAugmentIDC, vctxt); } } /** * xmlSchemaIDCNewBinding: * @idcDef: the IDC definition of this binding * * Creates a new IDC binding. * * Returns the new IDC binding, NULL on internal errors. */ static xmlSchemaPSVIIDCBindingPtr xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef) { xmlSchemaPSVIIDCBindingPtr ret; ret = (xmlSchemaPSVIIDCBindingPtr) xmlMalloc( sizeof(xmlSchemaPSVIIDCBinding)); if (ret == NULL) { xmlSchemaVErrMemory(NULL, "allocating a PSVI IDC binding item", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaPSVIIDCBinding)); ret->definition = idcDef; return (ret); } /** * xmlSchemaIDCStoreNodeTableItem: * @vctxt: the WXS validation context * @item: the IDC node table item * * The validation context is used to store IDC node table items. * They are stored to avoid copying them if IDC node-tables are merged * with corresponding parent IDC node-tables (bubbling). * * Returns 0 if succeeded, -1 on internal errors. */ static int xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt, xmlSchemaPSVIIDCNodePtr item) { /* * Add to gobal list. */ if (vctxt->idcNodes == NULL) { vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *) xmlMalloc(20 * sizeof(xmlSchemaPSVIIDCNodePtr)); if (vctxt->idcNodes == NULL) { xmlSchemaVErrMemory(vctxt, "allocating the IDC node table item list", NULL); return (-1); } vctxt->sizeIdcNodes = 20; } else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) { vctxt->sizeIdcNodes *= 2; vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *) xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes * sizeof(xmlSchemaPSVIIDCNodePtr)); if (vctxt->idcNodes == NULL) { xmlSchemaVErrMemory(vctxt, "re-allocating the IDC node table item list", NULL); return (-1); } } vctxt->idcNodes[vctxt->nbIdcNodes++] = item; return (0); } /** * xmlSchemaIDCStoreKey: * @vctxt: the WXS validation context * @item: the IDC key * * The validation context is used to store an IDC key. * * Returns 0 if succeeded, -1 on internal errors. */ static int xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt, xmlSchemaPSVIIDCKeyPtr key) { /* * Add to gobal list. */ if (vctxt->idcKeys == NULL) { vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc(40 * sizeof(xmlSchemaPSVIIDCKeyPtr)); if (vctxt->idcKeys == NULL) { xmlSchemaVErrMemory(vctxt, "allocating the IDC key storage list", NULL); return (-1); } vctxt->sizeIdcKeys = 40; } else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) { vctxt->sizeIdcKeys *= 2; vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *) xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys * sizeof(xmlSchemaPSVIIDCKeyPtr)); if (vctxt->idcKeys == NULL) { xmlSchemaVErrMemory(vctxt, "re-allocating the IDC key storage list", NULL); return (-1); } } vctxt->idcKeys[vctxt->nbIdcKeys++] = key; return (0); } /** * xmlSchemaIDCAppendNodeTableItem: * @bind: the IDC binding * @ntItem: the node-table item * * Appends the IDC node-table item to the binding. * * Returns 0 on success and -1 on internal errors. */ static int xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr bind, xmlSchemaPSVIIDCNodePtr ntItem) { if (bind->nodeTable == NULL) { bind->sizeNodes = 10; bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr)); if (bind->nodeTable == NULL) { xmlSchemaVErrMemory(NULL, "allocating an array of IDC node-table items", NULL); return(-1); } } else if (bind->sizeNodes <= bind->nbNodes) { bind->sizeNodes *= 2; bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) xmlRealloc(bind->nodeTable, bind->sizeNodes * sizeof(xmlSchemaPSVIIDCNodePtr)); if (bind->nodeTable == NULL) { xmlSchemaVErrMemory(NULL, "re-allocating an array of IDC node-table items", NULL); return(-1); } } bind->nodeTable[bind->nbNodes++] = ntItem; return(0); } /** * xmlSchemaIDCAcquireBinding: * @vctxt: the WXS validation context * @matcher: the IDC matcher * * Looks up an PSVI IDC binding, for the IDC definition and * of the given matcher. If none found, a new one is created * and added to the IDC table. * * Returns an IDC binding or NULL on internal errors. */ static xmlSchemaPSVIIDCBindingPtr xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt, xmlSchemaIDCMatcherPtr matcher) { xmlSchemaNodeInfoPtr ielem; ielem = vctxt->elemInfos[matcher->depth]; if (ielem->idcTable == NULL) { ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def); if (ielem->idcTable == NULL) return (NULL); return(ielem->idcTable); } else { xmlSchemaPSVIIDCBindingPtr bind = NULL; bind = ielem->idcTable; do { if (bind->definition == matcher->aidc->def) return(bind); if (bind->next == NULL) { bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def); if (bind->next == NULL) return (NULL); return(bind->next); } bind = bind->next; } while (bind != NULL); } return (NULL); } static xmlSchemaItemListPtr xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED, xmlSchemaIDCMatcherPtr matcher) { if (matcher->targets == NULL) matcher->targets = xmlSchemaItemListCreate(); return(matcher->targets); } /** * xmlSchemaIDCFreeKey: * @key: the IDC key * * Frees an IDC key together with its compiled value. */ static void xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr key) { if (key->val != NULL) xmlSchemaFreeValue(key->val); xmlFree(key); } /** * xmlSchemaIDCFreeBinding: * * Frees an IDC binding. Note that the node table-items * are not freed. */ static void xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr bind) { if (bind->nodeTable != NULL) xmlFree(bind->nodeTable); if (bind->dupls != NULL) xmlSchemaItemListFree(bind->dupls); xmlFree(bind); } /** * xmlSchemaIDCFreeIDCTable: * @bind: the first IDC binding in the list * * Frees an IDC table, i.e. all the IDC bindings in the list. */ static void xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr bind) { xmlSchemaPSVIIDCBindingPtr prev; while (bind != NULL) { prev = bind; bind = bind->next; xmlSchemaIDCFreeBinding(prev); } } /** * xmlSchemaIDCFreeMatcherList: * @matcher: the first IDC matcher in the list * * Frees a list of IDC matchers. */ static void xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher) { xmlSchemaIDCMatcherPtr next; while (matcher != NULL) { next = matcher->next; if (matcher->keySeqs != NULL) { int i; for (i = 0; i < matcher->sizeKeySeqs; i++) if (matcher->keySeqs[i] != NULL) xmlFree(matcher->keySeqs[i]); xmlFree(matcher->keySeqs); } if (matcher->targets != NULL) { if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) { int i; xmlSchemaPSVIIDCNodePtr idcNode; /* * Node-table items for keyrefs are not stored globally * to the validation context, since they are not bubbled. * We need to free them here. */ for (i = 0; i < matcher->targets->nbItems; i++) { idcNode = (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i]; xmlFree(idcNode->keys); xmlFree(idcNode); } } xmlSchemaItemListFree(matcher->targets); } xmlFree(matcher); matcher = next; } } /** * xmlSchemaIDCReleaseMatcherList: * @vctxt: the WXS validation context * @matcher: the first IDC matcher in the list * * Caches a list of IDC matchers for reuse. */ static void xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt, xmlSchemaIDCMatcherPtr matcher) { xmlSchemaIDCMatcherPtr next; while (matcher != NULL) { next = matcher->next; if (matcher->keySeqs != NULL) { int i; /* * Don't free the array, but only the content. */ for (i = 0; i < matcher->sizeKeySeqs; i++) if (matcher->keySeqs[i] != NULL) { xmlFree(matcher->keySeqs[i]); matcher->keySeqs[i] = NULL; } } if (matcher->targets) { if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) { int i; xmlSchemaPSVIIDCNodePtr idcNode; /* * Node-table items for keyrefs are not stored globally * to the validation context, since they are not bubbled. * We need to free them here. */ for (i = 0; i < matcher->targets->nbItems; i++) { idcNode = (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i]; xmlFree(idcNode->keys); xmlFree(idcNode); } } xmlSchemaItemListFree(matcher->targets); matcher->targets = NULL; } matcher->next = NULL; /* * Cache the matcher. */ if (vctxt->idcMatcherCache != NULL) matcher->nextCached = vctxt->idcMatcherCache; vctxt->idcMatcherCache = matcher; matcher = next; } } /** * xmlSchemaIDCAddStateObject: * @vctxt: the WXS validation context * @matcher: the IDC matcher * @sel: the XPath information * @parent: the parent "selector" state object if any * @type: "selector" or "field" * * Creates/reuses and activates state objects for the given * XPath information; if the XPath expression consists of unions, * multiple state objects are created for every unioned expression. * * Returns 0 on success and -1 on internal errors. */ static int xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt, xmlSchemaIDCMatcherPtr matcher, xmlSchemaIDCSelectPtr sel, int type) { xmlSchemaIDCStateObjPtr sto; /* * Reuse the state objects from the pool. */ if (vctxt->xpathStatePool != NULL) { sto = vctxt->xpathStatePool; vctxt->xpathStatePool = sto->next; sto->next = NULL; } else { /* * Create a new state object. */ sto = (xmlSchemaIDCStateObjPtr) xmlMalloc(sizeof(xmlSchemaIDCStateObj)); if (sto == NULL) { xmlSchemaVErrMemory(NULL, "allocating an IDC state object", NULL); return (-1); } memset(sto, 0, sizeof(xmlSchemaIDCStateObj)); } /* * Add to global list. */ if (vctxt->xpathStates != NULL) sto->next = vctxt->xpathStates; vctxt->xpathStates = sto; /* * Free the old xpath validation context. */ if (sto->xpathCtxt != NULL) xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt); /* * Create a new XPath (pattern) validation context. */ sto->xpathCtxt = (void *) xmlPatternGetStreamCtxt( (xmlPatternPtr) sel->xpathComp); if (sto->xpathCtxt == NULL) { VERROR_INT("xmlSchemaIDCAddStateObject", "failed to create an XPath validation context"); return (-1); } sto->type = type; sto->depth = vctxt->depth; sto->matcher = matcher; sto->sel = sel; sto->nbHistory = 0; #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: STO push '%s'\n", sto->sel->xpath); #endif return (0); } /** * xmlSchemaXPathEvaluate: * @vctxt: the WXS validation context * @nodeType: the nodeType of the current node * * Evaluates all active XPath state objects. * * Returns the number of IC "field" state objects which resolved to * this node, 0 if none resolved and -1 on internal errors. */ static int xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt, xmlElementType nodeType) { xmlSchemaIDCStateObjPtr sto, head = NULL, first; int res, resolved = 0, depth = vctxt->depth; if (vctxt->xpathStates == NULL) return (0); if (nodeType == XML_ATTRIBUTE_NODE) depth++; #ifdef DEBUG_IDC { xmlChar *str = NULL; xmlGenericError(xmlGenericErrorContext, "IDC: EVAL on %s, depth %d, type %d\n", xmlSchemaFormatQName(&str, vctxt->inode->nsName, vctxt->inode->localName), depth, nodeType); FREE_AND_NULL(str) } #endif /* * Process all active XPath state objects. */ first = vctxt->xpathStates; sto = first; while (sto != head) { #ifdef DEBUG_IDC if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) xmlGenericError(xmlGenericErrorContext, "IDC: ['%s'] selector '%s'\n", sto->matcher->aidc->def->name, sto->sel->xpath); else xmlGenericError(xmlGenericErrorContext, "IDC: ['%s'] field '%s'\n", sto->matcher->aidc->def->name, sto->sel->xpath); #endif if (nodeType == XML_ELEMENT_NODE) res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt, vctxt->inode->localName, vctxt->inode->nsName); else res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt, vctxt->inode->localName, vctxt->inode->nsName); if (res == -1) { VERROR_INT("xmlSchemaXPathEvaluate", "calling xmlStreamPush()"); return (-1); } if (res == 0) goto next_sto; /* * Full match. */ #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: " "MATCH\n"); #endif /* * Register a match in the state object history. */ if (sto->history == NULL) { sto->history = (int *) xmlMalloc(5 * sizeof(int)); if (sto->history == NULL) { xmlSchemaVErrMemory(NULL, "allocating the state object history", NULL); return(-1); } sto->sizeHistory = 5; } else if (sto->sizeHistory <= sto->nbHistory) { sto->sizeHistory *= 2; sto->history = (int *) xmlRealloc(sto->history, sto->sizeHistory * sizeof(int)); if (sto->history == NULL) { xmlSchemaVErrMemory(NULL, "re-allocating the state object history", NULL); return(-1); } } sto->history[sto->nbHistory++] = depth; #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: push match '%d'\n", vctxt->depth); #endif if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) { xmlSchemaIDCSelectPtr sel; /* * Activate state objects for the IDC fields of * the IDC selector. */ #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: " "activating field states\n"); #endif sel = sto->matcher->aidc->def->fields; while (sel != NULL) { if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher, sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1) return (-1); sel = sel->next; } } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) { /* * An IDC key node was found by the IDC field. */ #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: key found\n"); #endif /* * Notify that the character value of this node is * needed. */ if (resolved == 0) { if ((vctxt->inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0) vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED; } resolved++; } next_sto: if (sto->next == NULL) { /* * Evaluate field state objects created on this node as well. */ head = first; sto = vctxt->xpathStates; } else sto = sto->next; } return (resolved); } static const xmlChar * xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt, xmlChar **buf, xmlSchemaPSVIIDCKeyPtr *seq, int count) { int i, res; xmlChar *value = NULL; *buf = xmlStrdup(BAD_CAST "["); for (i = 0; i < count; i++) { *buf = xmlStrcat(*buf, BAD_CAST "'"); res = xmlSchemaGetCanonValueWhtspExt(seq[i]->val, xmlSchemaGetWhiteSpaceFacetValue(seq[i]->type), &value); if (res == 0) *buf = xmlStrcat(*buf, BAD_CAST value); else { VERROR_INT("xmlSchemaFormatIDCKeySequence", "failed to compute a canonical value"); *buf = xmlStrcat(*buf, BAD_CAST "???"); } if (i < count -1) *buf = xmlStrcat(*buf, BAD_CAST "', "); else *buf = xmlStrcat(*buf, BAD_CAST "'"); if (value != NULL) { xmlFree(value); value = NULL; } } *buf = xmlStrcat(*buf, BAD_CAST "]"); return (BAD_CAST *buf); } /** * xmlSchemaXPathPop: * @vctxt: the WXS validation context * * Pops all XPath states. * * Returns 0 on success and -1 on internal errors. */ static int xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaIDCStateObjPtr sto; int res; if (vctxt->xpathStates == NULL) return(0); sto = vctxt->xpathStates; do { res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt); if (res == -1) return (-1); sto = sto->next; } while (sto != NULL); return(0); } /** * xmlSchemaXPathProcessHistory: * @vctxt: the WXS validation context * @type: the simple/complex type of the current node if any at all * @val: the precompiled value * * Processes and pops the history items of the IDC state objects. * IDC key-sequences are validated/created on IDC bindings. * * Returns 0 on success and -1 on internal errors. */ static int xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt, int depth) { xmlSchemaIDCStateObjPtr sto, nextsto; int res, matchDepth; xmlSchemaPSVIIDCKeyPtr key = NULL; xmlSchemaTypePtr type = vctxt->inode->typeDef, simpleType = NULL; if (vctxt->xpathStates == NULL) return (0); sto = vctxt->xpathStates; #ifdef DEBUG_IDC { xmlChar *str = NULL; xmlGenericError(xmlGenericErrorContext, "IDC: BACK on %s, depth %d\n", xmlSchemaFormatQName(&str, vctxt->inode->nsName, vctxt->inode->localName), vctxt->depth); FREE_AND_NULL(str) } #endif /* * Evaluate the state objects. */ while (sto != NULL) { res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt); if (res == -1) { VERROR_INT("xmlSchemaXPathProcessHistory", "calling xmlStreamPop()"); return (-1); } #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: stream pop '%s'\n", sto->sel->xpath); #endif if (sto->nbHistory == 0) goto deregister_check; matchDepth = sto->history[sto->nbHistory -1]; /* * Only matches at the current depth are of interest. */ if (matchDepth != depth) { sto = sto->next; continue; } if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) { /* * NOTE: According to * http://www.w3.org/Bugs/Public/show_bug.cgi?id=2198 * ... the simple-content of complex types is also allowed. */ if (WXS_IS_COMPLEX(type)) { if (WXS_HAS_SIMPLE_CONTENT(type)) { /* * Sanity check for complex types with simple content. */ simpleType = type->contentTypeDef; if (simpleType == NULL) { VERROR_INT("xmlSchemaXPathProcessHistory", "field resolves to a CT with simple content " "but the CT is missing the ST definition"); return (-1); } } else simpleType = NULL; } else simpleType = type; if (simpleType == NULL) { xmlChar *str = NULL; /* * Not qualified if the field resolves to a node of non * simple type. */ xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_IDC, NULL, WXS_BASIC_CAST sto->matcher->aidc->def, "The XPath '%s' of a field of %s does evaluate to a node of " "non-simple type", sto->sel->xpath, xmlSchemaGetIDCDesignation(&str, sto->matcher->aidc->def)); FREE_AND_NULL(str); sto->nbHistory--; goto deregister_check; } if ((key == NULL) && (vctxt->inode->val == NULL)) { /* * Failed to provide the normalized value; maybe * the value was invalid. */ VERROR(XML_SCHEMAV_CVC_IDC, WXS_BASIC_CAST sto->matcher->aidc->def, "Warning: No precomputed value available, the value " "was either invalid or something strange happend"); sto->nbHistory--; goto deregister_check; } else { xmlSchemaIDCMatcherPtr matcher = sto->matcher; xmlSchemaPSVIIDCKeyPtr *keySeq; int pos, idx; /* * The key will be anchored on the matcher's list of * key-sequences. The position in this list is determined * by the target node's depth relative to the matcher's * depth of creation (i.e. the depth of the scope element). * * Element Depth Pos List-entries * 0 NULL * 1 NULL * 2 2 target * * * * The size of the list is only dependant on the depth of * the tree. * An entry will be NULLed in selector_leave, i.e. when * we hit the target's */ pos = sto->depth - matcher->depth; idx = sto->sel->index; /* * Create/grow the array of key-sequences. */ if (matcher->keySeqs == NULL) { if (pos > 9) matcher->sizeKeySeqs = pos * 2; else matcher->sizeKeySeqs = 10; matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **) xmlMalloc(matcher->sizeKeySeqs * sizeof(xmlSchemaPSVIIDCKeyPtr *)); if (matcher->keySeqs == NULL) { xmlSchemaVErrMemory(NULL, "allocating an array of key-sequences", NULL); return(-1); } memset(matcher->keySeqs, 0, matcher->sizeKeySeqs * sizeof(xmlSchemaPSVIIDCKeyPtr *)); } else if (pos >= matcher->sizeKeySeqs) { int i = matcher->sizeKeySeqs; matcher->sizeKeySeqs *= 2; matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **) xmlRealloc(matcher->keySeqs, matcher->sizeKeySeqs * sizeof(xmlSchemaPSVIIDCKeyPtr *)); if (matcher->keySeqs == NULL) { xmlSchemaVErrMemory(NULL, "reallocating an array of key-sequences", NULL); return (-1); } /* * The array needs to be NULLed. * TODO: Use memset? */ for (; i < matcher->sizeKeySeqs; i++) matcher->keySeqs[i] = NULL; } /* * Get/create the key-sequence. */ keySeq = matcher->keySeqs[pos]; if (keySeq == NULL) { goto create_sequence; } else if (keySeq[idx] != NULL) { xmlChar *str = NULL; /* * cvc-identity-constraint: * 3 For each node in the �target node set� all * of the {fields}, with that node as the context * node, evaluate to either an empty node-set or * a node-set with exactly one member, which must * have a simple type. * * The key was already set; report an error. */ xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_IDC, NULL, WXS_BASIC_CAST matcher->aidc->def, "The XPath '%s' of a field of %s evaluates to a " "node-set with more than one member", sto->sel->xpath, xmlSchemaGetIDCDesignation(&str, matcher->aidc->def)); FREE_AND_NULL(str); sto->nbHistory--; goto deregister_check; } else goto create_key; create_sequence: /* * Create a key-sequence. */ keySeq = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc( matcher->aidc->def->nbFields * sizeof(xmlSchemaPSVIIDCKeyPtr)); if (keySeq == NULL) { xmlSchemaVErrMemory(NULL, "allocating an IDC key-sequence", NULL); return(-1); } memset(keySeq, 0, matcher->aidc->def->nbFields * sizeof(xmlSchemaPSVIIDCKeyPtr)); matcher->keySeqs[pos] = keySeq; create_key: /* * Create a key once per node only. */ if (key == NULL) { key = (xmlSchemaPSVIIDCKeyPtr) xmlMalloc( sizeof(xmlSchemaPSVIIDCKey)); if (key == NULL) { xmlSchemaVErrMemory(NULL, "allocating a IDC key", NULL); xmlFree(keySeq); matcher->keySeqs[pos] = NULL; return(-1); } /* * Consume the compiled value. */ key->type = simpleType; key->val = vctxt->inode->val; vctxt->inode->val = NULL; /* * Store the key in a global list. */ if (xmlSchemaIDCStoreKey(vctxt, key) == -1) { xmlSchemaIDCFreeKey(key); return (-1); } } keySeq[idx] = key; } } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) { xmlSchemaPSVIIDCKeyPtr **keySeq = NULL; /* xmlSchemaPSVIIDCBindingPtr bind; */ xmlSchemaPSVIIDCNodePtr ntItem; xmlSchemaIDCMatcherPtr matcher; xmlSchemaIDCPtr idc; xmlSchemaItemListPtr targets; int pos, i, j, nbKeys; /* * Here we have the following scenario: * An IDC 'selector' state object resolved to a target node, * during the time this target node was in the * ancestor-or-self axis, the 'field' state object(s) looked * out for matching nodes to create a key-sequence for this * target node. Now we are back to this target node and need * to put the key-sequence, together with the target node * itself, into the node-table of the corresponding IDC * binding. */ matcher = sto->matcher; idc = matcher->aidc->def; nbKeys = idc->nbFields; pos = depth - matcher->depth; /* * Check if the matcher has any key-sequences at all, plus * if it has a key-sequence for the current target node. */ if ((matcher->keySeqs == NULL) || (matcher->sizeKeySeqs <= pos)) { if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) goto selector_key_error; else goto selector_leave; } keySeq = &(matcher->keySeqs[pos]); if (*keySeq == NULL) { if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) goto selector_key_error; else goto selector_leave; } for (i = 0; i < nbKeys; i++) { if ((*keySeq)[i] == NULL) { /* * Not qualified, if not all fields did resolve. */ if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) { /* * All fields of a "key" IDC must resolve. */ goto selector_key_error; } goto selector_leave; } } /* * All fields did resolve. */ /* * 4.1 If the {identity-constraint category} is unique(/key), * then no two members of the �qualified node set� have * �key-sequences� whose members are pairwise equal, as * defined by Equal in [XML Schemas: Datatypes]. * * Get the IDC binding from the matcher and check for * duplicate key-sequences. */ #if 0 bind = xmlSchemaIDCAcquireBinding(vctxt, matcher); #endif targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher); if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) && (targets->nbItems != 0)) { xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq; i = 0; res = 0; /* * Compare the key-sequences, key by key. */ do { bkeySeq = ((xmlSchemaPSVIIDCNodePtr) targets->items[i])->keys; for (j = 0; j < nbKeys; j++) { ckey = (*keySeq)[j]; bkey = bkeySeq[j]; res = xmlSchemaAreValuesEqual(ckey->val, bkey->val); if (res == -1) { return (-1); } else if (res == 0) { /* * One of the keys differs, so the key-sequence * won't be equal; get out. */ break; } } if (res == 1) { /* * Duplicate key-sequence found. */ break; } i++; } while (i < targets->nbItems); if (i != targets->nbItems) { xmlChar *str = NULL, *strB = NULL; /* * TODO: Try to report the key-sequence. */ xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_IDC, NULL, WXS_BASIC_CAST idc, "Duplicate key-sequence %s in %s", xmlSchemaFormatIDCKeySequence(vctxt, &str, (*keySeq), nbKeys), xmlSchemaGetIDCDesignation(&strB, idc)); FREE_AND_NULL(str); FREE_AND_NULL(strB); goto selector_leave; } } /* * Add a node-table item to the IDC binding. */ ntItem = (xmlSchemaPSVIIDCNodePtr) xmlMalloc( sizeof(xmlSchemaPSVIIDCNode)); if (ntItem == NULL) { xmlSchemaVErrMemory(NULL, "allocating an IDC node-table item", NULL); xmlFree(*keySeq); *keySeq = NULL; return(-1); } memset(ntItem, 0, sizeof(xmlSchemaPSVIIDCNode)); /* * Store the node-table item in a global list. */ if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) { if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) { xmlFree(ntItem); xmlFree(*keySeq); *keySeq = NULL; return (-1); } ntItem->nodeQNameID = -1; } else { /* * Save a cached QName for this node on the IDC node, to be * able to report it, even if the node is not saved. */ ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt, vctxt->inode->localName, vctxt->inode->nsName); if (ntItem->nodeQNameID == -1) { xmlFree(ntItem); xmlFree(*keySeq); *keySeq = NULL; return (-1); } } /* * Init the node-table item: Save the node, position and * consume the key-sequence. */ ntItem->node = vctxt->node; ntItem->nodeLine = vctxt->inode->nodeLine; ntItem->keys = *keySeq; *keySeq = NULL; #if 0 if (xmlSchemaIDCAppendNodeTableItem(bind, ntItem) == -1) #endif if (xmlSchemaItemListAdd(targets, ntItem) == -1) { if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) { /* * Free the item, since keyref items won't be * put on a global list. */ xmlFree(ntItem->keys); xmlFree(ntItem); } return (-1); } goto selector_leave; selector_key_error: { xmlChar *str = NULL; /* * 4.2.1 (KEY) The �target node set� and the * �qualified node set� are equal, that is, every * member of the �target node set� is also a member * of the �qualified node set� and vice versa. */ xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_IDC, NULL, WXS_BASIC_CAST idc, "Not all fields of %s evaluate to a node", xmlSchemaGetIDCDesignation(&str, idc), NULL); FREE_AND_NULL(str); } selector_leave: /* * Free the key-sequence if not added to the IDC table. */ if ((keySeq != NULL) && (*keySeq != NULL)) { xmlFree(*keySeq); *keySeq = NULL; } } /* if selector */ sto->nbHistory--; deregister_check: /* * Deregister state objects if they reach the depth of creation. */ if ((sto->nbHistory == 0) && (sto->depth == depth)) { #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: STO pop '%s'\n", sto->sel->xpath); #endif if (vctxt->xpathStates != sto) { VERROR_INT("xmlSchemaXPathProcessHistory", "The state object to be removed is not the first " "in the list"); } nextsto = sto->next; /* * Unlink from the list of active XPath state objects. */ vctxt->xpathStates = sto->next; sto->next = vctxt->xpathStatePool; /* * Link it to the pool of reusable state objects. */ vctxt->xpathStatePool = sto; sto = nextsto; } else sto = sto->next; } /* while (sto != NULL) */ return (0); } /** * xmlSchemaIDCRegisterMatchers: * @vctxt: the WXS validation context * @elemDecl: the element declaration * * Creates helper objects to evaluate IDC selectors/fields * successively. * * Returns 0 if OK and -1 on internal errors. */ static int xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt, xmlSchemaElementPtr elemDecl) { xmlSchemaIDCMatcherPtr matcher, last = NULL; xmlSchemaIDCPtr idc, refIdc; xmlSchemaIDCAugPtr aidc; idc = (xmlSchemaIDCPtr) elemDecl->idcs; if (idc == NULL) return (0); #ifdef DEBUG_IDC { xmlChar *str = NULL; xmlGenericError(xmlGenericErrorContext, "IDC: REGISTER on %s, depth %d\n", (char *) xmlSchemaFormatQName(&str, vctxt->inode->nsName, vctxt->inode->localName), vctxt->depth); FREE_AND_NULL(str) } #endif if (vctxt->inode->idcMatchers != NULL) { VERROR_INT("xmlSchemaIDCRegisterMatchers", "The chain of IDC matchers is expected to be empty"); return (-1); } do { if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) { /* * Since IDCs bubbles are expensive we need to know the * depth at which the bubbles should stop; this will be * the depth of the top-most keyref IDC. If no keyref * references a key/unique IDC, the keyrefDepth will * be -1, indicating that no bubbles are needed. */ refIdc = (xmlSchemaIDCPtr) idc->ref->item; if (refIdc != NULL) { /* * Remember that we have keyrefs on this node. */ vctxt->inode->hasKeyrefs = 1; /* * Lookup the referenced augmented IDC info. */ aidc = vctxt->aidcs; while (aidc != NULL) { if (aidc->def == refIdc) break; aidc = aidc->next; } if (aidc == NULL) { VERROR_INT("xmlSchemaIDCRegisterMatchers", "Could not find an augmented IDC item for an IDC " "definition"); return (-1); } if ((aidc->keyrefDepth == -1) || (vctxt->depth < aidc->keyrefDepth)) aidc->keyrefDepth = vctxt->depth; } } /* * Lookup the augmented IDC item for the IDC definition. */ aidc = vctxt->aidcs; while (aidc != NULL) { if (aidc->def == idc) break; aidc = aidc->next; } if (aidc == NULL) { VERROR_INT("xmlSchemaIDCRegisterMatchers", "Could not find an augmented IDC item for an IDC definition"); return (-1); } /* * Create an IDC matcher for every IDC definition. */ if (vctxt->idcMatcherCache != NULL) { /* * Reuse a cached matcher. */ matcher = vctxt->idcMatcherCache; vctxt->idcMatcherCache = matcher->nextCached; matcher->nextCached = NULL; } else { matcher = (xmlSchemaIDCMatcherPtr) xmlMalloc(sizeof(xmlSchemaIDCMatcher)); if (matcher == NULL) { xmlSchemaVErrMemory(vctxt, "allocating an IDC matcher", NULL); return (-1); } memset(matcher, 0, sizeof(xmlSchemaIDCMatcher)); } if (last == NULL) vctxt->inode->idcMatchers = matcher; else last->next = matcher; last = matcher; matcher->type = IDC_MATCHER; matcher->depth = vctxt->depth; matcher->aidc = aidc; matcher->idcType = aidc->def->type; #ifdef DEBUG_IDC xmlGenericError(xmlGenericErrorContext, "IDC: register matcher\n"); #endif /* * Init the automaton state object. */ if (xmlSchemaIDCAddStateObject(vctxt, matcher, idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1) return (-1); idc = idc->next; } while (idc != NULL); return (0); } static int xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt, xmlSchemaNodeInfoPtr ielem) { xmlSchemaPSVIIDCBindingPtr bind; int res, i, j, k, nbTargets, nbFields, nbDupls, nbNodeTable; xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys; xmlSchemaPSVIIDCNodePtr *targets, *dupls; xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers; /* vctxt->createIDCNodeTables */ while (matcher != NULL) { /* * Skip keyref IDCs and empty IDC target-lists. */ if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) || WXS_ILIST_IS_EMPTY(matcher->targets)) { matcher = matcher->next; continue; } /* * If we _want_ the IDC node-table to be created in any case * then do so. Otherwise create them only if keyrefs need them. */ if ((! vctxt->createIDCNodeTables) && ((matcher->aidc->keyrefDepth == -1) || (matcher->aidc->keyrefDepth > vctxt->depth))) { matcher = matcher->next; continue; } /* * Get/create the IDC binding on this element for the IDC definition. */ bind = xmlSchemaIDCAcquireBinding(vctxt, matcher); if (! WXS_ILIST_IS_EMPTY(bind->dupls)) { dupls = (xmlSchemaPSVIIDCNodePtr *) bind->dupls->items; nbDupls = bind->dupls->nbItems; } else { dupls = NULL; nbDupls = 0; } if (bind->nodeTable != NULL) { nbNodeTable = bind->nbNodes; } else { nbNodeTable = 0; } if ((nbNodeTable == 0) && (nbDupls == 0)) { /* * Transfer all IDC target-nodes to the IDC node-table. */ bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items; bind->sizeNodes = matcher->targets->sizeItems; bind->nbNodes = matcher->targets->nbItems; matcher->targets->items = NULL; matcher->targets->sizeItems = 0; matcher->targets->nbItems = 0; } else { /* * Compare the key-sequences and add to the IDC node-table. */ nbTargets = matcher->targets->nbItems; targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items; nbFields = matcher->aidc->def->nbFields; i = 0; do { keys = targets[i]->keys; if (nbDupls) { /* * Search in already found duplicates first. */ j = 0; do { if (nbFields == 1) { res = xmlSchemaAreValuesEqual(keys[0]->val, dupls[j]->keys[0]->val); if (res == -1) goto internal_error; if (res == 1) { /* * Equal key-sequence. */ goto next_target; } } else { res = 0; ntkeys = dupls[j]->keys; for (k = 0; k < nbFields; k++) { res = xmlSchemaAreValuesEqual(keys[k]->val, ntkeys[k]->val); if (res == -1) goto internal_error; if (res == 0) { /* * One of the keys differs. */ break; } } if (res == 1) { /* * Equal key-sequence found. */ goto next_target; } } j++; } while (j < nbDupls); } if (nbNodeTable) { j = 0; do { if (nbFields == 1) { res = xmlSchemaAreValuesEqual(keys[0]->val, bind->nodeTable[j]->keys[0]->val); if (res == -1) goto internal_error; if (res == 0) { /* * The key-sequence differs. */ goto next_node_table_entry; } } else { res = 0; ntkeys = bind->nodeTable[j]->keys; for (k = 0; k < nbFields; k++) { res = xmlSchemaAreValuesEqual(keys[k]->val, ntkeys[k]->val); if (res == -1) goto internal_error; if (res == 0) { /* * One of the keys differs. */ goto next_node_table_entry; } } } /* * Add the duplicate to the list of duplicates. */ if (bind->dupls == NULL) { bind->dupls = xmlSchemaItemListCreate(); if (bind->dupls == NULL) goto internal_error; } if (xmlSchemaItemListAdd(bind->dupls, bind->nodeTable[j]) == -1) goto internal_error; /* * Remove the duplicate entry from the IDC node-table. */ bind->nodeTable[j] = bind->nodeTable[bind->nbNodes -1]; bind->nbNodes--; goto next_target; next_node_table_entry: j++; } while (j < nbNodeTable); } /* * If everything is fine, then add the IDC target-node to * the IDC node-table. */ if (xmlSchemaIDCAppendNodeTableItem(bind, targets[i]) == -1) goto internal_error; next_target: i++; } while (i < nbTargets); } matcher = matcher->next; } return(0); internal_error: return(-1); } /** * xmlSchemaBubbleIDCNodeTables: * @depth: the current tree depth * * Merges IDC bindings of an element at @depth into the corresponding IDC * bindings of its parent element. If a duplicate note-table entry is found, * both, the parent node-table entry and child entry are discarded from the * node-table of the parent. * * Returns 0 if OK and -1 on internal errors. */ static int xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaPSVIIDCBindingPtr bind; /* IDC bindings of the current node. */ xmlSchemaPSVIIDCBindingPtr *parTable, parBind = NULL; /* parent IDC bindings. */ xmlSchemaPSVIIDCNodePtr node, parNode = NULL, *dupls, *parNodes; /* node-table entries. */ xmlSchemaIDCAugPtr aidc; int i, j, k, ret = 0, nbFields, oldNum, oldDupls; bind = vctxt->inode->idcTable; if (bind == NULL) { /* Fine, no table, no bubbles. */ return (0); } parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable); /* * Walk all bindings; create new or add to existing bindings. * Remove duplicate key-sequences. */ while (bind != NULL) { if ((bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(bind->dupls)) goto next_binding; /* * Check if the key/unique IDC table needs to be bubbled. */ if (! vctxt->createIDCNodeTables) { aidc = vctxt->aidcs; do { if (aidc->def == bind->definition) { if ((aidc->keyrefDepth == -1) || (aidc->keyrefDepth >= vctxt->depth)) { goto next_binding; } break; } aidc = aidc->next; } while (aidc != NULL); } if (parTable != NULL) parBind = *parTable; /* * Search a matching parent binding for the * IDC definition. */ while (parBind != NULL) { if (parBind->definition == bind->definition) break; parBind = parBind->next; } if (parBind != NULL) { /* * Compare every node-table entry of the child node, * i.e. the key-sequence within, ... */ oldNum = parBind->nbNodes; /* Skip newly added items. */ if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) { oldDupls = parBind->dupls->nbItems; dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items; } else { dupls = NULL; oldDupls = 0; } parNodes = parBind->nodeTable; nbFields = bind->definition->nbFields; for (i = 0; i < bind->nbNodes; i++) { node = bind->nodeTable[i]; if (node == NULL) continue; /* * ...with every key-sequence of the parent node, already * evaluated to be a duplicate key-sequence. */ if (oldDupls) { j = 0; while (j < oldDupls) { if (nbFields == 1) { ret = xmlSchemaAreValuesEqual( node->keys[0]->val, dupls[j]->keys[0]->val); if (ret == -1) goto internal_error; if (ret == 0) { j++; continue; } } else { parNode = dupls[j]; for (k = 0; k < nbFields; k++) { ret = xmlSchemaAreValuesEqual( node->keys[k]->val, parNode->keys[k]->val); if (ret == -1) goto internal_error; if (ret == 0) break; } } if (ret == 1) /* Duplicate found. */ break; j++; } if (j != oldDupls) { /* Duplicate found. Skip this entry. */ continue; } } /* * ... and with every key-sequence of the parent node. */ if (oldNum) { j = 0; while (j < oldNum) { parNode = parNodes[j]; if (nbFields == 1) { ret = xmlSchemaAreValuesEqual( node->keys[0]->val, parNode->keys[0]->val); if (ret == -1) goto internal_error; if (ret == 0) { j++; continue; } } else { for (k = 0; k < nbFields; k++) { ret = xmlSchemaAreValuesEqual( node->keys[k]->val, parNode->keys[k]->val); if (ret == -1) goto internal_error; if (ret == 0) break; } } if (ret == 1) /* Duplicate found. */ break; j++; } if (j != oldNum) { /* * Handle duplicates. Move the duplicate in * the parent's node-table to the list of * duplicates. */ oldNum--; parBind->nbNodes--; /* * Move last old item to pos of duplicate. */ parNodes[j] = parNodes[oldNum]; if (parBind->nbNodes != oldNum) { /* * If new items exist, move last new item to * last of old items. */ parNodes[oldNum] = parNodes[parBind->nbNodes]; } if (parBind->dupls == NULL) { parBind->dupls = xmlSchemaItemListCreate(); if (parBind->dupls == NULL) goto internal_error; } xmlSchemaItemListAdd(parBind->dupls, parNode); } else { /* * Add the node-table entry (node and key-sequence) of * the child node to the node table of the parent node. */ if (parBind->nodeTable == NULL) { parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr)); if (parBind->nodeTable == NULL) { xmlSchemaVErrMemory(NULL, "allocating IDC list of node-table items", NULL); goto internal_error; } parBind->sizeNodes = 1; } else if (parBind->nbNodes >= parBind->sizeNodes) { parBind->sizeNodes *= 2; parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) xmlRealloc(parBind->nodeTable, parBind->sizeNodes * sizeof(xmlSchemaPSVIIDCNodePtr)); if (parBind->nodeTable == NULL) { xmlSchemaVErrMemory(NULL, "re-allocating IDC list of node-table items", NULL); goto internal_error; } } parNodes = parBind->nodeTable; /* * Append the new node-table entry to the 'new node-table * entries' section. */ parNodes[parBind->nbNodes++] = node; } } } } else { /* * No binding for the IDC was found: create a new one and * copy all node-tables. */ parBind = xmlSchemaIDCNewBinding(bind->definition); if (parBind == NULL) goto internal_error; /* * TODO: Hmm, how to optimize the initial number of * allocated entries? */ if (bind->nbNodes != 0) { /* * Add all IDC node-table entries. */ if (! vctxt->psviExposeIDCNodeTables) { /* * Just move the entries. * NOTE: this is quite save here, since * all the keyref lookups have already been * performed. */ parBind->nodeTable = bind->nodeTable; bind->nodeTable = NULL; parBind->sizeNodes = bind->sizeNodes; bind->sizeNodes = 0; parBind->nbNodes = bind->nbNodes; bind->nbNodes = 0; } else { /* * Copy the entries. */ parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) xmlMalloc(bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr)); if (parBind->nodeTable == NULL) { xmlSchemaVErrMemory(NULL, "allocating an array of IDC node-table " "items", NULL); xmlSchemaIDCFreeBinding(parBind); goto internal_error; } parBind->sizeNodes = bind->nbNodes; parBind->nbNodes = bind->nbNodes; memcpy(parBind->nodeTable, bind->nodeTable, bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr)); } } if (bind->dupls) { /* * Move the duplicates. */ if (parBind->dupls != NULL) xmlSchemaItemListFree(parBind->dupls); parBind->dupls = bind->dupls; bind->dupls = NULL; } if (parTable != NULL) { if (*parTable == NULL) *parTable = parBind; else { parBind->next = *parTable; *parTable = parBind; } } } next_binding: bind = bind->next; } return (0); internal_error: return(-1); } /** * xmlSchemaCheckCVCIDCKeyRef: * @vctxt: the WXS validation context * @elemDecl: the element declaration * * Check the cvc-idc-keyref constraints. */ static int xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaIDCMatcherPtr matcher; xmlSchemaPSVIIDCBindingPtr bind; matcher = vctxt->inode->idcMatchers; /* * Find a keyref. */ while (matcher != NULL) { if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) && matcher->targets && matcher->targets->nbItems) { int i, j, k, res, nbFields, hasDupls; xmlSchemaPSVIIDCKeyPtr *refKeys, *keys; xmlSchemaPSVIIDCNodePtr refNode = NULL; nbFields = matcher->aidc->def->nbFields; /* * Find the IDC node-table for the referenced IDC key/unique. */ bind = vctxt->inode->idcTable; while (bind != NULL) { if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item == bind->definition) break; bind = bind->next; } hasDupls = (bind && bind->dupls && bind->dupls->nbItems) ? 1 : 0; /* * Search for a matching key-sequences. */ for (i = 0; i < matcher->targets->nbItems; i++) { res = 0; refNode = matcher->targets->items[i]; if (bind != NULL) { refKeys = refNode->keys; for (j = 0; j < bind->nbNodes; j++) { keys = bind->nodeTable[j]->keys; for (k = 0; k < nbFields; k++) { res = xmlSchemaAreValuesEqual(keys[k]->val, refKeys[k]->val); if (res == 0) break; else if (res == -1) { return (-1); } } if (res == 1) { /* * Match found. */ break; } } if ((res == 0) && hasDupls) { /* * Search in duplicates */ for (j = 0; j < bind->dupls->nbItems; j++) { keys = ((xmlSchemaPSVIIDCNodePtr) bind->dupls->items[j])->keys; for (k = 0; k < nbFields; k++) { res = xmlSchemaAreValuesEqual(keys[k]->val, refKeys[k]->val); if (res == 0) break; else if (res == -1) { return (-1); } } if (res == 1) { /* * Match in duplicates found. */ xmlChar *str = NULL, *strB = NULL; xmlSchemaKeyrefErr(vctxt, XML_SCHEMAV_CVC_IDC, refNode, (xmlSchemaTypePtr) matcher->aidc->def, "More than one match found for " "key-sequence %s of keyref '%s'", xmlSchemaFormatIDCKeySequence(vctxt, &str, refNode->keys, nbFields), xmlSchemaGetComponentQName(&strB, matcher->aidc->def)); FREE_AND_NULL(str); FREE_AND_NULL(strB); break; } } } } if (res == 0) { xmlChar *str = NULL, *strB = NULL; xmlSchemaKeyrefErr(vctxt, XML_SCHEMAV_CVC_IDC, refNode, (xmlSchemaTypePtr) matcher->aidc->def, "No match found for key-sequence %s of keyref '%s'", xmlSchemaFormatIDCKeySequence(vctxt, &str, refNode->keys, nbFields), xmlSchemaGetComponentQName(&strB, matcher->aidc->def)); FREE_AND_NULL(str); FREE_AND_NULL(strB); } } } matcher = matcher->next; } /* TODO: Return an error if any error encountered. */ return (0); } /************************************************************************ * * * XML Reader validation code * * * ************************************************************************/ static xmlSchemaAttrInfoPtr xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaAttrInfoPtr iattr; /* * Grow/create list of attribute infos. */ if (vctxt->attrInfos == NULL) { vctxt->attrInfos = (xmlSchemaAttrInfoPtr *) xmlMalloc(sizeof(xmlSchemaAttrInfoPtr)); vctxt->sizeAttrInfos = 1; if (vctxt->attrInfos == NULL) { xmlSchemaVErrMemory(vctxt, "allocating attribute info list", NULL); return (NULL); } } else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) { vctxt->sizeAttrInfos++; vctxt->attrInfos = (xmlSchemaAttrInfoPtr *) xmlRealloc(vctxt->attrInfos, vctxt->sizeAttrInfos * sizeof(xmlSchemaAttrInfoPtr)); if (vctxt->attrInfos == NULL) { xmlSchemaVErrMemory(vctxt, "re-allocating attribute info list", NULL); return (NULL); } } else { iattr = vctxt->attrInfos[vctxt->nbAttrInfos++]; if (iattr->localName != NULL) { VERROR_INT("xmlSchemaGetFreshAttrInfo", "attr info not cleared"); return (NULL); } iattr->nodeType = XML_ATTRIBUTE_NODE; return (iattr); } /* * Create an attribute info. */ iattr = (xmlSchemaAttrInfoPtr) xmlMalloc(sizeof(xmlSchemaAttrInfo)); if (iattr == NULL) { xmlSchemaVErrMemory(vctxt, "creating new attribute info", NULL); return (NULL); } memset(iattr, 0, sizeof(xmlSchemaAttrInfo)); iattr->nodeType = XML_ATTRIBUTE_NODE; vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr; return (iattr); } static int xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt, xmlNodePtr attrNode, int nodeLine, const xmlChar *localName, const xmlChar *nsName, int ownedNames, xmlChar *value, int ownedValue) { xmlSchemaAttrInfoPtr attr; attr = xmlSchemaGetFreshAttrInfo(vctxt); if (attr == NULL) { VERROR_INT("xmlSchemaPushAttribute", "calling xmlSchemaGetFreshAttrInfo()"); return (-1); } attr->node = attrNode; attr->nodeLine = nodeLine; attr->state = XML_SCHEMAS_ATTR_UNKNOWN; attr->localName = localName; attr->nsName = nsName; if (ownedNames) attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES; /* * Evaluate if it's an XSI attribute. */ if (nsName != NULL) { if (xmlStrEqual(localName, BAD_CAST "nil")) { if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL; } } else if (xmlStrEqual(localName, BAD_CAST "type")) { if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE; } } else if (xmlStrEqual(localName, BAD_CAST "schemaLocation")) { if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC; } } else if (xmlStrEqual(localName, BAD_CAST "noNamespaceSchemaLocation")) { if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC; } } else if (xmlStrEqual(attr->nsName, xmlNamespaceNs)) { attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS; } } attr->value = value; if (ownedValue) attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; if (attr->metaType != 0) attr->state = XML_SCHEMAS_ATTR_META; return (0); } /** * xmlSchemaClearElemInfo: * @vctxt: the WXS validation context * @ielem: the element information item */ static void xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt, xmlSchemaNodeInfoPtr ielem) { ielem->hasKeyrefs = 0; ielem->appliedXPath = 0; if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) { FREE_AND_NULL(ielem->localName); FREE_AND_NULL(ielem->nsName); } else { ielem->localName = NULL; ielem->nsName = NULL; } if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { FREE_AND_NULL(ielem->value); } else { ielem->value = NULL; } if (ielem->val != NULL) { /* * PSVI TODO: Be careful not to free it when the value is * exposed via PSVI. */ xmlSchemaFreeValue(ielem->val); ielem->val = NULL; } if (ielem->idcMatchers != NULL) { /* * REVISIT OPTIMIZE TODO: Use a pool of IDC matchers. * Does it work? */ xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers); #if 0 xmlSchemaIDCFreeMatcherList(ielem->idcMatchers); #endif ielem->idcMatchers = NULL; } if (ielem->idcTable != NULL) { /* * OPTIMIZE TODO: Use a pool of IDC tables??. */ xmlSchemaIDCFreeIDCTable(ielem->idcTable); ielem->idcTable = NULL; } if (ielem->regexCtxt != NULL) { xmlRegFreeExecCtxt(ielem->regexCtxt); ielem->regexCtxt = NULL; } if (ielem->nsBindings != NULL) { xmlFree((xmlChar **)ielem->nsBindings); ielem->nsBindings = NULL; ielem->nbNsBindings = 0; ielem->sizeNsBindings = 0; } } /** * xmlSchemaGetFreshElemInfo: * @vctxt: the schema validation context * * Creates/reuses and initializes the element info item for * the currect tree depth. * * Returns the element info item or NULL on API or internal errors. */ static xmlSchemaNodeInfoPtr xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaNodeInfoPtr info = NULL; if (vctxt->depth > vctxt->sizeElemInfos) { VERROR_INT("xmlSchemaGetFreshElemInfo", "inconsistent depth encountered"); return (NULL); } if (vctxt->elemInfos == NULL) { vctxt->elemInfos = (xmlSchemaNodeInfoPtr *) xmlMalloc(10 * sizeof(xmlSchemaNodeInfoPtr)); if (vctxt->elemInfos == NULL) { xmlSchemaVErrMemory(vctxt, "allocating the element info array", NULL); return (NULL); } memset(vctxt->elemInfos, 0, 10 * sizeof(xmlSchemaNodeInfoPtr)); vctxt->sizeElemInfos = 10; } else if (vctxt->sizeElemInfos <= vctxt->depth) { int i = vctxt->sizeElemInfos; vctxt->sizeElemInfos *= 2; vctxt->elemInfos = (xmlSchemaNodeInfoPtr *) xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos * sizeof(xmlSchemaNodeInfoPtr)); if (vctxt->elemInfos == NULL) { xmlSchemaVErrMemory(vctxt, "re-allocating the element info array", NULL); return (NULL); } /* * We need the new memory to be NULLed. * TODO: Use memset instead? */ for (; i < vctxt->sizeElemInfos; i++) vctxt->elemInfos[i] = NULL; } else info = vctxt->elemInfos[vctxt->depth]; if (info == NULL) { info = (xmlSchemaNodeInfoPtr) xmlMalloc(sizeof(xmlSchemaNodeInfo)); if (info == NULL) { xmlSchemaVErrMemory(vctxt, "allocating an element info", NULL); return (NULL); } vctxt->elemInfos[vctxt->depth] = info; } else { if (info->localName != NULL) { VERROR_INT("xmlSchemaGetFreshElemInfo", "elem info has not been cleared"); return (NULL); } } memset(info, 0, sizeof(xmlSchemaNodeInfo)); info->nodeType = XML_ELEMENT_NODE; info->depth = vctxt->depth; return (info); } #define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item; #define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth]; #define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1]; static int xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt, xmlNodePtr node, xmlSchemaTypePtr type, xmlSchemaValType valType, const xmlChar * value, xmlSchemaValPtr val, unsigned long length, int fireErrors) { int ret, error = 0; xmlSchemaTypePtr tmpType; xmlSchemaFacetLinkPtr facetLink; xmlSchemaFacetPtr facet; unsigned long len = 0; xmlSchemaWhitespaceValueType ws; /* * In Libxml2, derived built-in types have currently no explicit facets. */ if (type->type == XML_SCHEMA_TYPE_BASIC) return (0); /* * NOTE: Do not jump away, if the facetSet of the given type is * empty: until now, "pattern" and "enumeration" facets of the * *base types* need to be checked as well. */ if (type->facetSet == NULL) goto pattern_and_enum; if (! WXS_IS_ATOMIC(type)) { if (WXS_IS_LIST(type)) goto WXS_IS_LIST; else goto pattern_and_enum; } /* * Whitespace handling is only of importance for string-based * types. */ tmpType = xmlSchemaGetPrimitiveType(type); if ((tmpType->builtInType == XML_SCHEMAS_STRING) || WXS_IS_ANY_SIMPLE_TYPE(tmpType)) { ws = xmlSchemaGetWhiteSpaceFacetValue(type); } else ws = XML_SCHEMA_WHITESPACE_COLLAPSE; /* * If the value was not computed (for string or * anySimpleType based types), then use the provided * type. */ if (val == NULL) valType = valType; else valType = xmlSchemaGetValType(val); ret = 0; for (facetLink = type->facetSet; facetLink != NULL; facetLink = facetLink->next) { /* * Skip the pattern "whiteSpace": it is used to * format the character content beforehand. */ switch (facetLink->facet->type) { case XML_SCHEMA_FACET_WHITESPACE: case XML_SCHEMA_FACET_PATTERN: case XML_SCHEMA_FACET_ENUMERATION: continue; case XML_SCHEMA_FACET_LENGTH: case XML_SCHEMA_FACET_MINLENGTH: case XML_SCHEMA_FACET_MAXLENGTH: ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet, valType, value, val, &len, ws); break; default: ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws, valType, value, val, ws); break; } if (ret < 0) { AERROR_INT("xmlSchemaValidateFacets", "validating against a atomic type facet"); return (-1); } else if (ret > 0) { if (fireErrors) xmlSchemaFacetErr(actxt, ret, node, value, len, type, facetLink->facet, NULL, NULL, NULL); else return (ret); if (error == 0) error = ret; } ret = 0; } WXS_IS_LIST: if (! WXS_IS_LIST(type)) goto pattern_and_enum; /* * "length", "minLength" and "maxLength" of list types. */ ret = 0; for (facetLink = type->facetSet; facetLink != NULL; facetLink = facetLink->next) { switch (facetLink->facet->type) { case XML_SCHEMA_FACET_LENGTH: case XML_SCHEMA_FACET_MINLENGTH: case XML_SCHEMA_FACET_MAXLENGTH: ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet, value, length, NULL); break; default: continue; } if (ret < 0) { AERROR_INT("xmlSchemaValidateFacets", "validating against a list type facet"); return (-1); } else if (ret > 0) { if (fireErrors) xmlSchemaFacetErr(actxt, ret, node, value, length, type, facetLink->facet, NULL, NULL, NULL); else return (ret); if (error == 0) error = ret; } ret = 0; } pattern_and_enum: if (error >= 0) { int found = 0; /* * Process enumerations. Facet values are in the value space * of the defining type's base type. This seems to be a bug in the * XML Schema 1.0 spec. Use the whitespace type of the base type. * Only the first set of enumerations in the ancestor-or-self axis * is used for validation. */ ret = 0; tmpType = type; do { for (facet = tmpType->facets; facet != NULL; facet = facet->next) { if (facet->type != XML_SCHEMA_FACET_ENUMERATION) continue; found = 1; ret = xmlSchemaAreValuesEqual(facet->val, val); if (ret == 1) break; else if (ret < 0) { AERROR_INT("xmlSchemaValidateFacets", "validating against an enumeration facet"); return (-1); } } if (ret != 0) break; /* * Break on the first set of enumerations. Any additional * enumerations which might be existent on the ancestors * of the current type are restricted by this set; thus * *must* *not* be taken into account. */ if (found) break; tmpType = tmpType->baseType; } while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC)); if (found && (ret == 0)) { ret = XML_SCHEMAV_CVC_ENUMERATION_VALID; if (fireErrors) { xmlSchemaFacetErr(actxt, ret, node, value, 0, type, NULL, NULL, NULL, NULL); } else return (ret); if (error == 0) error = ret; } } if (error >= 0) { int found; /* * Process patters. Pattern facets are ORed at type level * and ANDed if derived. Walk the base type axis. */ tmpType = type; facet = NULL; do { found = 0; for (facetLink = tmpType->facetSet; facetLink != NULL; facetLink = facetLink->next) { if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN) continue; found = 1; /* * NOTE that for patterns, @value needs to be the * normalized vaule. */ ret = xmlRegexpExec(facetLink->facet->regexp, value); if (ret == 1) break; else if (ret < 0) { AERROR_INT("xmlSchemaValidateFacets", "validating against a pattern facet"); return (-1); } else { /* * Save the last non-validating facet. */ facet = facetLink->facet; } } if (found && (ret != 1)) { ret = XML_SCHEMAV_CVC_PATTERN_VALID; if (fireErrors) { xmlSchemaFacetErr(actxt, ret, node, value, 0, type, facet, NULL, NULL, NULL); } else return (ret); if (error == 0) error = ret; break; } tmpType = tmpType->baseType; } while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC)); } return (error); } static xmlChar * xmlSchemaNormalizeValue(xmlSchemaTypePtr type, const xmlChar *value) { switch (xmlSchemaGetWhiteSpaceFacetValue(type)) { case XML_SCHEMA_WHITESPACE_COLLAPSE: return (xmlSchemaCollapseString(value)); case XML_SCHEMA_WHITESPACE_REPLACE: return (xmlSchemaWhiteSpaceReplace(value)); default: return (NULL); } } static int xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt, const xmlChar *value, xmlSchemaValPtr *val, int valNeeded) { int ret; const xmlChar *nsName; xmlChar *local, *prefix = NULL; ret = xmlValidateQName(value, 1); if (ret != 0) { if (ret == -1) { VERROR_INT("xmlSchemaValidateQName", "calling xmlValidateQName()"); return (-1); } return( XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1); } /* * NOTE: xmlSplitQName2 will always return a duplicated * strings. */ local = xmlSplitQName2(value, &prefix); if (local == NULL) local = xmlStrdup(value); /* * OPTIMIZE TODO: Use flags for: * - is there any namespace binding? * - is there a default namespace? */ nsName = xmlSchemaLookupNamespace(vctxt, prefix); if (prefix != NULL) { xmlFree(prefix); /* * A namespace must be found if the prefix is * NOT NULL. */ if (nsName == NULL) { ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL, WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), "The QName value '%s' has no " "corresponding namespace declaration in " "scope", value, NULL); if (local != NULL) xmlFree(local); return (ret); } } if (valNeeded && val) { if (nsName != NULL) *val = xmlSchemaNewQNameValue( BAD_CAST xmlStrdup(nsName), BAD_CAST local); else *val = xmlSchemaNewQNameValue(NULL, BAD_CAST local); } else xmlFree(local); return (0); } /* * cvc-simple-type */ static int xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt, xmlNodePtr node, xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *retVal, int fireErrors, int normalize, int isNormalized) { int ret = 0, valNeeded = (retVal) ? 1 : 0; xmlSchemaValPtr val = NULL; /* xmlSchemaWhitespaceValueType ws; */ xmlChar *normValue = NULL; #define NORMALIZE(atype) \ if ((! isNormalized) && \ (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \ normValue = xmlSchemaNormalizeValue(atype, value); \ if (normValue != NULL) \ value = normValue; \ isNormalized = 1; \ } if ((retVal != NULL) && (*retVal != NULL)) { xmlSchemaFreeValue(*retVal); *retVal = NULL; } /* * 3.14.4 Simple Type Definition Validation Rules * Validation Rule: String Valid */ /* * 1 It is schema-valid with respect to that definition as defined * by Datatype Valid in [XML Schemas: Datatypes]. */ /* * 2.1 If The definition is ENTITY or is validly derived from ENTITY given * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), then * the string must be a �declared entity name�. */ /* * 2.2 If The definition is ENTITIES or is validly derived from ENTITIES * given the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), * then every whitespace-delimited substring of the string must be a �declared * entity name�. */ /* * 2.3 otherwise no further condition applies. */ if ((! valNeeded) && (type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE)) valNeeded = 1; if (value == NULL) value = BAD_CAST ""; if (WXS_IS_ANY_SIMPLE_TYPE(type) || WXS_IS_ATOMIC(type)) { xmlSchemaTypePtr biType; /* The built-in type. */ /* * SPEC (1.2.1) "if {variety} is �atomic� then the string must �match� * a literal in the �lexical space� of {base type definition}" */ /* * Whitespace-normalize. */ NORMALIZE(type); if (type->type != XML_SCHEMA_TYPE_BASIC) { /* * Get the built-in type. */ biType = type->baseType; while ((biType != NULL) && (biType->type != XML_SCHEMA_TYPE_BASIC)) biType = biType->baseType; if (biType == NULL) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "could not get the built-in type"); goto internal_error; } } else biType = type; /* * NOTATIONs need to be processed here, since they need * to lookup in the hashtable of NOTATION declarations of the schema. */ if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) { switch (biType->builtInType) { case XML_SCHEMAS_NOTATION: ret = xmlSchemaValidateNotation( (xmlSchemaValidCtxtPtr) actxt, ((xmlSchemaValidCtxtPtr) actxt)->schema, NULL, value, &val, valNeeded); break; case XML_SCHEMAS_QNAME: ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt, value, &val, valNeeded); break; default: /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */ if (valNeeded) ret = xmlSchemaValPredefTypeNodeNoNorm(biType, value, &val, node); else ret = xmlSchemaValPredefTypeNodeNoNorm(biType, value, NULL, node); break; } } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) { switch (biType->builtInType) { case XML_SCHEMAS_NOTATION: ret = xmlSchemaValidateNotation(NULL, ((xmlSchemaParserCtxtPtr) actxt)->schema, node, value, &val, valNeeded); break; default: /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */ if (valNeeded) ret = xmlSchemaValPredefTypeNodeNoNorm(biType, value, &val, node); else ret = xmlSchemaValPredefTypeNodeNoNorm(biType, value, NULL, node); break; } } else { /* * Validation via a public API is not implemented yet. */ TODO goto internal_error; } if (ret != 0) { if (ret < 0) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "validating against a built-in type"); goto internal_error; } if (WXS_IS_LIST(type)) ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; else ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; } if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { /* * Check facets. */ ret = xmlSchemaValidateFacets(actxt, node, type, (xmlSchemaValType) biType->builtInType, value, val, 0, fireErrors); if (ret != 0) { if (ret < 0) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "validating facets of atomic simple type"); goto internal_error; } if (WXS_IS_LIST(type)) ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; else ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; } } if (fireErrors && (ret > 0)) xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); } else if (WXS_IS_LIST(type)) { xmlSchemaTypePtr itemType; const xmlChar *cur, *end; xmlChar *tmpValue = NULL; unsigned long len = 0; xmlSchemaValPtr prevVal = NULL, curVal = NULL; /* 1.2.2 if {variety} is �list� then the string must be a sequence * of white space separated tokens, each of which �match�es a literal * in the �lexical space� of {item type definition} */ /* * Note that XML_SCHEMAS_TYPE_NORMVALUENEEDED will be set if * the list type has an enum or pattern facet. */ NORMALIZE(type); /* * VAL TODO: Optimize validation of empty values. * VAL TODO: We do not have computed values for lists. */ itemType = WXS_LIST_ITEMTYPE(type); cur = value; do { while (IS_BLANK_CH(*cur)) cur++; end = cur; while ((*end != 0) && (!(IS_BLANK_CH(*end)))) end++; if (end == cur) break; tmpValue = xmlStrndup(cur, end - cur); len++; if (valNeeded) ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType, tmpValue, &curVal, fireErrors, 0, 1); else ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType, tmpValue, NULL, fireErrors, 0, 1); FREE_AND_NULL(tmpValue); if (curVal != NULL) { /* * Add to list of computed values. */ if (val == NULL) val = curVal; else xmlSchemaValueAppend(prevVal, curVal); prevVal = curVal; curVal = NULL; } if (ret != 0) { if (ret < 0) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "validating an item of list simple type"); goto internal_error; } ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; break; } cur = end; } while (*cur != 0); FREE_AND_NULL(tmpValue); if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { /* * Apply facets (pattern, enumeration). */ ret = xmlSchemaValidateFacets(actxt, node, type, XML_SCHEMAS_UNKNOWN, value, val, len, fireErrors); if (ret != 0) { if (ret < 0) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "validating facets of list simple type"); goto internal_error; } ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; } } if (fireErrors && (ret > 0)) { /* * Report the normalized value. */ normalize = 1; NORMALIZE(type); xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); } } else if (WXS_IS_UNION(type)) { xmlSchemaTypeLinkPtr memberLink; /* * TODO: For all datatypes �derived� by �union� whiteSpace does * not apply directly; however, the normalization behavior of �union� * types is controlled by the value of whiteSpace on that one of the * �memberTypes� against which the �union� is successfully validated. * * This means that the value is normalized by the first validating * member type, then the facets of the union type are applied. This * needs changing of the value! */ /* * 1.2.3 if {variety} is �union� then the string must �match� a * literal in the �lexical space� of at least one member of * {member type definitions} */ memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(type); if (memberLink == NULL) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "union simple type has no member types"); goto internal_error; } /* * Always normalize union type values, since we currently * cannot store the whitespace information with the value * itself; otherwise a later value-comparison would be * not possible. */ while (memberLink != NULL) { if (valNeeded) ret = xmlSchemaVCheckCVCSimpleType(actxt, node, memberLink->type, value, &val, 0, 1, 0); else ret = xmlSchemaVCheckCVCSimpleType(actxt, node, memberLink->type, value, NULL, 0, 1, 0); if (ret <= 0) break; memberLink = memberLink->next; } if (ret != 0) { if (ret < 0) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "validating members of union simple type"); goto internal_error; } ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3; } /* * Apply facets (pattern, enumeration). */ if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { /* * The normalization behavior of �union� types is controlled by * the value of whiteSpace on that one of the �memberTypes� * against which the �union� is successfully validated. */ NORMALIZE(memberLink->type); ret = xmlSchemaValidateFacets(actxt, node, type, XML_SCHEMAS_UNKNOWN, value, val, 0, fireErrors); if (ret != 0) { if (ret < 0) { AERROR_INT("xmlSchemaVCheckCVCSimpleType", "validating facets of union simple type"); goto internal_error; } ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3; } } if (fireErrors && (ret > 0)) xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); } if (normValue != NULL) xmlFree(normValue); if (ret == 0) { if (retVal != NULL) *retVal = val; else if (val != NULL) xmlSchemaFreeValue(val); } else if (val != NULL) xmlSchemaFreeValue(val); return (ret); internal_error: if (normValue != NULL) xmlFree(normValue); if (val != NULL) xmlSchemaFreeValue(val); return (-1); } static int xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt, const xmlChar *value, const xmlChar **nsName, const xmlChar **localName) { int ret = 0; if ((nsName == NULL) || (localName == NULL)) return (-1); *nsName = NULL; *localName = NULL; ret = xmlValidateQName(value, 1); if (ret == -1) return (-1); if (ret > 0) { xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL, value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1); return (1); } { xmlChar *local = NULL; xmlChar *prefix; /* * NOTE: xmlSplitQName2 will return a duplicated * string. */ local = xmlSplitQName2(value, &prefix); if (local == NULL) *localName = xmlDictLookup(vctxt->dict, value, -1); else { *localName = xmlDictLookup(vctxt->dict, local, -1); xmlFree(local); } *nsName = xmlSchemaLookupNamespace(vctxt, prefix); if (prefix != NULL) { xmlFree(prefix); /* * A namespace must be found if the prefix is NOT NULL. */ if (*nsName == NULL) { xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL, WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), "The QName value '%s' has no " "corresponding namespace declaration in scope", value, NULL); return (2); } } } return (0); } static int xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt, xmlSchemaAttrInfoPtr iattr, xmlSchemaTypePtr *localType, xmlSchemaElementPtr elemDecl) { int ret = 0; /* * cvc-elt (3.3.4) : (4) * AND * Schema-Validity Assessment (Element) (cvc-assess-elt) * (1.2.1.2.1) - (1.2.1.2.4) * Handle 'xsi:type'. */ if (localType == NULL) return (-1); *localType = NULL; if (iattr == NULL) return (0); else { const xmlChar *nsName = NULL, *local = NULL; /* * TODO: We should report a *warning* that the type was overriden * by the instance. */ ACTIVATE_ATTRIBUTE(iattr); /* * (cvc-elt) (3.3.4) : (4.1) * (cvc-assess-elt) (1.2.1.2.2) */ ret = xmlSchemaVExpandQName(vctxt, iattr->value, &nsName, &local); if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaValidateElementByDeclaration", "calling xmlSchemaQNameExpand() to validate the " "attribute 'xsi:type'"); goto internal_error; } goto exit; } /* * (cvc-elt) (3.3.4) : (4.2) * (cvc-assess-elt) (1.2.1.2.3) */ *localType = xmlSchemaGetType(vctxt->schema, local, nsName); if (*localType == NULL) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_ELT_4_2, NULL, WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), "The QName value '%s' of the xsi:type attribute does not " "resolve to a type definition", xmlSchemaFormatQName(&str, nsName, local), NULL); FREE_AND_NULL(str); ret = vctxt->err; goto exit; } if (elemDecl != NULL) { int set = 0; /* * SPEC cvc-elt (3.3.4) : (4.3) (Type Derivation OK) * "The �local type definition� must be validly * derived from the {type definition} given the union of * the {disallowed substitutions} and the {type definition}'s * {prohibited substitutions}, as defined in * Type Derivation OK (Complex) (�3.4.6) * (if it is a complex type definition), * or given {disallowed substitutions} as defined in Type * Derivation OK (Simple) (�3.14.6) (if it is a simple type * definition)." * * {disallowed substitutions}: the "block" on the element decl. * {prohibited substitutions}: the "block" on the type def. */ /* * OPTIMIZE TODO: We could map types already evaluated * to be validly derived from other types to avoid checking * this over and over for the same types. */ if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) || (elemDecl->subtypes->flags & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) set |= SUBSET_EXTENSION; if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) || (elemDecl->subtypes->flags & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)) set |= SUBSET_RESTRICTION; /* * REMOVED and CHANGED since this produced a parser context * which adds to the string dict of the schema. So this would * change the schema and we don't want this. We don't need * the parser context anymore. * * if ((vctxt->pctxt == NULL) && * (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1)) * return (-1); */ if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType, elemDecl->subtypes, set) != 0) { xmlChar *str = NULL; xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_ELT_4_3, NULL, NULL, "The type definition '%s', specified by xsi:type, is " "blocked or not validly derived from the type definition " "of the element declaration", xmlSchemaFormatQName(&str, (*localType)->targetNamespace, (*localType)->name), NULL); FREE_AND_NULL(str); ret = vctxt->err; *localType = NULL; } } } exit: ACTIVATE_ELEM; return (ret); internal_error: ACTIVATE_ELEM; return (-1); } static int xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaElementPtr elemDecl = vctxt->inode->decl; xmlSchemaTypePtr actualType; /* * cvc-elt (3.3.4) : 1 */ if (elemDecl == NULL) { VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, "No matching declaration available"); return (vctxt->err); } actualType = WXS_ELEM_TYPEDEF(elemDecl); /* * cvc-elt (3.3.4) : 2 */ if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) { VERROR(XML_SCHEMAV_CVC_ELT_2, NULL, "The element declaration is abstract"); return (vctxt->err); } if (actualType == NULL) { VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL, "The type definition is absent"); return (XML_SCHEMAV_CVC_TYPE_1); } if (vctxt->nbAttrInfos != 0) { int ret; xmlSchemaAttrInfoPtr iattr; /* * cvc-elt (3.3.4) : 3 * Handle 'xsi:nil'. */ iattr = xmlSchemaGetMetaAttrInfo(vctxt, XML_SCHEMA_ATTR_INFO_META_XSI_NIL); if (iattr) { ACTIVATE_ATTRIBUTE(iattr); /* * Validate the value. */ ret = xmlSchemaVCheckCVCSimpleType( ACTXT_CAST vctxt, NULL, xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), iattr->value, &(iattr->val), 1, 0, 0); ACTIVATE_ELEM; if (ret < 0) { VERROR_INT("xmlSchemaValidateElemDecl", "calling xmlSchemaVCheckCVCSimpleType() to " "validate the attribute 'xsi:nil'"); return (-1); } if (ret == 0) { if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) { /* * cvc-elt (3.3.4) : 3.1 */ VERROR(XML_SCHEMAV_CVC_ELT_3_1, NULL, "The element is not 'nillable'"); /* Does not return an error on purpose. */ } else { if (xmlSchemaValueGetAsBoolean(iattr->val)) { /* * cvc-elt (3.3.4) : 3.2.2 */ if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) && (elemDecl->value != NULL)) { VERROR(XML_SCHEMAV_CVC_ELT_3_2_2, NULL, "The element cannot be 'nilled' because " "there is a fixed value constraint defined " "for it"); /* Does not return an error on purpose. */ } else vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_NILLED; } } } } /* * cvc-elt (3.3.4) : 4 * Handle 'xsi:type'. */ iattr = xmlSchemaGetMetaAttrInfo(vctxt, XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); if (iattr) { xmlSchemaTypePtr localType = NULL; ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType, elemDecl); if (ret != 0) { if (ret == -1) { VERROR_INT("xmlSchemaValidateElemDecl", "calling xmlSchemaProcessXSIType() to " "process the attribute 'xsi:type'"); return (-1); } /* Does not return an error on purpose. */ } if (localType != NULL) { vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE; actualType = localType; } } } /* * IDC: Register identity-constraint XPath matchers. */ if ((elemDecl->idcs != NULL) && (xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1)) return (-1); /* * No actual type definition. */ if (actualType == NULL) { VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL, "The type definition is absent"); return (XML_SCHEMAV_CVC_TYPE_1); } /* * Remember the actual type definition. */ vctxt->inode->typeDef = actualType; return (0); } static int xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaAttrInfoPtr iattr; int ret = 0, i; /* * SPEC cvc-type (3.1.1) * "The attributes of must be empty, excepting those whose namespace * name is identical to http://www.w3.org/2001/XMLSchema-instance and * whose local name is one of type, nil, schemaLocation or * noNamespaceSchemaLocation." */ if (vctxt->nbAttrInfos == 0) return (0); for (i = 0; i < vctxt->nbAttrInfos; i++) { iattr = vctxt->attrInfos[i]; if (! iattr->metaType) { ACTIVATE_ATTRIBUTE(iattr) xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_TYPE_3_1_1, iattr, NULL); ret = XML_SCHEMAV_CVC_TYPE_3_1_1; } } ACTIVATE_ELEM return (ret); } /* * Cleanup currently used attribute infos. */ static void xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt) { int i; xmlSchemaAttrInfoPtr attr; if (vctxt->nbAttrInfos == 0) return; for (i = 0; i < vctxt->nbAttrInfos; i++) { attr = vctxt->attrInfos[i]; if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) { if (attr->localName != NULL) xmlFree((xmlChar *) attr->localName); if (attr->nsName != NULL) xmlFree((xmlChar *) attr->nsName); } if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { if (attr->value != NULL) xmlFree((xmlChar *) attr->value); } if (attr->val != NULL) { xmlSchemaFreeValue(attr->val); attr->val = NULL; } memset(attr, 0, sizeof(xmlSchemaAttrInfo)); } vctxt->nbAttrInfos = 0; } /* * 3.4.4 Complex Type Definition Validation Rules * Element Locally Valid (Complex Type) (cvc-complex-type) * 3.2.4 Attribute Declaration Validation Rules * Validation Rule: Attribute Locally Valid (cvc-attribute) * Attribute Locally Valid (Use) (cvc-au) * * Only "assessed" attribute information items will be visible to * IDCs. I.e. not "lax" (without declaration) and "skip" wild attributes. */ static int xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaTypePtr type = vctxt->inode->typeDef; xmlSchemaItemListPtr attrUseList; xmlSchemaAttributeUsePtr attrUse = NULL; xmlSchemaAttributePtr attrDecl = NULL; xmlSchemaAttrInfoPtr iattr, tmpiattr; int i, j, found, nbAttrs, nbUses; int xpathRes = 0, res, wildIDs = 0, fixed; xmlNodePtr defAttrOwnerElem = NULL; /* * SPEC (cvc-attribute) * (1) "The declaration must not be �absent� (see Missing * Sub-components (�5.3) for how this can fail to be * the case)." * (2) "Its {type definition} must not be absent." * * NOTE (1) + (2): This is not handled here, since we currently do not * allow validation against schemas which have missing sub-components. * * SPEC (cvc-complex-type) * (3) "For each attribute information item in the element information * item's [attributes] excepting those whose [namespace name] is * identical to http://www.w3.org/2001/XMLSchema-instance and whose * [local name] is one of type, nil, schemaLocation or * noNamespaceSchemaLocation, the appropriate case among the following * must be true: * */ attrUseList = (xmlSchemaItemListPtr) type->attrUses; /* * @nbAttrs is the number of attributes present in the instance. */ nbAttrs = vctxt->nbAttrInfos; if (attrUseList != NULL) nbUses = attrUseList->nbItems; else nbUses = 0; for (i = 0; i < nbUses; i++) { found = 0; attrUse = attrUseList->items[i]; attrDecl = WXS_ATTRUSE_DECL(attrUse); for (j = 0; j < nbAttrs; j++) { iattr = vctxt->attrInfos[j]; /* * SPEC (cvc-complex-type) (3) * Skip meta attributes. */ if (iattr->metaType) continue; if (iattr->localName[0] != attrDecl->name[0]) continue; if (!xmlStrEqual(iattr->localName, attrDecl->name)) continue; if (!xmlStrEqual(iattr->nsName, attrDecl->targetNamespace)) continue; found = 1; /* * SPEC (cvc-complex-type) * (3.1) "If there is among the {attribute uses} an attribute * use with an {attribute declaration} whose {name} matches * the attribute information item's [local name] and whose * {target namespace} is identical to the attribute information * item's [namespace name] (where an �absent� {target namespace} * is taken to be identical to a [namespace name] with no value), * then the attribute information must be �valid� with respect * to that attribute use as per Attribute Locally Valid (Use) * (�3.5.4). In this case the {attribute declaration} of that * attribute use is the �context-determined declaration� for the * attribute information item with respect to Schema-Validity * Assessment (Attribute) (�3.2.4) and * Assessment Outcome (Attribute) (�3.2.5). */ iattr->state = XML_SCHEMAS_ATTR_ASSESSED; iattr->use = attrUse; /* * Context-determined declaration. */ iattr->decl = attrDecl; iattr->typeDef = attrDecl->subtypes; break; } if (found) continue; if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) { /* * Handle non-existent, required attributes. * * SPEC (cvc-complex-type) * (4) "The {attribute declaration} of each attribute use in * the {attribute uses} whose {required} is true matches one * of the attribute information items in the element information * item's [attributes] as per clause 3.1 above." */ tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt); if (tmpiattr == NULL) { VERROR_INT( "xmlSchemaVAttributesComplex", "calling xmlSchemaGetFreshAttrInfo()"); return (-1); } tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING; tmpiattr->use = attrUse; tmpiattr->decl = attrDecl; } else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) && ((attrUse->defValue != NULL) || (attrDecl->defValue != NULL))) { /* * Handle non-existent, optional, default/fixed attributes. */ tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt); if (tmpiattr == NULL) { VERROR_INT( "xmlSchemaVAttributesComplex", "calling xmlSchemaGetFreshAttrInfo()"); return (-1); } tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT; tmpiattr->use = attrUse; tmpiattr->decl = attrDecl; tmpiattr->typeDef = attrDecl->subtypes; tmpiattr->localName = attrDecl->name; tmpiattr->nsName = attrDecl->targetNamespace; } } if (vctxt->nbAttrInfos == 0) return (0); /* * Validate against the wildcard. */ if (type->attributeWildcard != NULL) { /* * SPEC (cvc-complex-type) * (3.2.1) "There must be an {attribute wildcard}." */ for (i = 0; i < nbAttrs; i++) { iattr = vctxt->attrInfos[i]; /* * SPEC (cvc-complex-type) (3) * Skip meta attributes. */ if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN) continue; /* * SPEC (cvc-complex-type) * (3.2.2) "The attribute information item must be �valid� with * respect to it as defined in Item Valid (Wildcard) (�3.10.4)." * * SPEC Item Valid (Wildcard) (cvc-wildcard) * "... its [namespace name] must be �valid� with respect to * the wildcard constraint, as defined in Wildcard allows * Namespace Name (�3.10.4)." */ if (xmlSchemaCheckCVCWildcardNamespace(type->attributeWildcard, iattr->nsName) == 0) { /* * Handle processContents. * * SPEC (cvc-wildcard): * processContents | context-determined declaration: * "strict" "mustFind" * "lax" "none" * "skip" "skip" */ if (type->attributeWildcard->processContents == XML_SCHEMAS_ANY_SKIP) { /* * context-determined declaration = "skip" * * SPEC PSVI Assessment Outcome (Attribute) * [validity] = "notKnown" * [validation attempted] = "none" */ iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP; continue; } /* * Find an attribute declaration. */ iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema, iattr->localName, iattr->nsName); if (iattr->decl != NULL) { iattr->state = XML_SCHEMAS_ATTR_ASSESSED; /* * SPEC (cvc-complex-type) * (5) "Let [Definition:] the wild IDs be the set of * all attribute information item to which clause 3.2 * applied and whose �validation� resulted in a * �context-determined declaration� of mustFind or no * �context-determined declaration� at all, and whose * [local name] and [namespace name] resolve (as * defined by QName resolution (Instance) (�3.15.4)) to * an attribute declaration whose {type definition} is * or is derived from ID. Then all of the following * must be true:" */ iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl); if (xmlSchemaIsDerivedFromBuiltInType( iattr->typeDef, XML_SCHEMAS_ID)) { /* * SPEC (5.1) "There must be no more than one * item in �wild IDs�." */ if (wildIDs != 0) { /* VAL TODO */ iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID; TODO continue; } wildIDs++; /* * SPEC (cvc-complex-type) * (5.2) "If �wild IDs� is non-empty, there must not * be any attribute uses among the {attribute uses} * whose {attribute declaration}'s {type definition} * is or is derived from ID." */ if (attrUseList != NULL) { for (j = 0; j < attrUseList->nbItems; j++) { if (xmlSchemaIsDerivedFromBuiltInType( WXS_ATTRUSE_TYPEDEF(attrUseList->items[j]), XML_SCHEMAS_ID)) { /* URGENT VAL TODO: implement */ iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID; TODO break; } } } } } else if (type->attributeWildcard->processContents == XML_SCHEMAS_ANY_LAX) { iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL; /* * SPEC PSVI Assessment Outcome (Attribute) * [validity] = "notKnown" * [validation attempted] = "none" */ } else { iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL; } } } } if (vctxt->nbAttrInfos == 0) return (0); /* * Get the owner element; needed for creation of default attributes. * This fixes bug #341337, reported by David Grohmann. */ if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) { xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth]; if (ielem && ielem->node && ielem->node->doc) defAttrOwnerElem = ielem->node; } /* * Validate values, create default attributes, evaluate IDCs. */ for (i = 0; i < vctxt->nbAttrInfos; i++) { iattr = vctxt->attrInfos[i]; /* * VAL TODO: Note that we won't try to resolve IDCs to * "lax" and "skip" validated attributes. Check what to * do in this case. */ if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) && (iattr->state != XML_SCHEMAS_ATTR_DEFAULT)) continue; /* * VAL TODO: What to do if the type definition is missing? */ if (iattr->typeDef == NULL) { iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE; continue; } ACTIVATE_ATTRIBUTE(iattr); fixed = 0; xpathRes = 0; if (vctxt->xpathStates != NULL) { /* * Evaluate IDCs. */ xpathRes = xmlSchemaXPathEvaluate(vctxt, XML_ATTRIBUTE_NODE); if (xpathRes == -1) { VERROR_INT("xmlSchemaVAttributesComplex", "calling xmlSchemaXPathEvaluate()"); goto internal_error; } } if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) { /* * Default/fixed attributes. * We need the value only if we need to resolve IDCs or * will create default attributes. */ if ((xpathRes) || (defAttrOwnerElem)) { if (iattr->use->defValue != NULL) { iattr->value = (xmlChar *) iattr->use->defValue; iattr->val = iattr->use->defVal; } else { iattr->value = (xmlChar *) iattr->decl->defValue; iattr->val = iattr->decl->defVal; } /* * IDCs will consume the precomputed default value, * so we need to clone it. */ if (iattr->val == NULL) { VERROR_INT("xmlSchemaVAttributesComplex", "default/fixed value on an attribute use was " "not precomputed"); goto internal_error; } iattr->val = xmlSchemaCopyValue(iattr->val); if (iattr->val == NULL) { VERROR_INT("xmlSchemaVAttributesComplex", "calling xmlSchemaCopyValue()"); goto internal_error; } } /* * PSVI: Add the default attribute to the current element. * VAL TODO: Should we use the *normalized* value? This currently * uses the *initial* value. */ if (defAttrOwnerElem) { xmlChar *normValue; const xmlChar *value; value = iattr->value; /* * Normalize the value. */ normValue = xmlSchemaNormalizeValue(iattr->typeDef, iattr->value); if (normValue != NULL) value = BAD_CAST normValue; if (iattr->nsName == NULL) { if (xmlNewProp(defAttrOwnerElem, iattr->localName, value) == NULL) { VERROR_INT("xmlSchemaVAttributesComplex", "callling xmlNewProp()"); if (normValue != NULL) xmlFree(normValue); goto internal_error; } } else { xmlNsPtr ns; ns = xmlSearchNsByHref(defAttrOwnerElem->doc, defAttrOwnerElem, iattr->nsName); if (ns == NULL) { xmlChar prefix[12]; int counter = 0; /* * Create a namespace declaration on the validation * root node if no namespace declaration is in scope. */ do { snprintf((char *) prefix, 12, "p%d", counter++); ns = xmlSearchNs(defAttrOwnerElem->doc, defAttrOwnerElem, BAD_CAST prefix); if (counter > 1000) { VERROR_INT( "xmlSchemaVAttributesComplex", "could not compute a ns prefix for a " "default/fixed attribute"); if (normValue != NULL) xmlFree(normValue); goto internal_error; } } while (ns != NULL); ns = xmlNewNs(vctxt->validationRoot, iattr->nsName, BAD_CAST prefix); } /* * TODO: * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0406.html * If we have QNames: do we need to ensure there's a * prefix defined for the QName? */ xmlNewNsProp(defAttrOwnerElem, ns, iattr->localName, value); } if (normValue != NULL) xmlFree(normValue); } /* * Go directly to IDC evaluation. */ goto eval_idcs; } /* * Validate the value. */ if (vctxt->value != NULL) { /* * Free last computed value; just for safety reasons. */ xmlSchemaFreeValue(vctxt->value); vctxt->value = NULL; } /* * Note that the attribute *use* can be unavailable, if * the attribute was a wild attribute. */ if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) || ((iattr->use != NULL) && (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED))) fixed = 1; else fixed = 0; /* * SPEC (cvc-attribute) * (3) "The item's �normalized value� must be locally �valid� * with respect to that {type definition} as per * String Valid (�3.14.4)." * * VAL TODO: Do we already have the * "normalized attribute value" here? */ if (xpathRes || fixed) { iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED; /* * Request a computed value. */ res = xmlSchemaVCheckCVCSimpleType( ACTXT_CAST vctxt, iattr->node, iattr->typeDef, iattr->value, &(iattr->val), 1, 1, 0); } else { res = xmlSchemaVCheckCVCSimpleType( ACTXT_CAST vctxt, iattr->node, iattr->typeDef, iattr->value, NULL, 1, 0, 0); } if (res != 0) { if (res == -1) { VERROR_INT("xmlSchemaVAttributesComplex", "calling xmlSchemaStreamValidateSimpleTypeValue()"); goto internal_error; } iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE; /* * SPEC PSVI Assessment Outcome (Attribute) * [validity] = "invalid" */ goto eval_idcs; } if (fixed) { /* * SPEC Attribute Locally Valid (Use) (cvc-au) * "For an attribute information item to be�valid� * with respect to an attribute use its *normalized* * value� must match the *canonical* lexical * representation of the attribute use's {value * constraint}value, if it is present and fixed." * * VAL TODO: The requirement for the *canonical* value * will be removed in XML Schema 1.1. */ /* * SPEC Attribute Locally Valid (cvc-attribute) * (4) "The item's *actual* value� must match the *value* of * the {value constraint}, if it is present and fixed." */ if (iattr->val == NULL) { /* VAL TODO: A value was not precomputed. */ TODO goto eval_idcs; } if ((iattr->use != NULL) && (iattr->use->defValue != NULL)) { if (iattr->use->defVal == NULL) { /* VAL TODO: A default value was not precomputed. */ TODO goto eval_idcs; } iattr->vcValue = iattr->use->defValue; /* if (xmlSchemaCompareValuesWhtsp(attr->val, (xmlSchemaWhitespaceValueType) ws, attr->use->defVal, (xmlSchemaWhitespaceValueType) ws) != 0) { */ if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal)) iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE; } else { if (iattr->decl->defVal == NULL) { /* VAL TODO: A default value was not precomputed. */ TODO goto eval_idcs; } iattr->vcValue = iattr->decl->defValue; /* if (xmlSchemaCompareValuesWhtsp(attr->val, (xmlSchemaWhitespaceValueType) ws, attrDecl->defVal, (xmlSchemaWhitespaceValueType) ws) != 0) { */ if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal)) iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE; } /* * [validity] = "valid" */ } eval_idcs: /* * Evaluate IDCs. */ if (xpathRes) { if (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth +1) == -1) { VERROR_INT("xmlSchemaVAttributesComplex", "calling xmlSchemaXPathEvaluate()"); goto internal_error; } } else if (vctxt->xpathStates != NULL) xmlSchemaXPathPop(vctxt); } /* * Report errors. */ for (i = 0; i < vctxt->nbAttrInfos; i++) { iattr = vctxt->attrInfos[i]; if ((iattr->state == XML_SCHEMAS_ATTR_META) || (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) || (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) || (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL)) continue; ACTIVATE_ATTRIBUTE(iattr); switch (iattr->state) { case XML_SCHEMAS_ATTR_ERR_MISSING: { xmlChar *str = NULL; ACTIVATE_ELEM; xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_COMPLEX_TYPE_4, NULL, NULL, "The attribute '%s' is required but missing", xmlSchemaFormatQName(&str, iattr->decl->targetNamespace, iattr->decl->name), NULL); FREE_AND_NULL(str) break; } case XML_SCHEMAS_ATTR_ERR_NO_TYPE: VERROR(XML_SCHEMAV_CVC_ATTRIBUTE_2, NULL, "The type definition is absent"); break; case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE: xmlSchemaCustomErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_AU, NULL, NULL, "The value '%s' does not match the fixed " "value constraint '%s'", iattr->value, iattr->vcValue); break; case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL: VERROR(XML_SCHEMAV_CVC_WILDCARD, NULL, "No matching global attribute declaration available, but " "demanded by the strict wildcard"); break; case XML_SCHEMAS_ATTR_UNKNOWN: if (iattr->metaType) break; /* * MAYBE VAL TODO: One might report different error messages * for the following errors. */ if (type->attributeWildcard == NULL) { xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, iattr, NULL); } else { xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, iattr, NULL); } break; default: break; } } ACTIVATE_ELEM; return (0); internal_error: ACTIVATE_ELEM; return (-1); } static int xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt, int *skip) { xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl; /* * The namespace of the element was already identified to be * matching the wildcard. */ if ((skip == NULL) || (wild == NULL) || (wild->type != XML_SCHEMA_TYPE_ANY)) { VERROR_INT("xmlSchemaValidateElemWildcard", "bad arguments"); return (-1); } *skip = 0; if (wild->processContents == XML_SCHEMAS_ANY_SKIP) { /* * URGENT VAL TODO: Either we need to position the stream to the * next sibling, or walk the whole subtree. */ *skip = 1; return (0); } { xmlSchemaElementPtr decl = NULL; decl = xmlSchemaGetElem(vctxt->schema, vctxt->inode->localName, vctxt->inode->nsName); if (decl != NULL) { vctxt->inode->decl = decl; return (0); } } if (wild->processContents == XML_SCHEMAS_ANY_STRICT) { /* VAL TODO: Change to proper error code. */ VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, /* WXS_BASIC_CAST wild */ "No matching global element declaration available, but " "demanded by the strict wildcard"); return (vctxt->err); } if (vctxt->nbAttrInfos != 0) { xmlSchemaAttrInfoPtr iattr; /* * SPEC Validation Rule: Schema-Validity Assessment (Element) * (1.2.1.2.1) - (1.2.1.2.3 ) * * Use the xsi:type attribute for the type definition. */ iattr = xmlSchemaGetMetaAttrInfo(vctxt, XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); if (iattr != NULL) { if (xmlSchemaProcessXSIType(vctxt, iattr, &(vctxt->inode->typeDef), NULL) == -1) { VERROR_INT("xmlSchemaValidateElemWildcard", "calling xmlSchemaProcessXSIType() to " "process the attribute 'xsi:nil'"); return (-1); } /* * Don't return an error on purpose. */ return (0); } } /* * SPEC Validation Rule: Schema-Validity Assessment (Element) * * Fallback to "anyType". */ vctxt->inode->typeDef = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); return (0); } /* * xmlSchemaCheckCOSValidDefault: * * This will be called if: not nilled, no content and a default/fixed * value is provided. */ static int xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt, const xmlChar *value, xmlSchemaValPtr *val) { int ret = 0; xmlSchemaNodeInfoPtr inode = vctxt->inode; /* * cos-valid-default: * Schema Component Constraint: Element Default Valid (Immediate) * For a string to be a valid default with respect to a type * definition the appropriate case among the following must be true: */ if WXS_IS_COMPLEX(inode->typeDef) { /* * Complex type. * * SPEC (2.1) "its {content type} must be a simple type definition * or mixed." * SPEC (2.2.2) "If the {content type} is mixed, then the {content * type}'s particle must be �emptiable� as defined by * Particle Emptiable (�3.9.6)." */ if ((! WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) && ((! WXS_HAS_MIXED_CONTENT(inode->typeDef)) || (! WXS_EMPTIABLE(inode->typeDef)))) { ret = XML_SCHEMAP_COS_VALID_DEFAULT_2_1; /* NOTE that this covers (2.2.2) as well. */ VERROR(ret, NULL, "For a string to be a valid default, the type definition " "must be a simple type or a complex type with simple content " "or mixed content and a particle emptiable"); return(ret); } } /* * 1 If the type definition is a simple type definition, then the string * must be �valid� with respect to that definition as defined by String * Valid (�3.14.4). * * AND * * 2.2.1 If the {content type} is a simple type definition, then the * string must be �valid� with respect to that simple type definition * as defined by String Valid (�3.14.4). */ if (WXS_IS_SIMPLE(inode->typeDef)) { ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt, NULL, inode->typeDef, value, val, 1, 1, 0); } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt, NULL, inode->typeDef->contentTypeDef, value, val, 1, 1, 0); } if (ret < 0) { VERROR_INT("xmlSchemaCheckCOSValidDefault", "calling xmlSchemaVCheckCVCSimpleType()"); } return (ret); } static void xmlSchemaVContentModelCallback(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED, const xmlChar * name ATTRIBUTE_UNUSED, xmlSchemaElementPtr item, xmlSchemaNodeInfoPtr inode) { inode->decl = item; #ifdef DEBUG_CONTENT { xmlChar *str = NULL; if (item->type == XML_SCHEMA_TYPE_ELEMENT) { xmlGenericError(xmlGenericErrorContext, "AUTOMATON callback for '%s' [declaration]\n", xmlSchemaFormatQName(&str, inode->localName, inode->nsName)); } else { xmlGenericError(xmlGenericErrorContext, "AUTOMATON callback for '%s' [wildcard]\n", xmlSchemaFormatQName(&str, inode->localName, inode->nsName)); } FREE_AND_NULL(str) } #endif } static int xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt) { vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt); if (vctxt->inode == NULL) { VERROR_INT("xmlSchemaValidatorPushElem", "calling xmlSchemaGetFreshElemInfo()"); return (-1); } vctxt->nbAttrInfos = 0; return (0); } static int xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt, xmlSchemaNodeInfoPtr inode, xmlSchemaTypePtr type, const xmlChar *value) { if (inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED) return (xmlSchemaVCheckCVCSimpleType( ACTXT_CAST vctxt, NULL, type, value, &(inode->val), 1, 1, 0)); else return (xmlSchemaVCheckCVCSimpleType( ACTXT_CAST vctxt, NULL, type, value, NULL, 1, 0, 0)); } /* * Process END of element. */ static int xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt) { int ret = 0; xmlSchemaNodeInfoPtr inode = vctxt->inode; if (vctxt->nbAttrInfos != 0) xmlSchemaClearAttrInfos(vctxt); if (inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) { /* * This element was not expected; * we will not validate child elements of broken parents. * Skip validation of all content of the parent. */ vctxt->skipDepth = vctxt->depth -1; goto end_elem; } if ((inode->typeDef == NULL) || (inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) { /* * 1. the type definition might be missing if the element was * error prone * 2. it might be abstract. */ goto end_elem; } /* * Check the content model. */ if ((inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) || (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) { /* * Workaround for "anyType". */ if (inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE) goto character_content; if ((inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) { xmlChar *values[10]; int terminal, nbval = 10, nbneg; if (inode->regexCtxt == NULL) { /* * Create the regex context. */ inode->regexCtxt = xmlRegNewExecCtxt(inode->typeDef->contModel, (xmlRegExecCallbacks) xmlSchemaVContentModelCallback, vctxt); if (inode->regexCtxt == NULL) { VERROR_INT("xmlSchemaValidatorPopElem", "failed to create a regex context"); goto internal_error; } #ifdef DEBUG_AUTOMATA xmlGenericError(xmlGenericErrorContext, "AUTOMATON create on '%s'\n", inode->localName); #endif } /* * Do not check further content if the node has been nilled */ if (INODE_NILLED(inode)) { ret = 0; #ifdef DEBUG_AUTOMATA xmlGenericError(xmlGenericErrorContext, "AUTOMATON succeeded on nilled '%s'\n", inode->localName); #endif goto skip_nilled; } /* * Get hold of the still expected content, since a further * call to xmlRegExecPushString() will loose this information. */ xmlRegExecNextValues(inode->regexCtxt, &nbval, &nbneg, &values[0], &terminal); ret = xmlRegExecPushString(inode->regexCtxt, NULL, NULL); if ((ret<0) || ((ret==0) && (!INODE_NILLED(inode)))) { /* * Still missing something. */ ret = 1; inode->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT; xmlSchemaComplexTypeErr(ACTXT_CAST vctxt, XML_SCHEMAV_ELEMENT_CONTENT, NULL, NULL, "Missing child element(s)", nbval, nbneg, values); #ifdef DEBUG_AUTOMATA xmlGenericError(xmlGenericErrorContext, "AUTOMATON missing ERROR on '%s'\n", inode->localName); #endif } else { /* * Content model is satisfied. */ ret = 0; #ifdef DEBUG_AUTOMATA xmlGenericError(xmlGenericErrorContext, "AUTOMATON succeeded on '%s'\n", inode->localName); #endif } } } skip_nilled: if (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS) goto end_elem; character_content: if (vctxt->value != NULL) { xmlSchemaFreeValue(vctxt->value); vctxt->value = NULL; } /* * Check character content. */ if (inode->decl == NULL) { /* * Speedup if no declaration exists. */ if (WXS_IS_SIMPLE(inode->typeDef)) { ret = xmlSchemaVCheckINodeDataType(vctxt, inode, inode->typeDef, inode->value); } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { ret = xmlSchemaVCheckINodeDataType(vctxt, inode, inode->typeDef->contentTypeDef, inode->value); } if (ret < 0) { VERROR_INT("xmlSchemaValidatorPopElem", "calling xmlSchemaVCheckCVCSimpleType()"); goto internal_error; } goto end_elem; } /* * cvc-elt (3.3.4) : 5 * The appropriate case among the following must be true: */ /* * cvc-elt (3.3.4) : 5.1 * If the declaration has a {value constraint}, * the item has neither element nor character [children] and * clause 3.2 has not applied, then all of the following must be true: */ if ((inode->decl->value != NULL) && (inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) && (! INODE_NILLED(inode))) { /* * cvc-elt (3.3.4) : 5.1.1 * If the �actual type definition� is a �local type definition� * then the canonical lexical representation of the {value constraint} * value must be a valid default for the �actual type definition� as * defined in Element Default Valid (Immediate) (�3.3.6). */ /* * NOTE: 'local' above means types acquired by xsi:type. * NOTE: Although the *canonical* value is stated, it is not * relevant if canonical or not. Additionally XML Schema 1.1 * will removed this requirement as well. */ if (inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) { ret = xmlSchemaCheckCOSValidDefault(vctxt, inode->decl->value, &(inode->val)); if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaValidatorPopElem", "calling xmlSchemaCheckCOSValidDefault()"); goto internal_error; } goto end_elem; } /* * Stop here, to avoid redundant validation of the value * (see following). */ goto default_psvi; } /* * cvc-elt (3.3.4) : 5.1.2 * The element information item with the canonical lexical * representation of the {value constraint} value used as its * �normalized value� must be �valid� with respect to the * �actual type definition� as defined by Element Locally Valid (Type) * (�3.3.4). */ if (WXS_IS_SIMPLE(inode->typeDef)) { ret = xmlSchemaVCheckINodeDataType(vctxt, inode, inode->typeDef, inode->decl->value); } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { ret = xmlSchemaVCheckINodeDataType(vctxt, inode, inode->typeDef->contentTypeDef, inode->decl->value); } if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaValidatorPopElem", "calling xmlSchemaVCheckCVCSimpleType()"); goto internal_error; } goto end_elem; } default_psvi: /* * PSVI: Create a text node on the instance element. */ if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) && (inode->node != NULL)) { xmlNodePtr textChild; xmlChar *normValue; /* * VAL TODO: Normalize the value. */ normValue = xmlSchemaNormalizeValue(inode->typeDef, inode->decl->value); if (normValue != NULL) { textChild = xmlNewText(BAD_CAST normValue); xmlFree(normValue); } else textChild = xmlNewText(inode->decl->value); if (textChild == NULL) { VERROR_INT("xmlSchemaValidatorPopElem", "calling xmlNewText()"); goto internal_error; } else xmlAddChild(inode->node, textChild); } } else if (! INODE_NILLED(inode)) { /* * 5.2.1 The element information item must be �valid� with respect * to the �actual type definition� as defined by Element Locally * Valid (Type) (�3.3.4). */ if (WXS_IS_SIMPLE(inode->typeDef)) { /* * SPEC (cvc-type) (3.1) * "If the type definition is a simple type definition, ..." * (3.1.3) "If clause 3.2 of Element Locally Valid * (Element) (�3.3.4) did not apply, then the �normalized value� * must be �valid� with respect to the type definition as defined * by String Valid (�3.14.4). */ ret = xmlSchemaVCheckINodeDataType(vctxt, inode, inode->typeDef, inode->value); } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { /* * SPEC (cvc-type) (3.2) "If the type definition is a complex type * definition, then the element information item must be * �valid� with respect to the type definition as per * Element Locally Valid (Complex Type) (�3.4.4);" * * SPEC (cvc-complex-type) (2.2) * "If the {content type} is a simple type definition, ... * the �normalized value� of the element information item is * �valid� with respect to that simple type definition as * defined by String Valid (�3.14.4)." */ ret = xmlSchemaVCheckINodeDataType(vctxt, inode, inode->typeDef->contentTypeDef, inode->value); } if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaValidatorPopElem", "calling xmlSchemaVCheckCVCSimpleType()"); goto internal_error; } goto end_elem; } /* * 5.2.2 If there is a fixed {value constraint} and clause 3.2 has * not applied, all of the following must be true: */ if ((inode->decl->value != NULL) && (inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) { /* * TODO: We will need a computed value, when comparison is * done on computed values. */ /* * 5.2.2.1 The element information item must have no element * information item [children]. */ if (inode->flags & XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) { ret = XML_SCHEMAV_CVC_ELT_5_2_2_1; VERROR(ret, NULL, "The content must not containt element nodes since " "there is a fixed value constraint"); goto end_elem; } else { /* * 5.2.2.2 The appropriate case among the following must * be true: */ if (WXS_HAS_MIXED_CONTENT(inode->typeDef)) { /* * 5.2.2.2.1 If the {content type} of the �actual type * definition� is mixed, then the *initial value* of the * item must match the canonical lexical representation * of the {value constraint} value. * * ... the *initial value* of an element information * item is the string composed of, in order, the * [character code] of each character information item in * the [children] of that element information item. */ if (! xmlStrEqual(inode->value, inode->decl->value)){ /* * VAL TODO: Report invalid & expected values as well. * VAL TODO: Implement the canonical stuff. */ ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_1; xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL, NULL, "The initial value '%s' does not match the fixed " "value constraint '%s'", inode->value, inode->decl->value); goto end_elem; } } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { /* * 5.2.2.2.2 If the {content type} of the �actual type * definition� is a simple type definition, then the * *actual value* of the item must match the canonical * lexical representation of the {value constraint} value. */ /* * VAL TODO: *actual value* is the normalized value, impl. * this. * VAL TODO: Report invalid & expected values as well. * VAL TODO: Implement a comparison with the computed values. */ if (! xmlStrEqual(inode->value, inode->decl->value)) { ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_2; xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL, NULL, "The actual value '%s' does not match the fixed " "value constraint '%s'", inode->value, inode->decl->value); goto end_elem; } } } } } end_elem: if (vctxt->depth < 0) { /* TODO: raise error? */ return (0); } if (vctxt->depth == vctxt->skipDepth) vctxt->skipDepth = -1; /* * Evaluate the history of XPath state objects. */ if (inode->appliedXPath && (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1)) goto internal_error; /* * MAYBE TODO: * SPEC (6) "The element information item must be �valid� with * respect to each of the {identity-constraint definitions} as per * Identity-constraint Satisfied (�3.11.4)." */ /* * PSVI TODO: If we expose IDC node-tables via PSVI then the tables * need to be built in any case. * We will currently build IDC node-tables and bubble them only if * keyrefs do exist. */ /* * Add the current IDC target-nodes to the IDC node-tables. */ if ((inode->idcMatchers != NULL) && (vctxt->hasKeyrefs || vctxt->createIDCNodeTables)) { if (xmlSchemaIDCFillNodeTables(vctxt, inode) == -1) goto internal_error; } /* * Validate IDC keyrefs. */ if (vctxt->inode->hasKeyrefs) if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1) goto internal_error; /* * Merge/free the IDC table. */ if (inode->idcTable != NULL) { #ifdef DEBUG_IDC_NODE_TABLE xmlSchemaDebugDumpIDCTable(stdout, inode->nsName, inode->localName, inode->idcTable); #endif if ((vctxt->depth > 0) && (vctxt->hasKeyrefs || vctxt->createIDCNodeTables)) { /* * Merge the IDC node table with the table of the parent node. */ if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1) goto internal_error; } } /* * Clear the current ielem. * VAL TODO: Don't free the PSVI IDC tables if they are * requested for the PSVI. */ xmlSchemaClearElemInfo(vctxt, inode); /* * Skip further processing if we are on the validation root. */ if (vctxt->depth == 0) { vctxt->depth--; vctxt->inode = NULL; return (0); } /* * Reset the keyrefDepth if needed. */ if (vctxt->aidcs != NULL) { xmlSchemaIDCAugPtr aidc = vctxt->aidcs; do { if (aidc->keyrefDepth == vctxt->depth) { /* * A 'keyrefDepth' of a key/unique IDC matches the current * depth, this means that we are leaving the scope of the * top-most keyref IDC which refers to this IDC. */ aidc->keyrefDepth = -1; } aidc = aidc->next; } while (aidc != NULL); } vctxt->depth--; vctxt->inode = vctxt->elemInfos[vctxt->depth]; /* * VAL TODO: 7 If the element information item is the �validation root�, it must be * �valid� per Validation Root Valid (ID/IDREF) (�3.3.4). */ return (ret); internal_error: vctxt->err = -1; return (-1); } /* * 3.4.4 Complex Type Definition Validation Rules * Validation Rule: Element Locally Valid (Complex Type) (cvc-complex-type) */ static int xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt) { xmlSchemaNodeInfoPtr pielem; xmlSchemaTypePtr ptype; int ret = 0; if (vctxt->depth <= 0) { VERROR_INT("xmlSchemaValidateChildElem", "not intended for the validation root"); return (-1); } pielem = vctxt->elemInfos[vctxt->depth -1]; if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; /* * Handle 'nilled' elements. */ if (INODE_NILLED(pielem)) { /* * SPEC (cvc-elt) (3.3.4) : (3.2.1) */ ACTIVATE_PARENT_ELEM; ret = XML_SCHEMAV_CVC_ELT_3_2_1; VERROR(ret, NULL, "Neither character nor element content is allowed, " "because the element was 'nilled'"); ACTIVATE_ELEM; goto unexpected_elem; } ptype = pielem->typeDef; if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) { /* * Workaround for "anyType": we have currently no content model * assigned for "anyType", so handle it explicitely. * "anyType" has an unbounded, lax "any" wildcard. */ vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema, vctxt->inode->localName, vctxt->inode->nsName); if (vctxt->inode->decl == NULL) { xmlSchemaAttrInfoPtr iattr; /* * Process "xsi:type". * SPEC (cvc-assess-elt) (1.2.1.2.1) - (1.2.1.2.3) */ iattr = xmlSchemaGetMetaAttrInfo(vctxt, XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); if (iattr != NULL) { ret = xmlSchemaProcessXSIType(vctxt, iattr, &(vctxt->inode->typeDef), NULL); if (ret != 0) { if (ret == -1) { VERROR_INT("xmlSchemaValidateChildElem", "calling xmlSchemaProcessXSIType() to " "process the attribute 'xsi:nil'"); return (-1); } return (ret); } } else { /* * Fallback to "anyType". * * SPEC (cvc-assess-elt) * "If the item cannot be �strictly assessed�, [...] * an element information item's schema validity may be laxly * assessed if its �context-determined declaration� is not * skip by �validating� with respect to the �ur-type * definition� as per Element Locally Valid (Type) (�3.3.4)." */ vctxt->inode->typeDef = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); } } return (0); } switch (ptype->contentType) { case XML_SCHEMA_CONTENT_EMPTY: /* * SPEC (2.1) "If the {content type} is empty, then the * element information item has no character or element * information item [children]." */ ACTIVATE_PARENT_ELEM ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1; VERROR(ret, NULL, "Element content is not allowed, " "because the content type is empty"); ACTIVATE_ELEM goto unexpected_elem; break; case XML_SCHEMA_CONTENT_MIXED: case XML_SCHEMA_CONTENT_ELEMENTS: { xmlRegExecCtxtPtr regexCtxt; xmlChar *values[10]; int terminal, nbval = 10, nbneg; /* VAL TODO: Optimized "anyType" validation.*/ if (ptype->contModel == NULL) { VERROR_INT("xmlSchemaValidateChildElem", "type has elem content but no content model"); return (-1); } /* * Safety belf for evaluation if the cont. model was already * examined to be invalid. */ if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) { VERROR_INT("xmlSchemaValidateChildElem", "validating elem, but elem content is already invalid"); return (-1); } regexCtxt = pielem->regexCtxt; if (regexCtxt == NULL) { /* * Create the regex context. */ regexCtxt = xmlRegNewExecCtxt(ptype->contModel, (xmlRegExecCallbacks) xmlSchemaVContentModelCallback, vctxt); if (regexCtxt == NULL) { VERROR_INT("xmlSchemaValidateChildElem", "failed to create a regex context"); return (-1); } pielem->regexCtxt = regexCtxt; #ifdef DEBUG_AUTOMATA xmlGenericError(xmlGenericErrorContext, "AUTOMATA create on '%s'\n", pielem->localName); #endif } /* * SPEC (2.4) "If the {content type} is element-only or mixed, * then the sequence of the element information item's * element information item [children], if any, taken in * order, is �valid� with respect to the {content type}'s * particle, as defined in Element Sequence Locally Valid * (Particle) (�3.9.4)." */ ret = xmlRegExecPushString2(regexCtxt, vctxt->inode->localName, vctxt->inode->nsName, vctxt->inode); #ifdef DEBUG_AUTOMATA if (ret < 0) xmlGenericError(xmlGenericErrorContext, "AUTOMATON push ERROR for '%s' on '%s'\n", vctxt->inode->localName, pielem->localName); else xmlGenericError(xmlGenericErrorContext, "AUTOMATON push OK for '%s' on '%s'\n", vctxt->inode->localName, pielem->localName); #endif if (vctxt->err == XML_SCHEMAV_INTERNAL) { VERROR_INT("xmlSchemaValidateChildElem", "calling xmlRegExecPushString2()"); return (-1); } if (ret < 0) { xmlRegExecErrInfo(regexCtxt, NULL, &nbval, &nbneg, &values[0], &terminal); xmlSchemaComplexTypeErr(ACTXT_CAST vctxt, XML_SCHEMAV_ELEMENT_CONTENT, NULL,NULL, "This element is not expected", nbval, nbneg, values); ret = vctxt->err; goto unexpected_elem; } else ret = 0; } break; case XML_SCHEMA_CONTENT_SIMPLE: case XML_SCHEMA_CONTENT_BASIC: ACTIVATE_PARENT_ELEM if (WXS_IS_COMPLEX(ptype)) { /* * SPEC (cvc-complex-type) (2.2) * "If the {content type} is a simple type definition, then * the element information item has no element information * item [children], ..." */ ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2; VERROR(ret, NULL, "Element content is not allowed, " "because the content type is a simple type definition"); } else { /* * SPEC (cvc-type) (3.1.2) "The element information item must * have no element information item [children]." */ ret = XML_SCHEMAV_CVC_TYPE_3_1_2; VERROR(ret, NULL, "Element content is not allowed, " "because the type definition is simple"); } ACTIVATE_ELEM ret = vctxt->err; goto unexpected_elem; break; default: break; } return (ret); unexpected_elem: /* * Pop this element and set the skipDepth to skip * all further content of the parent element. */ vctxt->skipDepth = vctxt->depth; vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED; pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT; return (ret); } #define XML_SCHEMA_PUSH_TEXT_PERSIST 1 #define XML_SCHEMA_PUSH_TEXT_CREATED 2 #define XML_SCHEMA_PUSH_TEXT_VOLATILE 3 static int xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt, int nodeType, const xmlChar *value, int len, int mode, int *consumed) { /* * Unfortunately we have to duplicate the text sometimes. * OPTIMIZE: Maybe we could skip it, if: * 1. content type is simple * 2. whitespace is "collapse" * 3. it consists of whitespace only * * Process character content. */ if (consumed != NULL) *consumed = 0; if (INODE_NILLED(vctxt->inode)) { /* * SPEC cvc-elt (3.3.4 - 3.2.1) * "The element information item must have no character or * element information item [children]." */ VERROR(XML_SCHEMAV_CVC_ELT_3_2_1, NULL, "Neither character nor element content is allowed " "because the element is 'nilled'"); return (vctxt->err); } /* * SPEC (2.1) "If the {content type} is empty, then the * element information item has no character or element * information item [children]." */ if (vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_EMPTY) { VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, NULL, "Character content is not allowed, " "because the content type is empty"); return (vctxt->err); } if (vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS) { if ((nodeType != XML_TEXT_NODE) || (! xmlSchemaIsBlank((xmlChar *) value, len))) { /* * SPEC cvc-complex-type (2.3) * "If the {content type} is element-only, then the * element information item has no character information * item [children] other than those whose [character * code] is defined as a white space in [XML 1.0 (Second * Edition)]." */ VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, NULL, "Character content other than whitespace is not allowed " "because the content type is 'element-only'"); return (vctxt->err); } return (0); } if ((value == NULL) || (value[0] == 0)) return (0); /* * Save the value. * NOTE that even if the content type is *mixed*, we need the * *initial value* for default/fixed value constraints. */ if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) && ((vctxt->inode->decl == NULL) || (vctxt->inode->decl->value == NULL))) return (0); if (vctxt->inode->value == NULL) { /* * Set the value. */ switch (mode) { case XML_SCHEMA_PUSH_TEXT_PERSIST: /* * When working on a tree. */ vctxt->inode->value = value; break; case XML_SCHEMA_PUSH_TEXT_CREATED: /* * When working with the reader. * The value will be freed by the element info. */ vctxt->inode->value = value; if (consumed != NULL) *consumed = 1; vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; break; case XML_SCHEMA_PUSH_TEXT_VOLATILE: /* * When working with SAX. * The value will be freed by the element info. */ if (len != -1) vctxt->inode->value = BAD_CAST xmlStrndup(value, len); else vctxt->inode->value = BAD_CAST xmlStrdup(value); vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; break; default: break; } } else { if (len < 0) len = xmlStrlen(value); /* * Concat the value. */ if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { vctxt->inode->value = BAD_CAST xmlStrncat( (xmlChar *) vctxt->inode->value, value, len); } else { vctxt->inode->value = BAD_CAST xmlStrncatNew(vctxt->inode->value, value, len); vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; } } return (0); } static int xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt) { int ret = 0; if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) { VERROR_INT("xmlSchemaValidateElem", "in skip-state"); goto internal_error; } if (vctxt->xsiAssemble) { /* * We will stop validation if there was an error during * dynamic schema construction. * Note that we simply set @skipDepth to 0, this could * mean that a streaming document via SAX would be * still read to the end but it won't be validated any more. * TODO: If we are sure how to stop the validation at once * for all input scenarios, then this should be changed to * instantly stop the validation. */ ret = xmlSchemaAssembleByXSI(vctxt); if (ret != 0) { if (ret == -1) goto internal_error; vctxt->skipDepth = 0; return(ret); } /* * Augment the IDC definitions for the main schema and all imported ones * NOTE: main schema is the first in the imported list */ xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt); } if (vctxt->depth > 0) { /* * Validate this element against the content model * of the parent. */ ret = xmlSchemaValidateChildElem(vctxt); if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaValidateElem", "calling xmlSchemaStreamValidateChildElement()"); goto internal_error; } goto exit; } if (vctxt->depth == vctxt->skipDepth) goto exit; if ((vctxt->inode->decl == NULL) && (vctxt->inode->typeDef == NULL)) { VERROR_INT("xmlSchemaValidateElem", "the child element was valid but neither the " "declaration nor the type was set"); goto internal_error; } } else { /* * Get the declaration of the validation root. */ vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema, vctxt->inode->localName, vctxt->inode->nsName); if (vctxt->inode->decl == NULL) { ret = XML_SCHEMAV_CVC_ELT_1; VERROR(ret, NULL, "No matching global declaration available " "for the validation root"); goto exit; } } if (vctxt->inode->decl == NULL) goto type_validation; if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) { int skip; /* * Wildcards. */ ret = xmlSchemaValidateElemWildcard(vctxt, &skip); if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaValidateElem", "calling xmlSchemaValidateElemWildcard()"); goto internal_error; } goto exit; } if (skip) { vctxt->skipDepth = vctxt->depth; goto exit; } /* * The declaration might be set by the wildcard validation, * when the processContents is "lax" or "strict". */ if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) { /* * Clear the "decl" field to not confuse further processing. */ vctxt->inode->decl = NULL; goto type_validation; } } /* * Validate against the declaration. */ ret = xmlSchemaValidateElemDecl(vctxt); if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaValidateElem", "calling xmlSchemaValidateElemDecl()"); goto internal_error; } goto exit; } /* * Validate against the type definition. */ type_validation: if (vctxt->inode->typeDef == NULL) { vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE; ret = XML_SCHEMAV_CVC_TYPE_1; VERROR(ret, NULL, "The type definition is absent"); goto exit; } if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) { vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE; ret = XML_SCHEMAV_CVC_TYPE_2; VERROR(ret, NULL, "The type definition is abstract"); goto exit; } /* * Evaluate IDCs. Do it here, since new IDC matchers are registered * during validation against the declaration. This must be done * _before_ attribute validation. */ if (vctxt->xpathStates != NULL) { ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE); vctxt->inode->appliedXPath = 1; if (ret == -1) { VERROR_INT("xmlSchemaValidateElem", "calling xmlSchemaXPathEvaluate()"); goto internal_error; } } /* * Validate attributes. */ if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) { if ((vctxt->nbAttrInfos != 0) || (vctxt->inode->typeDef->attrUses != NULL)) { ret = xmlSchemaVAttributesComplex(vctxt); } } else if (vctxt->nbAttrInfos != 0) { ret = xmlSchemaVAttributesSimple(vctxt); } /* * Clear registered attributes. */ if (vctxt->nbAttrInfos != 0) xmlSchemaClearAttrInfos(vctxt); if (ret == -1) { VERROR_INT("xmlSchemaValidateElem", "calling attributes validation"); goto internal_error; } /* * Don't return an error if attributes are invalid on purpose. */ ret = 0; exit: if (ret != 0) vctxt->skipDepth = vctxt->depth; return (ret); internal_error: return (-1); } #ifdef XML_SCHEMA_READER_ENABLED static int xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt) { const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15; int depth, nodeType, ret = 0, consumed; xmlSchemaNodeInfoPtr ielem; vctxt->depth = -1; ret = xmlTextReaderRead(vctxt->reader); /* * Move to the document element. */ while (ret == 1) { nodeType = xmlTextReaderNodeType(vctxt->reader); if (nodeType == XML_ELEMENT_NODE) goto root_found; ret = xmlTextReaderRead(vctxt->reader); } goto exit; root_found: do { depth = xmlTextReaderDepth(vctxt->reader); nodeType = xmlTextReaderNodeType(vctxt->reader); if (nodeType == XML_ELEMENT_NODE) { vctxt->depth++; if (xmlSchemaValidatorPushElem(vctxt) == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlSchemaValidatorPushElem()"); goto internal_error; } ielem = vctxt->inode; ielem->localName = xmlTextReaderLocalName(vctxt->reader); ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader); ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES; /* * Is the element empty? */ ret = xmlTextReaderIsEmptyElement(vctxt->reader); if (ret == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlTextReaderIsEmptyElement()"); goto internal_error; } if (ret) { ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; } /* * Register attributes. */ vctxt->nbAttrInfos = 0; ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader); if (ret == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlTextReaderMoveToFirstAttribute()"); goto internal_error; } if (ret == 1) { do { /* * VAL TODO: How do we know that the reader works on a * node tree, to be able to pass a node here? */ if (xmlSchemaValidatorPushAttribute(vctxt, NULL, (const xmlChar *) xmlTextReaderLocalName(vctxt->reader), xmlTextReaderNamespaceUri(vctxt->reader), 1, xmlTextReaderValue(vctxt->reader), 1) == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlSchemaValidatorPushAttribute()"); goto internal_error; } ret = xmlTextReaderMoveToNextAttribute(vctxt->reader); if (ret == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlTextReaderMoveToFirstAttribute()"); goto internal_error; } } while (ret == 1); /* * Back to element position. */ ret = xmlTextReaderMoveToElement(vctxt->reader); if (ret == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlTextReaderMoveToElement()"); goto internal_error; } } /* * Validate the element. */ ret= xmlSchemaValidateElem(vctxt); if (ret != 0) { if (ret == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlSchemaValidateElem()"); goto internal_error; } goto exit; } if (vctxt->depth == vctxt->skipDepth) { int curDepth; /* * Skip all content. */ if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) { ret = xmlTextReaderRead(vctxt->reader); curDepth = xmlTextReaderDepth(vctxt->reader); while ((ret == 1) && (curDepth != depth)) { ret = xmlTextReaderRead(vctxt->reader); curDepth = xmlTextReaderDepth(vctxt->reader); } if (ret < 0) { /* * VAL TODO: A reader error occured; what to do here? */ ret = 1; goto exit; } } goto leave_elem; } /* * READER VAL TODO: Is an END_ELEM really never called * if the elem is empty? */ if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) goto leave_elem; } else if (nodeType == END_ELEM) { /* * Process END of element. */ leave_elem: ret = xmlSchemaValidatorPopElem(vctxt); if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlSchemaValidatorPopElem()"); goto internal_error; } goto exit; } if (vctxt->depth >= 0) ielem = vctxt->inode; else ielem = NULL; } else if ((nodeType == XML_TEXT_NODE) || (nodeType == XML_CDATA_SECTION_NODE) || (nodeType == WHTSP) || (nodeType == SIGN_WHTSP)) { /* * Process character content. */ xmlChar *value; if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP)) nodeType = XML_TEXT_NODE; value = xmlTextReaderValue(vctxt->reader); ret = xmlSchemaVPushText(vctxt, nodeType, BAD_CAST value, -1, XML_SCHEMA_PUSH_TEXT_CREATED, &consumed); if (! consumed) xmlFree(value); if (ret == -1) { VERROR_INT("xmlSchemaVReaderWalk", "calling xmlSchemaVPushText()"); goto internal_error; } } else if ((nodeType == XML_ENTITY_NODE) || (nodeType == XML_ENTITY_REF_NODE)) { /* * VAL TODO: What to do with entities? */ TODO } /* * Read next node. */ ret = xmlTextReaderRead(vctxt->reader); } while (ret == 1); exit: return (ret); internal_error: return (-1); } #endif /************************************************************************ * * * SAX validation handlers * * * ************************************************************************/ /* * Process text content. */ static void xmlSchemaSAXHandleText(void *ctx, const xmlChar * ch, int len) { xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; if (vctxt->depth < 0) return; if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) return; if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE, ch, len, XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) { VERROR_INT("xmlSchemaSAXHandleCDataSection", "calling xmlSchemaVPushText()"); vctxt->err = -1; xmlStopParser(vctxt->parserCtxt); } } /* * Process CDATA content. */ static void xmlSchemaSAXHandleCDataSection(void *ctx, const xmlChar * ch, int len) { xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; if (vctxt->depth < 0) return; if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) return; if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE, ch, len, XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) { VERROR_INT("xmlSchemaSAXHandleCDataSection", "calling xmlSchemaVPushText()"); vctxt->err = -1; xmlStopParser(vctxt->parserCtxt); } } static void xmlSchemaSAXHandleReference(void *ctx ATTRIBUTE_UNUSED, const xmlChar * name ATTRIBUTE_UNUSED) { xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; if (vctxt->depth < 0) return; if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) return; /* SAX VAL TODO: What to do here? */ TODO } static void xmlSchemaSAXHandleStartElementNs(void *ctx, const xmlChar * localname, const xmlChar * prefix ATTRIBUTE_UNUSED, const xmlChar * URI, int nb_namespaces, const xmlChar ** namespaces, int nb_attributes, int nb_defaulted ATTRIBUTE_UNUSED, const xmlChar ** attributes) { xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; int ret; xmlSchemaNodeInfoPtr ielem; int i, j; /* * SAX VAL TODO: What to do with nb_defaulted? */ /* * Skip elements if inside a "skip" wildcard or invalid. */ vctxt->depth++; if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) return; /* * Push the element. */ if (xmlSchemaValidatorPushElem(vctxt) == -1) { VERROR_INT("xmlSchemaSAXHandleStartElementNs", "calling xmlSchemaValidatorPushElem()"); goto internal_error; } ielem = vctxt->inode; /* * TODO: Is this OK? */ ielem->nodeLine = xmlSAX2GetLineNumber(vctxt->parserCtxt); ielem->localName = localname; ielem->nsName = URI; ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; /* * Register namespaces on the elem info. */ if (nb_namespaces != 0) { /* * Although the parser builds its own namespace list, * we have no access to it, so we'll use an own one. */ for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) { /* * Store prefix and namespace name. */ if (ielem->nsBindings == NULL) { ielem->nsBindings = (const xmlChar **) xmlMalloc(10 * sizeof(const xmlChar *)); if (ielem->nsBindings == NULL) { xmlSchemaVErrMemory(vctxt, "allocating namespace bindings for SAX validation", NULL); goto internal_error; } ielem->nbNsBindings = 0; ielem->sizeNsBindings = 5; } else if (ielem->sizeNsBindings <= ielem->nbNsBindings) { ielem->sizeNsBindings *= 2; ielem->nsBindings = (const xmlChar **) xmlRealloc( (void *) ielem->nsBindings, ielem->sizeNsBindings * 2 * sizeof(const xmlChar *)); if (ielem->nsBindings == NULL) { xmlSchemaVErrMemory(vctxt, "re-allocating namespace bindings for SAX validation", NULL); goto internal_error; } } ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[j]; if (namespaces[j+1][0] == 0) { /* * Handle xmlns="". */ ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = NULL; } else ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = namespaces[j+1]; ielem->nbNsBindings++; } } /* * Register attributes. * SAX VAL TODO: We are not adding namespace declaration * attributes yet. */ if (nb_attributes != 0) { xmlChar *value; for (j = 0, i = 0; i < nb_attributes; i++, j += 5) { /* * Duplicate the value. */ value = xmlStrndup(attributes[j+3], attributes[j+4] - attributes[j+3]); /* * TODO: Set the node line. */ ret = xmlSchemaValidatorPushAttribute(vctxt, NULL, ielem->nodeLine, attributes[j], attributes[j+2], 0, value, 1); if (ret == -1) { VERROR_INT("xmlSchemaSAXHandleStartElementNs", "calling xmlSchemaValidatorPushAttribute()"); goto internal_error; } } } /* * Validate the element. */ ret = xmlSchemaValidateElem(vctxt); if (ret != 0) { if (ret == -1) { VERROR_INT("xmlSchemaSAXHandleStartElementNs", "calling xmlSchemaValidateElem()"); goto internal_error; } goto exit; } exit: return; internal_error: vctxt->err = -1; xmlStopParser(vctxt->parserCtxt); return; } static void xmlSchemaSAXHandleEndElementNs(void *ctx, const xmlChar * localname ATTRIBUTE_UNUSED, const xmlChar * prefix ATTRIBUTE_UNUSED, const xmlChar * URI ATTRIBUTE_UNUSED) { xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; int res; /* * Skip elements if inside a "skip" wildcard or if invalid. */ if (vctxt->skipDepth != -1) { if (vctxt->depth > vctxt->skipDepth) { vctxt->depth--; return; } else vctxt->skipDepth = -1; } /* * SAX VAL TODO: Just a temporary check. */ if ((!xmlStrEqual(vctxt->inode->localName, localname)) || (!xmlStrEqual(vctxt->inode->nsName, URI))) { VERROR_INT("xmlSchemaSAXHandleEndElementNs", "elem pop mismatch"); } res = xmlSchemaValidatorPopElem(vctxt); if (res != 0) { if (res < 0) { VERROR_INT("xmlSchemaSAXHandleEndElementNs", "calling xmlSchemaValidatorPopElem()"); goto internal_error; } goto exit; } exit: return; internal_error: vctxt->err = -1; xmlStopParser(vctxt->parserCtxt); return; } /************************************************************************ * * * Validation interfaces * * * ************************************************************************/ /** * xmlSchemaNewValidCtxt: * @schema: a precompiled XML Schemas * * Create an XML Schemas validation context based on the given schema. * * Returns the validation context or NULL in case of error */ xmlSchemaValidCtxtPtr xmlSchemaNewValidCtxt(xmlSchemaPtr schema) { xmlSchemaValidCtxtPtr ret; ret = (xmlSchemaValidCtxtPtr) xmlMalloc(sizeof(xmlSchemaValidCtxt)); if (ret == NULL) { xmlSchemaVErrMemory(NULL, "allocating validation context", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchemaValidCtxt)); ret->type = XML_SCHEMA_CTXT_VALIDATOR; ret->dict = xmlDictCreate(); ret->nodeQNames = xmlSchemaItemListCreate(); ret->schema = schema; return (ret); } /** * xmlSchemaValidateSetFilename: * @vctxt: the schema validation context * @filename: the file name * * Workaround to provide file error reporting information when this is * not provided by current APIs */ void xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt, const char *filename) { if (vctxt == NULL) return; if (vctxt->filename != NULL) xmlFree(vctxt->filename); if (filename != NULL) vctxt->filename = (char *) xmlStrdup((const xmlChar *) filename); else vctxt->filename = NULL; } /** * xmlSchemaClearValidCtxt: * @vctxt: the schema validation context * * Free the resources associated to the schema validation context; * leaves some fields alive intended for reuse of the context. */ static void xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt) { if (vctxt == NULL) return; /* * TODO: Should we clear the flags? * Might be problematic if one reuses the context * and assumes that the options remain the same. */ vctxt->flags = 0; vctxt->validationRoot = NULL; vctxt->doc = NULL; #ifdef LIBXML_READER_ENABLED vctxt->reader = NULL; #endif vctxt->hasKeyrefs = 0; if (vctxt->value != NULL) { xmlSchemaFreeValue(vctxt->value); vctxt->value = NULL; } /* * Augmented IDC information. */ if (vctxt->aidcs != NULL) { xmlSchemaIDCAugPtr cur = vctxt->aidcs, next; do { next = cur->next; xmlFree(cur); cur = next; } while (cur != NULL); vctxt->aidcs = NULL; } if (vctxt->idcMatcherCache != NULL) { xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp; while (matcher) { tmp = matcher; matcher = matcher->nextCached; xmlSchemaIDCFreeMatcherList(tmp); } vctxt->idcMatcherCache = NULL; } if (vctxt->idcNodes != NULL) { int i; xmlSchemaPSVIIDCNodePtr item; for (i = 0; i < vctxt->nbIdcNodes; i++) { item = vctxt->idcNodes[i]; xmlFree(item->keys); xmlFree(item); } xmlFree(vctxt->idcNodes); vctxt->idcNodes = NULL; vctxt->nbIdcNodes = 0; vctxt->sizeIdcNodes = 0; } /* * Note that we won't delete the XPath state pool here. */ if (vctxt->xpathStates != NULL) { xmlSchemaFreeIDCStateObjList(vctxt->xpathStates); vctxt->xpathStates = NULL; } /* * Attribute info. */ if (vctxt->nbAttrInfos != 0) { xmlSchemaClearAttrInfos(vctxt); } /* * Element info. */ if (vctxt->elemInfos != NULL) { int i; xmlSchemaNodeInfoPtr ei; for (i = 0; i < vctxt->sizeElemInfos; i++) { ei = vctxt->elemInfos[i]; if (ei == NULL) break; xmlSchemaClearElemInfo(vctxt, ei); } } xmlSchemaItemListClear(vctxt->nodeQNames); /* Recreate the dict. */ xmlDictFree(vctxt->dict); /* * TODO: Is is save to recreate it? Do we have a scenario * where the user provides the dict? */ vctxt->dict = xmlDictCreate(); if (vctxt->filename != NULL) { xmlFree(vctxt->filename); vctxt->filename = NULL; } } /** * xmlSchemaFreeValidCtxt: * @ctxt: the schema validation context * * Free the resources associated to the schema validation context */ void xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt) { if (ctxt == NULL) return; if (ctxt->value != NULL) xmlSchemaFreeValue(ctxt->value); if (ctxt->pctxt != NULL) xmlSchemaFreeParserCtxt(ctxt->pctxt); if (ctxt->idcNodes != NULL) { int i; xmlSchemaPSVIIDCNodePtr item; for (i = 0; i < ctxt->nbIdcNodes; i++) { item = ctxt->idcNodes[i]; xmlFree(item->keys); xmlFree(item); } xmlFree(ctxt->idcNodes); } if (ctxt->idcKeys != NULL) { int i; for (i = 0; i < ctxt->nbIdcKeys; i++) xmlSchemaIDCFreeKey(ctxt->idcKeys[i]); xmlFree(ctxt->idcKeys); } if (ctxt->xpathStates != NULL) { xmlSchemaFreeIDCStateObjList(ctxt->xpathStates); ctxt->xpathStates = NULL; } if (ctxt->xpathStatePool != NULL) { xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool); ctxt->xpathStatePool = NULL; } /* * Augmented IDC information. */ if (ctxt->aidcs != NULL) { xmlSchemaIDCAugPtr cur = ctxt->aidcs, next; do { next = cur->next; xmlFree(cur); cur = next; } while (cur != NULL); } if (ctxt->attrInfos != NULL) { int i; xmlSchemaAttrInfoPtr attr; /* Just a paranoid call to the cleanup. */ if (ctxt->nbAttrInfos != 0) xmlSchemaClearAttrInfos(ctxt); for (i = 0; i < ctxt->sizeAttrInfos; i++) { attr = ctxt->attrInfos[i]; xmlFree(attr); } xmlFree(ctxt->attrInfos); } if (ctxt->elemInfos != NULL) { int i; xmlSchemaNodeInfoPtr ei; for (i = 0; i < ctxt->sizeElemInfos; i++) { ei = ctxt->elemInfos[i]; if (ei == NULL) break; xmlSchemaClearElemInfo(ctxt, ei); xmlFree(ei); } xmlFree(ctxt->elemInfos); } if (ctxt->nodeQNames != NULL) xmlSchemaItemListFree(ctxt->nodeQNames); if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); if (ctxt->filename != NULL) xmlFree(ctxt->filename); xmlFree(ctxt); } /** * xmlSchemaIsValid: * @ctxt: the schema validation context * * Check if any error was detected during validation. * * Returns 1 if valid so far, 0 if errors were detected, and -1 in case * of internal error. */ int xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt) { if (ctxt == NULL) return(-1); return(ctxt->err == 0); } /** * xmlSchemaSetValidErrors: * @ctxt: a schema validation context * @err: the error function * @warn: the warning function * @ctx: the functions context * * Set the error and warning callback informations */ void xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt, xmlSchemaValidityErrorFunc err, xmlSchemaValidityWarningFunc warn, void *ctx) { if (ctxt == NULL) return; ctxt->error = err; ctxt->warning = warn; ctxt->errCtxt = ctx; if (ctxt->pctxt != NULL) xmlSchemaSetParserErrors(ctxt->pctxt, err, warn, ctx); } /** * xmlSchemaSetValidStructuredErrors: * @ctxt: a schema validation context * @serror: the structured error function * @ctx: the functions context * * Set the structured error callback */ void xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx) { if (ctxt == NULL) return; ctxt->serror = serror; ctxt->error = NULL; ctxt->warning = NULL; ctxt->errCtxt = ctx; if (ctxt->pctxt != NULL) xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror, ctx); } /** * xmlSchemaGetValidErrors: * @ctxt: a XML-Schema validation context * @err: the error function result * @warn: the warning function result * @ctx: the functions context result * * Get the error and warning callback informations * * Returns -1 in case of error and 0 otherwise */ int xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt, xmlSchemaValidityErrorFunc * err, xmlSchemaValidityWarningFunc * warn, void **ctx) { if (ctxt == NULL) return (-1); if (err != NULL) *err = ctxt->error; if (warn != NULL) *warn = ctxt->warning; if (ctx != NULL) *ctx = ctxt->errCtxt; return (0); } /** * xmlSchemaSetValidOptions: * @ctxt: a schema validation context * @options: a combination of xmlSchemaValidOption * * Sets the options to be used during the validation. * * Returns 0 in case of success, -1 in case of an * API error. */ int xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt, int options) { int i; if (ctxt == NULL) return (-1); /* * WARNING: Change the start value if adding to the * xmlSchemaValidOption. * TODO: Is there an other, more easy to maintain, * way? */ for (i = 1; i < (int) sizeof(int) * 8; i++) { if (options & 1<options = options; return (0); } /** * xmlSchemaValidCtxtGetOptions: * @ctxt: a schema validation context * * Get the validation context options. * * Returns the option combination or -1 on error. */ int xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt) { if (ctxt == NULL) return (-1); else return (ctxt->options); } static int xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt) { xmlAttrPtr attr; int ret = 0; xmlSchemaNodeInfoPtr ielem = NULL; xmlNodePtr node, valRoot; const xmlChar *nsName; /* DOC VAL TODO: Move this to the start function. */ if (vctxt->validationRoot != NULL) valRoot = vctxt->validationRoot; else valRoot = xmlDocGetRootElement(vctxt->doc); if (valRoot == NULL) { /* VAL TODO: Error code? */ VERROR(1, NULL, "The document has no document element"); return (1); } vctxt->depth = -1; vctxt->validationRoot = valRoot; node = valRoot; while (node != NULL) { if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) goto next_sibling; if (node->type == XML_ELEMENT_NODE) { /* * Init the node-info. */ vctxt->depth++; if (xmlSchemaValidatorPushElem(vctxt) == -1) goto internal_error; ielem = vctxt->inode; ielem->node = node; ielem->nodeLine = node->line; ielem->localName = node->name; if (node->ns != NULL) ielem->nsName = node->ns->href; ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; /* * Register attributes. * DOC VAL TODO: We do not register namespace declaration * attributes yet. */ vctxt->nbAttrInfos = 0; if (node->properties != NULL) { attr = node->properties; do { if (attr->ns != NULL) nsName = attr->ns->href; else nsName = NULL; ret = xmlSchemaValidatorPushAttribute(vctxt, (xmlNodePtr) attr, /* * Note that we give it the line number of the * parent element. */ ielem->nodeLine, attr->name, nsName, 0, xmlNodeListGetString(attr->doc, attr->children, 1), 1); if (ret == -1) { VERROR_INT("xmlSchemaDocWalk", "calling xmlSchemaValidatorPushAttribute()"); goto internal_error; } attr = attr->next; } while (attr); } /* * Validate the element. */ ret = xmlSchemaValidateElem(vctxt); if (ret != 0) { if (ret == -1) { VERROR_INT("xmlSchemaDocWalk", "calling xmlSchemaValidateElem()"); goto internal_error; } /* * Don't stop validation; just skip the content * of this element. */ goto leave_node; } if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) goto leave_node; } else if ((node->type == XML_TEXT_NODE) || (node->type == XML_CDATA_SECTION_NODE)) { /* * Process character content. */ if ((ielem != NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)) ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; ret = xmlSchemaVPushText(vctxt, node->type, node->content, -1, XML_SCHEMA_PUSH_TEXT_PERSIST, NULL); if (ret < 0) { VERROR_INT("xmlSchemaVDocWalk", "calling xmlSchemaVPushText()"); goto internal_error; } /* * DOC VAL TODO: Should we skip further validation of the * element content here? */ } else if ((node->type == XML_ENTITY_NODE) || (node->type == XML_ENTITY_REF_NODE)) { /* * DOC VAL TODO: What to do with entities? */ VERROR_INT("xmlSchemaVDocWalk", "there is at least one entity reference in the node-tree " "currently being validated. Processing of entities with " "this XML Schema processor is not supported (yet). Please " "substitute entities before validation."); goto internal_error; } else { goto leave_node; /* * DOC VAL TODO: XInclude nodes, etc. */ } /* * Walk the doc. */ if (node->children != NULL) { node = node->children; continue; } leave_node: if (node->type == XML_ELEMENT_NODE) { /* * Leaving the scope of an element. */ if (node != vctxt->inode->node) { VERROR_INT("xmlSchemaVDocWalk", "element position mismatch"); goto internal_error; } ret = xmlSchemaValidatorPopElem(vctxt); if (ret != 0) { if (ret < 0) { VERROR_INT("xmlSchemaVDocWalk", "calling xmlSchemaValidatorPopElem()"); goto internal_error; } } if (node == valRoot) goto exit; } next_sibling: if (node->next != NULL) node = node->next; else { node = node->parent; goto leave_node; } } exit: return (ret); internal_error: return (-1); } static int xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) { /* * Some initialization. */ vctxt->err = 0; vctxt->nberrors = 0; vctxt->depth = -1; vctxt->skipDepth = -1; vctxt->xsiAssemble = 0; vctxt->hasKeyrefs = 0; #ifdef ENABLE_IDC_NODE_TABLES_TEST vctxt->createIDCNodeTables = 1; #else vctxt->createIDCNodeTables = 0; #endif /* * Create a schema + parser if necessary. */ if (vctxt->schema == NULL) { xmlSchemaParserCtxtPtr pctxt; vctxt->xsiAssemble = 1; /* * If not schema was given then we will create a schema * dynamically using XSI schema locations. * * Create the schema parser context. */ if ((vctxt->pctxt == NULL) && (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1)) return (-1); pctxt = vctxt->pctxt; pctxt->xsiAssemble = 1; /* * Create the schema. */ vctxt->schema = xmlSchemaNewSchema(pctxt); if (vctxt->schema == NULL) return (-1); /* * Create the schema construction context. */ pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict); if (pctxt->constructor == NULL) return(-1); pctxt->constructor->mainSchema = vctxt->schema; /* * Take ownership of the constructor to be able to free it. */ pctxt->ownsConstructor = 1; } /* * Augment the IDC definitions for the main schema and all imported ones * NOTE: main schema if the first in the imported list */ xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt); return(0); } static void xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) { if (vctxt->xsiAssemble) { if (vctxt->schema != NULL) { xmlSchemaFree(vctxt->schema); vctxt->schema = NULL; } } xmlSchemaClearValidCtxt(vctxt); } static int xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt) { int ret = 0; if (xmlSchemaPreRun(vctxt) < 0) return(-1); if (vctxt->doc != NULL) { /* * Tree validation. */ ret = xmlSchemaVDocWalk(vctxt); #ifdef LIBXML_READER_ENABLED } else if (vctxt->reader != NULL) { /* * XML Reader validation. */ #ifdef XML_SCHEMA_READER_ENABLED ret = xmlSchemaVReaderWalk(vctxt); #endif #endif } else if ((vctxt->sax != NULL) && (vctxt->parserCtxt != NULL)) { /* * SAX validation. */ ret = xmlParseDocument(vctxt->parserCtxt); } else { VERROR_INT("xmlSchemaVStart", "no instance to validate"); ret = -1; } xmlSchemaPostRun(vctxt); if (ret == 0) ret = vctxt->err; return (ret); } /** * xmlSchemaValidateOneElement: * @ctxt: a schema validation context * @elem: an element node * * Validate a branch of a tree, starting with the given @elem. * * Returns 0 if the element and its subtree is valid, a positive error * code number otherwise and -1 in case of an internal or API error. */ int xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem) { if ((ctxt == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE)) return (-1); if (ctxt->schema == NULL) return (-1); ctxt->doc = elem->doc; ctxt->node = elem; ctxt->validationRoot = elem; return(xmlSchemaVStart(ctxt)); } /** * xmlSchemaValidateDoc: * @ctxt: a schema validation context * @doc: a parsed document tree * * Validate a document tree in memory. * * Returns 0 if the document is schemas valid, a positive error code * number otherwise and -1 in case of internal or API error. */ int xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc) { if ((ctxt == NULL) || (doc == NULL)) return (-1); ctxt->doc = doc; ctxt->node = xmlDocGetRootElement(doc); if (ctxt->node == NULL) { xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING, (xmlNodePtr) doc, NULL, "The document has no document element", NULL, NULL); return (ctxt->err); } ctxt->validationRoot = ctxt->node; return (xmlSchemaVStart(ctxt)); } /************************************************************************ * * * Function and data for SAX streaming API * * * ************************************************************************/ typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData; typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr; struct _xmlSchemaSplitSAXData { xmlSAXHandlerPtr user_sax; void *user_data; xmlSchemaValidCtxtPtr ctxt; xmlSAXHandlerPtr schemas_sax; }; #define XML_SAX_PLUG_MAGIC 0xdc43ba21 struct _xmlSchemaSAXPlug { unsigned int magic; /* the original callbacks informations */ xmlSAXHandlerPtr *user_sax_ptr; xmlSAXHandlerPtr user_sax; void **user_data_ptr; void *user_data; /* the block plugged back and validation informations */ xmlSAXHandler schemas_sax; xmlSchemaValidCtxtPtr ctxt; }; /* All those functions just bounces to the user provided SAX handlers */ static void internalSubsetSplit(void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->internalSubset != NULL)) ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID, SystemID); } static int isStandaloneSplit(void *ctx) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->isStandalone != NULL)) return(ctxt->user_sax->isStandalone(ctxt->user_data)); return(0); } static int hasInternalSubsetSplit(void *ctx) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->hasInternalSubset != NULL)) return(ctxt->user_sax->hasInternalSubset(ctxt->user_data)); return(0); } static int hasExternalSubsetSplit(void *ctx) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->hasExternalSubset != NULL)) return(ctxt->user_sax->hasExternalSubset(ctxt->user_data)); return(0); } static void externalSubsetSplit(void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->externalSubset != NULL)) ctxt->user_sax->externalSubset(ctxt->user_data, name, ExternalID, SystemID); } static xmlParserInputPtr resolveEntitySplit(void *ctx, const xmlChar *publicId, const xmlChar *systemId) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->resolveEntity != NULL)) return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId, systemId)); return(NULL); } static xmlEntityPtr getEntitySplit(void *ctx, const xmlChar *name) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->getEntity != NULL)) return(ctxt->user_sax->getEntity(ctxt->user_data, name)); return(NULL); } static xmlEntityPtr getParameterEntitySplit(void *ctx, const xmlChar *name) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->getParameterEntity != NULL)) return(ctxt->user_sax->getParameterEntity(ctxt->user_data, name)); return(NULL); } static void entityDeclSplit(void *ctx, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->entityDecl != NULL)) ctxt->user_sax->entityDecl(ctxt->user_data, name, type, publicId, systemId, content); } static void attributeDeclSplit(void *ctx, const xmlChar * elem, const xmlChar * name, int type, int def, const xmlChar * defaultValue, xmlEnumerationPtr tree) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->attributeDecl != NULL)) { ctxt->user_sax->attributeDecl(ctxt->user_data, elem, name, type, def, defaultValue, tree); } else { xmlFreeEnumeration(tree); } } static void elementDeclSplit(void *ctx, const xmlChar *name, int type, xmlElementContentPtr content) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->elementDecl != NULL)) ctxt->user_sax->elementDecl(ctxt->user_data, name, type, content); } static void notationDeclSplit(void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->notationDecl != NULL)) ctxt->user_sax->notationDecl(ctxt->user_data, name, publicId, systemId); } static void unparsedEntityDeclSplit(void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->unparsedEntityDecl != NULL)) ctxt->user_sax->unparsedEntityDecl(ctxt->user_data, name, publicId, systemId, notationName); } static void setDocumentLocatorSplit(void *ctx, xmlSAXLocatorPtr loc) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->setDocumentLocator != NULL)) ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc); } static void startDocumentSplit(void *ctx) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->startDocument != NULL)) ctxt->user_sax->startDocument(ctxt->user_data); } static void endDocumentSplit(void *ctx) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->endDocument != NULL)) ctxt->user_sax->endDocument(ctxt->user_data); } static void processingInstructionSplit(void *ctx, const xmlChar *target, const xmlChar *data) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->processingInstruction != NULL)) ctxt->user_sax->processingInstruction(ctxt->user_data, target, data); } static void commentSplit(void *ctx, const xmlChar *value) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->comment != NULL)) ctxt->user_sax->comment(ctxt->user_data, value); } /* * Varargs error callbacks to the user application, harder ... */ static void XMLCDECL warningSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->warning != NULL)) { TODO } } static void XMLCDECL errorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->error != NULL)) { TODO } } static void XMLCDECL fatalErrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->fatalError != NULL)) { TODO } } /* * Those are function where both the user handler and the schemas handler * need to be called. */ static void charactersSplit(void *ctx, const xmlChar *ch, int len) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if (ctxt == NULL) return; if ((ctxt->user_sax != NULL) && (ctxt->user_sax->characters != NULL)) ctxt->user_sax->characters(ctxt->user_data, ch, len); if (ctxt->ctxt != NULL) xmlSchemaSAXHandleText(ctxt->ctxt, ch, len); } static void ignorableWhitespaceSplit(void *ctx, const xmlChar *ch, int len) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if (ctxt == NULL) return; if ((ctxt->user_sax != NULL) && (ctxt->user_sax->ignorableWhitespace != NULL)) ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch, len); if (ctxt->ctxt != NULL) xmlSchemaSAXHandleText(ctxt->ctxt, ch, len); } static void cdataBlockSplit(void *ctx, const xmlChar *value, int len) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if (ctxt == NULL) return; if ((ctxt->user_sax != NULL) && (ctxt->user_sax->cdataBlock != NULL)) ctxt->user_sax->cdataBlock(ctxt->user_data, value, len); if (ctxt->ctxt != NULL) xmlSchemaSAXHandleCDataSection(ctxt->ctxt, value, len); } static void referenceSplit(void *ctx, const xmlChar *name) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if (ctxt == NULL) return; if ((ctxt != NULL) && (ctxt->user_sax != NULL) && (ctxt->user_sax->reference != NULL)) ctxt->user_sax->reference(ctxt->user_data, name); if (ctxt->ctxt != NULL) xmlSchemaSAXHandleReference(ctxt->user_data, name); } static void startElementNsSplit(void *ctx, const xmlChar * localname, const xmlChar * prefix, const xmlChar * URI, int nb_namespaces, const xmlChar ** namespaces, int nb_attributes, int nb_defaulted, const xmlChar ** attributes) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if (ctxt == NULL) return; if ((ctxt->user_sax != NULL) && (ctxt->user_sax->startElementNs != NULL)) ctxt->user_sax->startElementNs(ctxt->user_data, localname, prefix, URI, nb_namespaces, namespaces, nb_attributes, nb_defaulted, attributes); if (ctxt->ctxt != NULL) xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname, prefix, URI, nb_namespaces, namespaces, nb_attributes, nb_defaulted, attributes); } static void endElementNsSplit(void *ctx, const xmlChar * localname, const xmlChar * prefix, const xmlChar * URI) { xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; if (ctxt == NULL) return; if ((ctxt->user_sax != NULL) && (ctxt->user_sax->endElementNs != NULL)) ctxt->user_sax->endElementNs(ctxt->user_data, localname, prefix, URI); if (ctxt->ctxt != NULL) xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname, prefix, URI); } /** * xmlSchemaSAXPlug: * @ctxt: a schema validation context * @sax: a pointer to the original xmlSAXHandlerPtr * @user_data: a pointer to the original SAX user data pointer * * Plug a SAX based validation layer in a SAX parsing event flow. * The original @saxptr and @dataptr data are replaced by new pointers * but the calls to the original will be maintained. * * Returns a pointer to a data structure needed to unplug the validation layer * or NULL in case of errors. */ xmlSchemaSAXPlugPtr xmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt, xmlSAXHandlerPtr *sax, void **user_data) { xmlSchemaSAXPlugPtr ret; xmlSAXHandlerPtr old_sax; if ((ctxt == NULL) || (sax == NULL) || (user_data == NULL)) return(NULL); /* * We only allow to plug into SAX2 event streams */ old_sax = *sax; if ((old_sax != NULL) && (old_sax->initialized != XML_SAX2_MAGIC)) return(NULL); if ((old_sax != NULL) && (old_sax->startElementNs == NULL) && (old_sax->endElementNs == NULL) && ((old_sax->startElement != NULL) || (old_sax->endElement != NULL))) return(NULL); /* * everything seems right allocate the local data needed for that layer */ ret = (xmlSchemaSAXPlugPtr) xmlMalloc(sizeof(xmlSchemaSAXPlugStruct)); if (ret == NULL) { return(NULL); } memset(ret, 0, sizeof(xmlSchemaSAXPlugStruct)); ret->magic = XML_SAX_PLUG_MAGIC; ret->schemas_sax.initialized = XML_SAX2_MAGIC; ret->ctxt = ctxt; ret->user_sax_ptr = sax; ret->user_sax = old_sax; if (old_sax == NULL) { /* * go direct, no need for the split block and functions. */ ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs; ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs; /* * Note that we use the same text-function for both, to prevent * the parser from testing for ignorable whitespace. */ ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText; ret->schemas_sax.characters = xmlSchemaSAXHandleText; ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection; ret->schemas_sax.reference = xmlSchemaSAXHandleReference; ret->user_data = ctxt; *user_data = ctxt; } else { /* * for each callback unused by Schemas initialize it to the Split * routine only if non NULL in the user block, this can speed up * things at the SAX level. */ if (old_sax->internalSubset != NULL) ret->schemas_sax.internalSubset = internalSubsetSplit; if (old_sax->isStandalone != NULL) ret->schemas_sax.isStandalone = isStandaloneSplit; if (old_sax->hasInternalSubset != NULL) ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit; if (old_sax->hasExternalSubset != NULL) ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit; if (old_sax->resolveEntity != NULL) ret->schemas_sax.resolveEntity = resolveEntitySplit; if (old_sax->getEntity != NULL) ret->schemas_sax.getEntity = getEntitySplit; if (old_sax->entityDecl != NULL) ret->schemas_sax.entityDecl = entityDeclSplit; if (old_sax->notationDecl != NULL) ret->schemas_sax.notationDecl = notationDeclSplit; if (old_sax->attributeDecl != NULL) ret->schemas_sax.attributeDecl = attributeDeclSplit; if (old_sax->elementDecl != NULL) ret->schemas_sax.elementDecl = elementDeclSplit; if (old_sax->unparsedEntityDecl != NULL) ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit; if (old_sax->setDocumentLocator != NULL) ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit; if (old_sax->startDocument != NULL) ret->schemas_sax.startDocument = startDocumentSplit; if (old_sax->endDocument != NULL) ret->schemas_sax.endDocument = endDocumentSplit; if (old_sax->processingInstruction != NULL) ret->schemas_sax.processingInstruction = processingInstructionSplit; if (old_sax->comment != NULL) ret->schemas_sax.comment = commentSplit; if (old_sax->warning != NULL) ret->schemas_sax.warning = warningSplit; if (old_sax->error != NULL) ret->schemas_sax.error = errorSplit; if (old_sax->fatalError != NULL) ret->schemas_sax.fatalError = fatalErrorSplit; if (old_sax->getParameterEntity != NULL) ret->schemas_sax.getParameterEntity = getParameterEntitySplit; if (old_sax->externalSubset != NULL) ret->schemas_sax.externalSubset = externalSubsetSplit; /* * the 6 schemas callback have to go to the splitter functions * Note that we use the same text-function for ignorableWhitespace * if possible, to prevent the parser from testing for ignorable * whitespace. */ ret->schemas_sax.characters = charactersSplit; if ((old_sax->ignorableWhitespace != NULL) && (old_sax->ignorableWhitespace != old_sax->characters)) ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit; else ret->schemas_sax.ignorableWhitespace = charactersSplit; ret->schemas_sax.cdataBlock = cdataBlockSplit; ret->schemas_sax.reference = referenceSplit; ret->schemas_sax.startElementNs = startElementNsSplit; ret->schemas_sax.endElementNs = endElementNsSplit; ret->user_data_ptr = user_data; ret->user_data = *user_data; *user_data = ret; } /* * plug the pointers back. */ *sax = &(ret->schemas_sax); ctxt->sax = *sax; ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM; xmlSchemaPreRun(ctxt); return(ret); } /** * xmlSchemaSAXUnplug: * @plug: a data structure returned by xmlSchemaSAXPlug * * Unplug a SAX based validation layer in a SAX parsing event flow. * The original pointers used in the call are restored. * * Returns 0 in case of success and -1 in case of failure. */ int xmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug) { xmlSAXHandlerPtr *sax; void **user_data; if ((plug == NULL) || (plug->magic != XML_SAX_PLUG_MAGIC)) return(-1); plug->magic = 0; xmlSchemaPostRun(plug->ctxt); /* restore the data */ sax = plug->user_sax_ptr; *sax = plug->user_sax; if (plug->user_sax != NULL) { user_data = plug->user_data_ptr; *user_data = plug->user_data; } /* free and return */ xmlFree(plug); return(0); } /** * xmlSchemaValidateSetLocator: * @vctxt: a schema validation context * @f: the locator function pointer * @ctxt: the locator context * * Allows to set a locator function to the validation context, * which will be used to provide file and line information since * those are not provided as part of the SAX validation flow * Setting @f to NULL disable the locator. */ void xmlSchemaValidateSetLocator(xmlSchemaValidCtxtPtr vctxt, xmlSchemaValidityLocatorFunc f, void *ctxt) { if (vctxt == NULL) return; vctxt->locFunc = f; vctxt->locCtxt = ctxt; } /** * xmlSchemaValidateStreamLocator: * @ctx: the xmlTextReaderPtr used * @file: returned file information * @line: returned line information * * Internal locator function for the readers * * Returns 0 in case the Schema validation could be (des)activated and * -1 in case of error. */ static int xmlSchemaValidateStreamLocator(void *ctx, const char **file, unsigned long *line) { xmlParserCtxtPtr ctxt; if ((ctx == NULL) || ((file == NULL) && (line == NULL))) return(-1); if (file != NULL) *file = NULL; if (line != NULL) *line = 0; ctxt = (xmlParserCtxtPtr) ctx; if (ctxt->input != NULL) { if (file != NULL) *file = ctxt->input->filename; if (line != NULL) *line = ctxt->input->line; return(0); } return(-1); } /** * xmlSchemaValidateStream: * @ctxt: a schema validation context * @input: the input to use for reading the data * @enc: an optional encoding information * @sax: a SAX handler for the resulting events * @user_data: the context to provide to the SAX handler. * * Validate an input based on a flow of SAX event from the parser * and forward the events to the @sax handler with the provided @user_data * the user provided @sax handler must be a SAX2 one. * * Returns 0 if the document is schemas valid, a positive error code * number otherwise and -1 in case of internal or API error. */ int xmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt, xmlParserInputBufferPtr input, xmlCharEncoding enc, xmlSAXHandlerPtr sax, void *user_data) { xmlSchemaSAXPlugPtr plug = NULL; xmlSAXHandlerPtr old_sax = NULL; xmlParserCtxtPtr pctxt = NULL; xmlParserInputPtr inputStream = NULL; int ret; if ((ctxt == NULL) || (input == NULL)) return (-1); /* * prepare the parser */ pctxt = xmlNewParserCtxt(); if (pctxt == NULL) return (-1); old_sax = pctxt->sax; pctxt->sax = sax; pctxt->userData = user_data; #if 0 if (options) xmlCtxtUseOptions(pctxt, options); #endif pctxt->linenumbers = 1; xmlSchemaValidateSetLocator(ctxt, xmlSchemaValidateStreamLocator, pctxt); inputStream = xmlNewIOInputStream(pctxt, input, enc);; if (inputStream == NULL) { ret = -1; goto done; } inputPush(pctxt, inputStream); ctxt->parserCtxt = pctxt; ctxt->input = input; /* * Plug the validation and launch the parsing */ plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData)); if (plug == NULL) { ret = -1; goto done; } ctxt->input = input; ctxt->enc = enc; ctxt->sax = pctxt->sax; ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM; ret = xmlSchemaVStart(ctxt); if ((ret == 0) && (! ctxt->parserCtxt->wellFormed)) { ret = ctxt->parserCtxt->errNo; if (ret == 0) ret = 1; } done: ctxt->parserCtxt = NULL; ctxt->sax = NULL; ctxt->input = NULL; if (plug != NULL) { xmlSchemaSAXUnplug(plug); } /* cleanup */ if (pctxt != NULL) { pctxt->sax = old_sax; xmlFreeParserCtxt(pctxt); } return (ret); } /** * xmlSchemaValidateFile: * @ctxt: a schema validation context * @filename: the URI of the instance * @options: a future set of options, currently unused * * Do a schemas validation of the given resource, it will use the * SAX streamable validation internally. * * Returns 0 if the document is valid, a positive error code * number otherwise and -1 in case of an internal or API error. */ int xmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt, const char * filename, int options ATTRIBUTE_UNUSED) { int ret; xmlParserInputBufferPtr input; if ((ctxt == NULL) || (filename == NULL)) return (-1); input = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); if (input == NULL) return (-1); ret = xmlSchemaValidateStream(ctxt, input, XML_CHAR_ENCODING_NONE, NULL, NULL); return (ret); } /** * xmlSchemaValidCtxtGetParserCtxt: * @ctxt: a schema validation context * * allow access to the parser context of the schema validation context * * Returns the parser context of the schema validation context or NULL * in case of error. */ xmlParserCtxtPtr xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt) { if (ctxt == NULL) return(NULL); return (ctxt->parserCtxt); } #define bottom_xmlschemas #include "elfgcchack.h" #endif /* LIBXML_SCHEMAS_ENABLED */ libxml2-2.9.1+dfsg1/legacy.c0000644000175000017500000011356212113312342014164 0ustar aronaron/* * legacy.c: set of deprecated routines, not to be used anymore but * kept purely for ABI compatibility * * See Copyright for the status of this software. * * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_LEGACY_ENABLED #include #include #include #include #include #include void xmlUpgradeOldNs(xmlDocPtr doc); /************************************************************************ * * * Deprecated functions kept for compatibility * * * ************************************************************************/ #ifdef LIBXML_HTML_ENABLED xmlChar *htmlDecodeEntities(htmlParserCtxtPtr ctxt, int len, xmlChar end, xmlChar end2, xmlChar end3); /** * htmlDecodeEntities: * @ctxt: the parser context * @len: the len to decode (in bytes !), -1 for no size limit * @end: an end marker xmlChar, 0 if none * @end2: an end marker xmlChar, 0 if none * @end3: an end marker xmlChar, 0 if none * * Substitute the HTML entities by their value * * DEPRECATED !!!! * * Returns A newly allocated string with the substitution done. The caller * must deallocate it ! */ xmlChar * htmlDecodeEntities(htmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED, xmlChar end ATTRIBUTE_UNUSED, xmlChar end2 ATTRIBUTE_UNUSED, xmlChar end3 ATTRIBUTE_UNUSED) { static int deprecated = 0; if (!deprecated) { xmlGenericError(xmlGenericErrorContext, "htmlDecodeEntities() deprecated function reached\n"); deprecated = 1; } return (NULL); } #endif /** * xmlInitializePredefinedEntities: * * Set up the predefined entities. * Deprecated call */ void xmlInitializePredefinedEntities(void) { } /** * xmlCleanupPredefinedEntities: * * Cleanup up the predefined entities table. * Deprecated call */ void xmlCleanupPredefinedEntities(void) { } static const char *xmlFeaturesList[] = { "validate", "load subset", "keep blanks", "disable SAX", "fetch external entities", "substitute entities", "gather line info", "user data", "is html", "is standalone", "stop parser", "document", "is well formed", "is valid", "SAX block", "SAX function internalSubset", "SAX function isStandalone", "SAX function hasInternalSubset", "SAX function hasExternalSubset", "SAX function resolveEntity", "SAX function getEntity", "SAX function entityDecl", "SAX function notationDecl", "SAX function attributeDecl", "SAX function elementDecl", "SAX function unparsedEntityDecl", "SAX function setDocumentLocator", "SAX function startDocument", "SAX function endDocument", "SAX function startElement", "SAX function endElement", "SAX function reference", "SAX function characters", "SAX function ignorableWhitespace", "SAX function processingInstruction", "SAX function comment", "SAX function warning", "SAX function error", "SAX function fatalError", "SAX function getParameterEntity", "SAX function cdataBlock", "SAX function externalSubset", }; /** * xmlGetFeaturesList: * @len: the length of the features name array (input/output) * @result: an array of string to be filled with the features name. * * Copy at most *@len feature names into the @result array * * Returns -1 in case or error, or the total number of features, * len is updated with the number of strings copied, * strings must not be deallocated */ int xmlGetFeaturesList(int *len, const char **result) { int ret, i; ret = sizeof(xmlFeaturesList) / sizeof(xmlFeaturesList[0]); if ((len == NULL) || (result == NULL)) return (ret); if ((*len < 0) || (*len >= 1000)) return (-1); if (*len > ret) *len = ret; for (i = 0; i < *len; i++) result[i] = xmlFeaturesList[i]; return (ret); } /** * xmlGetFeature: * @ctxt: an XML/HTML parser context * @name: the feature name * @result: location to store the result * * Read the current value of one feature of this parser instance * * Returns -1 in case or error, 0 otherwise */ int xmlGetFeature(xmlParserCtxtPtr ctxt, const char *name, void *result) { if ((ctxt == NULL) || (name == NULL) || (result == NULL)) return (-1); if (!strcmp(name, "validate")) { *((int *) result) = ctxt->validate; } else if (!strcmp(name, "keep blanks")) { *((int *) result) = ctxt->keepBlanks; } else if (!strcmp(name, "disable SAX")) { *((int *) result) = ctxt->disableSAX; } else if (!strcmp(name, "fetch external entities")) { *((int *) result) = ctxt->loadsubset; } else if (!strcmp(name, "substitute entities")) { *((int *) result) = ctxt->replaceEntities; } else if (!strcmp(name, "gather line info")) { *((int *) result) = ctxt->record_info; } else if (!strcmp(name, "user data")) { *((void **) result) = ctxt->userData; } else if (!strcmp(name, "is html")) { *((int *) result) = ctxt->html; } else if (!strcmp(name, "is standalone")) { *((int *) result) = ctxt->standalone; } else if (!strcmp(name, "document")) { *((xmlDocPtr *) result) = ctxt->myDoc; } else if (!strcmp(name, "is well formed")) { *((int *) result) = ctxt->wellFormed; } else if (!strcmp(name, "is valid")) { *((int *) result) = ctxt->valid; } else if (!strcmp(name, "SAX block")) { *((xmlSAXHandlerPtr *) result) = ctxt->sax; } else if (!strcmp(name, "SAX function internalSubset")) { *((internalSubsetSAXFunc *) result) = ctxt->sax->internalSubset; } else if (!strcmp(name, "SAX function isStandalone")) { *((isStandaloneSAXFunc *) result) = ctxt->sax->isStandalone; } else if (!strcmp(name, "SAX function hasInternalSubset")) { *((hasInternalSubsetSAXFunc *) result) = ctxt->sax->hasInternalSubset; } else if (!strcmp(name, "SAX function hasExternalSubset")) { *((hasExternalSubsetSAXFunc *) result) = ctxt->sax->hasExternalSubset; } else if (!strcmp(name, "SAX function resolveEntity")) { *((resolveEntitySAXFunc *) result) = ctxt->sax->resolveEntity; } else if (!strcmp(name, "SAX function getEntity")) { *((getEntitySAXFunc *) result) = ctxt->sax->getEntity; } else if (!strcmp(name, "SAX function entityDecl")) { *((entityDeclSAXFunc *) result) = ctxt->sax->entityDecl; } else if (!strcmp(name, "SAX function notationDecl")) { *((notationDeclSAXFunc *) result) = ctxt->sax->notationDecl; } else if (!strcmp(name, "SAX function attributeDecl")) { *((attributeDeclSAXFunc *) result) = ctxt->sax->attributeDecl; } else if (!strcmp(name, "SAX function elementDecl")) { *((elementDeclSAXFunc *) result) = ctxt->sax->elementDecl; } else if (!strcmp(name, "SAX function unparsedEntityDecl")) { *((unparsedEntityDeclSAXFunc *) result) = ctxt->sax->unparsedEntityDecl; } else if (!strcmp(name, "SAX function setDocumentLocator")) { *((setDocumentLocatorSAXFunc *) result) = ctxt->sax->setDocumentLocator; } else if (!strcmp(name, "SAX function startDocument")) { *((startDocumentSAXFunc *) result) = ctxt->sax->startDocument; } else if (!strcmp(name, "SAX function endDocument")) { *((endDocumentSAXFunc *) result) = ctxt->sax->endDocument; } else if (!strcmp(name, "SAX function startElement")) { *((startElementSAXFunc *) result) = ctxt->sax->startElement; } else if (!strcmp(name, "SAX function endElement")) { *((endElementSAXFunc *) result) = ctxt->sax->endElement; } else if (!strcmp(name, "SAX function reference")) { *((referenceSAXFunc *) result) = ctxt->sax->reference; } else if (!strcmp(name, "SAX function characters")) { *((charactersSAXFunc *) result) = ctxt->sax->characters; } else if (!strcmp(name, "SAX function ignorableWhitespace")) { *((ignorableWhitespaceSAXFunc *) result) = ctxt->sax->ignorableWhitespace; } else if (!strcmp(name, "SAX function processingInstruction")) { *((processingInstructionSAXFunc *) result) = ctxt->sax->processingInstruction; } else if (!strcmp(name, "SAX function comment")) { *((commentSAXFunc *) result) = ctxt->sax->comment; } else if (!strcmp(name, "SAX function warning")) { *((warningSAXFunc *) result) = ctxt->sax->warning; } else if (!strcmp(name, "SAX function error")) { *((errorSAXFunc *) result) = ctxt->sax->error; } else if (!strcmp(name, "SAX function fatalError")) { *((fatalErrorSAXFunc *) result) = ctxt->sax->fatalError; } else if (!strcmp(name, "SAX function getParameterEntity")) { *((getParameterEntitySAXFunc *) result) = ctxt->sax->getParameterEntity; } else if (!strcmp(name, "SAX function cdataBlock")) { *((cdataBlockSAXFunc *) result) = ctxt->sax->cdataBlock; } else if (!strcmp(name, "SAX function externalSubset")) { *((externalSubsetSAXFunc *) result) = ctxt->sax->externalSubset; } else { return (-1); } return (0); } /** * xmlSetFeature: * @ctxt: an XML/HTML parser context * @name: the feature name * @value: pointer to the location of the new value * * Change the current value of one feature of this parser instance * * Returns -1 in case or error, 0 otherwise */ int xmlSetFeature(xmlParserCtxtPtr ctxt, const char *name, void *value) { if ((ctxt == NULL) || (name == NULL) || (value == NULL)) return (-1); if (!strcmp(name, "validate")) { int newvalidate = *((int *) value); if ((!ctxt->validate) && (newvalidate != 0)) { if (ctxt->vctxt.warning == NULL) ctxt->vctxt.warning = xmlParserValidityWarning; if (ctxt->vctxt.error == NULL) ctxt->vctxt.error = xmlParserValidityError; ctxt->vctxt.nodeMax = 0; } ctxt->validate = newvalidate; } else if (!strcmp(name, "keep blanks")) { ctxt->keepBlanks = *((int *) value); } else if (!strcmp(name, "disable SAX")) { ctxt->disableSAX = *((int *) value); } else if (!strcmp(name, "fetch external entities")) { ctxt->loadsubset = *((int *) value); } else if (!strcmp(name, "substitute entities")) { ctxt->replaceEntities = *((int *) value); } else if (!strcmp(name, "gather line info")) { ctxt->record_info = *((int *) value); } else if (!strcmp(name, "user data")) { ctxt->userData = *((void **) value); } else if (!strcmp(name, "is html")) { ctxt->html = *((int *) value); } else if (!strcmp(name, "is standalone")) { ctxt->standalone = *((int *) value); } else if (!strcmp(name, "document")) { ctxt->myDoc = *((xmlDocPtr *) value); } else if (!strcmp(name, "is well formed")) { ctxt->wellFormed = *((int *) value); } else if (!strcmp(name, "is valid")) { ctxt->valid = *((int *) value); } else if (!strcmp(name, "SAX block")) { ctxt->sax = *((xmlSAXHandlerPtr *) value); } else if (!strcmp(name, "SAX function internalSubset")) { ctxt->sax->internalSubset = *((internalSubsetSAXFunc *) value); } else if (!strcmp(name, "SAX function isStandalone")) { ctxt->sax->isStandalone = *((isStandaloneSAXFunc *) value); } else if (!strcmp(name, "SAX function hasInternalSubset")) { ctxt->sax->hasInternalSubset = *((hasInternalSubsetSAXFunc *) value); } else if (!strcmp(name, "SAX function hasExternalSubset")) { ctxt->sax->hasExternalSubset = *((hasExternalSubsetSAXFunc *) value); } else if (!strcmp(name, "SAX function resolveEntity")) { ctxt->sax->resolveEntity = *((resolveEntitySAXFunc *) value); } else if (!strcmp(name, "SAX function getEntity")) { ctxt->sax->getEntity = *((getEntitySAXFunc *) value); } else if (!strcmp(name, "SAX function entityDecl")) { ctxt->sax->entityDecl = *((entityDeclSAXFunc *) value); } else if (!strcmp(name, "SAX function notationDecl")) { ctxt->sax->notationDecl = *((notationDeclSAXFunc *) value); } else if (!strcmp(name, "SAX function attributeDecl")) { ctxt->sax->attributeDecl = *((attributeDeclSAXFunc *) value); } else if (!strcmp(name, "SAX function elementDecl")) { ctxt->sax->elementDecl = *((elementDeclSAXFunc *) value); } else if (!strcmp(name, "SAX function unparsedEntityDecl")) { ctxt->sax->unparsedEntityDecl = *((unparsedEntityDeclSAXFunc *) value); } else if (!strcmp(name, "SAX function setDocumentLocator")) { ctxt->sax->setDocumentLocator = *((setDocumentLocatorSAXFunc *) value); } else if (!strcmp(name, "SAX function startDocument")) { ctxt->sax->startDocument = *((startDocumentSAXFunc *) value); } else if (!strcmp(name, "SAX function endDocument")) { ctxt->sax->endDocument = *((endDocumentSAXFunc *) value); } else if (!strcmp(name, "SAX function startElement")) { ctxt->sax->startElement = *((startElementSAXFunc *) value); } else if (!strcmp(name, "SAX function endElement")) { ctxt->sax->endElement = *((endElementSAXFunc *) value); } else if (!strcmp(name, "SAX function reference")) { ctxt->sax->reference = *((referenceSAXFunc *) value); } else if (!strcmp(name, "SAX function characters")) { ctxt->sax->characters = *((charactersSAXFunc *) value); } else if (!strcmp(name, "SAX function ignorableWhitespace")) { ctxt->sax->ignorableWhitespace = *((ignorableWhitespaceSAXFunc *) value); } else if (!strcmp(name, "SAX function processingInstruction")) { ctxt->sax->processingInstruction = *((processingInstructionSAXFunc *) value); } else if (!strcmp(name, "SAX function comment")) { ctxt->sax->comment = *((commentSAXFunc *) value); } else if (!strcmp(name, "SAX function warning")) { ctxt->sax->warning = *((warningSAXFunc *) value); } else if (!strcmp(name, "SAX function error")) { ctxt->sax->error = *((errorSAXFunc *) value); } else if (!strcmp(name, "SAX function fatalError")) { ctxt->sax->fatalError = *((fatalErrorSAXFunc *) value); } else if (!strcmp(name, "SAX function getParameterEntity")) { ctxt->sax->getParameterEntity = *((getParameterEntitySAXFunc *) value); } else if (!strcmp(name, "SAX function cdataBlock")) { ctxt->sax->cdataBlock = *((cdataBlockSAXFunc *) value); } else if (!strcmp(name, "SAX function externalSubset")) { ctxt->sax->externalSubset = *((externalSubsetSAXFunc *) value); } else { return (-1); } return (0); } /** * xmlDecodeEntities: * @ctxt: the parser context * @len: the len to decode (in bytes !), -1 for no size limit * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF * @end: an end marker xmlChar, 0 if none * @end2: an end marker xmlChar, 0 if none * @end3: an end marker xmlChar, 0 if none * * This function is deprecated, we now always process entities content * through xmlStringDecodeEntities * * TODO: remove it in next major release. * * [67] Reference ::= EntityRef | CharRef * * [69] PEReference ::= '%' Name ';' * * Returns A newly allocated string with the substitution done. The caller * must deallocate it ! */ xmlChar * xmlDecodeEntities(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED, int what ATTRIBUTE_UNUSED, xmlChar end ATTRIBUTE_UNUSED, xmlChar end2 ATTRIBUTE_UNUSED, xmlChar end3 ATTRIBUTE_UNUSED) { static int deprecated = 0; if (!deprecated) { xmlGenericError(xmlGenericErrorContext, "xmlDecodeEntities() deprecated function reached\n"); deprecated = 1; } return (NULL); } /** * xmlNamespaceParseNCName: * @ctxt: an XML parser context * * parse an XML namespace name. * * TODO: this seems not in use anymore, the namespace handling is done on * top of the SAX interfaces, i.e. not on raw input. * * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* * * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | * CombiningChar | Extender * * Returns the namespace name or NULL */ xmlChar * xmlNamespaceParseNCName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) { static int deprecated = 0; if (!deprecated) { xmlGenericError(xmlGenericErrorContext, "xmlNamespaceParseNCName() deprecated function reached\n"); deprecated = 1; } return (NULL); } /** * xmlNamespaceParseQName: * @ctxt: an XML parser context * @prefix: a xmlChar ** * * TODO: this seems not in use anymore, the namespace handling is done on * top of the SAX interfaces, i.e. not on raw input. * * parse an XML qualified name * * [NS 5] QName ::= (Prefix ':')? LocalPart * * [NS 6] Prefix ::= NCName * * [NS 7] LocalPart ::= NCName * * Returns the local part, and prefix is updated * to get the Prefix if any. */ xmlChar * xmlNamespaceParseQName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlChar ** prefix ATTRIBUTE_UNUSED) { static int deprecated = 0; if (!deprecated) { xmlGenericError(xmlGenericErrorContext, "xmlNamespaceParseQName() deprecated function reached\n"); deprecated = 1; } return (NULL); } /** * xmlNamespaceParseNSDef: * @ctxt: an XML parser context * * parse a namespace prefix declaration * * TODO: this seems not in use anymore, the namespace handling is done on * top of the SAX interfaces, i.e. not on raw input. * * [NS 1] NSDef ::= PrefixDef Eq SystemLiteral * * [NS 2] PrefixDef ::= 'xmlns' (':' NCName)? * * Returns the namespace name */ xmlChar * xmlNamespaceParseNSDef(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) { static int deprecated = 0; if (!deprecated) { xmlGenericError(xmlGenericErrorContext, "xmlNamespaceParseNSDef() deprecated function reached\n"); deprecated = 1; } return (NULL); } /** * xmlParseQuotedString: * @ctxt: an XML parser context * * Parse and return a string between quotes or doublequotes * * TODO: Deprecated, to be removed at next drop of binary compatibility * * Returns the string parser or NULL. */ xmlChar * xmlParseQuotedString(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) { static int deprecated = 0; if (!deprecated) { xmlGenericError(xmlGenericErrorContext, "xmlParseQuotedString() deprecated function reached\n"); deprecated = 1; } return (NULL); } /** * xmlParseNamespace: * @ctxt: an XML parser context * * xmlParseNamespace: parse specific PI ' #define IN_LIBXML #include "libxml/xmlexports.h" XMLPUBFUN int hello_world(void); int hello_world(void) { printf("Success!\n"); return 0; } libxml2-2.9.1+dfsg1/parser.c0000644000175000017500000151572612133252206014231 0ustar aronaron/* * parser.c : an XML 1.0 parser, namespaces and validity support are mostly * implemented on top of the SAX interfaces * * References: * The XML specification: * http://www.w3.org/TR/REC-xml * Original 1.0 version: * http://www.w3.org/TR/1998/REC-xml-19980210 * XML second edition working draft * http://www.w3.org/TR/2000/WD-xml-2e-20000814 * * Okay this is a big file, the parser core is around 7000 lines, then it * is followed by the progressive parser top routines, then the various * high level APIs to call the parser and a few miscellaneous functions. * A number of helper functions and deprecated ones have been moved to * parserInternals.c to reduce this file size. * As much as possible the functions are associated with their relative * production in the XML specification. A few productions defining the * different ranges of character are actually implanted either in * parserInternals.h or parserInternals.c * The DOM tree build is realized from the default SAX callbacks in * the module SAX.c. * The routines doing the validation checks are in valid.c and called either * from the SAX callbacks or as standalone functions using a preparsed * document. * * See Copyright for the status of this software. * * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #if defined(WIN32) && !defined (__CYGWIN__) #define XML_DIR_SEP '\\' #else #define XML_DIR_SEP '/' #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LIBXML_CATALOG_ENABLED #include #endif #ifdef LIBXML_SCHEMAS_ENABLED #include #include #endif #ifdef HAVE_CTYPE_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_ZLIB_H #include #endif #ifdef HAVE_LZMA_H #include #endif #include "buf.h" #include "enc.h" static void xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info); static xmlParserCtxtPtr xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID, const xmlChar *base, xmlParserCtxtPtr pctx); /************************************************************************ * * * Arbitrary limits set in the parser. See XML_PARSE_HUGE * * * ************************************************************************/ #define XML_PARSER_BIG_ENTITY 1000 #define XML_PARSER_LOT_ENTITY 5000 /* * XML_PARSER_NON_LINEAR is the threshold where the ratio of parsed entity * replacement over the size in byte of the input indicates that you have * and eponential behaviour. A value of 10 correspond to at least 3 entity * replacement per byte of input. */ #define XML_PARSER_NON_LINEAR 10 /* * xmlParserEntityCheck * * Function to check non-linear entity expansion behaviour * This is here to detect and stop exponential linear entity expansion * This is not a limitation of the parser but a safety * boundary feature. It can be disabled with the XML_PARSE_HUGE * parser option. */ static int xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, xmlEntityPtr ent, size_t replacement) { size_t consumed = 0; if ((ctxt == NULL) || (ctxt->options & XML_PARSE_HUGE)) return (0); if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) return (1); if (replacement != 0) { if (replacement < XML_MAX_TEXT_LENGTH) return(0); /* * If the volume of entity copy reaches 10 times the * amount of parsed data and over the large text threshold * then that's very likely to be an abuse. */ if (ctxt->input != NULL) { consumed = ctxt->input->consumed + (ctxt->input->cur - ctxt->input->base); } consumed += ctxt->sizeentities; if (replacement < XML_PARSER_NON_LINEAR * consumed) return(0); } else if (size != 0) { /* * Do the check based on the replacement size of the entity */ if (size < XML_PARSER_BIG_ENTITY) return(0); /* * A limit on the amount of text data reasonably used */ if (ctxt->input != NULL) { consumed = ctxt->input->consumed + (ctxt->input->cur - ctxt->input->base); } consumed += ctxt->sizeentities; if ((size < XML_PARSER_NON_LINEAR * consumed) && (ctxt->nbentities * 3 < XML_PARSER_NON_LINEAR * consumed)) return (0); } else if (ent != NULL) { /* * use the number of parsed entities in the replacement */ size = ent->checked / 2; /* * The amount of data parsed counting entities size only once */ if (ctxt->input != NULL) { consumed = ctxt->input->consumed + (ctxt->input->cur - ctxt->input->base); } consumed += ctxt->sizeentities; /* * Check the density of entities for the amount of data * knowing an entity reference will take at least 3 bytes */ if (size * 3 < consumed * XML_PARSER_NON_LINEAR) return (0); } else { /* * strange we got no data for checking just return */ return (0); } xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); return (1); } /** * xmlParserMaxDepth: * * arbitrary depth limit for the XML documents that we allow to * process. This is not a limitation of the parser but a safety * boundary feature. It can be disabled with the XML_PARSE_HUGE * parser option. */ unsigned int xmlParserMaxDepth = 256; #define SAX2 1 #define XML_PARSER_BIG_BUFFER_SIZE 300 #define XML_PARSER_BUFFER_SIZE 100 #define SAX_COMPAT_MODE BAD_CAST "SAX compatibility mode document" /** * XML_PARSER_CHUNK_SIZE * * When calling GROW that's the minimal amount of data * the parser expected to have received. It is not a hard * limit but an optimization when reading strings like Names * It is not strictly needed as long as inputs available characters * are followed by 0, which should be provided by the I/O level */ #define XML_PARSER_CHUNK_SIZE 100 /* * List of XML prefixed PI allowed by W3C specs */ static const char *xmlW3CPIs[] = { "xml-stylesheet", "xml-model", NULL }; /* DEPR void xmlParserHandleReference(xmlParserCtxtPtr ctxt); */ static xmlEntityPtr xmlParseStringPEReference(xmlParserCtxtPtr ctxt, const xmlChar **str); static xmlParserErrors xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt, xmlSAXHandlerPtr sax, void *user_data, int depth, const xmlChar *URL, const xmlChar *ID, xmlNodePtr *list); static int xmlCtxtUseOptionsInternal(xmlParserCtxtPtr ctxt, int options, const char *encoding); #ifdef LIBXML_LEGACY_ENABLED static void xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode, xmlNodePtr lastNode); #endif /* LIBXML_LEGACY_ENABLED */ static xmlParserErrors xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt, const xmlChar *string, void *user_data, xmlNodePtr *lst); static int xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity); /************************************************************************ * * * Some factorized error routines * * * ************************************************************************/ /** * xmlErrAttributeDup: * @ctxt: an XML parser context * @prefix: the attribute prefix * @localname: the attribute localname * * Handle a redefinition of attribute error */ static void xmlErrAttributeDup(xmlParserCtxtPtr ctxt, const xmlChar * prefix, const xmlChar * localname) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = XML_ERR_ATTRIBUTE_REDEFINED; if (prefix == NULL) __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_ATTRIBUTE_REDEFINED, XML_ERR_FATAL, NULL, 0, (const char *) localname, NULL, NULL, 0, 0, "Attribute %s redefined\n", localname); else __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_ATTRIBUTE_REDEFINED, XML_ERR_FATAL, NULL, 0, (const char *) prefix, (const char *) localname, NULL, 0, 0, "Attribute %s:%s redefined\n", prefix, localname); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlFatalErr: * @ctxt: an XML parser context * @error: the error number * @extra: extra information string * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info) { const char *errmsg; char errstr[129] = ""; if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; switch (error) { case XML_ERR_INVALID_HEX_CHARREF: errmsg = "CharRef: invalid hexadecimal value"; break; case XML_ERR_INVALID_DEC_CHARREF: errmsg = "CharRef: invalid decimal value"; break; case XML_ERR_INVALID_CHARREF: errmsg = "CharRef: invalid value"; break; case XML_ERR_INTERNAL_ERROR: errmsg = "internal error"; break; case XML_ERR_PEREF_AT_EOF: errmsg = "PEReference at end of document"; break; case XML_ERR_PEREF_IN_PROLOG: errmsg = "PEReference in prolog"; break; case XML_ERR_PEREF_IN_EPILOG: errmsg = "PEReference in epilog"; break; case XML_ERR_PEREF_NO_NAME: errmsg = "PEReference: no name"; break; case XML_ERR_PEREF_SEMICOL_MISSING: errmsg = "PEReference: expecting ';'"; break; case XML_ERR_ENTITY_LOOP: errmsg = "Detected an entity reference loop"; break; case XML_ERR_ENTITY_NOT_STARTED: errmsg = "EntityValue: \" or ' expected"; break; case XML_ERR_ENTITY_PE_INTERNAL: errmsg = "PEReferences forbidden in internal subset"; break; case XML_ERR_ENTITY_NOT_FINISHED: errmsg = "EntityValue: \" or ' expected"; break; case XML_ERR_ATTRIBUTE_NOT_STARTED: errmsg = "AttValue: \" or ' expected"; break; case XML_ERR_LT_IN_ATTRIBUTE: errmsg = "Unescaped '<' not allowed in attributes values"; break; case XML_ERR_LITERAL_NOT_STARTED: errmsg = "SystemLiteral \" or ' expected"; break; case XML_ERR_LITERAL_NOT_FINISHED: errmsg = "Unfinished System or Public ID \" or ' expected"; break; case XML_ERR_MISPLACED_CDATA_END: errmsg = "Sequence ']]>' not allowed in content"; break; case XML_ERR_URI_REQUIRED: errmsg = "SYSTEM or PUBLIC, the URI is missing"; break; case XML_ERR_PUBID_REQUIRED: errmsg = "PUBLIC, the Public Identifier is missing"; break; case XML_ERR_HYPHEN_IN_COMMENT: errmsg = "Comment must not contain '--' (double-hyphen)"; break; case XML_ERR_PI_NOT_STARTED: errmsg = "xmlParsePI : no target name"; break; case XML_ERR_RESERVED_XML_NAME: errmsg = "Invalid PI name"; break; case XML_ERR_NOTATION_NOT_STARTED: errmsg = "NOTATION: Name expected here"; break; case XML_ERR_NOTATION_NOT_FINISHED: errmsg = "'>' required to close NOTATION declaration"; break; case XML_ERR_VALUE_REQUIRED: errmsg = "Entity value required"; break; case XML_ERR_URI_FRAGMENT: errmsg = "Fragment not allowed"; break; case XML_ERR_ATTLIST_NOT_STARTED: errmsg = "'(' required to start ATTLIST enumeration"; break; case XML_ERR_NMTOKEN_REQUIRED: errmsg = "NmToken expected in ATTLIST enumeration"; break; case XML_ERR_ATTLIST_NOT_FINISHED: errmsg = "')' required to finish ATTLIST enumeration"; break; case XML_ERR_MIXED_NOT_STARTED: errmsg = "MixedContentDecl : '|' or ')*' expected"; break; case XML_ERR_PCDATA_REQUIRED: errmsg = "MixedContentDecl : '#PCDATA' expected"; break; case XML_ERR_ELEMCONTENT_NOT_STARTED: errmsg = "ContentDecl : Name or '(' expected"; break; case XML_ERR_ELEMCONTENT_NOT_FINISHED: errmsg = "ContentDecl : ',' '|' or ')' expected"; break; case XML_ERR_PEREF_IN_INT_SUBSET: errmsg = "PEReference: forbidden within markup decl in internal subset"; break; case XML_ERR_GT_REQUIRED: errmsg = "expected '>'"; break; case XML_ERR_CONDSEC_INVALID: errmsg = "XML conditional section '[' expected"; break; case XML_ERR_EXT_SUBSET_NOT_FINISHED: errmsg = "Content error in the external subset"; break; case XML_ERR_CONDSEC_INVALID_KEYWORD: errmsg = "conditional section INCLUDE or IGNORE keyword expected"; break; case XML_ERR_CONDSEC_NOT_FINISHED: errmsg = "XML conditional section not closed"; break; case XML_ERR_XMLDECL_NOT_STARTED: errmsg = "Text declaration '' expected"; break; case XML_ERR_EXT_ENTITY_STANDALONE: errmsg = "external parsed entities cannot be standalone"; break; case XML_ERR_ENTITYREF_SEMICOL_MISSING: errmsg = "EntityRef: expecting ';'"; break; case XML_ERR_DOCTYPE_NOT_FINISHED: errmsg = "DOCTYPE improperly terminated"; break; case XML_ERR_LTSLASH_REQUIRED: errmsg = "EndTag: 'errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, &errstr[0], info); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlFatalErrMsg: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlWarningMsg: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @str1: extra data * @str2: extra data * * Handle a warning. */ static void xmlWarningMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1, const xmlChar *str2) { xmlStructuredErrorFunc schannel = NULL; if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if ((ctxt != NULL) && (ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) schannel = ctxt->sax->serror; if (ctxt != NULL) { __xmlRaiseError(schannel, (ctxt->sax) ? ctxt->sax->warning : NULL, ctxt->userData, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_WARNING, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, (const char *) str1, (const char *) str2); } else { __xmlRaiseError(schannel, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_WARNING, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, (const char *) str1, (const char *) str2); } } /** * xmlValidityError: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @str1: extra data * * Handle a validity error. */ static void xmlValidityError(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1, const xmlChar *str2) { xmlStructuredErrorFunc schannel = NULL; if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) { ctxt->errNo = error; if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) schannel = ctxt->sax->serror; } if (ctxt != NULL) { __xmlRaiseError(schannel, ctxt->vctxt.error, ctxt->vctxt.userData, ctxt, NULL, XML_FROM_DTD, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, (const char *) str1, (const char *) str2); ctxt->valid = 0; } else { __xmlRaiseError(schannel, NULL, NULL, ctxt, NULL, XML_FROM_DTD, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, (const char *) str1, (const char *) str2); } } /** * xmlFatalErrMsgInt: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @val: an integer value * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void xmlFatalErrMsgInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, int val) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlFatalErrMsgStrIntStr: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @str1: an string info * @val: an integer value * @str2: an string info * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void xmlFatalErrMsgStrIntStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1, int val, const xmlChar *str2) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, NULL, 0, (const char *) str1, (const char *) str2, NULL, val, 0, msg, str1, val, str2); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlFatalErrMsgStr: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @val: a string value * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void xmlFatalErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar * val) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, val); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlErrMsgStr: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @val: a string value * * Handle a non fatal parser error */ static void xmlErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar * val) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_ERROR, NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, val); } /** * xmlNsErr: * @ctxt: an XML parser context * @error: the error number * @msg: the message * @info1: extra information string * @info2: extra information string * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void xmlNsErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar * info1, const xmlChar * info2, const xmlChar * info3) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, XML_ERR_ERROR, NULL, 0, (const char *) info1, (const char *) info2, (const char *) info3, 0, 0, msg, info1, info2, info3); if (ctxt != NULL) ctxt->nsWellFormed = 0; } /** * xmlNsWarn * @ctxt: an XML parser context * @error: the error number * @msg: the message * @info1: extra information string * @info2: extra information string * * Handle a namespace warning error */ static void xmlNsWarn(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar * info1, const xmlChar * info2, const xmlChar * info3) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, XML_ERR_WARNING, NULL, 0, (const char *) info1, (const char *) info2, (const char *) info3, 0, 0, msg, info1, info2, info3); } /************************************************************************ * * * Library wide options * * * ************************************************************************/ /** * xmlHasFeature: * @feature: the feature to be examined * * Examines if the library has been compiled with a given feature. * * Returns a non-zero value if the feature exist, otherwise zero. * Returns zero (0) if the feature does not exist or an unknown * unknown feature is requested, non-zero otherwise. */ int xmlHasFeature(xmlFeature feature) { switch (feature) { case XML_WITH_THREAD: #ifdef LIBXML_THREAD_ENABLED return(1); #else return(0); #endif case XML_WITH_TREE: #ifdef LIBXML_TREE_ENABLED return(1); #else return(0); #endif case XML_WITH_OUTPUT: #ifdef LIBXML_OUTPUT_ENABLED return(1); #else return(0); #endif case XML_WITH_PUSH: #ifdef LIBXML_PUSH_ENABLED return(1); #else return(0); #endif case XML_WITH_READER: #ifdef LIBXML_READER_ENABLED return(1); #else return(0); #endif case XML_WITH_PATTERN: #ifdef LIBXML_PATTERN_ENABLED return(1); #else return(0); #endif case XML_WITH_WRITER: #ifdef LIBXML_WRITER_ENABLED return(1); #else return(0); #endif case XML_WITH_SAX1: #ifdef LIBXML_SAX1_ENABLED return(1); #else return(0); #endif case XML_WITH_FTP: #ifdef LIBXML_FTP_ENABLED return(1); #else return(0); #endif case XML_WITH_HTTP: #ifdef LIBXML_HTTP_ENABLED return(1); #else return(0); #endif case XML_WITH_VALID: #ifdef LIBXML_VALID_ENABLED return(1); #else return(0); #endif case XML_WITH_HTML: #ifdef LIBXML_HTML_ENABLED return(1); #else return(0); #endif case XML_WITH_LEGACY: #ifdef LIBXML_LEGACY_ENABLED return(1); #else return(0); #endif case XML_WITH_C14N: #ifdef LIBXML_C14N_ENABLED return(1); #else return(0); #endif case XML_WITH_CATALOG: #ifdef LIBXML_CATALOG_ENABLED return(1); #else return(0); #endif case XML_WITH_XPATH: #ifdef LIBXML_XPATH_ENABLED return(1); #else return(0); #endif case XML_WITH_XPTR: #ifdef LIBXML_XPTR_ENABLED return(1); #else return(0); #endif case XML_WITH_XINCLUDE: #ifdef LIBXML_XINCLUDE_ENABLED return(1); #else return(0); #endif case XML_WITH_ICONV: #ifdef LIBXML_ICONV_ENABLED return(1); #else return(0); #endif case XML_WITH_ISO8859X: #ifdef LIBXML_ISO8859X_ENABLED return(1); #else return(0); #endif case XML_WITH_UNICODE: #ifdef LIBXML_UNICODE_ENABLED return(1); #else return(0); #endif case XML_WITH_REGEXP: #ifdef LIBXML_REGEXP_ENABLED return(1); #else return(0); #endif case XML_WITH_AUTOMATA: #ifdef LIBXML_AUTOMATA_ENABLED return(1); #else return(0); #endif case XML_WITH_EXPR: #ifdef LIBXML_EXPR_ENABLED return(1); #else return(0); #endif case XML_WITH_SCHEMAS: #ifdef LIBXML_SCHEMAS_ENABLED return(1); #else return(0); #endif case XML_WITH_SCHEMATRON: #ifdef LIBXML_SCHEMATRON_ENABLED return(1); #else return(0); #endif case XML_WITH_MODULES: #ifdef LIBXML_MODULES_ENABLED return(1); #else return(0); #endif case XML_WITH_DEBUG: #ifdef LIBXML_DEBUG_ENABLED return(1); #else return(0); #endif case XML_WITH_DEBUG_MEM: #ifdef DEBUG_MEMORY_LOCATION return(1); #else return(0); #endif case XML_WITH_DEBUG_RUN: #ifdef LIBXML_DEBUG_RUNTIME return(1); #else return(0); #endif case XML_WITH_ZLIB: #ifdef LIBXML_ZLIB_ENABLED return(1); #else return(0); #endif case XML_WITH_LZMA: #ifdef LIBXML_LZMA_ENABLED return(1); #else return(0); #endif case XML_WITH_ICU: #ifdef LIBXML_ICU_ENABLED return(1); #else return(0); #endif default: break; } return(0); } /************************************************************************ * * * SAX2 defaulted attributes handling * * * ************************************************************************/ /** * xmlDetectSAX2: * @ctxt: an XML parser context * * Do the SAX2 detection and specific intialization */ static void xmlDetectSAX2(xmlParserCtxtPtr ctxt) { if (ctxt == NULL) return; #ifdef LIBXML_SAX1_ENABLED if ((ctxt->sax) && (ctxt->sax->initialized == XML_SAX2_MAGIC) && ((ctxt->sax->startElementNs != NULL) || (ctxt->sax->endElementNs != NULL))) ctxt->sax2 = 1; #else ctxt->sax2 = 1; #endif /* LIBXML_SAX1_ENABLED */ ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); if ((ctxt->str_xml==NULL) || (ctxt->str_xmlns==NULL) || (ctxt->str_xml_ns == NULL)) { xmlErrMemory(ctxt, NULL); } } typedef struct _xmlDefAttrs xmlDefAttrs; typedef xmlDefAttrs *xmlDefAttrsPtr; struct _xmlDefAttrs { int nbAttrs; /* number of defaulted attributes on that element */ int maxAttrs; /* the size of the array */ const xmlChar *values[5]; /* array of localname/prefix/values/external */ }; /** * xmlAttrNormalizeSpace: * @src: the source string * @dst: the target string * * Normalize the space in non CDATA attribute values: * If the attribute type is not CDATA, then the XML processor MUST further * process the normalized attribute value by discarding any leading and * trailing space (#x20) characters, and by replacing sequences of space * (#x20) characters by a single space (#x20) character. * Note that the size of dst need to be at least src, and if one doesn't need * to preserve dst (and it doesn't come from a dictionary or read-only) then * passing src as dst is just fine. * * Returns a pointer to the normalized value (dst) or NULL if no conversion * is needed. */ static xmlChar * xmlAttrNormalizeSpace(const xmlChar *src, xmlChar *dst) { if ((src == NULL) || (dst == NULL)) return(NULL); while (*src == 0x20) src++; while (*src != 0) { if (*src == 0x20) { while (*src == 0x20) src++; if (*src != 0) *dst++ = 0x20; } else { *dst++ = *src++; } } *dst = 0; if (dst == src) return(NULL); return(dst); } /** * xmlAttrNormalizeSpace2: * @src: the source string * * Normalize the space in non CDATA attribute values, a slightly more complex * front end to avoid allocation problems when running on attribute values * coming from the input. * * Returns a pointer to the normalized value (dst) or NULL if no conversion * is needed. */ static const xmlChar * xmlAttrNormalizeSpace2(xmlParserCtxtPtr ctxt, xmlChar *src, int *len) { int i; int remove_head = 0; int need_realloc = 0; const xmlChar *cur; if ((ctxt == NULL) || (src == NULL) || (len == NULL)) return(NULL); i = *len; if (i <= 0) return(NULL); cur = src; while (*cur == 0x20) { cur++; remove_head++; } while (*cur != 0) { if (*cur == 0x20) { cur++; if ((*cur == 0x20) || (*cur == 0)) { need_realloc = 1; break; } } else cur++; } if (need_realloc) { xmlChar *ret; ret = xmlStrndup(src + remove_head, i - remove_head + 1); if (ret == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } xmlAttrNormalizeSpace(ret, ret); *len = (int) strlen((const char *)ret); return(ret); } else if (remove_head) { *len -= remove_head; memmove(src, src + remove_head, 1 + *len); return(src); } return(NULL); } /** * xmlAddDefAttrs: * @ctxt: an XML parser context * @fullname: the element fullname * @fullattr: the attribute fullname * @value: the attribute value * * Add a defaulted attribute for an element */ static void xmlAddDefAttrs(xmlParserCtxtPtr ctxt, const xmlChar *fullname, const xmlChar *fullattr, const xmlChar *value) { xmlDefAttrsPtr defaults; int len; const xmlChar *name; const xmlChar *prefix; /* * Allows to detect attribute redefinitions */ if (ctxt->attsSpecial != NULL) { if (xmlHashLookup2(ctxt->attsSpecial, fullname, fullattr) != NULL) return; } if (ctxt->attsDefault == NULL) { ctxt->attsDefault = xmlHashCreateDict(10, ctxt->dict); if (ctxt->attsDefault == NULL) goto mem_error; } /* * split the element name into prefix:localname , the string found * are within the DTD and then not associated to namespace names. */ name = xmlSplitQName3(fullname, &len); if (name == NULL) { name = xmlDictLookup(ctxt->dict, fullname, -1); prefix = NULL; } else { name = xmlDictLookup(ctxt->dict, name, -1); prefix = xmlDictLookup(ctxt->dict, fullname, len); } /* * make sure there is some storage */ defaults = xmlHashLookup2(ctxt->attsDefault, name, prefix); if (defaults == NULL) { defaults = (xmlDefAttrsPtr) xmlMalloc(sizeof(xmlDefAttrs) + (4 * 5) * sizeof(const xmlChar *)); if (defaults == NULL) goto mem_error; defaults->nbAttrs = 0; defaults->maxAttrs = 4; if (xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, defaults, NULL) < 0) { xmlFree(defaults); goto mem_error; } } else if (defaults->nbAttrs >= defaults->maxAttrs) { xmlDefAttrsPtr temp; temp = (xmlDefAttrsPtr) xmlRealloc(defaults, sizeof(xmlDefAttrs) + (2 * defaults->maxAttrs * 5) * sizeof(const xmlChar *)); if (temp == NULL) goto mem_error; defaults = temp; defaults->maxAttrs *= 2; if (xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, defaults, NULL) < 0) { xmlFree(defaults); goto mem_error; } } /* * Split the element name into prefix:localname , the string found * are within the DTD and hen not associated to namespace names. */ name = xmlSplitQName3(fullattr, &len); if (name == NULL) { name = xmlDictLookup(ctxt->dict, fullattr, -1); prefix = NULL; } else { name = xmlDictLookup(ctxt->dict, name, -1); prefix = xmlDictLookup(ctxt->dict, fullattr, len); } defaults->values[5 * defaults->nbAttrs] = name; defaults->values[5 * defaults->nbAttrs + 1] = prefix; /* intern the string and precompute the end */ len = xmlStrlen(value); value = xmlDictLookup(ctxt->dict, value, len); defaults->values[5 * defaults->nbAttrs + 2] = value; defaults->values[5 * defaults->nbAttrs + 3] = value + len; if (ctxt->external) defaults->values[5 * defaults->nbAttrs + 4] = BAD_CAST "external"; else defaults->values[5 * defaults->nbAttrs + 4] = NULL; defaults->nbAttrs++; return; mem_error: xmlErrMemory(ctxt, NULL); return; } /** * xmlAddSpecialAttr: * @ctxt: an XML parser context * @fullname: the element fullname * @fullattr: the attribute fullname * @type: the attribute type * * Register this attribute type */ static void xmlAddSpecialAttr(xmlParserCtxtPtr ctxt, const xmlChar *fullname, const xmlChar *fullattr, int type) { if (ctxt->attsSpecial == NULL) { ctxt->attsSpecial = xmlHashCreateDict(10, ctxt->dict); if (ctxt->attsSpecial == NULL) goto mem_error; } if (xmlHashLookup2(ctxt->attsSpecial, fullname, fullattr) != NULL) return; xmlHashAddEntry2(ctxt->attsSpecial, fullname, fullattr, (void *) (long) type); return; mem_error: xmlErrMemory(ctxt, NULL); return; } /** * xmlCleanSpecialAttrCallback: * * Removes CDATA attributes from the special attribute table */ static void xmlCleanSpecialAttrCallback(void *payload, void *data, const xmlChar *fullname, const xmlChar *fullattr, const xmlChar *unused ATTRIBUTE_UNUSED) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) data; if (((long) payload) == XML_ATTRIBUTE_CDATA) { xmlHashRemoveEntry2(ctxt->attsSpecial, fullname, fullattr, NULL); } } /** * xmlCleanSpecialAttr: * @ctxt: an XML parser context * * Trim the list of attributes defined to remove all those of type * CDATA as they are not special. This call should be done when finishing * to parse the DTD and before starting to parse the document root. */ static void xmlCleanSpecialAttr(xmlParserCtxtPtr ctxt) { if (ctxt->attsSpecial == NULL) return; xmlHashScanFull(ctxt->attsSpecial, xmlCleanSpecialAttrCallback, ctxt); if (xmlHashSize(ctxt->attsSpecial) == 0) { xmlHashFree(ctxt->attsSpecial, NULL); ctxt->attsSpecial = NULL; } return; } /** * xmlCheckLanguageID: * @lang: pointer to the string value * * Checks that the value conforms to the LanguageID production: * * NOTE: this is somewhat deprecated, those productions were removed from * the XML Second edition. * * [33] LanguageID ::= Langcode ('-' Subcode)* * [34] Langcode ::= ISO639Code | IanaCode | UserCode * [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) * [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ * [38] Subcode ::= ([a-z] | [A-Z])+ * * The current REC reference the sucessors of RFC 1766, currently 5646 * * http://www.rfc-editor.org/rfc/rfc5646.txt * langtag = language * ["-" script] * ["-" region] * *("-" variant) * *("-" extension) * ["-" privateuse] * language = 2*3ALPHA ; shortest ISO 639 code * ["-" extlang] ; sometimes followed by * ; extended language subtags * / 4ALPHA ; or reserved for future use * / 5*8ALPHA ; or registered language subtag * * extlang = 3ALPHA ; selected ISO 639 codes * *2("-" 3ALPHA) ; permanently reserved * * script = 4ALPHA ; ISO 15924 code * * region = 2ALPHA ; ISO 3166-1 code * / 3DIGIT ; UN M.49 code * * variant = 5*8alphanum ; registered variants * / (DIGIT 3alphanum) * * extension = singleton 1*("-" (2*8alphanum)) * * ; Single alphanumerics * ; "x" reserved for private use * singleton = DIGIT ; 0 - 9 * / %x41-57 ; A - W * / %x59-5A ; Y - Z * / %x61-77 ; a - w * / %x79-7A ; y - z * * it sounds right to still allow Irregular i-xxx IANA and user codes too * The parser below doesn't try to cope with extension or privateuse * that could be added but that's not interoperable anyway * * Returns 1 if correct 0 otherwise **/ int xmlCheckLanguageID(const xmlChar * lang) { const xmlChar *cur = lang, *nxt; if (cur == NULL) return (0); if (((cur[0] == 'i') && (cur[1] == '-')) || ((cur[0] == 'I') && (cur[1] == '-')) || ((cur[0] == 'x') && (cur[1] == '-')) || ((cur[0] == 'X') && (cur[1] == '-'))) { /* * Still allow IANA code and user code which were coming * from the previous version of the XML-1.0 specification * it's deprecated but we should not fail */ cur += 2; while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || ((cur[0] >= 'a') && (cur[0] <= 'z'))) cur++; return(cur[0] == 0); } nxt = cur; while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) nxt++; if (nxt - cur >= 4) { /* * Reserved */ if ((nxt - cur > 8) || (nxt[0] != 0)) return(0); return(1); } if (nxt - cur < 2) return(0); /* we got an ISO 639 code */ if (nxt[0] == 0) return(1); if (nxt[0] != '-') return(0); nxt++; cur = nxt; /* now we can have extlang or script or region or variant */ if ((nxt[0] >= '0') && (nxt[0] <= '9')) goto region_m49; while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) nxt++; if (nxt - cur == 4) goto script; if (nxt - cur == 2) goto region; if ((nxt - cur >= 5) && (nxt - cur <= 8)) goto variant; if (nxt - cur != 3) return(0); /* we parsed an extlang */ if (nxt[0] == 0) return(1); if (nxt[0] != '-') return(0); nxt++; cur = nxt; /* now we can have script or region or variant */ if ((nxt[0] >= '0') && (nxt[0] <= '9')) goto region_m49; while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) nxt++; if (nxt - cur == 2) goto region; if ((nxt - cur >= 5) && (nxt - cur <= 8)) goto variant; if (nxt - cur != 4) return(0); /* we parsed a script */ script: if (nxt[0] == 0) return(1); if (nxt[0] != '-') return(0); nxt++; cur = nxt; /* now we can have region or variant */ if ((nxt[0] >= '0') && (nxt[0] <= '9')) goto region_m49; while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) nxt++; if ((nxt - cur >= 5) && (nxt - cur <= 8)) goto variant; if (nxt - cur != 2) return(0); /* we parsed a region */ region: if (nxt[0] == 0) return(1); if (nxt[0] != '-') return(0); nxt++; cur = nxt; /* now we can just have a variant */ while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) nxt++; if ((nxt - cur < 5) || (nxt - cur > 8)) return(0); /* we parsed a variant */ variant: if (nxt[0] == 0) return(1); if (nxt[0] != '-') return(0); /* extensions and private use subtags not checked */ return (1); region_m49: if (((nxt[1] >= '0') && (nxt[1] <= '9')) && ((nxt[2] >= '0') && (nxt[2] <= '9'))) { nxt += 3; goto region; } return(0); } /************************************************************************ * * * Parser stacks related functions and macros * * * ************************************************************************/ static xmlEntityPtr xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, const xmlChar ** str); #ifdef SAX2 /** * nsPush: * @ctxt: an XML parser context * @prefix: the namespace prefix or NULL * @URL: the namespace name * * Pushes a new parser namespace on top of the ns stack * * Returns -1 in case of error, -2 if the namespace should be discarded * and the index in the stack otherwise. */ static int nsPush(xmlParserCtxtPtr ctxt, const xmlChar *prefix, const xmlChar *URL) { if (ctxt->options & XML_PARSE_NSCLEAN) { int i; for (i = ctxt->nsNr - 2;i >= 0;i -= 2) { if (ctxt->nsTab[i] == prefix) { /* in scope */ if (ctxt->nsTab[i + 1] == URL) return(-2); /* out of scope keep it */ break; } } } if ((ctxt->nsMax == 0) || (ctxt->nsTab == NULL)) { ctxt->nsMax = 10; ctxt->nsNr = 0; ctxt->nsTab = (const xmlChar **) xmlMalloc(ctxt->nsMax * sizeof(xmlChar *)); if (ctxt->nsTab == NULL) { xmlErrMemory(ctxt, NULL); ctxt->nsMax = 0; return (-1); } } else if (ctxt->nsNr >= ctxt->nsMax) { const xmlChar ** tmp; ctxt->nsMax *= 2; tmp = (const xmlChar **) xmlRealloc((char *) ctxt->nsTab, ctxt->nsMax * sizeof(ctxt->nsTab[0])); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); ctxt->nsMax /= 2; return (-1); } ctxt->nsTab = tmp; } ctxt->nsTab[ctxt->nsNr++] = prefix; ctxt->nsTab[ctxt->nsNr++] = URL; return (ctxt->nsNr); } /** * nsPop: * @ctxt: an XML parser context * @nr: the number to pop * * Pops the top @nr parser prefix/namespace from the ns stack * * Returns the number of namespaces removed */ static int nsPop(xmlParserCtxtPtr ctxt, int nr) { int i; if (ctxt->nsTab == NULL) return(0); if (ctxt->nsNr < nr) { xmlGenericError(xmlGenericErrorContext, "Pbm popping %d NS\n", nr); nr = ctxt->nsNr; } if (ctxt->nsNr <= 0) return (0); for (i = 0;i < nr;i++) { ctxt->nsNr--; ctxt->nsTab[ctxt->nsNr] = NULL; } return(nr); } #endif static int xmlCtxtGrowAttrs(xmlParserCtxtPtr ctxt, int nr) { const xmlChar **atts; int *attallocs; int maxatts; if (ctxt->atts == NULL) { maxatts = 55; /* allow for 10 attrs by default */ atts = (const xmlChar **) xmlMalloc(maxatts * sizeof(xmlChar *)); if (atts == NULL) goto mem_error; ctxt->atts = atts; attallocs = (int *) xmlMalloc((maxatts / 5) * sizeof(int)); if (attallocs == NULL) goto mem_error; ctxt->attallocs = attallocs; ctxt->maxatts = maxatts; } else if (nr + 5 > ctxt->maxatts) { maxatts = (nr + 5) * 2; atts = (const xmlChar **) xmlRealloc((void *) ctxt->atts, maxatts * sizeof(const xmlChar *)); if (atts == NULL) goto mem_error; ctxt->atts = atts; attallocs = (int *) xmlRealloc((void *) ctxt->attallocs, (maxatts / 5) * sizeof(int)); if (attallocs == NULL) goto mem_error; ctxt->attallocs = attallocs; ctxt->maxatts = maxatts; } return(ctxt->maxatts); mem_error: xmlErrMemory(ctxt, NULL); return(-1); } /** * inputPush: * @ctxt: an XML parser context * @value: the parser input * * Pushes a new parser input on top of the input stack * * Returns -1 in case of error, the index in the stack otherwise */ int inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value) { if ((ctxt == NULL) || (value == NULL)) return(-1); if (ctxt->inputNr >= ctxt->inputMax) { ctxt->inputMax *= 2; ctxt->inputTab = (xmlParserInputPtr *) xmlRealloc(ctxt->inputTab, ctxt->inputMax * sizeof(ctxt->inputTab[0])); if (ctxt->inputTab == NULL) { xmlErrMemory(ctxt, NULL); xmlFreeInputStream(value); ctxt->inputMax /= 2; value = NULL; return (-1); } } ctxt->inputTab[ctxt->inputNr] = value; ctxt->input = value; return (ctxt->inputNr++); } /** * inputPop: * @ctxt: an XML parser context * * Pops the top parser input from the input stack * * Returns the input just removed */ xmlParserInputPtr inputPop(xmlParserCtxtPtr ctxt) { xmlParserInputPtr ret; if (ctxt == NULL) return(NULL); if (ctxt->inputNr <= 0) return (NULL); ctxt->inputNr--; if (ctxt->inputNr > 0) ctxt->input = ctxt->inputTab[ctxt->inputNr - 1]; else ctxt->input = NULL; ret = ctxt->inputTab[ctxt->inputNr]; ctxt->inputTab[ctxt->inputNr] = NULL; return (ret); } /** * nodePush: * @ctxt: an XML parser context * @value: the element node * * Pushes a new element node on top of the node stack * * Returns -1 in case of error, the index in the stack otherwise */ int nodePush(xmlParserCtxtPtr ctxt, xmlNodePtr value) { if (ctxt == NULL) return(0); if (ctxt->nodeNr >= ctxt->nodeMax) { xmlNodePtr *tmp; tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab, ctxt->nodeMax * 2 * sizeof(ctxt->nodeTab[0])); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); return (-1); } ctxt->nodeTab = tmp; ctxt->nodeMax *= 2; } if ((((unsigned int) ctxt->nodeNr) > xmlParserMaxDepth) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, "Excessive depth in document: %d use XML_PARSE_HUGE option\n", xmlParserMaxDepth); ctxt->instate = XML_PARSER_EOF; return(-1); } ctxt->nodeTab[ctxt->nodeNr] = value; ctxt->node = value; return (ctxt->nodeNr++); } /** * nodePop: * @ctxt: an XML parser context * * Pops the top element node from the node stack * * Returns the node just removed */ xmlNodePtr nodePop(xmlParserCtxtPtr ctxt) { xmlNodePtr ret; if (ctxt == NULL) return(NULL); if (ctxt->nodeNr <= 0) return (NULL); ctxt->nodeNr--; if (ctxt->nodeNr > 0) ctxt->node = ctxt->nodeTab[ctxt->nodeNr - 1]; else ctxt->node = NULL; ret = ctxt->nodeTab[ctxt->nodeNr]; ctxt->nodeTab[ctxt->nodeNr] = NULL; return (ret); } #ifdef LIBXML_PUSH_ENABLED /** * nameNsPush: * @ctxt: an XML parser context * @value: the element name * @prefix: the element prefix * @URI: the element namespace name * * Pushes a new element name/prefix/URL on top of the name stack * * Returns -1 in case of error, the index in the stack otherwise */ static int nameNsPush(xmlParserCtxtPtr ctxt, const xmlChar * value, const xmlChar *prefix, const xmlChar *URI, int nsNr) { if (ctxt->nameNr >= ctxt->nameMax) { const xmlChar * *tmp; void **tmp2; ctxt->nameMax *= 2; tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, ctxt->nameMax * sizeof(ctxt->nameTab[0])); if (tmp == NULL) { ctxt->nameMax /= 2; goto mem_error; } ctxt->nameTab = tmp; tmp2 = (void **) xmlRealloc((void * *)ctxt->pushTab, ctxt->nameMax * 3 * sizeof(ctxt->pushTab[0])); if (tmp2 == NULL) { ctxt->nameMax /= 2; goto mem_error; } ctxt->pushTab = tmp2; } ctxt->nameTab[ctxt->nameNr] = value; ctxt->name = value; ctxt->pushTab[ctxt->nameNr * 3] = (void *) prefix; ctxt->pushTab[ctxt->nameNr * 3 + 1] = (void *) URI; ctxt->pushTab[ctxt->nameNr * 3 + 2] = (void *) (long) nsNr; return (ctxt->nameNr++); mem_error: xmlErrMemory(ctxt, NULL); return (-1); } /** * nameNsPop: * @ctxt: an XML parser context * * Pops the top element/prefix/URI name from the name stack * * Returns the name just removed */ static const xmlChar * nameNsPop(xmlParserCtxtPtr ctxt) { const xmlChar *ret; if (ctxt->nameNr <= 0) return (NULL); ctxt->nameNr--; if (ctxt->nameNr > 0) ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; else ctxt->name = NULL; ret = ctxt->nameTab[ctxt->nameNr]; ctxt->nameTab[ctxt->nameNr] = NULL; return (ret); } #endif /* LIBXML_PUSH_ENABLED */ /** * namePush: * @ctxt: an XML parser context * @value: the element name * * Pushes a new element name on top of the name stack * * Returns -1 in case of error, the index in the stack otherwise */ int namePush(xmlParserCtxtPtr ctxt, const xmlChar * value) { if (ctxt == NULL) return (-1); if (ctxt->nameNr >= ctxt->nameMax) { const xmlChar * *tmp; tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, ctxt->nameMax * 2 * sizeof(ctxt->nameTab[0])); if (tmp == NULL) { goto mem_error; } ctxt->nameTab = tmp; ctxt->nameMax *= 2; } ctxt->nameTab[ctxt->nameNr] = value; ctxt->name = value; return (ctxt->nameNr++); mem_error: xmlErrMemory(ctxt, NULL); return (-1); } /** * namePop: * @ctxt: an XML parser context * * Pops the top element name from the name stack * * Returns the name just removed */ const xmlChar * namePop(xmlParserCtxtPtr ctxt) { const xmlChar *ret; if ((ctxt == NULL) || (ctxt->nameNr <= 0)) return (NULL); ctxt->nameNr--; if (ctxt->nameNr > 0) ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; else ctxt->name = NULL; ret = ctxt->nameTab[ctxt->nameNr]; ctxt->nameTab[ctxt->nameNr] = NULL; return (ret); } static int spacePush(xmlParserCtxtPtr ctxt, int val) { if (ctxt->spaceNr >= ctxt->spaceMax) { int *tmp; ctxt->spaceMax *= 2; tmp = (int *) xmlRealloc(ctxt->spaceTab, ctxt->spaceMax * sizeof(ctxt->spaceTab[0])); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); ctxt->spaceMax /=2; return(-1); } ctxt->spaceTab = tmp; } ctxt->spaceTab[ctxt->spaceNr] = val; ctxt->space = &ctxt->spaceTab[ctxt->spaceNr]; return(ctxt->spaceNr++); } static int spacePop(xmlParserCtxtPtr ctxt) { int ret; if (ctxt->spaceNr <= 0) return(0); ctxt->spaceNr--; if (ctxt->spaceNr > 0) ctxt->space = &ctxt->spaceTab[ctxt->spaceNr - 1]; else ctxt->space = &ctxt->spaceTab[0]; ret = ctxt->spaceTab[ctxt->spaceNr]; ctxt->spaceTab[ctxt->spaceNr] = -1; return(ret); } /* * Macros for accessing the content. Those should be used only by the parser, * and not exported. * * Dirty macros, i.e. one often need to make assumption on the context to * use them * * CUR_PTR return the current pointer to the xmlChar to be parsed. * To be used with extreme caution since operations consuming * characters may move the input buffer to a different location ! * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled * This should be used internally by the parser * only to compare to ASCII values otherwise it would break when * running with UTF-8 encoding. * RAW same as CUR but in the input buffer, bypass any token * extraction that may have been done * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only * to compare on ASCII based substring. * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined * strings without newlines within the parser. * NEXT1(l) Skip 1 xmlChar, and must also be used only to skip 1 non-newline ASCII * defined char within the parser. * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding * * NEXT Skip to the next character, this does the proper decoding * in UTF-8 mode. It also pop-up unfinished entities on the fly. * NEXTL(l) Skip the current unicode character of l xmlChars long. * CUR_CHAR(l) returns the current unicode character (int), set l * to the number of xmlChars used for the encoding [0-5]. * CUR_SCHAR same but operate on a string instead of the context * COPY_BUF copy the current unicode char to the target buffer, increment * the index * GROW, SHRINK handling of input buffers */ #define RAW (*ctxt->input->cur) #define CUR (*ctxt->input->cur) #define NXT(val) ctxt->input->cur[(val)] #define CUR_PTR ctxt->input->cur #define CMP4( s, c1, c2, c3, c4 ) \ ( ((unsigned char *) s)[ 0 ] == c1 && ((unsigned char *) s)[ 1 ] == c2 && \ ((unsigned char *) s)[ 2 ] == c3 && ((unsigned char *) s)[ 3 ] == c4 ) #define CMP5( s, c1, c2, c3, c4, c5 ) \ ( CMP4( s, c1, c2, c3, c4 ) && ((unsigned char *) s)[ 4 ] == c5 ) #define CMP6( s, c1, c2, c3, c4, c5, c6 ) \ ( CMP5( s, c1, c2, c3, c4, c5 ) && ((unsigned char *) s)[ 5 ] == c6 ) #define CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) \ ( CMP6( s, c1, c2, c3, c4, c5, c6 ) && ((unsigned char *) s)[ 6 ] == c7 ) #define CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) \ ( CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) && ((unsigned char *) s)[ 7 ] == c8 ) #define CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) \ ( CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) && \ ((unsigned char *) s)[ 8 ] == c9 ) #define CMP10( s, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 ) \ ( CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) && \ ((unsigned char *) s)[ 9 ] == c10 ) #define SKIP(val) do { \ ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val); \ if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ if ((*ctxt->input->cur == 0) && \ (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ xmlPopInput(ctxt); \ } while (0) #define SKIPL(val) do { \ int skipl; \ for(skipl=0; skiplinput->cur) == '\n') { \ ctxt->input->line++; ctxt->input->col = 1; \ } else ctxt->input->col++; \ ctxt->nbChars++; \ ctxt->input->cur++; \ } \ if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ if ((*ctxt->input->cur == 0) && \ (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ xmlPopInput(ctxt); \ } while (0) #define SHRINK if ((ctxt->progressive == 0) && \ (ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ xmlSHRINK (ctxt); static void xmlSHRINK (xmlParserCtxtPtr ctxt) { xmlParserInputShrink(ctxt->input); if ((*ctxt->input->cur == 0) && (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) xmlPopInput(ctxt); } #define GROW if ((ctxt->progressive == 0) && \ (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ xmlGROW (ctxt); static void xmlGROW (xmlParserCtxtPtr ctxt) { if ((((ctxt->input->end - ctxt->input->cur) > XML_MAX_LOOKUP_LIMIT) || ((ctxt->input->cur - ctxt->input->base) > XML_MAX_LOOKUP_LIMIT)) && ((ctxt->input->buf) && (ctxt->input->buf->readcallback != (xmlInputReadCallback) xmlNop)) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); ctxt->instate = XML_PARSER_EOF; } xmlParserInputGrow(ctxt->input, INPUT_CHUNK); if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) && (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) xmlPopInput(ctxt); } #define SKIP_BLANKS xmlSkipBlankChars(ctxt) #define NEXT xmlNextChar(ctxt) #define NEXT1 { \ ctxt->input->col++; \ ctxt->input->cur++; \ ctxt->nbChars++; \ if (*ctxt->input->cur == 0) \ xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \ } #define NEXTL(l) do { \ if (*(ctxt->input->cur) == '\n') { \ ctxt->input->line++; ctxt->input->col = 1; \ } else ctxt->input->col++; \ ctxt->input->cur += l; \ if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ } while (0) #define CUR_CHAR(l) xmlCurrentChar(ctxt, &l) #define CUR_SCHAR(s, l) xmlStringCurrentChar(ctxt, s, &l) #define COPY_BUF(l,b,i,v) \ if (l == 1) b[i++] = (xmlChar) v; \ else i += xmlCopyCharMultiByte(&b[i],v) /** * xmlSkipBlankChars: * @ctxt: the XML parser context * * skip all blanks character found at that point in the input streams. * It pops up finished entities in the process if allowable at that point. * * Returns the number of space chars skipped */ int xmlSkipBlankChars(xmlParserCtxtPtr ctxt) { int res = 0; /* * It's Okay to use CUR/NEXT here since all the blanks are on * the ASCII range. */ if ((ctxt->inputNr == 1) && (ctxt->instate != XML_PARSER_DTD)) { const xmlChar *cur; /* * if we are in the document content, go really fast */ cur = ctxt->input->cur; while (IS_BLANK_CH(*cur)) { if (*cur == '\n') { ctxt->input->line++; ctxt->input->col = 1; } cur++; res++; if (*cur == 0) { ctxt->input->cur = cur; xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } } ctxt->input->cur = cur; } else { int cur; do { cur = CUR; while (IS_BLANK_CH(cur)) { /* CHECKED tstblanks.xml */ NEXT; cur = CUR; res++; } while ((cur == 0) && (ctxt->inputNr > 1) && (ctxt->instate != XML_PARSER_COMMENT)) { xmlPopInput(ctxt); cur = CUR; } /* * Need to handle support of entities branching here */ if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); } while (IS_BLANK(cur)); /* CHECKED tstblanks.xml */ } return(res); } /************************************************************************ * * * Commodity functions to handle entities * * * ************************************************************************/ /** * xmlPopInput: * @ctxt: an XML parser context * * xmlPopInput: the current input pointed by ctxt->input came to an end * pop it and return the next char. * * Returns the current xmlChar in the parser context */ xmlChar xmlPopInput(xmlParserCtxtPtr ctxt) { if ((ctxt == NULL) || (ctxt->inputNr <= 1)) return(0); if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "Popping input %d\n", ctxt->inputNr); xmlFreeInputStream(inputPop(ctxt)); if ((*ctxt->input->cur == 0) && (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) return(xmlPopInput(ctxt)); return(CUR); } /** * xmlPushInput: * @ctxt: an XML parser context * @input: an XML parser input fragment (entity, XML fragment ...). * * xmlPushInput: switch to a new input stream which is stacked on top * of the previous one(s). * Returns -1 in case of error or the index in the input stack */ int xmlPushInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr input) { int ret; if (input == NULL) return(-1); if (xmlParserDebugEntities) { if ((ctxt->input != NULL) && (ctxt->input->filename)) xmlGenericError(xmlGenericErrorContext, "%s(%d): ", ctxt->input->filename, ctxt->input->line); xmlGenericError(xmlGenericErrorContext, "Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur); } ret = inputPush(ctxt, input); if (ctxt->instate == XML_PARSER_EOF) return(-1); GROW; return(ret); } /** * xmlParseCharRef: * @ctxt: an XML parser context * * parse Reference declarations * * [66] CharRef ::= '&#' [0-9]+ ';' | * '&#x' [0-9a-fA-F]+ ';' * * [ WFC: Legal Character ] * Characters referred to using character references must match the * production for Char. * * Returns the value parsed (as an int), 0 in case of error */ int xmlParseCharRef(xmlParserCtxtPtr ctxt) { unsigned int val = 0; int count = 0; unsigned int outofrange = 0; /* * Using RAW/CUR/NEXT is okay since we are working on ASCII range here */ if ((RAW == '&') && (NXT(1) == '#') && (NXT(2) == 'x')) { SKIP(3); GROW; while (RAW != ';') { /* loop blocked by count */ if (count++ > 20) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(0); } if ((RAW >= '0') && (RAW <= '9')) val = val * 16 + (CUR - '0'); else if ((RAW >= 'a') && (RAW <= 'f') && (count < 20)) val = val * 16 + (CUR - 'a') + 10; else if ((RAW >= 'A') && (RAW <= 'F') && (count < 20)) val = val * 16 + (CUR - 'A') + 10; else { xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); val = 0; break; } if (val > 0x10FFFF) outofrange = val; NEXT; count++; } if (RAW == ';') { /* on purpose to avoid reentrancy problems with NEXT and SKIP */ ctxt->input->col++; ctxt->nbChars ++; ctxt->input->cur++; } } else if ((RAW == '&') && (NXT(1) == '#')) { SKIP(2); GROW; while (RAW != ';') { /* loop blocked by count */ if (count++ > 20) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(0); } if ((RAW >= '0') && (RAW <= '9')) val = val * 10 + (CUR - '0'); else { xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); val = 0; break; } if (val > 0x10FFFF) outofrange = val; NEXT; count++; } if (RAW == ';') { /* on purpose to avoid reentrancy problems with NEXT and SKIP */ ctxt->input->col++; ctxt->nbChars ++; ctxt->input->cur++; } } else { xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); } /* * [ WFC: Legal Character ] * Characters referred to using character references must match the * production for Char. */ if ((IS_CHAR(val) && (outofrange == 0))) { return(val); } else { xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, "xmlParseCharRef: invalid xmlChar value %d\n", val); } return(0); } /** * xmlParseStringCharRef: * @ctxt: an XML parser context * @str: a pointer to an index in the string * * parse Reference declarations, variant parsing from a string rather * than an an input flow. * * [66] CharRef ::= '&#' [0-9]+ ';' | * '&#x' [0-9a-fA-F]+ ';' * * [ WFC: Legal Character ] * Characters referred to using character references must match the * production for Char. * * Returns the value parsed (as an int), 0 in case of error, str will be * updated to the current value of the index */ static int xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) { const xmlChar *ptr; xmlChar cur; unsigned int val = 0; unsigned int outofrange = 0; if ((str == NULL) || (*str == NULL)) return(0); ptr = *str; cur = *ptr; if ((cur == '&') && (ptr[1] == '#') && (ptr[2] == 'x')) { ptr += 3; cur = *ptr; while (cur != ';') { /* Non input consuming loop */ if ((cur >= '0') && (cur <= '9')) val = val * 16 + (cur - '0'); else if ((cur >= 'a') && (cur <= 'f')) val = val * 16 + (cur - 'a') + 10; else if ((cur >= 'A') && (cur <= 'F')) val = val * 16 + (cur - 'A') + 10; else { xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); val = 0; break; } if (val > 0x10FFFF) outofrange = val; ptr++; cur = *ptr; } if (cur == ';') ptr++; } else if ((cur == '&') && (ptr[1] == '#')){ ptr += 2; cur = *ptr; while (cur != ';') { /* Non input consuming loops */ if ((cur >= '0') && (cur <= '9')) val = val * 10 + (cur - '0'); else { xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); val = 0; break; } if (val > 0x10FFFF) outofrange = val; ptr++; cur = *ptr; } if (cur == ';') ptr++; } else { xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); return(0); } *str = ptr; /* * [ WFC: Legal Character ] * Characters referred to using character references must match the * production for Char. */ if ((IS_CHAR(val) && (outofrange == 0))) { return(val); } else { xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, "xmlParseStringCharRef: invalid xmlChar value %d\n", val); } return(0); } /** * xmlNewBlanksWrapperInputStream: * @ctxt: an XML parser context * @entity: an Entity pointer * * Create a new input stream for wrapping * blanks around a PEReference * * Returns the new input stream or NULL */ static void deallocblankswrapper (xmlChar *str) {xmlFree(str);} static xmlParserInputPtr xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { xmlParserInputPtr input; xmlChar *buffer; size_t length; if (entity == NULL) { xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "xmlNewBlanksWrapperInputStream entity\n"); return(NULL); } if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "new blanks wrapper for entity: %s\n", entity->name); input = xmlNewInputStream(ctxt); if (input == NULL) { return(NULL); } length = xmlStrlen(entity->name) + 5; buffer = xmlMallocAtomic(length); if (buffer == NULL) { xmlErrMemory(ctxt, NULL); xmlFree(input); return(NULL); } buffer [0] = ' '; buffer [1] = '%'; buffer [length-3] = ';'; buffer [length-2] = ' '; buffer [length-1] = 0; memcpy(buffer + 2, entity->name, length - 5); input->free = deallocblankswrapper; input->base = buffer; input->cur = buffer; input->length = length; input->end = &buffer[length]; return(input); } /** * xmlParserHandlePEReference: * @ctxt: the parser context * * [69] PEReference ::= '%' Name ';' * * [ WFC: No Recursion ] * A parsed entity must not contain a recursive * reference to itself, either directly or indirectly. * * [ WFC: Entity Declared ] * In a document without any DTD, a document with only an internal DTD * subset which contains no parameter entity references, or a document * with "standalone='yes'", ... ... The declaration of a parameter * entity must precede any reference to it... * * [ VC: Entity Declared ] * In a document with an external subset or external parameter entities * with "standalone='no'", ... ... The declaration of a parameter entity * must precede any reference to it... * * [ WFC: In DTD ] * Parameter-entity references may only appear in the DTD. * NOTE: misleading but this is handled. * * A PEReference may have been detected in the current input stream * the handling is done accordingly to * http://www.w3.org/TR/REC-xml#entproc * i.e. * - Included in literal in entity values * - Included as Parameter Entity reference within DTDs */ void xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { const xmlChar *name; xmlEntityPtr entity = NULL; xmlParserInputPtr input; if (RAW != '%') return; switch(ctxt->instate) { case XML_PARSER_CDATA_SECTION: return; case XML_PARSER_COMMENT: return; case XML_PARSER_START_TAG: return; case XML_PARSER_END_TAG: return; case XML_PARSER_EOF: xmlFatalErr(ctxt, XML_ERR_PEREF_AT_EOF, NULL); return; case XML_PARSER_PROLOG: case XML_PARSER_START: case XML_PARSER_MISC: xmlFatalErr(ctxt, XML_ERR_PEREF_IN_PROLOG, NULL); return; case XML_PARSER_ENTITY_DECL: case XML_PARSER_CONTENT: case XML_PARSER_ATTRIBUTE_VALUE: case XML_PARSER_PI: case XML_PARSER_SYSTEM_LITERAL: case XML_PARSER_PUBLIC_LITERAL: /* we just ignore it there */ return; case XML_PARSER_EPILOG: xmlFatalErr(ctxt, XML_ERR_PEREF_IN_EPILOG, NULL); return; case XML_PARSER_ENTITY_VALUE: /* * NOTE: in the case of entity values, we don't do the * substitution here since we need the literal * entity value to be able to save the internal * subset of the document. * This will be handled by xmlStringDecodeEntities */ return; case XML_PARSER_DTD: /* * [WFC: Well-Formedness Constraint: PEs in Internal Subset] * In the internal DTD subset, parameter-entity references * can occur only where markup declarations can occur, not * within markup declarations. * In that case this is handled in xmlParseMarkupDecl */ if ((ctxt->external == 0) && (ctxt->inputNr == 1)) return; if (IS_BLANK_CH(NXT(1)) || NXT(1) == 0) return; break; case XML_PARSER_IGNORE: return; } NEXT; name = xmlParseName(ctxt); if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "PEReference: %s\n", name); if (name == NULL) { xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL); } else { if (RAW == ';') { NEXT; if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL)) entity = ctxt->sax->getParameterEntity(ctxt->userData, name); if (ctxt->instate == XML_PARSER_EOF) return; if (entity == NULL) { /* * [ WFC: Entity Declared ] * In a document without any DTD, a document with only an * internal DTD subset which contains no parameter entity * references, or a document with "standalone='yes'", ... * ... The declaration of a parameter entity must precede * any reference to it... */ if ((ctxt->standalone == 1) || ((ctxt->hasExternalSubset == 0) && (ctxt->hasPErefs == 0))) { xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, "PEReference: %%%s; not found\n", name); } else { /* * [ VC: Entity Declared ] * In a document with an external subset or external * parameter entities with "standalone='no'", ... * ... The declaration of a parameter entity must precede * any reference to it... */ if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) { xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY, "PEReference: %%%s; not found\n", name, NULL); } else xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, "PEReference: %%%s; not found\n", name, NULL); ctxt->valid = 0; } } else if (ctxt->input->free != deallocblankswrapper) { input = xmlNewBlanksWrapperInputStream(ctxt, entity); if (xmlPushInput(ctxt, input) < 0) return; } else { if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) || (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) { xmlChar start[4]; xmlCharEncoding enc; /* * handle the extra spaces added before and after * c.f. http://www.w3.org/TR/REC-xml#as-PE * this is done independently. */ input = xmlNewEntityInputStream(ctxt, entity); if (xmlPushInput(ctxt, input) < 0) return; /* * Get the 4 first bytes and decode the charset * if enc != XML_CHAR_ENCODING_NONE * plug some encoding conversion routines. * Note that, since we may have some non-UTF8 * encoding (like UTF16, bug 135229), the 'length' * is not known, but we can calculate based upon * the amount of data in the buffer. */ GROW if (ctxt->instate == XML_PARSER_EOF) return; if ((ctxt->input->end - ctxt->input->cur)>=4) { start[0] = RAW; start[1] = NXT(1); start[2] = NXT(2); start[3] = NXT(3); enc = xmlDetectCharEncoding(start, 4); if (enc != XML_CHAR_ENCODING_NONE) { xmlSwitchEncoding(ctxt, enc); } } if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l' )) && (IS_BLANK_CH(NXT(5)))) { xmlParseTextDecl(ctxt); } } else { xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, "PEReference: %s is not a parameter entity\n", name); } } } else { xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); } } } /* * Macro used to grow the current buffer. * buffer##_size is expected to be a size_t * mem_error: is expected to handle memory allocation failures */ #define growBuffer(buffer, n) { \ xmlChar *tmp; \ size_t new_size = buffer##_size * 2 + n; \ if (new_size < buffer##_size) goto mem_error; \ tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ if (tmp == NULL) goto mem_error; \ buffer = tmp; \ buffer##_size = new_size; \ } /** * xmlStringLenDecodeEntities: * @ctxt: the parser context * @str: the input string * @len: the string length * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF * @end: an end marker xmlChar, 0 if none * @end2: an end marker xmlChar, 0 if none * @end3: an end marker xmlChar, 0 if none * * Takes a entity string content and process to do the adequate substitutions. * * [67] Reference ::= EntityRef | CharRef * * [69] PEReference ::= '%' Name ';' * * Returns A newly allocated string with the substitution done. The caller * must deallocate it ! */ xmlChar * xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, int what, xmlChar end, xmlChar end2, xmlChar end3) { xmlChar *buffer = NULL; size_t buffer_size = 0; size_t nbchars = 0; xmlChar *current = NULL; xmlChar *rep = NULL; const xmlChar *last; xmlEntityPtr ent; int c,l; if ((ctxt == NULL) || (str == NULL) || (len < 0)) return(NULL); last = str + len; if (((ctxt->depth > 40) && ((ctxt->options & XML_PARSE_HUGE) == 0)) || (ctxt->depth > 1024)) { xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); return(NULL); } /* * allocate a translation buffer. */ buffer_size = XML_PARSER_BIG_BUFFER_SIZE; buffer = (xmlChar *) xmlMallocAtomic(buffer_size); if (buffer == NULL) goto mem_error; /* * OK loop until we reach one of the ending char or a size limit. * we are operating on already parsed values. */ if (str < last) c = CUR_SCHAR(str, l); else c = 0; while ((c != 0) && (c != end) && /* non input consuming loop */ (c != end2) && (c != end3)) { if (c == 0) break; if ((c == '&') && (str[1] == '#')) { int val = xmlParseStringCharRef(ctxt, &str); if (val != 0) { COPY_BUF(0,buffer,nbchars,val); } if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { growBuffer(buffer, XML_PARSER_BUFFER_SIZE); } } else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) { if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "String decoding Entity Reference: %.30s\n", str); ent = xmlParseStringEntityRef(ctxt, &str); if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) || (ctxt->lastError.code == XML_ERR_INTERNAL_ERROR)) goto int_error; if (ent != NULL) ctxt->nbentities += ent->checked / 2; if ((ent != NULL) && (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { if (ent->content != NULL) { COPY_BUF(0,buffer,nbchars,ent->content[0]); if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { growBuffer(buffer, XML_PARSER_BUFFER_SIZE); } } else { xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, "predefined entity has no content\n"); } } else if ((ent != NULL) && (ent->content != NULL)) { ctxt->depth++; rep = xmlStringDecodeEntities(ctxt, ent->content, what, 0, 0, 0); ctxt->depth--; if (rep != NULL) { current = rep; while (*current != 0) { /* non input consuming loop */ buffer[nbchars++] = *current++; if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) goto int_error; growBuffer(buffer, XML_PARSER_BUFFER_SIZE); } } xmlFree(rep); rep = NULL; } } else if (ent != NULL) { int i = xmlStrlen(ent->name); const xmlChar *cur = ent->name; buffer[nbchars++] = '&'; if (nbchars + i + XML_PARSER_BUFFER_SIZE > buffer_size) { growBuffer(buffer, i + XML_PARSER_BUFFER_SIZE); } for (;i > 0;i--) buffer[nbchars++] = *cur++; buffer[nbchars++] = ';'; } } else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) { if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "String decoding PE Reference: %.30s\n", str); ent = xmlParseStringPEReference(ctxt, &str); if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) goto int_error; if (ent != NULL) ctxt->nbentities += ent->checked / 2; if (ent != NULL) { if (ent->content == NULL) { xmlLoadEntityContent(ctxt, ent); } ctxt->depth++; rep = xmlStringDecodeEntities(ctxt, ent->content, what, 0, 0, 0); ctxt->depth--; if (rep != NULL) { current = rep; while (*current != 0) { /* non input consuming loop */ buffer[nbchars++] = *current++; if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) goto int_error; growBuffer(buffer, XML_PARSER_BUFFER_SIZE); } } xmlFree(rep); rep = NULL; } } } else { COPY_BUF(l,buffer,nbchars,c); str += l; if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { growBuffer(buffer, XML_PARSER_BUFFER_SIZE); } } if (str < last) c = CUR_SCHAR(str, l); else c = 0; } buffer[nbchars] = 0; return(buffer); mem_error: xmlErrMemory(ctxt, NULL); int_error: if (rep != NULL) xmlFree(rep); if (buffer != NULL) xmlFree(buffer); return(NULL); } /** * xmlStringDecodeEntities: * @ctxt: the parser context * @str: the input string * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF * @end: an end marker xmlChar, 0 if none * @end2: an end marker xmlChar, 0 if none * @end3: an end marker xmlChar, 0 if none * * Takes a entity string content and process to do the adequate substitutions. * * [67] Reference ::= EntityRef | CharRef * * [69] PEReference ::= '%' Name ';' * * Returns A newly allocated string with the substitution done. The caller * must deallocate it ! */ xmlChar * xmlStringDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int what, xmlChar end, xmlChar end2, xmlChar end3) { if ((ctxt == NULL) || (str == NULL)) return(NULL); return(xmlStringLenDecodeEntities(ctxt, str, xmlStrlen(str), what, end, end2, end3)); } /************************************************************************ * * * Commodity functions, cleanup needed ? * * * ************************************************************************/ /** * areBlanks: * @ctxt: an XML parser context * @str: a xmlChar * * @len: the size of @str * @blank_chars: we know the chars are blanks * * Is this a sequence of blank chars that one can ignore ? * * Returns 1 if ignorable 0 otherwise. */ static int areBlanks(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, int blank_chars) { int i, ret; xmlNodePtr lastChild; /* * Don't spend time trying to differentiate them, the same callback is * used ! */ if (ctxt->sax->ignorableWhitespace == ctxt->sax->characters) return(0); /* * Check for xml:space value. */ if ((ctxt->space == NULL) || (*(ctxt->space) == 1) || (*(ctxt->space) == -2)) return(0); /* * Check that the string is made of blanks */ if (blank_chars == 0) { for (i = 0;i < len;i++) if (!(IS_BLANK_CH(str[i]))) return(0); } /* * Look if the element is mixed content in the DTD if available */ if (ctxt->node == NULL) return(0); if (ctxt->myDoc != NULL) { ret = xmlIsMixedElement(ctxt->myDoc, ctxt->node->name); if (ret == 0) return(1); if (ret == 1) return(0); } /* * Otherwise, heuristic :-\ */ if ((RAW != '<') && (RAW != 0xD)) return(0); if ((ctxt->node->children == NULL) && (RAW == '<') && (NXT(1) == '/')) return(0); lastChild = xmlGetLastChild(ctxt->node); if (lastChild == NULL) { if ((ctxt->node->type != XML_ELEMENT_NODE) && (ctxt->node->content != NULL)) return(0); } else if (xmlNodeIsText(lastChild)) return(0); else if ((ctxt->node->children != NULL) && (xmlNodeIsText(ctxt->node->children))) return(0); return(1); } /************************************************************************ * * * Extra stuff for namespace support * * Relates to http://www.w3.org/TR/WD-xml-names * * * ************************************************************************/ /** * xmlSplitQName: * @ctxt: an XML parser context * @name: an XML parser context * @prefix: a xmlChar ** * * parse an UTF8 encoded XML qualified name string * * [NS 5] QName ::= (Prefix ':')? LocalPart * * [NS 6] Prefix ::= NCName * * [NS 7] LocalPart ::= NCName * * Returns the local part, and prefix is updated * to get the Prefix if any. */ xmlChar * xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix) { xmlChar buf[XML_MAX_NAMELEN + 5]; xmlChar *buffer = NULL; int len = 0; int max = XML_MAX_NAMELEN; xmlChar *ret = NULL; const xmlChar *cur = name; int c; if (prefix == NULL) return(NULL); *prefix = NULL; if (cur == NULL) return(NULL); #ifndef XML_XML_NAMESPACE /* xml: prefix is not really a namespace */ if ((cur[0] == 'x') && (cur[1] == 'm') && (cur[2] == 'l') && (cur[3] == ':')) return(xmlStrdup(name)); #endif /* nasty but well=formed */ if (cur[0] == ':') return(xmlStrdup(name)); c = *cur++; while ((c != 0) && (c != ':') && (len < max)) { /* tested bigname.xml */ buf[len++] = c; c = *cur++; } if (len >= max) { /* * Okay someone managed to make a huge name, so he's ready to pay * for the processing speed. */ max = len * 2; buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); if (buffer == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } memcpy(buffer, buf, len); while ((c != 0) && (c != ':')) { /* tested bigname.xml */ if (len + 10 > max) { xmlChar *tmp; max *= 2; tmp = (xmlChar *) xmlRealloc(buffer, max * sizeof(xmlChar)); if (tmp == NULL) { xmlFree(buffer); xmlErrMemory(ctxt, NULL); return(NULL); } buffer = tmp; } buffer[len++] = c; c = *cur++; } buffer[len] = 0; } if ((c == ':') && (*cur == 0)) { if (buffer != NULL) xmlFree(buffer); *prefix = NULL; return(xmlStrdup(name)); } if (buffer == NULL) ret = xmlStrndup(buf, len); else { ret = buffer; buffer = NULL; max = XML_MAX_NAMELEN; } if (c == ':') { c = *cur; *prefix = ret; if (c == 0) { return(xmlStrndup(BAD_CAST "", 0)); } len = 0; /* * Check that the first character is proper to start * a new name */ if (!(((c >= 0x61) && (c <= 0x7A)) || ((c >= 0x41) && (c <= 0x5A)) || (c == '_') || (c == ':'))) { int l; int first = CUR_SCHAR(cur, l); if (!IS_LETTER(first) && (first != '_')) { xmlFatalErrMsgStr(ctxt, XML_NS_ERR_QNAME, "Name %s is not XML Namespace compliant\n", name); } } cur++; while ((c != 0) && (len < max)) { /* tested bigname2.xml */ buf[len++] = c; c = *cur++; } if (len >= max) { /* * Okay someone managed to make a huge name, so he's ready to pay * for the processing speed. */ max = len * 2; buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); if (buffer == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } memcpy(buffer, buf, len); while (c != 0) { /* tested bigname2.xml */ if (len + 10 > max) { xmlChar *tmp; max *= 2; tmp = (xmlChar *) xmlRealloc(buffer, max * sizeof(xmlChar)); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); xmlFree(buffer); return(NULL); } buffer = tmp; } buffer[len++] = c; c = *cur++; } buffer[len] = 0; } if (buffer == NULL) ret = xmlStrndup(buf, len); else { ret = buffer; } } return(ret); } /************************************************************************ * * * The parser itself * * Relates to http://www.w3.org/TR/REC-xml * * * ************************************************************************/ /************************************************************************ * * * Routines to parse Name, NCName and NmToken * * * ************************************************************************/ #ifdef DEBUG static unsigned long nbParseName = 0; static unsigned long nbParseNmToken = 0; static unsigned long nbParseNCName = 0; static unsigned long nbParseNCNameComplex = 0; static unsigned long nbParseNameComplex = 0; static unsigned long nbParseStringName = 0; #endif /* * The two following functions are related to the change of accepted * characters for Name and NmToken in the Revision 5 of XML-1.0 * They correspond to the modified production [4] and the new production [4a] * changes in that revision. Also note that the macros used for the * productions Letter, Digit, CombiningChar and Extender are not needed * anymore. * We still keep compatibility to pre-revision5 parsing semantic if the * new XML_PARSE_OLD10 option is given to the parser. */ static int xmlIsNameStartChar(xmlParserCtxtPtr ctxt, int c) { if ((ctxt->options & XML_PARSE_OLD10) == 0) { /* * Use the new checks of production [4] [4a] amd [5] of the * Update 5 of XML-1.0 */ if ((c != ' ') && (c != '>') && (c != '/') && /* accelerators */ (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || (c == '_') || (c == ':') || ((c >= 0xC0) && (c <= 0xD6)) || ((c >= 0xD8) && (c <= 0xF6)) || ((c >= 0xF8) && (c <= 0x2FF)) || ((c >= 0x370) && (c <= 0x37D)) || ((c >= 0x37F) && (c <= 0x1FFF)) || ((c >= 0x200C) && (c <= 0x200D)) || ((c >= 0x2070) && (c <= 0x218F)) || ((c >= 0x2C00) && (c <= 0x2FEF)) || ((c >= 0x3001) && (c <= 0xD7FF)) || ((c >= 0xF900) && (c <= 0xFDCF)) || ((c >= 0xFDF0) && (c <= 0xFFFD)) || ((c >= 0x10000) && (c <= 0xEFFFF)))) return(1); } else { if (IS_LETTER(c) || (c == '_') || (c == ':')) return(1); } return(0); } static int xmlIsNameChar(xmlParserCtxtPtr ctxt, int c) { if ((ctxt->options & XML_PARSE_OLD10) == 0) { /* * Use the new checks of production [4] [4a] amd [5] of the * Update 5 of XML-1.0 */ if ((c != ' ') && (c != '>') && (c != '/') && /* accelerators */ (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')) || /* !start */ (c == '_') || (c == ':') || (c == '-') || (c == '.') || (c == 0xB7) || /* !start */ ((c >= 0xC0) && (c <= 0xD6)) || ((c >= 0xD8) && (c <= 0xF6)) || ((c >= 0xF8) && (c <= 0x2FF)) || ((c >= 0x300) && (c <= 0x36F)) || /* !start */ ((c >= 0x370) && (c <= 0x37D)) || ((c >= 0x37F) && (c <= 0x1FFF)) || ((c >= 0x200C) && (c <= 0x200D)) || ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ ((c >= 0x2070) && (c <= 0x218F)) || ((c >= 0x2C00) && (c <= 0x2FEF)) || ((c >= 0x3001) && (c <= 0xD7FF)) || ((c >= 0xF900) && (c <= 0xFDCF)) || ((c >= 0xFDF0) && (c <= 0xFFFD)) || ((c >= 0x10000) && (c <= 0xEFFFF)))) return(1); } else { if ((IS_LETTER(c)) || (IS_DIGIT(c)) || (c == '.') || (c == '-') || (c == '_') || (c == ':') || (IS_COMBINING(c)) || (IS_EXTENDER(c))) return(1); } return(0); } static xmlChar * xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc, int normalize); static const xmlChar * xmlParseNameComplex(xmlParserCtxtPtr ctxt) { int len = 0, l; int c; int count = 0; #ifdef DEBUG nbParseNameComplex++; #endif /* * Handler for more complex cases */ GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); c = CUR_CHAR(l); if ((ctxt->options & XML_PARSE_OLD10) == 0) { /* * Use the new checks of production [4] [4a] amd [5] of the * Update 5 of XML-1.0 */ if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || (c == '_') || (c == ':') || ((c >= 0xC0) && (c <= 0xD6)) || ((c >= 0xD8) && (c <= 0xF6)) || ((c >= 0xF8) && (c <= 0x2FF)) || ((c >= 0x370) && (c <= 0x37D)) || ((c >= 0x37F) && (c <= 0x1FFF)) || ((c >= 0x200C) && (c <= 0x200D)) || ((c >= 0x2070) && (c <= 0x218F)) || ((c >= 0x2C00) && (c <= 0x2FEF)) || ((c >= 0x3001) && (c <= 0xD7FF)) || ((c >= 0xF900) && (c <= 0xFDCF)) || ((c >= 0xFDF0) && (c <= 0xFFFD)) || ((c >= 0x10000) && (c <= 0xEFFFF))))) { return(NULL); } len += l; NEXTL(l); c = CUR_CHAR(l); while ((c != ' ') && (c != '>') && (c != '/') && /* accelerators */ (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')) || /* !start */ (c == '_') || (c == ':') || (c == '-') || (c == '.') || (c == 0xB7) || /* !start */ ((c >= 0xC0) && (c <= 0xD6)) || ((c >= 0xD8) && (c <= 0xF6)) || ((c >= 0xF8) && (c <= 0x2FF)) || ((c >= 0x300) && (c <= 0x36F)) || /* !start */ ((c >= 0x370) && (c <= 0x37D)) || ((c >= 0x37F) && (c <= 0x1FFF)) || ((c >= 0x200C) && (c <= 0x200D)) || ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ ((c >= 0x2070) && (c <= 0x218F)) || ((c >= 0x2C00) && (c <= 0x2FEF)) || ((c >= 0x3001) && (c <= 0xD7FF)) || ((c >= 0xF900) && (c <= 0xFDCF)) || ((c >= 0xFDF0) && (c <= 0xFFFD)) || ((c >= 0x10000) && (c <= 0xEFFFF)) )) { if (count++ > XML_PARSER_CHUNK_SIZE) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); } len += l; NEXTL(l); c = CUR_CHAR(l); } } else { if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ (!IS_LETTER(c) && (c != '_') && (c != ':'))) { return(NULL); } len += l; NEXTL(l); c = CUR_CHAR(l); while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ ((IS_LETTER(c)) || (IS_DIGIT(c)) || (c == '.') || (c == '-') || (c == '_') || (c == ':') || (IS_COMBINING(c)) || (IS_EXTENDER(c)))) { if (count++ > XML_PARSER_CHUNK_SIZE) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); } len += l; NEXTL(l); c = CUR_CHAR(l); if (c == 0) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); c = CUR_CHAR(l); } } } if ((len > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); return(NULL); } if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); } /** * xmlParseName: * @ctxt: an XML parser context * * parse an XML name. * * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | * CombiningChar | Extender * * [5] Name ::= (Letter | '_' | ':') (NameChar)* * * [6] Names ::= Name (#x20 Name)* * * Returns the Name parsed or NULL */ const xmlChar * xmlParseName(xmlParserCtxtPtr ctxt) { const xmlChar *in; const xmlChar *ret; int count = 0; GROW; #ifdef DEBUG nbParseName++; #endif /* * Accelerator for simple ASCII names */ in = ctxt->input->cur; if (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || (*in == '_') || (*in == ':')) { in++; while (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || ((*in >= 0x30) && (*in <= 0x39)) || (*in == '_') || (*in == '-') || (*in == ':') || (*in == '.')) in++; if ((*in > 0) && (*in < 0x80)) { count = in - ctxt->input->cur; if ((count > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); return(NULL); } ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); ctxt->input->cur = in; ctxt->nbChars += count; ctxt->input->col += count; if (ret == NULL) xmlErrMemory(ctxt, NULL); return(ret); } } /* accelerator for special cases */ return(xmlParseNameComplex(ctxt)); } static const xmlChar * xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { int len = 0, l; int c; int count = 0; #ifdef DEBUG nbParseNCNameComplex++; #endif /* * Handler for more complex cases */ GROW; c = CUR_CHAR(l); if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ (!xmlIsNameStartChar(ctxt, c) || (c == ':'))) { return(NULL); } while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ (xmlIsNameChar(ctxt, c) && (c != ':'))) { if (count++ > XML_PARSER_CHUNK_SIZE) { if ((len > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); return(NULL); } count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); } len += l; NEXTL(l); c = CUR_CHAR(l); if (c == 0) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); c = CUR_CHAR(l); } } if ((len > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); return(NULL); } return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); } /** * xmlParseNCName: * @ctxt: an XML parser context * @len: length of the string parsed * * parse an XML name. * * [4NS] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | * CombiningChar | Extender * * [5NS] NCName ::= (Letter | '_') (NCNameChar)* * * Returns the Name parsed or NULL */ static const xmlChar * xmlParseNCName(xmlParserCtxtPtr ctxt) { const xmlChar *in; const xmlChar *ret; int count = 0; #ifdef DEBUG nbParseNCName++; #endif /* * Accelerator for simple ASCII names */ in = ctxt->input->cur; if (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || (*in == '_')) { in++; while (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || ((*in >= 0x30) && (*in <= 0x39)) || (*in == '_') || (*in == '-') || (*in == '.')) in++; if ((*in > 0) && (*in < 0x80)) { count = in - ctxt->input->cur; if ((count > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); return(NULL); } ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); ctxt->input->cur = in; ctxt->nbChars += count; ctxt->input->col += count; if (ret == NULL) { xmlErrMemory(ctxt, NULL); } return(ret); } } return(xmlParseNCNameComplex(ctxt)); } /** * xmlParseNameAndCompare: * @ctxt: an XML parser context * * parse an XML name and compares for match * (specialized for endtag parsing) * * Returns NULL for an illegal name, (xmlChar*) 1 for success * and the name for mismatch */ static const xmlChar * xmlParseNameAndCompare(xmlParserCtxtPtr ctxt, xmlChar const *other) { register const xmlChar *cmp = other; register const xmlChar *in; const xmlChar *ret; GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); in = ctxt->input->cur; while (*in != 0 && *in == *cmp) { ++in; ++cmp; ctxt->input->col++; } if (*cmp == 0 && (*in == '>' || IS_BLANK_CH (*in))) { /* success */ ctxt->input->cur = in; return (const xmlChar*) 1; } /* failure (or end of input buffer), check with full function */ ret = xmlParseName (ctxt); /* strings coming from the dictionnary direct compare possible */ if (ret == other) { return (const xmlChar*) 1; } return ret; } /** * xmlParseStringName: * @ctxt: an XML parser context * @str: a pointer to the string pointer (IN/OUT) * * parse an XML name. * * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | * CombiningChar | Extender * * [5] Name ::= (Letter | '_' | ':') (NameChar)* * * [6] Names ::= Name (#x20 Name)* * * Returns the Name parsed or NULL. The @str pointer * is updated to the current location in the string. */ static xmlChar * xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) { xmlChar buf[XML_MAX_NAMELEN + 5]; const xmlChar *cur = *str; int len = 0, l; int c; #ifdef DEBUG nbParseStringName++; #endif c = CUR_SCHAR(cur, l); if (!xmlIsNameStartChar(ctxt, c)) { return(NULL); } COPY_BUF(l,buf,len,c); cur += l; c = CUR_SCHAR(cur, l); while (xmlIsNameChar(ctxt, c)) { COPY_BUF(l,buf,len,c); cur += l; c = CUR_SCHAR(cur, l); if (len >= XML_MAX_NAMELEN) { /* test bigentname.xml */ /* * Okay someone managed to make a huge name, so he's ready to pay * for the processing speed. */ xmlChar *buffer; int max = len * 2; buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); if (buffer == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } memcpy(buffer, buf, len); while (xmlIsNameChar(ctxt, c)) { if (len + 10 > max) { xmlChar *tmp; if ((len > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); xmlFree(buffer); return(NULL); } max *= 2; tmp = (xmlChar *) xmlRealloc(buffer, max * sizeof(xmlChar)); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); xmlFree(buffer); return(NULL); } buffer = tmp; } COPY_BUF(l,buffer,len,c); cur += l; c = CUR_SCHAR(cur, l); } buffer[len] = 0; *str = cur; return(buffer); } } if ((len > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); return(NULL); } *str = cur; return(xmlStrndup(buf, len)); } /** * xmlParseNmtoken: * @ctxt: an XML parser context * * parse an XML Nmtoken. * * [7] Nmtoken ::= (NameChar)+ * * [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* * * Returns the Nmtoken parsed or NULL */ xmlChar * xmlParseNmtoken(xmlParserCtxtPtr ctxt) { xmlChar buf[XML_MAX_NAMELEN + 5]; int len = 0, l; int c; int count = 0; #ifdef DEBUG nbParseNmToken++; #endif GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); c = CUR_CHAR(l); while (xmlIsNameChar(ctxt, c)) { if (count++ > XML_PARSER_CHUNK_SIZE) { count = 0; GROW; } COPY_BUF(l,buf,len,c); NEXTL(l); c = CUR_CHAR(l); if (c == 0) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) return(NULL); c = CUR_CHAR(l); } if (len >= XML_MAX_NAMELEN) { /* * Okay someone managed to make a huge token, so he's ready to pay * for the processing speed. */ xmlChar *buffer; int max = len * 2; buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); if (buffer == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } memcpy(buffer, buf, len); while (xmlIsNameChar(ctxt, c)) { if (count++ > XML_PARSER_CHUNK_SIZE) { count = 0; GROW; if (ctxt->instate == XML_PARSER_EOF) { xmlFree(buffer); return(NULL); } } if (len + 10 > max) { xmlChar *tmp; if ((max > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken"); xmlFree(buffer); return(NULL); } max *= 2; tmp = (xmlChar *) xmlRealloc(buffer, max * sizeof(xmlChar)); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); xmlFree(buffer); return(NULL); } buffer = tmp; } COPY_BUF(l,buffer,len,c); NEXTL(l); c = CUR_CHAR(l); } buffer[len] = 0; return(buffer); } } if (len == 0) return(NULL); if ((len > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken"); return(NULL); } return(xmlStrndup(buf, len)); } /** * xmlParseEntityValue: * @ctxt: an XML parser context * @orig: if non-NULL store a copy of the original entity value * * parse a value for ENTITY declarations * * [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | * "'" ([^%&'] | PEReference | Reference)* "'" * * Returns the EntityValue parsed with reference substituted or NULL */ xmlChar * xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) { xmlChar *buf = NULL; int len = 0; int size = XML_PARSER_BUFFER_SIZE; int c, l; xmlChar stop; xmlChar *ret = NULL; const xmlChar *cur = NULL; xmlParserInputPtr input; if (RAW == '"') stop = '"'; else if (RAW == '\'') stop = '\''; else { xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_STARTED, NULL); return(NULL); } buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } /* * The content of the entity definition is copied in a buffer. */ ctxt->instate = XML_PARSER_ENTITY_VALUE; input = ctxt->input; GROW; if (ctxt->instate == XML_PARSER_EOF) { xmlFree(buf); return(NULL); } NEXT; c = CUR_CHAR(l); /* * NOTE: 4.4.5 Included in Literal * When a parameter entity reference appears in a literal entity * value, ... a single or double quote character in the replacement * text is always treated as a normal data character and will not * terminate the literal. * In practice it means we stop the loop only when back at parsing * the initial entity and the quote is found */ while (((IS_CHAR(c)) && ((c != stop) || /* checked */ (ctxt->input != input))) && (ctxt->instate != XML_PARSER_EOF)) { if (len + 5 >= size) { xmlChar *tmp; size *= 2; tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); xmlFree(buf); return(NULL); } buf = tmp; } COPY_BUF(l,buf,len,c); NEXTL(l); /* * Pop-up of finished entities. */ while ((RAW == 0) && (ctxt->inputNr > 1)) /* non input consuming */ xmlPopInput(ctxt); GROW; c = CUR_CHAR(l); if (c == 0) { GROW; c = CUR_CHAR(l); } } buf[len] = 0; if (ctxt->instate == XML_PARSER_EOF) { xmlFree(buf); return(NULL); } /* * Raise problem w.r.t. '&' and '%' being used in non-entities * reference constructs. Note Charref will be handled in * xmlStringDecodeEntities() */ cur = buf; while (*cur != 0) { /* non input consuming */ if ((*cur == '%') || ((*cur == '&') && (cur[1] != '#'))) { xmlChar *name; xmlChar tmp = *cur; cur++; name = xmlParseStringName(ctxt, &cur); if ((name == NULL) || (*cur != ';')) { xmlFatalErrMsgInt(ctxt, XML_ERR_ENTITY_CHAR_ERROR, "EntityValue: '%c' forbidden except for entities references\n", tmp); } if ((tmp == '%') && (ctxt->inSubset == 1) && (ctxt->inputNr == 1)) { xmlFatalErr(ctxt, XML_ERR_ENTITY_PE_INTERNAL, NULL); } if (name != NULL) xmlFree(name); if (*cur == 0) break; } cur++; } /* * Then PEReference entities are substituted. */ if (c != stop) { xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, NULL); xmlFree(buf); } else { NEXT; /* * NOTE: 4.4.7 Bypassed * When a general entity reference appears in the EntityValue in * an entity declaration, it is bypassed and left as is. * so XML_SUBSTITUTE_REF is not set here. */ ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, 0, 0, 0); if (orig != NULL) *orig = buf; else xmlFree(buf); } return(ret); } /** * xmlParseAttValueComplex: * @ctxt: an XML parser context * @len: the resulting attribute len * @normalize: wether to apply the inner normalization * * parse a value for an attribute, this is the fallback function * of xmlParseAttValue() when the attribute parsing requires handling * of non-ASCII characters, or normalization compaction. * * Returns the AttValue parsed or NULL. The value has to be freed by the caller. */ static xmlChar * xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { xmlChar limit = 0; xmlChar *buf = NULL; xmlChar *rep = NULL; size_t len = 0; size_t buf_size = 0; int c, l, in_space = 0; xmlChar *current = NULL; xmlEntityPtr ent; if (NXT(0) == '"') { ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; limit = '"'; NEXT; } else if (NXT(0) == '\'') { limit = '\''; ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; NEXT; } else { xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); return(NULL); } /* * allocate a translation buffer. */ buf_size = XML_PARSER_BUFFER_SIZE; buf = (xmlChar *) xmlMallocAtomic(buf_size); if (buf == NULL) goto mem_error; /* * OK loop until we reach one of the ending char or a size limit. */ c = CUR_CHAR(l); while (((NXT(0) != limit) && /* checked */ (IS_CHAR(c)) && (c != '<')) && (ctxt->instate != XML_PARSER_EOF)) { /* * Impose a reasonable limit on attribute size, unless XML_PARSE_HUGE * special option is given */ if ((len > XML_MAX_TEXT_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, "AttValue length too long\n"); goto mem_error; } if (c == 0) break; if (c == '&') { in_space = 0; if (NXT(1) == '#') { int val = xmlParseCharRef(ctxt); if (val == '&') { if (ctxt->replaceEntities) { if (len + 10 > buf_size) { growBuffer(buf, 10); } buf[len++] = '&'; } else { /* * The reparsing will be done in xmlStringGetNodeList() * called by the attribute() function in SAX.c */ if (len + 10 > buf_size) { growBuffer(buf, 10); } buf[len++] = '&'; buf[len++] = '#'; buf[len++] = '3'; buf[len++] = '8'; buf[len++] = ';'; } } else if (val != 0) { if (len + 10 > buf_size) { growBuffer(buf, 10); } len += xmlCopyChar(0, &buf[len], val); } } else { ent = xmlParseEntityRef(ctxt); ctxt->nbentities++; if (ent != NULL) ctxt->nbentities += ent->owner; if ((ent != NULL) && (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { if (len + 10 > buf_size) { growBuffer(buf, 10); } if ((ctxt->replaceEntities == 0) && (ent->content[0] == '&')) { buf[len++] = '&'; buf[len++] = '#'; buf[len++] = '3'; buf[len++] = '8'; buf[len++] = ';'; } else { buf[len++] = ent->content[0]; } } else if ((ent != NULL) && (ctxt->replaceEntities != 0)) { if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { rep = xmlStringDecodeEntities(ctxt, ent->content, XML_SUBSTITUTE_REF, 0, 0, 0); if (rep != NULL) { current = rep; while (*current != 0) { /* non input consuming */ if ((*current == 0xD) || (*current == 0xA) || (*current == 0x9)) { buf[len++] = 0x20; current++; } else buf[len++] = *current++; if (len + 10 > buf_size) { growBuffer(buf, 10); } } xmlFree(rep); rep = NULL; } } else { if (len + 10 > buf_size) { growBuffer(buf, 10); } if (ent->content != NULL) buf[len++] = ent->content[0]; } } else if (ent != NULL) { int i = xmlStrlen(ent->name); const xmlChar *cur = ent->name; /* * This may look absurd but is needed to detect * entities problems */ if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && (ent->content != NULL) && (ent->checked == 0)) { unsigned long oldnbent = ctxt->nbentities; rep = xmlStringDecodeEntities(ctxt, ent->content, XML_SUBSTITUTE_REF, 0, 0, 0); ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; if (rep != NULL) { if (xmlStrchr(rep, '<')) ent->checked |= 1; xmlFree(rep); rep = NULL; } } /* * Just output the reference */ buf[len++] = '&'; while (len + i + 10 > buf_size) { growBuffer(buf, i + 10); } for (;i > 0;i--) buf[len++] = *cur++; buf[len++] = ';'; } } } else { if ((c == 0x20) || (c == 0xD) || (c == 0xA) || (c == 0x9)) { if ((len != 0) || (!normalize)) { if ((!normalize) || (!in_space)) { COPY_BUF(l,buf,len,0x20); while (len + 10 > buf_size) { growBuffer(buf, 10); } } in_space = 1; } } else { in_space = 0; COPY_BUF(l,buf,len,c); if (len + 10 > buf_size) { growBuffer(buf, 10); } } NEXTL(l); } GROW; c = CUR_CHAR(l); } if (ctxt->instate == XML_PARSER_EOF) goto error; if ((in_space) && (normalize)) { while ((len > 0) && (buf[len - 1] == 0x20)) len--; } buf[len] = 0; if (RAW == '<') { xmlFatalErr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, NULL); } else if (RAW != limit) { if ((c != 0) && (!IS_CHAR(c))) { xmlFatalErrMsg(ctxt, XML_ERR_INVALID_CHAR, "invalid character in attribute value\n"); } else { xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, "AttValue: ' expected\n"); } } else NEXT; /* * There we potentially risk an overflow, don't allow attribute value of * length more than INT_MAX it is a very reasonnable assumption ! */ if (len >= INT_MAX) { xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, "AttValue length too long\n"); goto mem_error; } if (attlen != NULL) *attlen = (int) len; return(buf); mem_error: xmlErrMemory(ctxt, NULL); error: if (buf != NULL) xmlFree(buf); if (rep != NULL) xmlFree(rep); return(NULL); } /** * xmlParseAttValue: * @ctxt: an XML parser context * * parse a value for an attribute * Note: the parser won't do substitution of entities here, this * will be handled later in xmlStringGetNodeList * * [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | * "'" ([^<&'] | Reference)* "'" * * 3.3.3 Attribute-Value Normalization: * Before the value of an attribute is passed to the application or * checked for validity, the XML processor must normalize it as follows: * - a character reference is processed by appending the referenced * character to the attribute value * - an entity reference is processed by recursively processing the * replacement text of the entity * - a whitespace character (#x20, #xD, #xA, #x9) is processed by * appending #x20 to the normalized value, except that only a single * #x20 is appended for a "#xD#xA" sequence that is part of an external * parsed entity or the literal entity value of an internal parsed entity * - other characters are processed by appending them to the normalized value * If the declared value is not CDATA, then the XML processor must further * process the normalized attribute value by discarding any leading and * trailing space (#x20) characters, and by replacing sequences of space * (#x20) characters by a single space (#x20) character. * All attributes for which no declaration has been read should be treated * by a non-validating parser as if declared CDATA. * * Returns the AttValue parsed or NULL. The value has to be freed by the caller. */ xmlChar * xmlParseAttValue(xmlParserCtxtPtr ctxt) { if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); return(xmlParseAttValueInternal(ctxt, NULL, NULL, 0)); } /** * xmlParseSystemLiteral: * @ctxt: an XML parser context * * parse an XML Literal * * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") * * Returns the SystemLiteral parsed or NULL */ xmlChar * xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) { xmlChar *buf = NULL; int len = 0; int size = XML_PARSER_BUFFER_SIZE; int cur, l; xmlChar stop; int state = ctxt->instate; int count = 0; SHRINK; if (RAW == '"') { NEXT; stop = '"'; } else if (RAW == '\'') { NEXT; stop = '\''; } else { xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); return(NULL); } buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } ctxt->instate = XML_PARSER_SYSTEM_LITERAL; cur = CUR_CHAR(l); while ((IS_CHAR(cur)) && (cur != stop)) { /* checked */ if (len + 5 >= size) { xmlChar *tmp; if ((size > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "SystemLiteral"); xmlFree(buf); ctxt->instate = (xmlParserInputState) state; return(NULL); } size *= 2; tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); if (tmp == NULL) { xmlFree(buf); xmlErrMemory(ctxt, NULL); ctxt->instate = (xmlParserInputState) state; return(NULL); } buf = tmp; } count++; if (count > 50) { GROW; count = 0; if (ctxt->instate == XML_PARSER_EOF) { xmlFree(buf); return(NULL); } } COPY_BUF(l,buf,len,cur); NEXTL(l); cur = CUR_CHAR(l); if (cur == 0) { GROW; SHRINK; cur = CUR_CHAR(l); } } buf[len] = 0; ctxt->instate = (xmlParserInputState) state; if (!IS_CHAR(cur)) { xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL); } else { NEXT; } return(buf); } /** * xmlParsePubidLiteral: * @ctxt: an XML parser context * * parse an XML public literal * * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" * * Returns the PubidLiteral parsed or NULL. */ xmlChar * xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) { xmlChar *buf = NULL; int len = 0; int size = XML_PARSER_BUFFER_SIZE; xmlChar cur; xmlChar stop; int count = 0; xmlParserInputState oldstate = ctxt->instate; SHRINK; if (RAW == '"') { NEXT; stop = '"'; } else if (RAW == '\'') { NEXT; stop = '\''; } else { xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); return(NULL); } buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { xmlErrMemory(ctxt, NULL); return(NULL); } ctxt->instate = XML_PARSER_PUBLIC_LITERAL; cur = CUR; while ((IS_PUBIDCHAR_CH(cur)) && (cur != stop)) { /* checked */ if (len + 1 >= size) { xmlChar *tmp; if ((size > XML_MAX_NAME_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Public ID"); xmlFree(buf); return(NULL); } size *= 2; tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); if (tmp == NULL) { xmlErrMemory(ctxt, NULL); xmlFree(buf); return(NULL); } buf = tmp; } buf[len++] = cur; count++; if (count > 50) { GROW; count = 0; if (ctxt->instate == XML_PARSER_EOF) { xmlFree(buf); return(NULL); } } NEXT; cur = CUR; if (cur == 0) { GROW; SHRINK; cur = CUR; } } buf[len] = 0; if (cur != stop) { xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL); } else { NEXT; } ctxt->instate = oldstate; return(buf); } static void xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata); /* * used for the test in the inner loop of the char data testing */ static const unsigned char test_char_data[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x9, CR/LF separated */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x00, 0x27, /* & */ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x00, 0x3D, 0x3E, 0x3F, /* < */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x00, 0x5E, 0x5F, /* ] */ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* non-ascii */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /** * xmlParseCharData: * @ctxt: an XML parser context * @cdata: int indicating whether we are within a CDATA section * * parse a CharData section. * if we are within a CDATA section ']]>' marks an end of section. * * The right angle bracket (>) may be represented using the string ">", * and must, for compatibility, be escaped using ">" or a character * reference when it appears in the string "]]>" in content, when that * string is not marking the end of a CDATA section. * * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) */ void xmlParseCharData(xmlParserCtxtPtr ctxt, int cdata) { const xmlChar *in; int nbchar = 0; int line = ctxt->input->line; int col = ctxt->input->col; int ccol; SHRINK; GROW; /* * Accelerated common case where input don't need to be * modified before passing it to the handler. */ if (!cdata) { in = ctxt->input->cur; do { get_more_space: while (*in == 0x20) { in++; ctxt->input->col++; } if (*in == 0xA) { do { ctxt->input->line++; ctxt->input->col = 1; in++; } while (*in == 0xA); goto get_more_space; } if (*in == '<') { nbchar = in - ctxt->input->cur; if (nbchar > 0) { const xmlChar *tmp = ctxt->input->cur; ctxt->input->cur = in; if ((ctxt->sax != NULL) && (ctxt->sax->ignorableWhitespace != ctxt->sax->characters)) { if (areBlanks(ctxt, tmp, nbchar, 1)) { if (ctxt->sax->ignorableWhitespace != NULL) ctxt->sax->ignorableWhitespace(ctxt->userData, tmp, nbchar); } else { if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, tmp, nbchar); if (*ctxt->space == -1) *ctxt->space = -2; } } else if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) { ctxt->sax->characters(ctxt->userData, tmp, nbchar); } } return; } get_more: ccol = ctxt->input->col; while (test_char_data[*in]) { in++; ccol++; } ctxt->input->col = ccol; if (*in == 0xA) { do { ctxt->input->line++; ctxt->input->col = 1; in++; } while (*in == 0xA); goto get_more; } if (*in == ']') { if ((in[1] == ']') && (in[2] == '>')) { xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); ctxt->input->cur = in; return; } in++; ctxt->input->col++; goto get_more; } nbchar = in - ctxt->input->cur; if (nbchar > 0) { if ((ctxt->sax != NULL) && (ctxt->sax->ignorableWhitespace != ctxt->sax->characters) && (IS_BLANK_CH(*ctxt->input->cur))) { const xmlChar *tmp = ctxt->input->cur; ctxt->input->cur = in; if (areBlanks(ctxt, tmp, nbchar, 0)) { if (ctxt->sax->ignorableWhitespace != NULL) ctxt->sax->ignorableWhitespace(ctxt->userData, tmp, nbchar); } else { if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, tmp, nbchar); if (*ctxt->space == -1) *ctxt->space = -2; } line = ctxt->input->line; col = ctxt->input->col; } else if (ctxt->sax != NULL) { if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, ctxt->input->cur, nbchar); line = ctxt->input->line; col = ctxt->input->col; } /* something really bad happened in the SAX callback */ if (ctxt->instate != XML_PARSER_CONTENT) return; } ctxt->input->cur = in; if (*in == 0xD) { in++; if (*in == 0xA) { ctxt->input->cur = in; in++; ctxt->input->line++; ctxt->input->col = 1; continue; /* while */ } in--; } if (*in == '<') { return; } if (*in == '&') { return; } SHRINK; GROW; if (ctxt->instate == XML_PARSER_EOF) return; in = ctxt->input->cur; } while (((*in >= 0x20) && (*in <= 0x7F)) || (*in == 0x09)); nbchar = 0; } ctxt->input->line = line; ctxt->input->col = col; xmlParseCharDataComplex(ctxt, cdata); } /** * xmlParseCharDataComplex: * @ctxt: an XML parser context * @cdata: int indicating whether we are within a CDATA section * * parse a CharData section.this is the fallback function * of xmlParseCharData() when the parsing requires handling * of non-ASCII characters. */ static void xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata) { xmlChar buf[XML_PARSER_BIG_BUFFER_SIZE + 5]; int nbchar = 0; int cur, l; int count = 0; SHRINK; GROW; cur = CUR_CHAR(l); while ((cur != '<') && /* checked */ (cur != '&') && (IS_CHAR(cur))) /* test also done in xmlCurrentChar() */ { if ((cur == ']') && (NXT(1) == ']') && (NXT(2) == '>')) { if (cdata) break; else { xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); } } COPY_BUF(l,buf,nbchar,cur); if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) { buf[nbchar] = 0; /* * OK the segment is to be consumed as chars. */ if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { if (areBlanks(ctxt, buf, nbchar, 0)) { if (ctxt->sax->ignorableWhitespace != NULL) ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); } else { if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, buf, nbchar); if ((ctxt->sax->characters != ctxt->sax->ignorableWhitespace) && (*ctxt->space == -1)) *ctxt->space = -2; } } nbchar = 0; /* something really bad happened in the SAX callback */ if (ctxt->instate != XML_PARSER_CONTENT) return; } count++; if (count > 50) { GROW; count = 0; if (ctxt->instate == XML_PARSER_EOF) return; } NEXTL(l); cur = CUR_CHAR(l); } if (nbchar != 0) { buf[nbchar] = 0; /* * OK the segment is to be consumed as chars. */ if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { if (areBlanks(ctxt, buf, nbchar, 0)) { if (ctxt->sax->ignorableWhitespace != NULL) ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); } else { if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, buf, nbchar); if ((ctxt->sax->characters != ctxt->sax->ignorableWhitespace) && (*ctxt->space == -1)) *ctxt->space = -2; } } } if ((cur != 0) && (!IS_CHAR(cur))) { /* Generate the error and skip the offending character */ xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, "PCDATA invalid Char value %d\n", cur); NEXTL(l); } } /** * xmlParseExternalID: * @ctxt: an XML parser context * @publicID: a xmlChar** receiving PubidLiteral * @strict: indicate whether we should restrict parsing to only * production [75], see NOTE below * * Parse an External ID or a Public ID * * NOTE: Productions [75] and [83] interact badly since [75] can generate * 'PUBLIC' S PubidLiteral S SystemLiteral * * [75] ExternalID ::= 'SYSTEM' S SystemLiteral * | 'PUBLIC' S PubidLiteral S SystemLiteral * * [83] PublicID ::= 'PUBLIC' S PubidLiteral * * Returns the function returns SystemLiteral and in the second * case publicID receives PubidLiteral, is strict is off * it is possible to return NULL and have publicID set. */ xmlChar * xmlParseExternalID(xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict) { xmlChar *URI = NULL; SHRINK; *publicID = NULL; if (CMP6(CUR_PTR, 'S', 'Y', 'S', 'T', 'E', 'M')) { SKIP(6); if (!IS_BLANK_CH(CUR)) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'SYSTEM'\n"); } SKIP_BLANKS; URI = xmlParseSystemLiteral(ctxt); if (URI == NULL) { xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); } } else if (CMP6(CUR_PTR, 'P', 'U', 'B', 'L', 'I', 'C')) { SKIP(6); if (!IS_BLANK_CH(CUR)) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'PUBLIC'\n"); } SKIP_BLANKS; *publicID = xmlParsePubidLiteral(ctxt); if (*publicID == NULL) { xmlFatalErr(ctxt, XML_ERR_PUBID_REQUIRED, NULL); } if (strict) { /* * We don't handle [83] so "S SystemLiteral" is required. */ if (!IS_BLANK_CH(CUR)) { xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after the Public Identifier\n"); } } else { /* * We handle [83] so we return immediately, if * "S SystemLiteral" is not detected. From a purely parsing * point of view that's a nice mess. */ const xmlChar *ptr; GROW; ptr = CUR_PTR; if (!IS_BLANK_CH(*ptr)) return(NULL); while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */ if ((*ptr != '\'') && (*ptr != '"')) return(NULL); } SKIP_BLANKS; URI = xmlParseSystemLiteral(ctxt); if (URI == NULL) { xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); } } return(URI); } /** * xmlParseCommentComplex: * @ctxt: an XML parser context * @buf: the already parsed part of the buffer * @len: number of bytes filles in the buffer * @size: allocated size of the buffer * * Skip an XML (SGML) comment * The spec says that "For compatibility, the string "--" (double-hyphen) * must not occur within comments. " * This is the slow routine in case the accelerator for ascii didn't work * * [15] Comment ::= '' */ static void xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf, size_t len, size_t size) { int q, ql; int r, rl; int cur, l; size_t count = 0; int inputid; inputid = ctxt->input->id; if (buf == NULL) { len = 0; size = XML_PARSER_BUFFER_SIZE; buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { xmlErrMemory(ctxt, NULL); return; } } GROW; /* Assure there's enough input data */ q = CUR_CHAR(ql); if (q == 0) goto not_terminated; if (!IS_CHAR(q)) { xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, "xmlParseComment: invalid xmlChar value %d\n", q); xmlFree (buf); return; } NEXTL(ql); r = CUR_CHAR(rl); if (r == 0) goto not_terminated; if (!IS_CHAR(r)) { xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, "xmlParseComment: invalid xmlChar value %d\n", q); xmlFree (buf); return; } NEXTL(rl); cur = CUR_CHAR(l); if (cur == 0) goto not_terminated; while (IS_CHAR(cur) && /* checked */ ((cur != '>') || (r != '-') || (q != '-'))) { if ((r == '-') && (q == '-')) { xmlFatalErr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, NULL); } if ((len > XML_MAX_TEXT_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, "Comment too big found", NULL); xmlFree (buf); return; } if (len + 5 >= size) { xmlChar *new_buf; size_t new_size; new_size = size * 2; new_buf = (xmlChar *) xmlRealloc(buf, new_size); if (new_buf == NULL) { xmlFree (buf); xmlErrMemory(ctxt, NULL); return; } buf = new_buf; size = new_size; } COPY_BUF(ql,buf,len,q); q = r; ql = rl; r = cur; rl = l; count++; if (count > 50) { GROW; count = 0; if (ctxt->instate == XML_PARSER_EOF) { xmlFree(buf); return; } } NEXTL(l); cur = CUR_CHAR(l); if (cur == 0) { SHRINK; GROW; cur = CUR_CHAR(l); } } buf[len] = 0; if (cur == 0) { xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, "Comment not terminated \n * The spec says that "For compatibility, the string "--" (double-hyphen) * must not occur within comments. " * * [15] Comment ::= '' */ void xmlParseComment(xmlParserCtxtPtr ctxt) { xmlChar *buf = NULL; size_t size = XML_PARSER_BUFFER_SIZE; size_t len = 0; xmlParserInputState state; const xmlChar *in; size_t nbchar = 0; int ccol; int inputid; /* * Check that there is a comment right here. */ if ((RAW != '<') || (NXT(1) != '!') || (NXT(2) != '-') || (NXT(3) != '-')) return; state = ctxt->instate; ctxt->instate = XML_PARSER_COMMENT; inputid = ctxt->input->id; SKIP(4); SHRINK; GROW; /* * Accelerated common case where input don't need to be * modified before passing it to the handler. */ in = ctxt->input->cur; do { if (*in == 0xA) { do { ctxt->input->line++; ctxt->input->col = 1; in++; } while (*in == 0xA); } get_more: ccol = ctxt->input->col; while (((*in > '-') && (*in <= 0x7F)) || ((*in >= 0x20) && (*in < '-')) || (*in == 0x09)) { in++; ccol++; } ctxt->input->col = ccol; if (*in == 0xA) { do { ctxt->input->line++; ctxt->input->col = 1; in++; } while (*in == 0xA); goto get_more; } nbchar = in - ctxt->input->cur; /* * save current set of data */ if (nbchar > 0) { if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL)) { if (buf == NULL) { if ((*in == '-') && (in[1] == '-')) size = nbchar + 1; else size = XML_PARSER_BUFFER_SIZE + nbchar; buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { xmlErrMemory(ctxt, NULL); ctxt->instate = state; return; } len = 0; } else if (len + nbchar + 1 >= size) { xmlChar *new_buf; size += len + nbchar + XML_PARSER_BUFFER_SIZE; new_buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); if (new_buf == NULL) { xmlFree (buf); xmlErrMemory(ctxt, NULL); ctxt->instate = state; return; } buf = new_buf; } memcpy(&buf[len], ctxt->input->cur, nbchar); len += nbchar; buf[len] = 0; } } if ((len > XML_MAX_TEXT_LENGTH) && ((ctxt->options & XML_PARSE_HUGE) == 0)) { xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, "Comment too big found", NULL); xmlFree (buf); return; } ctxt->input->cur = in; if (*in == 0xA) { in++; ctxt->input->line++; ctxt->input->col = 1; } if (*in == 0xD) { in++; if (*in == 0xA) { ctxt->input->cur = in; in++; ctxt->input->line++; ctxt->input->col = 1; continue; /* while */ } in--; } SHRINK; GROW; if (ctxt->instate == XML_PARSER_EOF) { xmlFree(buf); return; } in = ctxt->input->cur; if (*in == '-') { if (in[1] == '-') { if (in[2] == '>') { if (ctxt->input->id != inputid) { xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, "comment doesn't start and stop in the same entity\n"); } SKIP(3); if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && (!ctxt->disableSAX)) { if (buf != NULL) ctxt->sax->comment(ctxt->userData, buf); else ctxt->sax->comment(ctxt->userData, BAD_CAST ""); } if (buf != NULL) xmlFree(buf); if (ctxt->instate != XML_PARSER_EOF) ctxt->instate = state; return; } if (buf != NULL) { xmlFatalErrMsgStr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, "Double hyphen within comment: " " ]> #define LIBXML2_COMPILING_MSCCDEF&nl; #include "../include/libxml/xmlversion.h"&nl; LIBRARY libxml2&nl; EXPORTS&nl; #ifdef LIBXML_C14N_ENABLED&nl; #ifdef LIBXML_CATALOG_ENABLED&nl; #ifdef LIBXML_DEBUG_ENABLED&nl; #ifdef LIBXML_DOCB_ENABLED&nl; #ifdef LIBXML_HTML_ENABLED&nl; #ifdef LIBXML_HTTP_ENABLED&nl; #ifdef LIBXML_FTP_ENABLED&nl; #ifdef LIBXML_SCHEMAS_ENABLED&nl; #ifdef LIBXML_XINCLUDE_ENABLED&nl; #ifdef LIBXML_XLINK_ENABLED&nl; #ifdef LIBXML_AUTOMATA_ENABLED&nl; #ifdef LIBXML_REGEXP_ENABLED&nl; #ifdef LIBXML_XPATH_ENABLED&nl; #ifdef LIBXML_XPTR_ENABLED&nl; #ifdef LIBXML_HTML_ENABLED&nl; #ifdef LIBXML_DOCB_ENABLED&nl; #ifdef LIBXML_REGEXP_ENABLED&nl; #ifdef LIBXML_FTP_ENABLED&nl; #ifdef LIBXML_SCHEMAS_ENABLED&nl; #ifdef LIBXML_DEBUG_ENABLED&nl; #ifdef DEBUG_MEMORY_LOCATION&nl; #ifdef LIBXML_THREAD_ALLOC_ENABLED&nl; __ &nl; #else&nl; DATA&nl; #endif&nl; #ifdef LIBXML_THREAD_ENABLED&nl; #ifdef LIBXML_DOCB_ENABLED&nl; #ifdef LIBXML_HTML_ENABLED&nl; __ &nl; #endif&nl; #endif&nl; #else&nl; #ifdef LIBXML_DOCB_ENABLED&nl; #ifdef LIBXML_HTML_ENABLED&nl; DATA&nl; #endif&nl; #endif&nl; #endif&nl; DATA &nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; #endif&nl; libxml2-2.9.1+dfsg1/win32/configure.js0000644000175000017500000007414412113312343016040 0ustar aronaron/* Configure script for libxml, specific for Windows with Scripting Host. * * This script will configure the libxml build process and create necessary files. * Run it with an 'help', or an invalid option and it will tell you what options * it accepts. * * March 2002, Igor Zlatkovic */ /* The source directory, relative to the one where this file resides. */ var srcDirXml = ".."; var srcDirUtils = ".."; /* Base name of what we are building. */ var baseName = "libxml2"; /* Configure file which contains the version and the output file where we can store our build configuration. */ var configFile = srcDirXml + "\\configure.in"; var versionFile = ".\\config.msvc"; /* Input and output files regarding the libxml features. */ var optsFileIn = srcDirXml + "\\include\\libxml\\xmlversion.h.in"; var optsFile = srcDirXml + "\\include\\libxml\\xmlversion.h"; /* Version strings for the binary distribution. Will be filled later in the code. */ var verMajor; var verMinor; var verMicro; var verMicroSuffix; var verCvs; var useCvsVer = true; /* Libxml features. */ var withTrio = false; var withThreads = "native"; var withFtp = true; var withHttp = true; var withHtml = true; var withC14n = true; var withCatalog = true; var withDocb = true; var withXpath = true; var withXptr = true; var withXinclude = true; var withIconv = true; var withIcu = false; var withIso8859x = false; var withZlib = false; var withLzma = false; var withDebug = true; var withMemDebug = false; var withRunDebug = false; var withSchemas = true; var withSchematron = true; var withRegExps = true; var withModules = true; var withTree = true; var withReader = true; var withWriter = true; var withWalker = true; var withPattern = true; var withPush = true; var withValid = true; var withSax1 = true; var withLegacy = true; var withOutput = true; var withPython = false; /* Win32 build options. */ var dirSep = "\\"; var compiler = "msvc"; var cruntime = "/MD"; var dynruntime = true; var vcmanifest = false; var buildDebug = 0; var buildStatic = 0; var buildPrefix = "."; var buildBinPrefix = ""; var buildIncPrefix = ""; var buildLibPrefix = ""; var buildSoPrefix = ""; var buildInclude = "."; var buildLib = "."; /* Local stuff */ var error = 0; /* Helper function, transforms the option variable into the 'Enabled' or 'Disabled' string. */ function boolToStr(opt) { if (opt == false) return "no"; else if (opt == true) return "yes"; error = 1; return "*** undefined ***"; } /* Helper function, transforms the argument string into a boolean value. */ function strToBool(opt) { if (opt == 0 || opt == "no") return false; else if (opt == 1 || opt == "yes") return true; error = 1; return false; } /* Displays the details about how to use this script. */ function usage() { var txt; txt = "Usage:\n"; txt += " cscript " + WScript.ScriptName + " \n"; txt += " cscript " + WScript.ScriptName + " help\n\n"; txt += "Options can be specified in the form \n", define->name); } xmlRelaxNGDumpDefines(output, define->attrs); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_LIST: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_ONEORMORE: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_ZEROORMORE: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_CHOICE: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_GROUP: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_INTERLEAVE: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_OPTIONAL: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_ATTRIBUTE: fprintf(output, "\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_DEF: fprintf(output, "name != NULL) fprintf(output, " name=\"%s\"", define->name); fprintf(output, ">\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_REF: fprintf(output, "name != NULL) fprintf(output, " name=\"%s\"", define->name); fprintf(output, ">\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_PARENTREF: fprintf(output, "name != NULL) fprintf(output, " name=\"%s\"", define->name); fprintf(output, ">\n"); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_EXTERNALREF: fprintf(output, ""); xmlRelaxNGDumpDefines(output, define->content); fprintf(output, "\n"); break; case XML_RELAXNG_DATATYPE: case XML_RELAXNG_VALUE: TODO break; case XML_RELAXNG_START: case XML_RELAXNG_EXCEPT: case XML_RELAXNG_PARAM: TODO break; case XML_RELAXNG_NOOP: xmlRelaxNGDumpDefines(output, define->content); break; } } /** * xmlRelaxNGDumpGrammar: * @output: the file output * @grammar: a grammar structure * @top: is this a top grammar * * Dump a RelaxNG structure back */ static void xmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top) { if (grammar == NULL) return; fprintf(output, "combine) { case XML_RELAXNG_COMBINE_UNDEFINED: break; case XML_RELAXNG_COMBINE_CHOICE: fprintf(output, " combine=\"choice\""); break; case XML_RELAXNG_COMBINE_INTERLEAVE: fprintf(output, " combine=\"interleave\""); break; default: fprintf(output, " "); } fprintf(output, ">\n"); if (grammar->start == NULL) { fprintf(output, " "); } else { fprintf(output, "\n"); xmlRelaxNGDumpDefine(output, grammar->start); fprintf(output, "\n"); } /* TODO ? Dump the defines ? */ fprintf(output, "\n"); } /** * xmlRelaxNGDump: * @output: the file output * @schema: a schema structure * * Dump a RelaxNG structure back */ void xmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema) { if (output == NULL) return; if (schema == NULL) { fprintf(output, "RelaxNG empty or failed to compile\n"); return; } fprintf(output, "RelaxNG: "); if (schema->doc == NULL) { fprintf(output, "no document\n"); } else if (schema->doc->URL != NULL) { fprintf(output, "%s\n", schema->doc->URL); } else { fprintf(output, "\n"); } if (schema->topgrammar == NULL) { fprintf(output, "RelaxNG has no top grammar\n"); return; } xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1); } /** * xmlRelaxNGDumpTree: * @output: the file output * @schema: a schema structure * * Dump the transformed RelaxNG tree. */ void xmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema) { if (output == NULL) return; if (schema == NULL) { fprintf(output, "RelaxNG empty or failed to compile\n"); return; } if (schema->doc == NULL) { fprintf(output, "no document\n"); } else { xmlDocDump(output, schema->doc); } } #endif /* LIBXML_OUTPUT_ENABLED */ /************************************************************************ * * * Validation of compiled content * * * ************************************************************************/ static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define); /** * xmlRelaxNGValidateCompiledCallback: * @exec: the regular expression instance * @token: the token which matched * @transdata: callback data, the define for the subelement if available @ @inputdata: callback data, the Relax NG validation context * * Handle the callback and if needed validate the element children. */ static void xmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED, const xmlChar * token, void *transdata, void *inputdata) { xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; int ret; #ifdef DEBUG_COMPILE xmlGenericError(xmlGenericErrorContext, "Compiled callback for: '%s'\n", token); #endif if (ctxt == NULL) { fprintf(stderr, "callback on %s missing context\n", token); return; } if (define == NULL) { if (token[0] == '#') return; fprintf(stderr, "callback on %s missing define\n", token); if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; return; } if ((ctxt == NULL) || (define == NULL)) { fprintf(stderr, "callback on %s missing info\n", token); if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; return; } else if (define->type != XML_RELAXNG_ELEMENT) { fprintf(stderr, "callback on %s define is not element\n", token); if (ctxt->errNo == XML_RELAXNG_OK) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; return; } ret = xmlRelaxNGValidateDefinition(ctxt, define); if (ret != 0) ctxt->perr = ret; } /** * xmlRelaxNGValidateCompiledContent: * @ctxt: the RelaxNG validation context * @regexp: the regular expression as compiled * @content: list of children to test against the regexp * * Validate the content model of an element or start using the regexp * * Returns 0 in case of success, -1 in case of error. */ static int xmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt, xmlRegexpPtr regexp, xmlNodePtr content) { xmlRegExecCtxtPtr exec; xmlNodePtr cur; int ret = 0; int oldperr; if ((ctxt == NULL) || (regexp == NULL)) return (-1); oldperr = ctxt->perr; exec = xmlRegNewExecCtxt(regexp, xmlRelaxNGValidateCompiledCallback, ctxt); ctxt->perr = 0; cur = content; while (cur != NULL) { ctxt->state->seq = cur; switch (cur->type) { case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: if (xmlIsBlankNode(cur)) break; ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt); if (ret < 0) { VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, cur->parent->name); } break; case XML_ELEMENT_NODE: if (cur->ns != NULL) { ret = xmlRegExecPushString2(exec, cur->name, cur->ns->href, ctxt); } else { ret = xmlRegExecPushString(exec, cur->name, ctxt); } if (ret < 0) { VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name); } break; default: break; } if (ret < 0) break; /* * Switch to next element */ cur = cur->next; } ret = xmlRegExecPushString(exec, NULL, NULL); if (ret == 1) { ret = 0; ctxt->state->seq = NULL; } else if (ret == 0) { /* * TODO: get some of the names needed to exit the current state of exec */ VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); ret = -1; if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); } else { ret = -1; } xmlRegFreeExecCtxt(exec); /* * There might be content model errors outside of the pure * regexp validation, e.g. for attribute values. */ if ((ret == 0) && (ctxt->perr != 0)) { ret = ctxt->perr; } ctxt->perr = oldperr; return (ret); } /************************************************************************ * * * Progressive validation of when possible * * * ************************************************************************/ static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr defines); static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog); static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt); /** * xmlRelaxNGElemPush: * @ctxt: the validation context * @exec: the regexp runtime for the new content model * * Push a new regexp for the current node content model on the stack * * Returns 0 in case of success and -1 in case of error. */ static int xmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec) { if (ctxt->elemTab == NULL) { ctxt->elemMax = 10; ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax * sizeof (xmlRegExecCtxtPtr)); if (ctxt->elemTab == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); return (-1); } } if (ctxt->elemNr >= ctxt->elemMax) { ctxt->elemMax *= 2; ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab, ctxt->elemMax * sizeof (xmlRegExecCtxtPtr)); if (ctxt->elemTab == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); return (-1); } } ctxt->elemTab[ctxt->elemNr++] = exec; ctxt->elem = exec; return (0); } /** * xmlRelaxNGElemPop: * @ctxt: the validation context * * Pop the regexp of the current node content model from the stack * * Returns the exec or NULL if empty */ static xmlRegExecCtxtPtr xmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt) { xmlRegExecCtxtPtr ret; if (ctxt->elemNr <= 0) return (NULL); ctxt->elemNr--; ret = ctxt->elemTab[ctxt->elemNr]; ctxt->elemTab[ctxt->elemNr] = NULL; if (ctxt->elemNr > 0) ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1]; else ctxt->elem = NULL; return (ret); } /** * xmlRelaxNGValidateProgressiveCallback: * @exec: the regular expression instance * @token: the token which matched * @transdata: callback data, the define for the subelement if available @ @inputdata: callback data, the Relax NG validation context * * Handle the callback and if needed validate the element children. * some of the in/out informations are passed via the context in @inputdata. */ static void xmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED, const xmlChar * token, void *transdata, void *inputdata) { xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; xmlRelaxNGValidStatePtr state, oldstate; xmlNodePtr node; int ret = 0, oldflags; #ifdef DEBUG_PROGRESSIVE xmlGenericError(xmlGenericErrorContext, "Progressive callback for: '%s'\n", token); #endif if (ctxt == NULL) { fprintf(stderr, "callback on %s missing context\n", token); return; } node = ctxt->pnode; ctxt->pstate = 1; if (define == NULL) { if (token[0] == '#') return; fprintf(stderr, "callback on %s missing define\n", token); if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; ctxt->pstate = -1; return; } if ((ctxt == NULL) || (define == NULL)) { fprintf(stderr, "callback on %s missing info\n", token); if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; ctxt->pstate = -1; return; } else if (define->type != XML_RELAXNG_ELEMENT) { fprintf(stderr, "callback on %s define is not element\n", token); if (ctxt->errNo == XML_RELAXNG_OK) ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; ctxt->pstate = -1; return; } if (node->type != XML_ELEMENT_NODE) { VALID_ERR(XML_RELAXNG_ERR_NOTELEM); if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); ctxt->pstate = -1; return; } if (define->contModel == NULL) { /* * this node cannot be validated in a streamable fashion */ #ifdef DEBUG_PROGRESSIVE xmlGenericError(xmlGenericErrorContext, "Element '%s' validation is not streamable\n", token); #endif ctxt->pstate = 0; ctxt->pdef = define; return; } exec = xmlRegNewExecCtxt(define->contModel, xmlRelaxNGValidateProgressiveCallback, ctxt); if (exec == NULL) { ctxt->pstate = -1; return; } xmlRelaxNGElemPush(ctxt, exec); /* * Validate the attributes part of the content. */ state = xmlRelaxNGNewValidState(ctxt, node); if (state == NULL) { ctxt->pstate = -1; return; } oldstate = ctxt->state; ctxt->state = state; if (define->attrs != NULL) { ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); if (ret != 0) { ctxt->pstate = -1; VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); } } if (ctxt->state != NULL) { ctxt->state->seq = NULL; ret = xmlRelaxNGValidateElementEnd(ctxt, 1); if (ret != 0) { ctxt->pstate = -1; } xmlRelaxNGFreeValidState(ctxt, ctxt->state); } else if (ctxt->states != NULL) { int tmp = -1, i; oldflags = ctxt->flags; for (i = 0; i < ctxt->states->nbState; i++) { state = ctxt->states->tabState[i]; ctxt->state = state; ctxt->state->seq = NULL; if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { tmp = 0; break; } } if (tmp != 0) { /* * validation error, log the message for the "best" one */ ctxt->flags |= FLAGS_IGNORABLE; xmlRelaxNGLogBestError(ctxt); } for (i = 0; i < ctxt->states->nbState; i++) { xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]); } xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; if ((ret == 0) && (tmp == -1)) ctxt->pstate = -1; ctxt->flags = oldflags; } if (ctxt->pstate == -1) { if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { xmlRelaxNGDumpValidError(ctxt); } } ctxt->state = oldstate; } /** * xmlRelaxNGValidatePushElement: * @ctxt: the validation context * @doc: a document instance * @elem: an element instance * * Push a new element start on the RelaxNG validation stack. * * returns 1 if no validation problem was found or 0 if validating the * element requires a full node, and -1 in case of error. */ int xmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr elem) { int ret = 1; if ((ctxt == NULL) || (elem == NULL)) return (-1); #ifdef DEBUG_PROGRESSIVE xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name); #endif if (ctxt->elem == 0) { xmlRelaxNGPtr schema; xmlRelaxNGGrammarPtr grammar; xmlRegExecCtxtPtr exec; xmlRelaxNGDefinePtr define; schema = ctxt->schema; if (schema == NULL) { VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); return (-1); } grammar = schema->topgrammar; if ((grammar == NULL) || (grammar->start == NULL)) { VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); return (-1); } define = grammar->start; if (define->contModel == NULL) { ctxt->pdef = define; return (0); } exec = xmlRegNewExecCtxt(define->contModel, xmlRelaxNGValidateProgressiveCallback, ctxt); if (exec == NULL) { return (-1); } xmlRelaxNGElemPush(ctxt, exec); } ctxt->pnode = elem; ctxt->pstate = 0; if (elem->ns != NULL) { ret = xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href, ctxt); } else { ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt); } if (ret < 0) { VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name); } else { if (ctxt->pstate == 0) ret = 0; else if (ctxt->pstate < 0) ret = -1; else ret = 1; } #ifdef DEBUG_PROGRESSIVE if (ret < 0) xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n", elem->name); #endif return (ret); } /** * xmlRelaxNGValidatePushCData: * @ctxt: the RelaxNG validation context * @data: some character data read * @len: the length of the data * * check the CData parsed for validation in the current stack * * returns 1 if no validation problem was found or -1 otherwise */ int xmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * data, int len ATTRIBUTE_UNUSED) { int ret = 1; if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL)) return (-1); #ifdef DEBUG_PROGRESSIVE xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len); #endif while (*data != 0) { if (!IS_BLANK_CH(*data)) break; data++; } if (*data == 0) return (1); ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt); if (ret < 0) { VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO "); #ifdef DEBUG_PROGRESSIVE xmlGenericError(xmlGenericErrorContext, "CDATA failed\n"); #endif return (-1); } return (1); } /** * xmlRelaxNGValidatePopElement: * @ctxt: the RelaxNG validation context * @doc: a document instance * @elem: an element instance * * Pop the element end from the RelaxNG validation stack. * * returns 1 if no validation problem was found or 0 otherwise */ int xmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr elem) { int ret; xmlRegExecCtxtPtr exec; if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL)) return (-1); #ifdef DEBUG_PROGRESSIVE xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name); #endif /* * verify that we reached a terminal state of the content model. */ exec = xmlRelaxNGElemPop(ctxt); ret = xmlRegExecPushString(exec, NULL, NULL); if (ret == 0) { /* * TODO: get some of the names needed to exit the current state of exec */ VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); ret = -1; } else if (ret < 0) { ret = -1; } else { ret = 1; } xmlRegFreeExecCtxt(exec); #ifdef DEBUG_PROGRESSIVE if (ret < 0) xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n", elem->name); #endif return (ret); } /** * xmlRelaxNGValidateFullElement: * @ctxt: the validation context * @doc: a document instance * @elem: an element instance * * Validate a full subtree when xmlRelaxNGValidatePushElement() returned * 0 and the content of the node has been expanded. * * returns 1 if no validation problem was found or -1 in case of error. */ int xmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr elem) { int ret; xmlRelaxNGValidStatePtr state; if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL)) return (-1); #ifdef DEBUG_PROGRESSIVE xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name); #endif state = xmlRelaxNGNewValidState(ctxt, elem->parent); if (state == NULL) { return (-1); } state->seq = elem; ctxt->state = state; ctxt->errNo = XML_RELAXNG_OK; ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef); if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK)) ret = -1; else ret = 1; xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; #ifdef DEBUG_PROGRESSIVE if (ret < 0) xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n", elem->name); #endif return (ret); } /************************************************************************ * * * Generic interpreted validation implementation * * * ************************************************************************/ static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define); /** * xmlRelaxNGSkipIgnored: * @ctxt: a schema validation context * @node: the top node. * * Skip ignorable nodes in that context * * Returns the new sibling or NULL in case of error. */ static xmlNodePtr xmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlNodePtr node) { /* * TODO complete and handle entities */ while ((node != NULL) && ((node->type == XML_COMMENT_NODE) || (node->type == XML_PI_NODE) || (node->type == XML_XINCLUDE_START) || (node->type == XML_XINCLUDE_END) || (((node->type == XML_TEXT_NODE) || (node->type == XML_CDATA_SECTION_NODE)) && ((ctxt->flags & FLAGS_MIXED_CONTENT) || (IS_BLANK_NODE(node)))))) { node = node->next; } return (node); } /** * xmlRelaxNGNormalize: * @ctxt: a schema validation context * @str: the string to normalize * * Implements the normalizeWhiteSpace( s ) function from * section 6.2.9 of the spec * * Returns the new string or NULL in case of error. */ static xmlChar * xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str) { xmlChar *ret, *p; const xmlChar *tmp; int len; if (str == NULL) return (NULL); tmp = str; while (*tmp != 0) tmp++; len = tmp - str; ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); if (ret == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); return (NULL); } p = ret; while (IS_BLANK_CH(*str)) str++; while (*str != 0) { if (IS_BLANK_CH(*str)) { while (IS_BLANK_CH(*str)) str++; if (*str == 0) break; *p++ = ' '; } else *p++ = *str++; } *p = 0; return (ret); } /** * xmlRelaxNGValidateDatatype: * @ctxt: a Relax-NG validation context * @value: the string value * @type: the datatype definition * @node: the node * * Validate the given value against the dataype * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * value, xmlRelaxNGDefinePtr define, xmlNodePtr node) { int ret, tmp; xmlRelaxNGTypeLibraryPtr lib; void *result = NULL; xmlRelaxNGDefinePtr cur; if ((define == NULL) || (define->data == NULL)) { return (-1); } lib = (xmlRelaxNGTypeLibraryPtr) define->data; if (lib->check != NULL) { if ((define->attrs != NULL) && (define->attrs->type == XML_RELAXNG_PARAM)) { ret = lib->check(lib->data, define->name, value, &result, node); } else { ret = lib->check(lib->data, define->name, value, NULL, node); } } else ret = -1; if (ret < 0) { VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name); if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) lib->freef(lib->data, result); return (-1); } else if (ret == 1) { ret = 0; } else if (ret == 2) { VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value); } else { VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value); ret = -1; } cur = define->attrs; while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) { if (lib->facet != NULL) { tmp = lib->facet(lib->data, define->name, cur->name, cur->value, value, result); if (tmp != 0) ret = -1; } cur = cur->next; } if ((ret == 0) && (define->content != NULL)) { const xmlChar *oldvalue, *oldendvalue; oldvalue = ctxt->state->value; oldendvalue = ctxt->state->endvalue; ctxt->state->value = (xmlChar *) value; ctxt->state->endvalue = NULL; ret = xmlRelaxNGValidateValue(ctxt, define->content); ctxt->state->value = (xmlChar *) oldvalue; ctxt->state->endvalue = (xmlChar *) oldendvalue; } if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) lib->freef(lib->data, result); return (ret); } /** * xmlRelaxNGNextValue: * @ctxt: a Relax-NG validation context * * Skip to the next value when validating within a list * * Returns 0 if the operation succeeded or an error code. */ static int xmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) { xmlChar *cur; cur = ctxt->state->value; if ((cur == NULL) || (ctxt->state->endvalue == NULL)) { ctxt->state->value = NULL; ctxt->state->endvalue = NULL; return (0); } while (*cur != 0) cur++; while ((cur != ctxt->state->endvalue) && (*cur == 0)) cur++; if (cur == ctxt->state->endvalue) ctxt->state->value = NULL; else ctxt->state->value = cur; return (0); } /** * xmlRelaxNGValidateValueList: * @ctxt: a Relax-NG validation context * @defines: the list of definitions to verify * * Validate the given set of definitions for the current value * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr defines) { int ret = 0; while (defines != NULL) { ret = xmlRelaxNGValidateValue(ctxt, defines); if (ret != 0) break; defines = defines->next; } return (ret); } /** * xmlRelaxNGValidateValue: * @ctxt: a Relax-NG validation context * @define: the definition to verify * * Validate the given definition for the current value * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define) { int ret = 0, oldflags; xmlChar *value; value = ctxt->state->value; switch (define->type) { case XML_RELAXNG_EMPTY:{ if ((value != NULL) && (value[0] != 0)) { int idx = 0; while (IS_BLANK_CH(value[idx])) idx++; if (value[idx] != 0) ret = -1; } break; } case XML_RELAXNG_TEXT: break; case XML_RELAXNG_VALUE:{ if (!xmlStrEqual(value, define->value)) { if (define->name != NULL) { xmlRelaxNGTypeLibraryPtr lib; lib = (xmlRelaxNGTypeLibraryPtr) define->data; if ((lib != NULL) && (lib->comp != NULL)) { ret = lib->comp(lib->data, define->name, define->value, define->node, (void *) define->attrs, value, ctxt->state->node); } else ret = -1; if (ret < 0) { VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, define->name); return (-1); } else if (ret == 1) { ret = 0; } else { ret = -1; } } else { xmlChar *nval, *nvalue; /* * TODO: trivial optimizations are possible by * computing at compile-time */ nval = xmlRelaxNGNormalize(ctxt, define->value); nvalue = xmlRelaxNGNormalize(ctxt, value); if ((nval == NULL) || (nvalue == NULL) || (!xmlStrEqual(nval, nvalue))) ret = -1; if (nval != NULL) xmlFree(nval); if (nvalue != NULL) xmlFree(nvalue); } } if (ret == 0) xmlRelaxNGNextValue(ctxt); break; } case XML_RELAXNG_DATATYPE:{ ret = xmlRelaxNGValidateDatatype(ctxt, value, define, ctxt->state->seq); if (ret == 0) xmlRelaxNGNextValue(ctxt); break; } case XML_RELAXNG_CHOICE:{ xmlRelaxNGDefinePtr list = define->content; xmlChar *oldvalue; oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; oldvalue = ctxt->state->value; while (list != NULL) { ret = xmlRelaxNGValidateValue(ctxt, list); if (ret == 0) { break; } ctxt->state->value = oldvalue; list = list->next; } ctxt->flags = oldflags; if (ret != 0) { if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); } else { if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0); } break; } case XML_RELAXNG_LIST:{ xmlRelaxNGDefinePtr list = define->content; xmlChar *oldvalue, *oldend, *val, *cur; #ifdef DEBUG_LIST int nb_values = 0; #endif oldvalue = ctxt->state->value; oldend = ctxt->state->endvalue; val = xmlStrdup(oldvalue); if (val == NULL) { val = xmlStrdup(BAD_CAST ""); } if (val == NULL) { VALID_ERR(XML_RELAXNG_ERR_NOSTATE); return (-1); } cur = val; while (*cur != 0) { if (IS_BLANK_CH(*cur)) { *cur = 0; cur++; #ifdef DEBUG_LIST nb_values++; #endif while (IS_BLANK_CH(*cur)) *cur++ = 0; } else cur++; } #ifdef DEBUG_LIST xmlGenericError(xmlGenericErrorContext, "list value: '%s' found %d items\n", oldvalue, nb_values); nb_values = 0; #endif ctxt->state->endvalue = cur; cur = val; while ((*cur == 0) && (cur != ctxt->state->endvalue)) cur++; ctxt->state->value = cur; while (list != NULL) { if (ctxt->state->value == ctxt->state->endvalue) ctxt->state->value = NULL; ret = xmlRelaxNGValidateValue(ctxt, list); if (ret != 0) { #ifdef DEBUG_LIST xmlGenericError(xmlGenericErrorContext, "Failed to validate value: '%s' with %d rule\n", ctxt->state->value, nb_values); #endif break; } #ifdef DEBUG_LIST nb_values++; #endif list = list->next; } if ((ret == 0) && (ctxt->state->value != NULL) && (ctxt->state->value != ctxt->state->endvalue)) { VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA, ctxt->state->value); ret = -1; } xmlFree(val); ctxt->state->value = oldvalue; ctxt->state->endvalue = oldend; break; } case XML_RELAXNG_ONEORMORE: ret = xmlRelaxNGValidateValueList(ctxt, define->content); if (ret != 0) { break; } /* no break on purpose */ case XML_RELAXNG_ZEROORMORE:{ xmlChar *cur, *temp; if ((ctxt->state->value == NULL) || (*ctxt->state->value == 0)) { ret = 0; break; } oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; cur = ctxt->state->value; temp = NULL; while ((cur != NULL) && (cur != ctxt->state->endvalue) && (temp != cur)) { temp = cur; ret = xmlRelaxNGValidateValueList(ctxt, define->content); if (ret != 0) { ctxt->state->value = temp; ret = 0; break; } cur = ctxt->state->value; } ctxt->flags = oldflags; if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0); break; } case XML_RELAXNG_OPTIONAL:{ xmlChar *temp; if ((ctxt->state->value == NULL) || (*ctxt->state->value == 0)) { ret = 0; break; } oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; temp = ctxt->state->value; ret = xmlRelaxNGValidateValue(ctxt, define->content); ctxt->flags = oldflags; if (ret != 0) { ctxt->state->value = temp; if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0); ret = 0; break; } if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0); break; } case XML_RELAXNG_EXCEPT:{ xmlRelaxNGDefinePtr list; list = define->content; while (list != NULL) { ret = xmlRelaxNGValidateValue(ctxt, list); if (ret == 0) { ret = -1; break; } else ret = 0; list = list->next; } break; } case XML_RELAXNG_DEF: case XML_RELAXNG_GROUP:{ xmlRelaxNGDefinePtr list; list = define->content; while (list != NULL) { ret = xmlRelaxNGValidateValue(ctxt, list); if (ret != 0) { ret = -1; break; } else ret = 0; list = list->next; } break; } case XML_RELAXNG_REF: case XML_RELAXNG_PARENTREF: if (define->content == NULL) { VALID_ERR(XML_RELAXNG_ERR_NODEFINE); ret = -1; } else { ret = xmlRelaxNGValidateValue(ctxt, define->content); } break; default: TODO ret = -1; } return (ret); } /** * xmlRelaxNGValidateValueContent: * @ctxt: a Relax-NG validation context * @defines: the list of definitions to verify * * Validate the given definitions for the current value * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr defines) { int ret = 0; while (defines != NULL) { ret = xmlRelaxNGValidateValue(ctxt, defines); if (ret != 0) break; defines = defines->next; } return (ret); } /** * xmlRelaxNGAttributeMatch: * @ctxt: a Relax-NG validation context * @define: the definition to check * @prop: the attribute * * Check if the attribute matches the definition nameClass * * Returns 1 if the attribute matches, 0 if no, or -1 in case of error */ static int xmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define, xmlAttrPtr prop) { int ret; if (define->name != NULL) { if (!xmlStrEqual(define->name, prop->name)) return (0); } if (define->ns != NULL) { if (define->ns[0] == 0) { if (prop->ns != NULL) return (0); } else { if ((prop->ns == NULL) || (!xmlStrEqual(define->ns, prop->ns->href))) return (0); } } if (define->nameClass == NULL) return (1); define = define->nameClass; if (define->type == XML_RELAXNG_EXCEPT) { xmlRelaxNGDefinePtr list; list = define->content; while (list != NULL) { ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); if (ret == 1) return (0); if (ret < 0) return (ret); list = list->next; } } else { TODO} return (1); } /** * xmlRelaxNGValidateAttribute: * @ctxt: a Relax-NG validation context * @define: the definition to verify * * Validate the given attribute definition for that node * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define) { int ret = 0, i; xmlChar *value, *oldvalue; xmlAttrPtr prop = NULL, tmp; xmlNodePtr oldseq; if (ctxt->state->nbAttrLeft <= 0) return (-1); if (define->name != NULL) { for (i = 0; i < ctxt->state->nbAttrs; i++) { tmp = ctxt->state->attrs[i]; if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) { if ((((define->ns == NULL) || (define->ns[0] == 0)) && (tmp->ns == NULL)) || ((tmp->ns != NULL) && (xmlStrEqual(define->ns, tmp->ns->href)))) { prop = tmp; break; } } } if (prop != NULL) { value = xmlNodeListGetString(prop->doc, prop->children, 1); oldvalue = ctxt->state->value; oldseq = ctxt->state->seq; ctxt->state->seq = (xmlNodePtr) prop; ctxt->state->value = value; ctxt->state->endvalue = NULL; ret = xmlRelaxNGValidateValueContent(ctxt, define->content); if (ctxt->state->value != NULL) value = ctxt->state->value; if (value != NULL) xmlFree(value); ctxt->state->value = oldvalue; ctxt->state->seq = oldseq; if (ret == 0) { /* * flag the attribute as processed */ ctxt->state->attrs[i] = NULL; ctxt->state->nbAttrLeft--; } } else { ret = -1; } #ifdef DEBUG xmlGenericError(xmlGenericErrorContext, "xmlRelaxNGValidateAttribute(%s): %d\n", define->name, ret); #endif } else { for (i = 0; i < ctxt->state->nbAttrs; i++) { tmp = ctxt->state->attrs[i]; if ((tmp != NULL) && (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) { prop = tmp; break; } } if (prop != NULL) { value = xmlNodeListGetString(prop->doc, prop->children, 1); oldvalue = ctxt->state->value; oldseq = ctxt->state->seq; ctxt->state->seq = (xmlNodePtr) prop; ctxt->state->value = value; ret = xmlRelaxNGValidateValueContent(ctxt, define->content); if (ctxt->state->value != NULL) value = ctxt->state->value; if (value != NULL) xmlFree(value); ctxt->state->value = oldvalue; ctxt->state->seq = oldseq; if (ret == 0) { /* * flag the attribute as processed */ ctxt->state->attrs[i] = NULL; ctxt->state->nbAttrLeft--; } } else { ret = -1; } #ifdef DEBUG if (define->ns != NULL) { xmlGenericError(xmlGenericErrorContext, "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n", define->ns, ret); } else { xmlGenericError(xmlGenericErrorContext, "xmlRelaxNGValidateAttribute(anyName): %d\n", ret); } #endif } return (ret); } /** * xmlRelaxNGValidateAttributeList: * @ctxt: a Relax-NG validation context * @define: the list of definition to verify * * Validate the given node against the list of attribute definitions * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr defines) { int ret = 0, res; int needmore = 0; xmlRelaxNGDefinePtr cur; cur = defines; while (cur != NULL) { if (cur->type == XML_RELAXNG_ATTRIBUTE) { if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0) ret = -1; } else needmore = 1; cur = cur->next; } if (!needmore) return (ret); cur = defines; while (cur != NULL) { if (cur->type != XML_RELAXNG_ATTRIBUTE) { if ((ctxt->state != NULL) || (ctxt->states != NULL)) { res = xmlRelaxNGValidateDefinition(ctxt, cur); if (res < 0) ret = -1; } else { VALID_ERR(XML_RELAXNG_ERR_NOSTATE); return (-1); } if (res == -1) /* continues on -2 */ break; } cur = cur->next; } return (ret); } /** * xmlRelaxNGNodeMatchesList: * @node: the node * @list: a NULL terminated array of definitions * * Check if a node can be matched by one of the definitions * * Returns 1 if matches 0 otherwise */ static int xmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list) { xmlRelaxNGDefinePtr cur; int i = 0, tmp; if ((node == NULL) || (list == NULL)) return (0); cur = list[i++]; while (cur != NULL) { if ((node->type == XML_ELEMENT_NODE) && (cur->type == XML_RELAXNG_ELEMENT)) { tmp = xmlRelaxNGElementMatch(NULL, cur, node); if (tmp == 1) return (1); } else if (((node->type == XML_TEXT_NODE) || (node->type == XML_CDATA_SECTION_NODE)) && (cur->type == XML_RELAXNG_TEXT)) { return (1); } cur = list[i++]; } return (0); } /** * xmlRelaxNGValidateInterleave: * @ctxt: a Relax-NG validation context * @define: the definition to verify * * Validate an interleave definition for a node. * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define) { int ret = 0, i, nbgroups; int errNr = ctxt->errNr; int oldflags; xmlRelaxNGValidStatePtr oldstate; xmlRelaxNGPartitionPtr partitions; xmlRelaxNGInterleaveGroupPtr group = NULL; xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem; xmlNodePtr *list = NULL, *lasts = NULL; if (define->data != NULL) { partitions = (xmlRelaxNGPartitionPtr) define->data; nbgroups = partitions->nbgroups; } else { VALID_ERR(XML_RELAXNG_ERR_INTERNODATA); return (-1); } /* * Optimizations for MIXED */ oldflags = ctxt->flags; if (define->dflags & IS_MIXED) { ctxt->flags |= FLAGS_MIXED_CONTENT; if (nbgroups == 2) { /* * this is a pure case */ if (ctxt->state != NULL) ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, ctxt->state->seq); if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT) ret = xmlRelaxNGValidateDefinition(ctxt, partitions->groups[1]-> rule); else ret = xmlRelaxNGValidateDefinition(ctxt, partitions->groups[0]-> rule); if (ret == 0) { if (ctxt->state != NULL) ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, ctxt->state-> seq); } ctxt->flags = oldflags; return (ret); } } /* * Build arrays to store the first and last node of the chain * pertaining to each group */ list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); if (list == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); return (-1); } memset(list, 0, nbgroups * sizeof(xmlNodePtr)); lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); if (lasts == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); return (-1); } memset(lasts, 0, nbgroups * sizeof(xmlNodePtr)); /* * Walk the sequence of children finding the right group and * sorting them in sequences. */ cur = ctxt->state->seq; cur = xmlRelaxNGSkipIgnored(ctxt, cur); start = cur; while (cur != NULL) { ctxt->state->seq = cur; if ((partitions->triage != NULL) && (partitions->flags & IS_DETERMINIST)) { void *tmp = NULL; if ((cur->type == XML_TEXT_NODE) || (cur->type == XML_CDATA_SECTION_NODE)) { tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text", NULL); } else if (cur->type == XML_ELEMENT_NODE) { if (cur->ns != NULL) { tmp = xmlHashLookup2(partitions->triage, cur->name, cur->ns->href); if (tmp == NULL) tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#any", cur->ns->href); } else tmp = xmlHashLookup2(partitions->triage, cur->name, NULL); if (tmp == NULL) tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#any", NULL); } if (tmp == NULL) { i = nbgroups; } else { i = ((long) tmp) - 1; if (partitions->flags & IS_NEEDCHECK) { group = partitions->groups[i]; if (!xmlRelaxNGNodeMatchesList(cur, group->defs)) i = nbgroups; } } } else { for (i = 0; i < nbgroups; i++) { group = partitions->groups[i]; if (group == NULL) continue; if (xmlRelaxNGNodeMatchesList(cur, group->defs)) break; } } /* * We break as soon as an element not matched is found */ if (i >= nbgroups) { break; } if (lasts[i] != NULL) { lasts[i]->next = cur; lasts[i] = cur; } else { list[i] = cur; lasts[i] = cur; } if (cur->next != NULL) lastchg = cur->next; else lastchg = cur; cur = xmlRelaxNGSkipIgnored(ctxt, cur->next); } if (ret != 0) { VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); ret = -1; goto done; } lastelem = cur; oldstate = ctxt->state; for (i = 0; i < nbgroups; i++) { ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); group = partitions->groups[i]; if (lasts[i] != NULL) { last = lasts[i]->next; lasts[i]->next = NULL; } ctxt->state->seq = list[i]; ret = xmlRelaxNGValidateDefinition(ctxt, group->rule); if (ret != 0) break; if (ctxt->state != NULL) { cur = ctxt->state->seq; cur = xmlRelaxNGSkipIgnored(ctxt, cur); xmlRelaxNGFreeValidState(ctxt, oldstate); oldstate = ctxt->state; ctxt->state = NULL; if (cur != NULL) { VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); ret = -1; ctxt->state = oldstate; goto done; } } else if (ctxt->states != NULL) { int j; int found = 0; int best = -1; int lowattr = -1; /* * PBM: what happen if there is attributes checks in the interleaves */ for (j = 0; j < ctxt->states->nbState; j++) { cur = ctxt->states->tabState[j]->seq; cur = xmlRelaxNGSkipIgnored(ctxt, cur); if (cur == NULL) { if (found == 0) { lowattr = ctxt->states->tabState[j]->nbAttrLeft; best = j; } found = 1; if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { /* try to keep the latest one to mach old heuristic */ lowattr = ctxt->states->tabState[j]->nbAttrLeft; best = j; } if (lowattr == 0) break; } else if (found == 0) { if (lowattr == -1) { lowattr = ctxt->states->tabState[j]->nbAttrLeft; best = j; } else if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { /* try to keep the latest one to mach old heuristic */ lowattr = ctxt->states->tabState[j]->nbAttrLeft; best = j; } } } /* * BIG PBM: here we pick only one restarting point :-( */ if (ctxt->states->nbState > 0) { xmlRelaxNGFreeValidState(ctxt, oldstate); if (best != -1) { oldstate = ctxt->states->tabState[best]; ctxt->states->tabState[best] = NULL; } else { oldstate = ctxt->states->tabState[ctxt->states->nbState - 1]; ctxt->states->tabState[ctxt->states->nbState - 1] = NULL; ctxt->states->nbState--; } } for (j = 0; j < ctxt->states->nbState ; j++) { xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]); } xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; if (found == 0) { if (cur == NULL) { VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, (const xmlChar *) "noname"); } else { VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); } ret = -1; ctxt->state = oldstate; goto done; } } else { ret = -1; break; } if (lasts[i] != NULL) { lasts[i]->next = last; } } if (ctxt->state != NULL) xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = oldstate; ctxt->state->seq = lastelem; if (ret != 0) { VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); ret = -1; goto done; } done: ctxt->flags = oldflags; /* * builds the next links chain from the prev one */ cur = lastchg; while (cur != NULL) { if ((cur == start) || (cur->prev == NULL)) break; cur->prev->next = cur; cur = cur->prev; } if (ret == 0) { if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); } xmlFree(list); xmlFree(lasts); return (ret); } /** * xmlRelaxNGValidateDefinitionList: * @ctxt: a Relax-NG validation context * @define: the list of definition to verify * * Validate the given node content against the (list) of definitions * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr defines) { int ret = 0, res; if (defines == NULL) { VALID_ERR2(XML_RELAXNG_ERR_INTERNAL, BAD_CAST "NULL definition list"); return (-1); } while (defines != NULL) { if ((ctxt->state != NULL) || (ctxt->states != NULL)) { res = xmlRelaxNGValidateDefinition(ctxt, defines); if (res < 0) ret = -1; } else { VALID_ERR(XML_RELAXNG_ERR_NOSTATE); return (-1); } if (res == -1) /* continues on -2 */ break; defines = defines->next; } return (ret); } /** * xmlRelaxNGElementMatch: * @ctxt: a Relax-NG validation context * @define: the definition to check * @elem: the element * * Check if the element matches the definition nameClass * * Returns 1 if the element matches, 0 if no, or -1 in case of error */ static int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define, xmlNodePtr elem) { int ret = 0, oldflags = 0; if (define->name != NULL) { if (!xmlStrEqual(elem->name, define->name)) { VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name); return (0); } } if ((define->ns != NULL) && (define->ns[0] != 0)) { if (elem->ns == NULL) { VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name); return (0); } else if (!xmlStrEqual(elem->ns->href, define->ns)) { VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS, elem->name, define->ns); return (0); } } else if ((elem->ns != NULL) && (define->ns != NULL) && (define->name == NULL)) { VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name); return (0); } else if ((elem->ns != NULL) && (define->name != NULL)) { VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name); return (0); } if (define->nameClass == NULL) return (1); define = define->nameClass; if (define->type == XML_RELAXNG_EXCEPT) { xmlRelaxNGDefinePtr list; if (ctxt != NULL) { oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; } list = define->content; while (list != NULL) { ret = xmlRelaxNGElementMatch(ctxt, list, elem); if (ret == 1) { if (ctxt != NULL) ctxt->flags = oldflags; return (0); } if (ret < 0) { if (ctxt != NULL) ctxt->flags = oldflags; return (ret); } list = list->next; } ret = 1; if (ctxt != NULL) { ctxt->flags = oldflags; } } else if (define->type == XML_RELAXNG_CHOICE) { xmlRelaxNGDefinePtr list; if (ctxt != NULL) { oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; } list = define->nameClass; while (list != NULL) { ret = xmlRelaxNGElementMatch(ctxt, list, elem); if (ret == 1) { if (ctxt != NULL) ctxt->flags = oldflags; return (1); } if (ret < 0) { if (ctxt != NULL) ctxt->flags = oldflags; return (ret); } list = list->next; } if (ctxt != NULL) { if (ret != 0) { if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); } else { if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0); } } ret = 0; if (ctxt != NULL) { ctxt->flags = oldflags; } } else { TODO ret = -1; } return (ret); } /** * xmlRelaxNGBestState: * @ctxt: a Relax-NG validation context * * Find the "best" state in the ctxt->states list of states to report * errors about. I.e. a state with no element left in the child list * or the one with the less attributes left. * This is called only if a falidation error was detected * * Returns the index of the "best" state or -1 in case of error */ static int xmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt) { xmlRelaxNGValidStatePtr state; int i, tmp; int best = -1; int value = 1000000; if ((ctxt == NULL) || (ctxt->states == NULL) || (ctxt->states->nbState <= 0)) return (-1); for (i = 0; i < ctxt->states->nbState; i++) { state = ctxt->states->tabState[i]; if (state == NULL) continue; if (state->seq != NULL) { if ((best == -1) || (value > 100000)) { value = 100000; best = i; } } else { tmp = state->nbAttrLeft; if ((best == -1) || (value > tmp)) { value = tmp; best = i; } } } return (best); } /** * xmlRelaxNGLogBestError: * @ctxt: a Relax-NG validation context * * Find the "best" state in the ctxt->states list of states to report * errors about and log it. */ static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt) { int best; if ((ctxt == NULL) || (ctxt->states == NULL) || (ctxt->states->nbState <= 0)) return; best = xmlRelaxNGBestState(ctxt); if ((best >= 0) && (best < ctxt->states->nbState)) { ctxt->state = ctxt->states->tabState[best]; xmlRelaxNGValidateElementEnd(ctxt, 1); } } /** * xmlRelaxNGValidateElementEnd: * @ctxt: a Relax-NG validation context * @dolog: indicate that error logging should be done * * Validate the end of the element, implements check that * there is nothing left not consumed in the element content * or in the attribute list. * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog) { int i; xmlRelaxNGValidStatePtr state; state = ctxt->state; if (state->seq != NULL) { state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq); if (state->seq != NULL) { if (dolog) { VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT, state->node->name, state->seq->name); } return (-1); } } for (i = 0; i < state->nbAttrs; i++) { if (state->attrs[i] != NULL) { if (dolog) { VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR, state->attrs[i]->name, state->node->name); } return (-1 - i); } } return (0); } /** * xmlRelaxNGValidateState: * @ctxt: a Relax-NG validation context * @define: the definition to verify * * Validate the current state against the definition * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define) { xmlNodePtr node; int ret = 0, i, tmp, oldflags, errNr; xmlRelaxNGValidStatePtr oldstate = NULL, state; if (define == NULL) { VALID_ERR(XML_RELAXNG_ERR_NODEFINE); return (-1); } if (ctxt->state != NULL) { node = ctxt->state->seq; } else { node = NULL; } #ifdef DEBUG for (i = 0; i < ctxt->depth; i++) xmlGenericError(xmlGenericErrorContext, " "); xmlGenericError(xmlGenericErrorContext, "Start validating %s ", xmlRelaxNGDefName(define)); if (define->name != NULL) xmlGenericError(xmlGenericErrorContext, "%s ", define->name); if ((node != NULL) && (node->name != NULL)) xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name); else xmlGenericError(xmlGenericErrorContext, "\n"); #endif ctxt->depth++; switch (define->type) { case XML_RELAXNG_EMPTY: node = xmlRelaxNGSkipIgnored(ctxt, node); ret = 0; break; case XML_RELAXNG_NOT_ALLOWED: ret = -1; break; case XML_RELAXNG_TEXT: while ((node != NULL) && ((node->type == XML_TEXT_NODE) || (node->type == XML_COMMENT_NODE) || (node->type == XML_PI_NODE) || (node->type == XML_CDATA_SECTION_NODE))) node = node->next; ctxt->state->seq = node; break; case XML_RELAXNG_ELEMENT: errNr = ctxt->errNr; node = xmlRelaxNGSkipIgnored(ctxt, node); if (node == NULL) { VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name); ret = -1; if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); break; } if (node->type != XML_ELEMENT_NODE) { VALID_ERR(XML_RELAXNG_ERR_NOTELEM); ret = -1; if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); break; } /* * This node was already validated successfully against * this definition. */ if (node->psvi == define) { ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); if (ctxt->errNr != 0) { while ((ctxt->err != NULL) && (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) && (xmlStrEqual(ctxt->err->arg2, node->name))) || ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) && (xmlStrEqual(ctxt->err->arg1, node->name))) || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) || (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM))) xmlRelaxNGValidErrorPop(ctxt); } break; } ret = xmlRelaxNGElementMatch(ctxt, define, node); if (ret <= 0) { ret = -1; if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); break; } ret = 0; if (ctxt->errNr != 0) { if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); while ((ctxt->err != NULL) && (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) && (xmlStrEqual(ctxt->err->arg2, node->name))) || ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) && (xmlStrEqual(ctxt->err->arg1, node->name))) || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) || (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM))) xmlRelaxNGValidErrorPop(ctxt); } errNr = ctxt->errNr; oldflags = ctxt->flags; if (ctxt->flags & FLAGS_MIXED_CONTENT) { ctxt->flags -= FLAGS_MIXED_CONTENT; } state = xmlRelaxNGNewValidState(ctxt, node); if (state == NULL) { ret = -1; if ((ctxt->flags & FLAGS_IGNORABLE) == 0) xmlRelaxNGDumpValidError(ctxt); break; } oldstate = ctxt->state; ctxt->state = state; if (define->attrs != NULL) { tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); if (tmp != 0) { ret = -1; VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); } } if (define->contModel != NULL) { xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state; xmlRelaxNGStatesPtr tmpstates = ctxt->states; xmlNodePtr nseq; nstate = xmlRelaxNGNewValidState(ctxt, node); ctxt->state = nstate; ctxt->states = NULL; tmp = xmlRelaxNGValidateCompiledContent(ctxt, define->contModel, ctxt->state->seq); nseq = ctxt->state->seq; ctxt->state = tmpstate; ctxt->states = tmpstates; xmlRelaxNGFreeValidState(ctxt, nstate); #ifdef DEBUG_COMPILE xmlGenericError(xmlGenericErrorContext, "Validating content of '%s' : %d\n", define->name, tmp); #endif if (tmp != 0) ret = -1; if (ctxt->states != NULL) { tmp = -1; for (i = 0; i < ctxt->states->nbState; i++) { state = ctxt->states->tabState[i]; ctxt->state = state; ctxt->state->seq = nseq; if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { tmp = 0; break; } } if (tmp != 0) { /* * validation error, log the message for the "best" one */ ctxt->flags |= FLAGS_IGNORABLE; xmlRelaxNGLogBestError(ctxt); } for (i = 0; i < ctxt->states->nbState; i++) { xmlRelaxNGFreeValidState(ctxt, ctxt->states-> tabState[i]); } xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->flags = oldflags; ctxt->states = NULL; if ((ret == 0) && (tmp == -1)) ret = -1; } else { state = ctxt->state; if (ctxt->state != NULL) ctxt->state->seq = nseq; if (ret == 0) ret = xmlRelaxNGValidateElementEnd(ctxt, 1); xmlRelaxNGFreeValidState(ctxt, state); } } else { if (define->content != NULL) { tmp = xmlRelaxNGValidateDefinitionList(ctxt, define-> content); if (tmp != 0) { ret = -1; if (ctxt->state == NULL) { ctxt->state = oldstate; VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, node->name); ctxt->state = NULL; } else { VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, node->name); } } } if (ctxt->states != NULL) { tmp = -1; for (i = 0; i < ctxt->states->nbState; i++) { state = ctxt->states->tabState[i]; ctxt->state = state; if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { tmp = 0; break; } } if (tmp != 0) { /* * validation error, log the message for the "best" one */ ctxt->flags |= FLAGS_IGNORABLE; xmlRelaxNGLogBestError(ctxt); } for (i = 0; i < ctxt->states->nbState; i++) { xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]); ctxt->states->tabState[i] = NULL; } xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->flags = oldflags; ctxt->states = NULL; if ((ret == 0) && (tmp == -1)) ret = -1; } else { state = ctxt->state; if (ret == 0) ret = xmlRelaxNGValidateElementEnd(ctxt, 1); xmlRelaxNGFreeValidState(ctxt, state); } } if (ret == 0) { node->psvi = define; } ctxt->flags = oldflags; ctxt->state = oldstate; if (oldstate != NULL) oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); if (ret != 0) { if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { xmlRelaxNGDumpValidError(ctxt); ret = 0; #if 0 } else { ret = -2; #endif } } else { if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); } #ifdef DEBUG xmlGenericError(xmlGenericErrorContext, "xmlRelaxNGValidateDefinition(): validated %s : %d", node->name, ret); if (oldstate == NULL) xmlGenericError(xmlGenericErrorContext, ": no state\n"); else if (oldstate->seq == NULL) xmlGenericError(xmlGenericErrorContext, ": done\n"); else if (oldstate->seq->type == XML_ELEMENT_NODE) xmlGenericError(xmlGenericErrorContext, ": next elem %s\n", oldstate->seq->name); else xmlGenericError(xmlGenericErrorContext, ": next %s %d\n", oldstate->seq->name, oldstate->seq->type); #endif break; case XML_RELAXNG_OPTIONAL:{ errNr = ctxt->errNr; oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); if (ret != 0) { if (ctxt->state != NULL) xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = oldstate; ctxt->flags = oldflags; ret = 0; if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); break; } if (ctxt->states != NULL) { xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); } else { ctxt->states = xmlRelaxNGNewStates(ctxt, 1); if (ctxt->states == NULL) { xmlRelaxNGFreeValidState(ctxt, oldstate); ctxt->flags = oldflags; ret = -1; if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); break; } xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state); ctxt->state = NULL; } ctxt->flags = oldflags; ret = 0; if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); break; } case XML_RELAXNG_ONEORMORE: errNr = ctxt->errNr; ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); if (ret != 0) { break; } if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); /* no break on purpose */ case XML_RELAXNG_ZEROORMORE:{ int progress; xmlRelaxNGStatesPtr states = NULL, res = NULL; int base, j; errNr = ctxt->errNr; res = xmlRelaxNGNewStates(ctxt, 1); if (res == NULL) { ret = -1; break; } /* * All the input states are also exit states */ if (ctxt->state != NULL) { xmlRelaxNGAddStates(ctxt, res, xmlRelaxNGCopyValidState(ctxt, ctxt-> state)); } else { for (j = 0; j < ctxt->states->nbState; j++) { xmlRelaxNGAddStates(ctxt, res, xmlRelaxNGCopyValidState(ctxt, ctxt->states->tabState[j])); } } oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; do { progress = 0; base = res->nbState; if (ctxt->states != NULL) { states = ctxt->states; for (i = 0; i < states->nbState; i++) { ctxt->state = states->tabState[i]; ctxt->states = NULL; ret = xmlRelaxNGValidateDefinitionList(ctxt, define-> content); if (ret == 0) { if (ctxt->state != NULL) { tmp = xmlRelaxNGAddStates(ctxt, res, ctxt->state); ctxt->state = NULL; if (tmp == 1) progress = 1; } else if (ctxt->states != NULL) { for (j = 0; j < ctxt->states->nbState; j++) { tmp = xmlRelaxNGAddStates(ctxt, res, ctxt->states->tabState[j]); if (tmp == 1) progress = 1; } xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; } } else { if (ctxt->state != NULL) { xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } } } } else { ret = xmlRelaxNGValidateDefinitionList(ctxt, define-> content); if (ret != 0) { xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } else { base = res->nbState; if (ctxt->state != NULL) { tmp = xmlRelaxNGAddStates(ctxt, res, ctxt->state); ctxt->state = NULL; if (tmp == 1) progress = 1; } else if (ctxt->states != NULL) { for (j = 0; j < ctxt->states->nbState; j++) { tmp = xmlRelaxNGAddStates(ctxt, res, ctxt->states->tabState[j]); if (tmp == 1) progress = 1; } if (states == NULL) { states = ctxt->states; } else { xmlRelaxNGFreeStates(ctxt, ctxt->states); } ctxt->states = NULL; } } } if (progress) { /* * Collect all the new nodes added at that step * and make them the new node set */ if (res->nbState - base == 1) { ctxt->state = xmlRelaxNGCopyValidState(ctxt, res-> tabState [base]); } else { if (states == NULL) { xmlRelaxNGNewStates(ctxt, res->nbState - base); states = ctxt->states; if (states == NULL) { progress = 0; break; } } states->nbState = 0; for (i = base; i < res->nbState; i++) xmlRelaxNGAddStates(ctxt, states, xmlRelaxNGCopyValidState (ctxt, res->tabState[i])); ctxt->states = states; } } } while (progress == 1); if (states != NULL) { xmlRelaxNGFreeStates(ctxt, states); } ctxt->states = res; ctxt->flags = oldflags; #if 0 /* * errors may have to be propagated back... */ if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); #endif ret = 0; break; } case XML_RELAXNG_CHOICE:{ xmlRelaxNGDefinePtr list = NULL; xmlRelaxNGStatesPtr states = NULL; node = xmlRelaxNGSkipIgnored(ctxt, node); errNr = ctxt->errNr; if ((define->dflags & IS_TRIABLE) && (define->data != NULL) && (node != NULL)) { /* * node == NULL can't be optimized since IS_TRIABLE * doesn't account for choice which may lead to * only attributes. */ xmlHashTablePtr triage = (xmlHashTablePtr) define->data; /* * Something we can optimize cleanly there is only one * possble branch out ! */ if ((node->type == XML_TEXT_NODE) || (node->type == XML_CDATA_SECTION_NODE)) { list = xmlHashLookup2(triage, BAD_CAST "#text", NULL); } else if (node->type == XML_ELEMENT_NODE) { if (node->ns != NULL) { list = xmlHashLookup2(triage, node->name, node->ns->href); if (list == NULL) list = xmlHashLookup2(triage, BAD_CAST "#any", node->ns->href); } else list = xmlHashLookup2(triage, node->name, NULL); if (list == NULL) list = xmlHashLookup2(triage, BAD_CAST "#any", NULL); } if (list == NULL) { ret = -1; VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name); break; } ret = xmlRelaxNGValidateDefinition(ctxt, list); if (ret == 0) { } break; } list = define->content; oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; while (list != NULL) { oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); ret = xmlRelaxNGValidateDefinition(ctxt, list); if (ret == 0) { if (states == NULL) { states = xmlRelaxNGNewStates(ctxt, 1); } if (ctxt->state != NULL) { xmlRelaxNGAddStates(ctxt, states, ctxt->state); } else if (ctxt->states != NULL) { for (i = 0; i < ctxt->states->nbState; i++) { xmlRelaxNGAddStates(ctxt, states, ctxt->states-> tabState[i]); } xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; } } else { xmlRelaxNGFreeValidState(ctxt, ctxt->state); } ctxt->state = oldstate; list = list->next; } if (states != NULL) { xmlRelaxNGFreeValidState(ctxt, oldstate); ctxt->states = states; ctxt->state = NULL; ret = 0; } else { ctxt->states = NULL; } ctxt->flags = oldflags; if (ret != 0) { if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { xmlRelaxNGDumpValidError(ctxt); } } else { if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr); } break; } case XML_RELAXNG_DEF: case XML_RELAXNG_GROUP: ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); break; case XML_RELAXNG_INTERLEAVE: ret = xmlRelaxNGValidateInterleave(ctxt, define); break; case XML_RELAXNG_ATTRIBUTE: ret = xmlRelaxNGValidateAttribute(ctxt, define); break; case XML_RELAXNG_START: case XML_RELAXNG_NOOP: case XML_RELAXNG_REF: case XML_RELAXNG_EXTERNALREF: case XML_RELAXNG_PARENTREF: ret = xmlRelaxNGValidateDefinition(ctxt, define->content); break; case XML_RELAXNG_DATATYPE:{ xmlNodePtr child; xmlChar *content = NULL; child = node; while (child != NULL) { if (child->type == XML_ELEMENT_NODE) { VALID_ERR2(XML_RELAXNG_ERR_DATAELEM, node->parent->name); ret = -1; break; } else if ((child->type == XML_TEXT_NODE) || (child->type == XML_CDATA_SECTION_NODE)) { content = xmlStrcat(content, child->content); } /* TODO: handle entities ... */ child = child->next; } if (ret == -1) { if (content != NULL) xmlFree(content); break; } if (content == NULL) { content = xmlStrdup(BAD_CAST ""); if (content == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); ret = -1; break; } } ret = xmlRelaxNGValidateDatatype(ctxt, content, define, ctxt->state->seq); if (ret == -1) { VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name); } else if (ret == 0) { ctxt->state->seq = NULL; } if (content != NULL) xmlFree(content); break; } case XML_RELAXNG_VALUE:{ xmlChar *content = NULL; xmlChar *oldvalue; xmlNodePtr child; child = node; while (child != NULL) { if (child->type == XML_ELEMENT_NODE) { VALID_ERR2(XML_RELAXNG_ERR_VALELEM, node->parent->name); ret = -1; break; } else if ((child->type == XML_TEXT_NODE) || (child->type == XML_CDATA_SECTION_NODE)) { content = xmlStrcat(content, child->content); } /* TODO: handle entities ... */ child = child->next; } if (ret == -1) { if (content != NULL) xmlFree(content); break; } if (content == NULL) { content = xmlStrdup(BAD_CAST ""); if (content == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); ret = -1; break; } } oldvalue = ctxt->state->value; ctxt->state->value = content; ret = xmlRelaxNGValidateValue(ctxt, define); ctxt->state->value = oldvalue; if (ret == -1) { VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name); } else if (ret == 0) { ctxt->state->seq = NULL; } if (content != NULL) xmlFree(content); break; } case XML_RELAXNG_LIST:{ xmlChar *content; xmlNodePtr child; xmlChar *oldvalue, *oldendvalue; int len; /* * Make sure it's only text nodes */ content = NULL; child = node; while (child != NULL) { if (child->type == XML_ELEMENT_NODE) { VALID_ERR2(XML_RELAXNG_ERR_LISTELEM, node->parent->name); ret = -1; break; } else if ((child->type == XML_TEXT_NODE) || (child->type == XML_CDATA_SECTION_NODE)) { content = xmlStrcat(content, child->content); } /* TODO: handle entities ... */ child = child->next; } if (ret == -1) { if (content != NULL) xmlFree(content); break; } if (content == NULL) { content = xmlStrdup(BAD_CAST ""); if (content == NULL) { xmlRngVErrMemory(ctxt, "validating\n"); ret = -1; break; } } len = xmlStrlen(content); oldvalue = ctxt->state->value; oldendvalue = ctxt->state->endvalue; ctxt->state->value = content; ctxt->state->endvalue = content + len; ret = xmlRelaxNGValidateValue(ctxt, define); ctxt->state->value = oldvalue; ctxt->state->endvalue = oldendvalue; if (ret == -1) { VALID_ERR(XML_RELAXNG_ERR_LIST); } else if ((ret == 0) && (node != NULL)) { ctxt->state->seq = node->next; } if (content != NULL) xmlFree(content); break; } case XML_RELAXNG_EXCEPT: case XML_RELAXNG_PARAM: TODO ret = -1; break; } ctxt->depth--; #ifdef DEBUG for (i = 0; i < ctxt->depth; i++) xmlGenericError(xmlGenericErrorContext, " "); xmlGenericError(xmlGenericErrorContext, "Validating %s ", xmlRelaxNGDefName(define)); if (define->name != NULL) xmlGenericError(xmlGenericErrorContext, "%s ", define->name); if (ret == 0) xmlGenericError(xmlGenericErrorContext, "suceeded\n"); else xmlGenericError(xmlGenericErrorContext, "failed\n"); #endif return (ret); } /** * xmlRelaxNGValidateDefinition: * @ctxt: a Relax-NG validation context * @define: the definition to verify * * Validate the current node lists against the definition * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGDefinePtr define) { xmlRelaxNGStatesPtr states, res; int i, j, k, ret, oldflags; /* * We should NOT have both ctxt->state and ctxt->states */ if ((ctxt->state != NULL) && (ctxt->states != NULL)) { TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) { if (ctxt->states != NULL) { ctxt->state = ctxt->states->tabState[0]; xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; } ret = xmlRelaxNGValidateState(ctxt, define); if ((ctxt->state != NULL) && (ctxt->states != NULL)) { TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) { ctxt->state = ctxt->states->tabState[0]; xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; } return (ret); } states = ctxt->states; ctxt->states = NULL; res = NULL; j = 0; oldflags = ctxt->flags; ctxt->flags |= FLAGS_IGNORABLE; for (i = 0; i < states->nbState; i++) { ctxt->state = states->tabState[i]; ctxt->states = NULL; ret = xmlRelaxNGValidateState(ctxt, define); /* * We should NOT have both ctxt->state and ctxt->states */ if ((ctxt->state != NULL) && (ctxt->states != NULL)) { TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } if (ret == 0) { if (ctxt->states == NULL) { if (res != NULL) { /* add the state to the container */ xmlRelaxNGAddStates(ctxt, res, ctxt->state); ctxt->state = NULL; } else { /* add the state directly in states */ states->tabState[j++] = ctxt->state; ctxt->state = NULL; } } else { if (res == NULL) { /* make it the new container and copy other results */ res = ctxt->states; ctxt->states = NULL; for (k = 0; k < j; k++) xmlRelaxNGAddStates(ctxt, res, states->tabState[k]); } else { /* add all the new results to res and reff the container */ for (k = 0; k < ctxt->states->nbState; k++) xmlRelaxNGAddStates(ctxt, res, ctxt->states->tabState[k]); xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; } } } else { if (ctxt->state != NULL) { xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } else if (ctxt->states != NULL) { for (k = 0; k < ctxt->states->nbState; k++) xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[k]); xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; } } } ctxt->flags = oldflags; if (res != NULL) { xmlRelaxNGFreeStates(ctxt, states); ctxt->states = res; ret = 0; } else if (j > 1) { states->nbState = j; ctxt->states = states; ret = 0; } else if (j == 1) { ctxt->state = states->tabState[0]; xmlRelaxNGFreeStates(ctxt, states); ret = 0; } else { ret = -1; xmlRelaxNGFreeStates(ctxt, states); if (ctxt->states != NULL) { xmlRelaxNGFreeStates(ctxt, ctxt->states); ctxt->states = NULL; } } if ((ctxt->state != NULL) && (ctxt->states != NULL)) { TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } return (ret); } /** * xmlRelaxNGValidateDocument: * @ctxt: a Relax-NG validation context * @doc: the document * * Validate the given document * * Returns 0 if the validation succeeded or an error code. */ static int xmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) { int ret; xmlRelaxNGPtr schema; xmlRelaxNGGrammarPtr grammar; xmlRelaxNGValidStatePtr state; xmlNodePtr node; if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL)) return (-1); ctxt->errNo = XML_RELAXNG_OK; schema = ctxt->schema; grammar = schema->topgrammar; if (grammar == NULL) { VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); return (-1); } state = xmlRelaxNGNewValidState(ctxt, NULL); ctxt->state = state; ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start); if ((ctxt->state != NULL) && (state->seq != NULL)) { state = ctxt->state; node = state->seq; node = xmlRelaxNGSkipIgnored(ctxt, node); if (node != NULL) { if (ret != -1) { VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); ret = -1; } } } else if (ctxt->states != NULL) { int i; int tmp = -1; for (i = 0; i < ctxt->states->nbState; i++) { state = ctxt->states->tabState[i]; node = state->seq; node = xmlRelaxNGSkipIgnored(ctxt, node); if (node == NULL) tmp = 0; xmlRelaxNGFreeValidState(ctxt, state); } if (tmp == -1) { if (ret != -1) { VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); ret = -1; } } } if (ctxt->state != NULL) { xmlRelaxNGFreeValidState(ctxt, ctxt->state); ctxt->state = NULL; } if (ret != 0) xmlRelaxNGDumpValidError(ctxt); #ifdef DEBUG else if (ctxt->errNr != 0) { ctxt->error(ctxt->userData, "%d Extra error messages left on stack !\n", ctxt->errNr); xmlRelaxNGDumpValidError(ctxt); } #endif #ifdef LIBXML_VALID_ENABLED if (ctxt->idref == 1) { xmlValidCtxt vctxt; memset(&vctxt, 0, sizeof(xmlValidCtxt)); vctxt.valid = 1; vctxt.error = ctxt->error; vctxt.warning = ctxt->warning; vctxt.userData = ctxt->userData; if (xmlValidateDocumentFinal(&vctxt, doc) != 1) ret = -1; } #endif /* LIBXML_VALID_ENABLED */ if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK)) ret = -1; return (ret); } /** * xmlRelaxNGCleanPSVI: * @node: an input element or document * * Call this routine to speed up XPath computation on static documents. * This stamps all the element nodes with the document order * Like for line information, the order is kept in the element->content * field, the value stored is actually - the node number (starting at -1) * to be able to differentiate from line numbers. * * Returns the number of elements found in the document or -1 in case * of error. */ static void xmlRelaxNGCleanPSVI(xmlNodePtr node) { xmlNodePtr cur; if ((node == NULL) || ((node->type != XML_ELEMENT_NODE) && (node->type != XML_DOCUMENT_NODE) && (node->type != XML_HTML_DOCUMENT_NODE))) return; if (node->type == XML_ELEMENT_NODE) node->psvi = NULL; cur = node->children; while (cur != NULL) { if (cur->type == XML_ELEMENT_NODE) { cur->psvi = NULL; if (cur->children != NULL) { cur = cur->children; continue; } } if (cur->next != NULL) { cur = cur->next; continue; } do { cur = cur->parent; if (cur == NULL) break; if (cur == node) { cur = NULL; break; } if (cur->next != NULL) { cur = cur->next; break; } } while (cur != NULL); } return; } /************************************************************************ * * * Validation interfaces * * * ************************************************************************/ /** * xmlRelaxNGNewValidCtxt: * @schema: a precompiled XML RelaxNGs * * Create an XML RelaxNGs validation context based on the given schema * * Returns the validation context or NULL in case of error */ xmlRelaxNGValidCtxtPtr xmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema) { xmlRelaxNGValidCtxtPtr ret; ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt)); if (ret == NULL) { xmlRngVErrMemory(NULL, "building context\n"); return (NULL); } memset(ret, 0, sizeof(xmlRelaxNGValidCtxt)); ret->schema = schema; ret->error = xmlGenericError; ret->userData = xmlGenericErrorContext; ret->errNr = 0; ret->errMax = 0; ret->err = NULL; ret->errTab = NULL; if (schema != NULL) ret->idref = schema->idref; ret->states = NULL; ret->freeState = NULL; ret->freeStates = NULL; ret->errNo = XML_RELAXNG_OK; return (ret); } /** * xmlRelaxNGFreeValidCtxt: * @ctxt: the schema validation context * * Free the resources associated to the schema validation context */ void xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) { int k; if (ctxt == NULL) return; if (ctxt->states != NULL) xmlRelaxNGFreeStates(NULL, ctxt->states); if (ctxt->freeState != NULL) { for (k = 0; k < ctxt->freeState->nbState; k++) { xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]); } xmlRelaxNGFreeStates(NULL, ctxt->freeState); } if (ctxt->freeStates != NULL) { for (k = 0; k < ctxt->freeStatesNr; k++) { xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]); } xmlFree(ctxt->freeStates); } if (ctxt->errTab != NULL) xmlFree(ctxt->errTab); if (ctxt->elemTab != NULL) { xmlRegExecCtxtPtr exec; exec = xmlRelaxNGElemPop(ctxt); while (exec != NULL) { xmlRegFreeExecCtxt(exec); exec = xmlRelaxNGElemPop(ctxt); } xmlFree(ctxt->elemTab); } xmlFree(ctxt); } /** * xmlRelaxNGSetValidErrors: * @ctxt: a Relax-NG validation context * @err: the error function * @warn: the warning function * @ctx: the functions context * * Set the error and warning callback informations */ void xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidityErrorFunc err, xmlRelaxNGValidityWarningFunc warn, void *ctx) { if (ctxt == NULL) return; ctxt->error = err; ctxt->warning = warn; ctxt->userData = ctx; ctxt->serror = NULL; } /** * xmlRelaxNGSetValidStructuredErrors: * @ctxt: a Relax-NG validation context * @serror: the structured error function * @ctx: the functions context * * Set the structured error callback */ void xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx) { if (ctxt == NULL) return; ctxt->serror = serror; ctxt->error = NULL; ctxt->warning = NULL; ctxt->userData = ctx; } /** * xmlRelaxNGGetValidErrors: * @ctxt: a Relax-NG validation context * @err: the error function result * @warn: the warning function result * @ctx: the functions context result * * Get the error and warning callback informations * * Returns -1 in case of error and 0 otherwise */ int xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidityErrorFunc * err, xmlRelaxNGValidityWarningFunc * warn, void **ctx) { if (ctxt == NULL) return (-1); if (err != NULL) *err = ctxt->error; if (warn != NULL) *warn = ctxt->warning; if (ctx != NULL) *ctx = ctxt->userData; return (0); } /** * xmlRelaxNGValidateDoc: * @ctxt: a Relax-NG validation context * @doc: a parsed document tree * * Validate a document tree in memory. * * Returns 0 if the document is valid, a positive error code * number otherwise and -1 in case of internal or API error. */ int xmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) { int ret; if ((ctxt == NULL) || (doc == NULL)) return (-1); ctxt->doc = doc; ret = xmlRelaxNGValidateDocument(ctxt, doc); /* * Remove all left PSVI */ xmlRelaxNGCleanPSVI((xmlNodePtr) doc); /* * TODO: build error codes */ if (ret == -1) return (1); return (ret); } #define bottom_relaxng #include "elfgcchack.h" #endif /* LIBXML_SCHEMAS_ENABLED */ libxml2-2.9.1+dfsg1/config.sub0000755000175000017500000010517612134171754014556 0ustar aronaron#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libxml2-2.9.1+dfsg1/testrecurse.c0000644000175000017500000006052412113312343015270 0ustar aronaron/* * testrecurse.c: C program to run libxml2 regression tests checking entities * recursions * * To compile on Unixes: * cc -o testrecurse `xml2-config --cflags` testrecurse.c `xml2-config --libs` -lpthread * * See Copyright for the status of this software. * * daniel@veillard.com */ #include "libxml.h" #include #if !defined(_WIN32) || defined(__CYGWIN__) #include #endif #include #include #include #include #include #include #include #ifdef LIBXML_READER_ENABLED #include #endif /* * O_BINARY is just for Windows compatibility - if it isn't defined * on this system, avoid any compilation error */ #ifdef O_BINARY #define RD_FLAGS O_RDONLY | O_BINARY #else #define RD_FLAGS O_RDONLY #endif typedef int (*functest) (const char *filename, const char *result, const char *error, int options); typedef struct testDesc testDesc; typedef testDesc *testDescPtr; struct testDesc { const char *desc; /* descripton of the test */ functest func; /* function implementing the test */ const char *in; /* glob to path for input files */ const char *out; /* output directory */ const char *suffix;/* suffix for output files */ const char *err; /* suffix for error output files */ int options; /* parser options for the test */ }; static int checkTestFile(const char *filename); #if defined(_WIN32) && !defined(__CYGWIN__) #include #include typedef struct { size_t gl_pathc; /* Count of paths matched so far */ char **gl_pathv; /* List of matched pathnames. */ size_t gl_offs; /* Slots to reserve in 'gl_pathv'. */ } glob_t; #define GLOB_DOOFFS 0 static int glob(const char *pattern, int flags, int errfunc(const char *epath, int eerrno), glob_t *pglob) { glob_t *ret; WIN32_FIND_DATA FindFileData; HANDLE hFind; unsigned int nb_paths = 0; char directory[500]; int len; if ((pattern == NULL) || (pglob == NULL)) return(-1); strncpy(directory, pattern, 499); for (len = strlen(directory);len >= 0;len--) { if (directory[len] == '/') { len++; directory[len] = 0; break; } } if (len <= 0) len = 0; ret = pglob; memset(ret, 0, sizeof(glob_t)); hFind = FindFirstFileA(pattern, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) return(0); nb_paths = 20; ret->gl_pathv = (char **) malloc(nb_paths * sizeof(char *)); if (ret->gl_pathv == NULL) { FindClose(hFind); return(-1); } strncpy(directory + len, FindFileData.cFileName, 499 - len); ret->gl_pathv[ret->gl_pathc] = strdup(directory); if (ret->gl_pathv[ret->gl_pathc] == NULL) goto done; ret->gl_pathc++; while(FindNextFileA(hFind, &FindFileData)) { if (FindFileData.cFileName[0] == '.') continue; if (ret->gl_pathc + 2 > nb_paths) { char **tmp = realloc(ret->gl_pathv, nb_paths * 2 * sizeof(char *)); if (tmp == NULL) break; ret->gl_pathv = tmp; nb_paths *= 2; } strncpy(directory + len, FindFileData.cFileName, 499 - len); ret->gl_pathv[ret->gl_pathc] = strdup(directory); if (ret->gl_pathv[ret->gl_pathc] == NULL) break; ret->gl_pathc++; } ret->gl_pathv[ret->gl_pathc] = NULL; done: FindClose(hFind); return(0); } static void globfree(glob_t *pglob) { unsigned int i; if (pglob == NULL) return; for (i = 0;i < pglob->gl_pathc;i++) { if (pglob->gl_pathv[i] != NULL) free(pglob->gl_pathv[i]); } } #else #include #endif /************************************************************************ * * * Huge document generator * * * ************************************************************************/ #include static const char *start = " \ \ \ ]> \ "; static const char *segment = " &e; &f; &d;\n"; static const char *finish = ""; static int curseg = 0; static const char *current; static int rlen; /** * hugeMatch: * @URI: an URI to test * * Check for an huge: query * * Returns 1 if yes and 0 if another Input module should be used */ static int hugeMatch(const char * URI) { if ((URI != NULL) && (!strncmp(URI, "huge:", 4))) return(1); return(0); } /** * hugeOpen: * @URI: an URI to test * * Return a pointer to the huge: query handler, in this example simply * the current pointer... * * Returns an Input context or NULL in case or error */ static void * hugeOpen(const char * URI) { if ((URI == NULL) || (strncmp(URI, "huge:", 4))) return(NULL); rlen = strlen(start); current = start; return((void *) current); } /** * hugeClose: * @context: the read context * * Close the huge: query handler * * Returns 0 or -1 in case of error */ static int hugeClose(void * context) { if (context == NULL) return(-1); return(0); } #define MAX_NODES 1000000 /** * hugeRead: * @context: the read context * @buffer: where to store data * @len: number of bytes to read * * Implement an huge: query read. * * Returns the number of bytes read or -1 in case of error */ static int hugeRead(void *context, char *buffer, int len) { if ((context == NULL) || (buffer == NULL) || (len < 0)) return (-1); if (len >= rlen) { if (curseg >= MAX_NODES + 1) { rlen = 0; return(0); } len = rlen; rlen = 0; memcpy(buffer, current, len); curseg ++; if (curseg == MAX_NODES) { fprintf(stderr, "\n"); rlen = strlen(finish); current = finish; } else { if (curseg % (MAX_NODES / 10) == 0) fprintf(stderr, "."); rlen = strlen(segment); current = segment; } } else { memcpy(buffer, current, len); rlen -= len; current += len; } return (len); } /************************************************************************ * * * Libxml2 specific routines * * * ************************************************************************/ static int nb_tests = 0; static int nb_errors = 0; static int nb_leaks = 0; static int extraMemoryFromResolver = 0; static int fatalError(void) { fprintf(stderr, "Exitting tests on fatal error\n"); exit(1); } /* * We need to trap calls to the resolver to not account memory for the catalog * which is shared to the current running test. We also don't want to have * network downloads modifying tests. */ static xmlParserInputPtr testExternalEntityLoader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { xmlParserInputPtr ret; if (checkTestFile(URL)) { ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); } else { int memused = xmlMemUsed(); ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); extraMemoryFromResolver += xmlMemUsed() - memused; } return(ret); } /* * Trapping the error messages at the generic level to grab the equivalent of * stderr messages on CLI tools. */ static char testErrors[32769]; static int testErrorsSize = 0; static void XMLCDECL channel(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { va_list args; int res; if (testErrorsSize >= 32768) return; va_start(args, msg); res = vsnprintf(&testErrors[testErrorsSize], 32768 - testErrorsSize, msg, args); va_end(args); if (testErrorsSize + res >= 32768) { /* buffer is full */ testErrorsSize = 32768; testErrors[testErrorsSize] = 0; } else { testErrorsSize += res; } testErrors[testErrorsSize] = 0; } /** * xmlParserPrintFileContext: * @input: an xmlParserInputPtr input * * Displays current context within the input content for error tracking */ static void xmlParserPrintFileContextInternal(xmlParserInputPtr input , xmlGenericErrorFunc chanl, void *data ) { const xmlChar *cur, *base; unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */ xmlChar content[81]; /* space for 80 chars + line terminator */ xmlChar *ctnt; if (input == NULL) return; cur = input->cur; base = input->base; /* skip backwards over any end-of-lines */ while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) { cur--; } n = 0; /* search backwards for beginning-of-line (to max buff size) */ while ((n++ < (sizeof(content)-1)) && (cur > base) && (*(cur) != '\n') && (*(cur) != '\r')) cur--; if ((*(cur) == '\n') || (*(cur) == '\r')) cur++; /* calculate the error position in terms of the current position */ col = input->cur - cur; /* search forward for end-of-line (to max buff size) */ n = 0; ctnt = content; /* copy selected text to our buffer */ while ((*cur != 0) && (*(cur) != '\n') && (*(cur) != '\r') && (n < sizeof(content)-1)) { *ctnt++ = *cur++; n++; } *ctnt = 0; /* print out the selected text */ chanl(data ,"%s\n", content); /* create blank line with problem pointer */ n = 0; ctnt = content; /* (leave buffer space for pointer + line terminator) */ while ((nfile; line = err->line; code = err->code; domain = err->domain; level = err->level; node = err->node; if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) || (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) || (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) { ctxt = err->ctxt; } str = err->message; if (code == XML_ERR_OK) return; if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) name = node->name; /* * Maintain the compatibility with the legacy error handling */ if (ctxt != NULL) { input = ctxt->input; if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { cur = input; input = ctxt->inputTab[ctxt->inputNr - 2]; } if (input != NULL) { if (input->filename) channel(data, "%s:%d: ", input->filename, input->line); else if ((line != 0) && (domain == XML_FROM_PARSER)) channel(data, "Entity: line %d: ", input->line); } } else { if (file != NULL) channel(data, "%s:%d: ", file, line); else if ((line != 0) && (domain == XML_FROM_PARSER)) channel(data, "Entity: line %d: ", line); } if (name != NULL) { channel(data, "element %s: ", name); } if (code == XML_ERR_OK) return; switch (domain) { case XML_FROM_PARSER: channel(data, "parser "); break; case XML_FROM_NAMESPACE: channel(data, "namespace "); break; case XML_FROM_DTD: case XML_FROM_VALID: channel(data, "validity "); break; case XML_FROM_HTML: channel(data, "HTML parser "); break; case XML_FROM_MEMORY: channel(data, "memory "); break; case XML_FROM_OUTPUT: channel(data, "output "); break; case XML_FROM_IO: channel(data, "I/O "); break; case XML_FROM_XINCLUDE: channel(data, "XInclude "); break; case XML_FROM_XPATH: channel(data, "XPath "); break; case XML_FROM_XPOINTER: channel(data, "parser "); break; case XML_FROM_REGEXP: channel(data, "regexp "); break; case XML_FROM_MODULE: channel(data, "module "); break; case XML_FROM_SCHEMASV: channel(data, "Schemas validity "); break; case XML_FROM_SCHEMASP: channel(data, "Schemas parser "); break; case XML_FROM_RELAXNGP: channel(data, "Relax-NG parser "); break; case XML_FROM_RELAXNGV: channel(data, "Relax-NG validity "); break; case XML_FROM_CATALOG: channel(data, "Catalog "); break; case XML_FROM_C14N: channel(data, "C14N "); break; case XML_FROM_XSLT: channel(data, "XSLT "); break; default: break; } if (code == XML_ERR_OK) return; switch (level) { case XML_ERR_NONE: channel(data, ": "); break; case XML_ERR_WARNING: channel(data, "warning : "); break; case XML_ERR_ERROR: channel(data, "error : "); break; case XML_ERR_FATAL: channel(data, "error : "); break; } if (code == XML_ERR_OK) return; if (str != NULL) { int len; len = xmlStrlen((const xmlChar *)str); if ((len > 0) && (str[len - 1] != '\n')) channel(data, "%s\n", str); else channel(data, "%s", str); } else { channel(data, "%s\n", "out of memory error"); } if (code == XML_ERR_OK) return; if (ctxt != NULL) { xmlParserPrintFileContextInternal(input, channel, data); if (cur != NULL) { if (cur->filename) channel(data, "%s:%d: \n", cur->filename, cur->line); else if ((line != 0) && (domain == XML_FROM_PARSER)) channel(data, "Entity: line %d: \n", cur->line); xmlParserPrintFileContextInternal(cur, channel, data); } } if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) && (err->int1 < 100) && (err->int1 < xmlStrlen((const xmlChar *)err->str1))) { xmlChar buf[150]; int i; channel(data, "%s\n", err->str1); for (i=0;i < err->int1;i++) buf[i] = ' '; buf[i++] = '^'; buf[i] = 0; channel(data, "%s\n", buf); } } static void initializeLibxml2(void) { xmlGetWarningsDefaultValue = 0; xmlPedanticParserDefault(0); xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup); xmlInitParser(); xmlSetExternalEntityLoader(testExternalEntityLoader); xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler); /* * register the new I/O handlers */ if (xmlRegisterInputCallbacks(hugeMatch, hugeOpen, hugeRead, hugeClose) < 0) { fprintf(stderr, "failed to register Huge handler\n"); exit(1); } } /************************************************************************ * * * File name and path utilities * * * ************************************************************************/ static const char *baseFilename(const char *filename) { const char *cur; if (filename == NULL) return(NULL); cur = &filename[strlen(filename)]; while ((cur > filename) && (*cur != '/')) cur--; if (*cur == '/') return(cur + 1); return(cur); } static char *resultFilename(const char *filename, const char *out, const char *suffix) { const char *base; char res[500]; char suffixbuff[500]; /************* if ((filename[0] == 't') && (filename[1] == 'e') && (filename[2] == 's') && (filename[3] == 't') && (filename[4] == '/')) filename = &filename[5]; *************/ base = baseFilename(filename); if (suffix == NULL) suffix = ".tmp"; if (out == NULL) out = ""; strncpy(suffixbuff,suffix,499); #ifdef VMS if(strstr(base,".") && suffixbuff[0]=='.') suffixbuff[0]='_'; #endif snprintf(res, 499, "%s%s%s", out, base, suffixbuff); res[499] = 0; return(strdup(res)); } static int checkTestFile(const char *filename) { struct stat buf; if (stat(filename, &buf) == -1) return(0); #if defined(_WIN32) && !defined(__CYGWIN__) if (!(buf.st_mode & _S_IFREG)) return(0); #else if (!S_ISREG(buf.st_mode)) return(0); #endif return(1); } /************************************************************************ * * * Test to detect or not recursive entities * * * ************************************************************************/ /** * recursiveDetectTest: * @filename: the file to parse * @result: the file with expected result * @err: the file with error messages: unused * * Parse a file loading DTD and replacing entities check it fails for * lol cases * * Returns 0 in case of success, an error code otherwise */ static int recursiveDetectTest(const char *filename, const char *result ATTRIBUTE_UNUSED, const char *err ATTRIBUTE_UNUSED, int options ATTRIBUTE_UNUSED) { xmlDocPtr doc; xmlParserCtxtPtr ctxt; int res = 0; nb_tests++; ctxt = xmlNewParserCtxt(); /* * base of the test, parse with the old API */ doc = xmlCtxtReadFile(ctxt, filename, NULL, XML_PARSE_NOENT | XML_PARSE_DTDLOAD); if ((doc != NULL) || (ctxt->lastError.code != XML_ERR_ENTITY_LOOP)) { fprintf(stderr, "Failed to detect recursion in %s\n", filename); xmlFreeParserCtxt(ctxt); xmlFreeDoc(doc); return(1); } xmlFreeParserCtxt(ctxt); return(res); } /** * notRecursiveDetectTest: * @filename: the file to parse * @result: the file with expected result * @err: the file with error messages: unused * * Parse a file loading DTD and replacing entities check it works for * good cases * * Returns 0 in case of success, an error code otherwise */ static int notRecursiveDetectTest(const char *filename, const char *result ATTRIBUTE_UNUSED, const char *err ATTRIBUTE_UNUSED, int options ATTRIBUTE_UNUSED) { xmlDocPtr doc; xmlParserCtxtPtr ctxt; int res = 0; nb_tests++; ctxt = xmlNewParserCtxt(); /* * base of the test, parse with the old API */ doc = xmlCtxtReadFile(ctxt, filename, NULL, XML_PARSE_NOENT | XML_PARSE_DTDLOAD); if (doc == NULL) { fprintf(stderr, "Failed to parse correct file %s\n", filename); xmlFreeParserCtxt(ctxt); return(1); } xmlFreeDoc(doc); xmlFreeParserCtxt(ctxt); return(res); } #ifdef LIBXML_READER_ENABLED /** * notRecursiveHugeTest: * @filename: the file to parse * @result: the file with expected result * @err: the file with error messages: unused * * Parse a memory generated file * good cases * * Returns 0 in case of success, an error code otherwise */ static int notRecursiveHugeTest(const char *filename ATTRIBUTE_UNUSED, const char *result ATTRIBUTE_UNUSED, const char *err ATTRIBUTE_UNUSED, int options ATTRIBUTE_UNUSED) { xmlTextReaderPtr reader; int res = 0; int ret; nb_tests++; reader = xmlReaderForFile("huge:test" , NULL, XML_PARSE_NOENT | XML_PARSE_DTDLOAD); if (reader == NULL) { fprintf(stderr, "Failed to open huge:test\n"); return(1); } ret = xmlTextReaderRead(reader); while (ret == 1) { ret = xmlTextReaderRead(reader); } if (ret != 0) { fprintf(stderr, "Failed to parser huge:test with entities\n"); res = 1; } xmlFreeTextReader(reader); return(res); } #endif /************************************************************************ * * * Tests Descriptions * * * ************************************************************************/ static testDesc testDescriptions[] = { { "Parsing recursive test cases" , recursiveDetectTest, "./test/recurse/lol*.xml", NULL, NULL, NULL, 0 }, { "Parsing non-recursive test cases" , notRecursiveDetectTest, "./test/recurse/good*.xml", NULL, NULL, NULL, 0 }, #ifdef LIBXML_READER_ENABLED { "Parsing non-recursive huge case" , notRecursiveHugeTest, NULL, NULL, NULL, NULL, 0 }, #endif {NULL, NULL, NULL, NULL, NULL, NULL, 0} }; /************************************************************************ * * * The main code driving the tests * * * ************************************************************************/ static int launchTests(testDescPtr tst) { int res = 0, err = 0; size_t i; char *result; char *error; int mem; if (tst == NULL) return(-1); if (tst->in != NULL) { glob_t globbuf; globbuf.gl_offs = 0; glob(tst->in, GLOB_DOOFFS, NULL, &globbuf); for (i = 0;i < globbuf.gl_pathc;i++) { if (!checkTestFile(globbuf.gl_pathv[i])) continue; if (tst->suffix != NULL) { result = resultFilename(globbuf.gl_pathv[i], tst->out, tst->suffix); if (result == NULL) { fprintf(stderr, "Out of memory !\n"); fatalError(); } } else { result = NULL; } if (tst->err != NULL) { error = resultFilename(globbuf.gl_pathv[i], tst->out, tst->err); if (error == NULL) { fprintf(stderr, "Out of memory !\n"); fatalError(); } } else { error = NULL; } if ((result) &&(!checkTestFile(result))) { fprintf(stderr, "Missing result file %s\n", result); } else if ((error) &&(!checkTestFile(error))) { fprintf(stderr, "Missing error file %s\n", error); } else { mem = xmlMemUsed(); extraMemoryFromResolver = 0; testErrorsSize = 0; testErrors[0] = 0; res = tst->func(globbuf.gl_pathv[i], result, error, tst->options | XML_PARSE_COMPACT); xmlResetLastError(); if (res != 0) { fprintf(stderr, "File %s generated an error\n", globbuf.gl_pathv[i]); nb_errors++; err++; } else if (xmlMemUsed() != mem) { if ((xmlMemUsed() != mem) && (extraMemoryFromResolver == 0)) { fprintf(stderr, "File %s leaked %d bytes\n", globbuf.gl_pathv[i], xmlMemUsed() - mem); nb_leaks++; err++; } } testErrorsSize = 0; } if (result) free(result); if (error) free(error); } globfree(&globbuf); } else { testErrorsSize = 0; testErrors[0] = 0; extraMemoryFromResolver = 0; res = tst->func(NULL, NULL, NULL, tst->options); if (res != 0) { nb_errors++; err++; } } return(err); } static int verbose = 0; static int tests_quiet = 0; static int runtest(int i) { int ret = 0, res; int old_errors, old_tests, old_leaks; old_errors = nb_errors; old_tests = nb_tests; old_leaks = nb_leaks; if ((tests_quiet == 0) && (testDescriptions[i].desc != NULL)) printf("## %s\n", testDescriptions[i].desc); res = launchTests(&testDescriptions[i]); if (res != 0) ret++; if (verbose) { if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) printf("Ran %d tests, no errors\n", nb_tests - old_tests); else printf("Ran %d tests, %d errors, %d leaks\n", nb_tests - old_tests, nb_errors - old_errors, nb_leaks - old_leaks); } return(ret); } int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { int i, a, ret = 0; int subset = 0; initializeLibxml2(); for (a = 1; a < argc;a++) { if (!strcmp(argv[a], "-v")) verbose = 1; else if (!strcmp(argv[a], "-quiet")) tests_quiet = 1; else { for (i = 0; testDescriptions[i].func != NULL; i++) { if (strstr(testDescriptions[i].desc, argv[a])) { ret += runtest(i); subset++; } } } } if (subset == 0) { for (i = 0; testDescriptions[i].func != NULL; i++) { ret += runtest(i); } } if ((nb_errors == 0) && (nb_leaks == 0)) { ret = 0; printf("Total %d tests, no errors\n", nb_tests); } else { ret = 1; printf("Total %d tests, %d errors, %d leaks\n", nb_tests, nb_errors, nb_leaks); } xmlCleanupParser(); xmlMemoryDump(); return(ret); } libxml2-2.9.1+dfsg1/runxmlconf.c0000644000175000017500000003766112113312343015121 0ustar aronaron/* * runsuite.c: C program to run libxml2 againts published testsuites * * See Copyright for the status of this software. * * daniel@veillard.com */ #include "libxml.h" #include #ifdef LIBXML_XPATH_ENABLED #if !defined(_WIN32) || defined(__CYGWIN__) #include #endif #include #include #include #include #include #include #include #include #include #include #include #define LOGFILE "runxmlconf.log" static FILE *logfile = NULL; static int verbose = 0; #define NB_EXPECTED_ERRORS 15 const char *skipped_tests[] = { /* http://lists.w3.org/Archives/Public/public-xml-testsuite/2008Jul/0000.html */ "rmt-ns10-035", NULL }; /************************************************************************ * * * File name and path utilities * * * ************************************************************************/ static int checkTestFile(const char *filename) { struct stat buf; if (stat(filename, &buf) == -1) return(0); #if defined(_WIN32) && !defined(__CYGWIN__) if (!(buf.st_mode & _S_IFREG)) return(0); #else if (!S_ISREG(buf.st_mode)) return(0); #endif return(1); } static xmlChar *composeDir(const xmlChar *dir, const xmlChar *path) { char buf[500]; if (dir == NULL) return(xmlStrdup(path)); if (path == NULL) return(NULL); snprintf(buf, 500, "%s/%s", (const char *) dir, (const char *) path); return(xmlStrdup((const xmlChar *) buf)); } /************************************************************************ * * * Libxml2 specific routines * * * ************************************************************************/ static int nb_skipped = 0; static int nb_tests = 0; static int nb_errors = 0; static int nb_leaks = 0; /* * We need to trap calls to the resolver to not account memory for the catalog * and not rely on any external resources. */ static xmlParserInputPtr testExternalEntityLoader(const char *URL, const char *ID ATTRIBUTE_UNUSED, xmlParserCtxtPtr ctxt) { xmlParserInputPtr ret; ret = xmlNewInputFromFile(ctxt, (const char *) URL); return(ret); } /* * Trapping the error messages at the generic level to grab the equivalent of * stderr messages on CLI tools. */ static char testErrors[32769]; static int testErrorsSize = 0; static int nbError = 0; static int nbFatal = 0; static void test_log(const char *msg, ...) { va_list args; if (logfile != NULL) { fprintf(logfile, "\n------------\n"); va_start(args, msg); vfprintf(logfile, msg, args); va_end(args); fprintf(logfile, "%s", testErrors); testErrorsSize = 0; testErrors[0] = 0; } if (verbose) { va_start(args, msg); vfprintf(stderr, msg, args); va_end(args); } } static void testErrorHandler(void *userData ATTRIBUTE_UNUSED, xmlErrorPtr error) { int res; if (testErrorsSize >= 32768) return; res = snprintf(&testErrors[testErrorsSize], 32768 - testErrorsSize, "%s:%d: %s\n", (error->file ? error->file : "entity"), error->line, error->message); if (error->level == XML_ERR_FATAL) nbFatal++; else if (error->level == XML_ERR_ERROR) nbError++; if (testErrorsSize + res >= 32768) { /* buffer is full */ testErrorsSize = 32768; testErrors[testErrorsSize] = 0; } else { testErrorsSize += res; } testErrors[testErrorsSize] = 0; } static xmlXPathContextPtr ctxtXPath; static void initializeLibxml2(void) { xmlGetWarningsDefaultValue = 0; xmlPedanticParserDefault(0); xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup); xmlInitParser(); xmlSetExternalEntityLoader(testExternalEntityLoader); ctxtXPath = xmlXPathNewContext(NULL); /* * Deactivate the cache if created; otherwise we have to create/free it * for every test, since it will confuse the memory leak detection. * Note that normally this need not be done, since the cache is not * created until set explicitely with xmlXPathContextSetCache(); * but for test purposes it is sometimes usefull to activate the * cache by default for the whole library. */ if (ctxtXPath->cache != NULL) xmlXPathContextSetCache(ctxtXPath, 0, -1, 0); xmlSetStructuredErrorFunc(NULL, testErrorHandler); } /************************************************************************ * * * Run the xmlconf test if found * * * ************************************************************************/ static int xmlconfTestInvalid(const char *id, const char *filename, int options) { xmlDocPtr doc; xmlParserCtxtPtr ctxt; int ret = 1; ctxt = xmlNewParserCtxt(); if (ctxt == NULL) { test_log("test %s : %s out of memory\n", id, filename); return(0); } doc = xmlCtxtReadFile(ctxt, filename, NULL, options); if (doc == NULL) { test_log("test %s : %s invalid document turned not well-formed too\n", id, filename); } else { /* invalidity should be reported both in the context and in the document */ if ((ctxt->valid != 0) || (doc->properties & XML_DOC_DTDVALID)) { test_log("test %s : %s failed to detect invalid document\n", id, filename); nb_errors++; ret = 0; } xmlFreeDoc(doc); } xmlFreeParserCtxt(ctxt); return(ret); } static int xmlconfTestValid(const char *id, const char *filename, int options) { xmlDocPtr doc; xmlParserCtxtPtr ctxt; int ret = 1; ctxt = xmlNewParserCtxt(); if (ctxt == NULL) { test_log("test %s : %s out of memory\n", id, filename); return(0); } doc = xmlCtxtReadFile(ctxt, filename, NULL, options); if (doc == NULL) { test_log("test %s : %s failed to parse a valid document\n", id, filename); nb_errors++; ret = 0; } else { /* validity should be reported both in the context and in the document */ if ((ctxt->valid == 0) || ((doc->properties & XML_DOC_DTDVALID) == 0)) { test_log("test %s : %s failed to validate a valid document\n", id, filename); nb_errors++; ret = 0; } xmlFreeDoc(doc); } xmlFreeParserCtxt(ctxt); return(ret); } static int xmlconfTestNotNSWF(const char *id, const char *filename, int options) { xmlDocPtr doc; int ret = 1; /* * In case of Namespace errors, libxml2 will still parse the document * but log a Namesapce error. */ doc = xmlReadFile(filename, NULL, options); if (doc == NULL) { test_log("test %s : %s failed to parse the XML\n", id, filename); nb_errors++; ret = 0; } else { if ((xmlLastError.code == XML_ERR_OK) || (xmlLastError.domain != XML_FROM_NAMESPACE)) { test_log("test %s : %s failed to detect namespace error\n", id, filename); nb_errors++; ret = 0; } xmlFreeDoc(doc); } return(ret); } static int xmlconfTestNotWF(const char *id, const char *filename, int options) { xmlDocPtr doc; int ret = 1; doc = xmlReadFile(filename, NULL, options); if (doc != NULL) { test_log("test %s : %s failed to detect not well formedness\n", id, filename); nb_errors++; xmlFreeDoc(doc); ret = 0; } return(ret); } static int xmlconfTestItem(xmlDocPtr doc, xmlNodePtr cur) { int ret = -1; xmlChar *type = NULL; xmlChar *filename = NULL; xmlChar *uri = NULL; xmlChar *base = NULL; xmlChar *id = NULL; xmlChar *rec = NULL; xmlChar *version = NULL; xmlChar *entities = NULL; xmlChar *edition = NULL; int options = 0; int nstest = 0; int mem, final; int i; testErrorsSize = 0; testErrors[0] = 0; nbError = 0; nbFatal = 0; id = xmlGetProp(cur, BAD_CAST "ID"); if (id == NULL) { test_log("test missing ID, line %ld\n", xmlGetLineNo(cur)); goto error; } for (i = 0;skipped_tests[i] != NULL;i++) { if (!strcmp(skipped_tests[i], (char *) id)) { test_log("Skipping test %s from skipped list\n", (char *) id); ret = 0; nb_skipped++; goto error; } } type = xmlGetProp(cur, BAD_CAST "TYPE"); if (type == NULL) { test_log("test %s missing TYPE\n", (char *) id); goto error; } uri = xmlGetProp(cur, BAD_CAST "URI"); if (uri == NULL) { test_log("test %s missing URI\n", (char *) id); goto error; } base = xmlNodeGetBase(doc, cur); filename = composeDir(base, uri); if (!checkTestFile((char *) filename)) { test_log("test %s missing file %s \n", id, (filename ? (char *)filename : "NULL")); goto error; } version = xmlGetProp(cur, BAD_CAST "VERSION"); entities = xmlGetProp(cur, BAD_CAST "ENTITIES"); if (!xmlStrEqual(entities, BAD_CAST "none")) { options |= XML_PARSE_DTDLOAD; options |= XML_PARSE_NOENT; } rec = xmlGetProp(cur, BAD_CAST "RECOMMENDATION"); if ((rec == NULL) || (xmlStrEqual(rec, BAD_CAST "XML1.0")) || (xmlStrEqual(rec, BAD_CAST "XML1.0-errata2e")) || (xmlStrEqual(rec, BAD_CAST "XML1.0-errata3e")) || (xmlStrEqual(rec, BAD_CAST "XML1.0-errata4e"))) { if ((version != NULL) && (!xmlStrEqual(version, BAD_CAST "1.0"))) { test_log("Skipping test %s for %s\n", (char *) id, (char *) version); ret = 0; nb_skipped++; goto error; } ret = 1; } else if ((xmlStrEqual(rec, BAD_CAST "NS1.0")) || (xmlStrEqual(rec, BAD_CAST "NS1.0-errata1e"))) { ret = 1; nstest = 1; } else { test_log("Skipping test %s for REC %s\n", (char *) id, (char *) rec); ret = 0; nb_skipped++; goto error; } edition = xmlGetProp(cur, BAD_CAST "EDITION"); if ((edition != NULL) && (xmlStrchr(edition, '5') == NULL)) { /* test limited to all versions before 5th */ options |= XML_PARSE_OLD10; } /* * Reset errors and check memory usage before the test */ xmlResetLastError(); testErrorsSize = 0; testErrors[0] = 0; mem = xmlMemUsed(); if (xmlStrEqual(type, BAD_CAST "not-wf")) { if (nstest == 0) xmlconfTestNotWF((char *) id, (char *) filename, options); else xmlconfTestNotNSWF((char *) id, (char *) filename, options); } else if (xmlStrEqual(type, BAD_CAST "valid")) { options |= XML_PARSE_DTDVALID; xmlconfTestValid((char *) id, (char *) filename, options); } else if (xmlStrEqual(type, BAD_CAST "invalid")) { options |= XML_PARSE_DTDVALID; xmlconfTestInvalid((char *) id, (char *) filename, options); } else if (xmlStrEqual(type, BAD_CAST "error")) { test_log("Skipping error test %s \n", (char *) id); ret = 0; nb_skipped++; goto error; } else { test_log("test %s unknown TYPE value %s\n", (char *) id, (char *)type); ret = -1; goto error; } /* * Reset errors and check memory usage after the test */ xmlResetLastError(); final = xmlMemUsed(); if (final > mem) { test_log("test %s : %s leaked %d bytes\n", id, filename, final - mem); nb_leaks++; xmlMemDisplayLast(logfile, final - mem); } nb_tests++; error: if (type != NULL) xmlFree(type); if (entities != NULL) xmlFree(entities); if (edition != NULL) xmlFree(edition); if (version != NULL) xmlFree(version); if (filename != NULL) xmlFree(filename); if (uri != NULL) xmlFree(uri); if (base != NULL) xmlFree(base); if (id != NULL) xmlFree(id); if (rec != NULL) xmlFree(rec); return(ret); } static int xmlconfTestCases(xmlDocPtr doc, xmlNodePtr cur, int level) { xmlChar *profile; int ret = 0; int tests = 0; int output = 0; if (level == 1) { profile = xmlGetProp(cur, BAD_CAST "PROFILE"); if (profile != NULL) { output = 1; level++; printf("Test cases: %s\n", (char *) profile); xmlFree(profile); } } cur = cur->children; while (cur != NULL) { /* look only at elements we ignore everything else */ if (cur->type == XML_ELEMENT_NODE) { if (xmlStrEqual(cur->name, BAD_CAST "TESTCASES")) { ret += xmlconfTestCases(doc, cur, level); } else if (xmlStrEqual(cur->name, BAD_CAST "TEST")) { if (xmlconfTestItem(doc, cur) >= 0) ret++; tests++; } else { fprintf(stderr, "Unhandled element %s\n", (char *)cur->name); } } cur = cur->next; } if (output == 1) { if (tests > 0) printf("Test cases: %d tests\n", tests); } return(ret); } static int xmlconfTestSuite(xmlDocPtr doc, xmlNodePtr cur) { xmlChar *profile; int ret = 0; profile = xmlGetProp(cur, BAD_CAST "PROFILE"); if (profile != NULL) { printf("Test suite: %s\n", (char *) profile); xmlFree(profile); } else printf("Test suite\n"); cur = cur->children; while (cur != NULL) { /* look only at elements we ignore everything else */ if (cur->type == XML_ELEMENT_NODE) { if (xmlStrEqual(cur->name, BAD_CAST "TESTCASES")) { ret += xmlconfTestCases(doc, cur, 1); } else { fprintf(stderr, "Unhandled element %s\n", (char *)cur->name); } } cur = cur->next; } return(ret); } static void xmlconfInfo(void) { fprintf(stderr, " you need to fetch and extract the\n"); fprintf(stderr, " latest XML Conformance Test Suites\n"); fprintf(stderr, " http://www.w3.org/XML/Test/xmlts20080827.tar.gz\n"); fprintf(stderr, " see http://www.w3.org/XML/Test/ for informations\n"); } static int xmlconfTest(void) { const char *confxml = "xmlconf/xmlconf.xml"; xmlDocPtr doc; xmlNodePtr cur; int ret = 0; if (!checkTestFile(confxml)) { fprintf(stderr, "%s is missing \n", confxml); xmlconfInfo(); return(-1); } doc = xmlReadFile(confxml, NULL, XML_PARSE_NOENT); if (doc == NULL) { fprintf(stderr, "%s is corrupted \n", confxml); xmlconfInfo(); return(-1); } cur = xmlDocGetRootElement(doc); if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "TESTSUITE"))) { fprintf(stderr, "Unexpected format %s\n", confxml); xmlconfInfo(); ret = -1; } else { ret = xmlconfTestSuite(doc, cur); } xmlFreeDoc(doc); return(ret); } /************************************************************************ * * * The driver for the tests * * * ************************************************************************/ int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { int ret = 0; int old_errors, old_tests, old_leaks; logfile = fopen(LOGFILE, "w"); if (logfile == NULL) { fprintf(stderr, "Could not open the log file, running in verbose mode\n"); verbose = 1; } initializeLibxml2(); if ((argc >= 2) && (!strcmp(argv[1], "-v"))) verbose = 1; old_errors = nb_errors; old_tests = nb_tests; old_leaks = nb_leaks; xmlconfTest(); if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) printf("Ran %d tests, no errors\n", nb_tests - old_tests); else printf("Ran %d tests, %d errors, %d leaks\n", nb_tests - old_tests, nb_errors - old_errors, nb_leaks - old_leaks); if ((nb_errors == 0) && (nb_leaks == 0)) { ret = 0; printf("Total %d tests, no errors\n", nb_tests); } else { ret = 1; printf("Total %d tests, %d errors, %d leaks\n", nb_tests, nb_errors, nb_leaks); printf("See %s for detailed output\n", LOGFILE); if ((nb_leaks == 0) && (nb_errors == NB_EXPECTED_ERRORS)) { printf("%d errors were expected\n", nb_errors); ret = 0; } } xmlXPathFreeContext(ctxtXPath); xmlCleanupParser(); xmlMemoryDump(); if (logfile != NULL) fclose(logfile); return(ret); } #else /* ! LIBXML_XPATH_ENABLED */ #include int main(int argc, char **argv) { fprintf(stderr, "%s need XPath support\n", argv[0]); } #endif libxml2-2.9.1+dfsg1/COPYING0000644000175000017500000000241112113312340013573 0ustar aronaronExcept where otherwise noted in the source code (e.g. the files hash.c, list.c and the trio files, which are covered by a similar licence but with different Copyright notices) all the files are: Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is fur- nished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. libxml2-2.9.1+dfsg1/xmlunicode.c0000644000175000017500000030753612113312344015077 0ustar aronaron/* * xmlunicode.c: this module implements the Unicode character APIs * * This file is automatically generated from the * UCS description files of the Unicode Character Database * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html * using the genUnicode.py Python script. * * Generation date: Mon Mar 27 11:09:52 2006 * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_UNICODE_ENABLED #include #include #include #include typedef int (xmlIntFunc)(int); /* just to keep one's mind untwisted */ typedef struct { const char *rangename; xmlIntFunc *func; } xmlUnicodeRange; typedef struct { xmlUnicodeRange *table; int numentries; } xmlUnicodeNameTable; static xmlIntFunc *xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname); static xmlUnicodeRange xmlUnicodeBlocks[] = { {"AegeanNumbers", xmlUCSIsAegeanNumbers}, {"AlphabeticPresentationForms", xmlUCSIsAlphabeticPresentationForms}, {"Arabic", xmlUCSIsArabic}, {"ArabicPresentationForms-A", xmlUCSIsArabicPresentationFormsA}, {"ArabicPresentationForms-B", xmlUCSIsArabicPresentationFormsB}, {"Armenian", xmlUCSIsArmenian}, {"Arrows", xmlUCSIsArrows}, {"BasicLatin", xmlUCSIsBasicLatin}, {"Bengali", xmlUCSIsBengali}, {"BlockElements", xmlUCSIsBlockElements}, {"Bopomofo", xmlUCSIsBopomofo}, {"BopomofoExtended", xmlUCSIsBopomofoExtended}, {"BoxDrawing", xmlUCSIsBoxDrawing}, {"BraillePatterns", xmlUCSIsBraillePatterns}, {"Buhid", xmlUCSIsBuhid}, {"ByzantineMusicalSymbols", xmlUCSIsByzantineMusicalSymbols}, {"CJKCompatibility", xmlUCSIsCJKCompatibility}, {"CJKCompatibilityForms", xmlUCSIsCJKCompatibilityForms}, {"CJKCompatibilityIdeographs", xmlUCSIsCJKCompatibilityIdeographs}, {"CJKCompatibilityIdeographsSupplement", xmlUCSIsCJKCompatibilityIdeographsSupplement}, {"CJKRadicalsSupplement", xmlUCSIsCJKRadicalsSupplement}, {"CJKSymbolsandPunctuation", xmlUCSIsCJKSymbolsandPunctuation}, {"CJKUnifiedIdeographs", xmlUCSIsCJKUnifiedIdeographs}, {"CJKUnifiedIdeographsExtensionA", xmlUCSIsCJKUnifiedIdeographsExtensionA}, {"CJKUnifiedIdeographsExtensionB", xmlUCSIsCJKUnifiedIdeographsExtensionB}, {"Cherokee", xmlUCSIsCherokee}, {"CombiningDiacriticalMarks", xmlUCSIsCombiningDiacriticalMarks}, {"CombiningDiacriticalMarksforSymbols", xmlUCSIsCombiningDiacriticalMarksforSymbols}, {"CombiningHalfMarks", xmlUCSIsCombiningHalfMarks}, {"CombiningMarksforSymbols", xmlUCSIsCombiningMarksforSymbols}, {"ControlPictures", xmlUCSIsControlPictures}, {"CurrencySymbols", xmlUCSIsCurrencySymbols}, {"CypriotSyllabary", xmlUCSIsCypriotSyllabary}, {"Cyrillic", xmlUCSIsCyrillic}, {"CyrillicSupplement", xmlUCSIsCyrillicSupplement}, {"Deseret", xmlUCSIsDeseret}, {"Devanagari", xmlUCSIsDevanagari}, {"Dingbats", xmlUCSIsDingbats}, {"EnclosedAlphanumerics", xmlUCSIsEnclosedAlphanumerics}, {"EnclosedCJKLettersandMonths", xmlUCSIsEnclosedCJKLettersandMonths}, {"Ethiopic", xmlUCSIsEthiopic}, {"GeneralPunctuation", xmlUCSIsGeneralPunctuation}, {"GeometricShapes", xmlUCSIsGeometricShapes}, {"Georgian", xmlUCSIsGeorgian}, {"Gothic", xmlUCSIsGothic}, {"Greek", xmlUCSIsGreek}, {"GreekExtended", xmlUCSIsGreekExtended}, {"GreekandCoptic", xmlUCSIsGreekandCoptic}, {"Gujarati", xmlUCSIsGujarati}, {"Gurmukhi", xmlUCSIsGurmukhi}, {"HalfwidthandFullwidthForms", xmlUCSIsHalfwidthandFullwidthForms}, {"HangulCompatibilityJamo", xmlUCSIsHangulCompatibilityJamo}, {"HangulJamo", xmlUCSIsHangulJamo}, {"HangulSyllables", xmlUCSIsHangulSyllables}, {"Hanunoo", xmlUCSIsHanunoo}, {"Hebrew", xmlUCSIsHebrew}, {"HighPrivateUseSurrogates", xmlUCSIsHighPrivateUseSurrogates}, {"HighSurrogates", xmlUCSIsHighSurrogates}, {"Hiragana", xmlUCSIsHiragana}, {"IPAExtensions", xmlUCSIsIPAExtensions}, {"IdeographicDescriptionCharacters", xmlUCSIsIdeographicDescriptionCharacters}, {"Kanbun", xmlUCSIsKanbun}, {"KangxiRadicals", xmlUCSIsKangxiRadicals}, {"Kannada", xmlUCSIsKannada}, {"Katakana", xmlUCSIsKatakana}, {"KatakanaPhoneticExtensions", xmlUCSIsKatakanaPhoneticExtensions}, {"Khmer", xmlUCSIsKhmer}, {"KhmerSymbols", xmlUCSIsKhmerSymbols}, {"Lao", xmlUCSIsLao}, {"Latin-1Supplement", xmlUCSIsLatin1Supplement}, {"LatinExtended-A", xmlUCSIsLatinExtendedA}, {"LatinExtended-B", xmlUCSIsLatinExtendedB}, {"LatinExtendedAdditional", xmlUCSIsLatinExtendedAdditional}, {"LetterlikeSymbols", xmlUCSIsLetterlikeSymbols}, {"Limbu", xmlUCSIsLimbu}, {"LinearBIdeograms", xmlUCSIsLinearBIdeograms}, {"LinearBSyllabary", xmlUCSIsLinearBSyllabary}, {"LowSurrogates", xmlUCSIsLowSurrogates}, {"Malayalam", xmlUCSIsMalayalam}, {"MathematicalAlphanumericSymbols", xmlUCSIsMathematicalAlphanumericSymbols}, {"MathematicalOperators", xmlUCSIsMathematicalOperators}, {"MiscellaneousMathematicalSymbols-A", xmlUCSIsMiscellaneousMathematicalSymbolsA}, {"MiscellaneousMathematicalSymbols-B", xmlUCSIsMiscellaneousMathematicalSymbolsB}, {"MiscellaneousSymbols", xmlUCSIsMiscellaneousSymbols}, {"MiscellaneousSymbolsandArrows", xmlUCSIsMiscellaneousSymbolsandArrows}, {"MiscellaneousTechnical", xmlUCSIsMiscellaneousTechnical}, {"Mongolian", xmlUCSIsMongolian}, {"MusicalSymbols", xmlUCSIsMusicalSymbols}, {"Myanmar", xmlUCSIsMyanmar}, {"NumberForms", xmlUCSIsNumberForms}, {"Ogham", xmlUCSIsOgham}, {"OldItalic", xmlUCSIsOldItalic}, {"OpticalCharacterRecognition", xmlUCSIsOpticalCharacterRecognition}, {"Oriya", xmlUCSIsOriya}, {"Osmanya", xmlUCSIsOsmanya}, {"PhoneticExtensions", xmlUCSIsPhoneticExtensions}, {"PrivateUse", xmlUCSIsPrivateUse}, {"PrivateUseArea", xmlUCSIsPrivateUseArea}, {"Runic", xmlUCSIsRunic}, {"Shavian", xmlUCSIsShavian}, {"Sinhala", xmlUCSIsSinhala}, {"SmallFormVariants", xmlUCSIsSmallFormVariants}, {"SpacingModifierLetters", xmlUCSIsSpacingModifierLetters}, {"Specials", xmlUCSIsSpecials}, {"SuperscriptsandSubscripts", xmlUCSIsSuperscriptsandSubscripts}, {"SupplementalArrows-A", xmlUCSIsSupplementalArrowsA}, {"SupplementalArrows-B", xmlUCSIsSupplementalArrowsB}, {"SupplementalMathematicalOperators", xmlUCSIsSupplementalMathematicalOperators}, {"SupplementaryPrivateUseArea-A", xmlUCSIsSupplementaryPrivateUseAreaA}, {"SupplementaryPrivateUseArea-B", xmlUCSIsSupplementaryPrivateUseAreaB}, {"Syriac", xmlUCSIsSyriac}, {"Tagalog", xmlUCSIsTagalog}, {"Tagbanwa", xmlUCSIsTagbanwa}, {"Tags", xmlUCSIsTags}, {"TaiLe", xmlUCSIsTaiLe}, {"TaiXuanJingSymbols", xmlUCSIsTaiXuanJingSymbols}, {"Tamil", xmlUCSIsTamil}, {"Telugu", xmlUCSIsTelugu}, {"Thaana", xmlUCSIsThaana}, {"Thai", xmlUCSIsThai}, {"Tibetan", xmlUCSIsTibetan}, {"Ugaritic", xmlUCSIsUgaritic}, {"UnifiedCanadianAboriginalSyllabics", xmlUCSIsUnifiedCanadianAboriginalSyllabics}, {"VariationSelectors", xmlUCSIsVariationSelectors}, {"VariationSelectorsSupplement", xmlUCSIsVariationSelectorsSupplement}, {"YiRadicals", xmlUCSIsYiRadicals}, {"YiSyllables", xmlUCSIsYiSyllables}, {"YijingHexagramSymbols", xmlUCSIsYijingHexagramSymbols}}; static xmlUnicodeRange xmlUnicodeCats[] = { {"C", xmlUCSIsCatC}, {"Cc", xmlUCSIsCatCc}, {"Cf", xmlUCSIsCatCf}, {"Co", xmlUCSIsCatCo}, {"Cs", xmlUCSIsCatCs}, {"L", xmlUCSIsCatL}, {"Ll", xmlUCSIsCatLl}, {"Lm", xmlUCSIsCatLm}, {"Lo", xmlUCSIsCatLo}, {"Lt", xmlUCSIsCatLt}, {"Lu", xmlUCSIsCatLu}, {"M", xmlUCSIsCatM}, {"Mc", xmlUCSIsCatMc}, {"Me", xmlUCSIsCatMe}, {"Mn", xmlUCSIsCatMn}, {"N", xmlUCSIsCatN}, {"Nd", xmlUCSIsCatNd}, {"Nl", xmlUCSIsCatNl}, {"No", xmlUCSIsCatNo}, {"P", xmlUCSIsCatP}, {"Pc", xmlUCSIsCatPc}, {"Pd", xmlUCSIsCatPd}, {"Pe", xmlUCSIsCatPe}, {"Pf", xmlUCSIsCatPf}, {"Pi", xmlUCSIsCatPi}, {"Po", xmlUCSIsCatPo}, {"Ps", xmlUCSIsCatPs}, {"S", xmlUCSIsCatS}, {"Sc", xmlUCSIsCatSc}, {"Sk", xmlUCSIsCatSk}, {"Sm", xmlUCSIsCatSm}, {"So", xmlUCSIsCatSo}, {"Z", xmlUCSIsCatZ}, {"Zl", xmlUCSIsCatZl}, {"Zp", xmlUCSIsCatZp}, {"Zs", xmlUCSIsCatZs}}; static const xmlChSRange xmlCS[] = {{0x0, 0x1f}, {0x7f, 0x9f}, {0xad, 0xad}, {0x600, 0x603}, {0x6dd, 0x6dd}, {0x70f, 0x70f}, {0x17b4, 0x17b5}, {0x200b, 0x200f}, {0x202a, 0x202e}, {0x2060, 0x2063}, {0x206a, 0x206f}, {0xd800, 0xd800}, {0xdb7f, 0xdb80}, {0xdbff, 0xdc00}, {0xdfff, 0xe000}, {0xf8ff, 0xf8ff}, {0xfeff, 0xfeff}, {0xfff9, 0xfffb} }; static const xmlChLRange xmlCL[] = {{0x1d173, 0x1d17a}, {0xe0001, 0xe0001}, {0xe0020, 0xe007f}, {0xf0000, 0xf0000}, {0xffffd, 0xffffd}, {0x100000, 0x100000}, {0x10fffd, 0x10fffd} }; static xmlChRangeGroup xmlCG = {18,7,xmlCS,xmlCL}; static const xmlChSRange xmlCfS[] = {{0xad, 0xad}, {0x600, 0x603}, {0x6dd, 0x6dd}, {0x70f, 0x70f}, {0x17b4, 0x17b5}, {0x200b, 0x200f}, {0x202a, 0x202e}, {0x2060, 0x2063}, {0x206a, 0x206f}, {0xfeff, 0xfeff}, {0xfff9, 0xfffb} }; static const xmlChLRange xmlCfL[] = {{0x1d173, 0x1d17a}, {0xe0001, 0xe0001}, {0xe0020, 0xe007f} }; static xmlChRangeGroup xmlCfG = {11,3,xmlCfS,xmlCfL}; static const xmlChSRange xmlLS[] = {{0x41, 0x5a}, {0x61, 0x7a}, {0xaa, 0xaa}, {0xb5, 0xb5}, {0xba, 0xba}, {0xc0, 0xd6}, {0xd8, 0xf6}, {0xf8, 0x236}, {0x250, 0x2c1}, {0x2c6, 0x2d1}, {0x2e0, 0x2e4}, {0x2ee, 0x2ee}, {0x37a, 0x37a}, {0x386, 0x386}, {0x388, 0x38a}, {0x38c, 0x38c}, {0x38e, 0x3a1}, {0x3a3, 0x3ce}, {0x3d0, 0x3f5}, {0x3f7, 0x3fb}, {0x400, 0x481}, {0x48a, 0x4ce}, {0x4d0, 0x4f5}, {0x4f8, 0x4f9}, {0x500, 0x50f}, {0x531, 0x556}, {0x559, 0x559}, {0x561, 0x587}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, {0x640, 0x64a}, {0x66e, 0x66f}, {0x671, 0x6d3}, {0x6d5, 0x6d5}, {0x6e5, 0x6e6}, {0x6ee, 0x6ef}, {0x6fa, 0x6fc}, {0x6ff, 0x6ff}, {0x710, 0x710}, {0x712, 0x72f}, {0x74d, 0x74f}, {0x780, 0x7a5}, {0x7b1, 0x7b1}, {0x904, 0x939}, {0x93d, 0x93d}, {0x950, 0x950}, {0x958, 0x961}, {0x985, 0x98c}, {0x98f, 0x990}, {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, {0x9b6, 0x9b9}, {0x9bd, 0x9bd}, {0x9dc, 0x9dd}, {0x9df, 0x9e1}, {0x9f0, 0x9f1}, {0xa05, 0xa0a}, {0xa0f, 0xa10}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa32, 0xa33}, {0xa35, 0xa36}, {0xa38, 0xa39}, {0xa59, 0xa5c}, {0xa5e, 0xa5e}, {0xa72, 0xa74}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab2, 0xab3}, {0xab5, 0xab9}, {0xabd, 0xabd}, {0xad0, 0xad0}, {0xae0, 0xae1}, {0xb05, 0xb0c}, {0xb0f, 0xb10}, {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb32, 0xb33}, {0xb35, 0xb39}, {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, {0xb5f, 0xb61}, {0xb71, 0xb71}, {0xb83, 0xb83}, {0xb85, 0xb8a}, {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xb99, 0xb9a}, {0xb9c, 0xb9c}, {0xb9e, 0xb9f}, {0xba3, 0xba4}, {0xba8, 0xbaa}, {0xbae, 0xbb5}, {0xbb7, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc60, 0xc61}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xcbd, 0xcbd}, {0xcde, 0xcde}, {0xce0, 0xce1}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, {0xd12, 0xd28}, {0xd2a, 0xd39}, {0xd60, 0xd61}, {0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdbd, 0xdbd}, {0xdc0, 0xdc6}, {0xe01, 0xe30}, {0xe32, 0xe33}, {0xe40, 0xe46}, {0xe81, 0xe82}, {0xe84, 0xe84}, {0xe87, 0xe88}, {0xe8a, 0xe8a}, {0xe8d, 0xe8d}, {0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xea5, 0xea5}, {0xea7, 0xea7}, {0xeaa, 0xeab}, {0xead, 0xeb0}, {0xeb2, 0xeb3}, {0xebd, 0xebd}, {0xec0, 0xec4}, {0xec6, 0xec6}, {0xedc, 0xedd}, {0xf00, 0xf00}, {0xf40, 0xf47}, {0xf49, 0xf6a}, {0xf88, 0xf8b}, {0x1000, 0x1021}, {0x1023, 0x1027}, {0x1029, 0x102a}, {0x1050, 0x1055}, {0x10a0, 0x10c5}, {0x10d0, 0x10f8}, {0x1100, 0x1159}, {0x115f, 0x11a2}, {0x11a8, 0x11f9}, {0x1200, 0x1206}, {0x1208, 0x1246}, {0x1248, 0x1248}, {0x124a, 0x124d}, {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125a, 0x125d}, {0x1260, 0x1286}, {0x1288, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12ae}, {0x12b0, 0x12b0}, {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c0, 0x12c0}, {0x12c2, 0x12c5}, {0x12c8, 0x12ce}, {0x12d0, 0x12d6}, {0x12d8, 0x12ee}, {0x12f0, 0x130e}, {0x1310, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x131e}, {0x1320, 0x1346}, {0x1348, 0x135a}, {0x13a0, 0x13f4}, {0x1401, 0x166c}, {0x166f, 0x1676}, {0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x1700, 0x170c}, {0x170e, 0x1711}, {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176c}, {0x176e, 0x1770}, {0x1780, 0x17b3}, {0x17d7, 0x17d7}, {0x17dc, 0x17dc}, {0x1820, 0x1877}, {0x1880, 0x18a8}, {0x1900, 0x191c}, {0x1950, 0x196d}, {0x1970, 0x1974}, {0x1d00, 0x1d6b}, {0x1e00, 0x1e9b}, {0x1ea0, 0x1ef9}, {0x1f00, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f59, 0x1f59}, {0x1f5b, 0x1f5b}, {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc}, {0x2071, 0x2071}, {0x207f, 0x207f}, {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210a, 0x2113}, {0x2115, 0x2115}, {0x2119, 0x211d}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, {0x212a, 0x212d}, {0x212f, 0x2131}, {0x2133, 0x2139}, {0x213d, 0x213f}, {0x2145, 0x2149}, {0x3005, 0x3006}, {0x3031, 0x3035}, {0x303b, 0x303c}, {0x3041, 0x3096}, {0x309d, 0x309f}, {0x30a1, 0x30fa}, {0x30fc, 0x30ff}, {0x3105, 0x312c}, {0x3131, 0x318e}, {0x31a0, 0x31b7}, {0x31f0, 0x31ff}, {0x3400, 0x3400}, {0x4db5, 0x4db5}, {0x4e00, 0x4e00}, {0x9fa5, 0x9fa5}, {0xa000, 0xa48c}, {0xac00, 0xac00}, {0xd7a3, 0xd7a3}, {0xf900, 0xfa2d}, {0xfa30, 0xfa6a}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xfb1d, 0xfb1d}, {0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb3e, 0xfb3e}, {0xfb40, 0xfb41}, {0xfb43, 0xfb44}, {0xfb46, 0xfbb1}, {0xfbd3, 0xfd3d}, {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, {0xfe70, 0xfe74}, {0xfe76, 0xfefc}, {0xff21, 0xff3a}, {0xff41, 0xff5a}, {0xff66, 0xffbe}, {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc} }; static const xmlChLRange xmlLL[] = {{0x10000, 0x1000b}, {0x1000d, 0x10026}, {0x10028, 0x1003a}, {0x1003c, 0x1003d}, {0x1003f, 0x1004d}, {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10300, 0x1031e}, {0x10330, 0x10349}, {0x10380, 0x1039d}, {0x10400, 0x1049d}, {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080a, 0x10835}, {0x10837, 0x10838}, {0x1083c, 0x1083c}, {0x1083f, 0x1083f}, {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d49e, 0x1d49f}, {0x1d4a2, 0x1d4a2}, {0x1d4a5, 0x1d4a6}, {0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b9}, {0x1d4bb, 0x1d4bb}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e}, {0x1d540, 0x1d544}, {0x1d546, 0x1d546}, {0x1d54a, 0x1d550}, {0x1d552, 0x1d6a3}, {0x1d6a8, 0x1d6c0}, {0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6fa}, {0x1d6fc, 0x1d714}, {0x1d716, 0x1d734}, {0x1d736, 0x1d74e}, {0x1d750, 0x1d76e}, {0x1d770, 0x1d788}, {0x1d78a, 0x1d7a8}, {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9}, {0x20000, 0x20000}, {0x2a6d6, 0x2a6d6}, {0x2f800, 0x2fa1d} }; static xmlChRangeGroup xmlLG = {279,50,xmlLS,xmlLL}; static const xmlChSRange xmlLlS[] = {{0x61, 0x7a}, {0xaa, 0xaa}, {0xb5, 0xb5}, {0xba, 0xba}, {0xdf, 0xf6}, {0xf8, 0xff}, {0x101, 0x101}, {0x103, 0x103}, {0x105, 0x105}, {0x107, 0x107}, {0x109, 0x109}, {0x10b, 0x10b}, {0x10d, 0x10d}, {0x10f, 0x10f}, {0x111, 0x111}, {0x113, 0x113}, {0x115, 0x115}, {0x117, 0x117}, {0x119, 0x119}, {0x11b, 0x11b}, {0x11d, 0x11d}, {0x11f, 0x11f}, {0x121, 0x121}, {0x123, 0x123}, {0x125, 0x125}, {0x127, 0x127}, {0x129, 0x129}, {0x12b, 0x12b}, {0x12d, 0x12d}, {0x12f, 0x12f}, {0x131, 0x131}, {0x133, 0x133}, {0x135, 0x135}, {0x137, 0x138}, {0x13a, 0x13a}, {0x13c, 0x13c}, {0x13e, 0x13e}, {0x140, 0x140}, {0x142, 0x142}, {0x144, 0x144}, {0x146, 0x146}, {0x148, 0x149}, {0x14b, 0x14b}, {0x14d, 0x14d}, {0x14f, 0x14f}, {0x151, 0x151}, {0x153, 0x153}, {0x155, 0x155}, {0x157, 0x157}, {0x159, 0x159}, {0x15b, 0x15b}, {0x15d, 0x15d}, {0x15f, 0x15f}, {0x161, 0x161}, {0x163, 0x163}, {0x165, 0x165}, {0x167, 0x167}, {0x169, 0x169}, {0x16b, 0x16b}, {0x16d, 0x16d}, {0x16f, 0x16f}, {0x171, 0x171}, {0x173, 0x173}, {0x175, 0x175}, {0x177, 0x177}, {0x17a, 0x17a}, {0x17c, 0x17c}, {0x17e, 0x180}, {0x183, 0x183}, {0x185, 0x185}, {0x188, 0x188}, {0x18c, 0x18d}, {0x192, 0x192}, {0x195, 0x195}, {0x199, 0x19b}, {0x19e, 0x19e}, {0x1a1, 0x1a1}, {0x1a3, 0x1a3}, {0x1a5, 0x1a5}, {0x1a8, 0x1a8}, {0x1aa, 0x1ab}, {0x1ad, 0x1ad}, {0x1b0, 0x1b0}, {0x1b4, 0x1b4}, {0x1b6, 0x1b6}, {0x1b9, 0x1ba}, {0x1bd, 0x1bf}, {0x1c6, 0x1c6}, {0x1c9, 0x1c9}, {0x1cc, 0x1cc}, {0x1ce, 0x1ce}, {0x1d0, 0x1d0}, {0x1d2, 0x1d2}, {0x1d4, 0x1d4}, {0x1d6, 0x1d6}, {0x1d8, 0x1d8}, {0x1da, 0x1da}, {0x1dc, 0x1dd}, {0x1df, 0x1df}, {0x1e1, 0x1e1}, {0x1e3, 0x1e3}, {0x1e5, 0x1e5}, {0x1e7, 0x1e7}, {0x1e9, 0x1e9}, {0x1eb, 0x1eb}, {0x1ed, 0x1ed}, {0x1ef, 0x1f0}, {0x1f3, 0x1f3}, {0x1f5, 0x1f5}, {0x1f9, 0x1f9}, {0x1fb, 0x1fb}, {0x1fd, 0x1fd}, {0x1ff, 0x1ff}, {0x201, 0x201}, {0x203, 0x203}, {0x205, 0x205}, {0x207, 0x207}, {0x209, 0x209}, {0x20b, 0x20b}, {0x20d, 0x20d}, {0x20f, 0x20f}, {0x211, 0x211}, {0x213, 0x213}, {0x215, 0x215}, {0x217, 0x217}, {0x219, 0x219}, {0x21b, 0x21b}, {0x21d, 0x21d}, {0x21f, 0x21f}, {0x221, 0x221}, {0x223, 0x223}, {0x225, 0x225}, {0x227, 0x227}, {0x229, 0x229}, {0x22b, 0x22b}, {0x22d, 0x22d}, {0x22f, 0x22f}, {0x231, 0x231}, {0x233, 0x236}, {0x250, 0x2af}, {0x390, 0x390}, {0x3ac, 0x3ce}, {0x3d0, 0x3d1}, {0x3d5, 0x3d7}, {0x3d9, 0x3d9}, {0x3db, 0x3db}, {0x3dd, 0x3dd}, {0x3df, 0x3df}, {0x3e1, 0x3e1}, {0x3e3, 0x3e3}, {0x3e5, 0x3e5}, {0x3e7, 0x3e7}, {0x3e9, 0x3e9}, {0x3eb, 0x3eb}, {0x3ed, 0x3ed}, {0x3ef, 0x3f3}, {0x3f5, 0x3f5}, {0x3f8, 0x3f8}, {0x3fb, 0x3fb}, {0x430, 0x45f}, {0x461, 0x461}, {0x463, 0x463}, {0x465, 0x465}, {0x467, 0x467}, {0x469, 0x469}, {0x46b, 0x46b}, {0x46d, 0x46d}, {0x46f, 0x46f}, {0x471, 0x471}, {0x473, 0x473}, {0x475, 0x475}, {0x477, 0x477}, {0x479, 0x479}, {0x47b, 0x47b}, {0x47d, 0x47d}, {0x47f, 0x47f}, {0x481, 0x481}, {0x48b, 0x48b}, {0x48d, 0x48d}, {0x48f, 0x48f}, {0x491, 0x491}, {0x493, 0x493}, {0x495, 0x495}, {0x497, 0x497}, {0x499, 0x499}, {0x49b, 0x49b}, {0x49d, 0x49d}, {0x49f, 0x49f}, {0x4a1, 0x4a1}, {0x4a3, 0x4a3}, {0x4a5, 0x4a5}, {0x4a7, 0x4a7}, {0x4a9, 0x4a9}, {0x4ab, 0x4ab}, {0x4ad, 0x4ad}, {0x4af, 0x4af}, {0x4b1, 0x4b1}, {0x4b3, 0x4b3}, {0x4b5, 0x4b5}, {0x4b7, 0x4b7}, {0x4b9, 0x4b9}, {0x4bb, 0x4bb}, {0x4bd, 0x4bd}, {0x4bf, 0x4bf}, {0x4c2, 0x4c2}, {0x4c4, 0x4c4}, {0x4c6, 0x4c6}, {0x4c8, 0x4c8}, {0x4ca, 0x4ca}, {0x4cc, 0x4cc}, {0x4ce, 0x4ce}, {0x4d1, 0x4d1}, {0x4d3, 0x4d3}, {0x4d5, 0x4d5}, {0x4d7, 0x4d7}, {0x4d9, 0x4d9}, {0x4db, 0x4db}, {0x4dd, 0x4dd}, {0x4df, 0x4df}, {0x4e1, 0x4e1}, {0x4e3, 0x4e3}, {0x4e5, 0x4e5}, {0x4e7, 0x4e7}, {0x4e9, 0x4e9}, {0x4eb, 0x4eb}, {0x4ed, 0x4ed}, {0x4ef, 0x4ef}, {0x4f1, 0x4f1}, {0x4f3, 0x4f3}, {0x4f5, 0x4f5}, {0x4f9, 0x4f9}, {0x501, 0x501}, {0x503, 0x503}, {0x505, 0x505}, {0x507, 0x507}, {0x509, 0x509}, {0x50b, 0x50b}, {0x50d, 0x50d}, {0x50f, 0x50f}, {0x561, 0x587}, {0x1d00, 0x1d2b}, {0x1d62, 0x1d6b}, {0x1e01, 0x1e01}, {0x1e03, 0x1e03}, {0x1e05, 0x1e05}, {0x1e07, 0x1e07}, {0x1e09, 0x1e09}, {0x1e0b, 0x1e0b}, {0x1e0d, 0x1e0d}, {0x1e0f, 0x1e0f}, {0x1e11, 0x1e11}, {0x1e13, 0x1e13}, {0x1e15, 0x1e15}, {0x1e17, 0x1e17}, {0x1e19, 0x1e19}, {0x1e1b, 0x1e1b}, {0x1e1d, 0x1e1d}, {0x1e1f, 0x1e1f}, {0x1e21, 0x1e21}, {0x1e23, 0x1e23}, {0x1e25, 0x1e25}, {0x1e27, 0x1e27}, {0x1e29, 0x1e29}, {0x1e2b, 0x1e2b}, {0x1e2d, 0x1e2d}, {0x1e2f, 0x1e2f}, {0x1e31, 0x1e31}, {0x1e33, 0x1e33}, {0x1e35, 0x1e35}, {0x1e37, 0x1e37}, {0x1e39, 0x1e39}, {0x1e3b, 0x1e3b}, {0x1e3d, 0x1e3d}, {0x1e3f, 0x1e3f}, {0x1e41, 0x1e41}, {0x1e43, 0x1e43}, {0x1e45, 0x1e45}, {0x1e47, 0x1e47}, {0x1e49, 0x1e49}, {0x1e4b, 0x1e4b}, {0x1e4d, 0x1e4d}, {0x1e4f, 0x1e4f}, {0x1e51, 0x1e51}, {0x1e53, 0x1e53}, {0x1e55, 0x1e55}, {0x1e57, 0x1e57}, {0x1e59, 0x1e59}, {0x1e5b, 0x1e5b}, {0x1e5d, 0x1e5d}, {0x1e5f, 0x1e5f}, {0x1e61, 0x1e61}, {0x1e63, 0x1e63}, {0x1e65, 0x1e65}, {0x1e67, 0x1e67}, {0x1e69, 0x1e69}, {0x1e6b, 0x1e6b}, {0x1e6d, 0x1e6d}, {0x1e6f, 0x1e6f}, {0x1e71, 0x1e71}, {0x1e73, 0x1e73}, {0x1e75, 0x1e75}, {0x1e77, 0x1e77}, {0x1e79, 0x1e79}, {0x1e7b, 0x1e7b}, {0x1e7d, 0x1e7d}, {0x1e7f, 0x1e7f}, {0x1e81, 0x1e81}, {0x1e83, 0x1e83}, {0x1e85, 0x1e85}, {0x1e87, 0x1e87}, {0x1e89, 0x1e89}, {0x1e8b, 0x1e8b}, {0x1e8d, 0x1e8d}, {0x1e8f, 0x1e8f}, {0x1e91, 0x1e91}, {0x1e93, 0x1e93}, {0x1e95, 0x1e9b}, {0x1ea1, 0x1ea1}, {0x1ea3, 0x1ea3}, {0x1ea5, 0x1ea5}, {0x1ea7, 0x1ea7}, {0x1ea9, 0x1ea9}, {0x1eab, 0x1eab}, {0x1ead, 0x1ead}, {0x1eaf, 0x1eaf}, {0x1eb1, 0x1eb1}, {0x1eb3, 0x1eb3}, {0x1eb5, 0x1eb5}, {0x1eb7, 0x1eb7}, {0x1eb9, 0x1eb9}, {0x1ebb, 0x1ebb}, {0x1ebd, 0x1ebd}, {0x1ebf, 0x1ebf}, {0x1ec1, 0x1ec1}, {0x1ec3, 0x1ec3}, {0x1ec5, 0x1ec5}, {0x1ec7, 0x1ec7}, {0x1ec9, 0x1ec9}, {0x1ecb, 0x1ecb}, {0x1ecd, 0x1ecd}, {0x1ecf, 0x1ecf}, {0x1ed1, 0x1ed1}, {0x1ed3, 0x1ed3}, {0x1ed5, 0x1ed5}, {0x1ed7, 0x1ed7}, {0x1ed9, 0x1ed9}, {0x1edb, 0x1edb}, {0x1edd, 0x1edd}, {0x1edf, 0x1edf}, {0x1ee1, 0x1ee1}, {0x1ee3, 0x1ee3}, {0x1ee5, 0x1ee5}, {0x1ee7, 0x1ee7}, {0x1ee9, 0x1ee9}, {0x1eeb, 0x1eeb}, {0x1eed, 0x1eed}, {0x1eef, 0x1eef}, {0x1ef1, 0x1ef1}, {0x1ef3, 0x1ef3}, {0x1ef5, 0x1ef5}, {0x1ef7, 0x1ef7}, {0x1ef9, 0x1ef9}, {0x1f00, 0x1f07}, {0x1f10, 0x1f15}, {0x1f20, 0x1f27}, {0x1f30, 0x1f37}, {0x1f40, 0x1f45}, {0x1f50, 0x1f57}, {0x1f60, 0x1f67}, {0x1f70, 0x1f7d}, {0x1f80, 0x1f87}, {0x1f90, 0x1f97}, {0x1fa0, 0x1fa7}, {0x1fb0, 0x1fb4}, {0x1fb6, 0x1fb7}, {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fc7}, {0x1fd0, 0x1fd3}, {0x1fd6, 0x1fd7}, {0x1fe0, 0x1fe7}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ff7}, {0x2071, 0x2071}, {0x207f, 0x207f}, {0x210a, 0x210a}, {0x210e, 0x210f}, {0x2113, 0x2113}, {0x212f, 0x212f}, {0x2134, 0x2134}, {0x2139, 0x2139}, {0x213d, 0x213d}, {0x2146, 0x2149}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xff41, 0xff5a} }; static const xmlChLRange xmlLlL[] = {{0x10428, 0x1044f}, {0x1d41a, 0x1d433}, {0x1d44e, 0x1d454}, {0x1d456, 0x1d467}, {0x1d482, 0x1d49b}, {0x1d4b6, 0x1d4b9}, {0x1d4bb, 0x1d4bb}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d4cf}, {0x1d4ea, 0x1d503}, {0x1d51e, 0x1d537}, {0x1d552, 0x1d56b}, {0x1d586, 0x1d59f}, {0x1d5ba, 0x1d5d3}, {0x1d5ee, 0x1d607}, {0x1d622, 0x1d63b}, {0x1d656, 0x1d66f}, {0x1d68a, 0x1d6a3}, {0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6e1}, {0x1d6fc, 0x1d714}, {0x1d716, 0x1d71b}, {0x1d736, 0x1d74e}, {0x1d750, 0x1d755}, {0x1d770, 0x1d788}, {0x1d78a, 0x1d78f}, {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9} }; static xmlChRangeGroup xmlLlG = {396,28,xmlLlS,xmlLlL}; static const xmlChSRange xmlLmS[] = {{0x2b0, 0x2c1}, {0x2c6, 0x2d1}, {0x2e0, 0x2e4}, {0x2ee, 0x2ee}, {0x37a, 0x37a}, {0x559, 0x559}, {0x640, 0x640}, {0x6e5, 0x6e6}, {0xe46, 0xe46}, {0xec6, 0xec6}, {0x17d7, 0x17d7}, {0x1843, 0x1843}, {0x1d2c, 0x1d61}, {0x3005, 0x3005}, {0x3031, 0x3035}, {0x303b, 0x303b}, {0x309d, 0x309e}, {0x30fc, 0x30fe}, {0xff70, 0xff70}, {0xff9e, 0xff9f} }; static xmlChRangeGroup xmlLmG = {20,0,xmlLmS,NULL}; static const xmlChSRange xmlLoS[] = {{0x1bb, 0x1bb}, {0x1c0, 0x1c3}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, {0x641, 0x64a}, {0x66e, 0x66f}, {0x671, 0x6d3}, {0x6d5, 0x6d5}, {0x6ee, 0x6ef}, {0x6fa, 0x6fc}, {0x6ff, 0x6ff}, {0x710, 0x710}, {0x712, 0x72f}, {0x74d, 0x74f}, {0x780, 0x7a5}, {0x7b1, 0x7b1}, {0x904, 0x939}, {0x93d, 0x93d}, {0x950, 0x950}, {0x958, 0x961}, {0x985, 0x98c}, {0x98f, 0x990}, {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, {0x9b6, 0x9b9}, {0x9bd, 0x9bd}, {0x9dc, 0x9dd}, {0x9df, 0x9e1}, {0x9f0, 0x9f1}, {0xa05, 0xa0a}, {0xa0f, 0xa10}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa32, 0xa33}, {0xa35, 0xa36}, {0xa38, 0xa39}, {0xa59, 0xa5c}, {0xa5e, 0xa5e}, {0xa72, 0xa74}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab2, 0xab3}, {0xab5, 0xab9}, {0xabd, 0xabd}, {0xad0, 0xad0}, {0xae0, 0xae1}, {0xb05, 0xb0c}, {0xb0f, 0xb10}, {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb32, 0xb33}, {0xb35, 0xb39}, {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, {0xb5f, 0xb61}, {0xb71, 0xb71}, {0xb83, 0xb83}, {0xb85, 0xb8a}, {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xb99, 0xb9a}, {0xb9c, 0xb9c}, {0xb9e, 0xb9f}, {0xba3, 0xba4}, {0xba8, 0xbaa}, {0xbae, 0xbb5}, {0xbb7, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc60, 0xc61}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xcbd, 0xcbd}, {0xcde, 0xcde}, {0xce0, 0xce1}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, {0xd12, 0xd28}, {0xd2a, 0xd39}, {0xd60, 0xd61}, {0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdbd, 0xdbd}, {0xdc0, 0xdc6}, {0xe01, 0xe30}, {0xe32, 0xe33}, {0xe40, 0xe45}, {0xe81, 0xe82}, {0xe84, 0xe84}, {0xe87, 0xe88}, {0xe8a, 0xe8a}, {0xe8d, 0xe8d}, {0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xea5, 0xea5}, {0xea7, 0xea7}, {0xeaa, 0xeab}, {0xead, 0xeb0}, {0xeb2, 0xeb3}, {0xebd, 0xebd}, {0xec0, 0xec4}, {0xedc, 0xedd}, {0xf00, 0xf00}, {0xf40, 0xf47}, {0xf49, 0xf6a}, {0xf88, 0xf8b}, {0x1000, 0x1021}, {0x1023, 0x1027}, {0x1029, 0x102a}, {0x1050, 0x1055}, {0x10d0, 0x10f8}, {0x1100, 0x1159}, {0x115f, 0x11a2}, {0x11a8, 0x11f9}, {0x1200, 0x1206}, {0x1208, 0x1246}, {0x1248, 0x1248}, {0x124a, 0x124d}, {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125a, 0x125d}, {0x1260, 0x1286}, {0x1288, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12ae}, {0x12b0, 0x12b0}, {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c0, 0x12c0}, {0x12c2, 0x12c5}, {0x12c8, 0x12ce}, {0x12d0, 0x12d6}, {0x12d8, 0x12ee}, {0x12f0, 0x130e}, {0x1310, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x131e}, {0x1320, 0x1346}, {0x1348, 0x135a}, {0x13a0, 0x13f4}, {0x1401, 0x166c}, {0x166f, 0x1676}, {0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x1700, 0x170c}, {0x170e, 0x1711}, {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176c}, {0x176e, 0x1770}, {0x1780, 0x17b3}, {0x17dc, 0x17dc}, {0x1820, 0x1842}, {0x1844, 0x1877}, {0x1880, 0x18a8}, {0x1900, 0x191c}, {0x1950, 0x196d}, {0x1970, 0x1974}, {0x2135, 0x2138}, {0x3006, 0x3006}, {0x303c, 0x303c}, {0x3041, 0x3096}, {0x309f, 0x309f}, {0x30a1, 0x30fa}, {0x30ff, 0x30ff}, {0x3105, 0x312c}, {0x3131, 0x318e}, {0x31a0, 0x31b7}, {0x31f0, 0x31ff}, {0x3400, 0x3400}, {0x4db5, 0x4db5}, {0x4e00, 0x4e00}, {0x9fa5, 0x9fa5}, {0xa000, 0xa48c}, {0xac00, 0xac00}, {0xd7a3, 0xd7a3}, {0xf900, 0xfa2d}, {0xfa30, 0xfa6a}, {0xfb1d, 0xfb1d}, {0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb3e, 0xfb3e}, {0xfb40, 0xfb41}, {0xfb43, 0xfb44}, {0xfb46, 0xfbb1}, {0xfbd3, 0xfd3d}, {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, {0xfe70, 0xfe74}, {0xfe76, 0xfefc}, {0xff66, 0xff6f}, {0xff71, 0xff9d}, {0xffa0, 0xffbe}, {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc} }; static const xmlChLRange xmlLoL[] = {{0x10000, 0x1000b}, {0x1000d, 0x10026}, {0x10028, 0x1003a}, {0x1003c, 0x1003d}, {0x1003f, 0x1004d}, {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10300, 0x1031e}, {0x10330, 0x10349}, {0x10380, 0x1039d}, {0x10450, 0x1049d}, {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080a, 0x10835}, {0x10837, 0x10838}, {0x1083c, 0x1083c}, {0x1083f, 0x1083f}, {0x20000, 0x20000}, {0x2a6d6, 0x2a6d6}, {0x2f800, 0x2fa1d} }; static xmlChRangeGroup xmlLoG = {211,20,xmlLoS,xmlLoL}; static const xmlChSRange xmlLtS[] = {{0x1c5, 0x1c5}, {0x1c8, 0x1c8}, {0x1cb, 0x1cb}, {0x1f2, 0x1f2}, {0x1f88, 0x1f8f}, {0x1f98, 0x1f9f}, {0x1fa8, 0x1faf}, {0x1fbc, 0x1fbc}, {0x1fcc, 0x1fcc}, {0x1ffc, 0x1ffc} }; static xmlChRangeGroup xmlLtG = {10,0,xmlLtS,NULL}; static const xmlChSRange xmlLuS[] = {{0x41, 0x5a}, {0xc0, 0xd6}, {0xd8, 0xde}, {0x100, 0x100}, {0x102, 0x102}, {0x104, 0x104}, {0x106, 0x106}, {0x108, 0x108}, {0x10a, 0x10a}, {0x10c, 0x10c}, {0x10e, 0x10e}, {0x110, 0x110}, {0x112, 0x112}, {0x114, 0x114}, {0x116, 0x116}, {0x118, 0x118}, {0x11a, 0x11a}, {0x11c, 0x11c}, {0x11e, 0x11e}, {0x120, 0x120}, {0x122, 0x122}, {0x124, 0x124}, {0x126, 0x126}, {0x128, 0x128}, {0x12a, 0x12a}, {0x12c, 0x12c}, {0x12e, 0x12e}, {0x130, 0x130}, {0x132, 0x132}, {0x134, 0x134}, {0x136, 0x136}, {0x139, 0x139}, {0x13b, 0x13b}, {0x13d, 0x13d}, {0x13f, 0x13f}, {0x141, 0x141}, {0x143, 0x143}, {0x145, 0x145}, {0x147, 0x147}, {0x14a, 0x14a}, {0x14c, 0x14c}, {0x14e, 0x14e}, {0x150, 0x150}, {0x152, 0x152}, {0x154, 0x154}, {0x156, 0x156}, {0x158, 0x158}, {0x15a, 0x15a}, {0x15c, 0x15c}, {0x15e, 0x15e}, {0x160, 0x160}, {0x162, 0x162}, {0x164, 0x164}, {0x166, 0x166}, {0x168, 0x168}, {0x16a, 0x16a}, {0x16c, 0x16c}, {0x16e, 0x16e}, {0x170, 0x170}, {0x172, 0x172}, {0x174, 0x174}, {0x176, 0x176}, {0x178, 0x179}, {0x17b, 0x17b}, {0x17d, 0x17d}, {0x181, 0x182}, {0x184, 0x184}, {0x186, 0x187}, {0x189, 0x18b}, {0x18e, 0x191}, {0x193, 0x194}, {0x196, 0x198}, {0x19c, 0x19d}, {0x19f, 0x1a0}, {0x1a2, 0x1a2}, {0x1a4, 0x1a4}, {0x1a6, 0x1a7}, {0x1a9, 0x1a9}, {0x1ac, 0x1ac}, {0x1ae, 0x1af}, {0x1b1, 0x1b3}, {0x1b5, 0x1b5}, {0x1b7, 0x1b8}, {0x1bc, 0x1bc}, {0x1c4, 0x1c4}, {0x1c7, 0x1c7}, {0x1ca, 0x1ca}, {0x1cd, 0x1cd}, {0x1cf, 0x1cf}, {0x1d1, 0x1d1}, {0x1d3, 0x1d3}, {0x1d5, 0x1d5}, {0x1d7, 0x1d7}, {0x1d9, 0x1d9}, {0x1db, 0x1db}, {0x1de, 0x1de}, {0x1e0, 0x1e0}, {0x1e2, 0x1e2}, {0x1e4, 0x1e4}, {0x1e6, 0x1e6}, {0x1e8, 0x1e8}, {0x1ea, 0x1ea}, {0x1ec, 0x1ec}, {0x1ee, 0x1ee}, {0x1f1, 0x1f1}, {0x1f4, 0x1f4}, {0x1f6, 0x1f8}, {0x1fa, 0x1fa}, {0x1fc, 0x1fc}, {0x1fe, 0x1fe}, {0x200, 0x200}, {0x202, 0x202}, {0x204, 0x204}, {0x206, 0x206}, {0x208, 0x208}, {0x20a, 0x20a}, {0x20c, 0x20c}, {0x20e, 0x20e}, {0x210, 0x210}, {0x212, 0x212}, {0x214, 0x214}, {0x216, 0x216}, {0x218, 0x218}, {0x21a, 0x21a}, {0x21c, 0x21c}, {0x21e, 0x21e}, {0x220, 0x220}, {0x222, 0x222}, {0x224, 0x224}, {0x226, 0x226}, {0x228, 0x228}, {0x22a, 0x22a}, {0x22c, 0x22c}, {0x22e, 0x22e}, {0x230, 0x230}, {0x232, 0x232}, {0x386, 0x386}, {0x388, 0x38a}, {0x38c, 0x38c}, {0x38e, 0x38f}, {0x391, 0x3a1}, {0x3a3, 0x3ab}, {0x3d2, 0x3d4}, {0x3d8, 0x3d8}, {0x3da, 0x3da}, {0x3dc, 0x3dc}, {0x3de, 0x3de}, {0x3e0, 0x3e0}, {0x3e2, 0x3e2}, {0x3e4, 0x3e4}, {0x3e6, 0x3e6}, {0x3e8, 0x3e8}, {0x3ea, 0x3ea}, {0x3ec, 0x3ec}, {0x3ee, 0x3ee}, {0x3f4, 0x3f4}, {0x3f7, 0x3f7}, {0x3f9, 0x3fa}, {0x400, 0x42f}, {0x460, 0x460}, {0x462, 0x462}, {0x464, 0x464}, {0x466, 0x466}, {0x468, 0x468}, {0x46a, 0x46a}, {0x46c, 0x46c}, {0x46e, 0x46e}, {0x470, 0x470}, {0x472, 0x472}, {0x474, 0x474}, {0x476, 0x476}, {0x478, 0x478}, {0x47a, 0x47a}, {0x47c, 0x47c}, {0x47e, 0x47e}, {0x480, 0x480}, {0x48a, 0x48a}, {0x48c, 0x48c}, {0x48e, 0x48e}, {0x490, 0x490}, {0x492, 0x492}, {0x494, 0x494}, {0x496, 0x496}, {0x498, 0x498}, {0x49a, 0x49a}, {0x49c, 0x49c}, {0x49e, 0x49e}, {0x4a0, 0x4a0}, {0x4a2, 0x4a2}, {0x4a4, 0x4a4}, {0x4a6, 0x4a6}, {0x4a8, 0x4a8}, {0x4aa, 0x4aa}, {0x4ac, 0x4ac}, {0x4ae, 0x4ae}, {0x4b0, 0x4b0}, {0x4b2, 0x4b2}, {0x4b4, 0x4b4}, {0x4b6, 0x4b6}, {0x4b8, 0x4b8}, {0x4ba, 0x4ba}, {0x4bc, 0x4bc}, {0x4be, 0x4be}, {0x4c0, 0x4c1}, {0x4c3, 0x4c3}, {0x4c5, 0x4c5}, {0x4c7, 0x4c7}, {0x4c9, 0x4c9}, {0x4cb, 0x4cb}, {0x4cd, 0x4cd}, {0x4d0, 0x4d0}, {0x4d2, 0x4d2}, {0x4d4, 0x4d4}, {0x4d6, 0x4d6}, {0x4d8, 0x4d8}, {0x4da, 0x4da}, {0x4dc, 0x4dc}, {0x4de, 0x4de}, {0x4e0, 0x4e0}, {0x4e2, 0x4e2}, {0x4e4, 0x4e4}, {0x4e6, 0x4e6}, {0x4e8, 0x4e8}, {0x4ea, 0x4ea}, {0x4ec, 0x4ec}, {0x4ee, 0x4ee}, {0x4f0, 0x4f0}, {0x4f2, 0x4f2}, {0x4f4, 0x4f4}, {0x4f8, 0x4f8}, {0x500, 0x500}, {0x502, 0x502}, {0x504, 0x504}, {0x506, 0x506}, {0x508, 0x508}, {0x50a, 0x50a}, {0x50c, 0x50c}, {0x50e, 0x50e}, {0x531, 0x556}, {0x10a0, 0x10c5}, {0x1e00, 0x1e00}, {0x1e02, 0x1e02}, {0x1e04, 0x1e04}, {0x1e06, 0x1e06}, {0x1e08, 0x1e08}, {0x1e0a, 0x1e0a}, {0x1e0c, 0x1e0c}, {0x1e0e, 0x1e0e}, {0x1e10, 0x1e10}, {0x1e12, 0x1e12}, {0x1e14, 0x1e14}, {0x1e16, 0x1e16}, {0x1e18, 0x1e18}, {0x1e1a, 0x1e1a}, {0x1e1c, 0x1e1c}, {0x1e1e, 0x1e1e}, {0x1e20, 0x1e20}, {0x1e22, 0x1e22}, {0x1e24, 0x1e24}, {0x1e26, 0x1e26}, {0x1e28, 0x1e28}, {0x1e2a, 0x1e2a}, {0x1e2c, 0x1e2c}, {0x1e2e, 0x1e2e}, {0x1e30, 0x1e30}, {0x1e32, 0x1e32}, {0x1e34, 0x1e34}, {0x1e36, 0x1e36}, {0x1e38, 0x1e38}, {0x1e3a, 0x1e3a}, {0x1e3c, 0x1e3c}, {0x1e3e, 0x1e3e}, {0x1e40, 0x1e40}, {0x1e42, 0x1e42}, {0x1e44, 0x1e44}, {0x1e46, 0x1e46}, {0x1e48, 0x1e48}, {0x1e4a, 0x1e4a}, {0x1e4c, 0x1e4c}, {0x1e4e, 0x1e4e}, {0x1e50, 0x1e50}, {0x1e52, 0x1e52}, {0x1e54, 0x1e54}, {0x1e56, 0x1e56}, {0x1e58, 0x1e58}, {0x1e5a, 0x1e5a}, {0x1e5c, 0x1e5c}, {0x1e5e, 0x1e5e}, {0x1e60, 0x1e60}, {0x1e62, 0x1e62}, {0x1e64, 0x1e64}, {0x1e66, 0x1e66}, {0x1e68, 0x1e68}, {0x1e6a, 0x1e6a}, {0x1e6c, 0x1e6c}, {0x1e6e, 0x1e6e}, {0x1e70, 0x1e70}, {0x1e72, 0x1e72}, {0x1e74, 0x1e74}, {0x1e76, 0x1e76}, {0x1e78, 0x1e78}, {0x1e7a, 0x1e7a}, {0x1e7c, 0x1e7c}, {0x1e7e, 0x1e7e}, {0x1e80, 0x1e80}, {0x1e82, 0x1e82}, {0x1e84, 0x1e84}, {0x1e86, 0x1e86}, {0x1e88, 0x1e88}, {0x1e8a, 0x1e8a}, {0x1e8c, 0x1e8c}, {0x1e8e, 0x1e8e}, {0x1e90, 0x1e90}, {0x1e92, 0x1e92}, {0x1e94, 0x1e94}, {0x1ea0, 0x1ea0}, {0x1ea2, 0x1ea2}, {0x1ea4, 0x1ea4}, {0x1ea6, 0x1ea6}, {0x1ea8, 0x1ea8}, {0x1eaa, 0x1eaa}, {0x1eac, 0x1eac}, {0x1eae, 0x1eae}, {0x1eb0, 0x1eb0}, {0x1eb2, 0x1eb2}, {0x1eb4, 0x1eb4}, {0x1eb6, 0x1eb6}, {0x1eb8, 0x1eb8}, {0x1eba, 0x1eba}, {0x1ebc, 0x1ebc}, {0x1ebe, 0x1ebe}, {0x1ec0, 0x1ec0}, {0x1ec2, 0x1ec2}, {0x1ec4, 0x1ec4}, {0x1ec6, 0x1ec6}, {0x1ec8, 0x1ec8}, {0x1eca, 0x1eca}, {0x1ecc, 0x1ecc}, {0x1ece, 0x1ece}, {0x1ed0, 0x1ed0}, {0x1ed2, 0x1ed2}, {0x1ed4, 0x1ed4}, {0x1ed6, 0x1ed6}, {0x1ed8, 0x1ed8}, {0x1eda, 0x1eda}, {0x1edc, 0x1edc}, {0x1ede, 0x1ede}, {0x1ee0, 0x1ee0}, {0x1ee2, 0x1ee2}, {0x1ee4, 0x1ee4}, {0x1ee6, 0x1ee6}, {0x1ee8, 0x1ee8}, {0x1eea, 0x1eea}, {0x1eec, 0x1eec}, {0x1eee, 0x1eee}, {0x1ef0, 0x1ef0}, {0x1ef2, 0x1ef2}, {0x1ef4, 0x1ef4}, {0x1ef6, 0x1ef6}, {0x1ef8, 0x1ef8}, {0x1f08, 0x1f0f}, {0x1f18, 0x1f1d}, {0x1f28, 0x1f2f}, {0x1f38, 0x1f3f}, {0x1f48, 0x1f4d}, {0x1f59, 0x1f59}, {0x1f5b, 0x1f5b}, {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f5f}, {0x1f68, 0x1f6f}, {0x1fb8, 0x1fbb}, {0x1fc8, 0x1fcb}, {0x1fd8, 0x1fdb}, {0x1fe8, 0x1fec}, {0x1ff8, 0x1ffb}, {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210b, 0x210d}, {0x2110, 0x2112}, {0x2115, 0x2115}, {0x2119, 0x211d}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, {0x212a, 0x212d}, {0x2130, 0x2131}, {0x2133, 0x2133}, {0x213e, 0x213f}, {0x2145, 0x2145}, {0xff21, 0xff3a} }; static const xmlChLRange xmlLuL[] = {{0x10400, 0x10427}, {0x1d400, 0x1d419}, {0x1d434, 0x1d44d}, {0x1d468, 0x1d481}, {0x1d49c, 0x1d49c}, {0x1d49e, 0x1d49f}, {0x1d4a2, 0x1d4a2}, {0x1d4a5, 0x1d4a6}, {0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b5}, {0x1d4d0, 0x1d4e9}, {0x1d504, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d538, 0x1d539}, {0x1d53b, 0x1d53e}, {0x1d540, 0x1d544}, {0x1d546, 0x1d546}, {0x1d54a, 0x1d550}, {0x1d56c, 0x1d585}, {0x1d5a0, 0x1d5b9}, {0x1d5d4, 0x1d5ed}, {0x1d608, 0x1d621}, {0x1d63c, 0x1d655}, {0x1d670, 0x1d689}, {0x1d6a8, 0x1d6c0}, {0x1d6e2, 0x1d6fa}, {0x1d71c, 0x1d734}, {0x1d756, 0x1d76e}, {0x1d790, 0x1d7a8} }; static xmlChRangeGroup xmlLuG = {390,31,xmlLuS,xmlLuL}; static const xmlChSRange xmlMS[] = {{0x300, 0x357}, {0x35d, 0x36f}, {0x483, 0x486}, {0x488, 0x489}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, {0x5bb, 0x5bd}, {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, {0x610, 0x615}, {0x64b, 0x658}, {0x670, 0x670}, {0x6d6, 0x6dc}, {0x6de, 0x6e4}, {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x711, 0x711}, {0x730, 0x74a}, {0x7a6, 0x7b0}, {0x901, 0x903}, {0x93c, 0x93c}, {0x93e, 0x94d}, {0x951, 0x954}, {0x962, 0x963}, {0x981, 0x983}, {0x9bc, 0x9bc}, {0x9be, 0x9c4}, {0x9c7, 0x9c8}, {0x9cb, 0x9cd}, {0x9d7, 0x9d7}, {0x9e2, 0x9e3}, {0xa01, 0xa03}, {0xa3c, 0xa3c}, {0xa3e, 0xa42}, {0xa47, 0xa48}, {0xa4b, 0xa4d}, {0xa70, 0xa71}, {0xa81, 0xa83}, {0xabc, 0xabc}, {0xabe, 0xac5}, {0xac7, 0xac9}, {0xacb, 0xacd}, {0xae2, 0xae3}, {0xb01, 0xb03}, {0xb3c, 0xb3c}, {0xb3e, 0xb43}, {0xb47, 0xb48}, {0xb4b, 0xb4d}, {0xb56, 0xb57}, {0xb82, 0xb82}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8}, {0xbca, 0xbcd}, {0xbd7, 0xbd7}, {0xc01, 0xc03}, {0xc3e, 0xc44}, {0xc46, 0xc48}, {0xc4a, 0xc4d}, {0xc55, 0xc56}, {0xc82, 0xc83}, {0xcbc, 0xcbc}, {0xcbe, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xcd5, 0xcd6}, {0xd02, 0xd03}, {0xd3e, 0xd43}, {0xd46, 0xd48}, {0xd4a, 0xd4d}, {0xd57, 0xd57}, {0xd82, 0xd83}, {0xdca, 0xdca}, {0xdcf, 0xdd4}, {0xdd6, 0xdd6}, {0xdd8, 0xddf}, {0xdf2, 0xdf3}, {0xe31, 0xe31}, {0xe34, 0xe3a}, {0xe47, 0xe4e}, {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, {0xebb, 0xebc}, {0xec8, 0xecd}, {0xf18, 0xf19}, {0xf35, 0xf35}, {0xf37, 0xf37}, {0xf39, 0xf39}, {0xf3e, 0xf3f}, {0xf71, 0xf84}, {0xf86, 0xf87}, {0xf90, 0xf97}, {0xf99, 0xfbc}, {0xfc6, 0xfc6}, {0x102c, 0x1032}, {0x1036, 0x1039}, {0x1056, 0x1059}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17b6, 0x17d3}, {0x17dd, 0x17dd}, {0x180b, 0x180d}, {0x18a9, 0x18a9}, {0x1920, 0x192b}, {0x1930, 0x193b}, {0x20d0, 0x20ea}, {0x302a, 0x302f}, {0x3099, 0x309a}, {0xfb1e, 0xfb1e}, {0xfe00, 0xfe0f}, {0xfe20, 0xfe23} }; static const xmlChLRange xmlML[] = {{0x1d165, 0x1d169}, {0x1d16d, 0x1d172}, {0x1d17b, 0x1d182}, {0x1d185, 0x1d18b}, {0x1d1aa, 0x1d1ad}, {0xe0100, 0xe01ef} }; static xmlChRangeGroup xmlMG = {113,6,xmlMS,xmlML}; static const xmlChSRange xmlMcS[] = {{0x903, 0x903}, {0x93e, 0x940}, {0x949, 0x94c}, {0x982, 0x983}, {0x9be, 0x9c0}, {0x9c7, 0x9c8}, {0x9cb, 0x9cc}, {0x9d7, 0x9d7}, {0xa03, 0xa03}, {0xa3e, 0xa40}, {0xa83, 0xa83}, {0xabe, 0xac0}, {0xac9, 0xac9}, {0xacb, 0xacc}, {0xb02, 0xb03}, {0xb3e, 0xb3e}, {0xb40, 0xb40}, {0xb47, 0xb48}, {0xb4b, 0xb4c}, {0xb57, 0xb57}, {0xbbe, 0xbbf}, {0xbc1, 0xbc2}, {0xbc6, 0xbc8}, {0xbca, 0xbcc}, {0xbd7, 0xbd7}, {0xc01, 0xc03}, {0xc41, 0xc44}, {0xc82, 0xc83}, {0xcbe, 0xcbe}, {0xcc0, 0xcc4}, {0xcc7, 0xcc8}, {0xcca, 0xccb}, {0xcd5, 0xcd6}, {0xd02, 0xd03}, {0xd3e, 0xd40}, {0xd46, 0xd48}, {0xd4a, 0xd4c}, {0xd57, 0xd57}, {0xd82, 0xd83}, {0xdcf, 0xdd1}, {0xdd8, 0xddf}, {0xdf2, 0xdf3}, {0xf3e, 0xf3f}, {0xf7f, 0xf7f}, {0x102c, 0x102c}, {0x1031, 0x1031}, {0x1038, 0x1038}, {0x1056, 0x1057}, {0x17b6, 0x17b6}, {0x17be, 0x17c5}, {0x17c7, 0x17c8}, {0x1923, 0x1926}, {0x1929, 0x192b}, {0x1930, 0x1931}, {0x1933, 0x1938} }; static const xmlChLRange xmlMcL[] = {{0x1d165, 0x1d166}, {0x1d16d, 0x1d172} }; static xmlChRangeGroup xmlMcG = {55,2,xmlMcS,xmlMcL}; static const xmlChSRange xmlMnS[] = {{0x300, 0x357}, {0x35d, 0x36f}, {0x483, 0x486}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, {0x5bb, 0x5bd}, {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, {0x610, 0x615}, {0x64b, 0x658}, {0x670, 0x670}, {0x6d6, 0x6dc}, {0x6df, 0x6e4}, {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x711, 0x711}, {0x730, 0x74a}, {0x7a6, 0x7b0}, {0x901, 0x902}, {0x93c, 0x93c}, {0x941, 0x948}, {0x94d, 0x94d}, {0x951, 0x954}, {0x962, 0x963}, {0x981, 0x981}, {0x9bc, 0x9bc}, {0x9c1, 0x9c4}, {0x9cd, 0x9cd}, {0x9e2, 0x9e3}, {0xa01, 0xa02}, {0xa3c, 0xa3c}, {0xa41, 0xa42}, {0xa47, 0xa48}, {0xa4b, 0xa4d}, {0xa70, 0xa71}, {0xa81, 0xa82}, {0xabc, 0xabc}, {0xac1, 0xac5}, {0xac7, 0xac8}, {0xacd, 0xacd}, {0xae2, 0xae3}, {0xb01, 0xb01}, {0xb3c, 0xb3c}, {0xb3f, 0xb3f}, {0xb41, 0xb43}, {0xb4d, 0xb4d}, {0xb56, 0xb56}, {0xb82, 0xb82}, {0xbc0, 0xbc0}, {0xbcd, 0xbcd}, {0xc3e, 0xc40}, {0xc46, 0xc48}, {0xc4a, 0xc4d}, {0xc55, 0xc56}, {0xcbc, 0xcbc}, {0xcbf, 0xcbf}, {0xcc6, 0xcc6}, {0xccc, 0xccd}, {0xd41, 0xd43}, {0xd4d, 0xd4d}, {0xdca, 0xdca}, {0xdd2, 0xdd4}, {0xdd6, 0xdd6}, {0xe31, 0xe31}, {0xe34, 0xe3a}, {0xe47, 0xe4e}, {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, {0xebb, 0xebc}, {0xec8, 0xecd}, {0xf18, 0xf19}, {0xf35, 0xf35}, {0xf37, 0xf37}, {0xf39, 0xf39}, {0xf71, 0xf7e}, {0xf80, 0xf84}, {0xf86, 0xf87}, {0xf90, 0xf97}, {0xf99, 0xfbc}, {0xfc6, 0xfc6}, {0x102d, 0x1030}, {0x1032, 0x1032}, {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17b7, 0x17bd}, {0x17c6, 0x17c6}, {0x17c9, 0x17d3}, {0x17dd, 0x17dd}, {0x180b, 0x180d}, {0x18a9, 0x18a9}, {0x1920, 0x1922}, {0x1927, 0x1928}, {0x1932, 0x1932}, {0x1939, 0x193b}, {0x20d0, 0x20dc}, {0x20e1, 0x20e1}, {0x20e5, 0x20ea}, {0x302a, 0x302f}, {0x3099, 0x309a}, {0xfb1e, 0xfb1e}, {0xfe00, 0xfe0f}, {0xfe20, 0xfe23} }; static const xmlChLRange xmlMnL[] = {{0x1d167, 0x1d169}, {0x1d17b, 0x1d182}, {0x1d185, 0x1d18b}, {0x1d1aa, 0x1d1ad}, {0xe0100, 0xe01ef} }; static xmlChRangeGroup xmlMnG = {108,5,xmlMnS,xmlMnL}; static const xmlChSRange xmlNS[] = {{0x30, 0x39}, {0xb2, 0xb3}, {0xb9, 0xb9}, {0xbc, 0xbe}, {0x660, 0x669}, {0x6f0, 0x6f9}, {0x966, 0x96f}, {0x9e6, 0x9ef}, {0x9f4, 0x9f9}, {0xa66, 0xa6f}, {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbf2}, {0xc66, 0xc6f}, {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, {0xf20, 0xf33}, {0x1040, 0x1049}, {0x1369, 0x137c}, {0x16ee, 0x16f0}, {0x17e0, 0x17e9}, {0x17f0, 0x17f9}, {0x1810, 0x1819}, {0x1946, 0x194f}, {0x2070, 0x2070}, {0x2074, 0x2079}, {0x2080, 0x2089}, {0x2153, 0x2183}, {0x2460, 0x249b}, {0x24ea, 0x24ff}, {0x2776, 0x2793}, {0x3007, 0x3007}, {0x3021, 0x3029}, {0x3038, 0x303a}, {0x3192, 0x3195}, {0x3220, 0x3229}, {0x3251, 0x325f}, {0x3280, 0x3289}, {0x32b1, 0x32bf}, {0xff10, 0xff19} }; static const xmlChLRange xmlNL[] = {{0x10107, 0x10133}, {0x10320, 0x10323}, {0x1034a, 0x1034a}, {0x104a0, 0x104a9}, {0x1d7ce, 0x1d7ff} }; static xmlChRangeGroup xmlNG = {42,5,xmlNS,xmlNL}; static const xmlChSRange xmlNdS[] = {{0x30, 0x39}, {0x660, 0x669}, {0x6f0, 0x6f9}, {0x966, 0x96f}, {0x9e6, 0x9ef}, {0xa66, 0xa6f}, {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbef}, {0xc66, 0xc6f}, {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, {0xf20, 0xf29}, {0x1040, 0x1049}, {0x1369, 0x1371}, {0x17e0, 0x17e9}, {0x1810, 0x1819}, {0x1946, 0x194f}, {0xff10, 0xff19} }; static const xmlChLRange xmlNdL[] = {{0x104a0, 0x104a9}, {0x1d7ce, 0x1d7ff} }; static xmlChRangeGroup xmlNdG = {21,2,xmlNdS,xmlNdL}; static const xmlChSRange xmlNoS[] = {{0xb2, 0xb3}, {0xb9, 0xb9}, {0xbc, 0xbe}, {0x9f4, 0x9f9}, {0xbf0, 0xbf2}, {0xf2a, 0xf33}, {0x1372, 0x137c}, {0x17f0, 0x17f9}, {0x2070, 0x2070}, {0x2074, 0x2079}, {0x2080, 0x2089}, {0x2153, 0x215f}, {0x2460, 0x249b}, {0x24ea, 0x24ff}, {0x2776, 0x2793}, {0x3192, 0x3195}, {0x3220, 0x3229}, {0x3251, 0x325f}, {0x3280, 0x3289}, {0x32b1, 0x32bf} }; static const xmlChLRange xmlNoL[] = {{0x10107, 0x10133}, {0x10320, 0x10323} }; static xmlChRangeGroup xmlNoG = {20,2,xmlNoS,xmlNoL}; static const xmlChSRange xmlPS[] = {{0x21, 0x23}, {0x25, 0x2a}, {0x2c, 0x2f}, {0x3a, 0x3b}, {0x3f, 0x40}, {0x5b, 0x5d}, {0x5f, 0x5f}, {0x7b, 0x7b}, {0x7d, 0x7d}, {0xa1, 0xa1}, {0xab, 0xab}, {0xb7, 0xb7}, {0xbb, 0xbb}, {0xbf, 0xbf}, {0x37e, 0x37e}, {0x387, 0x387}, {0x55a, 0x55f}, {0x589, 0x58a}, {0x5be, 0x5be}, {0x5c0, 0x5c0}, {0x5c3, 0x5c3}, {0x5f3, 0x5f4}, {0x60c, 0x60d}, {0x61b, 0x61b}, {0x61f, 0x61f}, {0x66a, 0x66d}, {0x6d4, 0x6d4}, {0x700, 0x70d}, {0x964, 0x965}, {0x970, 0x970}, {0xdf4, 0xdf4}, {0xe4f, 0xe4f}, {0xe5a, 0xe5b}, {0xf04, 0xf12}, {0xf3a, 0xf3d}, {0xf85, 0xf85}, {0x104a, 0x104f}, {0x10fb, 0x10fb}, {0x1361, 0x1368}, {0x166d, 0x166e}, {0x169b, 0x169c}, {0x16eb, 0x16ed}, {0x1735, 0x1736}, {0x17d4, 0x17d6}, {0x17d8, 0x17da}, {0x1800, 0x180a}, {0x1944, 0x1945}, {0x2010, 0x2027}, {0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x2054}, {0x2057, 0x2057}, {0x207d, 0x207e}, {0x208d, 0x208e}, {0x2329, 0x232a}, {0x23b4, 0x23b6}, {0x2768, 0x2775}, {0x27e6, 0x27eb}, {0x2983, 0x2998}, {0x29d8, 0x29db}, {0x29fc, 0x29fd}, {0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301f}, {0x3030, 0x3030}, {0x303d, 0x303d}, {0x30a0, 0x30a0}, {0x30fb, 0x30fb}, {0xfd3e, 0xfd3f}, {0xfe30, 0xfe52}, {0xfe54, 0xfe61}, {0xfe63, 0xfe63}, {0xfe68, 0xfe68}, {0xfe6a, 0xfe6b}, {0xff01, 0xff03}, {0xff05, 0xff0a}, {0xff0c, 0xff0f}, {0xff1a, 0xff1b}, {0xff1f, 0xff20}, {0xff3b, 0xff3d}, {0xff3f, 0xff3f}, {0xff5b, 0xff5b}, {0xff5d, 0xff5d}, {0xff5f, 0xff65} }; static const xmlChLRange xmlPL[] = {{0x10100, 0x10101}, {0x1039f, 0x1039f} }; static xmlChRangeGroup xmlPG = {84,2,xmlPS,xmlPL}; static const xmlChSRange xmlPdS[] = {{0x2d, 0x2d}, {0x58a, 0x58a}, {0x1806, 0x1806}, {0x2010, 0x2015}, {0x301c, 0x301c}, {0x3030, 0x3030}, {0x30a0, 0x30a0}, {0xfe31, 0xfe32}, {0xfe58, 0xfe58}, {0xfe63, 0xfe63}, {0xff0d, 0xff0d} }; static xmlChRangeGroup xmlPdG = {11,0,xmlPdS,NULL}; static const xmlChSRange xmlPeS[] = {{0x29, 0x29}, {0x5d, 0x5d}, {0x7d, 0x7d}, {0xf3b, 0xf3b}, {0xf3d, 0xf3d}, {0x169c, 0x169c}, {0x2046, 0x2046}, {0x207e, 0x207e}, {0x208e, 0x208e}, {0x232a, 0x232a}, {0x23b5, 0x23b5}, {0x2769, 0x2769}, {0x276b, 0x276b}, {0x276d, 0x276d}, {0x276f, 0x276f}, {0x2771, 0x2771}, {0x2773, 0x2773}, {0x2775, 0x2775}, {0x27e7, 0x27e7}, {0x27e9, 0x27e9}, {0x27eb, 0x27eb}, {0x2984, 0x2984}, {0x2986, 0x2986}, {0x2988, 0x2988}, {0x298a, 0x298a}, {0x298c, 0x298c}, {0x298e, 0x298e}, {0x2990, 0x2990}, {0x2992, 0x2992}, {0x2994, 0x2994}, {0x2996, 0x2996}, {0x2998, 0x2998}, {0x29d9, 0x29d9}, {0x29db, 0x29db}, {0x29fd, 0x29fd}, {0x3009, 0x3009}, {0x300b, 0x300b}, {0x300d, 0x300d}, {0x300f, 0x300f}, {0x3011, 0x3011}, {0x3015, 0x3015}, {0x3017, 0x3017}, {0x3019, 0x3019}, {0x301b, 0x301b}, {0x301e, 0x301f}, {0xfd3f, 0xfd3f}, {0xfe36, 0xfe36}, {0xfe38, 0xfe38}, {0xfe3a, 0xfe3a}, {0xfe3c, 0xfe3c}, {0xfe3e, 0xfe3e}, {0xfe40, 0xfe40}, {0xfe42, 0xfe42}, {0xfe44, 0xfe44}, {0xfe48, 0xfe48}, {0xfe5a, 0xfe5a}, {0xfe5c, 0xfe5c}, {0xfe5e, 0xfe5e}, {0xff09, 0xff09}, {0xff3d, 0xff3d}, {0xff5d, 0xff5d}, {0xff60, 0xff60}, {0xff63, 0xff63} }; static xmlChRangeGroup xmlPeG = {63,0,xmlPeS,NULL}; static const xmlChSRange xmlPoS[] = {{0x21, 0x23}, {0x25, 0x27}, {0x2a, 0x2a}, {0x2c, 0x2c}, {0x2e, 0x2f}, {0x3a, 0x3b}, {0x3f, 0x40}, {0x5c, 0x5c}, {0xa1, 0xa1}, {0xb7, 0xb7}, {0xbf, 0xbf}, {0x37e, 0x37e}, {0x387, 0x387}, {0x55a, 0x55f}, {0x589, 0x589}, {0x5be, 0x5be}, {0x5c0, 0x5c0}, {0x5c3, 0x5c3}, {0x5f3, 0x5f4}, {0x60c, 0x60d}, {0x61b, 0x61b}, {0x61f, 0x61f}, {0x66a, 0x66d}, {0x6d4, 0x6d4}, {0x700, 0x70d}, {0x964, 0x965}, {0x970, 0x970}, {0xdf4, 0xdf4}, {0xe4f, 0xe4f}, {0xe5a, 0xe5b}, {0xf04, 0xf12}, {0xf85, 0xf85}, {0x104a, 0x104f}, {0x10fb, 0x10fb}, {0x1361, 0x1368}, {0x166d, 0x166e}, {0x16eb, 0x16ed}, {0x1735, 0x1736}, {0x17d4, 0x17d6}, {0x17d8, 0x17da}, {0x1800, 0x1805}, {0x1807, 0x180a}, {0x1944, 0x1945}, {0x2016, 0x2017}, {0x2020, 0x2027}, {0x2030, 0x2038}, {0x203b, 0x203e}, {0x2041, 0x2043}, {0x2047, 0x2051}, {0x2053, 0x2053}, {0x2057, 0x2057}, {0x23b6, 0x23b6}, {0x3001, 0x3003}, {0x303d, 0x303d}, {0xfe30, 0xfe30}, {0xfe45, 0xfe46}, {0xfe49, 0xfe4c}, {0xfe50, 0xfe52}, {0xfe54, 0xfe57}, {0xfe5f, 0xfe61}, {0xfe68, 0xfe68}, {0xfe6a, 0xfe6b}, {0xff01, 0xff03}, {0xff05, 0xff07}, {0xff0a, 0xff0a}, {0xff0c, 0xff0c}, {0xff0e, 0xff0f}, {0xff1a, 0xff1b}, {0xff1f, 0xff20}, {0xff3c, 0xff3c}, {0xff61, 0xff61}, {0xff64, 0xff64} }; static const xmlChLRange xmlPoL[] = {{0x10100, 0x10101}, {0x1039f, 0x1039f} }; static xmlChRangeGroup xmlPoG = {72,2,xmlPoS,xmlPoL}; static const xmlChSRange xmlPsS[] = {{0x28, 0x28}, {0x5b, 0x5b}, {0x7b, 0x7b}, {0xf3a, 0xf3a}, {0xf3c, 0xf3c}, {0x169b, 0x169b}, {0x201a, 0x201a}, {0x201e, 0x201e}, {0x2045, 0x2045}, {0x207d, 0x207d}, {0x208d, 0x208d}, {0x2329, 0x2329}, {0x23b4, 0x23b4}, {0x2768, 0x2768}, {0x276a, 0x276a}, {0x276c, 0x276c}, {0x276e, 0x276e}, {0x2770, 0x2770}, {0x2772, 0x2772}, {0x2774, 0x2774}, {0x27e6, 0x27e6}, {0x27e8, 0x27e8}, {0x27ea, 0x27ea}, {0x2983, 0x2983}, {0x2985, 0x2985}, {0x2987, 0x2987}, {0x2989, 0x2989}, {0x298b, 0x298b}, {0x298d, 0x298d}, {0x298f, 0x298f}, {0x2991, 0x2991}, {0x2993, 0x2993}, {0x2995, 0x2995}, {0x2997, 0x2997}, {0x29d8, 0x29d8}, {0x29da, 0x29da}, {0x29fc, 0x29fc}, {0x3008, 0x3008}, {0x300a, 0x300a}, {0x300c, 0x300c}, {0x300e, 0x300e}, {0x3010, 0x3010}, {0x3014, 0x3014}, {0x3016, 0x3016}, {0x3018, 0x3018}, {0x301a, 0x301a}, {0x301d, 0x301d}, {0xfd3e, 0xfd3e}, {0xfe35, 0xfe35}, {0xfe37, 0xfe37}, {0xfe39, 0xfe39}, {0xfe3b, 0xfe3b}, {0xfe3d, 0xfe3d}, {0xfe3f, 0xfe3f}, {0xfe41, 0xfe41}, {0xfe43, 0xfe43}, {0xfe47, 0xfe47}, {0xfe59, 0xfe59}, {0xfe5b, 0xfe5b}, {0xfe5d, 0xfe5d}, {0xff08, 0xff08}, {0xff3b, 0xff3b}, {0xff5b, 0xff5b}, {0xff5f, 0xff5f}, {0xff62, 0xff62} }; static xmlChRangeGroup xmlPsG = {65,0,xmlPsS,NULL}; static const xmlChSRange xmlSS[] = {{0x24, 0x24}, {0x2b, 0x2b}, {0x3c, 0x3e}, {0x5e, 0x5e}, {0x60, 0x60}, {0x7c, 0x7c}, {0x7e, 0x7e}, {0xa2, 0xa9}, {0xac, 0xac}, {0xae, 0xb1}, {0xb4, 0xb4}, {0xb6, 0xb6}, {0xb8, 0xb8}, {0xd7, 0xd7}, {0xf7, 0xf7}, {0x2c2, 0x2c5}, {0x2d2, 0x2df}, {0x2e5, 0x2ed}, {0x2ef, 0x2ff}, {0x374, 0x375}, {0x384, 0x385}, {0x3f6, 0x3f6}, {0x482, 0x482}, {0x60e, 0x60f}, {0x6e9, 0x6e9}, {0x6fd, 0x6fe}, {0x9f2, 0x9f3}, {0x9fa, 0x9fa}, {0xaf1, 0xaf1}, {0xb70, 0xb70}, {0xbf3, 0xbfa}, {0xe3f, 0xe3f}, {0xf01, 0xf03}, {0xf13, 0xf17}, {0xf1a, 0xf1f}, {0xf34, 0xf34}, {0xf36, 0xf36}, {0xf38, 0xf38}, {0xfbe, 0xfc5}, {0xfc7, 0xfcc}, {0xfcf, 0xfcf}, {0x17db, 0x17db}, {0x1940, 0x1940}, {0x19e0, 0x19ff}, {0x1fbd, 0x1fbd}, {0x1fbf, 0x1fc1}, {0x1fcd, 0x1fcf}, {0x1fdd, 0x1fdf}, {0x1fed, 0x1fef}, {0x1ffd, 0x1ffe}, {0x2044, 0x2044}, {0x2052, 0x2052}, {0x207a, 0x207c}, {0x208a, 0x208c}, {0x20a0, 0x20b1}, {0x2100, 0x2101}, {0x2103, 0x2106}, {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2118}, {0x211e, 0x2123}, {0x2125, 0x2125}, {0x2127, 0x2127}, {0x2129, 0x2129}, {0x212e, 0x212e}, {0x2132, 0x2132}, {0x213a, 0x213b}, {0x2140, 0x2144}, {0x214a, 0x214b}, {0x2190, 0x2328}, {0x232b, 0x23b3}, {0x23b7, 0x23d0}, {0x2400, 0x2426}, {0x2440, 0x244a}, {0x249c, 0x24e9}, {0x2500, 0x2617}, {0x2619, 0x267d}, {0x2680, 0x2691}, {0x26a0, 0x26a1}, {0x2701, 0x2704}, {0x2706, 0x2709}, {0x270c, 0x2727}, {0x2729, 0x274b}, {0x274d, 0x274d}, {0x274f, 0x2752}, {0x2756, 0x2756}, {0x2758, 0x275e}, {0x2761, 0x2767}, {0x2794, 0x2794}, {0x2798, 0x27af}, {0x27b1, 0x27be}, {0x27d0, 0x27e5}, {0x27f0, 0x2982}, {0x2999, 0x29d7}, {0x29dc, 0x29fb}, {0x29fe, 0x2b0d}, {0x2e80, 0x2e99}, {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, {0x3004, 0x3004}, {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, {0x303e, 0x303f}, {0x309b, 0x309c}, {0x3190, 0x3191}, {0x3196, 0x319f}, {0x3200, 0x321e}, {0x322a, 0x3243}, {0x3250, 0x3250}, {0x3260, 0x327d}, {0x327f, 0x327f}, {0x328a, 0x32b0}, {0x32c0, 0x32fe}, {0x3300, 0x33ff}, {0x4dc0, 0x4dff}, {0xa490, 0xa4c6}, {0xfb29, 0xfb29}, {0xfdfc, 0xfdfd}, {0xfe62, 0xfe62}, {0xfe64, 0xfe66}, {0xfe69, 0xfe69}, {0xff04, 0xff04}, {0xff0b, 0xff0b}, {0xff1c, 0xff1e}, {0xff3e, 0xff3e}, {0xff40, 0xff40}, {0xff5c, 0xff5c}, {0xff5e, 0xff5e}, {0xffe0, 0xffe6}, {0xffe8, 0xffee}, {0xfffc, 0xfffd} }; static const xmlChLRange xmlSL[] = {{0x10102, 0x10102}, {0x10137, 0x1013f}, {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, {0x1d12a, 0x1d164}, {0x1d16a, 0x1d16c}, {0x1d183, 0x1d184}, {0x1d18c, 0x1d1a9}, {0x1d1ae, 0x1d1dd}, {0x1d300, 0x1d356}, {0x1d6c1, 0x1d6c1}, {0x1d6db, 0x1d6db}, {0x1d6fb, 0x1d6fb}, {0x1d715, 0x1d715}, {0x1d735, 0x1d735}, {0x1d74f, 0x1d74f}, {0x1d76f, 0x1d76f}, {0x1d789, 0x1d789}, {0x1d7a9, 0x1d7a9}, {0x1d7c3, 0x1d7c3} }; static xmlChRangeGroup xmlSG = {133,20,xmlSS,xmlSL}; static const xmlChSRange xmlScS[] = {{0x24, 0x24}, {0xa2, 0xa5}, {0x9f2, 0x9f3}, {0xaf1, 0xaf1}, {0xbf9, 0xbf9}, {0xe3f, 0xe3f}, {0x17db, 0x17db}, {0x20a0, 0x20b1}, {0xfdfc, 0xfdfc}, {0xfe69, 0xfe69}, {0xff04, 0xff04}, {0xffe0, 0xffe1}, {0xffe5, 0xffe6} }; static xmlChRangeGroup xmlScG = {13,0,xmlScS,NULL}; static const xmlChSRange xmlSkS[] = {{0x5e, 0x5e}, {0x60, 0x60}, {0xa8, 0xa8}, {0xaf, 0xaf}, {0xb4, 0xb4}, {0xb8, 0xb8}, {0x2c2, 0x2c5}, {0x2d2, 0x2df}, {0x2e5, 0x2ed}, {0x2ef, 0x2ff}, {0x374, 0x375}, {0x384, 0x385}, {0x1fbd, 0x1fbd}, {0x1fbf, 0x1fc1}, {0x1fcd, 0x1fcf}, {0x1fdd, 0x1fdf}, {0x1fed, 0x1fef}, {0x1ffd, 0x1ffe}, {0x309b, 0x309c}, {0xff3e, 0xff3e}, {0xff40, 0xff40}, {0xffe3, 0xffe3} }; static xmlChRangeGroup xmlSkG = {22,0,xmlSkS,NULL}; static const xmlChSRange xmlSmS[] = {{0x2b, 0x2b}, {0x3c, 0x3e}, {0x7c, 0x7c}, {0x7e, 0x7e}, {0xac, 0xac}, {0xb1, 0xb1}, {0xd7, 0xd7}, {0xf7, 0xf7}, {0x3f6, 0x3f6}, {0x2044, 0x2044}, {0x2052, 0x2052}, {0x207a, 0x207c}, {0x208a, 0x208c}, {0x2140, 0x2144}, {0x214b, 0x214b}, {0x2190, 0x2194}, {0x219a, 0x219b}, {0x21a0, 0x21a0}, {0x21a3, 0x21a3}, {0x21a6, 0x21a6}, {0x21ae, 0x21ae}, {0x21ce, 0x21cf}, {0x21d2, 0x21d2}, {0x21d4, 0x21d4}, {0x21f4, 0x22ff}, {0x2308, 0x230b}, {0x2320, 0x2321}, {0x237c, 0x237c}, {0x239b, 0x23b3}, {0x25b7, 0x25b7}, {0x25c1, 0x25c1}, {0x25f8, 0x25ff}, {0x266f, 0x266f}, {0x27d0, 0x27e5}, {0x27f0, 0x27ff}, {0x2900, 0x2982}, {0x2999, 0x29d7}, {0x29dc, 0x29fb}, {0x29fe, 0x2aff}, {0xfb29, 0xfb29}, {0xfe62, 0xfe62}, {0xfe64, 0xfe66}, {0xff0b, 0xff0b}, {0xff1c, 0xff1e}, {0xff5c, 0xff5c}, {0xff5e, 0xff5e}, {0xffe2, 0xffe2}, {0xffe9, 0xffec} }; static const xmlChLRange xmlSmL[] = {{0x1d6c1, 0x1d6c1}, {0x1d6db, 0x1d6db}, {0x1d6fb, 0x1d6fb}, {0x1d715, 0x1d715}, {0x1d735, 0x1d735}, {0x1d74f, 0x1d74f}, {0x1d76f, 0x1d76f}, {0x1d789, 0x1d789}, {0x1d7a9, 0x1d7a9}, {0x1d7c3, 0x1d7c3} }; static xmlChRangeGroup xmlSmG = {48,10,xmlSmS,xmlSmL}; static const xmlChSRange xmlSoS[] = {{0xa6, 0xa7}, {0xa9, 0xa9}, {0xae, 0xae}, {0xb0, 0xb0}, {0xb6, 0xb6}, {0x482, 0x482}, {0x60e, 0x60f}, {0x6e9, 0x6e9}, {0x6fd, 0x6fe}, {0x9fa, 0x9fa}, {0xb70, 0xb70}, {0xbf3, 0xbf8}, {0xbfa, 0xbfa}, {0xf01, 0xf03}, {0xf13, 0xf17}, {0xf1a, 0xf1f}, {0xf34, 0xf34}, {0xf36, 0xf36}, {0xf38, 0xf38}, {0xfbe, 0xfc5}, {0xfc7, 0xfcc}, {0xfcf, 0xfcf}, {0x1940, 0x1940}, {0x19e0, 0x19ff}, {0x2100, 0x2101}, {0x2103, 0x2106}, {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2118}, {0x211e, 0x2123}, {0x2125, 0x2125}, {0x2127, 0x2127}, {0x2129, 0x2129}, {0x212e, 0x212e}, {0x2132, 0x2132}, {0x213a, 0x213b}, {0x214a, 0x214a}, {0x2195, 0x2199}, {0x219c, 0x219f}, {0x21a1, 0x21a2}, {0x21a4, 0x21a5}, {0x21a7, 0x21ad}, {0x21af, 0x21cd}, {0x21d0, 0x21d1}, {0x21d3, 0x21d3}, {0x21d5, 0x21f3}, {0x2300, 0x2307}, {0x230c, 0x231f}, {0x2322, 0x2328}, {0x232b, 0x237b}, {0x237d, 0x239a}, {0x23b7, 0x23d0}, {0x2400, 0x2426}, {0x2440, 0x244a}, {0x249c, 0x24e9}, {0x2500, 0x25b6}, {0x25b8, 0x25c0}, {0x25c2, 0x25f7}, {0x2600, 0x2617}, {0x2619, 0x266e}, {0x2670, 0x267d}, {0x2680, 0x2691}, {0x26a0, 0x26a1}, {0x2701, 0x2704}, {0x2706, 0x2709}, {0x270c, 0x2727}, {0x2729, 0x274b}, {0x274d, 0x274d}, {0x274f, 0x2752}, {0x2756, 0x2756}, {0x2758, 0x275e}, {0x2761, 0x2767}, {0x2794, 0x2794}, {0x2798, 0x27af}, {0x27b1, 0x27be}, {0x2800, 0x28ff}, {0x2b00, 0x2b0d}, {0x2e80, 0x2e99}, {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, {0x3004, 0x3004}, {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, {0x303e, 0x303f}, {0x3190, 0x3191}, {0x3196, 0x319f}, {0x3200, 0x321e}, {0x322a, 0x3243}, {0x3250, 0x3250}, {0x3260, 0x327d}, {0x327f, 0x327f}, {0x328a, 0x32b0}, {0x32c0, 0x32fe}, {0x3300, 0x33ff}, {0x4dc0, 0x4dff}, {0xa490, 0xa4c6}, {0xfdfd, 0xfdfd}, {0xffe4, 0xffe4}, {0xffe8, 0xffe8}, {0xffed, 0xffee}, {0xfffc, 0xfffd} }; static const xmlChLRange xmlSoL[] = {{0x10102, 0x10102}, {0x10137, 0x1013f}, {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, {0x1d12a, 0x1d164}, {0x1d16a, 0x1d16c}, {0x1d183, 0x1d184}, {0x1d18c, 0x1d1a9}, {0x1d1ae, 0x1d1dd}, {0x1d300, 0x1d356} }; static xmlChRangeGroup xmlSoG = {103,10,xmlSoS,xmlSoL}; static const xmlChSRange xmlZS[] = {{0x20, 0x20}, {0xa0, 0xa0}, {0x1680, 0x1680}, {0x180e, 0x180e}, {0x2000, 0x200a}, {0x2028, 0x2029}, {0x202f, 0x202f}, {0x205f, 0x205f}, {0x3000, 0x3000} }; static xmlChRangeGroup xmlZG = {9,0,xmlZS,NULL}; static xmlUnicodeNameTable xmlUnicodeBlockTbl = {xmlUnicodeBlocks, 128}; static xmlUnicodeNameTable xmlUnicodeCatTbl = {xmlUnicodeCats, 36}; /** * xmlUnicodeLookup: * @tptr: pointer to the name table * @name: name to be found * * binary table lookup for user-supplied name * * Returns pointer to range function if found, otherwise NULL */ static xmlIntFunc *xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname) { int low, high, mid, cmp; xmlUnicodeRange *sptr; if ((tptr == NULL) || (tname == NULL)) return(NULL); low = 0; high = tptr->numentries - 1; sptr = tptr->table; while (low <= high) { mid = (low + high) / 2; if ((cmp=strcmp(tname, sptr[mid].rangename)) == 0) return (sptr[mid].func); if (cmp < 0) high = mid - 1; else low = mid + 1; } return (NULL); } /** * xmlUCSIsAegeanNumbers: * @code: UCS code point * * Check whether the character is part of AegeanNumbers UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsAegeanNumbers(int code) { return(((code >= 0x10100) && (code <= 0x1013F))); } /** * xmlUCSIsAlphabeticPresentationForms: * @code: UCS code point * * Check whether the character is part of AlphabeticPresentationForms UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsAlphabeticPresentationForms(int code) { return(((code >= 0xFB00) && (code <= 0xFB4F))); } /** * xmlUCSIsArabic: * @code: UCS code point * * Check whether the character is part of Arabic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsArabic(int code) { return(((code >= 0x0600) && (code <= 0x06FF))); } /** * xmlUCSIsArabicPresentationFormsA: * @code: UCS code point * * Check whether the character is part of ArabicPresentationForms-A UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsArabicPresentationFormsA(int code) { return(((code >= 0xFB50) && (code <= 0xFDFF))); } /** * xmlUCSIsArabicPresentationFormsB: * @code: UCS code point * * Check whether the character is part of ArabicPresentationForms-B UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsArabicPresentationFormsB(int code) { return(((code >= 0xFE70) && (code <= 0xFEFF))); } /** * xmlUCSIsArmenian: * @code: UCS code point * * Check whether the character is part of Armenian UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsArmenian(int code) { return(((code >= 0x0530) && (code <= 0x058F))); } /** * xmlUCSIsArrows: * @code: UCS code point * * Check whether the character is part of Arrows UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsArrows(int code) { return(((code >= 0x2190) && (code <= 0x21FF))); } /** * xmlUCSIsBasicLatin: * @code: UCS code point * * Check whether the character is part of BasicLatin UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBasicLatin(int code) { return(((code >= 0x0000) && (code <= 0x007F))); } /** * xmlUCSIsBengali: * @code: UCS code point * * Check whether the character is part of Bengali UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBengali(int code) { return(((code >= 0x0980) && (code <= 0x09FF))); } /** * xmlUCSIsBlockElements: * @code: UCS code point * * Check whether the character is part of BlockElements UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBlockElements(int code) { return(((code >= 0x2580) && (code <= 0x259F))); } /** * xmlUCSIsBopomofo: * @code: UCS code point * * Check whether the character is part of Bopomofo UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBopomofo(int code) { return(((code >= 0x3100) && (code <= 0x312F))); } /** * xmlUCSIsBopomofoExtended: * @code: UCS code point * * Check whether the character is part of BopomofoExtended UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBopomofoExtended(int code) { return(((code >= 0x31A0) && (code <= 0x31BF))); } /** * xmlUCSIsBoxDrawing: * @code: UCS code point * * Check whether the character is part of BoxDrawing UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBoxDrawing(int code) { return(((code >= 0x2500) && (code <= 0x257F))); } /** * xmlUCSIsBraillePatterns: * @code: UCS code point * * Check whether the character is part of BraillePatterns UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBraillePatterns(int code) { return(((code >= 0x2800) && (code <= 0x28FF))); } /** * xmlUCSIsBuhid: * @code: UCS code point * * Check whether the character is part of Buhid UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsBuhid(int code) { return(((code >= 0x1740) && (code <= 0x175F))); } /** * xmlUCSIsByzantineMusicalSymbols: * @code: UCS code point * * Check whether the character is part of ByzantineMusicalSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsByzantineMusicalSymbols(int code) { return(((code >= 0x1D000) && (code <= 0x1D0FF))); } /** * xmlUCSIsCJKCompatibility: * @code: UCS code point * * Check whether the character is part of CJKCompatibility UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKCompatibility(int code) { return(((code >= 0x3300) && (code <= 0x33FF))); } /** * xmlUCSIsCJKCompatibilityForms: * @code: UCS code point * * Check whether the character is part of CJKCompatibilityForms UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKCompatibilityForms(int code) { return(((code >= 0xFE30) && (code <= 0xFE4F))); } /** * xmlUCSIsCJKCompatibilityIdeographs: * @code: UCS code point * * Check whether the character is part of CJKCompatibilityIdeographs UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKCompatibilityIdeographs(int code) { return(((code >= 0xF900) && (code <= 0xFAFF))); } /** * xmlUCSIsCJKCompatibilityIdeographsSupplement: * @code: UCS code point * * Check whether the character is part of CJKCompatibilityIdeographsSupplement UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKCompatibilityIdeographsSupplement(int code) { return(((code >= 0x2F800) && (code <= 0x2FA1F))); } /** * xmlUCSIsCJKRadicalsSupplement: * @code: UCS code point * * Check whether the character is part of CJKRadicalsSupplement UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKRadicalsSupplement(int code) { return(((code >= 0x2E80) && (code <= 0x2EFF))); } /** * xmlUCSIsCJKSymbolsandPunctuation: * @code: UCS code point * * Check whether the character is part of CJKSymbolsandPunctuation UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKSymbolsandPunctuation(int code) { return(((code >= 0x3000) && (code <= 0x303F))); } /** * xmlUCSIsCJKUnifiedIdeographs: * @code: UCS code point * * Check whether the character is part of CJKUnifiedIdeographs UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKUnifiedIdeographs(int code) { return(((code >= 0x4E00) && (code <= 0x9FFF))); } /** * xmlUCSIsCJKUnifiedIdeographsExtensionA: * @code: UCS code point * * Check whether the character is part of CJKUnifiedIdeographsExtensionA UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKUnifiedIdeographsExtensionA(int code) { return(((code >= 0x3400) && (code <= 0x4DBF))); } /** * xmlUCSIsCJKUnifiedIdeographsExtensionB: * @code: UCS code point * * Check whether the character is part of CJKUnifiedIdeographsExtensionB UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCJKUnifiedIdeographsExtensionB(int code) { return(((code >= 0x20000) && (code <= 0x2A6DF))); } /** * xmlUCSIsCherokee: * @code: UCS code point * * Check whether the character is part of Cherokee UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCherokee(int code) { return(((code >= 0x13A0) && (code <= 0x13FF))); } /** * xmlUCSIsCombiningDiacriticalMarks: * @code: UCS code point * * Check whether the character is part of CombiningDiacriticalMarks UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCombiningDiacriticalMarks(int code) { return(((code >= 0x0300) && (code <= 0x036F))); } /** * xmlUCSIsCombiningDiacriticalMarksforSymbols: * @code: UCS code point * * Check whether the character is part of CombiningDiacriticalMarksforSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCombiningDiacriticalMarksforSymbols(int code) { return(((code >= 0x20D0) && (code <= 0x20FF))); } /** * xmlUCSIsCombiningHalfMarks: * @code: UCS code point * * Check whether the character is part of CombiningHalfMarks UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCombiningHalfMarks(int code) { return(((code >= 0xFE20) && (code <= 0xFE2F))); } /** * xmlUCSIsCombiningMarksforSymbols: * @code: UCS code point * * Check whether the character is part of CombiningMarksforSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCombiningMarksforSymbols(int code) { return(((code >= 0x20D0) && (code <= 0x20FF))); } /** * xmlUCSIsControlPictures: * @code: UCS code point * * Check whether the character is part of ControlPictures UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsControlPictures(int code) { return(((code >= 0x2400) && (code <= 0x243F))); } /** * xmlUCSIsCurrencySymbols: * @code: UCS code point * * Check whether the character is part of CurrencySymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCurrencySymbols(int code) { return(((code >= 0x20A0) && (code <= 0x20CF))); } /** * xmlUCSIsCypriotSyllabary: * @code: UCS code point * * Check whether the character is part of CypriotSyllabary UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCypriotSyllabary(int code) { return(((code >= 0x10800) && (code <= 0x1083F))); } /** * xmlUCSIsCyrillic: * @code: UCS code point * * Check whether the character is part of Cyrillic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCyrillic(int code) { return(((code >= 0x0400) && (code <= 0x04FF))); } /** * xmlUCSIsCyrillicSupplement: * @code: UCS code point * * Check whether the character is part of CyrillicSupplement UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsCyrillicSupplement(int code) { return(((code >= 0x0500) && (code <= 0x052F))); } /** * xmlUCSIsDeseret: * @code: UCS code point * * Check whether the character is part of Deseret UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsDeseret(int code) { return(((code >= 0x10400) && (code <= 0x1044F))); } /** * xmlUCSIsDevanagari: * @code: UCS code point * * Check whether the character is part of Devanagari UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsDevanagari(int code) { return(((code >= 0x0900) && (code <= 0x097F))); } /** * xmlUCSIsDingbats: * @code: UCS code point * * Check whether the character is part of Dingbats UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsDingbats(int code) { return(((code >= 0x2700) && (code <= 0x27BF))); } /** * xmlUCSIsEnclosedAlphanumerics: * @code: UCS code point * * Check whether the character is part of EnclosedAlphanumerics UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsEnclosedAlphanumerics(int code) { return(((code >= 0x2460) && (code <= 0x24FF))); } /** * xmlUCSIsEnclosedCJKLettersandMonths: * @code: UCS code point * * Check whether the character is part of EnclosedCJKLettersandMonths UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsEnclosedCJKLettersandMonths(int code) { return(((code >= 0x3200) && (code <= 0x32FF))); } /** * xmlUCSIsEthiopic: * @code: UCS code point * * Check whether the character is part of Ethiopic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsEthiopic(int code) { return(((code >= 0x1200) && (code <= 0x137F))); } /** * xmlUCSIsGeneralPunctuation: * @code: UCS code point * * Check whether the character is part of GeneralPunctuation UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGeneralPunctuation(int code) { return(((code >= 0x2000) && (code <= 0x206F))); } /** * xmlUCSIsGeometricShapes: * @code: UCS code point * * Check whether the character is part of GeometricShapes UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGeometricShapes(int code) { return(((code >= 0x25A0) && (code <= 0x25FF))); } /** * xmlUCSIsGeorgian: * @code: UCS code point * * Check whether the character is part of Georgian UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGeorgian(int code) { return(((code >= 0x10A0) && (code <= 0x10FF))); } /** * xmlUCSIsGothic: * @code: UCS code point * * Check whether the character is part of Gothic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGothic(int code) { return(((code >= 0x10330) && (code <= 0x1034F))); } /** * xmlUCSIsGreek: * @code: UCS code point * * Check whether the character is part of Greek UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGreek(int code) { return(((code >= 0x0370) && (code <= 0x03FF))); } /** * xmlUCSIsGreekExtended: * @code: UCS code point * * Check whether the character is part of GreekExtended UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGreekExtended(int code) { return(((code >= 0x1F00) && (code <= 0x1FFF))); } /** * xmlUCSIsGreekandCoptic: * @code: UCS code point * * Check whether the character is part of GreekandCoptic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGreekandCoptic(int code) { return(((code >= 0x0370) && (code <= 0x03FF))); } /** * xmlUCSIsGujarati: * @code: UCS code point * * Check whether the character is part of Gujarati UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGujarati(int code) { return(((code >= 0x0A80) && (code <= 0x0AFF))); } /** * xmlUCSIsGurmukhi: * @code: UCS code point * * Check whether the character is part of Gurmukhi UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsGurmukhi(int code) { return(((code >= 0x0A00) && (code <= 0x0A7F))); } /** * xmlUCSIsHalfwidthandFullwidthForms: * @code: UCS code point * * Check whether the character is part of HalfwidthandFullwidthForms UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHalfwidthandFullwidthForms(int code) { return(((code >= 0xFF00) && (code <= 0xFFEF))); } /** * xmlUCSIsHangulCompatibilityJamo: * @code: UCS code point * * Check whether the character is part of HangulCompatibilityJamo UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHangulCompatibilityJamo(int code) { return(((code >= 0x3130) && (code <= 0x318F))); } /** * xmlUCSIsHangulJamo: * @code: UCS code point * * Check whether the character is part of HangulJamo UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHangulJamo(int code) { return(((code >= 0x1100) && (code <= 0x11FF))); } /** * xmlUCSIsHangulSyllables: * @code: UCS code point * * Check whether the character is part of HangulSyllables UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHangulSyllables(int code) { return(((code >= 0xAC00) && (code <= 0xD7AF))); } /** * xmlUCSIsHanunoo: * @code: UCS code point * * Check whether the character is part of Hanunoo UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHanunoo(int code) { return(((code >= 0x1720) && (code <= 0x173F))); } /** * xmlUCSIsHebrew: * @code: UCS code point * * Check whether the character is part of Hebrew UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHebrew(int code) { return(((code >= 0x0590) && (code <= 0x05FF))); } /** * xmlUCSIsHighPrivateUseSurrogates: * @code: UCS code point * * Check whether the character is part of HighPrivateUseSurrogates UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHighPrivateUseSurrogates(int code) { return(((code >= 0xDB80) && (code <= 0xDBFF))); } /** * xmlUCSIsHighSurrogates: * @code: UCS code point * * Check whether the character is part of HighSurrogates UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHighSurrogates(int code) { return(((code >= 0xD800) && (code <= 0xDB7F))); } /** * xmlUCSIsHiragana: * @code: UCS code point * * Check whether the character is part of Hiragana UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsHiragana(int code) { return(((code >= 0x3040) && (code <= 0x309F))); } /** * xmlUCSIsIPAExtensions: * @code: UCS code point * * Check whether the character is part of IPAExtensions UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsIPAExtensions(int code) { return(((code >= 0x0250) && (code <= 0x02AF))); } /** * xmlUCSIsIdeographicDescriptionCharacters: * @code: UCS code point * * Check whether the character is part of IdeographicDescriptionCharacters UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsIdeographicDescriptionCharacters(int code) { return(((code >= 0x2FF0) && (code <= 0x2FFF))); } /** * xmlUCSIsKanbun: * @code: UCS code point * * Check whether the character is part of Kanbun UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsKanbun(int code) { return(((code >= 0x3190) && (code <= 0x319F))); } /** * xmlUCSIsKangxiRadicals: * @code: UCS code point * * Check whether the character is part of KangxiRadicals UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsKangxiRadicals(int code) { return(((code >= 0x2F00) && (code <= 0x2FDF))); } /** * xmlUCSIsKannada: * @code: UCS code point * * Check whether the character is part of Kannada UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsKannada(int code) { return(((code >= 0x0C80) && (code <= 0x0CFF))); } /** * xmlUCSIsKatakana: * @code: UCS code point * * Check whether the character is part of Katakana UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsKatakana(int code) { return(((code >= 0x30A0) && (code <= 0x30FF))); } /** * xmlUCSIsKatakanaPhoneticExtensions: * @code: UCS code point * * Check whether the character is part of KatakanaPhoneticExtensions UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsKatakanaPhoneticExtensions(int code) { return(((code >= 0x31F0) && (code <= 0x31FF))); } /** * xmlUCSIsKhmer: * @code: UCS code point * * Check whether the character is part of Khmer UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsKhmer(int code) { return(((code >= 0x1780) && (code <= 0x17FF))); } /** * xmlUCSIsKhmerSymbols: * @code: UCS code point * * Check whether the character is part of KhmerSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsKhmerSymbols(int code) { return(((code >= 0x19E0) && (code <= 0x19FF))); } /** * xmlUCSIsLao: * @code: UCS code point * * Check whether the character is part of Lao UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLao(int code) { return(((code >= 0x0E80) && (code <= 0x0EFF))); } /** * xmlUCSIsLatin1Supplement: * @code: UCS code point * * Check whether the character is part of Latin-1Supplement UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLatin1Supplement(int code) { return(((code >= 0x0080) && (code <= 0x00FF))); } /** * xmlUCSIsLatinExtendedA: * @code: UCS code point * * Check whether the character is part of LatinExtended-A UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLatinExtendedA(int code) { return(((code >= 0x0100) && (code <= 0x017F))); } /** * xmlUCSIsLatinExtendedB: * @code: UCS code point * * Check whether the character is part of LatinExtended-B UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLatinExtendedB(int code) { return(((code >= 0x0180) && (code <= 0x024F))); } /** * xmlUCSIsLatinExtendedAdditional: * @code: UCS code point * * Check whether the character is part of LatinExtendedAdditional UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLatinExtendedAdditional(int code) { return(((code >= 0x1E00) && (code <= 0x1EFF))); } /** * xmlUCSIsLetterlikeSymbols: * @code: UCS code point * * Check whether the character is part of LetterlikeSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLetterlikeSymbols(int code) { return(((code >= 0x2100) && (code <= 0x214F))); } /** * xmlUCSIsLimbu: * @code: UCS code point * * Check whether the character is part of Limbu UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLimbu(int code) { return(((code >= 0x1900) && (code <= 0x194F))); } /** * xmlUCSIsLinearBIdeograms: * @code: UCS code point * * Check whether the character is part of LinearBIdeograms UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLinearBIdeograms(int code) { return(((code >= 0x10080) && (code <= 0x100FF))); } /** * xmlUCSIsLinearBSyllabary: * @code: UCS code point * * Check whether the character is part of LinearBSyllabary UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLinearBSyllabary(int code) { return(((code >= 0x10000) && (code <= 0x1007F))); } /** * xmlUCSIsLowSurrogates: * @code: UCS code point * * Check whether the character is part of LowSurrogates UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsLowSurrogates(int code) { return(((code >= 0xDC00) && (code <= 0xDFFF))); } /** * xmlUCSIsMalayalam: * @code: UCS code point * * Check whether the character is part of Malayalam UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMalayalam(int code) { return(((code >= 0x0D00) && (code <= 0x0D7F))); } /** * xmlUCSIsMathematicalAlphanumericSymbols: * @code: UCS code point * * Check whether the character is part of MathematicalAlphanumericSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMathematicalAlphanumericSymbols(int code) { return(((code >= 0x1D400) && (code <= 0x1D7FF))); } /** * xmlUCSIsMathematicalOperators: * @code: UCS code point * * Check whether the character is part of MathematicalOperators UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMathematicalOperators(int code) { return(((code >= 0x2200) && (code <= 0x22FF))); } /** * xmlUCSIsMiscellaneousMathematicalSymbolsA: * @code: UCS code point * * Check whether the character is part of MiscellaneousMathematicalSymbols-A UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMiscellaneousMathematicalSymbolsA(int code) { return(((code >= 0x27C0) && (code <= 0x27EF))); } /** * xmlUCSIsMiscellaneousMathematicalSymbolsB: * @code: UCS code point * * Check whether the character is part of MiscellaneousMathematicalSymbols-B UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMiscellaneousMathematicalSymbolsB(int code) { return(((code >= 0x2980) && (code <= 0x29FF))); } /** * xmlUCSIsMiscellaneousSymbols: * @code: UCS code point * * Check whether the character is part of MiscellaneousSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMiscellaneousSymbols(int code) { return(((code >= 0x2600) && (code <= 0x26FF))); } /** * xmlUCSIsMiscellaneousSymbolsandArrows: * @code: UCS code point * * Check whether the character is part of MiscellaneousSymbolsandArrows UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMiscellaneousSymbolsandArrows(int code) { return(((code >= 0x2B00) && (code <= 0x2BFF))); } /** * xmlUCSIsMiscellaneousTechnical: * @code: UCS code point * * Check whether the character is part of MiscellaneousTechnical UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMiscellaneousTechnical(int code) { return(((code >= 0x2300) && (code <= 0x23FF))); } /** * xmlUCSIsMongolian: * @code: UCS code point * * Check whether the character is part of Mongolian UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMongolian(int code) { return(((code >= 0x1800) && (code <= 0x18AF))); } /** * xmlUCSIsMusicalSymbols: * @code: UCS code point * * Check whether the character is part of MusicalSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMusicalSymbols(int code) { return(((code >= 0x1D100) && (code <= 0x1D1FF))); } /** * xmlUCSIsMyanmar: * @code: UCS code point * * Check whether the character is part of Myanmar UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsMyanmar(int code) { return(((code >= 0x1000) && (code <= 0x109F))); } /** * xmlUCSIsNumberForms: * @code: UCS code point * * Check whether the character is part of NumberForms UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsNumberForms(int code) { return(((code >= 0x2150) && (code <= 0x218F))); } /** * xmlUCSIsOgham: * @code: UCS code point * * Check whether the character is part of Ogham UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsOgham(int code) { return(((code >= 0x1680) && (code <= 0x169F))); } /** * xmlUCSIsOldItalic: * @code: UCS code point * * Check whether the character is part of OldItalic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsOldItalic(int code) { return(((code >= 0x10300) && (code <= 0x1032F))); } /** * xmlUCSIsOpticalCharacterRecognition: * @code: UCS code point * * Check whether the character is part of OpticalCharacterRecognition UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsOpticalCharacterRecognition(int code) { return(((code >= 0x2440) && (code <= 0x245F))); } /** * xmlUCSIsOriya: * @code: UCS code point * * Check whether the character is part of Oriya UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsOriya(int code) { return(((code >= 0x0B00) && (code <= 0x0B7F))); } /** * xmlUCSIsOsmanya: * @code: UCS code point * * Check whether the character is part of Osmanya UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsOsmanya(int code) { return(((code >= 0x10480) && (code <= 0x104AF))); } /** * xmlUCSIsPhoneticExtensions: * @code: UCS code point * * Check whether the character is part of PhoneticExtensions UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsPhoneticExtensions(int code) { return(((code >= 0x1D00) && (code <= 0x1D7F))); } /** * xmlUCSIsPrivateUse: * @code: UCS code point * * Check whether the character is part of PrivateUse UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsPrivateUse(int code) { return(((code >= 0xE000) && (code <= 0xF8FF)) || ((code >= 0xF0000) && (code <= 0xFFFFF)) || ((code >= 0x100000) && (code <= 0x10FFFF))); } /** * xmlUCSIsPrivateUseArea: * @code: UCS code point * * Check whether the character is part of PrivateUseArea UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsPrivateUseArea(int code) { return(((code >= 0xE000) && (code <= 0xF8FF))); } /** * xmlUCSIsRunic: * @code: UCS code point * * Check whether the character is part of Runic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsRunic(int code) { return(((code >= 0x16A0) && (code <= 0x16FF))); } /** * xmlUCSIsShavian: * @code: UCS code point * * Check whether the character is part of Shavian UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsShavian(int code) { return(((code >= 0x10450) && (code <= 0x1047F))); } /** * xmlUCSIsSinhala: * @code: UCS code point * * Check whether the character is part of Sinhala UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSinhala(int code) { return(((code >= 0x0D80) && (code <= 0x0DFF))); } /** * xmlUCSIsSmallFormVariants: * @code: UCS code point * * Check whether the character is part of SmallFormVariants UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSmallFormVariants(int code) { return(((code >= 0xFE50) && (code <= 0xFE6F))); } /** * xmlUCSIsSpacingModifierLetters: * @code: UCS code point * * Check whether the character is part of SpacingModifierLetters UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSpacingModifierLetters(int code) { return(((code >= 0x02B0) && (code <= 0x02FF))); } /** * xmlUCSIsSpecials: * @code: UCS code point * * Check whether the character is part of Specials UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSpecials(int code) { return(((code >= 0xFFF0) && (code <= 0xFFFF))); } /** * xmlUCSIsSuperscriptsandSubscripts: * @code: UCS code point * * Check whether the character is part of SuperscriptsandSubscripts UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSuperscriptsandSubscripts(int code) { return(((code >= 0x2070) && (code <= 0x209F))); } /** * xmlUCSIsSupplementalArrowsA: * @code: UCS code point * * Check whether the character is part of SupplementalArrows-A UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSupplementalArrowsA(int code) { return(((code >= 0x27F0) && (code <= 0x27FF))); } /** * xmlUCSIsSupplementalArrowsB: * @code: UCS code point * * Check whether the character is part of SupplementalArrows-B UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSupplementalArrowsB(int code) { return(((code >= 0x2900) && (code <= 0x297F))); } /** * xmlUCSIsSupplementalMathematicalOperators: * @code: UCS code point * * Check whether the character is part of SupplementalMathematicalOperators UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSupplementalMathematicalOperators(int code) { return(((code >= 0x2A00) && (code <= 0x2AFF))); } /** * xmlUCSIsSupplementaryPrivateUseAreaA: * @code: UCS code point * * Check whether the character is part of SupplementaryPrivateUseArea-A UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSupplementaryPrivateUseAreaA(int code) { return(((code >= 0xF0000) && (code <= 0xFFFFF))); } /** * xmlUCSIsSupplementaryPrivateUseAreaB: * @code: UCS code point * * Check whether the character is part of SupplementaryPrivateUseArea-B UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSupplementaryPrivateUseAreaB(int code) { return(((code >= 0x100000) && (code <= 0x10FFFF))); } /** * xmlUCSIsSyriac: * @code: UCS code point * * Check whether the character is part of Syriac UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsSyriac(int code) { return(((code >= 0x0700) && (code <= 0x074F))); } /** * xmlUCSIsTagalog: * @code: UCS code point * * Check whether the character is part of Tagalog UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTagalog(int code) { return(((code >= 0x1700) && (code <= 0x171F))); } /** * xmlUCSIsTagbanwa: * @code: UCS code point * * Check whether the character is part of Tagbanwa UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTagbanwa(int code) { return(((code >= 0x1760) && (code <= 0x177F))); } /** * xmlUCSIsTags: * @code: UCS code point * * Check whether the character is part of Tags UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTags(int code) { return(((code >= 0xE0000) && (code <= 0xE007F))); } /** * xmlUCSIsTaiLe: * @code: UCS code point * * Check whether the character is part of TaiLe UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTaiLe(int code) { return(((code >= 0x1950) && (code <= 0x197F))); } /** * xmlUCSIsTaiXuanJingSymbols: * @code: UCS code point * * Check whether the character is part of TaiXuanJingSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTaiXuanJingSymbols(int code) { return(((code >= 0x1D300) && (code <= 0x1D35F))); } /** * xmlUCSIsTamil: * @code: UCS code point * * Check whether the character is part of Tamil UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTamil(int code) { return(((code >= 0x0B80) && (code <= 0x0BFF))); } /** * xmlUCSIsTelugu: * @code: UCS code point * * Check whether the character is part of Telugu UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTelugu(int code) { return(((code >= 0x0C00) && (code <= 0x0C7F))); } /** * xmlUCSIsThaana: * @code: UCS code point * * Check whether the character is part of Thaana UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsThaana(int code) { return(((code >= 0x0780) && (code <= 0x07BF))); } /** * xmlUCSIsThai: * @code: UCS code point * * Check whether the character is part of Thai UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsThai(int code) { return(((code >= 0x0E00) && (code <= 0x0E7F))); } /** * xmlUCSIsTibetan: * @code: UCS code point * * Check whether the character is part of Tibetan UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsTibetan(int code) { return(((code >= 0x0F00) && (code <= 0x0FFF))); } /** * xmlUCSIsUgaritic: * @code: UCS code point * * Check whether the character is part of Ugaritic UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsUgaritic(int code) { return(((code >= 0x10380) && (code <= 0x1039F))); } /** * xmlUCSIsUnifiedCanadianAboriginalSyllabics: * @code: UCS code point * * Check whether the character is part of UnifiedCanadianAboriginalSyllabics UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsUnifiedCanadianAboriginalSyllabics(int code) { return(((code >= 0x1400) && (code <= 0x167F))); } /** * xmlUCSIsVariationSelectors: * @code: UCS code point * * Check whether the character is part of VariationSelectors UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsVariationSelectors(int code) { return(((code >= 0xFE00) && (code <= 0xFE0F))); } /** * xmlUCSIsVariationSelectorsSupplement: * @code: UCS code point * * Check whether the character is part of VariationSelectorsSupplement UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsVariationSelectorsSupplement(int code) { return(((code >= 0xE0100) && (code <= 0xE01EF))); } /** * xmlUCSIsYiRadicals: * @code: UCS code point * * Check whether the character is part of YiRadicals UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsYiRadicals(int code) { return(((code >= 0xA490) && (code <= 0xA4CF))); } /** * xmlUCSIsYiSyllables: * @code: UCS code point * * Check whether the character is part of YiSyllables UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsYiSyllables(int code) { return(((code >= 0xA000) && (code <= 0xA48F))); } /** * xmlUCSIsYijingHexagramSymbols: * @code: UCS code point * * Check whether the character is part of YijingHexagramSymbols UCS Block * * Returns 1 if true 0 otherwise */ int xmlUCSIsYijingHexagramSymbols(int code) { return(((code >= 0x4DC0) && (code <= 0x4DFF))); } /** * xmlUCSIsBlock: * @code: UCS code point * @block: UCS block name * * Check whether the character is part of the UCS Block * * Returns 1 if true, 0 if false and -1 on unknown block */ int xmlUCSIsBlock(int code, const char *block) { xmlIntFunc *func; func = xmlUnicodeLookup(&xmlUnicodeBlockTbl, block); if (func == NULL) return (-1); return (func(code)); } /** * xmlUCSIsCatC: * @code: UCS code point * * Check whether the character is part of C UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatC(int code) { return(xmlCharInRange((unsigned int)code, &xmlCG)); } /** * xmlUCSIsCatCc: * @code: UCS code point * * Check whether the character is part of Cc UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatCc(int code) { return(((code >= 0x0) && (code <= 0x1f)) || ((code >= 0x7f) && (code <= 0x9f))); } /** * xmlUCSIsCatCf: * @code: UCS code point * * Check whether the character is part of Cf UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatCf(int code) { return(xmlCharInRange((unsigned int)code, &xmlCfG)); } /** * xmlUCSIsCatCo: * @code: UCS code point * * Check whether the character is part of Co UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatCo(int code) { return((code == 0xe000) || (code == 0xf8ff) || (code == 0xf0000) || (code == 0xffffd) || (code == 0x100000) || (code == 0x10fffd)); } /** * xmlUCSIsCatCs: * @code: UCS code point * * Check whether the character is part of Cs UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatCs(int code) { return((code == 0xd800) || ((code >= 0xdb7f) && (code <= 0xdb80)) || ((code >= 0xdbff) && (code <= 0xdc00)) || (code == 0xdfff)); } /** * xmlUCSIsCatL: * @code: UCS code point * * Check whether the character is part of L UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatL(int code) { return(xmlCharInRange((unsigned int)code, &xmlLG)); } /** * xmlUCSIsCatLl: * @code: UCS code point * * Check whether the character is part of Ll UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatLl(int code) { return(xmlCharInRange((unsigned int)code, &xmlLlG)); } /** * xmlUCSIsCatLm: * @code: UCS code point * * Check whether the character is part of Lm UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatLm(int code) { return(xmlCharInRange((unsigned int)code, &xmlLmG)); } /** * xmlUCSIsCatLo: * @code: UCS code point * * Check whether the character is part of Lo UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatLo(int code) { return(xmlCharInRange((unsigned int)code, &xmlLoG)); } /** * xmlUCSIsCatLt: * @code: UCS code point * * Check whether the character is part of Lt UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatLt(int code) { return(xmlCharInRange((unsigned int)code, &xmlLtG)); } /** * xmlUCSIsCatLu: * @code: UCS code point * * Check whether the character is part of Lu UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatLu(int code) { return(xmlCharInRange((unsigned int)code, &xmlLuG)); } /** * xmlUCSIsCatM: * @code: UCS code point * * Check whether the character is part of M UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatM(int code) { return(xmlCharInRange((unsigned int)code, &xmlMG)); } /** * xmlUCSIsCatMc: * @code: UCS code point * * Check whether the character is part of Mc UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatMc(int code) { return(xmlCharInRange((unsigned int)code, &xmlMcG)); } /** * xmlUCSIsCatMe: * @code: UCS code point * * Check whether the character is part of Me UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatMe(int code) { return(((code >= 0x488) && (code <= 0x489)) || (code == 0x6de) || ((code >= 0x20dd) && (code <= 0x20e0)) || ((code >= 0x20e2) && (code <= 0x20e4))); } /** * xmlUCSIsCatMn: * @code: UCS code point * * Check whether the character is part of Mn UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatMn(int code) { return(xmlCharInRange((unsigned int)code, &xmlMnG)); } /** * xmlUCSIsCatN: * @code: UCS code point * * Check whether the character is part of N UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatN(int code) { return(xmlCharInRange((unsigned int)code, &xmlNG)); } /** * xmlUCSIsCatNd: * @code: UCS code point * * Check whether the character is part of Nd UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatNd(int code) { return(xmlCharInRange((unsigned int)code, &xmlNdG)); } /** * xmlUCSIsCatNl: * @code: UCS code point * * Check whether the character is part of Nl UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatNl(int code) { return(((code >= 0x16ee) && (code <= 0x16f0)) || ((code >= 0x2160) && (code <= 0x2183)) || (code == 0x3007) || ((code >= 0x3021) && (code <= 0x3029)) || ((code >= 0x3038) && (code <= 0x303a)) || (code == 0x1034a)); } /** * xmlUCSIsCatNo: * @code: UCS code point * * Check whether the character is part of No UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatNo(int code) { return(xmlCharInRange((unsigned int)code, &xmlNoG)); } /** * xmlUCSIsCatP: * @code: UCS code point * * Check whether the character is part of P UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatP(int code) { return(xmlCharInRange((unsigned int)code, &xmlPG)); } /** * xmlUCSIsCatPc: * @code: UCS code point * * Check whether the character is part of Pc UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatPc(int code) { return((code == 0x5f) || ((code >= 0x203f) && (code <= 0x2040)) || (code == 0x2054) || (code == 0x30fb) || ((code >= 0xfe33) && (code <= 0xfe34)) || ((code >= 0xfe4d) && (code <= 0xfe4f)) || (code == 0xff3f) || (code == 0xff65)); } /** * xmlUCSIsCatPd: * @code: UCS code point * * Check whether the character is part of Pd UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatPd(int code) { return(xmlCharInRange((unsigned int)code, &xmlPdG)); } /** * xmlUCSIsCatPe: * @code: UCS code point * * Check whether the character is part of Pe UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatPe(int code) { return(xmlCharInRange((unsigned int)code, &xmlPeG)); } /** * xmlUCSIsCatPf: * @code: UCS code point * * Check whether the character is part of Pf UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatPf(int code) { return((code == 0xbb) || (code == 0x2019) || (code == 0x201d) || (code == 0x203a)); } /** * xmlUCSIsCatPi: * @code: UCS code point * * Check whether the character is part of Pi UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatPi(int code) { return((code == 0xab) || (code == 0x2018) || ((code >= 0x201b) && (code <= 0x201c)) || (code == 0x201f) || (code == 0x2039)); } /** * xmlUCSIsCatPo: * @code: UCS code point * * Check whether the character is part of Po UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatPo(int code) { return(xmlCharInRange((unsigned int)code, &xmlPoG)); } /** * xmlUCSIsCatPs: * @code: UCS code point * * Check whether the character is part of Ps UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatPs(int code) { return(xmlCharInRange((unsigned int)code, &xmlPsG)); } /** * xmlUCSIsCatS: * @code: UCS code point * * Check whether the character is part of S UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatS(int code) { return(xmlCharInRange((unsigned int)code, &xmlSG)); } /** * xmlUCSIsCatSc: * @code: UCS code point * * Check whether the character is part of Sc UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatSc(int code) { return(xmlCharInRange((unsigned int)code, &xmlScG)); } /** * xmlUCSIsCatSk: * @code: UCS code point * * Check whether the character is part of Sk UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatSk(int code) { return(xmlCharInRange((unsigned int)code, &xmlSkG)); } /** * xmlUCSIsCatSm: * @code: UCS code point * * Check whether the character is part of Sm UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatSm(int code) { return(xmlCharInRange((unsigned int)code, &xmlSmG)); } /** * xmlUCSIsCatSo: * @code: UCS code point * * Check whether the character is part of So UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatSo(int code) { return(xmlCharInRange((unsigned int)code, &xmlSoG)); } /** * xmlUCSIsCatZ: * @code: UCS code point * * Check whether the character is part of Z UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatZ(int code) { return(xmlCharInRange((unsigned int)code, &xmlZG)); } /** * xmlUCSIsCatZl: * @code: UCS code point * * Check whether the character is part of Zl UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatZl(int code) { return((code == 0x2028)); } /** * xmlUCSIsCatZp: * @code: UCS code point * * Check whether the character is part of Zp UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatZp(int code) { return((code == 0x2029)); } /** * xmlUCSIsCatZs: * @code: UCS code point * * Check whether the character is part of Zs UCS Category * * Returns 1 if true 0 otherwise */ int xmlUCSIsCatZs(int code) { return((code == 0x20) || (code == 0xa0) || (code == 0x1680) || (code == 0x180e) || ((code >= 0x2000) && (code <= 0x200a)) || (code == 0x202f) || (code == 0x205f) || (code == 0x3000)); } /** * xmlUCSIsCat: * @code: UCS code point * @cat: UCS Category name * * Check whether the character is part of the UCS Category * * Returns 1 if true, 0 if false and -1 on unknown category */ int xmlUCSIsCat(int code, const char *cat) { xmlIntFunc *func; func = xmlUnicodeLookup(&xmlUnicodeCatTbl, cat); if (func == NULL) return (-1); return (func(code)); } #define bottom_xmlunicode #include "elfgcchack.h" #endif /* LIBXML_UNICODE_ENABLED */ libxml2-2.9.1+dfsg1/xinclude.c0000644000175000017500000020700112113312343014524 0ustar aronaron/* * xinclude.c : Code to implement XInclude processing * * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 * http://www.w3.org/TR/2003/WD-xinclude-20031110 * * See Copyright for the status of this software. * * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #include #include #include #include #include #include #include #include #include #include #ifdef LIBXML_XINCLUDE_ENABLED #include #include "buf.h" #define XINCLUDE_MAX_DEPTH 40 /* #define DEBUG_XINCLUDE */ #ifdef DEBUG_XINCLUDE #ifdef LIBXML_DEBUG_ENABLED #include #endif #endif /************************************************************************ * * * XInclude context handling * * * ************************************************************************/ /* * An XInclude context */ typedef xmlChar *xmlURL; typedef struct _xmlXIncludeRef xmlXIncludeRef; typedef xmlXIncludeRef *xmlXIncludeRefPtr; struct _xmlXIncludeRef { xmlChar *URI; /* the fully resolved resource URL */ xmlChar *fragment; /* the fragment in the URI */ xmlDocPtr doc; /* the parsed document */ xmlNodePtr ref; /* the node making the reference in the source */ xmlNodePtr inc; /* the included copy */ int xml; /* xml or txt */ int count; /* how many refs use that specific doc */ xmlXPathObjectPtr xptr; /* the xpointer if needed */ int emptyFb; /* flag to show fallback empty */ }; struct _xmlXIncludeCtxt { xmlDocPtr doc; /* the source document */ int incBase; /* the first include for this document */ int incNr; /* number of includes */ int incMax; /* size of includes tab */ xmlXIncludeRefPtr *incTab; /* array of included references */ int txtNr; /* number of unparsed documents */ int txtMax; /* size of unparsed documents tab */ xmlNodePtr *txtTab; /* array of unparsed text nodes */ xmlURL *txturlTab; /* array of unparsed text URLs */ xmlChar * url; /* the current URL processed */ int urlNr; /* number of URLs stacked */ int urlMax; /* size of URL stack */ xmlChar * *urlTab; /* URL stack */ int nbErrors; /* the number of errors detected */ int legacy; /* using XINCLUDE_OLD_NS */ int parseFlags; /* the flags used for parsing XML documents */ xmlChar * base; /* the current xml:base */ void *_private; /* application data */ }; static int xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree); /************************************************************************ * * * XInclude error handler * * * ************************************************************************/ /** * xmlXIncludeErrMemory: * @extra: extra information * * Handle an out of memory condition */ static void xmlXIncludeErrMemory(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, const char *extra) { if (ctxt != NULL) ctxt->nbErrors++; __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, extra, NULL, NULL, 0, 0, "Memory allocation failed : %s\n", extra); } /** * xmlXIncludeErr: * @ctxt: the XInclude context * @node: the context node * @msg: the error message * @extra: extra information * * Handle an XInclude error */ static void xmlXIncludeErr(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, const char *msg, const xmlChar *extra) { if (ctxt != NULL) ctxt->nbErrors++; __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, error, XML_ERR_ERROR, NULL, 0, (const char *) extra, NULL, NULL, 0, 0, msg, (const char *) extra); } #if 0 /** * xmlXIncludeWarn: * @ctxt: the XInclude context * @node: the context node * @msg: the error message * @extra: extra information * * Emit an XInclude warning. */ static void xmlXIncludeWarn(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, const char *msg, const xmlChar *extra) { __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, error, XML_ERR_WARNING, NULL, 0, (const char *) extra, NULL, NULL, 0, 0, msg, (const char *) extra); } #endif /** * xmlXIncludeGetProp: * @ctxt: the XInclude context * @cur: the node * @name: the attribute name * * Get an XInclude attribute * * Returns the value (to be freed) or NULL if not found */ static xmlChar * xmlXIncludeGetProp(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur, const xmlChar *name) { xmlChar *ret; ret = xmlGetNsProp(cur, XINCLUDE_NS, name); if (ret != NULL) return(ret); if (ctxt->legacy != 0) { ret = xmlGetNsProp(cur, XINCLUDE_OLD_NS, name); if (ret != NULL) return(ret); } ret = xmlGetProp(cur, name); return(ret); } /** * xmlXIncludeFreeRef: * @ref: the XInclude reference * * Free an XInclude reference */ static void xmlXIncludeFreeRef(xmlXIncludeRefPtr ref) { if (ref == NULL) return; #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Freeing ref\n"); #endif if (ref->doc != NULL) { #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Freeing doc %s\n", ref->URI); #endif xmlFreeDoc(ref->doc); } if (ref->URI != NULL) xmlFree(ref->URI); if (ref->fragment != NULL) xmlFree(ref->fragment); if (ref->xptr != NULL) xmlXPathFreeObject(ref->xptr); xmlFree(ref); } /** * xmlXIncludeNewRef: * @ctxt: the XInclude context * @URI: the resource URI * * Creates a new reference within an XInclude context * * Returns the new set */ static xmlXIncludeRefPtr xmlXIncludeNewRef(xmlXIncludeCtxtPtr ctxt, const xmlChar *URI, xmlNodePtr ref) { xmlXIncludeRefPtr ret; #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "New ref %s\n", URI); #endif ret = (xmlXIncludeRefPtr) xmlMalloc(sizeof(xmlXIncludeRef)); if (ret == NULL) { xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); return(NULL); } memset(ret, 0, sizeof(xmlXIncludeRef)); if (URI == NULL) ret->URI = NULL; else ret->URI = xmlStrdup(URI); ret->fragment = NULL; ret->ref = ref; ret->doc = NULL; ret->count = 0; ret->xml = 0; ret->inc = NULL; if (ctxt->incMax == 0) { ctxt->incMax = 4; ctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(ctxt->incMax * sizeof(ctxt->incTab[0])); if (ctxt->incTab == NULL) { xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); xmlXIncludeFreeRef(ret); return(NULL); } } if (ctxt->incNr >= ctxt->incMax) { ctxt->incMax *= 2; ctxt->incTab = (xmlXIncludeRefPtr *) xmlRealloc(ctxt->incTab, ctxt->incMax * sizeof(ctxt->incTab[0])); if (ctxt->incTab == NULL) { xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); xmlXIncludeFreeRef(ret); return(NULL); } } ctxt->incTab[ctxt->incNr++] = ret; return(ret); } /** * xmlXIncludeNewContext: * @doc: an XML Document * * Creates a new XInclude context * * Returns the new set */ xmlXIncludeCtxtPtr xmlXIncludeNewContext(xmlDocPtr doc) { xmlXIncludeCtxtPtr ret; #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "New context\n"); #endif if (doc == NULL) return(NULL); ret = (xmlXIncludeCtxtPtr) xmlMalloc(sizeof(xmlXIncludeCtxt)); if (ret == NULL) { xmlXIncludeErrMemory(NULL, (xmlNodePtr) doc, "creating XInclude context"); return(NULL); } memset(ret, 0, sizeof(xmlXIncludeCtxt)); ret->doc = doc; ret->incNr = 0; ret->incBase = 0; ret->incMax = 0; ret->incTab = NULL; ret->nbErrors = 0; return(ret); } /** * xmlXIncludeURLPush: * @ctxt: the parser context * @value: the url * * Pushes a new url on top of the url stack * * Returns -1 in case of error, the index in the stack otherwise */ static int xmlXIncludeURLPush(xmlXIncludeCtxtPtr ctxt, const xmlChar *value) { if (ctxt->urlNr > XINCLUDE_MAX_DEPTH) { xmlXIncludeErr(ctxt, NULL, XML_XINCLUDE_RECURSION, "detected a recursion in %s\n", value); return(-1); } if (ctxt->urlTab == NULL) { ctxt->urlMax = 4; ctxt->urlNr = 0; ctxt->urlTab = (xmlChar * *) xmlMalloc( ctxt->urlMax * sizeof(ctxt->urlTab[0])); if (ctxt->urlTab == NULL) { xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); return (-1); } } if (ctxt->urlNr >= ctxt->urlMax) { ctxt->urlMax *= 2; ctxt->urlTab = (xmlChar * *) xmlRealloc(ctxt->urlTab, ctxt->urlMax * sizeof(ctxt->urlTab[0])); if (ctxt->urlTab == NULL) { xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); return (-1); } } ctxt->url = ctxt->urlTab[ctxt->urlNr] = xmlStrdup(value); return (ctxt->urlNr++); } /** * xmlXIncludeURLPop: * @ctxt: the parser context * * Pops the top URL from the URL stack */ static void xmlXIncludeURLPop(xmlXIncludeCtxtPtr ctxt) { xmlChar * ret; if (ctxt->urlNr <= 0) return; ctxt->urlNr--; if (ctxt->urlNr > 0) ctxt->url = ctxt->urlTab[ctxt->urlNr - 1]; else ctxt->url = NULL; ret = ctxt->urlTab[ctxt->urlNr]; ctxt->urlTab[ctxt->urlNr] = NULL; if (ret != NULL) xmlFree(ret); } /** * xmlXIncludeFreeContext: * @ctxt: the XInclude context * * Free an XInclude context */ void xmlXIncludeFreeContext(xmlXIncludeCtxtPtr ctxt) { int i; #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Freeing context\n"); #endif if (ctxt == NULL) return; while (ctxt->urlNr > 0) xmlXIncludeURLPop(ctxt); if (ctxt->urlTab != NULL) xmlFree(ctxt->urlTab); for (i = 0;i < ctxt->incNr;i++) { if (ctxt->incTab[i] != NULL) xmlXIncludeFreeRef(ctxt->incTab[i]); } if (ctxt->txturlTab != NULL) { for (i = 0;i < ctxt->txtNr;i++) { if (ctxt->txturlTab[i] != NULL) xmlFree(ctxt->txturlTab[i]); } } if (ctxt->incTab != NULL) xmlFree(ctxt->incTab); if (ctxt->txtTab != NULL) xmlFree(ctxt->txtTab); if (ctxt->txturlTab != NULL) xmlFree(ctxt->txturlTab); if (ctxt->base != NULL) { xmlFree(ctxt->base); } xmlFree(ctxt); } /** * xmlXIncludeParseFile: * @ctxt: the XInclude context * @URL: the URL or file path * * parse a document for XInclude */ static xmlDocPtr xmlXIncludeParseFile(xmlXIncludeCtxtPtr ctxt, const char *URL) { xmlDocPtr ret; xmlParserCtxtPtr pctxt; xmlParserInputPtr inputStream; xmlInitParser(); pctxt = xmlNewParserCtxt(); if (pctxt == NULL) { xmlXIncludeErrMemory(ctxt, NULL, "cannot allocate parser context"); return(NULL); } /* * pass in the application data to the parser context. */ pctxt->_private = ctxt->_private; /* * try to ensure that new documents included are actually * built with the same dictionary as the including document. */ if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL)) { if (pctxt->dict != NULL) xmlDictFree(pctxt->dict); pctxt->dict = ctxt->doc->dict; xmlDictReference(pctxt->dict); } xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); if (inputStream == NULL) { xmlFreeParserCtxt(pctxt); return(NULL); } inputPush(pctxt, inputStream); if (pctxt->directory == NULL) pctxt->directory = xmlParserGetDirectory(URL); pctxt->loadsubset |= XML_DETECT_IDS; xmlParseDocument(pctxt); if (pctxt->wellFormed) { ret = pctxt->myDoc; } else { ret = NULL; if (pctxt->myDoc != NULL) xmlFreeDoc(pctxt->myDoc); pctxt->myDoc = NULL; } xmlFreeParserCtxt(pctxt); return(ret); } /** * xmlXIncludeAddNode: * @ctxt: the XInclude context * @cur: the new node * * Add a new node to process to an XInclude context */ static int xmlXIncludeAddNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur) { xmlXIncludeRefPtr ref; xmlURIPtr uri; xmlChar *URL; xmlChar *fragment = NULL; xmlChar *href; xmlChar *parse; xmlChar *base; xmlChar *URI; int xml = 1, i; /* default Issue 64 */ int local = 0; if (ctxt == NULL) return(-1); if (cur == NULL) return(-1); #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Add node\n"); #endif /* * read the attributes */ href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); if (href == NULL) { href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ if (href == NULL) return(-1); } if ((href[0] == '#') || (href[0] == 0)) local = 1; parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); if (parse != NULL) { if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) xml = 1; else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) xml = 0; else { xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_PARSE_VALUE, "invalid value %s for 'parse'\n", parse); if (href != NULL) xmlFree(href); if (parse != NULL) xmlFree(parse); return(-1); } } /* * compute the URI */ base = xmlNodeGetBase(ctxt->doc, cur); if (base == NULL) { URI = xmlBuildURI(href, ctxt->doc->URL); } else { URI = xmlBuildURI(href, base); } if (URI == NULL) { xmlChar *escbase; xmlChar *eschref; /* * Some escaping may be needed */ escbase = xmlURIEscape(base); eschref = xmlURIEscape(href); URI = xmlBuildURI(eschref, escbase); if (escbase != NULL) xmlFree(escbase); if (eschref != NULL) xmlFree(eschref); } if (parse != NULL) xmlFree(parse); if (href != NULL) xmlFree(href); if (base != NULL) xmlFree(base); if (URI == NULL) { xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, "failed build URL\n", NULL); return(-1); } fragment = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE_XPOINTER); /* * Check the URL and remove any fragment identifier */ uri = xmlParseURI((const char *)URI); if (uri == NULL) { xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, "invalid value URI %s\n", URI); if (fragment != NULL) xmlFree(fragment); xmlFree(URI); return(-1); } if (uri->fragment != NULL) { if (ctxt->legacy != 0) { if (fragment == NULL) { fragment = (xmlChar *) uri->fragment; } else { xmlFree(uri->fragment); } } else { xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_FRAGMENT_ID, "Invalid fragment identifier in URI %s use the xpointer attribute\n", URI); if (fragment != NULL) xmlFree(fragment); xmlFreeURI(uri); xmlFree(URI); return(-1); } uri->fragment = NULL; } URL = xmlSaveUri(uri); xmlFreeURI(uri); xmlFree(URI); if (URL == NULL) { xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, "invalid value URI %s\n", URI); if (fragment != NULL) xmlFree(fragment); return(-1); } /* * If local and xml then we need a fragment */ if ((local == 1) && (xml == 1) && ((fragment == NULL) || (fragment[0] == 0))) { xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_RECURSION, "detected a local recursion with no xpointer in %s\n", URL); if (fragment != NULL) xmlFree(fragment); return(-1); } /* * Check the URL against the stack for recursions */ if ((!local) && (xml == 1)) { for (i = 0;i < ctxt->urlNr;i++) { if (xmlStrEqual(URL, ctxt->urlTab[i])) { xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_RECURSION, "detected a recursion in %s\n", URL); return(-1); } } } ref = xmlXIncludeNewRef(ctxt, URL, cur); if (ref == NULL) { return(-1); } ref->fragment = fragment; ref->doc = NULL; ref->xml = xml; ref->count = 1; xmlFree(URL); return(0); } /** * xmlXIncludeRecurseDoc: * @ctxt: the XInclude context * @doc: the new document * @url: the associated URL * * The XInclude recursive nature is handled at this point. */ static void xmlXIncludeRecurseDoc(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, const xmlURL url ATTRIBUTE_UNUSED) { xmlXIncludeCtxtPtr newctxt; int i; /* * Avoid recursion in already substitued resources for (i = 0;i < ctxt->urlNr;i++) { if (xmlStrEqual(doc->URL, ctxt->urlTab[i])) return; } */ #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Recursing in doc %s\n", doc->URL); #endif /* * Handle recursion here. */ newctxt = xmlXIncludeNewContext(doc); if (newctxt != NULL) { /* * Copy the private user data */ newctxt->_private = ctxt->_private; /* * Copy the existing document set */ newctxt->incMax = ctxt->incMax; newctxt->incNr = ctxt->incNr; newctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(newctxt->incMax * sizeof(newctxt->incTab[0])); if (newctxt->incTab == NULL) { xmlXIncludeErrMemory(ctxt, (xmlNodePtr) doc, "processing doc"); xmlFree(newctxt); return; } /* * copy the urlTab */ newctxt->urlMax = ctxt->urlMax; newctxt->urlNr = ctxt->urlNr; newctxt->urlTab = ctxt->urlTab; /* * Inherit the existing base */ newctxt->base = xmlStrdup(ctxt->base); /* * Inherit the documents already in use by other includes */ newctxt->incBase = ctxt->incNr; for (i = 0;i < ctxt->incNr;i++) { newctxt->incTab[i] = ctxt->incTab[i]; newctxt->incTab[i]->count++; /* prevent the recursion from freeing it */ } /* * The new context should also inherit the Parse Flags * (bug 132597) */ newctxt->parseFlags = ctxt->parseFlags; xmlXIncludeDoProcess(newctxt, doc, xmlDocGetRootElement(doc)); for (i = 0;i < ctxt->incNr;i++) { newctxt->incTab[i]->count--; newctxt->incTab[i] = NULL; } /* urlTab may have been reallocated */ ctxt->urlTab = newctxt->urlTab; ctxt->urlMax = newctxt->urlMax; newctxt->urlMax = 0; newctxt->urlNr = 0; newctxt->urlTab = NULL; xmlXIncludeFreeContext(newctxt); } #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Done recursing in doc %s\n", url); #endif } /** * xmlXIncludeAddTxt: * @ctxt: the XInclude context * @txt: the new text node * @url: the associated URL * * Add a new txtument to the list */ static void xmlXIncludeAddTxt(xmlXIncludeCtxtPtr ctxt, xmlNodePtr txt, const xmlURL url) { #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Adding text %s\n", url); #endif if (ctxt->txtMax == 0) { ctxt->txtMax = 4; ctxt->txtTab = (xmlNodePtr *) xmlMalloc(ctxt->txtMax * sizeof(ctxt->txtTab[0])); if (ctxt->txtTab == NULL) { xmlXIncludeErrMemory(ctxt, NULL, "processing text"); return; } ctxt->txturlTab = (xmlURL *) xmlMalloc(ctxt->txtMax * sizeof(ctxt->txturlTab[0])); if (ctxt->txturlTab == NULL) { xmlXIncludeErrMemory(ctxt, NULL, "processing text"); return; } } if (ctxt->txtNr >= ctxt->txtMax) { ctxt->txtMax *= 2; ctxt->txtTab = (xmlNodePtr *) xmlRealloc(ctxt->txtTab, ctxt->txtMax * sizeof(ctxt->txtTab[0])); if (ctxt->txtTab == NULL) { xmlXIncludeErrMemory(ctxt, NULL, "processing text"); return; } ctxt->txturlTab = (xmlURL *) xmlRealloc(ctxt->txturlTab, ctxt->txtMax * sizeof(ctxt->txturlTab[0])); if (ctxt->txturlTab == NULL) { xmlXIncludeErrMemory(ctxt, NULL, "processing text"); return; } } ctxt->txtTab[ctxt->txtNr] = txt; ctxt->txturlTab[ctxt->txtNr] = xmlStrdup(url); ctxt->txtNr++; } /************************************************************************ * * * Node copy with specific semantic * * * ************************************************************************/ static xmlNodePtr xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, xmlDocPtr source, xmlNodePtr elem); /** * xmlXIncludeCopyNode: * @ctxt: the XInclude context * @target: the document target * @source: the document source * @elem: the element * * Make a copy of the node while preserving the XInclude semantic * of the Infoset copy */ static xmlNodePtr xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, xmlDocPtr source, xmlNodePtr elem) { xmlNodePtr result = NULL; if ((ctxt == NULL) || (target == NULL) || (source == NULL) || (elem == NULL)) return(NULL); if (elem->type == XML_DTD_NODE) return(NULL); if (elem->type == XML_DOCUMENT_NODE) result = xmlXIncludeCopyNodeList(ctxt, target, source, elem->children); else result = xmlDocCopyNode(elem, target, 1); return(result); } /** * xmlXIncludeCopyNodeList: * @ctxt: the XInclude context * @target: the document target * @source: the document source * @elem: the element list * * Make a copy of the node list while preserving the XInclude semantic * of the Infoset copy */ static xmlNodePtr xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, xmlDocPtr source, xmlNodePtr elem) { xmlNodePtr cur, res, result = NULL, last = NULL; if ((ctxt == NULL) || (target == NULL) || (source == NULL) || (elem == NULL)) return(NULL); cur = elem; while (cur != NULL) { res = xmlXIncludeCopyNode(ctxt, target, source, cur); if (res != NULL) { if (result == NULL) { result = last = res; } else { last->next = res; res->prev = last; last = res; } } cur = cur->next; } return(result); } /** * xmlXIncludeGetNthChild: * @cur: the node * @no: the child number * * Returns the @n'th element child of @cur or NULL */ static xmlNodePtr xmlXIncludeGetNthChild(xmlNodePtr cur, int no) { int i; if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) return(NULL); cur = cur->children; for (i = 0;i <= no;cur = cur->next) { if (cur == NULL) return(cur); if ((cur->type == XML_ELEMENT_NODE) || (cur->type == XML_DOCUMENT_NODE) || (cur->type == XML_HTML_DOCUMENT_NODE)) { i++; if (i == no) break; } } return(cur); } xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level); /* in xpointer.c */ /** * xmlXIncludeCopyRange: * @ctxt: the XInclude context * @target: the document target * @source: the document source * @obj: the XPointer result from the evaluation. * * Build a node list tree copy of the XPointer result. * * Returns an xmlNodePtr list or NULL. * The caller has to free the node tree. */ static xmlNodePtr xmlXIncludeCopyRange(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, xmlDocPtr source, xmlXPathObjectPtr range) { /* pointers to generated nodes */ xmlNodePtr list = NULL, last = NULL, listParent = NULL; xmlNodePtr tmp, tmp2; /* pointers to traversal nodes */ xmlNodePtr start, cur, end; int index1, index2; int level = 0, lastLevel = 0, endLevel = 0, endFlag = 0; if ((ctxt == NULL) || (target == NULL) || (source == NULL) || (range == NULL)) return(NULL); if (range->type != XPATH_RANGE) return(NULL); start = (xmlNodePtr) range->user; if ((start == NULL) || (start->type == XML_NAMESPACE_DECL)) return(NULL); end = range->user2; if (end == NULL) return(xmlDocCopyNode(start, target, 1)); if (end->type == XML_NAMESPACE_DECL) return(NULL); cur = start; index1 = range->index; index2 = range->index2; /* * level is depth of the current node under consideration * list is the pointer to the root of the output tree * listParent is a pointer to the parent of output tree (within the included file) in case we need to add another level * last is a pointer to the last node added to the output tree * lastLevel is the depth of last (relative to the root) */ while (cur != NULL) { /* * Check if our output tree needs a parent */ if (level < 0) { while (level < 0) { /* copy must include namespaces and properties */ tmp2 = xmlDocCopyNode(listParent, target, 2); xmlAddChild(tmp2, list); list = tmp2; listParent = listParent->parent; level++; } last = list; lastLevel = 0; } /* * Check whether we need to change our insertion point */ while (level < lastLevel) { last = last->parent; lastLevel --; } if (cur == end) { /* Are we at the end of the range? */ if (cur->type == XML_TEXT_NODE) { const xmlChar *content = cur->content; int len; if (content == NULL) { tmp = xmlNewTextLen(NULL, 0); } else { len = index2; if ((cur == start) && (index1 > 1)) { content += (index1 - 1); len -= (index1 - 1); } else { len = index2; } tmp = xmlNewTextLen(content, len); } /* single sub text node selection */ if (list == NULL) return(tmp); /* prune and return full set */ if (level == lastLevel) xmlAddNextSibling(last, tmp); else xmlAddChild(last, tmp); return(list); } else { /* ending node not a text node */ endLevel = level; /* remember the level of the end node */ endFlag = 1; /* last node - need to take care of properties + namespaces */ tmp = xmlDocCopyNode(cur, target, 2); if (list == NULL) { list = tmp; listParent = cur->parent; } else { if (level == lastLevel) xmlAddNextSibling(last, tmp); else { xmlAddChild(last, tmp); lastLevel = level; } } last = tmp; if (index2 > 1) { end = xmlXIncludeGetNthChild(cur, index2 - 1); index2 = 0; } if ((cur == start) && (index1 > 1)) { cur = xmlXIncludeGetNthChild(cur, index1 - 1); index1 = 0; } else { cur = cur->children; } level++; /* increment level to show change */ /* * Now gather the remaining nodes from cur to end */ continue; /* while */ } } else if (cur == start) { /* Not at the end, are we at start? */ if ((cur->type == XML_TEXT_NODE) || (cur->type == XML_CDATA_SECTION_NODE)) { const xmlChar *content = cur->content; if (content == NULL) { tmp = xmlNewTextLen(NULL, 0); } else { if (index1 > 1) { content += (index1 - 1); index1 = 0; } tmp = xmlNewText(content); } last = list = tmp; listParent = cur->parent; } else { /* Not text node */ /* * start of the range - need to take care of * properties and namespaces */ tmp = xmlDocCopyNode(cur, target, 2); list = last = tmp; listParent = cur->parent; if (index1 > 1) { /* Do we need to position? */ cur = xmlXIncludeGetNthChild(cur, index1 - 1); level = lastLevel = 1; index1 = 0; /* * Now gather the remaining nodes from cur to end */ continue; /* while */ } } } else { tmp = NULL; switch (cur->type) { case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_NODE: /* Do not copy DTD informations */ break; case XML_ENTITY_DECL: /* handle crossing entities -> stack needed */ break; case XML_XINCLUDE_START: case XML_XINCLUDE_END: /* don't consider it part of the tree content */ break; case XML_ATTRIBUTE_NODE: /* Humm, should not happen ! */ break; default: /* * Middle of the range - need to take care of * properties and namespaces */ tmp = xmlDocCopyNode(cur, target, 2); break; } if (tmp != NULL) { if (level == lastLevel) xmlAddNextSibling(last, tmp); else { xmlAddChild(last, tmp); lastLevel = level; } last = tmp; } } /* * Skip to next node in document order */ cur = xmlXPtrAdvanceNode(cur, &level); if (endFlag && (level >= endLevel)) break; } return(list); } /** * xmlXIncludeBuildNodeList: * @ctxt: the XInclude context * @target: the document target * @source: the document source * @obj: the XPointer result from the evaluation. * * Build a node list tree copy of the XPointer result. * This will drop Attributes and Namespace declarations. * * Returns an xmlNodePtr list or NULL. * the caller has to free the node tree. */ static xmlNodePtr xmlXIncludeCopyXPointer(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, xmlDocPtr source, xmlXPathObjectPtr obj) { xmlNodePtr list = NULL, last = NULL; int i; if (source == NULL) source = ctxt->doc; if ((ctxt == NULL) || (target == NULL) || (source == NULL) || (obj == NULL)) return(NULL); switch (obj->type) { case XPATH_NODESET: { xmlNodeSetPtr set = obj->nodesetval; if (set == NULL) return(NULL); for (i = 0;i < set->nodeNr;i++) { if (set->nodeTab[i] == NULL) continue; switch (set->nodeTab[i]->type) { case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ELEMENT_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif case XML_XINCLUDE_END: break; case XML_XINCLUDE_START: { xmlNodePtr tmp, cur = set->nodeTab[i]; cur = cur->next; while (cur != NULL) { switch(cur->type) { case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ELEMENT_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: tmp = xmlXIncludeCopyNode(ctxt, target, source, cur); if (last == NULL) { list = last = tmp; } else { xmlAddNextSibling(last, tmp); last = tmp; } cur = cur->next; continue; default: break; } break; } continue; } case XML_ATTRIBUTE_NODE: case XML_NAMESPACE_DECL: case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: continue; /* for */ } if (last == NULL) list = last = xmlXIncludeCopyNode(ctxt, target, source, set->nodeTab[i]); else { xmlAddNextSibling(last, xmlXIncludeCopyNode(ctxt, target, source, set->nodeTab[i])); if (last->next != NULL) last = last->next; } } break; } case XPATH_LOCATIONSET: { xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; if (set == NULL) return(NULL); for (i = 0;i < set->locNr;i++) { if (last == NULL) list = last = xmlXIncludeCopyXPointer(ctxt, target, source, set->locTab[i]); else xmlAddNextSibling(last, xmlXIncludeCopyXPointer(ctxt, target, source, set->locTab[i])); if (last != NULL) { while (last->next != NULL) last = last->next; } } break; } #ifdef LIBXML_XPTR_ENABLED case XPATH_RANGE: return(xmlXIncludeCopyRange(ctxt, target, source, obj)); #endif case XPATH_POINT: /* points are ignored in XInclude */ break; default: break; } return(list); } /************************************************************************ * * * XInclude I/O handling * * * ************************************************************************/ typedef struct _xmlXIncludeMergeData xmlXIncludeMergeData; typedef xmlXIncludeMergeData *xmlXIncludeMergeDataPtr; struct _xmlXIncludeMergeData { xmlDocPtr doc; xmlXIncludeCtxtPtr ctxt; }; /** * xmlXIncludeMergeOneEntity: * @ent: the entity * @doc: the including doc * @nr: the entity name * * Inplements the merge of one entity */ static void xmlXIncludeMergeEntity(xmlEntityPtr ent, xmlXIncludeMergeDataPtr data, xmlChar *name ATTRIBUTE_UNUSED) { xmlEntityPtr ret, prev; xmlDocPtr doc; xmlXIncludeCtxtPtr ctxt; if ((ent == NULL) || (data == NULL)) return; ctxt = data->ctxt; doc = data->doc; if ((ctxt == NULL) || (doc == NULL)) return; switch (ent->etype) { case XML_INTERNAL_PARAMETER_ENTITY: case XML_EXTERNAL_PARAMETER_ENTITY: case XML_INTERNAL_PREDEFINED_ENTITY: return; case XML_INTERNAL_GENERAL_ENTITY: case XML_EXTERNAL_GENERAL_PARSED_ENTITY: case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: break; } ret = xmlAddDocEntity(doc, ent->name, ent->etype, ent->ExternalID, ent->SystemID, ent->content); if (ret != NULL) { if (ent->URI != NULL) ret->URI = xmlStrdup(ent->URI); } else { prev = xmlGetDocEntity(doc, ent->name); if (prev != NULL) { if (ent->etype != prev->etype) goto error; if ((ent->SystemID != NULL) && (prev->SystemID != NULL)) { if (!xmlStrEqual(ent->SystemID, prev->SystemID)) goto error; } else if ((ent->ExternalID != NULL) && (prev->ExternalID != NULL)) { if (!xmlStrEqual(ent->ExternalID, prev->ExternalID)) goto error; } else if ((ent->content != NULL) && (prev->content != NULL)) { if (!xmlStrEqual(ent->content, prev->content)) goto error; } else { goto error; } } } return; error: switch (ent->etype) { case XML_INTERNAL_PARAMETER_ENTITY: case XML_EXTERNAL_PARAMETER_ENTITY: case XML_INTERNAL_PREDEFINED_ENTITY: case XML_INTERNAL_GENERAL_ENTITY: case XML_EXTERNAL_GENERAL_PARSED_ENTITY: return; case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: break; } xmlXIncludeErr(ctxt, (xmlNodePtr) ent, XML_XINCLUDE_ENTITY_DEF_MISMATCH, "mismatch in redefinition of entity %s\n", ent->name); } /** * xmlXIncludeMergeEntities: * @ctxt: an XInclude context * @doc: the including doc * @from: the included doc * * Inplements the entity merge * * Returns 0 if merge succeeded, -1 if some processing failed */ static int xmlXIncludeMergeEntities(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlDocPtr from) { xmlNodePtr cur; xmlDtdPtr target, source; if (ctxt == NULL) return(-1); if ((from == NULL) || (from->intSubset == NULL)) return(0); target = doc->intSubset; if (target == NULL) { cur = xmlDocGetRootElement(doc); if (cur == NULL) return(-1); target = xmlCreateIntSubset(doc, cur->name, NULL, NULL); if (target == NULL) return(-1); } source = from->intSubset; if ((source != NULL) && (source->entities != NULL)) { xmlXIncludeMergeData data; data.ctxt = ctxt; data.doc = doc; xmlHashScan((xmlHashTablePtr) source->entities, (xmlHashScanner) xmlXIncludeMergeEntity, &data); } source = from->extSubset; if ((source != NULL) && (source->entities != NULL)) { xmlXIncludeMergeData data; data.ctxt = ctxt; data.doc = doc; /* * don't duplicate existing stuff when external subsets are the same */ if ((!xmlStrEqual(target->ExternalID, source->ExternalID)) && (!xmlStrEqual(target->SystemID, source->SystemID))) { xmlHashScan((xmlHashTablePtr) source->entities, (xmlHashScanner) xmlXIncludeMergeEntity, &data); } } return(0); } /** * xmlXIncludeLoadDoc: * @ctxt: the XInclude context * @url: the associated URL * @nr: the xinclude node number * * Load the document, and store the result in the XInclude context * * Returns 0 in case of success, -1 in case of failure */ static int xmlXIncludeLoadDoc(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { xmlDocPtr doc; xmlURIPtr uri; xmlChar *URL; xmlChar *fragment = NULL; int i = 0; #ifdef LIBXML_XPTR_ENABLED int saveFlags; #endif #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "Loading doc %s:%d\n", url, nr); #endif /* * Check the URL and remove any fragment identifier */ uri = xmlParseURI((const char *)url); if (uri == NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, "invalid value URI %s\n", url); return(-1); } if (uri->fragment != NULL) { fragment = (xmlChar *) uri->fragment; uri->fragment = NULL; } if ((ctxt->incTab != NULL) && (ctxt->incTab[nr] != NULL) && (ctxt->incTab[nr]->fragment != NULL)) { if (fragment != NULL) xmlFree(fragment); fragment = xmlStrdup(ctxt->incTab[nr]->fragment); } URL = xmlSaveUri(uri); xmlFreeURI(uri); if (URL == NULL) { if (ctxt->incTab != NULL) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, "invalid value URI %s\n", url); else xmlXIncludeErr(ctxt, NULL, XML_XINCLUDE_HREF_URI, "invalid value URI %s\n", url); if (fragment != NULL) xmlFree(fragment); return(-1); } /* * Handling of references to the local document are done * directly through ctxt->doc. */ if ((URL[0] == 0) || (URL[0] == '#') || ((ctxt->doc != NULL) && (xmlStrEqual(URL, ctxt->doc->URL)))) { doc = NULL; goto loaded; } /* * Prevent reloading twice the document. */ for (i = 0; i < ctxt->incNr; i++) { if ((xmlStrEqual(URL, ctxt->incTab[i]->URI)) && (ctxt->incTab[i]->doc != NULL)) { doc = ctxt->incTab[i]->doc; #ifdef DEBUG_XINCLUDE printf("Already loaded %s\n", URL); #endif goto loaded; } } /* * Load it. */ #ifdef DEBUG_XINCLUDE printf("loading %s\n", URL); #endif #ifdef LIBXML_XPTR_ENABLED /* * If this is an XPointer evaluation, we want to assure that * all entities have been resolved prior to processing the * referenced document */ saveFlags = ctxt->parseFlags; if (fragment != NULL) { /* if this is an XPointer eval */ ctxt->parseFlags |= XML_PARSE_NOENT; } #endif doc = xmlXIncludeParseFile(ctxt, (const char *)URL); #ifdef LIBXML_XPTR_ENABLED ctxt->parseFlags = saveFlags; #endif if (doc == NULL) { xmlFree(URL); if (fragment != NULL) xmlFree(fragment); return(-1); } ctxt->incTab[nr]->doc = doc; /* * It's possible that the requested URL has been mapped to a * completely different location (e.g. through a catalog entry). * To check for this, we compare the URL with that of the doc * and change it if they disagree (bug 146988). */ if (!xmlStrEqual(URL, doc->URL)) { xmlFree(URL); URL = xmlStrdup(doc->URL); } for (i = nr + 1; i < ctxt->incNr; i++) { if (xmlStrEqual(URL, ctxt->incTab[i]->URI)) { ctxt->incTab[nr]->count++; #ifdef DEBUG_XINCLUDE printf("Increasing %s count since reused\n", URL); #endif break; } } /* * Make sure we have all entities fixed up */ xmlXIncludeMergeEntities(ctxt, ctxt->doc, doc); /* * We don't need the DTD anymore, free up space if (doc->intSubset != NULL) { xmlUnlinkNode((xmlNodePtr) doc->intSubset); xmlFreeNode((xmlNodePtr) doc->intSubset); doc->intSubset = NULL; } if (doc->extSubset != NULL) { xmlUnlinkNode((xmlNodePtr) doc->extSubset); xmlFreeNode((xmlNodePtr) doc->extSubset); doc->extSubset = NULL; } */ xmlXIncludeRecurseDoc(ctxt, doc, URL); loaded: if (fragment == NULL) { /* * Add the top children list as the replacement copy. */ if (doc == NULL) { /* Hopefully a DTD declaration won't be copied from * the same document */ ctxt->incTab[nr]->inc = xmlCopyNodeList(ctxt->doc->children); } else { ctxt->incTab[nr]->inc = xmlXIncludeCopyNodeList(ctxt, ctxt->doc, doc, doc->children); } } #ifdef LIBXML_XPTR_ENABLED else { /* * Computes the XPointer expression and make a copy used * as the replacement copy. */ xmlXPathObjectPtr xptr; xmlXPathContextPtr xptrctxt; xmlNodeSetPtr set; if (doc == NULL) { xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr]->ref, NULL); } else { xptrctxt = xmlXPtrNewContext(doc, NULL, NULL); } if (xptrctxt == NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_XPTR_FAILED, "could not create XPointer context\n", NULL); xmlFree(URL); xmlFree(fragment); return(-1); } xptr = xmlXPtrEval(fragment, xptrctxt); if (xptr == NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_XPTR_FAILED, "XPointer evaluation failed: #%s\n", fragment); xmlXPathFreeContext(xptrctxt); xmlFree(URL); xmlFree(fragment); return(-1); } switch (xptr->type) { case XPATH_UNDEFINED: case XPATH_BOOLEAN: case XPATH_NUMBER: case XPATH_STRING: case XPATH_POINT: case XPATH_USERS: case XPATH_XSLT_TREE: xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_XPTR_RESULT, "XPointer is not a range: #%s\n", fragment); xmlXPathFreeContext(xptrctxt); xmlFree(URL); xmlFree(fragment); return(-1); case XPATH_NODESET: if ((xptr->nodesetval == NULL) || (xptr->nodesetval->nodeNr <= 0)) { xmlXPathFreeContext(xptrctxt); xmlFree(URL); xmlFree(fragment); return(-1); } case XPATH_RANGE: case XPATH_LOCATIONSET: break; } set = xptr->nodesetval; if (set != NULL) { for (i = 0;i < set->nodeNr;i++) { if (set->nodeTab[i] == NULL) continue; switch (set->nodeTab[i]->type) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif continue; case XML_ATTRIBUTE_NODE: xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_XPTR_RESULT, "XPointer selects an attribute: #%s\n", fragment); set->nodeTab[i] = NULL; continue; case XML_NAMESPACE_DECL: xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_XPTR_RESULT, "XPointer selects a namespace: #%s\n", fragment); set->nodeTab[i] = NULL; continue; case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: case XML_XINCLUDE_START: case XML_XINCLUDE_END: xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_XPTR_RESULT, "XPointer selects unexpected nodes: #%s\n", fragment); set->nodeTab[i] = NULL; set->nodeTab[i] = NULL; continue; /* for */ } } } if (doc == NULL) { ctxt->incTab[nr]->xptr = xptr; ctxt->incTab[nr]->inc = NULL; } else { ctxt->incTab[nr]->inc = xmlXIncludeCopyXPointer(ctxt, ctxt->doc, doc, xptr); xmlXPathFreeObject(xptr); } xmlXPathFreeContext(xptrctxt); xmlFree(fragment); } #endif /* * Do the xml:base fixup if needed */ if ((doc != NULL) && (URL != NULL) && (xmlStrchr(URL, (xmlChar) '/')) && (!(ctxt->parseFlags & XML_PARSE_NOBASEFIX)) && (!(doc->parseFlags & XML_PARSE_NOBASEFIX))) { xmlNodePtr node; xmlChar *base; xmlChar *curBase; /* * The base is only adjusted if "necessary", i.e. if the xinclude node * has a base specified, or the URL is relative */ base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", XML_XML_NAMESPACE); if (base == NULL) { /* * No xml:base on the xinclude node, so we check whether the * URI base is different than (relative to) the context base */ curBase = xmlBuildRelativeURI(URL, ctxt->base); if (curBase == NULL) { /* Error return */ xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, "trying to build relative URI from %s\n", URL); } else { /* If the URI doesn't contain a slash, it's not relative */ if (!xmlStrchr(curBase, (xmlChar) '/')) xmlFree(curBase); else base = curBase; } } if (base != NULL) { /* Adjustment may be needed */ node = ctxt->incTab[nr]->inc; while (node != NULL) { /* Only work on element nodes */ if (node->type == XML_ELEMENT_NODE) { curBase = xmlNodeGetBase(node->doc, node); /* If no current base, set it */ if (curBase == NULL) { xmlNodeSetBase(node, base); } else { /* * If the current base is the same as the * URL of the document, then reset it to be * the specified xml:base or the relative URI */ if (xmlStrEqual(curBase, node->doc->URL)) { xmlNodeSetBase(node, base); } else { /* * If the element already has an xml:base * set, then relativise it if necessary */ xmlChar *xmlBase; xmlBase = xmlGetNsProp(node, BAD_CAST "base", XML_XML_NAMESPACE); if (xmlBase != NULL) { xmlChar *relBase; relBase = xmlBuildURI(xmlBase, base); if (relBase == NULL) { /* error */ xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, "trying to rebuild base from %s\n", xmlBase); } else { xmlNodeSetBase(node, relBase); xmlFree(relBase); } xmlFree(xmlBase); } } xmlFree(curBase); } } node = node->next; } xmlFree(base); } } if ((nr < ctxt->incNr) && (ctxt->incTab[nr]->doc != NULL) && (ctxt->incTab[nr]->count <= 1)) { #ifdef DEBUG_XINCLUDE printf("freeing %s\n", ctxt->incTab[nr]->doc->URL); #endif xmlFreeDoc(ctxt->incTab[nr]->doc); ctxt->incTab[nr]->doc = NULL; } xmlFree(URL); return(0); } /** * xmlXIncludeLoadTxt: * @ctxt: the XInclude context * @url: the associated URL * @nr: the xinclude node number * * Load the content, and store the result in the XInclude context * * Returns 0 in case of success, -1 in case of failure */ static int xmlXIncludeLoadTxt(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { xmlParserInputBufferPtr buf; xmlNodePtr node; xmlURIPtr uri; xmlChar *URL; int i; xmlChar *encoding = NULL; xmlCharEncoding enc = (xmlCharEncoding) 0; xmlParserCtxtPtr pctxt; xmlParserInputPtr inputStream; int xinclude_multibyte_fallback_used = 0; /* * Check the URL and remove any fragment identifier */ uri = xmlParseURI((const char *)url); if (uri == NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, "invalid value URI %s\n", url); return(-1); } if (uri->fragment != NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_TEXT_FRAGMENT, "fragment identifier forbidden for text: %s\n", (const xmlChar *) uri->fragment); xmlFreeURI(uri); return(-1); } URL = xmlSaveUri(uri); xmlFreeURI(uri); if (URL == NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, "invalid value URI %s\n", url); return(-1); } /* * Handling of references to the local document are done * directly through ctxt->doc. */ if (URL[0] == 0) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_TEXT_DOCUMENT, "text serialization of document not available\n", NULL); xmlFree(URL); return(-1); } /* * Prevent reloading twice the document. */ for (i = 0; i < ctxt->txtNr; i++) { if (xmlStrEqual(URL, ctxt->txturlTab[i])) { node = xmlCopyNode(ctxt->txtTab[i], 1); goto loaded; } } /* * Try to get the encoding if available */ if ((ctxt->incTab[nr] != NULL) && (ctxt->incTab[nr]->ref != NULL)) { encoding = xmlGetProp(ctxt->incTab[nr]->ref, XINCLUDE_PARSE_ENCODING); } if (encoding != NULL) { /* * TODO: we should not have to remap to the xmlCharEncoding * predefined set, a better interface than * xmlParserInputBufferCreateFilename should allow any * encoding supported by iconv */ enc = xmlParseCharEncoding((const char *) encoding); if (enc == XML_CHAR_ENCODING_ERROR) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_UNKNOWN_ENCODING, "encoding %s not supported\n", encoding); xmlFree(encoding); xmlFree(URL); return(-1); } xmlFree(encoding); } /* * Load it. */ pctxt = xmlNewParserCtxt(); inputStream = xmlLoadExternalEntity((const char*)URL, NULL, pctxt); if(inputStream == NULL) { xmlFreeParserCtxt(pctxt); xmlFree(URL); return(-1); } buf = inputStream->buf; if (buf == NULL) { xmlFreeInputStream (inputStream); xmlFreeParserCtxt(pctxt); xmlFree(URL); return(-1); } if (buf->encoder) xmlCharEncCloseFunc(buf->encoder); buf->encoder = xmlGetCharEncodingHandler(enc); node = xmlNewText(NULL); /* * Scan all chars from the resource and add the to the node */ xinclude_multibyte_fallback: while (xmlParserInputBufferRead(buf, 128) > 0) { int len; const xmlChar *content; content = xmlBufContent(buf->buffer); len = xmlBufLength(buf->buffer); for (i = 0;i < len;) { int cur; int l; cur = xmlStringCurrentChar(NULL, &content[i], &l); if (!IS_CHAR(cur)) { /* Handle splitted multibyte char at buffer boundary */ if (((len - i) < 4) && (!xinclude_multibyte_fallback_used)) { xinclude_multibyte_fallback_used = 1; xmlBufShrink(buf->buffer, i); goto xinclude_multibyte_fallback; } else { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_INVALID_CHAR, "%s contains invalid char\n", URL); xmlFreeParserInputBuffer(buf); xmlFree(URL); return(-1); } } else { xinclude_multibyte_fallback_used = 0; xmlNodeAddContentLen(node, &content[i], l); } i += l; } xmlBufShrink(buf->buffer, len); } xmlFreeParserCtxt(pctxt); xmlXIncludeAddTxt(ctxt, node, URL); xmlFreeInputStream(inputStream); loaded: /* * Add the element as the replacement copy. */ ctxt->incTab[nr]->inc = node; xmlFree(URL); return(0); } /** * xmlXIncludeLoadFallback: * @ctxt: the XInclude context * @fallback: the fallback node * @nr: the xinclude node number * * Load the content of the fallback node, and store the result * in the XInclude context * * Returns 0 in case of success, -1 in case of failure */ static int xmlXIncludeLoadFallback(xmlXIncludeCtxtPtr ctxt, xmlNodePtr fallback, int nr) { xmlXIncludeCtxtPtr newctxt; int ret = 0; if ((fallback == NULL) || (fallback->type == XML_NAMESPACE_DECL) || (ctxt == NULL)) return(-1); if (fallback->children != NULL) { /* * It's possible that the fallback also has 'includes' * (Bug 129969), so we re-process the fallback just in case */ newctxt = xmlXIncludeNewContext(ctxt->doc); if (newctxt == NULL) return (-1); newctxt->_private = ctxt->_private; newctxt->base = xmlStrdup(ctxt->base); /* Inherit the base from the existing context */ xmlXIncludeSetFlags(newctxt, ctxt->parseFlags); ret = xmlXIncludeDoProcess(newctxt, ctxt->doc, fallback->children); if (ctxt->nbErrors > 0) ret = -1; else if (ret > 0) ret = 0; /* xmlXIncludeDoProcess can return +ve number */ xmlXIncludeFreeContext(newctxt); ctxt->incTab[nr]->inc = xmlDocCopyNodeList(ctxt->doc, fallback->children); } else { ctxt->incTab[nr]->inc = NULL; ctxt->incTab[nr]->emptyFb = 1; /* flag empty callback */ } return(ret); } /************************************************************************ * * * XInclude Processing * * * ************************************************************************/ /** * xmlXIncludePreProcessNode: * @ctxt: an XInclude context * @node: an XInclude node * * Implement the XInclude preprocessing, currently just adding the element * for further processing. * * Returns the result list or NULL in case of error */ static xmlNodePtr xmlXIncludePreProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { xmlXIncludeAddNode(ctxt, node); return(NULL); } /** * xmlXIncludeLoadNode: * @ctxt: an XInclude context * @nr: the node number * * Find and load the infoset replacement for the given node. * * Returns 0 if substitution succeeded, -1 if some processing failed */ static int xmlXIncludeLoadNode(xmlXIncludeCtxtPtr ctxt, int nr) { xmlNodePtr cur; xmlChar *href; xmlChar *parse; xmlChar *base; xmlChar *oldBase; xmlChar *URI; int xml = 1; /* default Issue 64 */ int ret; if (ctxt == NULL) return(-1); if ((nr < 0) || (nr >= ctxt->incNr)) return(-1); cur = ctxt->incTab[nr]->ref; if (cur == NULL) return(-1); /* * read the attributes */ href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); if (href == NULL) { href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ if (href == NULL) return(-1); } parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); if (parse != NULL) { if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) xml = 1; else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) xml = 0; else { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_PARSE_VALUE, "invalid value %s for 'parse'\n", parse); if (href != NULL) xmlFree(href); if (parse != NULL) xmlFree(parse); return(-1); } } /* * compute the URI */ base = xmlNodeGetBase(ctxt->doc, cur); if (base == NULL) { URI = xmlBuildURI(href, ctxt->doc->URL); } else { URI = xmlBuildURI(href, base); } if (URI == NULL) { xmlChar *escbase; xmlChar *eschref; /* * Some escaping may be needed */ escbase = xmlURIEscape(base); eschref = xmlURIEscape(href); URI = xmlBuildURI(eschref, escbase); if (escbase != NULL) xmlFree(escbase); if (eschref != NULL) xmlFree(eschref); } if (URI == NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, "failed build URL\n", NULL); if (parse != NULL) xmlFree(parse); if (href != NULL) xmlFree(href); if (base != NULL) xmlFree(base); return(-1); } #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "parse: %s\n", xml ? "xml": "text"); xmlGenericError(xmlGenericErrorContext, "URI: %s\n", URI); #endif /* * Save the base for this include (saving the current one) */ oldBase = ctxt->base; ctxt->base = base; if (xml) { ret = xmlXIncludeLoadDoc(ctxt, URI, nr); /* xmlXIncludeGetFragment(ctxt, cur, URI); */ } else { ret = xmlXIncludeLoadTxt(ctxt, URI, nr); } /* * Restore the original base before checking for fallback */ ctxt->base = oldBase; if (ret < 0) { xmlNodePtr children; /* * Time to try a fallback if availble */ #ifdef DEBUG_XINCLUDE xmlGenericError(xmlGenericErrorContext, "error looking for fallback\n"); #endif children = cur->children; while (children != NULL) { if ((children->type == XML_ELEMENT_NODE) && (children->ns != NULL) && (xmlStrEqual(children->name, XINCLUDE_FALLBACK)) && ((xmlStrEqual(children->ns->href, XINCLUDE_NS)) || (xmlStrEqual(children->ns->href, XINCLUDE_OLD_NS)))) { ret = xmlXIncludeLoadFallback(ctxt, children, nr); if (ret == 0) break; } children = children->next; } } if (ret < 0) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_NO_FALLBACK, "could not load %s, and no fallback was found\n", URI); } /* * Cleanup */ if (URI != NULL) xmlFree(URI); if (parse != NULL) xmlFree(parse); if (href != NULL) xmlFree(href); if (base != NULL) xmlFree(base); return(0); } /** * xmlXIncludeIncludeNode: * @ctxt: an XInclude context * @nr: the node number * * Inplement the infoset replacement for the given node * * Returns 0 if substitution succeeded, -1 if some processing failed */ static int xmlXIncludeIncludeNode(xmlXIncludeCtxtPtr ctxt, int nr) { xmlNodePtr cur, end, list, tmp; if (ctxt == NULL) return(-1); if ((nr < 0) || (nr >= ctxt->incNr)) return(-1); cur = ctxt->incTab[nr]->ref; if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) return(-1); /* * If we stored an XPointer a late computation may be needed */ if ((ctxt->incTab[nr]->inc == NULL) && (ctxt->incTab[nr]->xptr != NULL)) { ctxt->incTab[nr]->inc = xmlXIncludeCopyXPointer(ctxt, ctxt->doc, ctxt->doc, ctxt->incTab[nr]->xptr); xmlXPathFreeObject(ctxt->incTab[nr]->xptr); ctxt->incTab[nr]->xptr = NULL; } list = ctxt->incTab[nr]->inc; ctxt->incTab[nr]->inc = NULL; /* * Check against the risk of generating a multi-rooted document */ if ((cur->parent != NULL) && (cur->parent->type != XML_ELEMENT_NODE)) { int nb_elem = 0; tmp = list; while (tmp != NULL) { if (tmp->type == XML_ELEMENT_NODE) nb_elem++; tmp = tmp->next; } if (nb_elem > 1) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_MULTIPLE_ROOT, "XInclude error: would result in multiple root nodes\n", NULL); return(-1); } } if (ctxt->parseFlags & XML_PARSE_NOXINCNODE) { /* * Add the list of nodes */ while (list != NULL) { end = list; list = list->next; xmlAddPrevSibling(cur, end); } xmlUnlinkNode(cur); xmlFreeNode(cur); } else { /* * Change the current node as an XInclude start one, and add an * XInclude end one */ cur->type = XML_XINCLUDE_START; end = xmlNewDocNode(cur->doc, cur->ns, cur->name, NULL); if (end == NULL) { xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_BUILD_FAILED, "failed to build node\n", NULL); return(-1); } end->type = XML_XINCLUDE_END; xmlAddNextSibling(cur, end); /* * Add the list of nodes */ while (list != NULL) { cur = list; list = list->next; xmlAddPrevSibling(end, cur); } } return(0); } /** * xmlXIncludeTestNode: * @ctxt: the XInclude processing context * @node: an XInclude node * * test if the node is an XInclude node * * Returns 1 true, 0 otherwise */ static int xmlXIncludeTestNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { if (node == NULL) return(0); if (node->type != XML_ELEMENT_NODE) return(0); if (node->ns == NULL) return(0); if ((xmlStrEqual(node->ns->href, XINCLUDE_NS)) || (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS))) { if (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS)) { if (ctxt->legacy == 0) { #if 0 /* wait for the XML Core Working Group to get something stable ! */ xmlXIncludeWarn(ctxt, node, XML_XINCLUDE_DEPRECATED_NS, "Deprecated XInclude namespace found, use %s", XINCLUDE_NS); #endif ctxt->legacy = 1; } } if (xmlStrEqual(node->name, XINCLUDE_NODE)) { xmlNodePtr child = node->children; int nb_fallback = 0; while (child != NULL) { if ((child->type == XML_ELEMENT_NODE) && (child->ns != NULL) && ((xmlStrEqual(child->ns->href, XINCLUDE_NS)) || (xmlStrEqual(child->ns->href, XINCLUDE_OLD_NS)))) { if (xmlStrEqual(child->name, XINCLUDE_NODE)) { xmlXIncludeErr(ctxt, node, XML_XINCLUDE_INCLUDE_IN_INCLUDE, "%s has an 'include' child\n", XINCLUDE_NODE); return(0); } if (xmlStrEqual(child->name, XINCLUDE_FALLBACK)) { nb_fallback++; } } child = child->next; } if (nb_fallback > 1) { xmlXIncludeErr(ctxt, node, XML_XINCLUDE_FALLBACKS_IN_INCLUDE, "%s has multiple fallback children\n", XINCLUDE_NODE); return(0); } return(1); } if (xmlStrEqual(node->name, XINCLUDE_FALLBACK)) { if ((node->parent == NULL) || (node->parent->type != XML_ELEMENT_NODE) || (node->parent->ns == NULL) || ((!xmlStrEqual(node->parent->ns->href, XINCLUDE_NS)) && (!xmlStrEqual(node->parent->ns->href, XINCLUDE_OLD_NS))) || (!xmlStrEqual(node->parent->name, XINCLUDE_NODE))) { xmlXIncludeErr(ctxt, node, XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, "%s is not the child of an 'include'\n", XINCLUDE_FALLBACK); } } } return(0); } /** * xmlXIncludeDoProcess: * @ctxt: the XInclude processing context * @doc: an XML document * @tree: the top of the tree to process * * Implement the XInclude substitution on the XML document @doc * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ static int xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree) { xmlNodePtr cur; int ret = 0; int i, start; if ((doc == NULL) || (tree == NULL) || (tree->type == XML_NAMESPACE_DECL)) return(-1); if (ctxt == NULL) return(-1); if (doc->URL != NULL) { ret = xmlXIncludeURLPush(ctxt, doc->URL); if (ret < 0) return(-1); } start = ctxt->incNr; /* * First phase: lookup the elements in the document */ cur = tree; if (xmlXIncludeTestNode(ctxt, cur) == 1) xmlXIncludePreProcessNode(ctxt, cur); while ((cur != NULL) && (cur != tree->parent)) { /* TODO: need to work on entities -> stack */ if ((cur->children != NULL) && (cur->children->type != XML_ENTITY_DECL) && (cur->children->type != XML_XINCLUDE_START) && (cur->children->type != XML_XINCLUDE_END)) { cur = cur->children; if (xmlXIncludeTestNode(ctxt, cur)) xmlXIncludePreProcessNode(ctxt, cur); } else if (cur->next != NULL) { cur = cur->next; if (xmlXIncludeTestNode(ctxt, cur)) xmlXIncludePreProcessNode(ctxt, cur); } else { if (cur == tree) break; do { cur = cur->parent; if ((cur == NULL) || (cur == tree->parent)) break; /* do */ if (cur->next != NULL) { cur = cur->next; if (xmlXIncludeTestNode(ctxt, cur)) xmlXIncludePreProcessNode(ctxt, cur); break; /* do */ } } while (cur != NULL); } } /* * Second Phase : collect the infosets fragments */ for (i = start;i < ctxt->incNr; i++) { xmlXIncludeLoadNode(ctxt, i); ret++; } /* * Third phase: extend the original document infoset. * * Originally we bypassed the inclusion if there were any errors * encountered on any of the XIncludes. A bug was raised (bug * 132588) requesting that we output the XIncludes without error, * so the check for inc!=NULL || xptr!=NULL was put in. This may * give some other problems in the future, but for now it seems to * work ok. * */ for (i = ctxt->incBase;i < ctxt->incNr; i++) { if ((ctxt->incTab[i]->inc != NULL) || (ctxt->incTab[i]->xptr != NULL) || (ctxt->incTab[i]->emptyFb != 0)) /* (empty fallback) */ xmlXIncludeIncludeNode(ctxt, i); } if (doc->URL != NULL) xmlXIncludeURLPop(ctxt); return(ret); } /** * xmlXIncludeSetFlags: * @ctxt: an XInclude processing context * @flags: a set of xmlParserOption used for parsing XML includes * * Set the flags used for further processing of XML resources. * * Returns 0 in case of success and -1 in case of error. */ int xmlXIncludeSetFlags(xmlXIncludeCtxtPtr ctxt, int flags) { if (ctxt == NULL) return(-1); ctxt->parseFlags = flags; return(0); } /** * xmlXIncludeProcessTreeFlagsData: * @tree: an XML node * @flags: a set of xmlParserOption used for parsing XML includes * @data: application data that will be passed to the parser context * in the _private field of the parser context(s) * * Implement the XInclude substitution on the XML node @tree * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ int xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, int flags, void *data) { xmlXIncludeCtxtPtr ctxt; int ret = 0; if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL) || (tree->doc == NULL)) return(-1); ctxt = xmlXIncludeNewContext(tree->doc); if (ctxt == NULL) return(-1); ctxt->_private = data; ctxt->base = xmlStrdup((xmlChar *)tree->doc->URL); xmlXIncludeSetFlags(ctxt, flags); ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); if ((ret >= 0) && (ctxt->nbErrors > 0)) ret = -1; xmlXIncludeFreeContext(ctxt); return(ret); } /** * xmlXIncludeProcessFlagsData: * @doc: an XML document * @flags: a set of xmlParserOption used for parsing XML includes * @data: application data that will be passed to the parser context * in the _private field of the parser context(s) * * Implement the XInclude substitution on the XML document @doc * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ int xmlXIncludeProcessFlagsData(xmlDocPtr doc, int flags, void *data) { xmlNodePtr tree; if (doc == NULL) return(-1); tree = xmlDocGetRootElement(doc); if (tree == NULL) return(-1); return(xmlXIncludeProcessTreeFlagsData(tree, flags, data)); } /** * xmlXIncludeProcessFlags: * @doc: an XML document * @flags: a set of xmlParserOption used for parsing XML includes * * Implement the XInclude substitution on the XML document @doc * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ int xmlXIncludeProcessFlags(xmlDocPtr doc, int flags) { return xmlXIncludeProcessFlagsData(doc, flags, NULL); } /** * xmlXIncludeProcess: * @doc: an XML document * * Implement the XInclude substitution on the XML document @doc * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ int xmlXIncludeProcess(xmlDocPtr doc) { return(xmlXIncludeProcessFlags(doc, 0)); } /** * xmlXIncludeProcessTreeFlags: * @tree: a node in an XML document * @flags: a set of xmlParserOption used for parsing XML includes * * Implement the XInclude substitution for the given subtree * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ int xmlXIncludeProcessTreeFlags(xmlNodePtr tree, int flags) { xmlXIncludeCtxtPtr ctxt; int ret = 0; if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL) || (tree->doc == NULL)) return(-1); ctxt = xmlXIncludeNewContext(tree->doc); if (ctxt == NULL) return(-1); ctxt->base = xmlNodeGetBase(tree->doc, tree); xmlXIncludeSetFlags(ctxt, flags); ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); if ((ret >= 0) && (ctxt->nbErrors > 0)) ret = -1; xmlXIncludeFreeContext(ctxt); return(ret); } /** * xmlXIncludeProcessTree: * @tree: a node in an XML document * * Implement the XInclude substitution for the given subtree * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ int xmlXIncludeProcessTree(xmlNodePtr tree) { return(xmlXIncludeProcessTreeFlags(tree, 0)); } /** * xmlXIncludeProcessNode: * @ctxt: an existing XInclude context * @node: a node in an XML document * * Implement the XInclude substitution for the given subtree reusing * the informations and data coming from the given context. * * Returns 0 if no substitution were done, -1 if some processing failed * or the number of substitutions done. */ int xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { int ret = 0; if ((node == NULL) || (node->type == XML_NAMESPACE_DECL) || (node->doc == NULL) || (ctxt == NULL)) return(-1); ret = xmlXIncludeDoProcess(ctxt, node->doc, node); if ((ret >= 0) && (ctxt->nbErrors > 0)) ret = -1; return(ret); } #else /* !LIBXML_XINCLUDE_ENABLED */ #endif #define bottom_xinclude #include "elfgcchack.h" libxml2-2.9.1+dfsg1/NEWS0000644000175000017500000027314212113312340013252 0ustar aronaron NEWS file for libxml2 Note that this is automatically generated from the news webpage at: http://xmlsoft.org/news.html Items not finished and worked on, get in touch with the list if you want to help those - More testing on RelaxNG - Finishing up XML Schemas The change log at ChangeLog.html describes the recents commits to the SVN at http://svn.gnome.org/viewvc/libxml2/trunk/ code base.Here is the list of public releases: 2.7.6: Oct 6 2009: - Bug Fixes: Restore thread support in default configuration (Andrew W. Nosenko), URI with no path parsing problem (Daniel Veillard), Minor patch for conditional defines in threads.c (Eric Zurcher) 2.7.5: Sep 24 2009: - Bug Fixes: Restore behavior of --with-threads without argument (Andrew W. Nosenko), Fix memory leak when doc is NULL (Rob Richards), 595792 fixing a RelaxNG bug introduced in 2.7.4 (Daniel Veillard), Fix a Relaxng bug raised by libvirt test suite (Daniel Veillard), Fix a parsing problem with little data at startup (Daniel Veillard), link python module with python library (Frederic Crozat), 594874 Forgot an fclose in xmllint (Daniel Veillard) - Cleanup: Adding symbols.xml to EXTRA_DIST (Daniel Veillard) 2.7.4: Sep 10 2009: - Improvements: Switch to GIT (GNOME), Add symbol versioning to libxml2 shared libs (Daniel Veillard) - Portability: 593857 try to work around thread pbm MinGW 4.4 (Daniel Veillard), 594250 rename ATTRIBUTE_ALLOC_SIZE to avoid clashes (Daniel Veillard), Fix Windows build * relaxng.c: fix windows build (Rob Richards), Fix the globals.h to use XMLPUBFUN (Paul Smith), Problem with extern extern in header (Daniel Veillard), Add -lnetwork for compiling on Haiku (Scott McCreary), Runtest portability patch for Solaris (Tim Rice), Small patch to accomodate the Haiku OS (Scott McCreary), 584605 package VxWorks folder in the distribution (Daniel Veillard), 574017 Realloc too expensive on most platform (Daniel Veillard), Fix windows build (Rob Richards), 545579 doesn't compile without schema support (Daniel Veillard), xmllint use xmlGetNodePath when not compiled in (Daniel Veillard), Try to avoid __imp__xmlFree link trouble on msys (Daniel Veillard), Allow to select the threading system on Windows (LRN), Fix Solaris binary links, cleanups (Daniel Veillard), Bug 571059 – MSVC doesn't work with the bakefile (Intron), fix ATTRIBUTE_PRINTF header clash (Belgabor and Mike Hommey), fixes for Borland/CodeGear/Embarcadero compilers (Eric Zurcher) - Documentation: 544910 typo: "renciliateNs" (Leonid Evdokimov), Add VxWorks to list of OSes (Daniel Veillard), Regenerate the documentation and update for git (Daniel Veillard), 560524 ¿ xmlTextReaderLocalName description (Daniel Veillard), Added sponsoring by AOE media for the server (Daniel Veillard), updated URLs for GNOME (Vincent Lefevre), more warnings about xmlCleanupThreads and xmlCleanupParser (Daniel Veillard) - Bug fixes: 594514 memory leaks - duplicate initialization (MOD), Wrong block opening in htmlNodeDumpOutputInternal (Daniel Veillard), 492317 Fix Relax-NG validation problems (Daniel Veillard), 558452 fight with reg test and error report (Daniel Veillard), 558452 RNG compilation of optional multiple child (Daniel Veillard), 579746 XSD validation not correct / nilable groups (Daniel Veillard), 502960 provide namespace stack when parsing entity (Daniel Veillard), 566012 part 2 fix regresion tests and push mode (Daniel Veillard), 566012 autodetected encoding and encoding conflict (Daniel Veillard), 584220 xpointer(/) and xinclude problems (Daniel Veillard), 587663 Incorrect Attribute-Value Normalization (Daniel Veillard), 444994 HTML chunked failure for attribute with <> (Daniel Veillard), Fix end of buffer char being split in XML parser (Daniel Veillard), Non ASCII character may be split at buffer end (Adiel Mittmann), 440226 Add xmlXIncludeProcessTreeFlagsData API (Stefan Behnel), 572129 speed up parsing of large HTML text nodes (Markus Kull), Fix HTML parsing with 0 character in CDATA (Daniel Veillard), Fix SetGenericErrorFunc and SetStructured clash (Wang Lam), 566012 Incomplete EBCDIC parsing support (Martin Kogler), 541335 HTML avoid creating 2 head or 2 body element (Daniel Veillard), 541237 error correcting missing end tags in HTML (Daniel Veillard), 583439 missing line numbers in push mode (Daniel Veillard), 587867 xmllint --html --xmlout serializing as HTML (Daniel Veillard), 559501 avoid select and use poll for nanohttp (Raphael Prevost), 559410 - Regexp bug on (...)? constructs (Daniel Veillard), Fix a small problem on previous HTML parser patch (Daniel Veillard), 592430 - HTML parser runs into endless loop (Daniel Veillard), 447899 potential double free in xmlFreeTextReader (Daniel Veillard), 446613 small validation bug mixed content with NS (Daniel Veillard), Fix the problem of revalidating a doc with RNG (Daniel Veillard), Fix xmlKeepBlanksDefault to not break indent (Nick Wellnhofer), 512131 refs from externalRef part need to be added (Daniel Veillard), 512131 crash in xmlRelaxNGValidateFullElement (Daniel Veillard), 588441 allow '.' in HTML Names even if invalid (Daniel Veillard), 582913 Fix htmlSetMetaEncoding() to be nicer (Daniel Veillard), 579317 Try to find the HTML encoding information (Daniel Veillard), 575875 don't output charset=html (Daniel Veillard), 571271 fix semantic of xsd:all with minOccurs=0 (Daniel Veillard), 570702 fix a bug in regexp determinism checking (Daniel Veillard), 567619 xmlValidateNotationUse missing param test (Daniel Veillard), 574393 ¿ utf-8 filename magic for compressed files (Hans Breuer), Fix a couple of problems in the parser (Daniel Veillard), 585505 ¿ Document ids and refs populated by XSD (Wayne Jensen), 582906 XSD validating multiple imports of the same schema (Jason Childs), Bug 582887 ¿ problems validating complex schemas (Jason Childs), Bug 579729 ¿ fix XSD schemas parsing crash (Miroslav Bajtos), 576368 ¿ htmlChunkParser with special attributes (Jiri Netolicky), Bug 565747 ¿ relax anyURI data character checking (Vincent Lefevre), Preserve attributes of include start on tree copy (Petr Pajas), Skip silently unrecognized XPointer schemes (Jakub Wilk), Fix leak on SAX1, xmllint --sax1 option and debug (Daniel Veillard), potential NULL dereference on non-glibc (Jim Meyering), Fix an XSD validation crash (Daniel Veillard), Fix a regression in streaming entities support (Daniel Veillard), Fix a couple of ABI issues with C14N 1.1 (Aleksey Sanin), Aleksey Sanin support for c14n 1.1 (Aleksey Sanin), reader bug fix with entities (Daniel Veillard), use options from current parser ctxt for external entities (Rob Richards), 581612 use %s to printf strings (Christian Persch), 584605 change the threading initialization sequence (Igor Novoseltsev), 580705 keep line numbers in HTML parser (Aaron Patterson), 581803 broken HTML table attributes init (Roland Steiner), do not set error code in xmlNsWarn (Rob Richards), 564217 fix structured error handling problems, reuse options from current parser for entities (Rob Richards), xmlXPathRegisterNs should not allow enpty prefixes (Daniel Veillard), add a missing check in xmlAddSibling (Kris Breuker), avoid leaks on errors (Jinmei Tatuya) - Cleanup: Chasing dead assignments reported by clang-scan (Daniel Veillard), A few more safety cleanup raised by scan (Daniel Veillard), Fixing assorted potential problems raised by scan (Daniel Veillard), Potential uninitialized arguments raised by scan (Daniel Veillard), Fix a bunch of scan 'dead increments' and cleanup (Daniel Veillard), Remove a pedantic warning (Daniel Veillard), 555833 always use rm -f in uninstall-local (Daniel Veillard), 542394 xmlRegisterOutputCallbacks MAX_INPUT_CALLBACK (Daniel Veillard), Autoregenerate libxml2.syms automated checkings (Daniel Veillard), Make xmlRecoverDoc const (Martin Trappel) (Daniel Veillard), Both args of xmlStrcasestr are const (Daniel Veillard), hide the nbParse* variables used for debugging (Mike Hommey), 570806 changed include of config.h (William M. Brack), cleanups and error reports when xmlTextWriterVSprintf fails (Jinmei Tatuya) 2.7.3: Jan 18 2009: - Build fix: fix build when HTML support is not included. - Bug fixes: avoid memory overflow in gigantic text nodes, indentation problem on the writed (Rob Richards), xmlAddChildList pointer problem (Rob Richards and Kevin Milburn), xmlAddChild problem with attribute (Rob Richards and Kris Breuker), avoid a memory leak in an edge case (Daniel Zimmermann), deallocate some pthread data (Alex Ott). - Improvements: configure option to avoid rebuilding docs (Adrian Bunk), limit text nodes to 10MB max by default, add element traversal APIs, add a parser option to enable pre 2.7 SAX behavior (Rob Richards), add gcc malloc checking (Marcus Meissner), add gcc printf like functions parameters checking (Marcus Meissner). 2.7.2: Oct 3 2008: - Portability fix: fix solaris compilation problem, fix compilation if XPath is not configured in - Bug fixes: nasty entity bug introduced in 2.7.0, restore old behaviour when saving an HTML doc with an xml dump function, HTML UTF-8 parsing bug, fix reader custom error handlers (Riccardo Scussat) - Improvement: xmlSave options for more flexibility to save as XML/HTML/XHTML, handle leading BOM in HTML documents 2.7.1: Sep 1 2008: - Portability fix: Borland C fix (Moritz Both) - Bug fixes: python serialization wrappers, XPath QName corner case handking and leaks (Martin) - Improvement: extend the xmlSave to handle HTML documents and trees - Cleanup: python serialization wrappers 2.7.0: Aug 30 2008: - Documentation: switch ChangeLog to UTF-8, improve mutithreads and xmlParserCleanup docs - Portability fixes: Older Win32 platforms (Rob Richards), MSVC porting fix (Rob Richards), Mac OS X regression tests (Sven Herzberg), non GNUCC builds (Rob Richards), compilation on Haiku (Andreas Färber) - Bug fixes: various realloc problems (Ashwin), potential double-free (Ashwin), regexp crash, icrash with invalid whitespace facets (Rob Richards), pattern fix when streaming (William Brack), various XML parsing and validation fixes based on the W3C regression tests, reader tree skipping function fix (Ashwin), Schemas regexps escaping fix (Volker Grabsch), handling of entity push errors (Ashwin), fix a slowdown when encoder cant serialize characters on output - Code cleanup: compilation fix without the reader, without the output (Robert Schwebel), python whitespace (Martin), many space/tabs cleanups, serious cleanup of the entity handling code - Improvement: switch parser to XML-1.0 5th edition, add parsing flags for old versions, switch URI parsing to RFC 3986, add xmlSchemaValidCtxtGetParserCtxt (Holger Kaelberer), new hashing functions for dictionnaries (based on Stefan Behnel work), improve handling of misplaced html/head/body in HTML parser, better regression test tools and code coverage display, better algorithms to detect various versions of the billion laughts attacks, make arbitrary parser limits avoidable as a parser option 2.6.32: Apr 8 2008: - Documentation: returning heap memory to kernel (Wolfram Sang), trying to clarify xmlCleanupParser() use, xmlXPathContext improvement (Jack Jansen), improve the *Recover* functions documentation, XmlNodeType doc link fix (Martijn Arts) - Bug fixes: internal subset memory leak (Ashwin), avoid problem with paths starting with // (Petr Sumbera), streaming XSD validation callback patches (Ashwin), fix redirection on port other than 80 (William Brack), SAX2 leak (Ashwin), XInclude fragment of own document (Chris Ryan), regexp bug with '.' (Andrew Tosh), flush the writer at the end of the document (Alfred Mickautsch), output I/O bug fix (William Brack), writer CDATA output after a text node (Alex Khesin), UTF-16 encoding detection (William Brack), fix handling of empty CDATA nodes for Safari team, python binding problem with namespace nodes, improve HTML parsing (Arnold Hendriks), regexp automata build bug, memory leak fix (Vasily Chekalkin), XSD test crash, weird system parameter entity parsing problem, allow save to file:///X:/ windows paths, various attribute normalisation problems, externalSubsetSplit fix (Ashwin), attribute redefinition in the DTD (Ashwin), fix in char ref parsing check (Alex Khesin), many out of memory handling fixes (Ashwin), XPath out of memory handling fixes (Alvaro Herrera), various realloc problems (Ashwin), UCS4 encoding conversion buffer size (Christian Fruth), problems with EatName functions on memory errors, BOM handling in external parsed entities (Mark Rowe) - Code cleanup: fix build under VS 2008 (David Wimsey), remove useless mutex in xmlDict (Florent Guilian), Mingw32 compilation fix (Carlo Bramini), Win and MacOS EOL cleanups (Florent Guiliani), iconv need a const detection (Roumen Petrov), simplify xmlSetProp (Julien Charbon), cross compilation fixes for Mingw (Roumen Petrov), SCO Openserver build fix (Florent Guiliani), iconv uses const on Win32 (Rob Richards), duplicate code removal (Ashwin), missing malloc test and error reports (Ashwin), VMS makefile fix (Tycho Hilhorst) - improvements: better plug of schematron in the normal error handling (Tobias Minich) 2.6.31: Jan 11 2008: - Security fix: missing of checks in UTF-8 parsing - Bug fixes: regexp bug, dump attribute from XHTML document, fix xmlFree(NULL) to not crash in debug mode, Schematron parsing crash (Rob Richards), global lock free on Windows (Marc-Antoine Ruel), XSD crash due to double free (Rob Richards), indentation fix in xmlTextWriterFullEndElement (Felipe Pena), error in attribute type parsing if attribute redeclared, avoid crash in hash list scanner if deleting elements, column counter bug fix (Christian Schmidt), HTML embed element saving fix (Stefan Behnel), avoid -L/usr/lib output from xml2-config (Fred Crozat), avoid an xmllint crash (Stefan Kost), don't stop HTML parsing on out of range chars. - Code cleanup: fix open() call third argument, regexp cut'n paste copy error, unused variable in __xmlGlobalInitMutexLock (Hannes Eder), some make distcheck realted fixes (John Carr) - Improvements: HTTP Header: includes port number (William Brack), testURI --debug option, 2.6.30: Aug 23 2007: - Portability: Solaris crash on error handling, windows path fixes (Roland Schwarz and Rob Richards), mingw build (Roland Schwarz) - Bugfixes: xmlXPathNodeSetSort problem (William Brack), leak when reusing a writer for a new document (Dodji Seketeli), Schemas xsi:nil handling patch (Frank Gross), relative URI build problem (Patrik Fimml), crash in xmlDocFormatDump, invalid char in comment detection bug, fix disparity with xmlSAXUserParseMemory, automata generation for complex regexp counts problems, Schemas IDC import problems (Frank Gross), xpath predicate evailation error handling (William Brack) 2.6.29: Jun 12 2007: - Portability: patches from Andreas Stricke for WinCEi, fix compilation warnings (William Brack), avoid warnings on Apple OS/X (Wendy Doyle and Mark Rowe), Windows compilation and threading improvements (Rob Richards), compilation against old Python versions, new GNU tar changes (Ryan Hill) - Documentation: xmlURIUnescapeString comment, - Bugfixes: xmlBufferAdd problem (Richard Jones), 'make valgrind' flag fix (Richard Jones), regexp interpretation of \, htmlCreateDocParserCtxt (Jean-Daniel Dupas), configure.in typo (Bjorn Reese), entity content failure, xmlListAppend() fix (Georges-André Silber), XPath number serialization (William Brack), nanohttp gzipped stream fix (William Brack and Alex Cornejo), xmlCharEncFirstLine typo (Mark Rowe), uri bug (François Delyon), XPath string value of PI nodes (William Brack), XPath node set sorting bugs (William Brack), avoid outputting namespace decl dups in the writer (Rob Richards), xmlCtxtReset bug, UTF-8 encoding error handling, recustion on next in catalogs, fix a Relax-NG crash, workaround wrong file: URIs, htmlNodeDumpFormatOutput on attributes, invalid character in attribute detection bug, big comments before internal subset streaming bug, HTML parsing of attributes with : in the name, IDness of name in HTML (Dagfinn I. MannsÃ¥ker) - Improvement: keep URI query parts in raw form (Richard Jones), embed tag support in HTML (Michael Day) 2.6.28: Apr 17 2007: - Documentation: comment fixes (Markus Keim), xpath comments fixes too (James Dennett) - Bug fixes: XPath bug (William Brack), HTML parser autoclose stack usage (Usamah Malik), various regexp bug fixes (DV and William), path conversion on Windows (Igor Zlatkovic), htmlCtxtReset fix (Michael Day), XPath principal node of axis bug, HTML serialization of some codepoint (Steven Rainwater), user data propagation in XInclude (Michael Day), standalone and XML decl detection (Michael Day), Python id ouptut for some id, fix the big python string memory leak, URI parsing fixes (Stéphane Bidoul and William), long comments parsing bug (William), concurrent threads initialization (Ted Phelps), invalid char in text XInclude (William), XPath memory leak (William), tab in python problems (Andreas Hanke), XPath node comparison error (Oleg Paraschenko), cleanup patch for reader (Julien Reichel), XML Schemas attribute group (William), HTML parsing problem (William), fix char 0x2d in regexps (William), regexp quantifier range with min occurs of 0 (William), HTML script/style parsing (Mike Day) - Improvement: make xmlTextReaderSetup() public - Compilation and postability: fix a missing include problem (William), __ss_familly on AIX again (Björn Wiberg), compilation without zlib (Michael Day), catalog patch for Win32 (Christian Ehrlicher), Windows CE fixes (Andreas Stricke) - Various CVS to SVN infrastructure changes 2.6.27: Oct 25 2006: - Portability fixes: file names on windows (Roland Schwingel, Emelyanov Alexey), windows compile fixup (Rob Richards), AIX iconv() is apparently case sensitive - improvements: Python XPath types mapping (Nic Ferrier), XPath optimization (Kasimier), add xmlXPathCompiledEvalToBoolean (Kasimier), Python node equality and comparison (Andreas Pakulat), xmlXPathCollectAndTest improvememt (Kasimier), expose if library was compiled with zlib support (Andrew Nosenko), cache for xmlSchemaIDCMatcher structs (Kasimier), xmlTextConcat should work with comments and PIs (Rob Richards), export htmlNewParserCtxt needed by Michael Day, refactoring of catalog entity loaders (Michael Day), add XPointer support to python bindings (Ross Reedstrom, Brian West and Stefan Anca), try to sort out most file path to URI conversions and xmlPathToUri, add --html --memory case to xmllint - building fix: fix --with-minimum (Felipe Contreras), VMS fix, const'ification of HTML parser structures (Matthias Clasen), portability fix (Emelyanov Alexey), wget autodetection (Peter Breitenlohner), remove the build path recorded in the python shared module, separate library flags for shared and static builds (Mikhail Zabaluev), fix --with-minimum --with-sax1 builds, fix --with-minimum --with-schemas builds - bug fix: xmlGetNodePath fix (Kasimier), xmlDOMWrapAdoptNode and attribute (Kasimier), crash when using the recover mode, xmlXPathEvalExpr problem (Kasimier), xmlXPathCompExprAdd bug (Kasimier), missing destry in xmlFreeRMutex (Andrew Nosenko), XML Schemas fixes (Kasimier), warning on entities processing, XHTML script and style serialization (Kasimier), python generator for long types, bug in xmlSchemaClearValidCtxt (Bertrand Fritsch), xmlSchemaXPathEvaluate allocation bug (Marton Illes), error message end of line (Rob Richards), fix attribute serialization in writer (Rob Richards), PHP4 DTD validation crasher, parser safety patch (Ben Darnell), _private context propagation when parsing entities (with Michael Day), fix entities behaviour when using SAX, URI to file path fix (Mikhail Zabaluev), disapearing validity context, arg error in SAX callback (Mike Hommey), fix mixed-content autodetect when using --noblanks, fix xmlIOParseDTD error handling, fix bug in xmlSplitQName on special Names, fix Relax-NG element content validation bug, fix xmlReconciliateNs bug, fix potential attribute XML parsing bug, fix line/column accounting in XML parser, chunking bug in the HTML parser on script, try to detect obviously buggy HTML meta encoding indications, bugs with encoding BOM and xmlSaveDoc, HTML entities in attributes parsing, HTML minimized attribute values, htmlReadDoc and htmlReadIO were broken, error handling bug in xmlXPathEvalExpression (Olaf Walkowiak), fix a problem in htmlCtxtUseOptions, xmlNewInputFromFile could leak (Marius Konitzer), bug on misformed SSD regexps (Christopher Boumenot) - documentation: warning about XML_PARSE_COMPACT (Kasimier Buchcik), fix xmlXPathCastToString documentation, improve man pages for xmllitn and xmlcatalog (Daniel Leidert), fixed comments of a few functions 2.6.26: Jun 6 2006: - portability fixes: Python detection (Joseph Sacco), compilation error(William Brack and Graham Bennett), LynxOS patch (Olli Savia) - bug fixes: encoding buffer problem, mix of code and data in xmlIO.c(Kjartan Maraas), entities in XSD validation (Kasimier Buchcik), variousXSD validation fixes (Kasimier), memory leak in pattern (Rob Richards andKasimier), attribute with colon in name (Rob Richards), XPath leak inerror reporting (Aleksey Sanin), XInclude text include of selfdocument. - improvements: Xpath optimizations (Kasimier), XPath object cache(Kasimier) 2.6.25: Jun 6 2006:: Do not use or package 2.6.25 2.6.24: Apr 28 2006: - Portability fixes: configure on Windows, testapi compile on windows (Kasimier Buchcik, venkat naidu), Borland C++ 6 compile (Eric Zurcher), HP-UX compiler workaround (Rick Jones), xml2-config bugfix, gcc-4.1 cleanups, Python detection scheme (Joseph Sacco), UTF-8 file paths on Windows (Roland Schwingel). - Improvements: xmlDOMWrapReconcileNamespaces xmlDOMWrapCloneNode (Kasimier Buchcik), XML catalog debugging (Rick Jones), update to Unicode 4.01. - Bug fixes: xmlParseChunk() problem in 2.6.23, xmlParseInNodeContext() on HTML docs, URI behaviour on Windows (Rob Richards), comment streaming bug, xmlParseComment (with William Brack), regexp bug fixes (DV & Youri Golovanov), xmlGetNodePath on text/CDATA (Kasimier), one Relax-NG interleave bug, xmllint --path and --valid, XSD bugfixes (Kasimier), remove debug left in Python bindings (Nic Ferrier), xmlCatalogAdd bug (Martin Cole), xmlSetProp fixes (Rob Richards), HTML IDness (Rob Richards), a large number of cleanups and small fixes based on Coverity reports, bug in character ranges, Unicode tables const (Aivars Kalvans), schemas fix (Stefan Kost), xmlRelaxNGParse error deallocation, xmlSchemaAddSchemaDoc error deallocation, error handling on unallowed code point, ixmllint --nonet to never reach the net (Gary Coady), line break in writer after end PI (Jason Viers). - Documentation: man pages updates and cleanups (Daniel Leidert). - New features: Relax NG structure error handlers. 2.6.23: Jan 5 2006: - portability fixes: Windows (Rob Richards), getaddrinfo on Windows (Kolja Nowak, Rob Richards), icc warnings (Kjartan Maraas), --with-minimum compilation fixes (William Brack), error case handling fix on Solaris (Albert Chin), don't use 'list' as parameter name reported by Samuel Diaz Garcia, more old Unices portability fixes (Albert Chin), MinGW compilation (Mark Junker), HP-UX compiler warnings (Rick Jones), - code cleanup: xmlReportError (Adrian Mouat), remove xmlBufferClose (Geert Jansen), unreachable code (Oleksandr Kononenko), refactoring parsing code (Bjorn Reese) - bug fixes: xmlBuildRelativeURI and empty path (William Brack), combinatory explosion and performances in regexp code, leak in xmlTextReaderReadString(), xmlStringLenDecodeEntities problem (Massimo Morara), Identity Constraints bugs and a segfault (Kasimier Buchcik), XPath pattern based evaluation bugs (DV & Kasimier), xmlSchemaContentModelDump() memory leak (Kasimier), potential leak in xmlSchemaCheckCSelectorXPath(), xmlTextWriterVSprintf() misuse of vsnprintf (William Brack), XHTML serialization fix (Rob Richards), CRLF split problem (William), issues with non-namespaced attributes in xmlAddChild() xmlAddNextSibling() and xmlAddPrevSibling() (Rob Richards), HTML parsing of script, Python must not output to stdout (Nic Ferrier), exclusive C14N namespace visibility (Aleksey Sanin), XSD dataype totalDigits bug (Kasimier Buchcik), error handling when writing to an xmlBuffer (Rob Richards), runtest schemas error not reported (Hisashi Fujinaka), signed/unsigned problem in date/time code (Albert Chin), fix XSI driven XSD validation (Kasimier), parsing of xs:decimal (Kasimier), fix DTD writer output (Rob Richards), leak in xmlTextReaderReadInnerXml (Gary Coady), regexp bug affecting schemas (Kasimier), configuration of runtime debugging (Kasimier), xmlNodeBufGetContent bug on entity refs (Oleksandr Kononenko), xmlRegExecPushString2 bug (Sreeni Nair), compilation and build fixes (Michael Day), removed dependancies on xmlSchemaValidError (Kasimier), bug with , more XPath pattern based evaluation fixes (Kasimier) - improvements: XSD Schemas redefinitions/restrictions (Kasimier Buchcik), node copy checks and fix for attribute (Rob Richards), counted transition bug in regexps, ctxt->standalone = -2 to indicate no standalone attribute was found, add xmlSchemaSetParserStructuredErrors() (Kasimier Buchcik), add xmlTextReaderSchemaValidateCtxt() to API (Kasimier), handle gzipped HTTP resources (Gary Coady), add htmlDocDumpMemoryFormat. (Rob Richards), - documentation: typo (Michael Day), libxml man page (Albert Chin), save function to XML buffer (Geert Jansen), small doc fix (Aron Stansvik), 2.6.22: Sep 12 2005: - build fixes: compile without schematron (Stéphane Bidoul) - bug fixes: xmlDebugDumpNode on namespace node (Oleg Paraschenko)i, CDATA push parser bug, xmlElemDump problem with XHTML1 doc, XML_FEATURE_xxx clash with expat headers renamed XML_WITH_xxx, fix some output formatting for meta element (Rob Richards), script and style XHTML1 serialization (David Madore), Attribute derivation fixups in XSD (Kasimier Buchcik), better IDC error reports (Kasimier Buchcik) - improvements: add XML_SAVE_NO_EMPTY xmlSaveOption (Rob Richards), add XML_SAVE_NO_XHTML xmlSaveOption, XML Schemas improvements preparing for derive (Kasimier Buchcik). - documentation: generation of gtk-doc like docs, integration with devhelp. 2.6.21: Sep 4 2005: - build fixes: Cygwin portability fixes (Gerrit P. Haase), calling convention problems on Windows (Marcus Boerger), cleanups based on Linus' sparse tool, update of win32/configure.js (Rob Richards), remove warnings on Windows(Marcus Boerger), compilation without SAX1, detection of the Python binary, use $GCC inestad of $CC = 'gcc' (Andrew W. Nosenko), compilation/link with threads and old gcc, compile problem by C370 on Z/OS, - bug fixes: http_proxy environments (Peter Breitenlohner), HTML UTF-8 bug (Jiri Netolicky), XPath NaN compare bug (William Brack), htmlParseScript potential bug, Schemas regexp handling of spaces, Base64 Schemas comparisons NIST passes, automata build error xsd:all, xmlGetNodePath for namespaced attributes (Alexander Pohoyda), xmlSchemas foreign namespaces handling, XML Schemas facet comparison (Kupriyanov Anatolij), xmlSchemaPSimpleTypeErr error report (Kasimier Buchcik), xml: namespace ahndling in Schemas (Kasimier), empty model group in Schemas (Kasimier), wilcard in Schemas (Kasimier), URI composition (William), xs:anyType in Schemas (Kasimier), Python resolver emmitting error messages directly, Python xmlAttr.parent (Jakub Piotr Clapa), trying to fix the file path/URI conversion, xmlTextReaderGetAttribute fix (Rob Richards), xmlSchemaFreeAnnot memleak (Kasimier), HTML UTF-8 serialization, streaming XPath, Schemas determinism detection problem, XInclude bug, Schemas context type (Dean Hill), validation fix (Derek Poon), xmlTextReaderGetAttribute[Ns] namespaces (Rob Richards), Schemas type fix (Kuba Nowakowski), UTF-8 parser bug, error in encoding handling, xmlGetLineNo fixes, bug on entities handling, entity name extraction in error handling with XInclude, text nodes in HTML body tags (Gary Coady), xml:id and IDness at the treee level fixes, XPath streaming patterns bugs. - improvements: structured interfaces for schemas and RNG error reports (Marcus Boerger), optimization of the char data inner loop parsing (thanks to Behdad Esfahbod for the idea), schematron validation though not finished yet, xmlSaveOption to omit XML declaration, keyref match error reports (Kasimier), formal expression handling code not plugged yet, more lax mode for the HTML parser, parser XML_PARSE_COMPACT option for text nodes allocation. - documentation: xmllint man page had --nonet duplicated 2.6.20: Jul 10 2005: - build fixes: Windows build (Rob Richards), Mingw compilation (Igor Zlatkovic), Windows Makefile (Igor), gcc warnings (Kasimier and andriy@google.com), use gcc weak references to pthread to avoid the pthread dependancy on Linux, compilation problem (Steve Nairn), compiling of subset (Morten Welinder), IPv6/ss_family compilation (William Brack), compilation when disabling parts of the library, standalone test distribution. - bug fixes: bug in lang(), memory cleanup on errors (William Brack), HTTP query strings (Aron Stansvik), memory leak in DTD (William), integer overflow in XPath (William), nanoftp buffer size, pattern "." apth fixup (Kasimier), leak in tree reported by Malcolm Rowe, replaceNode patch (Brent Hendricks), CDATA with NULL content (Mark Vakoc), xml:base fixup on XInclude (William), pattern fixes (William), attribute bug in exclusive c14n (Aleksey Sanin), xml:space and xml:lang with SAX2 (Rob Richards), namespace trouble in complex parsing (Malcolm Rowe), XSD type QNames fixes (Kasimier), XPath streaming fixups (William), RelaxNG bug (Rob Richards), Schemas for Schemas fixes (Kasimier), removal of ID (Rob Richards), a small RelaxNG leak, HTML parsing in push mode bug (James Bursa), failure to detect UTF-8 parsing bugs in CDATA sections, areBlanks() heuristic failure, duplicate attributes in DTD bug (William). - improvements: lot of work on Schemas by Kasimier Buchcik both on conformance and streaming, Schemas validation messages (Kasimier Buchcik, Matthew Burgess), namespace removal at the python level (Brent Hendricks), Update to new Schemas regression tests from W3C/Nist (Kasimier), xmlSchemaValidateFile() (Kasimier), implementation of xmlTextReaderReadInnerXml and xmlTextReaderReadOuterXml (James Wert), standalone test framework and programs, new DOM import APIs xmlDOMWrapReconcileNamespaces() xmlDOMWrapAdoptNode() and xmlDOMWrapRemoveNode(), extension of xmllint capabilities for SAX and Schemas regression tests, xmlStopParser() available in pull mode too, ienhancement to xmllint --shell namespaces support, Windows port of the standalone testing tools (Kasimier and William), xmlSchemaValidateStream() xmlSchemaSAXPlug() and xmlSchemaSAXUnplug() SAX Schemas APIs, Schemas xmlReader support. 2.6.19: Apr 02 2005: - build fixes: drop .la from RPMs, --with-minimum build fix (William Brack), use XML_SOCKLEN_T instead of SOCKLEN_T because it breaks with AIX 5.3 compiler, fixed elfgcchack.h generation and PLT reduction code on Linux/ELF/gcc4 - bug fixes: schemas type decimal fixups (William Brack), xmmlint return code (Gerry Murphy), small schemas fixes (Matthew Burgess and GUY Fabrice), workaround "DAV:" namespace brokeness in c14n (Aleksey Sanin), segfault in Schemas (Kasimier Buchcik), Schemas attribute validation (Kasimier), Prop related functions and xmlNewNodeEatName (Rob Richards), HTML serialization of name attribute on a elements, Python error handlers leaks and improvement (Brent Hendricks), uninitialized variable in encoding code, Relax-NG validation bug, potential crash if gnorableWhitespace is NULL, xmlSAXParseDoc and xmlParseDoc signatures, switched back to assuming UTF-8 in case no encoding is given at serialization time - improvements: lot of work on Schemas by Kasimier Buchcik on facets checking and also mixed handling. - 2.6.18: Mar 13 2005: - build fixes: warnings (Peter Breitenlohner), testapi.c generation, Bakefile support (Francesco Montorsi), Windows compilation (Joel Reed), some gcc4 fixes, HP-UX portability fixes (Rick Jones). - bug fixes: xmlSchemaElementDump namespace (Kasimier Buchcik), push and xmlreader stopping on non-fatal errors, thread support for dictionnaries reference counting (Gary Coady), internal subset and push problem, URL saved in xmlCopyDoc, various schemas bug fixes (Kasimier), Python paths fixup (Stephane Bidoul), xmlGetNodePath and namespaces, xmlSetNsProp fix (Mike Hommey), warning should not count as error (William Brack), xmlCreatePushParser empty chunk, XInclude parser flags (William), cleanup FTP and HTTP code to reuse the uri parsing and IPv6 (William), xmlTextWriterStartAttributeNS fix (Rob Richards), XMLLINT_INDENT being empty (William), xmlWriter bugs (Rob Richards), multithreading on Windows (Rich Salz), xmlSearchNsByHref fix (Kasimier), Python binding leak (Brent Hendricks), aliasing bug exposed by gcc4 on s390, xmlTextReaderNext bug (Rob Richards), Schemas decimal type fixes (William Brack), xmlByteConsumed static buffer (Ben Maurer). - improvement: speedup parsing comments and DTDs, dictionnary support for hash tables, Schemas Identity constraints (Kasimier), streaming XPath subset, xmlTextReaderReadString added (Bjorn Reese), Schemas canonical values handling (Kasimier), add xmlTextReaderByteConsumed (Aron Stansvik), - Documentation: Wiki support (Joel Reed) 2.6.17: Jan 16 2005: - build fixes: Windows, warnings removal (William Brack), maintainer-clean dependency(William), build in a different directory (William), fixing --with-minimum configure build (William), BeOS build (Marcin Konicki), Python-2.4 detection (William), compilation on AIX (Dan McNichol) - bug fixes: xmlTextReaderHasAttributes (Rob Richards), xmlCtxtReadFile() to use the catalog(s), loop on output (William Brack), XPath memory leak, ID deallocation problem (Steve Shepard), debugDumpNode crash (William), warning not using error callback (William), xmlStopParser bug (William), UTF-16 with BOM on DTDs (William), namespace bug on empty elements in push mode (Rob Richards), line and col computations fixups (Aleksey Sanin), xmlURIEscape fix (William), xmlXPathErr on bad range (William), patterns with too many steps, bug in RNG choice optimization, line number sometimes missing. - improvements: XSD Schemas (Kasimier Buchcik), python generator (William), xmlUTF8Strpos speedup (William), unicode Python strings (William), XSD error reports (Kasimier Buchcik), Python __str__ call serialize(). - new APIs: added xmlDictExists(), GetLineNumber and GetColumnNumber for the xmlReader (Aleksey Sanin), Dynamic Shared Libraries APIs (mostly Joel Reed), error extraction API from regexps, new XMLSave option for format (Phil Shafer) - documentation: site improvement (John Fleck), FAQ entries (William). 2.6.16: Nov 10 2004: - general hardening and bug fixing crossing all the API based on new automated regression testing - build fix: IPv6 build and test on AIX (Dodji Seketeli) - bug fixes: problem with XML::Libxml reported by Petr Pajas, encoding conversion functions return values, UTF-8 bug affecting XPath reported by Markus Bertheau, catalog problem with NULL entries (William Brack) - documentation: fix to xmllint man page, some API function descritpion were updated. - improvements: DTD validation APIs provided at the Python level (Brent Hendricks) 2.6.15: Oct 27 2004: - security fixes on the nanoftp and nanohttp modules - build fixes: xmllint detection bug in configure, building outside the source tree (Thomas Fitzsimmons) - bug fixes: HTML parser on broken ASCII chars in names (William), Python paths (Malcolm Tredinnick), xmlHasNsProp and default namespace (William), saving to python file objects (Malcolm Tredinnick), DTD lookup fix (Malcolm), save back in catalogs (William), tree build fixes (DV and Rob Richards), Schemas memory bug, structured error handler on Python 64bits, thread local memory deallocation, memory leak reported by Volker Roth, xmlValidateDtd in the presence of an internal subset, entities and _private problem (William), xmlBuildRelativeURI error (William). - improvements: better XInclude error reports (William), tree debugging module and tests, convenience functions at the Reader API (Graham Bennett), add support for PI in the HTML parser. 2.6.14: Sep 29 2004: - build fixes: configure paths for xmllint and xsltproc, compilation without HTML parser, compilation warning cleanups (William Brack & Malcolm Tredinnick), VMS makefile update (Craig Berry), - bug fixes: xmlGetUTF8Char (William Brack), QName properties (Kasimier Buchcik), XInclude testing, Notation serialization, UTF8ToISO8859x transcoding (Mark Itzcovitz), lots of XML Schemas cleanup and fixes (Kasimier), ChangeLog cleanup (Stepan Kasal), memory fixes (Mark Vakoc), handling of failed realloc(), out of bound array adressing in Schemas date handling, Python space/tabs cleanups (Malcolm Tredinnick), NMTOKENS E20 validation fix (Malcolm), - improvements: added W3C XML Schemas testsuite (Kasimier Buchcik), add xmlSchemaValidateOneElement (Kasimier), Python exception hierearchy (Malcolm Tredinnick), Python libxml2 driver improvement (Malcolm Tredinnick), Schemas support for xsi:schemaLocation, xsi:noNamespaceSchemaLocation, xsi:type (Kasimier Buchcik) 2.6.13: Aug 31 2004: - build fixes: Windows and zlib (Igor Zlatkovic), -O flag with gcc, Solaris compiler warning, fixing RPM BuildRequires, - fixes: DTD loading on Windows (Igor), Schemas error reports APIs (Kasimier Buchcik), Schemas validation crash, xmlCheckUTF8 (William Brack and Julius Mittenzwei), Schemas facet check (Kasimier), default namespace problem (William), Schemas hexbinary empty values, encoding error could genrate a serialization loop. - Improvements: Schemas validity improvements (Kasimier), added --path and --load-trace options to xmllint - documentation: tutorial update (John Fleck) 2.6.12: Aug 22 2004: - build fixes: fix --with-minimum, elfgcchack.h fixes (Peter Breitenlohner), perl path lookup (William), diff on Solaris (Albert Chin), some 64bits cleanups. - Python: avoid a warning with 2.3 (William Brack), tab and space mixes (William), wrapper generator fixes (William), Cygwin support (Gerrit P. Haase), node wrapper fix (Marc-Antoine Parent), XML Schemas support (Torkel Lyng) - Schemas: a lot of bug fixes and improvements from Kasimier Buchcik - fixes: RVT fixes (William), XPath context resets bug (William), memory debug (Steve Hay), catalog white space handling (Peter Breitenlohner), xmlReader state after attribute reading (William), structured error handler (William), XInclude generated xml:base fixup (William), Windows memory reallocation problem (Steve Hay), Out of Memory conditions handling (William and Olivier Andrieu), htmlNewDoc() charset bug, htmlReadMemory init (William), a posteriori validation DTD base (William), notations serialization missing, xmlGetNodePath (Dodji), xmlCheckUTF8 (Diego Tartara), missing line numbers on entity (William) - improvements: DocBook catalog build scrip (William), xmlcatalog tool (Albert Chin), xmllint --c14n option, no_proxy environment (Mike Hommey), xmlParseInNodeContext() addition, extend xmllint --shell, allow XInclude to not generate start/end nodes, extend xmllint --version to include CVS tag (William) - documentation: web pages fixes, validity API docs fixes (William) schemas API fix (Eric Haszlakiewicz), xmllint man page (John Fleck) 2.6.11: July 5 2004: - Schemas: a lot of changes and improvements by Kasimier Buchcik for attributes, namespaces and simple types. - build fixes: --with-minimum (William Brack), some gcc cleanup (William), --with-thread-alloc (William) - portability: Windows binary package change (Igor Zlatkovic), Catalog path on Windows - documentation: update to the tutorial (John Fleck), xmllint return code (John Fleck), man pages (Ville Skytta), - bug fixes: C14N bug serializing namespaces (Aleksey Sanin), testSAX properly initialize the library (William), empty node set in XPath (William), xmlSchemas errors (William), invalid charref problem pointed by Morus Walter, XInclude xml:base generation (William), Relax-NG bug with div processing (William), XPointer and xml:base problem(William), Reader and entities, xmllint return code for schemas (William), reader streaming problem (Steve Ball), DTD serialization problem (William), libxml.m4 fixes (Mike Hommey), do not provide destructors as methods on Python classes, xmlReader buffer bug, Python bindings memory interfaces improvement (with Stéphane Bidoul), Fixed the push parser to be back to synchronous behaviour. - improvement: custom per-thread I/O enhancement (Rob Richards), register namespace in debug shell (Stefano Debenedetti), Python based regression test for non-Unix users (William), dynamically increase the number of XPath extension functions in Python and fix a memory leak (Marc-Antoine Parent and William) - performance: hack done with Arjan van de Ven to reduce ELF footprint and generated code on Linux, plus use gcc runtime profiling to optimize the code generated in the RPM packages. 2.6.10: May 17 2004: - Web page generated for ChangeLog - build fixes: --without-html problems, make check without make all - portability: problem with xpath.c on Windows (MSC and Borland), memcmp vs. strncmp on Solaris, XPath tests on Windows (Mark Vakoc), C++ do not use "list" as parameter name, make tests work with Python 1.5 (Ed Davis), - improvements: made xmlTextReaderMode public, small buffers resizing (Morten Welinder), add --maxmem option to xmllint, add xmlPopInputCallback() for Matt Sergeant, refactoring of serialization escaping, added escaping customization - bugfixes: xsd:extension (Taihei Goi), assorted regexp bugs (William Brack), xmlReader end of stream problem, node deregistration with reader, URI escaping and filemanes, XHTML1 formatting (Nick Wellnhofer), regexp transition reduction (William), various XSD Schemas fixes (Kasimier Buchcik), XInclude fallback problem (William), weird problems with DTD (William), structured error handler callback context (William), reverse xmlEncodeSpecialChars() behaviour back to escaping '"' 2.6.9: Apr 18 2004: - implement xml:id Working Draft, relaxed XPath id() checking - bugfixes: xmlCtxtReset (Brent Hendricks), line number and CDATA (Dave Beckett), Relax-NG compilation (William Brack), Regexp patches (with William), xmlUriEscape (Mark Vakoc), a Relax-NG notAllowed problem (with William), Relax-NG name classes compares (William), XInclude duplicate fallback (William), external DTD encoding detection (William), a DTD validation bug (William), xmlReader Close() fix, recusive extention schemas - improvements: use xmlRead* APIs in test tools (Mark Vakoc), indenting save optimization, better handle IIS broken HTTP redirect behaviour (Ian Hummel), HTML parser frameset (James Bursa), libxml2-python RPM dependancy, XML Schemas union support (Kasimier Buchcik), warning removal clanup (William), keep ChangeLog compressed when installing from RPMs - documentation: examples and xmlDocDumpMemory docs (John Fleck), new example (load, xpath, modify, save), xmlCatalogDump() comments, - Windows: Borland C++ builder (Eric Zurcher), work around Microsoft compiler NaN handling bug (Mark Vakoc) 2.6.8: Mar 23 2004: - First step of the cleanup of the serialization code and APIs - XML Schemas: mixed content (Adam Dickmeiss), QName handling fixes (Adam Dickmeiss), anyURI for "" (John Belmonte) - Python: Canonicalization C14N support added (Anthony Carrico) - xmlDocCopyNode() extension (William) - Relax-NG: fix when processing XInclude results (William), external reference in interleave (William), missing error on failure (William), memory leak in schemas datatype facets. - xmlWriter: patch for better DTD support (Alfred Mickautsch) - bug fixes: xmlXPathLangFunction memory leak (Mike Hommey and William Brack), no ID errors if using HTML_PARSE_NOERROR, xmlcatalog fallbacks to URI on SYSTEM lookup failure, XInclude parse flags inheritance (William), XInclude and XPointer fixes for entities (William), XML parser bug reported by Holger Rauch, nanohttp fd leak (William), regexps char groups '-' handling (William), dictionnary reference counting problems, do not close stderr. - performance patches from Petr Pajas - Documentation fixes: XML_CATALOG_FILES in man pages (Mike Hommey) - compilation and portability fixes: --without-valid, catalog cleanups (Peter Breitenlohner), MingW patch (Roland Schwingel), cross-compilation to Windows (Christophe de Vienne), --with-html-dir fixup (Julio Merino Vidal), Windows build (Eric Zurcher) 2.6.7: Feb 23 2004: - documentation: tutorial updates (John Fleck), benchmark results - xmlWriter: updates and fixes (Alfred Mickautsch, Lucas Brasilino) - XPath optimization (Petr Pajas) - DTD ID handling optimization - bugfixes: xpath number with > 19 fractional (William Brack), push mode with unescaped '>' characters, fix xmllint --stream --timing, fix xmllint --memory --stream memory usage, xmlAttrSerializeTxtContent handling NULL, trying to fix Relax-NG/Perl interface. - python: 2.3 compatibility, whitespace fixes (Malcolm Tredinnick) - Added relaxng option to xmllint --shell 2.6.6: Feb 12 2004: - nanohttp and nanoftp: buffer overflow error on URI parsing (Igor and William) reported by Yuuichi Teranishi - bugfixes: make test and path issues, xmlWriter attribute serialization (William Brack), xmlWriter indentation (William), schemas validation (Eric Haszlakiewicz), XInclude dictionnaries issues (William and Oleg Paraschenko), XInclude empty fallback (William), HTML warnings (William), XPointer in XInclude (William), Python namespace serialization, isolat1ToUTF8 bound error (Alfred Mickautsch), output of parameter entities in internal subset (William), internal subset bug in push mode, fix (Alexey Sarytchev) - Build: fix for automake-1.8 (Alexander Winston), warnings removal (Philip Ludlam), SOCKLEN_T detection fixes (Daniel Richard), fix --with-minimum configuration. - XInclude: allow the 2001 namespace without warning. - Documentation: missing example/index.html (John Fleck), version dependancies (John Fleck) - reader API: structured error reporting (Steve Ball) - Windows compilation: mingw, msys (Mikhail Grushinskiy), function prototype (Cameron Johnson), MSVC6 compiler warnings, _WINSOCKAPI_ patch - Parsers: added xmlByteConsumed(ctxt) API to get the byte offest in input. 2.6.5: Jan 25 2004: - Bugfixes: dictionnaries for schemas (William Brack), regexp segfault (William), xs:all problem (William), a number of XPointer bugfixes (William), xmllint error go to stderr, DTD validation problem with namespace, memory leak (William), SAX1 cleanup and minimal options fixes (Mark Vadoc), parser context reset on error (Shaun McCance), XPath union evaluation problem (William) , xmlReallocLoc with NULL (Aleksey Sanin), XML Schemas double free (Steve Ball), XInclude with no href, argument callbacks order for XPath callbacks (Frederic Peters) - Documentation: python scripts (William Brack), xslt stylesheets (John Fleck), doc (Sven Zimmerman), I/O example. - Python bindings: fixes (William), enum support (Stéphane Bidoul), structured error reporting (Stéphane Bidoul) - XInclude: various fixes for conformance, problem related to dictionnary references (William & me), recursion (William) - xmlWriter: indentation (Lucas Brasilino), memory leaks (Alfred Mickautsch), - xmlSchemas: normalizedString datatype (John Belmonte) - code cleanup for strings functions (William) - Windows: compiler patches (Mark Vakoc) - Parser optimizations, a few new XPath and dictionnary APIs for future XSLT optimizations. 2.6.4: Dec 24 2003: - Windows build fixes (Igor Zlatkovic) - Some serious XInclude problems reported by Oleg Paraschenko and - Unix and Makefile packaging fixes (me, William Brack, - Documentation improvements (John Fleck, William Brack), example fix (Lucas Brasilino) - bugfixes: xmlTextReaderExpand() with xmlReaderWalker, XPath handling of NULL strings (William Brack) , API building reader or parser from filedescriptor should not close it, changed XPath sorting to be stable again (William Brack), xmlGetNodePath() generating '(null)' (William Brack), DTD validation and namespace bug (William Brack), XML Schemas double inclusion behaviour 2.6.3: Dec 10 2003: - documentation updates and cleanup (DV, William Brack, John Fleck) - added a repository of examples, examples from Aleksey Sanin, Dodji Seketeli, Alfred Mickautsch - Windows updates: Mark Vakoc, Igor Zlatkovic, Eric Zurcher, Mingw (Kenneth Haley) - Unicode range checking (William Brack) - code cleanup (William Brack) - Python bindings: doc (John Fleck), bug fixes - UTF-16 cleanup and BOM issues (William Brack) - bug fixes: ID and xmlReader validation, XPath (William Brack), xmlWriter (Alfred Mickautsch), hash.h inclusion problem, HTML parser (James Bursa), attribute defaulting and validation, some serialization cleanups, XML_GET_LINE macro, memory debug when using threads (William Brack), serialization of attributes and entities content, xmlWriter (Daniel Schulman) - XInclude bugfix, new APIs and update to the last version including the namespace change. - XML Schemas improvements: include (Robert Stepanek), import and namespace handling, fixed the regression tests troubles, added examples based on Eric van der Vlist book, regexp fixes - preliminary pattern support for streaming (needed for schemas constraints), added xmlTextReaderPreservePattern() to collect subdocument when streaming. - various fixes in the structured error handling 2.6.2: Nov 4 2003: - XPath context unregistration fixes - text node coalescing fixes (Mark Lilback) - API to screate a W3C Schemas from an existing document (Steve Ball) - BeOS patches (Marcin 'Shard' Konicki) - xmlStrVPrintf function added (Aleksey Sanin) - compilation fixes (Mark Vakoc) - stdin parsing fix (William Brack) - a posteriori DTD validation fixes - xmlReader bug fixes: Walker fixes, python bindings - fixed xmlStopParser() to really stop the parser and errors - always generate line numbers when using the new xmlReadxxx functions - added XInclude support to the xmlReader interface - implemented XML_PARSE_NONET parser option - DocBook XSLT processing bug fixed - HTML serialization for

elements (William Brack and me) - XPointer failure in XInclude are now handled as resource errors - fixed xmllint --html to use the HTML serializer on output (added --xmlout to implement the previous behaviour of saving it using the XML serializer) 2.6.1: Oct 28 2003: - Mostly bugfixes after the big 2.6.0 changes - Unix compilation patches: libxml.m4 (Patrick Welche), warnings cleanup (William Brack) - Windows compilation patches (Joachim Bauch, Stephane Bidoul, Igor Zlatkovic) - xmlWriter bugfix (Alfred Mickautsch) - chvalid.[ch]: couple of fixes from Stephane Bidoul - context reset: error state reset, push parser reset (Graham Bennett) - context reuse: generate errors if file is not readable - defaulted attributes for element coming from internal entities (Stephane Bidoul) - Python: tab and spaces mix (William Brack) - Error handler could crash in DTD validation in 2.6.0 - xmlReader: do not use the document or element _private field - testSAX.c: avoid a problem with some PIs (Massimo Morara) - general bug fixes: mandatory encoding in text decl, serializing Document Fragment nodes, xmlSearchNs 2.6.0 problem (Kasimier Buchcik), XPath errors not reported, slow HTML parsing of large documents. 2.6.0: Oct 20 2003: - Major revision release: should be API and ABI compatible but got a lot of change - Increased the library modularity, far more options can be stripped out, a --with-minimum configuration will weight around 160KBytes - Use per parser and per document dictionnary, allocate names and small text nodes from the dictionnary - Switch to a SAX2 like parser rewrote most of the XML parser core, provides namespace resolution and defaulted attributes, minimize memory allocations and copies, namespace checking and specific error handling, immutable buffers, make predefined entities static structures, etc... - rewrote all the error handling in the library, all errors can be intercepted at a structured level, with precise information available. - New simpler and more generic XML and HTML parser APIs, allowing to easilly modify the parsing options and reuse parser context for multiple consecutive documents. - Similar new APIs for the xmlReader, for options and reuse, provided new functions to access content as const strings, use them for Python bindings - a lot of other smaller API improvements: xmlStrPrintf (Aleksey Sanin), Walker i.e. reader on a document tree based on Alfred Mickautsch code, make room in nodes for line numbers, reference counting and future PSVI extensions, generation of character ranges to be checked with faster algorithm (William), xmlParserMaxDepth (Crutcher Dunnavant), buffer access - New xmlWriter API provided by Alfred Mickautsch - Schemas: base64 support by Anthony Carrico - Parser<->HTTP integration fix, proper processing of the Mime-Type and charset information if available. - Relax-NG: bug fixes including the one reported by Martijn Faassen and zeroOrMore, better error reporting. - Python bindings (Stéphane Bidoul), never use stdout for errors output - Portability: all the headers have macros for export and calling convention definitions (Igor Zlatkovic), VMS update (Craig A. Berry), Windows: threads (Jesse Pelton), Borland compiler (Eric Zurcher, Igor), Mingw (Igor), typos (Mark Vakoc), beta version (Stephane Bidoul), warning cleanups on AIX and MIPS compilers (William Brack), BeOS (Marcin 'Shard' Konicki) - Documentation fixes and README (William Brack), search fix (William), tutorial updates (John Fleck), namespace docs (Stefan Kost) - Bug fixes: xmlCleanupParser (Dave Beckett), threading uninitialized mutexes, HTML doctype lowercase, SAX/IO (William), compression detection and restore (William), attribute declaration in DTDs (William), namespace on attribute in HTML output (William), input filename (Rob Richards), namespace DTD validation, xmlReplaceNode (Chris Ryland), I/O callbacks (Markus Keim), CDATA serialization (Shaun McCance), xmlReader (Peter Derr), high codepoint charref like 􏿿, buffer access in push mode (Justin Fletcher), TLS threads on Windows (Jesse Pelton), XPath bug (William), xmlCleanupParser (Marc Liyanage), CDATA output (William), HTTP error handling. - xmllint options: --dtdvalidfpi for Tobias Reif, --sax1 for compat testing, --nodict for building without tree dictionnary, --nocdata to replace CDATA by text, --nsclean to remove surperfluous namespace declarations - added xml2-config --libtool-libs option from Kevin P. Fleming - a lot of profiling and tuning of the code, speedup patch for xmlSearchNs() by Luca Padovani. The xmlReader should do far less allocation and it speed should get closer to SAX. Chris Anderson worked on speeding and cleaning up repetitive checking code. - cleanup of "make tests" - libxml-2.0-uninstalled.pc from Malcolm Tredinnick - deactivated the broken docBook SGML parser code and plugged the XML parser instead. 2.5.11: Sep 9 2003: A bugfix only release: - risk of crash in Relax-NG - risk of crash when using multithreaded programs 2.5.10: Aug 15 2003: A bugfixes only release - Windows Makefiles (William Brack) - UTF-16 support fixes (Mark Itzcovitz) - Makefile and portability (William Brack) automake, Linux alpha, Mingw on Windows (Mikhail Grushinskiy) - HTML parser (Oliver Stoeneberg) - XInclude performance problem reported by Kevin Ruscoe - XML parser performance problem reported by Grant Goodale - xmlSAXParseDTD() bug fix from Malcolm Tredinnick - and a couple other cleanup 2.5.9: Aug 9 2003: - bugfixes: IPv6 portability, xmlHasNsProp (Markus Keim), Windows build (Wiliam Brake, Jesse Pelton, Igor), Schemas (Peter Sobisch), threading (Rob Richards), hexBinary type (), UTF-16 BOM (Dodji Seketeli), xmlReader, Relax-NG schemas compilation, namespace handling, EXSLT (Sean Griffin), HTML parsing problem (William Brack), DTD validation for mixed content + namespaces, HTML serialization, library initialization, progressive HTML parser - better interfaces for Relax-NG error handling (Joachim Bauch, ) - adding xmlXIncludeProcessTree() for XInclud'ing in a subtree - doc fixes and improvements (John Fleck) - configure flag for -with-fexceptions when embedding in C++ - couple of new UTF-8 helper functions (William Brack) - general encoding cleanup + ISO-8859-x without iconv (Peter Jacobi) - xmlTextReader cleanup + enum for node types (Bjorn Reese) - general compilation/warning cleanup Solaris/HP-UX/... (William Brack) 2.5.8: Jul 6 2003: - bugfixes: XPath, XInclude, file/URI mapping, UTF-16 save (Mark Itzcovitz), UTF-8 checking, URI saving, error printing (William Brack), PI related memleak, compilation without schemas or without xpath (Joerg Schmitz-Linneweber/Garry Pennington), xmlUnlinkNode problem with DTDs, rpm problem on , i86_64, removed a few compilation problems from 2.5.7, xmlIOParseDTD, and xmlSAXParseDTD (Malcolm Tredinnick) - portability: DJGPP (MsDos) , OpenVMS (Craig A. Berry) - William Brack fixed multithreading lock problems - IPv6 patch for FTP and HTTP accesses (Archana Shah/Wipro) - Windows fixes (Igor Zlatkovic, Eric Zurcher), threading (Stéphane Bidoul) - A few W3C Schemas Structure improvements - W3C Schemas Datatype improvements (Charlie Bozeman) - Python bindings for thread globals (Stéphane Bidoul), and method/class generator - added --nonet option to xmllint - documentation improvements (John Fleck) 2.5.7: Apr 25 2003: - Relax-NG: Compiling to regexp and streaming validation on top of the xmlReader interface, added to xmllint --stream - xmlReader: Expand(), Next() and DOM access glue, bug fixes - Support for large files: RGN validated a 4.5GB instance - Thread support is now configured in by default - Fixes: update of the Trio code (Bjorn), WXS Date and Duration fixes (Charles Bozeman), DTD and namespaces (Brent Hendricks), HTML push parser and zero bytes handling, some missing Windows file path conversions, behaviour of the parser and validator in the presence of "out of memory" error conditions - extended the API to be able to plug a garbage collecting memory allocator, added xmlMallocAtomic() and modified the allocations accordingly. - Performances: removed excessive malloc() calls, speedup of the push and xmlReader interfaces, removed excessive thread locking - Documentation: man page (John Fleck), xmlReader documentation - Python: adding binding for xmlCatalogAddLocal (Brent M Hendricks) 2.5.6: Apr 1 2003: - Fixed W3C XML Schemas datatype, should be compliant now except for binHex and base64 which are not supported yet. - bug fixes: non-ASCII IDs, HTML output, XInclude on large docs and XInclude entities handling, encoding detection on external subsets, XML Schemas bugs and memory leaks, HTML parser (James Bursa) - portability: python/trio (Albert Chin), Sun compiler warnings - documentation: added --relaxng option to xmllint man page (John) - improved error reporting: xml:space, start/end tag mismatches, Relax NG errors 2.5.5: Mar 24 2003: - Lot of fixes on the Relax NG implementation. More testing including DocBook and TEI examples. - Increased the support for W3C XML Schemas datatype - Several bug fixes in the URI handling layer - Bug fixes: HTML parser, xmlReader, DTD validation, XPath, encoding conversion, line counting in the parser. - Added support for $XMLLINT_INDENT environment variable, FTP delete - Fixed the RPM spec file name 2.5.4: Feb 20 2003: - Conformance testing and lot of fixes on Relax NG and XInclude implementation - Implementation of XPointer element() scheme - Bug fixes: XML parser, XInclude entities merge, validity checking on namespaces, 2 serialization bugs, node info generation problems, a DTD regexp generation problem. - Portability: windows updates and path canonicalization (Igor) - A few typo fixes (Kjartan Maraas) - Python bindings generator fixes (Stephane Bidoul) 2.5.3: Feb 10 2003: - RelaxNG and XML Schemas datatypes improvements, and added a first version of RelaxNG Python bindings - Fixes: XLink (Sean Chittenden), XInclude (Sean Chittenden), API fix for serializing namespace nodes, encoding conversion bug, XHTML1 serialization - Portability fixes: Windows (Igor), AMD 64bits RPM spec file 2.5.2: Feb 5 2003: - First implementation of RelaxNG, added --relaxng flag to xmllint - Schemas support now compiled in by default. - Bug fixes: DTD validation, namespace checking, XInclude and entities, delegateURI in XML Catalogs, HTML parser, XML reader (Stéphane Bidoul), XPath parser and evaluation, UTF8ToUTF8 serialization, XML reader memory consumption, HTML parser, HTML serialization in the presence of namespaces - added an HTML API to check elements and attributes. - Documentation improvement, PDF for the tutorial (John Fleck), doc patches (Stefan Kost) - Portability fixes: NetBSD (Julio Merino), Windows (Igor Zlatkovic) - Added python bindings for XPointer, contextual error reporting (Stéphane Bidoul) - URI/file escaping problems (Stefano Zacchiroli) 2.5.1: Jan 8 2003: - Fixes a memory leak and configuration/compilation problems in 2.5.0 - documentation updates (John) - a couple of XmlTextReader fixes 2.5.0: Jan 6 2003: - New XmltextReader interface based on C# API (with help of Stéphane Bidoul) - Windows: more exports, including the new API (Igor) - XInclude fallback fix - Python: bindings for the new API, packaging (Stéphane Bidoul), drv_libxml2.py Python xml.sax driver (Stéphane Bidoul), fixes, speedup and iterators for Python-2.2 (Hannu Krosing) - Tutorial fixes (john Fleck and Niraj Tolia) xmllint man update (John) - Fix an XML parser bug raised by Vyacheslav Pindyura - Fix for VMS serialization (Nigel Hall) and config (Craig A. Berry) - Entities handling fixes - new API to optionally track node creation and deletion (Lukas Schroeder) - Added documentation for the XmltextReader interface and some XML guidelines 2.4.30: Dec 12 2002: - 2.4.29 broke the python bindings, rereleasing - Improvement/fixes of the XML API generator, and couple of minor code fixes. 2.4.29: Dec 11 2002: - Windows fixes (Igor): Windows CE port, pthread linking, python bindings (Stéphane Bidoul), Mingw (Magnus Henoch), and export list updates - Fix for prev in python bindings (ERDI Gergo) - Fix for entities handling (Marcus Clarke) - Refactored the XML and HTML dumps to a single code path, fixed XHTML1 dump - Fix for URI parsing when handling URNs with fragment identifiers - Fix for HTTP URL escaping problem - added an TextXmlReader (C#) like API (work in progress) - Rewrote the API in XML generation script, includes a C parser and saves more information needed for C# bindings 2.4.28: Nov 22 2002: - a couple of python binding fixes - 2 bug fixes in the XML push parser - potential memory leak removed (Martin Stoilov) - fix to the configure script for Unix (Dimitri Papadopoulos) - added encoding support for XInclude parse="text" - autodetection of XHTML1 and specific serialization rules added - nasty threading bug fixed (William Brack) 2.4.27: Nov 17 2002: - fixes for the Python bindings - a number of bug fixes: SGML catalogs, xmlParseBalancedChunkMemory(), HTML parser, Schemas (Charles Bozeman), document fragment support (Christian Glahn), xmlReconciliateNs (Brian Stafford), XPointer, xmlFreeNode(), xmlSAXParseMemory (Peter Jones), xmlGetNodePath (Petr Pajas), entities processing - added grep to xmllint --shell - VMS update patch from Craig A. Berry - cleanup of the Windows build with support for more compilers (Igor), better thread support on Windows - cleanup of Unix Makefiles and spec file - Improvements to the documentation (John Fleck) 2.4.26: Oct 18 2002: - Patches for Windows CE port, improvements on Windows paths handling - Fixes to the validation code (DTD and Schemas), xmlNodeGetPath() , HTML serialization, Namespace compliance, and a number of small problems 2.4.25: Sep 26 2002: - A number of bug fixes: XPath, validation, Python bindings, DOM and tree, xmlI/O, Html - Serious rewrite of XInclude - Made XML Schemas regexp part of the default build and APIs, small fix and improvement of the regexp core - Changed the validation code to reuse XML Schemas regexp APIs - Better handling of Windows file paths, improvement of Makefiles (Igor, Daniel Gehriger, Mark Vakoc) - Improved the python I/O bindings, the tests, added resolver and regexp APIs - New logos from Marc Liyanage - Tutorial improvements: John Fleck, Christopher Harris - Makefile: Fixes for AMD x86_64 (Mandrake), DESTDIR (Christophe Merlet) - removal of all stderr/perror use for error reporting - Better error reporting: XPath and DTD validation - update of the trio portability layer (Bjorn Reese) 2.4.24: Aug 22 2002 - XPath fixes (William), xf:escape-uri() (Wesley Terpstra) - Python binding fixes: makefiles (William), generator, rpm build, x86-64 (fcrozat) - HTML A real example
Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
Made with Libxml2 Logo

The XML C parser and toolkit of Gnome

A real example

Developer Menu
API Indexes
Related links

Here is a real size example, where the actual content of the application data is not kept in the DOM tree but uses internal structures. It is based on a proposal to keep a database of jobs related to Gnome, with an XML based storage structure. Here is an XML encoded jobs base:

<?xml version="1.0"?>
<gjob:Helping xmlns:gjob="http://www.gnome.org/some-location">
  <gjob:Jobs>

    <gjob:Job>
      <gjob:Project ID="3"/>
      <gjob:Application>GBackup</gjob:Application>
      <gjob:Category>Development</gjob:Category>

      <gjob:Update>
        <gjob:Status>Open</gjob:Status>
        <gjob:Modified>Mon, 07 Jun 1999 20:27:45 -0400 MET DST</gjob:Modified>
        <gjob:Salary>USD 0.00</gjob:Salary>
      </gjob:Update>

      <gjob:Developers>
        <gjob:Developer>
        </gjob:Developer>
      </gjob:Developers>

      <gjob:Contact>
        <gjob:Person>Nathan Clemons</gjob:Person>
        <gjob:Email>nathan@windsofstorm.net</gjob:Email>
        <gjob:Company>
        </gjob:Company>
        <gjob:Organisation>
        </gjob:Organisation>
        <gjob:Webpage>
        </gjob:Webpage>
        <gjob:Snailmail>
        </gjob:Snailmail>
        <gjob:Phone>
        </gjob:Phone>
      </gjob:Contact>

      <gjob:Requirements>
      The program should be released as free software, under the GPL.
      </gjob:Requirements>

      <gjob:Skills>
      </gjob:Skills>

      <gjob:Details>
      A GNOME based system that will allow a superuser to configure 
      compressed and uncompressed files and/or file systems to be backed 
      up with a supported media in the system.  This should be able to 
      perform via find commands generating a list of files that are passed 
      to tar, dd, cpio, cp, gzip, etc., to be directed to the tape machine 
      or via operations performed on the filesystem itself. Email 
      notification and GUI status display very important.
      </gjob:Details>

    </gjob:Job>

  </gjob:Jobs>
</gjob:Helping>

While loading the XML file into an internal DOM tree is a matter of calling only a couple of functions, browsing the tree to gather the data and generate the internal structures is harder, and more error prone.

The suggested principle is to be tolerant with respect to the input structure. For example, the ordering of the attributes is not significant, the XML specification is clear about it. It's also usually a good idea not to depend on the order of the children of a given node, unless it really makes things harder. Here is some code to parse the information for a person:

/*
 * A person record
 */
typedef struct person {
    char *name;
    char *email;
    char *company;
    char *organisation;
    char *smail;
    char *webPage;
    char *phone;
} person, *personPtr;

/*
 * And the code needed to parse it
 */
personPtr parsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
    personPtr ret = NULL;

DEBUG("parsePerson\n");
    /*
     * allocate the struct
     */
    ret = (personPtr) malloc(sizeof(person));
    if (ret == NULL) {
        fprintf(stderr,"out of memory\n");
        return(NULL);
    }
    memset(ret, 0, sizeof(person));

    /* We don't care what the top level element name is */
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
        if ((!strcmp(cur->name, "Person")) && (cur->ns == ns))
            ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!strcmp(cur->name, "Email")) && (cur->ns == ns))
            ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        cur = cur->next;
    }

    return(ret);
}

Here are a couple of things to notice:

  • Usually a recursive parsing style is the more convenient one: XML data is by nature subject to repetitive constructs and usually exhibits highly structured patterns.
  • The two arguments of type xmlDocPtr and xmlNsPtr, i.e. the pointer to the global XML document and the namespace reserved to the application. Document wide information are needed for example to decode entities and it's a good coding practice to define a namespace for your application set of data and test that the element and attributes you're analyzing actually pertains to your application space. This is done by a simple equality test (cur->ns == ns).
  • To retrieve text and attributes value, you can use the function xmlNodeListGetString to gather all the text and entity reference nodes generated by the DOM output and produce an single text string.

Here is another piece of code used to parse another level of the structure:

#include <libxml/tree.h>
/*
 * a Description for a Job
 */
typedef struct job {
    char *projectID;
    char *application;
    char *category;
    personPtr contact;
    int nbDevelopers;
    personPtr developers[100]; /* using dynamic alloc is left as an exercise */
} job, *jobPtr;

/*
 * And the code needed to parse it
 */
jobPtr parseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
    jobPtr ret = NULL;

DEBUG("parseJob\n");
    /*
     * allocate the struct
     */
    ret = (jobPtr) malloc(sizeof(job));
    if (ret == NULL) {
        fprintf(stderr,"out of memory\n");
        return(NULL);
    }
    memset(ret, 0, sizeof(job));

    /* We don't care what the top level element name is */
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
        
        if ((!strcmp(cur->name, "Project")) && (cur->ns == ns)) {
            ret->projectID = xmlGetProp(cur, "ID");
            if (ret->projectID == NULL) {
                fprintf(stderr, "Project has no ID\n");
            }
        }
        if ((!strcmp(cur->name, "Application")) && (cur->ns == ns))
            ret->application = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!strcmp(cur->name, "Category")) && (cur->ns == ns))
            ret->category = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!strcmp(cur->name, "Contact")) && (cur->ns == ns))
            ret->contact = parsePerson(doc, ns, cur);
        cur = cur->next;
    }

    return(ret);
}

Once you are used to it, writing this kind of code is quite simple, but boring. Ultimately, it could be possible to write stubbers taking either C data structure definitions, a set of XML examples or an XML DTD and produce the code needed to import and export the content between C data and XML storage. This is left as an exercise to the reader :-)

Feel free to use the code for the full C parsing example as a template, it is also available with Makefile in the Gnome SVN base under libxml2/example

Daniel Veillard

libxml2-2.9.1+dfsg1/doc/Libxml2-Logo-90x34.gif0000644000175000017500000000577611234335462017026 0ustar aronaronGIF89aZ"÷ÿòóòñòñÝÞÜÍÎÉïðïØÙÕ¹¹µÂ½ðñðKSTóôóqqnjjf::9´µ±ÝÝÛ--,ÏÐÉàáÞ©ª¥ÅÆÁžž™èèæƒ…%&%===îïî••‘ëìêéééÿÿÿ]]\™š”ÎÎÌ¢£ êëêU\[èéèqtrŸ ÚÚØÍÍÅ[[ZÖ×Õ``]ABAéêéíîítxumml­­©áâᥥ¢²²®€~xzvíîì@@@^cb}~|}~z‰Š†ìíêEFDz{yZ`_רÖkpollhRYWŠ`a`ÑÒÐ^^ZìíìvwtØØ×ÙÚØñòðÕÕÎåèææçæÐÐÇßàÞ˜˜’åæättq‘775ÉÉÁz|znrq}€|ö÷õ==;ÐÑÍVWU…ˆƒòòñDDAÆÆÅ887óóòafeãäáâãâ**)ÒÓÏäåãYZXfjhÇÈÃðð¨ÛÜÚâãàÔÔÐÊËÈŽŽimk¬­¬MMMÖ×ÒÊÊÆ–˜“ëëèš›™Š‰ÓÔÒ’”SSQåæåÈÈÆÚÛÙrro¾¾½fgdjji’’’¾À»ÒÒÌUUQ¦§¤chgÂÂÁññ𽽸Y^]ËÌÉrvsinl›œ–HHGv{yœŽ‹ º»¹ÑÒÎIOOÉÊÄñõõõõóCC@553cdaefbùúú,,+ØØÒ«¬«ÐÐÏIJHäåäàáà––•ÕÖÒÈÈÄËËÄÖ×ÐÛÜÖ;;:OQN@@>ÜÝ×—ËÌÅŠŠˆ6:7'('KMJ221352?@?äçæñññÔÕÓCJMÓÔÍ…‰ˆywt'+*//. ··²òñòBFCòóôËÐÐW]\OXXÊËÌ÷ø÷;>==EHÓÓË QQNÇÊÈóòóìëìôóôìíîpppðïîúûù\``AGH*32œœ™òòòÕÚÚ1;;./.ððð¾ÁÀ»¼¸€€€!ùÿ,Z"ÿÿ db,\€ƒ*\Ȱ¡Ã‡#š0ÆD @"6¬À £Ç CŠI²¤É“7Vlx@Dà´2NÊœI³æI5$ü 1Ħϟ@O‚r¡áÎGF?ÊÌqÁ´©S§e`ˆ ús ­b-)Kƒ‰K àÏ)8¤ÒŠ Gí½råÆ) A»™¶Rí8… ø’x˜$ƒo˜V C 1h‘ƒ‹@‹  ÚØ²1ä °Á„ppA+èDOôù€:"``Ž õô-)(be>ÀArA‚üÀ˜nY7 ú¢+(*p€!ä»°&>ÒJÈÒ2Dà0B-1_`z¸Á ‰)L! ȧ}“ÿO{æ3ziA+‘‡‚à,HÁ#1UŒŒàͪ@ ¶Ôà  èTà K°aù:ƒ’„:œÆyЂáÎ, i‚ü ‹Rp‚¦B‚(<°„HA ?X 1p/Ô y IIpƒpaŠŸà": ˆ8” I"¾ $ÐÁ>)HF 'àÃ@…¸Öô‚p3Á`â%$\ 8@€B´p ì! PV>±,8µeÈ@D 1ŠQp ‚ˆG4j1†$tàð*ŠP„Sä‹B ©aɃL¢-½ÂЈXÿ<"oÐA<AÀ^ ¡‚´Ô`¥ÀÀ¾' €n&¦ô¡¼ ˜¡fÈ@!‚€ˆQt ¡PA<Ú À§Mm’`<äô Dl7Ô… xA@C Ž@w޹‚ÀÔðÚÂ’@ ðGP±ˆ#(ô‡Q†>Ìð…d@eØ‚âô '´ƒ eP|  %lÃé%iAdTpg&pÄ. B®&¼ˆ<Œ!Yp€.À©C¬Pƒ ÄÂ|À‚#! eHCBûÁ/’0‡d c*¸+ŒŒUô¡Ä XÀ7NË’cÿ! j`ÜÒgÃÄ#fq4@´áÇ# B€<$Ï z±…-Pê±yD8T@0Ѐ µ8F#œƒ?ÀÄ”P†6P°€SlãR$«v¡ƒ × “xÁ!k´` ’ÐAD€ØÎ: ëB q]À iDã(®X5! Ã;A,‡"¼4@,Q„Ml£Ôù +@’›# "ð…®ËJ†2 !5Á4‘ˆ m¨ÈP@fˆQW³‰ ÷N‚5’`á IúŠGD€{(àá‡8à ‚‰SÑX<"€0"â@Ô!MÛØƒ*!€ ¹Â ar]¼œ{pù¡ó=Ä!œXÄËMŽX  n°Ôa4 ‹8"ˆÔ§Nõª÷ D° =à)¼à2ˆ#¢ ,¸ xø)#Ú׆`~G`1#X€‡´_ŒXûÔîõ&Ђ/ ”»âPìe$õ»žc>Àøš°‚°L8È’pñ%Ü`ã¯ùxŠÞ °•¡üC09üO¸¨OÕ“'°¸HFV°q×Û~/)YIK,BDä÷À¾ð2‘Š$ ;libxml2-2.9.1+dfsg1/doc/index.html0000644000175000017500000004072712124524424015330 0ustar aronaron The XML C parser and toolkit of Gnome
Action against software patents Gnome2 Logo W3C Logo Red Hat Logo

The XML C parser and toolkit of Gnome

libxml

Main Menu
Related links

"Programming with libxml2 is like the thrilling embrace of an exotic stranger." Mark Pilgrim

Libxml2 is the XML C parser and toolkit developed for the Gnome project (but usable outside of the Gnome platform), it is free software available under the MIT License. XML itself is a metalanguage to design markup languages, i.e. text language where semantic and structure are added to the content using extra "markup" information enclosed between angle brackets. HTML is the most well-known markup language. Though the library is written in C a variety of language bindings make it available in other environments.

Libxml2 is known to be very portable, the library should build and work without serious troubles on a variety of systems (Linux, Unix, Windows, CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, VxWorks, ...)

Libxml2 implements a number of existing standards related to markup languages:

In most cases libxml2 tries to implement the specifications in a relatively strictly compliant way. As of release 2.4.16, libxml2 passed all 1800+ tests from the OASIS XML Tests Suite.

To some extent libxml2 provides support for the following additional specifications but doesn't claim to implement them completely:

  • Document Object Model (DOM) http://www.w3.org/TR/DOM-Level-2-Core/ the document model, but it doesn't implement the API itself, gdome2 does this on top of libxml2
  • RFC 959 : libxml2 implements a basic FTP client code
  • RFC 1945 : HTTP/1.0, again a basic HTTP client code
  • SAX: a SAX2 like interface and a minimal SAX1 implementation compatible with early expat versions

A partial implementation of XML Schemas Part 1: Structure is being worked on but it would be far too early to make any conformance statement about it at the moment.

Separate documents:

Hosting sponsored by Open Source CMS services from AOE media.

Logo designed by Marc Liyanage.

Daniel Veillard

libxml2-2.9.1+dfsg1/doc/guidelines.html0000644000175000017500000004237611234335462016356 0ustar aronaron XML resources publication guidelines

XML resources publication guidelines

The goal of this document is to provide a set of guidelines and tips helping the publication and deployment of XML resources for the GNOME project. However it is not tied to GNOME and might be helpful more generally. I welcome feedback on this document.

The intended audience is the software developers who started using XML for some of the resources of their project, as a storage format, for data exchange, checking or transformations. There have been an increasing number of new XML formats defined, but not all steps have been taken, possibly because of lack of documentation, to truly gain all the benefits of the use of XML. These guidelines hope to improve the matter and provide a better overview of the overall XML processing and associated steps needed to deploy it successfully:

Table of contents:

  1. Design guidelines
  2. Canonical URL
  3. Catalog setup
  4. Package integration

Design guidelines

This part intends to focus on the format itself of XML. It may arrive a bit too late since the structure of the document may already be cast in existing and deployed code. Still, here are a few rules which might be helpful when designing a new XML vocabulary or making the revision of an existing format:

Reuse existing formats:

This may sounds a bit simplistic, but before designing your own format, try to lookup existing XML vocabularies on similar data. Ideally this allows you to reuse them, in which case a lot of the existing tools like DTD, schemas and stylesheets may already be available. If you are looking at a documentation format, DocBook should handle your needs. If reuse is not possible because some semantic or use case aspects are too different this will be helpful avoiding design errors like targeting the vocabulary to the wrong abstraction level. In this format design phase try to be synthetic and be sure to express the real content of your data and use the XML structure to express the semantic and context of those data.

DTD rules:

Building a DTD (Document Type Definition) or a Schema describing the structure allowed by instances is the core of the design process of the vocabulary. Here are a few tips:

  • use significant words for the element and attributes names.
  • do not use attributes for general textual content, attributes will be modified by the parser before reaching the application, spaces and line informations will be modified.
  • use single elements for every string that might be subject to localization. The canonical way to localize XML content is to use siblings element carrying different xml:lang attributes like in the following:
    <welcome>
      <msg xml:lang="en">hello</msg>
      <msg xml:lang="fr">bonjour</msg>
    </welcome>
  • use attributes to refine the content of an element but avoid them for more complex tasks, attribute parsing is not cheaper than an element and it is far easier to make an element content more complex while attribute will have to remain very simple.

Versioning:

As part of the design, make sure the structure you define will be usable for future extension that you may not consider for the current version. There are two parts to this:

  • Make sure the instance contains a version number which will allow to make backward compatibility easy. Something as simple as having a version="1.0" on the root document of the instance is sufficient.
  • While designing the code doing the analysis of the data provided by the XML parser, make sure you can work with unknown versions, generate a UI warning and process only the tags recognized by your version but keep in mind that you should not break on unknown elements if the version attribute was not in the recognized set.

Other design parts:

While defining you vocabulary, try to think in term of other usage of your data, for example how using XSLT stylesheets could be used to make an HTML view of your data, or to convert it into a different format. Checking XML Schemas and looking at defining an XML Schema with a more complete validation and datatyping of your data structures is important, this helps avoiding some mistakes in the design phase.

Namespace:

If you expect your XML vocabulary to be used or recognized outside of your application (for example binding a specific processing from a graphic shell like Nautilus to an instance of your data) then you should really define an XML namespace for your vocabulary. A namespace name is an URL (absolute URI more precisely). It is generally recommended to anchor it as an HTTP resource to a server associated with the software project. See the next section about this. In practice this will mean that XML parsers will not handle your element names as-is but as a couple based on the namespace name and the element name. This allows it to recognize and disambiguate processing. Unicity of the namespace name can be for the most part guaranteed by the use of the DNS registry. Namespace can also be used to carry versioning information like:

"http://www.gnome.org/project/projectname/1.0/"

An easy way to use them is to make them the default namespace on the root element of the XML instance like:

<structure xmlns="http://www.gnome.org/project/projectname/1.0/">
  <data>
  ...
  </data>
</structure>

In that document, structure and all descendant elements like data are in the given namespace.

Canonical URL

As seen in the previous namespace section, while XML processing is not tied to the Web there is a natural synergy between both. XML was designed to be available on the Web, and keeping the infrastructure that way helps deploying the XML resources. The core of this issue is the notion of "Canonical URL" of an XML resource. The resource can be an XML document, a DTD, a stylesheet, a schema, or even non-XML data associated with an XML resource, the canonical URL is the URL where the "master" copy of that resource is expected to be present on the Web. Usually when processing XML a copy of the resource will be present on the local disk, maybe in /usr/share/xml or /usr/share/sgml maybe in /opt or even on C:\projectname\ (horror !). The key point is that the way to name that resource should be independent of the actual place where it resides on disk if it is available, and the fact that the processing will still work if there is no local copy (and that the machine where the processing is connected to the Internet).

What this really means is that one should never use the local name of a resource to reference it but always use the canonical URL. For example in a DocBook instance the following should not be used:

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"/usr/share/xml/docbook/4.2/docbookx.dtd">

But always reference the canonical URL for the DTD:

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

Similarly, the document instance may reference the XSLT stylesheets needed to process it to generate HTML, and the canonical URL should be used:

<?xml-stylesheet
  href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"
  type="text/xsl"?>

Defining the canonical URL for the resources needed should obey a few simple rules similar to those used to design namespace names:

  • use a DNS name you know is associated to the project and will be available on the long term
  • within that server space, reserve the right to the subtree where you intend to keep those data
  • version the URL so that multiple concurrent versions of the resources can be hosted simultaneously

Catalog setup

How catalogs work:

The catalogs are the technical mechanism which allow the XML processing tools to use a local copy of the resources if it is available even if the instance document references the canonical URL. XML Catalogs are anchored in the root catalog (usually /etc/xml/catalog or defined by the user). They are a tree of XML documents defining the mappings between the canonical naming space and the local installed ones, this can be seen as a static cache structure.

When the XML processor is asked to process a resource it will automatically test for a locally available version in the catalog, starting from the root catalog, and possibly fetching sub-catalog resources until it finds that the catalog has that resource or not. If not the default processing of fetching the resource from the Web is done, allowing in most case to recover from a catalog miss. The key point is that the document instances are totally independent of the availability of a catalog or from the actual place where the local resource they reference may be installed. This greatly improves the management of the documents in the long run, making them independent of the platform or toolchain used to process them. The figure below tries to express that mechanism:Picture describing the catalog

Usual catalog setup:

Usually catalogs for a project are setup as a 2 level hierarchical cache, the root catalog containing only "delegates" indicating a separate subcatalog dedicated to the project. The goal is to keep the root catalog clean and simplify the maintenance of the catalog by using separate catalogs per project. For example when creating a catalog for the XHTML1 DTDs, only 3 items are added to the root catalog:

  <delegatePublic publicIdStartString="-//W3C//DTD XHTML 1.0"
                  catalog="file:///usr/share/sgml/xhtml1/xmlcatalog"/>
  <delegateSystem systemIdStartString="http://www.w3.org/TR/xhtml1/DTD"
                  catalog="file:///usr/share/sgml/xhtml1/xmlcatalog"/>
  <delegateURI uriStartString="http://www.w3.org/TR/xhtml1/DTD"
                  catalog="file:///usr/share/sgml/xhtml1/xmlcatalog"/>

They are all "delegates" meaning that if the catalog system is asked to resolve a reference corresponding to them, it has to lookup a sub catalog. Here the subcatalog was installed as /usr/share/sgml/xhtml1/xmlcatalog in the local tree. That decision is left to the sysadmin or the packager for that system and may obey different rules, but the actual place on the filesystem (or on a resource cache on the local network) will not influence the processing as long as it is available. The first rule indicate that if the reference uses a PUBLIC identifier beginning with the

"-//W3C//DTD XHTML 1.0"

substring, then the catalog lookup should be limited to the specific given lookup catalog. Similarly the second and third entries indicate those delegation rules for SYSTEM, DOCTYPE or normal URI references when the URL starts with the "http://www.w3.org/TR/xhtml1/DTD" substring which indicates the location on the W3C server where the XHTML1 resources are stored. Those are the beginning of all Canonical URLs for XHTML1 resources. Those three rules are sufficient in practice to capture all references to XHTML1 resources and direct the processing tools to the right subcatalog.

A subcatalog example:

Here is the complete subcatalog used for XHTML1:

<?xml version="1.0"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
          "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <public publicId="-//W3C//DTD XHTML 1.0 Strict//EN"
          uri="xhtml1-20020801/DTD/xhtml1-strict.dtd"/>
  <public publicId="-//W3C//DTD XHTML 1.0 Transitional//EN"
          uri="xhtml1-20020801/DTD/xhtml1-transitional.dtd"/>
  <public publicId="-//W3C//DTD XHTML 1.0 Frameset//EN"
          uri="xhtml1-20020801/DTD/xhtml1-frameset.dtd"/>
  <rewriteSystem systemIdStartString="http://www.w3.org/TR/xhtml1/DTD"
          rewritePrefix="xhtml1-20020801/DTD"/>
  <rewriteURI uriStartString="http://www.w3.org/TR/xhtml1/DTD"
          rewritePrefix="xhtml1-20020801/DTD"/>
</catalog>

There are a few things to notice:

  • this is an XML resource, it points to the DTD using Canonical URLs, the root element defines a namespace (but based on an URN not an HTTP URL).
  • it contains 5 rules, the 3 first ones are direct mapping for the 3 PUBLIC identifiers defined by the XHTML1 specification and associating them with the local resource containing the DTD, the 2 last ones are rewrite rules allowing to build the local filename for any URL based on "http://www.w3.org/TR/xhtml1/DTD", the local cache simplifies the rules by keeping the same structure as the on-line server at the Canonical URL
  • the local resources are designated using URI references (the uri or rewritePrefix attributes), the base being the containing sub-catalog URL, which means that in practice the copy of the XHTML1 strict DTD is stored locally in /usr/share/sgml/xhtml1/xmlcatalog/xhtml1-20020801/DTD/xhtml1-strict.dtd

Those 5 rules are sufficient to cover all references to the resources held at the Canonical URL for the XHTML1 DTDs.

Package integration

Creating and removing catalogs should be handled as part of the process of (un)installing the local copy of the resources. The catalog files being XML resources should be processed with XML based tools to avoid problems with the generated files, the xmlcatalog command coming with libxml2 allows you to create catalogs, and add or remove rules at that time. Here is a complete example coming from the RPM for the XHTML1 DTDs post install script. While this example is platform and packaging specific, this can be useful as a an example in other contexts:

%post
CATALOG=/usr/share/sgml/xhtml1/xmlcatalog
#
# Register it in the super catalog with the appropriate delegates
#
ROOTCATALOG=/etc/xml/catalog

if [ ! -r $ROOTCATALOG ]
then
    /usr/bin/xmlcatalog --noout --create $ROOTCATALOG
fi

if [ -w $ROOTCATALOG ]
then
        /usr/bin/xmlcatalog --noout --add "delegatePublic" \
                "-//W3C//DTD XHTML 1.0" \
                "file://$CATALOG" $ROOTCATALOG
        /usr/bin/xmlcatalog --noout --add "delegateSystem" \
                "http://www.w3.org/TR/xhtml1/DTD" \
                "file://$CATALOG" $ROOTCATALOG
        /usr/bin/xmlcatalog --noout --add "delegateURI" \
                "http://www.w3.org/TR/xhtml1/DTD" \
                "file://$CATALOG" $ROOTCATALOG
fi

The XHTML1 subcatalog is not created on-the-fly in that case, it is installed as part of the files of the packages. So the only work needed is to make sure the root catalog exists and register the delegate rules.

Similarly, the script for the post-uninstall just remove the rules from the catalog:

%postun
#
# On removal, unregister the xmlcatalog from the supercatalog
#
if [ "$1" = 0 ]; then
    CATALOG=/usr/share/sgml/xhtml1/xmlcatalog
    ROOTCATALOG=/etc/xml/catalog

    if [ -w $ROOTCATALOG ]
    then
            /usr/bin/xmlcatalog --noout --del \
                    "-//W3C//DTD XHTML 1.0" $ROOTCATALOG
            /usr/bin/xmlcatalog --noout --del \
                    "http://www.w3.org/TR/xhtml1/DTD" $ROOTCATALOG
            /usr/bin/xmlcatalog --noout --del \
                    "http://www.w3.org/TR/xhtml1/DTD" $ROOTCATALOG
    fi
fi

Note the test against $1, this is needed to not remove the delegate rules in case of upgrade of the package.

Following the set of guidelines and tips provided in this document should help deploy the XML resources in the GNOME framework without much pain and ensure a smooth evolution of the resource and instances.

Daniel Veillard

$Id$

libxml2-2.9.1+dfsg1/doc/APIchunk19.html0000644000175000017500000010746112134171042016027 0ustar aronaron API Alphabetic Index m-m for libxml2
Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
Made with Libxml2 Logo

The XML C parser and toolkit of Gnome

API Alphabetic Index m-m for libxml2

Developer Menu
API Indexes
Related links

A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

Letter m:

machine
xmlCheckFilename
macro
INVALID_SOCKET
SOCKET
XML_CAST_FPTR
xmlTextWriterWriteDocType
xmlTextWriterWriteProcessingInstruction
made
LIBXML_ISO8859X_ENABLED
xmlCharEncOutFunc
xmlExpParse
xmlNodeListGetRawString
xmlNodeListGetString
xmlSetEntityReferenceFunc
xmlXPtrNewLocationSetNodes
main
xmlIsMainThread
maintained
xmlRemoveID
xmlRemoveRef
xmlSchemaSAXPlug
major
xmlDecodeEntities
make
xmlCreateEntitiesTable
xmlNewNode
xmlSaveClose
xmlSaveFlush
makes
xmlLoadCatalog
xmlLoadCatalogs
xmlTextReaderExpand
malloc
xmlGcMemGet
xmlGcMemSetup
xmlMallocAtomicLoc
xmlMallocFunc
xmlMallocLoc
xmlMemGet
xmlMemMalloc
xmlMemSetup
mallocAtomicFunc
xmlGcMemGet
xmlGcMemSetup
manage
xmlBufferWriteChar
xmlBufferWriteQuotedString
manages
xmlBufferWriteCHAR
mandate
xmlGetThreadId
manipulated
xmlNewRMutex
manipulating
xmlExpNewCtxt
xmlLoadSGMLSuperCatalog
manipulation
LIBXML_TREE_ENABLED
many
_xmlParserInput
xmlXPathStringFunction
map
_xmlDOMWrapCtxt
maps
xmlTextReaderLookupNamespace
xmlTextWriterWriteDocType
xmlTextWriterWriteProcessingInstruction
mark
xmlStrcat
xmlStrdup
xmlTextReaderQuoteChar
marked
XML_SCHEMAS_ATTRGROUP_MARKED
XML_SCHEMAS_TYPE_MARKED
_xmlParserInput
marker
xmlDecodeEntities
xmlStringDecodeEntities
xmlStringLenDecodeEntities
marking
xmlParseCharData
marks
xmlParseCharData
markup
XML_MAX_NAME_LENGTH
xmlParseMarkupDecl
xmlParseSDDecl
xmlTextReaderReadInnerXml
xmlTextReaderReadOuterXml
xmlTextWriterWriteFormatDTD
xmlTextWriterWriteVFormatDTD
markupdecl
xmlParseDocTypeDecl
xmlParseExternalSubset
xmlParseMarkupDecl
masked
xmlReconciliateNs
matched
xmlTextReaderPreservePattern
matches
CHECK_ARITY
xmlFileMatch
xmlIOFTPMatch
xmlIOHTTPMatch
xmlParseCtxtExternalEntity
xmlParseExtParsedEnt
xmlParseExternalEntity
xmlPatternMatch
xmlRegexpExec
xmlValidateDtdFinal
matching
xmlFileMatch
xmlFileOpen
xmlHashScan3
xmlHashScanFull3
xmlIOFTPMatch
xmlIOFTPOpen
xmlIOHTTPMatch
xmlIOHTTPOpen
xmlRegNewExecCtxt
xmlValidateAttributeDecl
xmlValidateOneAttribute
xmlValidateOneNamespace
xmlXPathIdFunction
max
_xmlXPathContext
_xmlXPathParserContext
xmlExpParse
xmlGetCompressMode
xmlGetDocCompressMode
xmlOutputBufferCreateFilename
xmlSetCompressMode
xmlSetDocCompressMode
xmlStrncasecmp
xmlStrncmp
maxLength
xmlSchemaValidateLengthFacet
xmlSchemaValidateLengthFacetWhtsp
maximal
xmlAutomataNewCounter
maximum
xmlAutomataNewCountTrans
xmlAutomataNewCountTrans2
xmlAutomataNewOnceTrans
xmlAutomataNewOnceTrans2
xmlCheckUTF8
xmlExpMaxToken
xmlExpNewCtxt
xmlPatternMaxDepth
xmlXPathContextSetCache
maybe
_xmlSchemaElement
mean
xmlPatternMinDepth
means
xmlExpNewRange
xmlParseSDDecl
xmlSetGenericErrorFunc
xmlSetStructuredErrorFunc
xmlStreamPush
xmlStreamPushAttr
xmlStreamPushNode
mechanism
_xmlXPathContext
xmlStructuredErrorFunc
xmlXPathRegisterFuncLookup
xmlXPathRegisterVariableLookup
mechanisms
xmlNodeGetBase
meet
xmlParseDefaultDecl
member
xmlSAXParseFileWithData
xmlSAXParseMemoryWithData
xmlTextWriterWriteVFormatAttribute
xmlTextWriterWriteVFormatAttributeNS
xmlTextWriterWriteVFormatCDATA
xmlTextWriterWriteVFormatComment
xmlTextWriterWriteVFormatDTD
xmlTextWriterWriteVFormatDTDAttlist
xmlTextWriterWriteVFormatDTDElement
xmlTextWriterWriteVFormatDTDInternalEntity
xmlTextWriterWriteVFormatElement
xmlTextWriterWriteVFormatElementNS
xmlTextWriterWriteVFormatPI
xmlTextWriterWriteVFormatRaw
xmlTextWriterWriteVFormatString
xmlXPathStringFunction
member-types
_xmlSchemaType
memo
getSystemId
xmlSAX2GetSystemId
memorylist
xmlMemDisplay
xmlMemDisplayLast
xmlMemoryDump
merged
xmlTextMerge
merging
xmlAddChild
xmlAddChildList
xmlAddNextSibling
xmlAddPrevSibling
xmlAddSibling
messages
errorSAXFunc
fatalErrorSAXFunc
warningSAXFunc
xmlParserError
xmlParserValidityError
xmlParserValidityWarning
xmlParserWarning
xmlSetGenericErrorFunc
xmlSetStructuredErrorFunc
method
XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
_xmlBuffer
xmlNanoHTTPMethod
xmlNanoHTTPMethodRedir
xmlOutputBufferCreateFilenameFunc
xmlParserInputBufferCreateFilenameFunc
xmlRegisterHTTPPostCallbacks
xmlSetBufferAllocationScheme
xmlTextReaderClose
xmlTextReaderGetRemainder
might
xmlNewTextChild
migrate
xmlEncodeEntities
min
xmlExpParse
minLength
xmlSchemaValidateLengthFacet
xmlSchemaValidateLengthFacetWhtsp
minimal
xmlAutomataNewCounter
xmlExpParse
minimum
xmlAutomataNewCountTrans
xmlAutomataNewCountTrans2
xmlAutomataNewOnceTrans
xmlAutomataNewOnceTrans2
xmlBufferGrow
xmlBufferResize
xmlGetUTF8Char
xmlPatternMinDepth
minus
xmlXPathStringFunction
minute
ftpListCallback
misc
xmlXPathContextSetCache
misleading
xmlCleanupParser
xmlParsePEReference
xmlParserHandlePEReference
missing
xmlParseSDDecl
mixed
XML_SCHEMAS_TYPE_MIXED
xmlKeepBlanksDefault
mixed-content
xmlParseElementMixedContentDecl
mmap
xmlParserInputBufferCreateStatic
mod
xmlXPathModValues
mode
_xmlBuffer
_xmlParserCtxt
docbCreatePushParserCtxt
htmlCreatePushParserCtxt
xmlC14NDocDumpMemory
xmlC14NDocSave
xmlC14NDocSaveTo
xmlC14NExecute
xmlCreatePushParserCtxt
xmlGetCompressMode
xmlKeepBlanksDefault
xmlNanoFTPGetConnection
xmlParseReference
xmlParserInputBufferGrow
xmlParserInputBufferPush
xmlSAXParseDoc
xmlSAXParseFile
xmlSAXParseFileWithData
xmlSAXParseMemory
xmlSAXParseMemoryWithData
xmlSetCompressMode
model
_xmlSchemaType
xmlValidBuildContentModel
modified
xmlBufferCreateStatic
xmlNodeAddContent
xmlNodeAddContentLen
xmlNodeSetContent
xmlNodeSetContentLen
xmlSchemaNewDocParserCtxt
xmlSchematronNewDocParserCtxt
modifies
xmlRelaxNGNewDocParserCtxt
modify
xmlShell
module
LIBXML_DEBUG_ENABLED
LIBXML_MODULES_ENABLED
xmlInputMatchCallback
xmlModuleClose
xmlModuleFree
xmlModuleOpen
xmlModuleSymbol
xmlOutputMatchCallback
xmlStructuredErrorFunc
modules
LIBXML_MODULE_EXTENSION
moment
xmlDOMWrapReconcileNamespaces
xmlDOMWrapRemoveNode
month
ftpListCallback
more
XML_MAX_NAMELEN
XML_MAX_NAME_LENGTH
xmlExpGetLanguage
xmlExpGetStart
xmlParseAttributeType
xmlParseElementDecl
xmlParseElementMixedContentDecl
xmlParseStartTag
xmlStrEqual
xmlTextReaderByteConsumed
xmlTextReaderNext
xmlTextReaderNextSibling
xmlTextReaderRead
xmlTextReaderReadAttributeValue
xmlXPathStringFunction
moreover
xmlAutomataNewOnceTrans
xmlAutomataNewOnceTrans2
most
xmlC14NExecute
xmlGetFeaturesList
move
xmlDOMWrapAdoptNode
moved
xmlTextReaderMoveToElement
much
xmlDictGetUsage
xmlReconciliateNs
multi-threaded
xmlSetGenericErrorFunc
xmlSetStructuredErrorFunc
multi-threading
xmlCleanupGlobals
xmlInitGlobals
multiple
xmlCurrentChar
xmlStringCurrentChar
multiply
xmlXPathMultValues
multithreaded
htmlInitAutoClose
xmlCleanupParser
xmlCleanupThreads
xmlInitParser
mutex
xmlDictCleanup
xmlFreeMutex
xmlFreeRMutex
xmlInitializeDict
xmlMutexLock
xmlMutexUnlock
xmlNewMutex
xmlNewRMutex
xmlRMutexLock
xmlRMutexUnlock
myDoc
docbFreeParserCtxt
htmlFreeParserCtxt
xmlFreeParserCtxt
myproxy
xmlNanoFTPScanProxy
xmlNanoHTTPScanProxy
myproxy:3128
xmlNanoFTPScanProxy
xmlNanoHTTPScanProxy

A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

Daniel Veillard

libxml2-2.9.1+dfsg1/doc/w3c.png0000644000175000017500000000375411234335462014537 0ustar aronaron‰PNG  IHDRH0=þ«¼gAMA± üa£IDATxœíZ}lSU?1{‹t3bí(°°n "a4iXÙøj²©8 ›ºŠ1Jg ¸8¶QØ3tQ—(h ö¡C’K ^·áˆR¹¹B²õMÛ&nCçnoïûhGX²_úǹï÷Þù½sî¹çžW€G=h&?h& ,±'´÷,Ë"a``Àd2™L¦GÁc,ËšL&$oذã8Žã`ìáGmmíØØX~~~(ÊÏÏGG!õë×Ûl64¼3Çøðp×o!¬´pNº"m*uå`ø÷[<4è•òO:}þ« !9íÉÍ3Œ¼¾èCeÀq\NN €V«eYÖf³iµZÀëØ`xáÇñ5õïå•ΣnÔÌÛ| [w¯’ç6­ðà?ðoò† oÈq\uuuKK Ã0EEEv»]£Ñ S<Ï †®®.8sæ ÇqÈW<ÏïÚµ«²²òN(ª•i3ÓSñÏuÜ>8[›‘š2›~쑱ÒëÞ¾=VB8ÎÜÜÜ––ˆD"‡ÎÊÊr:èl]]ÝåË—‘ŒÒ ˲,Ë644TVV*ŠXå±¥þ—ÍÝHNM™r³©Tø°MµÞ£ž’g¦§þòÍ+Rfm©¿ð…»û±¤W“¥ó§_·9ŽËÍÍÕloo×ëõ³fÍŠD"íííF£QT-–<ÌËfc9:2Új/ÏžåþPôF0,eè9Pš…ª^‹£a6›¥4ËÊÊjjj"‘\¿~]J-FÌ W’‘vøôU¡ö:‚<4KDã`¸»—ÇÃ+æ…ÛÊÉß×U+Hý£–œ]N§³¯¯u:ÝöíÛ­V«J¥€¾¾¾}ûöšx‰‰A¼CD_¹"mêÒùÓñÐÛ!î’ðØ?ðÉÛ‹)…­û/`95e ûÎòì°ÜØØØÕÕµcÇŽ½{÷vvv––Æ&HEE…B¡5(b¤Cº{yÑH›=# Ëm?õòáa¡Ix‘öi*‰ï̪¼¼ŸR(.— qc¦¢¢BŠ•1p~¢ù³í§^@™cÊ,òþüäÏx83=µêõ¸ÙuöìY$”––’¬0\.—N§“wPÄiSdÆ´…S¨#0%uš|qG¨¥É¶ÿ"y‡Oßyºœã8$Øív)£].—¼»@¸mÙX0ËèÅ“höÑ4„^%©ÎLOÍÖfÄ”ýA¼ZÀÒùÓÍyq1w‰­]»¯ÅBäääÈ» „ĨL½~¡úCQja ©R±½óÐ%rø•Í 4hhhdÒ]’ ‰ek3È„´’Jâ¤;ƒdb0dÇ^“«í×óWnáa‰Q«VÆò…ûOŒ²†tI’\ñâtüq:8ÒøððÇ.Ž|ÊQO`eE«h R©FZBˆ#㇌4’Àæâç°ÜÝË㤄XÖÉUñÈ髤'Î_¹•·ù”«íWê¸Z­qˆ£&4v™Ù7Ì-\œ‰‡ˆ3&c•|AFF¤,x÷3ÉMªö/Ä7šB£›|=8M/ÈT¨•iˆ¥R ©`Ð+·•èÑ\Qlû/bŸßw1òeŸ¿r‹“l¹^Ié g’.EäñРWV½ž‹~ŠZw¯"gitd´þÄU{b=F¾lhþ±‡ôFiÁ\ˆßÂEGF½þ ©C%zúþzåiÇjò.G4Í}á&NL­L#¦þÄÏxꧦLÁk.iýÖú dI±N°òRÈÖf”µxHn”&Ü7©”`Ž/š±LR KÓ»Yjb‰•µ•”5Ô.v<;AŸaöŒ¸öŽLæ¼H£:äêsI~‚‘HFíÞ ×WÚW¸8“Ú\QbÂK†¼È.%L›6Íáp$s!‚ÙlNªç!„ðÅ iP͈'ßäëyyû™%›Ü¢÷§x½Òh4VWW˘„áp8|>Ÿßï—Rë!£qIN­¹ë–Í&ËvL~É&7N•M¾ªRãÃÃT¥²pNzæSEYYYjµZtïŒÁq\MM ¤ö z÷¤‹–Kô}I’ü""7¼Åz©BþcG–Å(€5ÕjµX,¸1*Çqƒµßdê¯q3Kä:²!ÉX–ƒåèÈhÁûßî xmlversion: compile-time version informations

xmlversion

xmlversion - compile-time version informations

compile-time version informations for the XML library

Author(s): Daniel Veillard

Description

Details

Macro ATTRIBUTE_UNUSED

#define ATTRIBUTE_UNUSED;

Macro used to signal to GCC unused function parameters


Macro DEBUG_MEMORY_LOCATION

#define DEBUG_MEMORY_LOCATION;

Whether the memory debugging is configured in


Macro LIBXML_ATTR_ALLOC_SIZE

#define LIBXML_ATTR_ALLOC_SIZE;

Macro used to indicate to GCC this is an allocator function


Macro LIBXML_ATTR_FORMAT

#define LIBXML_ATTR_FORMAT;

Macro used to indicate to GCC the parameter are printf like


Macro LIBXML_AUTOMATA_ENABLED

#define LIBXML_AUTOMATA_ENABLED;

Whether the automata interfaces are compiled in


Macro LIBXML_C14N_ENABLED

#define LIBXML_C14N_ENABLED;

Whether the Canonicalization support is configured in


Macro LIBXML_CATALOG_ENABLED

#define LIBXML_CATALOG_ENABLED;

Whether the Catalog support is configured in


Macro LIBXML_DEBUG_ENABLED

#define LIBXML_DEBUG_ENABLED;

Whether Debugging module is configured in


Macro LIBXML_DEBUG_RUNTIME

#define LIBXML_DEBUG_RUNTIME;

Whether the runtime debugging is configured in


Macro LIBXML_DOCB_ENABLED

#define LIBXML_DOCB_ENABLED;

Whether the SGML Docbook support is configured in


Macro LIBXML_DOTTED_VERSION

#define LIBXML_DOTTED_VERSION;

the version string like "1.2.3"


Macro LIBXML_EXPR_ENABLED

#define LIBXML_EXPR_ENABLED;

Whether the formal expressions interfaces are compiled in


Macro LIBXML_FTP_ENABLED

#define LIBXML_FTP_ENABLED;

Whether the FTP support is configured in


Macro LIBXML_HTML_ENABLED

#define LIBXML_HTML_ENABLED;

Whether the HTML support is configured in


Macro LIBXML_HTTP_ENABLED

#define LIBXML_HTTP_ENABLED;

Whether the HTTP support is configured in


Macro LIBXML_ICONV_ENABLED

#define LIBXML_ICONV_ENABLED;

Whether iconv support is available


Macro LIBXML_ICU_ENABLED

#define LIBXML_ICU_ENABLED;

Whether icu support is available


Macro LIBXML_ISO8859X_ENABLED

#define LIBXML_ISO8859X_ENABLED;

Whether ISO-8859-* support is made available in case iconv is not


Macro LIBXML_LEGACY_ENABLED

#define LIBXML_LEGACY_ENABLED;

Whether the deprecated APIs are compiled in for compatibility


Macro LIBXML_LZMA_ENABLED

#define LIBXML_LZMA_ENABLED;

Whether the Lzma support is compiled in


Macro LIBXML_MODULES_ENABLED

#define LIBXML_MODULES_ENABLED;

Whether the module interfaces are compiled in


Macro LIBXML_MODULE_EXTENSION

#define LIBXML_MODULE_EXTENSION;

the string suffix used by dynamic modules (usually shared libraries)


Macro LIBXML_OUTPUT_ENABLED

#define LIBXML_OUTPUT_ENABLED;

Whether the serialization/saving support is configured in


Macro LIBXML_PATTERN_ENABLED

#define LIBXML_PATTERN_ENABLED;

Whether the xmlPattern node selection interface is configured in


Macro LIBXML_PUSH_ENABLED

#define LIBXML_PUSH_ENABLED;

Whether the push parsing interfaces are configured in


Macro LIBXML_READER_ENABLED

#define LIBXML_READER_ENABLED;

Whether the xmlReader parsing interface is configured in


Macro LIBXML_REGEXP_ENABLED

#define LIBXML_REGEXP_ENABLED;

Whether the regular expressions interfaces are compiled in


Macro LIBXML_SAX1_ENABLED

#define LIBXML_SAX1_ENABLED;

Whether the older SAX1 interface is configured in


Macro LIBXML_SCHEMAS_ENABLED

#define LIBXML_SCHEMAS_ENABLED;

Whether the Schemas validation interfaces are compiled in


Macro LIBXML_SCHEMATRON_ENABLED

#define LIBXML_SCHEMATRON_ENABLED;

Whether the Schematron validation interfaces are compiled in


Macro LIBXML_TEST_VERSION

#define LIBXML_TEST_VERSION;

Macro to check that the libxml version in use is compatible with the version the software has been compiled against


Macro LIBXML_THREAD_ALLOC_ENABLED

#define LIBXML_THREAD_ALLOC_ENABLED;

Whether the allocation hooks are per-thread


Macro LIBXML_THREAD_ENABLED

#define LIBXML_THREAD_ENABLED;

Whether the thread support is configured in


Macro LIBXML_TREE_ENABLED

#define LIBXML_TREE_ENABLED;

Whether the DOM like tree manipulation API support is configured in


Macro LIBXML_UNICODE_ENABLED

#define LIBXML_UNICODE_ENABLED;

Whether the Unicode related interfaces are compiled in


Macro LIBXML_VALID_ENABLED

#define LIBXML_VALID_ENABLED;

Whether the DTD validation support is configured in


Macro LIBXML_VERSION

#define LIBXML_VERSION;

the version number: 1.2.3 value is 10203


Macro LIBXML_VERSION_EXTRA

#define LIBXML_VERSION_EXTRA;

extra version information, used to show a CVS compilation


Macro LIBXML_VERSION_STRING

#define LIBXML_VERSION_STRING;

the version number string, 1.2.3 value is "10203"


Macro LIBXML_WRITER_ENABLED

#define LIBXML_WRITER_ENABLED;

Whether the xmlWriter saving interface is configured in


Macro LIBXML_XINCLUDE_ENABLED

#define LIBXML_XINCLUDE_ENABLED;

Whether XInclude is configured in


Macro LIBXML_XPATH_ENABLED

#define LIBXML_XPATH_ENABLED;

Whether XPath is configured in


Macro LIBXML_XPTR_ENABLED

#define LIBXML_XPTR_ENABLED;

Whether XPointer is configured in


Macro LIBXML_ZLIB_ENABLED

#define LIBXML_ZLIB_ENABLED;

Whether the Zlib support is compiled in


Macro WITHOUT_TRIO

#define WITHOUT_TRIO;

defined if the trio support should not be configured in


Macro WITH_TRIO

#define WITH_TRIO;

defined if the trio support need to be configured in



libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xlink.html0000644000175000017500000004166112134171044020337 0ustar aronaron xlink: unfinished XLink detection module

xlink

xlink - unfinished XLink detection module

unfinished XLink detection module

Author(s): Daniel Veillard

Synopsis

typedef xmlChar * xlinkTitle;
typedef enum xlinkShow;
typedef xmlChar * xlinkHRef;
typedef enum xlinkActuate;
typedef struct _xlinkHandler xlinkHandler;
typedef xmlChar * xlinkRole;
typedef xlinkHandler * xlinkHandlerPtr;
typedef enum xlinkType;
void	xlinkSetDefaultDetect		(xlinkNodeDetectFunc func);
void	xlinkSetDefaultHandler		(xlinkHandlerPtr handler);
typedef void xlinkExtendedLinkFunk		(void * ctx, 
xmlNodePtr node,
int nbLocators,
const xlinkHRef * hrefs,
const xlinkRole * roles,
int nbArcs,
const xlinkRole * from,
const xlinkRole * to,
xlinkShow * show,
xlinkActuate * actuate,
int nbTitles,
const xlinkTitle * titles,
const xmlChar ** langs); typedef void xlinkExtendedLinkSetFunk (void * ctx,
xmlNodePtr node,
int nbLocators,
const xlinkHRef * hrefs,
const xlinkRole * roles,
int nbTitles,
const xlinkTitle * titles,
const xmlChar ** langs); typedef void xlinkSimpleLinkFunk (void * ctx,
xmlNodePtr node,
const xlinkHRef href,
const xlinkRole role,
const xlinkTitle title); typedef void xlinkNodeDetectFunc (void * ctx,
xmlNodePtr node); xlinkHandlerPtr xlinkGetDefaultHandler (void); xlinkType xlinkIsLink (xmlDocPtr doc,
xmlNodePtr node); xlinkNodeDetectFunc xlinkGetDefaultDetect (void);

Description

Details


Typedef xlinkHRef

xmlChar * xlinkHRef;


Structure xlinkHandler

struct _xlinkHandler {
    xlinkSimpleLinkFunk	simple
    xlinkExtendedLinkFunk	extended
    xlinkExtendedLinkSetFunk	set
} xlinkHandler;


Typedef xlinkHandlerPtr

xlinkHandler * xlinkHandlerPtr;


Typedef xlinkRole

xmlChar * xlinkRole;



Typedef xlinkTitle

xmlChar * xlinkTitle;



Function type xlinkExtendedLinkFunk

void	xlinkExtendedLinkFunk		(void * ctx, 
xmlNodePtr node,
int nbLocators,
const xlinkHRef * hrefs,
const xlinkRole * roles,
int nbArcs,
const xlinkRole * from,
const xlinkRole * to,
xlinkShow * show,
xlinkActuate * actuate,
int nbTitles,
const xlinkTitle * titles,
const xmlChar ** langs)

This is the prototype for a extended link detection callback.

ctx:user data pointer
node:the node carrying the link
nbLocators:the number of locators detected on the link
hrefs:pointer to the array of locator hrefs
roles:pointer to the array of locator roles
nbArcs:the number of arcs detected on the link
from:pointer to the array of source roles found on the arcs
to:pointer to the array of target roles found on the arcs
show:array of values for the show attributes found on the arcs
actuate:array of values for the actuate attributes found on the arcs
nbTitles:the number of titles detected on the link
titles:
langs:array of xml:lang values for the titles

Function type xlinkExtendedLinkSetFunk

void	xlinkExtendedLinkSetFunk	(void * ctx, 
xmlNodePtr node,
int nbLocators,
const xlinkHRef * hrefs,
const xlinkRole * roles,
int nbTitles,
const xlinkTitle * titles,
const xmlChar ** langs)

This is the prototype for a extended link set detection callback.

ctx:user data pointer
node:the node carrying the link
nbLocators:the number of locators detected on the link
hrefs:pointer to the array of locator hrefs
roles:pointer to the array of locator roles
nbTitles:the number of titles detected on the link
titles:
langs:array of xml:lang values for the titles

Function type xlinkNodeDetectFunc

void	xlinkNodeDetectFunc		(void * ctx, 
xmlNodePtr node)

This is the prototype for the link detection routine. It calls the default link detection callbacks upon link detection.

ctx:user data pointer
node:the node to check

Function type xlinkSimpleLinkFunk

void	xlinkSimpleLinkFunk		(void * ctx, 
xmlNodePtr node,
const xlinkHRef href,
const xlinkRole role,
const xlinkTitle title)

This is the prototype for a simple link detection callback.

ctx:user data pointer
node:the node carrying the link
href:the target of the link
role:the role string
title:the link title

xlinkGetDefaultDetect ()

xlinkNodeDetectFunc	xlinkGetDefaultDetect	(void)

Get the default xlink detection routine

Returns:the current function or NULL;

xlinkGetDefaultHandler ()

xlinkHandlerPtr	xlinkGetDefaultHandler	(void)

Get the default xlink handler.

Returns:the current xlinkHandlerPtr value.

xlinkIsLink ()

xlinkType	xlinkIsLink		(xmlDocPtr doc, 
xmlNodePtr node)

Check whether the given node carries the attributes needed to be a link element (or is one of the linking elements issued from the (X)HTML DtDs). This routine don't try to do full checking of the link validity but tries to detect and return the appropriate link type.

doc:the document containing the node
node:the node pointer itself
Returns:the xlinkType of the node (XLINK_TYPE_NONE if there is no link detected.

xlinkSetDefaultDetect ()

void	xlinkSetDefaultDetect		(xlinkNodeDetectFunc func)

Set the default xlink detection routine

func:pointer to the new detection routine.

xlinkSetDefaultHandler ()

void	xlinkSetDefaultHandler		(xlinkHandlerPtr handler)

Set the default xlink handlers

handler:the new value for the xlink handler block

libxml2-2.9.1+dfsg1/doc/devhelp/index.html0000644000175000017500000001034112134171044016741 0ustar aronaron libxml2 Reference Manual

libxml2 Reference Manual

Libxml2 is the XML C parser and toolkit developed for the Gnome project (but usable outside of the Gnome platform), it is free software available under the MIT License. XML itself is a metalanguage to design markup languages, i.e. text language where semantic and structure are added to the content using extra "markup" information enclosed between angle brackets. HTML is the most well-known markup language. Though the library is written in C a variety of language bindings make it available in other environments.

Libxml2 implements a number of existing standards related to markup languages:

As a result the libxml2 API is very large. If you get lost searching for some specific API use the online search engine hosted on xmlsoft.org the libxml2 and libxslt project page.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-HTMLparser.html0000644000175000017500000016135712134171043021177 0ustar aronaron HTMLparser: interface for an HTML 4.0 non-verifying parser

HTMLparser

HTMLparser - interface for an HTML 4.0 non-verifying parser

this module implements an HTML 4.0 non-verifying parser with API compatible with the XML parser ones. It should be able to parse "real world" HTML, even if severely broken from a specification point of view.

Author(s): Daniel Veillard

Synopsis

#define htmlDefaultSubelement(elt);
#define htmlElementAllowedHereDesc(parent, elt);
#define htmlRequiredAttrs(elt);
typedef xmlParserNodeInfo htmlParserNodeInfo;
typedef xmlParserInput htmlParserInput;
typedef xmlParserCtxtPtr htmlParserCtxtPtr;
typedef struct _htmlEntityDesc htmlEntityDesc;
typedef xmlDocPtr htmlDocPtr;
typedef xmlSAXHandlerPtr htmlSAXHandlerPtr;
typedef enum htmlStatus;
typedef xmlNodePtr htmlNodePtr;
typedef htmlElemDesc * htmlElemDescPtr;
typedef struct _htmlElemDesc htmlElemDesc;
typedef xmlSAXHandler htmlSAXHandler;
typedef xmlParserInputPtr htmlParserInputPtr;
typedef enum htmlParserOption;
typedef htmlEntityDesc * htmlEntityDescPtr;
typedef xmlParserCtxt htmlParserCtxt;
int	htmlIsScriptAttribute		(const xmlChar * name);
int	htmlHandleOmittedElem		(int val);
htmlDocPtr	htmlReadFd		(int fd, 
const char * URL,
const char * encoding,
int options); htmlDocPtr htmlReadIO (xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options); htmlDocPtr htmlParseFile (const char * filename,
const char * encoding); htmlDocPtr htmlCtxtReadDoc (htmlParserCtxtPtr ctxt,
const xmlChar * cur,
const char * URL,
const char * encoding,
int options); int htmlAutoCloseTag (htmlDocPtr doc,
const xmlChar * name,
htmlNodePtr elem); int htmlParseChunk (htmlParserCtxtPtr ctxt,
const char * chunk,
int size,
int terminate); const htmlElemDesc * htmlTagLookup (const xmlChar * tag); htmlParserCtxtPtr htmlCreateMemoryParserCtxt (const char * buffer,
int size); void htmlCtxtReset (htmlParserCtxtPtr ctxt); int htmlElementAllowedHere (const htmlElemDesc * parent,
const xmlChar * elt); htmlDocPtr htmlCtxtReadIO (htmlParserCtxtPtr ctxt,
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options); htmlParserCtxtPtr htmlCreatePushParserCtxt (htmlSAXHandlerPtr sax,
void * user_data,
const char * chunk,
int size,
const char * filename,
xmlCharEncoding enc); htmlDocPtr htmlReadMemory (const char * buffer,
int size,
const char * URL,
const char * encoding,
int options); int htmlIsAutoClosed (htmlDocPtr doc,
htmlNodePtr elem); int htmlParseCharRef (htmlParserCtxtPtr ctxt); htmlDocPtr htmlReadDoc (const xmlChar * cur,
const char * URL,
const char * encoding,
int options); int htmlEncodeEntities (unsigned char * out,
int * outlen,
const unsigned char * in,
int * inlen,
int quoteChar); htmlStatus htmlNodeStatus (const htmlNodePtr node,
int legacy); htmlStatus htmlAttrAllowed (const htmlElemDesc * elt,
const xmlChar * attr,
int legacy); htmlDocPtr htmlSAXParseFile (const char * filename,
const char * encoding,
htmlSAXHandlerPtr sax,
void * userData); const htmlEntityDesc * htmlParseEntityRef (htmlParserCtxtPtr ctxt,
const xmlChar ** str); htmlStatus htmlElementStatusHere (const htmlElemDesc * parent,
const htmlElemDesc * elt); const htmlEntityDesc * htmlEntityValueLookup (unsigned int value); void htmlParseElement (htmlParserCtxtPtr ctxt); int UTF8ToHtml (unsigned char * out,
int * outlen,
const unsigned char * in,
int * inlen); const htmlEntityDesc * htmlEntityLookup (const xmlChar * name); void htmlFreeParserCtxt (htmlParserCtxtPtr ctxt); htmlDocPtr htmlCtxtReadMemory (htmlParserCtxtPtr ctxt,
const char * buffer,
int size,
const char * URL,
const char * encoding,
int options); htmlDocPtr htmlCtxtReadFd (htmlParserCtxtPtr ctxt,
int fd,
const char * URL,
const char * encoding,
int options); htmlDocPtr htmlReadFile (const char * filename,
const char * encoding,
int options); htmlDocPtr htmlCtxtReadFile (htmlParserCtxtPtr ctxt,
const char * filename,
const char * encoding,
int options); int htmlParseDocument (htmlParserCtxtPtr ctxt); htmlParserCtxtPtr htmlNewParserCtxt (void); htmlDocPtr htmlSAXParseDoc (xmlChar * cur,
const char * encoding,
htmlSAXHandlerPtr sax,
void * userData); int htmlCtxtUseOptions (htmlParserCtxtPtr ctxt,
int options); htmlDocPtr htmlParseDoc (xmlChar * cur,
const char * encoding);

Description

Details

Macro htmlDefaultSubelement

#define htmlDefaultSubelement(elt);

Returns the default subelement for this element

elt:HTML element

Macro htmlElementAllowedHereDesc

#define htmlElementAllowedHereDesc(parent, elt);

Checks whether an HTML element description may be a direct child of the specified element. Returns 1 if allowed; 0 otherwise.

parent:HTML parent element
elt:HTML element

Macro htmlRequiredAttrs

#define htmlRequiredAttrs(elt);

Returns the attributes required for the specified element.

elt:HTML element

Typedef htmlDocPtr

xmlDocPtr htmlDocPtr;


Structure htmlElemDesc

struct _htmlElemDesc {
    const char *	name	: The tag name
    char	startTag	: Whether the start tag can be implied
    char	endTag	: Whether the end tag can be implied
    char	saveEndTag	: Whether the end tag should be saved
    char	empty	: Is this an empty element ?
    char	depr	: Is this a deprecated element ?
    char	dtd	: 1: only in Loose DTD, 2: only Frameset one
    char	isinline	: is this a block 0 or inline 1 element
    const char *	desc	: the description NRK Jan.2003 * New fields encapsulating HTML structur
    const char **	subelts	: allowed sub-elements of this element
    const char *	defaultsubelt	: subelement for suggested auto-repair if necessary or NULL
    const char **	attrs_opt	: Optional Attributes
    const char **	attrs_depr	: Additional deprecated attributes
    const char **	attrs_req	: Required attributes
} htmlElemDesc;


Typedef htmlElemDescPtr

htmlElemDesc * htmlElemDescPtr;


Structure htmlEntityDesc

struct _htmlEntityDesc {
    unsigned int	value	: the UNICODE value for the character
    const char *	name	: The entity name
    const char *	desc	: the description
} htmlEntityDesc;


Typedef htmlEntityDescPtr

htmlEntityDesc * htmlEntityDescPtr;


Typedef htmlNodePtr

xmlNodePtr htmlNodePtr;


Typedef htmlParserCtxt

xmlParserCtxt htmlParserCtxt;


Typedef htmlParserCtxtPtr

xmlParserCtxtPtr htmlParserCtxtPtr;


Typedef htmlParserInput

xmlParserInput htmlParserInput;


Typedef htmlParserInputPtr

xmlParserInputPtr htmlParserInputPtr;


Typedef htmlParserNodeInfo

xmlParserNodeInfo htmlParserNodeInfo;


Enum htmlParserOption

enum htmlParserOption {
    HTML_PARSE_RECOVER = 1 /* Relaxed parsing */
    HTML_PARSE_NODEFDTD = 4 /* do not default a doctype if not found */
    HTML_PARSE_NOERROR = 32 /* suppress error reports */
    HTML_PARSE_NOWARNING = 64 /* suppress warning reports */
    HTML_PARSE_PEDANTIC = 128 /* pedantic error reporting */
    HTML_PARSE_NOBLANKS = 256 /* remove blank nodes */
    HTML_PARSE_NONET = 2048 /* Forbid network access */
    HTML_PARSE_NOIMPLIED = 8192 /* Do not add implied html/body... elements */
    HTML_PARSE_COMPACT = 65536 /* compact small text nodes */
    HTML_PARSE_IGNORE_ENC = 2097152 /*  ignore internal document encoding hint */
};


Typedef htmlSAXHandler

xmlSAXHandler htmlSAXHandler;


Typedef htmlSAXHandlerPtr

xmlSAXHandlerPtr htmlSAXHandlerPtr;


Enum htmlStatus

enum htmlStatus {
    HTML_NA = 0 /* something we don't check at all */
    HTML_INVALID = 1
    HTML_DEPRECATED = 2
    HTML_VALID = 4
    HTML_REQUIRED = 12 /*  VALID bit set so ( & HTML_VALID ) is TRUE */
};



htmlAttrAllowed ()

htmlStatus	htmlAttrAllowed		(const htmlElemDesc * elt, 
const xmlChar * attr,
int legacy)

Checks whether an attribute is valid for an element Has full knowledge of Required and Deprecated attributes

elt:HTML element
attr:HTML attribute
legacy:whether to allow deprecated attributes
Returns:one of HTML_REQUIRED, HTML_VALID, HTML_DEPRECATED, HTML_INVALID

htmlAutoCloseTag ()

int	htmlAutoCloseTag		(htmlDocPtr doc, 
const xmlChar * name,
htmlNodePtr elem)

The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if the element or one of it's children would autoclose the given tag.

doc:the HTML document
name:The tag name
elem:the HTML element
Returns:1 if autoclose, 0 otherwise

htmlCreateMemoryParserCtxt ()

htmlParserCtxtPtr	htmlCreateMemoryParserCtxt	(const char * buffer, 
int size)

Create a parser context for an HTML in-memory document.

buffer:a pointer to a char array
size:the size of the array
Returns:the new parser context or NULL

htmlCreatePushParserCtxt ()

htmlParserCtxtPtr	htmlCreatePushParserCtxt	(htmlSAXHandlerPtr sax, 
void * user_data,
const char * chunk,
int size,
const char * filename,
xmlCharEncoding enc)

Create a parser context for using the HTML parser in push mode The value of @filename is used for fetching external entities and error/warning reports.

sax:a SAX handler
user_data:The user data returned on SAX callbacks
chunk:a pointer to an array of chars
size:number of chars in the array
filename:an optional file name or URI
enc:an optional encoding
Returns:the new parser context or NULL

htmlCtxtReadDoc ()

htmlDocPtr	htmlCtxtReadDoc		(htmlParserCtxtPtr ctxt, 
const xmlChar * cur,
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

ctxt:an HTML parser context
cur:a pointer to a zero terminated string
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlCtxtReadFd ()

htmlDocPtr	htmlCtxtReadFd		(htmlParserCtxtPtr ctxt, 
int fd,
const char * URL,
const char * encoding,
int options)

parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context

ctxt:an HTML parser context
fd:an open file descriptor
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlCtxtReadFile ()

htmlDocPtr	htmlCtxtReadFile	(htmlParserCtxtPtr ctxt, 
const char * filename,
const char * encoding,
int options)

parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context

ctxt:an HTML parser context
filename:a file or URL
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlCtxtReadIO ()

htmlDocPtr	htmlCtxtReadIO		(htmlParserCtxtPtr ctxt, 
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options)

parse an HTML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context

ctxt:an HTML parser context
ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlCtxtReadMemory ()

htmlDocPtr	htmlCtxtReadMemory	(htmlParserCtxtPtr ctxt, 
const char * buffer,
int size,
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

ctxt:an HTML parser context
buffer:a pointer to a char array
size:the size of the array
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlCtxtReset ()

void	htmlCtxtReset			(htmlParserCtxtPtr ctxt)

Reset a parser context

ctxt:an HTML parser context

htmlCtxtUseOptions ()

int	htmlCtxtUseOptions		(htmlParserCtxtPtr ctxt, 
int options)

Applies the options to the parser context

ctxt:an HTML parser context
options:a combination of htmlParserOption(s)
Returns:0 in case of success, the set of unknown or unimplemented options in case of error.

htmlElementAllowedHere ()

int	htmlElementAllowedHere		(const htmlElemDesc * parent, 
const xmlChar * elt)

Checks whether an HTML element may be a direct child of a parent element. Note - doesn't check for deprecated elements

parent:HTML parent element
elt:HTML element
Returns:1 if allowed; 0 otherwise.

htmlElementStatusHere ()

htmlStatus	htmlElementStatusHere	(const htmlElemDesc * parent, 
const htmlElemDesc * elt)

Checks whether an HTML element may be a direct child of a parent element. and if so whether it is valid or deprecated.

parent:HTML parent element
elt:HTML element
Returns:one of HTML_VALID, HTML_DEPRECATED, HTML_INVALID


htmlEntityLookup ()

const htmlEntityDesc *	htmlEntityLookup	(const xmlChar * name)

Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed.

name:the entity name
Returns:the associated htmlEntityDescPtr if found, NULL otherwise.

htmlEntityValueLookup ()

const htmlEntityDesc *	htmlEntityValueLookup	(unsigned int value)

Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed.

value:the entity's unicode value
Returns:the associated htmlEntityDescPtr if found, NULL otherwise.

htmlFreeParserCtxt ()

void	htmlFreeParserCtxt		(htmlParserCtxtPtr ctxt)

Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed.

ctxt:an HTML parser context


htmlIsAutoClosed ()

int	htmlIsAutoClosed		(htmlDocPtr doc, 
htmlNodePtr elem)

The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if a tag is autoclosed by one of it's child

doc:the HTML document
elem:the HTML element
Returns:1 if autoclosed, 0 otherwise

htmlIsScriptAttribute ()

int	htmlIsScriptAttribute		(const xmlChar * name)

Check if an attribute is of content type Script

name:an attribute name
Returns:1 is the attribute is a script 0 otherwise

htmlNewParserCtxt ()

htmlParserCtxtPtr	htmlNewParserCtxt	(void)

Allocate and initialize a new parser context.

Returns:the htmlParserCtxtPtr or NULL in case of allocation error

htmlNodeStatus ()

htmlStatus	htmlNodeStatus		(const htmlNodePtr node, 
int legacy)

Checks whether the tree node is valid. Experimental (the author only uses the HTML enhancements in a SAX parser)

node:an htmlNodePtr in a tree
legacy:whether to allow deprecated elements (YES is faster here for Element nodes)
Returns:for Element nodes, a return from htmlElementAllowedHere (if legacy allowed) or htmlElementStatusHere (otherwise). for Attribute nodes, a return from htmlAttrAllowed for other nodes, HTML_NA (no checks performed)

htmlParseCharRef ()

int	htmlParseCharRef		(htmlParserCtxtPtr ctxt)

parse Reference declarations [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'

ctxt:an HTML parser context
Returns:the value parsed (as an int)

htmlParseChunk ()

int	htmlParseChunk			(htmlParserCtxtPtr ctxt, 
const char * chunk,
int size,
int terminate)

Parse a Chunk of memory

ctxt:an HTML parser context
chunk:an char array
size:the size in byte of the chunk
terminate:last chunk indicator
Returns:zero if no error, the xmlParserErrors otherwise.

htmlParseDoc ()

htmlDocPtr	htmlParseDoc		(xmlChar * cur, 
const char * encoding)

parse an HTML in-memory document and build a tree.

cur:a pointer to an array of xmlChar
encoding:a free form C string describing the HTML document encoding, or NULL
Returns:the resulting document tree

htmlParseDocument ()

int	htmlParseDocument		(htmlParserCtxtPtr ctxt)

parse an HTML document (and build a tree if using the standard SAX interface).

ctxt:an HTML parser context
Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

htmlParseElement ()

void	htmlParseElement		(htmlParserCtxtPtr ctxt)

parse an HTML element, this is highly recursive this is kept for compatibility with previous code versions [39] element ::= EmptyElemTag | STag content ETag [41] Attribute ::= Name Eq AttValue

ctxt:an HTML parser context

htmlParseEntityRef ()

const htmlEntityDesc *	htmlParseEntityRef	(htmlParserCtxtPtr ctxt, 
const xmlChar ** str)

parse an HTML ENTITY references [68] EntityRef ::= '&' Name ';'

ctxt:an HTML parser context
str:location to store the entity name
Returns:the associated htmlEntityDescPtr if found, or NULL otherwise, if non-NULL *str will have to be freed by the caller.

htmlParseFile ()

htmlDocPtr	htmlParseFile		(const char * filename, 
const char * encoding)

parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

filename:the filename
encoding:a free form C string describing the HTML document encoding, or NULL
Returns:the resulting document tree

htmlReadDoc ()

htmlDocPtr	htmlReadDoc		(const xmlChar * cur, 
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree.

cur:a pointer to a zero terminated string
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlReadFd ()

htmlDocPtr	htmlReadFd		(int fd, 
const char * URL,
const char * encoding,
int options)

parse an XML from a file descriptor and build a tree.

fd:an open file descriptor
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlReadFile ()

htmlDocPtr	htmlReadFile		(const char * filename, 
const char * encoding,
int options)

parse an XML file from the filesystem or the network.

filename:a file or URL
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlReadIO ()

htmlDocPtr	htmlReadIO		(xmlInputReadCallback ioread, 
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options)

parse an HTML document from I/O functions and source and build a tree.

ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlReadMemory ()

htmlDocPtr	htmlReadMemory		(const char * buffer, 
int size,
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree.

buffer:a pointer to a char array
size:the size of the array
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of htmlParserOption(s)
Returns:the resulting document tree

htmlSAXParseDoc ()

htmlDocPtr	htmlSAXParseDoc		(xmlChar * cur, 
const char * encoding,
htmlSAXHandlerPtr sax,
void * userData)

Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks to handle parse events. If sax is NULL, fallback to the default DOM behavior and return a tree.

cur:a pointer to an array of xmlChar
encoding:a free form C string describing the HTML document encoding, or NULL
sax:the SAX handler block
userData:if using SAX, this pointer will be provided on callbacks.
Returns:the resulting document tree unless SAX is NULL or the document is not well formed.

htmlSAXParseFile ()

htmlDocPtr	htmlSAXParseFile	(const char * filename, 
const char * encoding,
htmlSAXHandlerPtr sax,
void * userData)

parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

filename:the filename
encoding:a free form C string describing the HTML document encoding, or NULL
sax:the SAX handler block
userData:if using SAX, this pointer will be provided on callbacks.
Returns:the resulting document tree unless SAX is NULL or the document is not well formed.

htmlTagLookup ()

const htmlElemDesc *	htmlTagLookup	(const xmlChar * tag)

Lookup the HTML tag in the ElementTable

tag:The tag name in lowercase
Returns:the related htmlElemDescPtr or NULL if not found.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-DOCBparser.html0000644000175000017500000004172112134171043021132 0ustar aronaron DOCBparser: old DocBook SGML parser

DOCBparser

DOCBparser - old DocBook SGML parser

interface for a DocBook SGML non-verifying parser This code is DEPRECATED, and should not be used anymore.

WARNING: this module is deprecated !

Author(s): Daniel Veillard

Synopsis

typedef xmlParserInputPtr docbParserInputPtr;
typedef xmlParserCtxt docbParserCtxt;
typedef xmlParserCtxtPtr docbParserCtxtPtr;
typedef xmlParserInput docbParserInput;
typedef xmlDocPtr docbDocPtr;
typedef xmlSAXHandler docbSAXHandler;
typedef xmlSAXHandlerPtr docbSAXHandlerPtr;
void	docbFreeParserCtxt		(docbParserCtxtPtr ctxt);
docbDocPtr	docbParseDoc		(xmlChar * cur, 
const char * encoding); docbParserCtxtPtr docbCreateFileParserCtxt (const char * filename,
const char * encoding); docbDocPtr docbSAXParseFile (const char * filename,
const char * encoding,
docbSAXHandlerPtr sax,
void * userData); docbDocPtr docbSAXParseDoc (xmlChar * cur,
const char * encoding,
docbSAXHandlerPtr sax,
void * userData); docbParserCtxtPtr docbCreatePushParserCtxt (docbSAXHandlerPtr sax,
void * user_data,
const char * chunk,
int size,
const char * filename,
xmlCharEncoding enc); int docbEncodeEntities (unsigned char * out,
int * outlen,
const unsigned char * in,
int * inlen,
int quoteChar); docbDocPtr docbParseFile (const char * filename,
const char * encoding); int docbParseDocument (docbParserCtxtPtr ctxt); int docbParseChunk (docbParserCtxtPtr ctxt,
const char * chunk,
int size,
int terminate);

Description

Details

Typedef docbDocPtr

xmlDocPtr docbDocPtr;


Typedef docbParserCtxt

xmlParserCtxt docbParserCtxt;


Typedef docbParserCtxtPtr

xmlParserCtxtPtr docbParserCtxtPtr;


Typedef docbParserInput

xmlParserInput docbParserInput;


Typedef docbParserInputPtr

xmlParserInputPtr docbParserInputPtr;


Typedef docbSAXHandler

xmlSAXHandler docbSAXHandler;


Typedef docbSAXHandlerPtr

xmlSAXHandlerPtr docbSAXHandlerPtr;


docbCreateFileParserCtxt ()

docbParserCtxtPtr	docbCreateFileParserCtxt	(const char * filename, 
const char * encoding)

Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

filename:the filename
encoding:the SGML document encoding, or NULL
Returns:the new parser context or NULL

docbCreatePushParserCtxt ()

docbParserCtxtPtr	docbCreatePushParserCtxt	(docbSAXHandlerPtr sax, 
void * user_data,
const char * chunk,
int size,
const char * filename,
xmlCharEncoding enc)

Create a parser context for using the DocBook SGML parser in push mode To allow content encoding detection, @size should be >= 4 The value of @filename is used for fetching external entities and error/warning reports.

sax:a SAX handler
user_data:The user data returned on SAX callbacks
chunk:a pointer to an array of chars
size:number of chars in the array
filename:an optional file name or URI
enc:an optional encoding
Returns:the new parser context or NULL


docbFreeParserCtxt ()

void	docbFreeParserCtxt		(docbParserCtxtPtr ctxt)

Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed.

ctxt:an SGML parser context

docbParseChunk ()

int	docbParseChunk			(docbParserCtxtPtr ctxt, 
const char * chunk,
int size,
int terminate)

Parse a Chunk of memory

ctxt:an XML parser context
chunk:an char array
size:the size in byte of the chunk
terminate:last chunk indicator
Returns:zero if no error, the xmlParserErrors otherwise.

docbParseDoc ()

docbDocPtr	docbParseDoc		(xmlChar * cur, 
const char * encoding)

parse an SGML in-memory document and build a tree.

cur:a pointer to an array of xmlChar
encoding:a free form C string describing the SGML document encoding, or NULL
Returns:the resulting document tree

docbParseDocument ()

int	docbParseDocument		(docbParserCtxtPtr ctxt)

parse an SGML document (and build a tree if using the standard SAX interface).

ctxt:an SGML parser context
Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

docbParseFile ()

docbDocPtr	docbParseFile		(const char * filename, 
const char * encoding)

parse a Docbook SGML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

filename:the filename
encoding:a free form C string describing document encoding, or NULL
Returns:the resulting document tree

docbSAXParseDoc ()

docbDocPtr	docbSAXParseDoc		(xmlChar * cur, 
const char * encoding,
docbSAXHandlerPtr sax,
void * userData)

parse an SGML in-memory document and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

cur:a pointer to an array of xmlChar
encoding:a free form C string describing the SGML document encoding, or NULL
sax:the SAX handler block
userData:if using SAX, this pointer will be provided on callbacks.
Returns:the resulting document tree

docbSAXParseFile ()

docbDocPtr	docbSAXParseFile	(const char * filename, 
const char * encoding,
docbSAXHandlerPtr sax,
void * userData)

parse an SGML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

filename:the filename
encoding:a free form C string describing the SGML document encoding, or NULL
sax:the SAX handler block
userData:if using SAX, this pointer will be provided on callbacks.
Returns:the resulting document tree

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlschemastypes.html0000644000175000017500000012664712134171044022453 0ustar aronaron xmlschemastypes: implementation of XML Schema Datatypes

xmlschemastypes

xmlschemastypes - implementation of XML Schema Datatypes

module providing the XML Schema Datatypes implementation both definition and validity checking

Author(s): Daniel Veillard

Synopsis

typedef enum xmlSchemaWhitespaceValueType;
int	xmlSchemaValPredefTypeNode	(xmlSchemaTypePtr type, 
const xmlChar * value,
xmlSchemaValPtr * val,
xmlNodePtr node); int xmlSchemaGetCanonValueWhtsp (xmlSchemaValPtr val,
const xmlChar ** retValue,
xmlSchemaWhitespaceValueType ws); int xmlSchemaValidateLengthFacetWhtsp (xmlSchemaFacetPtr facet,
xmlSchemaValType valType,
const xmlChar * value,
xmlSchemaValPtr val,
unsigned long * length,
xmlSchemaWhitespaceValueType ws); int xmlSchemaIsBuiltInTypeFacet (xmlSchemaTypePtr type,
int facetType); int xmlSchemaGetCanonValue (xmlSchemaValPtr val,
const xmlChar ** retValue); xmlSchemaTypePtr xmlSchemaGetBuiltInListSimpleTypeItemType (xmlSchemaTypePtr type); int xmlSchemaCompareValuesWhtsp (xmlSchemaValPtr x,
xmlSchemaWhitespaceValueType xws,
xmlSchemaValPtr y,
xmlSchemaWhitespaceValueType yws); int xmlSchemaValueGetAsBoolean (xmlSchemaValPtr val); xmlChar * xmlSchemaCollapseString (const xmlChar * value); int xmlSchemaValPredefTypeNodeNoNorm (xmlSchemaTypePtr type,
const xmlChar * value,
xmlSchemaValPtr * val,
xmlNodePtr node); int xmlSchemaValidateFacet (xmlSchemaTypePtr base,
xmlSchemaFacetPtr facet,
const xmlChar * value,
xmlSchemaValPtr val); xmlSchemaFacetPtr xmlSchemaNewFacet (void); int xmlSchemaValueAppend (xmlSchemaValPtr prev,
xmlSchemaValPtr cur); int xmlSchemaCompareValues (xmlSchemaValPtr x,
xmlSchemaValPtr y); int xmlSchemaValidateLengthFacet (xmlSchemaTypePtr type,
xmlSchemaFacetPtr facet,
const xmlChar * value,
xmlSchemaValPtr val,
unsigned long * length); xmlSchemaValType xmlSchemaGetValType (xmlSchemaValPtr val); xmlSchemaTypePtr xmlSchemaGetPredefinedType (const xmlChar * name,
const xmlChar * ns); int xmlSchemaValidatePredefinedType (xmlSchemaTypePtr type,
const xmlChar * value,
xmlSchemaValPtr * val); void xmlSchemaFreeFacet (xmlSchemaFacetPtr facet); int xmlSchemaValidateListSimpleTypeFacet (xmlSchemaFacetPtr facet,
const xmlChar * value,
unsigned long actualLen,
unsigned long * expectedLen); unsigned long xmlSchemaGetFacetValueAsULong (xmlSchemaFacetPtr facet); void xmlSchemaFreeValue (xmlSchemaValPtr value); xmlSchemaValPtr xmlSchemaValueGetNext (xmlSchemaValPtr cur); const xmlChar * xmlSchemaValueGetAsString (xmlSchemaValPtr val); xmlSchemaValPtr xmlSchemaCopyValue (xmlSchemaValPtr val); xmlSchemaValPtr xmlSchemaNewNOTATIONValue (const xmlChar * name,
const xmlChar * ns); xmlSchemaValPtr xmlSchemaNewQNameValue (const xmlChar * namespaceName,
const xmlChar * localName); void xmlSchemaCleanupTypes (void); xmlChar * xmlSchemaWhiteSpaceReplace (const xmlChar * value); xmlSchemaValPtr xmlSchemaNewStringValue (xmlSchemaValType type,
const xmlChar * value); xmlSchemaTypePtr xmlSchemaGetBuiltInType (xmlSchemaValType type); void xmlSchemaInitTypes (void); int xmlSchemaValidateFacetWhtsp (xmlSchemaFacetPtr facet,
xmlSchemaWhitespaceValueType fws,
xmlSchemaValType valType,
const xmlChar * value,
xmlSchemaValPtr val,
xmlSchemaWhitespaceValueType ws); int xmlSchemaCheckFacet (xmlSchemaFacetPtr facet,
xmlSchemaTypePtr typeDecl,
xmlSchemaParserCtxtPtr pctxt,
const xmlChar * name);

Description

Details


xmlSchemaCheckFacet ()

int	xmlSchemaCheckFacet		(xmlSchemaFacetPtr facet, 
xmlSchemaTypePtr typeDecl,
xmlSchemaParserCtxtPtr pctxt,
const xmlChar * name)

Checks and computes the values of facets.

facet:the facet
typeDecl:the schema type definition
pctxt:the schema parser context or NULL
name:the optional name of the type
Returns:0 if valid, a positive error code if not valid and -1 in case of an internal or API error.


xmlSchemaCollapseString ()

xmlChar *	xmlSchemaCollapseString	(const xmlChar * value)

Removes and normalize white spaces in the string

value:a value
Returns:the new string or NULL if no change was required.

xmlSchemaCompareValues ()

int	xmlSchemaCompareValues		(xmlSchemaValPtr x, 
xmlSchemaValPtr y)

Compare 2 values

x:a first value
y:a second value
Returns:-1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in case of error

xmlSchemaCompareValuesWhtsp ()

int	xmlSchemaCompareValuesWhtsp	(xmlSchemaValPtr x, 
xmlSchemaWhitespaceValueType xws,
xmlSchemaValPtr y,
xmlSchemaWhitespaceValueType yws)

Compare 2 values

x:a first value
xws:the whitespace value of x
y:a second value
yws:the whitespace value of y
Returns:-1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in case of error

xmlSchemaCopyValue ()

xmlSchemaValPtr	xmlSchemaCopyValue	(xmlSchemaValPtr val)

Copies the precomputed value. This duplicates any string within.

val:the precomputed value to be copied
Returns:the copy or NULL if a copy for a data-type is not implemented.

xmlSchemaFreeFacet ()

void	xmlSchemaFreeFacet		(xmlSchemaFacetPtr facet)

Deallocate a Schema Facet structure.

facet:a schema facet structure

xmlSchemaFreeValue ()

void	xmlSchemaFreeValue		(xmlSchemaValPtr value)

Cleanup the default XML Schemas type library

value:the value to free

xmlSchemaGetBuiltInListSimpleTypeItemType ()

xmlSchemaTypePtr	xmlSchemaGetBuiltInListSimpleTypeItemType	(xmlSchemaTypePtr type)

Lookup function

type:the built-in simple type.
Returns:the item type of @type as defined by the built-in datatype hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.

xmlSchemaGetBuiltInType ()

xmlSchemaTypePtr	xmlSchemaGetBuiltInType	(xmlSchemaValType type)

Gives you the type struct for a built-in type by its type id.

type:the type of the built in type
Returns:the type if found, NULL otherwise.

xmlSchemaGetCanonValue ()

int	xmlSchemaGetCanonValue		(xmlSchemaValPtr val, 
const xmlChar ** retValue)

Get a the cononical lexical representation of the value. The caller has to FREE the returned retValue. WARNING: Some value types are not supported yet, resulting in a @retValue of "???". TODO: XML Schema 1.0 does not define canonical representations for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.

val:the precomputed value
retValue:the returned value
Returns:0 if the value could be built, 1 if the value type is not supported yet and -1 in case of API errors.

xmlSchemaGetCanonValueWhtsp ()

int	xmlSchemaGetCanonValueWhtsp	(xmlSchemaValPtr val, 
const xmlChar ** retValue,
xmlSchemaWhitespaceValueType ws)

Get a the cononical representation of the value. The caller has to free the returned @retValue.

val:the precomputed value
retValue:the returned value
ws:the whitespace type of the value
Returns:0 if the value could be built, 1 if the value type is not supported yet and -1 in case of API errors.

xmlSchemaGetFacetValueAsULong ()

unsigned long	xmlSchemaGetFacetValueAsULong	(xmlSchemaFacetPtr facet)

Extract the value of a facet

facet:an schemas type facet
Returns:the value as a long

xmlSchemaGetPredefinedType ()

xmlSchemaTypePtr	xmlSchemaGetPredefinedType	(const xmlChar * name, 
const xmlChar * ns)

Lookup a type in the default XML Schemas type library

name:the type name
ns:the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
Returns:the type if found, NULL otherwise

xmlSchemaGetValType ()

xmlSchemaValType	xmlSchemaGetValType	(xmlSchemaValPtr val)

Accessor for the type of a value

val:a schemas value
Returns:the xmlSchemaValType of the value


xmlSchemaIsBuiltInTypeFacet ()

int	xmlSchemaIsBuiltInTypeFacet	(xmlSchemaTypePtr type, 
int facetType)

Evaluates if a specific facet can be used in conjunction with a type.

type:the built-in type
facetType:the facet type
Returns:1 if the facet can be used with the given built-in type, 0 otherwise and -1 in case the type is not a built-in type.

xmlSchemaNewFacet ()

xmlSchemaFacetPtr	xmlSchemaNewFacet	(void)

Allocate a new Facet structure.

Returns:the newly allocated structure or NULL in case or error

xmlSchemaNewNOTATIONValue ()

xmlSchemaValPtr	xmlSchemaNewNOTATIONValue	(const xmlChar * name, 
const xmlChar * ns)

Allocate a new NOTATION value. The given values are consumed and freed with the struct.

name:the notation name
ns:the notation namespace name or NULL
Returns:a pointer to the new value or NULL in case of error

xmlSchemaNewQNameValue ()

xmlSchemaValPtr	xmlSchemaNewQNameValue	(const xmlChar * namespaceName, 
const xmlChar * localName)

Allocate a new QName value. The given values are consumed and freed with the struct.

namespaceName:the namespace name
localName:the local name
Returns:a pointer to the new value or NULL in case of an error.

xmlSchemaNewStringValue ()

xmlSchemaValPtr	xmlSchemaNewStringValue	(xmlSchemaValType type, 
const xmlChar * value)

Allocate a new simple type value. The type can be of XML_SCHEMAS_STRING. WARNING: This one is intended to be expanded for other string based types. We need this for anySimpleType as well. The given value is consumed and freed with the struct.

type:the value type
value:the value
Returns:a pointer to the new value or NULL in case of error

xmlSchemaValPredefTypeNode ()

int	xmlSchemaValPredefTypeNode	(xmlSchemaTypePtr type, 
const xmlChar * value,
xmlSchemaValPtr * val,
xmlNodePtr node)

Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val.

type:the predefined type
value:the value to check
val:the return computed value
node:the node containing the value
Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

xmlSchemaValPredefTypeNodeNoNorm ()

int	xmlSchemaValPredefTypeNodeNoNorm	(xmlSchemaTypePtr type, 
const xmlChar * value,
xmlSchemaValPtr * val,
xmlNodePtr node)

Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val. This one does apply any normalization to the value.

type:the predefined type
value:the value to check
val:the return computed value
node:the node containing the value
Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

xmlSchemaValidateFacet ()

int	xmlSchemaValidateFacet		(xmlSchemaTypePtr base, 
xmlSchemaFacetPtr facet,
const xmlChar * value,
xmlSchemaValPtr val)

Check a value against a facet condition

base:the base type
facet:the facet to check
value:the lexical repr of the value to validate
val:the precomputed value
Returns:0 if the element is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

xmlSchemaValidateFacetWhtsp ()

int	xmlSchemaValidateFacetWhtsp	(xmlSchemaFacetPtr facet, 
xmlSchemaWhitespaceValueType fws,
xmlSchemaValType valType,
const xmlChar * value,
xmlSchemaValPtr val,
xmlSchemaWhitespaceValueType ws)

Check a value against a facet condition. This takes value normalization according to the specified whitespace types into account. Note that @value needs to be the *normalized* value if the facet is of type "pattern".

facet:the facet to check
fws:the whitespace type of the facet's value
valType:the built-in type of the value
value:the lexical (or normalized for pattern) repr of the value to validate
val:the precomputed value
ws:the whitespace type of the value
Returns:0 if the element is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

xmlSchemaValidateLengthFacet ()

int	xmlSchemaValidateLengthFacet	(xmlSchemaTypePtr type, 
xmlSchemaFacetPtr facet,
const xmlChar * value,
xmlSchemaValPtr val,
unsigned long * length)

Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value.

type:the built-in type
facet:the facet to check
value:the lexical repr. of the value to be validated
val:the precomputed value
length:the actual length of the value
Returns:0 if the value is valid, a positive error code otherwise and -1 in case of an internal or API error.

xmlSchemaValidateLengthFacetWhtsp ()

int	xmlSchemaValidateLengthFacetWhtsp	(xmlSchemaFacetPtr facet, 
xmlSchemaValType valType,
const xmlChar * value,
xmlSchemaValPtr val,
unsigned long * length,
xmlSchemaWhitespaceValueType ws)

Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value.

facet:the facet to check
valType:the built-in type
value:the lexical repr. of the value to be validated
val:the precomputed value
length:the actual length of the value
ws:the whitespace type of the value
Returns:0 if the value is valid, a positive error code otherwise and -1 in case of an internal or API error.

xmlSchemaValidateListSimpleTypeFacet ()

int	xmlSchemaValidateListSimpleTypeFacet	(xmlSchemaFacetPtr facet, 
const xmlChar * value,
unsigned long actualLen,
unsigned long * expectedLen)

Checks the value of a list simple type against a facet.

facet:the facet to check
value:the lexical repr of the value to validate
actualLen:the number of list items
expectedLen:the resulting expected number of list items
Returns:0 if the value is valid, a positive error code number otherwise and -1 in case of an internal error.

xmlSchemaValidatePredefinedType ()

int	xmlSchemaValidatePredefinedType	(xmlSchemaTypePtr type, 
const xmlChar * value,
xmlSchemaValPtr * val)

Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val.

type:the predefined type
value:the value to check
val:the return computed value
Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

xmlSchemaValueAppend ()

int	xmlSchemaValueAppend		(xmlSchemaValPtr prev, 
xmlSchemaValPtr cur)

Appends a next sibling to a list of computed values.

prev:the value
cur:the value to be appended
Returns:0 if succeeded and -1 on API errors.

xmlSchemaValueGetAsBoolean ()

int	xmlSchemaValueGetAsBoolean	(xmlSchemaValPtr val)

Accessor for the boolean value of a computed value.

val:the value
Returns:1 if true and 0 if false, or in case of an error. Hmm.

xmlSchemaValueGetAsString ()

const xmlChar *	xmlSchemaValueGetAsString	(xmlSchemaValPtr val)

Accessor for the string value of a computed value.

val:the value
Returns:the string value or NULL if there was none, or on API errors.

xmlSchemaValueGetNext ()

xmlSchemaValPtr	xmlSchemaValueGetNext	(xmlSchemaValPtr cur)

Accessor for the next sibling of a list of computed values.

cur:the value
Returns:the next value or NULL if there was none, or on API errors.

xmlSchemaWhiteSpaceReplace ()

xmlChar *	xmlSchemaWhiteSpaceReplace	(const xmlChar * value)

Replaces 0xd, 0x9 and 0xa with a space.

value:a value
Returns:the new string or NULL if no change was required.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlautomata.html0000644000175000017500000010455312134171044021546 0ustar aronaron xmlautomata: API to build regexp automata

xmlautomata

xmlautomata - API to build regexp automata

the API to build regexp automata

Author(s): Daniel Veillard

Synopsis

typedef xmlAutomataState * xmlAutomataStatePtr;
typedef struct _xmlAutomata xmlAutomata;
typedef xmlAutomata * xmlAutomataPtr;
typedef struct _xmlAutomataState xmlAutomataState;
void	xmlFreeAutomata			(xmlAutomataPtr am);
int	xmlAutomataNewCounter		(xmlAutomataPtr am, 
int min,
int max); xmlAutomataStatePtr xmlAutomataGetInitState (xmlAutomataPtr am); xmlAutomataStatePtr xmlAutomataNewTransition2 (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
void * data); xmlAutomataStatePtr xmlAutomataNewState (xmlAutomataPtr am); xmlAutomataStatePtr xmlAutomataNewCountTrans (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
int min,
int max,
void * data); xmlAutomataStatePtr xmlAutomataNewOnceTrans2 (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
int min,
int max,
void * data); xmlAutomataStatePtr xmlAutomataNewAllTrans (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
int lax); xmlAutomataStatePtr xmlAutomataNewCountedTrans (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
int counter); xmlAutomataStatePtr xmlAutomataNewCounterTrans (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
int counter); xmlRegexpPtr xmlAutomataCompile (xmlAutomataPtr am); xmlAutomataStatePtr xmlAutomataNewNegTrans (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
void * data); xmlAutomataStatePtr xmlAutomataNewEpsilon (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to); xmlAutomataStatePtr xmlAutomataNewCountTrans2 (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
int min,
int max,
void * data); xmlAutomataPtr xmlNewAutomata (void); int xmlAutomataSetFinalState (xmlAutomataPtr am,
xmlAutomataStatePtr state); xmlAutomataStatePtr xmlAutomataNewOnceTrans (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
int min,
int max,
void * data); xmlAutomataStatePtr xmlAutomataNewTransition (xmlAutomataPtr am,
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
void * data); int xmlAutomataIsDeterminist (xmlAutomataPtr am);

Description

Details

Structure xmlAutomata

struct _xmlAutomata {
The content of this structure is not made public by the API.
} xmlAutomata;


Typedef xmlAutomataPtr

xmlAutomata * xmlAutomataPtr;

A libxml automata description, It can be compiled into a regexp


Structure xmlAutomataState

struct _xmlAutomataState {
The content of this structure is not made public by the API.
} xmlAutomataState;


Typedef xmlAutomataStatePtr

xmlAutomataState * xmlAutomataStatePtr;

A state int the automata description,


xmlAutomataCompile ()

xmlRegexpPtr	xmlAutomataCompile	(xmlAutomataPtr am)

Compile the automata into a Reg Exp ready for being executed. The automata should be free after this point.

am:an automata
Returns:the compiled regexp or NULL in case of error

xmlAutomataGetInitState ()

xmlAutomataStatePtr	xmlAutomataGetInitState	(xmlAutomataPtr am)

Initial state lookup

am:an automata
Returns:the initial state of the automata

xmlAutomataIsDeterminist ()

int	xmlAutomataIsDeterminist	(xmlAutomataPtr am)

Checks if an automata is determinist.

am:an automata
Returns:1 if true, 0 if not, and -1 in case of error

xmlAutomataNewAllTrans ()

xmlAutomataStatePtr	xmlAutomataNewAllTrans	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
int lax)

If @to is NULL, this creates first a new target state in the automata and then adds a an ALL transition from the @from state to the target state. That transition is an epsilon transition allowed only when all transitions from the @from node have been activated.

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
lax:allow to transition if not all all transitions have been activated
Returns:the target state or NULL in case of error

xmlAutomataNewCountTrans ()

xmlAutomataStatePtr	xmlAutomataNewCountTrans	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
int min,
int max,
void * data)

If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
token:the input string associated to that transition
min:the minimum successive occurences of token
max:the maximum successive occurences of token
data:data associated to the transition
Returns:the target state or NULL in case of error

xmlAutomataNewCountTrans2 ()

xmlAutomataStatePtr	xmlAutomataNewCountTrans2	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
int min,
int max,
void * data)

If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
token:the input string associated to that transition
token2:the second input string associated to that transition
min:the minimum successive occurences of token
max:the maximum successive occurences of token
data:data associated to the transition
Returns:the target state or NULL in case of error

xmlAutomataNewCountedTrans ()

xmlAutomataStatePtr	xmlAutomataNewCountedTrans	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
int counter)

If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will increment the counter provided

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
counter:the counter associated to that transition
Returns:the target state or NULL in case of error

xmlAutomataNewCounter ()

int	xmlAutomataNewCounter		(xmlAutomataPtr am, 
int min,
int max)

Create a new counter

am:an automata
min:the minimal value on the counter
max:the maximal value on the counter
Returns:the counter number or -1 in case of error

xmlAutomataNewCounterTrans ()

xmlAutomataStatePtr	xmlAutomataNewCounterTrans	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
int counter)

If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will be allowed only if the counter is within the right range.

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
counter:the counter associated to that transition
Returns:the target state or NULL in case of error

xmlAutomataNewEpsilon ()

xmlAutomataStatePtr	xmlAutomataNewEpsilon	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to)

If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
Returns:the target state or NULL in case of error

xmlAutomataNewNegTrans ()

xmlAutomataStatePtr	xmlAutomataNewNegTrans	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
void * data)

If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by any value except (@token,@token2) Note that if @token2 is not NULL, then (X, NULL) won't match to follow # the semantic of XSD ##other

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
token:the first input string associated to that transition
token2:the second input string associated to that transition
data:data passed to the callback function if the transition is activated
Returns:the target state or NULL in case of error

xmlAutomataNewOnceTrans ()

xmlAutomataStatePtr	xmlAutomataNewOnceTrans	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
int min,
int max,
void * data)

If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max, moreover that transition can only be crossed once.

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
token:the input string associated to that transition
min:the minimum successive occurences of token
max:the maximum successive occurences of token
data:data associated to the transition
Returns:the target state or NULL in case of error

xmlAutomataNewOnceTrans2 ()

xmlAutomataStatePtr	xmlAutomataNewOnceTrans2	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
int min,
int max,
void * data)

If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max, moreover that transition can only be crossed once.

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
token:the input string associated to that transition
token2:the second input string associated to that transition
min:the minimum successive occurences of token
max:the maximum successive occurences of token
data:data associated to the transition
Returns:the target state or NULL in case of error

xmlAutomataNewState ()

xmlAutomataStatePtr	xmlAutomataNewState	(xmlAutomataPtr am)

Create a new disconnected state in the automata

am:an automata
Returns:the new state or NULL in case of error

xmlAutomataNewTransition ()

xmlAutomataStatePtr	xmlAutomataNewTransition	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
void * data)

If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
token:the input string associated to that transition
data:data passed to the callback function if the transition is activated
Returns:the target state or NULL in case of error

xmlAutomataNewTransition2 ()

xmlAutomataStatePtr	xmlAutomataNewTransition2	(xmlAutomataPtr am, 
xmlAutomataStatePtr from,
xmlAutomataStatePtr to,
const xmlChar * token,
const xmlChar * token2,
void * data)

If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token

am:an automata
from:the starting point of the transition
to:the target point of the transition or NULL
token:the first input string associated to that transition
token2:the second input string associated to that transition
data:data passed to the callback function if the transition is activated
Returns:the target state or NULL in case of error

xmlAutomataSetFinalState ()

int	xmlAutomataSetFinalState	(xmlAutomataPtr am, 
xmlAutomataStatePtr state)

Makes that state a final state

am:an automata
state:a state in this automata
Returns:0 or -1 in case of error

xmlFreeAutomata ()

void	xmlFreeAutomata			(xmlAutomataPtr am)

Free an automata

am:an automata

xmlNewAutomata ()

xmlAutomataPtr	xmlNewAutomata		(void)

Create a new automata

Returns:the new object or NULL in case of failure

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-parser.html0000644000175000017500000041442712134171044020512 0ustar aronaron parser: the core parser module

parser

parser - the core parser module

Interfaces, constants and types related to the XML parser

Author(s): Daniel Veillard

Synopsis

#define XML_COMPLETE_ATTRS;
#define XML_SKIP_IDS;
#define XML_SAX2_MAGIC;
#define XML_DETECT_IDS;
#define XML_DEFAULT_VERSION;
typedef xmlParserNodeInfoSeq * xmlParserNodeInfoSeqPtr;
typedef struct _xmlSAXHandlerV1 xmlSAXHandlerV1;
typedef enum xmlParserInputState;
typedef xmlParserNodeInfo * xmlParserNodeInfoPtr;
typedef struct _xmlParserNodeInfoSeq xmlParserNodeInfoSeq;
typedef enum xmlFeature;
typedef enum xmlParserMode;
typedef enum xmlParserOption;
typedef xmlSAXHandlerV1 * xmlSAXHandlerV1Ptr;
typedef struct _xmlParserNodeInfo xmlParserNodeInfo;
void	xmlSetupParserForBuffer		(xmlParserCtxtPtr ctxt, 
const xmlChar * buffer,
const char * filename); xmlDocPtr xmlCtxtReadFile (xmlParserCtxtPtr ctxt,
const char * filename,
const char * encoding,
int options); int xmlParseCtxtExternalEntity (xmlParserCtxtPtr ctx,
const xmlChar * URL,
const xmlChar * ID,
xmlNodePtr * lst); typedef void attributeDeclSAXFunc (void * ctx,
const xmlChar * elem,
const xmlChar * fullname,
int type,
int def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree); typedef xmlEntityPtr getEntitySAXFunc (void * ctx,
const xmlChar * name); typedef void startElementSAXFunc (void * ctx,
const xmlChar * name,
const xmlChar ** atts); typedef void charactersSAXFunc (void * ctx,
const xmlChar * ch,
int len); void xmlClearNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); int xmlParseChunk (xmlParserCtxtPtr ctxt,
const char * chunk,
int size,
int terminate); xmlDocPtr xmlParseEntity (const char * filename); xmlDocPtr xmlRecoverFile (const char * filename); xmlDocPtr xmlCtxtReadDoc (xmlParserCtxtPtr ctxt,
const xmlChar * cur,
const char * URL,
const char * encoding,
int options); typedef void startElementNsSAX2Func (void * ctx,
const xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI,
int nb_namespaces,
const xmlChar ** namespaces,
int nb_attributes,
int nb_defaulted,
const xmlChar ** attributes); xmlParserCtxtPtr xmlCreateIOParserCtxt (xmlSAXHandlerPtr sax,
void * user_data,
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
xmlCharEncoding enc); xmlParserErrors xmlParseInNodeContext (xmlNodePtr node,
const char * data,
int datalen,
int options,
xmlNodePtr * lst); typedef void referenceSAXFunc (void * ctx,
const xmlChar * name); typedef int hasExternalSubsetSAXFunc (void * ctx); xmlDocPtr xmlSAXParseDoc (xmlSAXHandlerPtr sax,
const xmlChar * cur,
int recovery); xmlDocPtr xmlReadMemory (const char * buffer,
int size,
const char * URL,
const char * encoding,
int options); xmlDocPtr xmlParseMemory (const char * buffer,
int size); xmlParserInputPtr xmlNewIOInputStream (xmlParserCtxtPtr ctxt,
xmlParserInputBufferPtr input,
xmlCharEncoding enc); typedef void processingInstructionSAXFunc (void * ctx,
const xmlChar * target,
const xmlChar * data); int xmlParseBalancedChunkMemoryRecover (xmlDocPtr doc,
xmlSAXHandlerPtr sax,
void * user_data,
int depth,
const xmlChar * string,
xmlNodePtr * lst,
int recover); void xmlInitParser (void); xmlParserCtxtPtr xmlCreateDocParserCtxt (const xmlChar * cur); typedef void errorSAXFunc (void * ctx,
const char * msg,
... ...); xmlDocPtr xmlSAXParseMemory (xmlSAXHandlerPtr sax,
const char * buffer,
int size,
int recovery); xmlDocPtr xmlRecoverMemory (const char * buffer,
int size); typedef xmlParserInputPtr xmlExternalEntityLoader (const char * URL,
const char * ID,
xmlParserCtxtPtr context); typedef int hasInternalSubsetSAXFunc (void * ctx); typedef void cdataBlockSAXFunc (void * ctx,
const xmlChar * value,
int len); xmlDocPtr xmlSAXParseFile (xmlSAXHandlerPtr sax,
const char * filename,
int recovery); typedef void xmlParserInputDeallocate (xmlChar * str); xmlDocPtr xmlCtxtReadIO (xmlParserCtxtPtr ctxt,
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options); xmlDocPtr xmlSAXParseMemoryWithData (xmlSAXHandlerPtr sax,
const char * buffer,
int size,
int recovery,
void * data); int xmlGetFeature (xmlParserCtxtPtr ctxt,
const char * name,
void * result); xmlDtdPtr xmlIOParseDTD (xmlSAXHandlerPtr sax,
xmlParserInputBufferPtr input,
xmlCharEncoding enc); void xmlFreeParserCtxt (xmlParserCtxtPtr ctxt); xmlDtdPtr xmlParseDTD (const xmlChar * ExternalID,
const xmlChar * SystemID); xmlDocPtr xmlRecoverDoc (const xmlChar * cur); typedef void commentSAXFunc (void * ctx,
const xmlChar * value); int xmlInitParserCtxt (xmlParserCtxtPtr ctxt); typedef void attributeSAXFunc (void * ctx,
const xmlChar * name,
const xmlChar * value); int xmlParserInputGrow (xmlParserInputPtr in,
int len); xmlDocPtr xmlCtxtReadMemory (xmlParserCtxtPtr ctxt,
const char * buffer,
int size,
const char * URL,
const char * encoding,
int options); typedef void externalSubsetSAXFunc (void * ctx,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); typedef xmlParserInputPtr resolveEntitySAXFunc (void * ctx,
const xmlChar * publicId,
const xmlChar * systemId); int xmlPedanticParserDefault (int val); xmlDocPtr xmlSAXParseEntity (xmlSAXHandlerPtr sax,
const char * filename); xmlDocPtr xmlParseDoc (const xmlChar * cur); xmlDocPtr xmlSAXParseFileWithData (xmlSAXHandlerPtr sax,
const char * filename,
int recovery,
void * data); int xmlLineNumbersDefault (int val); xmlExternalEntityLoader xmlGetExternalEntityLoader (void); typedef void elementDeclSAXFunc (void * ctx,
const xmlChar * name,
int type,
xmlElementContentPtr content); int xmlCtxtUseOptions (xmlParserCtxtPtr ctxt,
int options); xmlParserCtxtPtr xmlCreatePushParserCtxt (xmlSAXHandlerPtr sax,
void * user_data,
const char * chunk,
int size,
const char * filename); void xmlParserAddNodeInfo (xmlParserCtxtPtr ctxt,
const xmlParserNodeInfoPtr info); xmlDocPtr xmlCtxtReadFd (xmlParserCtxtPtr ctxt,
int fd,
const char * URL,
const char * encoding,
int options); typedef void internalSubsetSAXFunc (void * ctx,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); xmlParserCtxtPtr xmlNewParserCtxt (void); typedef void endDocumentSAXFunc (void * ctx); xmlDocPtr xmlParseFile (const char * filename); int xmlParseDocument (xmlParserCtxtPtr ctxt); typedef void setDocumentLocatorSAXFunc (void * ctx,
xmlSAXLocatorPtr loc); typedef xmlEntityPtr getParameterEntitySAXFunc (void * ctx,
const xmlChar * name); typedef void ignorableWhitespaceSAXFunc (void * ctx,
const xmlChar * ch,
int len); void xmlInitNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); int xmlSubstituteEntitiesDefault (int val); typedef void endElementSAXFunc (void * ctx,
const xmlChar * name); unsigned long xmlParserFindNodeInfoIndex (const xmlParserNodeInfoSeqPtr seq,
const xmlNodePtr node); long xmlByteConsumed (xmlParserCtxtPtr ctxt); void xmlCtxtReset (xmlParserCtxtPtr ctxt); int xmlSetFeature (xmlParserCtxtPtr ctxt,
const char * name,
void * value); int xmlKeepBlanksDefault (int val); int xmlParserInputRead (xmlParserInputPtr in,
int len); xmlDocPtr xmlReadFile (const char * filename,
const char * encoding,
int options); int xmlGetFeaturesList (int * len,
const char ** result); int xmlHasFeature (xmlFeature feature); typedef void unparsedEntityDeclSAXFunc (void * ctx,
const xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId,
const xmlChar * notationName); int xmlSAXUserParseFile (xmlSAXHandlerPtr sax,
void * user_data,
const char * filename); typedef void fatalErrorSAXFunc (void * ctx,
const char * msg,
... ...); xmlDtdPtr xmlSAXParseDTD (xmlSAXHandlerPtr sax,
const xmlChar * ExternalID,
const xmlChar * SystemID); const xmlParserNodeInfo * xmlParserFindNodeInfo (const xmlParserCtxtPtr ctx,
const xmlNodePtr node); typedef void entityDeclSAXFunc (void * ctx,
const xmlChar * name,
int type,
const xmlChar * publicId,
const xmlChar * systemId,
xmlChar * content); xmlParserInputPtr xmlLoadExternalEntity (const char * URL,
const char * ID,
xmlParserCtxtPtr ctxt); void xmlStopParser (xmlParserCtxtPtr ctxt); xmlDocPtr xmlReadFd (int fd,
const char * URL,
const char * encoding,
int options); int xmlParseExtParsedEnt (xmlParserCtxtPtr ctxt); xmlDocPtr xmlReadIO (xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options); xmlDocPtr xmlReadDoc (const xmlChar * cur,
const char * URL,
const char * encoding,
int options); int xmlSAXUserParseMemory (xmlSAXHandlerPtr sax,
void * user_data,
const char * buffer,
int size); int xmlParseBalancedChunkMemory (xmlDocPtr doc,
xmlSAXHandlerPtr sax,
void * user_data,
int depth,
const xmlChar * string,
xmlNodePtr * lst); typedef void endElementNsSAX2Func (void * ctx,
const xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI); void xmlCleanupParser (void); int xmlCtxtResetPush (xmlParserCtxtPtr ctxt,
const char * chunk,
int size,
const char * filename,
const char * encoding); typedef int isStandaloneSAXFunc (void * ctx); typedef void startDocumentSAXFunc (void * ctx); void xmlClearParserCtxt (xmlParserCtxtPtr ctxt); int xmlParseExternalEntity (xmlDocPtr doc,
xmlSAXHandlerPtr sax,
void * user_data,
int depth,
const xmlChar * URL,
const xmlChar * ID,
xmlNodePtr * lst); typedef void notationDeclSAXFunc (void * ctx,
const xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId); typedef void warningSAXFunc (void * ctx,
const char * msg,
... ...); void xmlSetExternalEntityLoader (xmlExternalEntityLoader f);

Description

Details

Macro XML_COMPLETE_ATTRS

#define XML_COMPLETE_ATTRS;

Bit in the loadsubset context field to tell to do complete the elements attributes lists with the ones defaulted from the DTDs. Use it to initialize xmlLoadExtDtdDefaultValue.


Macro XML_DEFAULT_VERSION

#define XML_DEFAULT_VERSION;

The default version of XML used: 1.0


Macro XML_DETECT_IDS

#define XML_DETECT_IDS;

Bit in the loadsubset context field to tell to do ID/REFs lookups. Use it to initialize xmlLoadExtDtdDefaultValue.


Macro XML_SAX2_MAGIC

#define XML_SAX2_MAGIC;

Special constant found in SAX2 blocks initialized fields


Macro XML_SKIP_IDS

#define XML_SKIP_IDS;

Bit in the loadsubset context field to tell to not do ID/REFs registration. Used to initialize xmlLoadExtDtdDefaultValue in some special cases.



Enum xmlParserInputState

enum xmlParserInputState {
    XML_PARSER_EOF = -1 /* nothing is to be parsed */
    XML_PARSER_START = 0 /* nothing has been parsed */
    XML_PARSER_MISC = 1 /* Misc* before int subset */
    XML_PARSER_PI = 2 /* Within a processing instruction */
    XML_PARSER_DTD = 3 /* within some DTD content */
    XML_PARSER_PROLOG = 4 /* Misc* after internal subset */
    XML_PARSER_COMMENT = 5 /* within a comment */
    XML_PARSER_START_TAG = 6 /* within a start tag */
    XML_PARSER_CONTENT = 7 /* within the content */
    XML_PARSER_CDATA_SECTION = 8 /* within a CDATA section */
    XML_PARSER_END_TAG = 9 /* within a closing tag */
    XML_PARSER_ENTITY_DECL = 10 /* within an entity declaration */
    XML_PARSER_ENTITY_VALUE = 11 /* within an entity value in a decl */
    XML_PARSER_ATTRIBUTE_VALUE = 12 /* within an attribute value */
    XML_PARSER_SYSTEM_LITERAL = 13 /* within a SYSTEM value */
    XML_PARSER_EPILOG = 14 /* the Misc* after the last end tag */
    XML_PARSER_IGNORE = 15 /* within an IGNORED section */
    XML_PARSER_PUBLIC_LITERAL = 16 /*  within a PUBLIC value */
};



Structure xmlParserNodeInfo

struct _xmlParserNodeInfo {
    const struct _xmlNode *	node	: Position & line # that text that created the node begins & ends on
    unsigned long	begin_pos
    unsigned long	begin_line
    unsigned long	end_pos
    unsigned long	end_line
} xmlParserNodeInfo;


Typedef xmlParserNodeInfoPtr

xmlParserNodeInfo * xmlParserNodeInfoPtr;


Structure xmlParserNodeInfoSeq

struct _xmlParserNodeInfoSeq {
    unsigned long	maximum
    unsigned long	length
    xmlParserNodeInfo *	buffer
} xmlParserNodeInfoSeq;


Typedef xmlParserNodeInfoSeqPtr

xmlParserNodeInfoSeq * xmlParserNodeInfoSeqPtr;


Enum xmlParserOption

enum xmlParserOption {
    XML_PARSE_RECOVER = 1 /* recover on errors */
    XML_PARSE_NOENT = 2 /* substitute entities */
    XML_PARSE_DTDLOAD = 4 /* load the external subset */
    XML_PARSE_DTDATTR = 8 /* default DTD attributes */
    XML_PARSE_DTDVALID = 16 /* validate with the DTD */
    XML_PARSE_NOERROR = 32 /* suppress error reports */
    XML_PARSE_NOWARNING = 64 /* suppress warning reports */
    XML_PARSE_PEDANTIC = 128 /* pedantic error reporting */
    XML_PARSE_NOBLANKS = 256 /* remove blank nodes */
    XML_PARSE_SAX1 = 512 /* use the SAX1 interface internally */
    XML_PARSE_XINCLUDE = 1024 /* Implement XInclude substitition */
    XML_PARSE_NONET = 2048 /* Forbid network access */
    XML_PARSE_NODICT = 4096 /* Do not reuse the context dictionnary */
    XML_PARSE_NSCLEAN = 8192 /* remove redundant namespaces declarations */
    XML_PARSE_NOCDATA = 16384 /* merge CDATA as text nodes */
    XML_PARSE_NOXINCNODE = 32768 /* do not generate XINCLUDE START/END nodes */
    XML_PARSE_COMPACT = 65536 /* compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree) */
    XML_PARSE_OLD10 = 131072 /* parse using XML-1.0 before update 5 */
    XML_PARSE_NOBASEFIX = 262144 /* do not fixup XINCLUDE xml:base uris */
    XML_PARSE_HUGE = 524288 /* relax any hardcoded limit from the parser */
    XML_PARSE_OLDSAX = 1048576 /* parse using SAX2 interface before 2.7.0 */
    XML_PARSE_IGNORE_ENC = 2097152 /* ignore internal document encoding hint */
    XML_PARSE_BIG_LINES = 4194304 /*  Store big lines numbers in text PSVI field */
};


Structure xmlSAXHandlerV1

struct _xmlSAXHandlerV1 {
    internalSubsetSAXFunc	internalSubset
    isStandaloneSAXFunc	isStandalone
    hasInternalSubsetSAXFunc	hasInternalSubset
    hasExternalSubsetSAXFunc	hasExternalSubset
    resolveEntitySAXFunc	resolveEntity
    getEntitySAXFunc	getEntity
    entityDeclSAXFunc	entityDecl
    notationDeclSAXFunc	notationDecl
    attributeDeclSAXFunc	attributeDecl
    elementDeclSAXFunc	elementDecl
    unparsedEntityDeclSAXFunc	unparsedEntityDecl
    setDocumentLocatorSAXFunc	setDocumentLocator
    startDocumentSAXFunc	startDocument
    endDocumentSAXFunc	endDocument
    startElementSAXFunc	startElement
    endElementSAXFunc	endElement
    referenceSAXFunc	reference
    charactersSAXFunc	characters
    ignorableWhitespaceSAXFunc	ignorableWhitespace
    processingInstructionSAXFunc	processingInstruction
    commentSAXFunc	comment
    warningSAXFunc	warning
    errorSAXFunc	error
    fatalErrorSAXFunc	fatalError	: unused error() get all the errors
    getParameterEntitySAXFunc	getParameterEntity
    cdataBlockSAXFunc	cdataBlock
    externalSubsetSAXFunc	externalSubset
    unsigned int	initialized
} xmlSAXHandlerV1;


Typedef xmlSAXHandlerV1Ptr

xmlSAXHandlerV1 * xmlSAXHandlerV1Ptr;


Function type attributeDeclSAXFunc

void	attributeDeclSAXFunc		(void * ctx, 
const
xmlChar * elem,
const xmlChar * fullname,
int type,
int def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree)

An attribute definition has been parsed.

ctx:the user data (XML parser context)
elem:the name of the element
fullname:the attribute name
type:the attribute type
def:the type of default value
defaultValue:the attribute default value
tree:the tree of enumerated value set

Function type attributeSAXFunc

void	attributeSAXFunc		(void * ctx, 
const
xmlChar * name,
const xmlChar * value)

Handle an attribute that has been read by the parser. The default handling is to convert the attribute into an DOM subtree and past it in a new xmlAttr element added to the element.

ctx:the user data (XML parser context)
name:The attribute name, including namespace prefix
value:The attribute value

Function type cdataBlockSAXFunc

void	cdataBlockSAXFunc		(void * ctx, 
const
xmlChar * value,
int len)

Called when a pcdata block has been parsed.

ctx:the user data (XML parser context)
value:The pcdata content
len:the block length

Function type charactersSAXFunc

void	charactersSAXFunc		(void * ctx, 
const
xmlChar * ch,
int len)

Receiving some chars from the parser.

ctx:the user data (XML parser context)
ch:a xmlChar string
len:the number of xmlChar

Function type commentSAXFunc

void	commentSAXFunc			(void * ctx, 
const
xmlChar * value)

A comment has been parsed.

ctx:the user data (XML parser context)
value:the comment content

Function type elementDeclSAXFunc

void	elementDeclSAXFunc		(void * ctx, 
const
xmlChar * name,
int type,
xmlElementContentPtr content)

An element definition has been parsed.

ctx:the user data (XML parser context)
name:the element name
type:the element type
content:the element value tree


Function type endElementNsSAX2Func

void	endElementNsSAX2Func		(void * ctx, 
const
xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI)

SAX2 callback when an element end has been detected by the parser. It provides the namespace informations for the element.

ctx:the user data (XML parser context)
localname:the local name of the element
prefix:the element namespace prefix if available
URI:the element namespace name if available

Function type endElementSAXFunc

void	endElementSAXFunc		(void * ctx, 
const
xmlChar * name)

Called when the end of an element has been detected.

ctx:the user data (XML parser context)
name:The element name

Function type entityDeclSAXFunc

void	entityDeclSAXFunc		(void * ctx, 
const
xmlChar * name,
int type,
const xmlChar * publicId,
const xmlChar * systemId,
xmlChar * content)

An entity definition has been parsed.

ctx:the user data (XML parser context)
name:the entity name
type:the entity type
publicId:The public ID of the entity
systemId:The system ID of the entity
content:the entity value (without processing).


Function type externalSubsetSAXFunc

void	externalSubsetSAXFunc		(void * ctx, 
const
xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Callback on external subset declaration.

ctx:the user data (XML parser context)
name:the root element name
ExternalID:the external ID
SystemID:the SYSTEM ID (e.g. filename or URL)


Function type getEntitySAXFunc

xmlEntityPtr	getEntitySAXFunc	(void * ctx, 
const xmlChar * name)

Get an entity by name.

ctx:the user data (XML parser context)
name:The entity name
Returns:the xmlEntityPtr if found.

Function type getParameterEntitySAXFunc

xmlEntityPtr	getParameterEntitySAXFunc	(void * ctx, 
const xmlChar * name)

Get a parameter entity by name.

ctx:the user data (XML parser context)
name:The entity name
Returns:the xmlEntityPtr if found.



Function type ignorableWhitespaceSAXFunc

void	ignorableWhitespaceSAXFunc	(void * ctx, 
const
xmlChar * ch,
int len)

Receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use characters.

ctx:the user data (XML parser context)
ch:a xmlChar string
len:the number of xmlChar

Function type internalSubsetSAXFunc

void	internalSubsetSAXFunc		(void * ctx, 
const
xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Callback on internal subset declaration.

ctx:the user data (XML parser context)
name:the root element name
ExternalID:the external ID
SystemID:the SYSTEM ID (e.g. filename or URL)


Function type notationDeclSAXFunc

void	notationDeclSAXFunc		(void * ctx, 
const
xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId)

What to do when a notation declaration has been parsed.

ctx:the user data (XML parser context)
name:The name of the notation
publicId:The public ID of the entity
systemId:The system ID of the entity

Function type processingInstructionSAXFunc

void	processingInstructionSAXFunc	(void * ctx, 
const
xmlChar * target,
const xmlChar * data)

A processing instruction has been parsed.

ctx:the user data (XML parser context)
target:the target name
data:the PI data's

Function type referenceSAXFunc

void	referenceSAXFunc		(void * ctx, 
const
xmlChar * name)

Called when an entity reference is detected.

ctx:the user data (XML parser context)
name:The entity name

Function type resolveEntitySAXFunc

xmlParserInputPtr	resolveEntitySAXFunc	(void * ctx, 
const xmlChar * publicId,
const xmlChar * systemId)

Callback: The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine

ctx:the user data (XML parser context)
publicId:The public ID of the entity
systemId:The system ID of the entity
Returns:the xmlParserInputPtr if inlined or NULL for DOM behaviour.

Function type setDocumentLocatorSAXFunc

void	setDocumentLocatorSAXFunc	(void * ctx, 
xmlSAXLocatorPtr loc)

Receive the document locator at startup, actually xmlDefaultSAXLocator. Everything is available on the context, so this is useless in our case.

ctx:the user data (XML parser context)
loc:A SAX Locator


Function type startElementNsSAX2Func

void	startElementNsSAX2Func		(void * ctx, 
const
xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI,
int nb_namespaces,
const xmlChar ** namespaces,
int nb_attributes,
int nb_defaulted,
const xmlChar ** attributes)

SAX2 callback when an element start has been detected by the parser. It provides the namespace informations for the element, as well as the new namespace declarations on the element.

ctx:the user data (XML parser context)
localname:the local name of the element
prefix:the element namespace prefix if available
URI:the element namespace name if available
nb_namespaces:number of namespace definitions on that node
namespaces:pointer to the array of prefix/URI pairs namespace definitions
nb_attributes:the number of attributes on that node
nb_defaulted:the number of defaulted attributes. The defaulted ones are at the end of the array
attributes:pointer to the array of (localname/prefix/URI/value/end) attribute values.

Function type startElementSAXFunc

void	startElementSAXFunc		(void * ctx, 
const
xmlChar * name,
const xmlChar ** atts)

Called when an opening tag has been processed.

ctx:the user data (XML parser context)
name:The element name, including namespace prefix
atts:An array of name/value attributes pairs, NULL terminated

Function type unparsedEntityDeclSAXFunc

void	unparsedEntityDeclSAXFunc	(void * ctx, 
const
xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId,
const xmlChar * notationName)

What to do when an unparsed entity declaration is parsed.

ctx:the user data (XML parser context)
name:The name of the entity
publicId:The public ID of the entity
systemId:The system ID of the entity
notationName:the name of the notation


Function type xmlExternalEntityLoader

xmlParserInputPtr	xmlExternalEntityLoader	(const char * URL, 
const char * ID,
xmlParserCtxtPtr context)

External entity loaders types.

URL:The System ID of the resource requested
ID:The Public ID of the resource requested
context:the XML parser context
Returns:the entity input parser.

Function type xmlParserInputDeallocate

void	xmlParserInputDeallocate	(xmlChar * str)

Callback for freeing some parser input allocations.

str:the string to deallocate

xmlByteConsumed ()

long	xmlByteConsumed			(xmlParserCtxtPtr ctxt)

This function provides the current index of the parser relative to the start of the current entity. This function is computed in bytes from the beginning starting at zero and finishing at the size in byte of the file if parsing a file. The function is of constant cost if the input is UTF-8 but can be costly if run on non-UTF-8 input.

ctxt:an XML parser context
Returns:the index in bytes from the beginning of the entity or -1 in case the index could not be computed.


xmlClearNodeInfoSeq ()

void	xmlClearNodeInfoSeq		(xmlParserNodeInfoSeqPtr seq)

-- Clear (release memory and reinitialize) node info sequence

seq:a node info sequence pointer

xmlClearParserCtxt ()

void	xmlClearParserCtxt		(xmlParserCtxtPtr ctxt)

Clear (release owned resources) and reinitialize a parser context

ctxt:an XML parser context

xmlCreateDocParserCtxt ()

xmlParserCtxtPtr	xmlCreateDocParserCtxt	(const xmlChar * cur)

Creates a parser context for an XML in-memory document.

cur:a pointer to an array of xmlChar
Returns:the new parser context or NULL

xmlCreateIOParserCtxt ()

xmlParserCtxtPtr	xmlCreateIOParserCtxt	(xmlSAXHandlerPtr sax, 
void * user_data,
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
xmlCharEncoding enc)

Create a parser context for using the XML parser with an existing I/O stream

sax:a SAX handler
user_data:The user data returned on SAX callbacks
ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
enc:the charset encoding if known
Returns:the new parser context or NULL

xmlCreatePushParserCtxt ()

xmlParserCtxtPtr	xmlCreatePushParserCtxt	(xmlSAXHandlerPtr sax, 
void * user_data,
const char * chunk,
int size,
const char * filename)

Create a parser context for using the XML parser in push mode. If @buffer and @size are non-NULL, the data is used to detect the encoding. The remaining characters will be parsed so they don't need to be fed in again through xmlParseChunk. To allow content encoding detection, @size should be >= 4 The value of @filename is used for fetching external entities and error/warning reports.

sax:a SAX handler
user_data:The user data returned on SAX callbacks
chunk:a pointer to an array of chars
size:number of chars in the array
filename:an optional file name or URI
Returns:the new parser context or NULL

xmlCtxtReadDoc ()

xmlDocPtr	xmlCtxtReadDoc		(xmlParserCtxtPtr ctxt, 
const xmlChar * cur,
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

ctxt:an XML parser context
cur:a pointer to a zero terminated string
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlCtxtReadFd ()

xmlDocPtr	xmlCtxtReadFd		(xmlParserCtxtPtr ctxt, 
int fd,
const char * URL,
const char * encoding,
int options)

parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context NOTE that the file descriptor will not be closed when the reader is closed or reset.

ctxt:an XML parser context
fd:an open file descriptor
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlCtxtReadFile ()

xmlDocPtr	xmlCtxtReadFile		(xmlParserCtxtPtr ctxt, 
const char * filename,
const char * encoding,
int options)

parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context

ctxt:an XML parser context
filename:a file or URL
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlCtxtReadIO ()

xmlDocPtr	xmlCtxtReadIO		(xmlParserCtxtPtr ctxt, 
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options)

parse an XML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context

ctxt:an XML parser context
ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlCtxtReadMemory ()

xmlDocPtr	xmlCtxtReadMemory	(xmlParserCtxtPtr ctxt, 
const char * buffer,
int size,
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

ctxt:an XML parser context
buffer:a pointer to a char array
size:the size of the array
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlCtxtReset ()

void	xmlCtxtReset			(xmlParserCtxtPtr ctxt)

Reset a parser context

ctxt:an XML parser context

xmlCtxtResetPush ()

int	xmlCtxtResetPush		(xmlParserCtxtPtr ctxt, 
const char * chunk,
int size,
const char * filename,
const char * encoding)

Reset a push parser context

ctxt:an XML parser context
chunk:a pointer to an array of chars
size:number of chars in the array
filename:an optional file name or URI
encoding:the document encoding, or NULL
Returns:0 in case of success and 1 in case of error

xmlCtxtUseOptions ()

int	xmlCtxtUseOptions		(xmlParserCtxtPtr ctxt, 
int options)

Applies the options to the parser context

ctxt:an XML parser context
options:a combination of xmlParserOption
Returns:0 in case of success, the set of unknown or unimplemented options in case of error.

xmlFreeParserCtxt ()

void	xmlFreeParserCtxt		(xmlParserCtxtPtr ctxt)

Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed.

ctxt:an XML parser context

xmlGetExternalEntityLoader ()

xmlExternalEntityLoader	xmlGetExternalEntityLoader	(void)

Get the default external entity resolver function for the application

Returns:the xmlExternalEntityLoader function pointer

xmlGetFeature ()

int	xmlGetFeature			(xmlParserCtxtPtr ctxt, 
const char * name,
void * result)

Read the current value of one feature of this parser instance

ctxt:an XML/HTML parser context
name:the feature name
result:location to store the result
Returns:-1 in case or error, 0 otherwise


xmlHasFeature ()

int	xmlHasFeature			(xmlFeature feature)

Examines if the library has been compiled with a given feature.

feature:the feature to be examined
Returns:a non-zero value if the feature exist, otherwise zero. Returns zero (0) if the feature does not exist or an unknown unknown feature is requested, non-zero otherwise.

xmlIOParseDTD ()

xmlDtdPtr	xmlIOParseDTD		(xmlSAXHandlerPtr sax, 
xmlParserInputBufferPtr input,
xmlCharEncoding enc)

Load and parse a DTD

sax:the SAX handler block or NULL
input:an Input Buffer
enc:the charset encoding if known
Returns:the resulting xmlDtdPtr or NULL in case of error. @input will be freed by the function in any case.

xmlInitNodeInfoSeq ()

void	xmlInitNodeInfoSeq		(xmlParserNodeInfoSeqPtr seq)

-- Initialize (set to initial state) node info sequence

seq:a node info sequence pointer


xmlInitParserCtxt ()

int	xmlInitParserCtxt		(xmlParserCtxtPtr ctxt)

Initialize a parser context

ctxt:an XML parser context
Returns:0 in case of success and -1 in case of error



xmlLoadExternalEntity ()

xmlParserInputPtr	xmlLoadExternalEntity	(const char * URL, 
const char * ID,
xmlParserCtxtPtr ctxt)

Load an external entity, note that the use of this function for unparsed entities may generate problems

URL:the URL for the entity to load
ID:the Public ID for the entity to load
ctxt:the context in which the entity is called or NULL
Returns:the xmlParserInputPtr or NULL

xmlNewIOInputStream ()

xmlParserInputPtr	xmlNewIOInputStream	(xmlParserCtxtPtr ctxt, 
xmlParserInputBufferPtr input,
xmlCharEncoding enc)

Create a new input stream structure encapsulating the @input into a stream suitable for the parser.

ctxt:an XML parser context
input:an I/O Input
enc:the charset encoding if known
Returns:the new input stream or NULL

xmlNewParserCtxt ()

xmlParserCtxtPtr	xmlNewParserCtxt	(void)

Allocate and initialize a new parser context.

Returns:the xmlParserCtxtPtr or NULL

xmlParseBalancedChunkMemory ()

int	xmlParseBalancedChunkMemory	(xmlDocPtr doc, 
xmlSAXHandlerPtr sax,
void * user_data,
int depth,
const xmlChar * string,
xmlNodePtr * lst)

Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

doc:the document the chunk pertains to
sax:the SAX handler bloc (possibly NULL)
user_data:The user data returned on SAX callbacks (possibly NULL)
depth:Used for loop detection, use 0
string:the input string in UTF8 or ISO-Latin (zero terminated)
lst:the return value for the set of parsed nodes
Returns:0 if the chunk is well balanced, -1 in case of args problem and the parser error code otherwise

xmlParseBalancedChunkMemoryRecover ()

int	xmlParseBalancedChunkMemoryRecover	(xmlDocPtr doc, 
xmlSAXHandlerPtr sax,
void * user_data,
int depth,
const xmlChar * string,
xmlNodePtr * lst,
int recover)

Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

doc:the document the chunk pertains to
sax:the SAX handler bloc (possibly NULL)
user_data:The user data returned on SAX callbacks (possibly NULL)
depth:Used for loop detection, use 0
string:the input string in UTF8 or ISO-Latin (zero terminated)
lst:the return value for the set of parsed nodes
recover:return nodes even if the data is broken (use 0)
Returns:0 if the chunk is well balanced, -1 in case of args problem and the parser error code otherwise In case recover is set to 1, the nodelist will not be empty even if the parsed chunk is not well balanced, assuming the parsing succeeded to some extent.

xmlParseChunk ()

int	xmlParseChunk			(xmlParserCtxtPtr ctxt, 
const char * chunk,
int size,
int terminate)

Parse a Chunk of memory

ctxt:an XML parser context
chunk:an char array
size:the size in byte of the chunk
terminate:last chunk indicator
Returns:zero if no error, the xmlParserErrors otherwise.

xmlParseCtxtExternalEntity ()

int	xmlParseCtxtExternalEntity	(xmlParserCtxtPtr ctx, 
const xmlChar * URL,
const xmlChar * ID,
xmlNodePtr * lst)

Parse an external general entity within an existing parsing context An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content

ctx:the existing parsing context
URL:the URL for the entity to load
ID:the System ID for the entity to load
lst:the return value for the set of parsed nodes
Returns:0 if the entity is well formed, -1 in case of args problem and the parser error code otherwise

xmlParseDTD ()

xmlDtdPtr	xmlParseDTD		(const xmlChar * ExternalID, 
const xmlChar * SystemID)

Load and parse an external subset.

ExternalID:a NAME* containing the External ID of the DTD
SystemID:a NAME* containing the URL to the DTD
Returns:the resulting xmlDtdPtr or NULL in case of error.

xmlParseDoc ()

xmlDocPtr	xmlParseDoc		(const xmlChar * cur)

parse an XML in-memory document and build a tree.

cur:a pointer to an array of xmlChar
Returns:the resulting document tree

xmlParseDocument ()

int	xmlParseDocument		(xmlParserCtxtPtr ctxt)

parse an XML document (and build a tree if using the standard SAX interface). [1] document ::= prolog element Misc* [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

ctxt:an XML parser context
Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

xmlParseEntity ()

xmlDocPtr	xmlParseEntity		(const char * filename)

parse an XML external entity out of context and build a tree. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk

filename:the filename
Returns:the resulting document tree

xmlParseExtParsedEnt ()

int	xmlParseExtParsedEnt		(xmlParserCtxtPtr ctxt)

parse a general parsed entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content

ctxt:an XML parser context
Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

xmlParseExternalEntity ()

int	xmlParseExternalEntity		(xmlDocPtr doc, 
xmlSAXHandlerPtr sax,
void * user_data,
int depth,
const xmlChar * URL,
const xmlChar * ID,
xmlNodePtr * lst)

Parse an external general entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content

doc:the document the chunk pertains to
sax:the SAX handler bloc (possibly NULL)
user_data:The user data returned on SAX callbacks (possibly NULL)
depth:Used for loop detection, use 0
URL:the URL for the entity to load
ID:the System ID for the entity to load
lst:the return value for the set of parsed nodes
Returns:0 if the entity is well formed, -1 in case of args problem and the parser error code otherwise

xmlParseFile ()

xmlDocPtr	xmlParseFile		(const char * filename)

parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

filename:the filename
Returns:the resulting document tree if the file was wellformed, NULL otherwise.

xmlParseInNodeContext ()

xmlParserErrors	xmlParseInNodeContext	(xmlNodePtr node, 
const char * data,
int datalen,
int options,
xmlNodePtr * lst)

Parse a well-balanced chunk of an XML document within the context (DTD, namespaces, etc ...) of the given node. The allowed sequence for the data is a Well Balanced Chunk defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

node:the context node
data:the input string
datalen:the input string length in bytes
options:a combination of xmlParserOption
lst:the return value for the set of parsed nodes
Returns:XML_ERR_OK if the chunk is well balanced, and the parser error code otherwise

xmlParseMemory ()

xmlDocPtr	xmlParseMemory		(const char * buffer, 
int size)

parse an XML in-memory block and build a tree.

buffer:an pointer to a char array
size:the size of the array
Returns:the resulting document tree

xmlParserAddNodeInfo ()

void	xmlParserAddNodeInfo		(xmlParserCtxtPtr ctxt, 
const xmlParserNodeInfoPtr info)

Insert node info record into the sorted sequence

ctxt:an XML parser context
info:a node info sequence pointer

xmlParserFindNodeInfo ()

const xmlParserNodeInfo *	xmlParserFindNodeInfo	(const xmlParserCtxtPtr ctx, 
const xmlNodePtr node)

Find the parser node info struct for a given node

ctx:an XML parser context
node:an XML node within the tree
Returns:an xmlParserNodeInfo block pointer or NULL

xmlParserFindNodeInfoIndex ()

unsigned long	xmlParserFindNodeInfoIndex	(const xmlParserNodeInfoSeqPtr seq, 
const xmlNodePtr node)

xmlParserFindNodeInfoIndex : Find the index that the info record for the given node is or should be at in a sorted sequence

seq:a node info sequence pointer
node:an XML node pointer
Returns:a long indicating the position of the record

xmlParserInputGrow ()

int	xmlParserInputGrow		(xmlParserInputPtr in, 
int len)

This function increase the input for the parser. It tries to preserve pointers to the input buffer, and keep already read data

in:an XML parser input
len:an indicative size for the lookahead
Returns:the amount of char read, or -1 in case of error, 0 indicate the end of this entity

xmlParserInputRead ()

int	xmlParserInputRead		(xmlParserInputPtr in, 
int len)

This function was internal and is deprecated.

in:an XML parser input
len:an indicative size for the lookahead
Returns:-1 as this is an error to use it.


xmlReadDoc ()

xmlDocPtr	xmlReadDoc		(const xmlChar * cur, 
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree.

cur:a pointer to a zero terminated string
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlReadFd ()

xmlDocPtr	xmlReadFd		(int fd, 
const char * URL,
const char * encoding,
int options)

parse an XML from a file descriptor and build a tree. NOTE that the file descriptor will not be closed when the reader is closed or reset.

fd:an open file descriptor
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlReadFile ()

xmlDocPtr	xmlReadFile		(const char * filename, 
const char * encoding,
int options)

parse an XML file from the filesystem or the network.

filename:a file or URL
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlReadIO ()

xmlDocPtr	xmlReadIO		(xmlInputReadCallback ioread, 
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options)

parse an XML document from I/O functions and source and build a tree.

ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlReadMemory ()

xmlDocPtr	xmlReadMemory		(const char * buffer, 
int size,
const char * URL,
const char * encoding,
int options)

parse an XML in-memory document and build a tree.

buffer:a pointer to a char array
size:the size of the array
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the resulting document tree

xmlRecoverDoc ()

xmlDocPtr	xmlRecoverDoc		(const xmlChar * cur)

parse an XML in-memory document and build a tree. In the case the document is not Well Formed, a attempt to build a tree is tried anyway

cur:a pointer to an array of xmlChar
Returns:the resulting document tree or NULL in case of failure

xmlRecoverFile ()

xmlDocPtr	xmlRecoverFile		(const char * filename)

parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. In the case the document is not Well Formed, it attempts to build a tree anyway

filename:the filename
Returns:the resulting document tree or NULL in case of failure

xmlRecoverMemory ()

xmlDocPtr	xmlRecoverMemory	(const char * buffer, 
int size)

parse an XML in-memory block and build a tree. In the case the document is not Well Formed, an attempt to build a tree is tried anyway

buffer:an pointer to a char array
size:the size of the array
Returns:the resulting document tree or NULL in case of error

xmlSAXParseDTD ()

xmlDtdPtr	xmlSAXParseDTD		(xmlSAXHandlerPtr sax, 
const xmlChar * ExternalID,
const xmlChar * SystemID)

Load and parse an external subset.

sax:the SAX handler block
ExternalID:a NAME* containing the External ID of the DTD
SystemID:a NAME* containing the URL to the DTD
Returns:the resulting xmlDtdPtr or NULL in case of error.

xmlSAXParseDoc ()

xmlDocPtr	xmlSAXParseDoc		(xmlSAXHandlerPtr sax, 
const xmlChar * cur,
int recovery)

parse an XML in-memory document and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

sax:the SAX handler block
cur:a pointer to an array of xmlChar
recovery:work in recovery mode, i.e. tries to read no Well Formed documents
Returns:the resulting document tree

xmlSAXParseEntity ()

xmlDocPtr	xmlSAXParseEntity	(xmlSAXHandlerPtr sax, 
const char * filename)

parse an XML external entity out of context and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk

sax:the SAX handler block
filename:the filename
Returns:the resulting document tree

xmlSAXParseFile ()

xmlDocPtr	xmlSAXParseFile		(xmlSAXHandlerPtr sax, 
const char * filename,
int recovery)

parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

sax:the SAX handler block
filename:the filename
recovery:work in recovery mode, i.e. tries to read no Well Formed documents
Returns:the resulting document tree

xmlSAXParseFileWithData ()

xmlDocPtr	xmlSAXParseFileWithData	(xmlSAXHandlerPtr sax, 
const char * filename,
int recovery,
void * data)

parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml

sax:the SAX handler block
filename:the filename
recovery:work in recovery mode, i.e. tries to read no Well Formed documents
data:the userdata
Returns:the resulting document tree

xmlSAXParseMemory ()

xmlDocPtr	xmlSAXParseMemory	(xmlSAXHandlerPtr sax, 
const char * buffer,
int size,
int recovery)

parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

sax:the SAX handler block
buffer:an pointer to a char array
size:the size of the array
recovery:work in recovery mode, i.e. tries to read not Well Formed documents
Returns:the resulting document tree

xmlSAXParseMemoryWithData ()

xmlDocPtr	xmlSAXParseMemoryWithData	(xmlSAXHandlerPtr sax, 
const char * buffer,
int size,
int recovery,
void * data)

parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml

sax:the SAX handler block
buffer:an pointer to a char array
size:the size of the array
recovery:work in recovery mode, i.e. tries to read no Well Formed documents
data:the userdata
Returns:the resulting document tree

xmlSAXUserParseFile ()

int	xmlSAXUserParseFile		(xmlSAXHandlerPtr sax, 
void * user_data,
const char * filename)

parse an XML file and call the given SAX handler routines. Automatic support for ZLIB/Compress compressed document is provided

sax:a SAX handler
user_data:The user data returned on SAX callbacks
filename:a file name
Returns:0 in case of success or a error number otherwise

xmlSAXUserParseMemory ()

int	xmlSAXUserParseMemory		(xmlSAXHandlerPtr sax, 
void * user_data,
const char * buffer,
int size)

A better SAX parsing routine. parse an XML in-memory buffer and call the given SAX handler routines.

sax:a SAX handler
user_data:The user data returned on SAX callbacks
buffer:an in-memory XML document input
size:the length of the XML document in bytes
Returns:0 in case of success or a error number otherwise

xmlSetExternalEntityLoader ()

void	xmlSetExternalEntityLoader	(xmlExternalEntityLoader f)

Changes the defaultexternal entity resolver function for the application

f:the new entity resolver function

xmlSetFeature ()

int	xmlSetFeature			(xmlParserCtxtPtr ctxt, 
const char * name,
void * value)

Change the current value of one feature of this parser instance

ctxt:an XML/HTML parser context
name:the feature name
value:pointer to the location of the new value
Returns:-1 in case or error, 0 otherwise

xmlSetupParserForBuffer ()

void	xmlSetupParserForBuffer		(xmlParserCtxtPtr ctxt, 
const xmlChar * buffer,
const char * filename)

Setup the parser context to parse a new buffer; Clears any prior contents from the parser context. The buffer parameter must not be NULL, but the filename parameter can be

ctxt:an XML parser context
buffer:a xmlChar * buffer
filename:a file name

xmlStopParser ()

void	xmlStopParser			(xmlParserCtxtPtr ctxt)

Blocks further parser processing

ctxt:an XML parser context


libxml2-2.9.1+dfsg1/doc/devhelp/general.html0000644000175000017500000001253612134171044017257 0ustar aronaron libxml2:

libxml2 API Modules

DOCBparser - old DocBook SGML parser
HTMLparser - interface for an HTML 4.0 non-verifying parser
HTMLtree - specific APIs to process HTML tree, especially serialization
SAX - Old SAX version 1 handler, deprecated
SAX2 - SAX2 parser interface used to build the DOM tree
c14n - Provide Canonical XML and Exclusive XML Canonicalization
catalog - interfaces to the Catalog handling system
chvalid - Unicode character range checking
debugXML - Tree debugging APIs
dict - string dictionnary
encoding - interface for the encoding conversion functions
entities - interface for the XML entities handling
globals - interface for all global variables of the library
hash - Chained hash tables
list - lists interfaces
nanoftp - minimal FTP implementation
nanohttp - minimal HTTP implementation
parser - the core parser module
parserInternals - internals routines and limits exported by the parser.
pattern - pattern expression handling
relaxng - implementation of the Relax-NG validation
schemasInternals - internal interfaces for XML Schemas
schematron - XML Schemastron implementation
threads - interfaces for thread handling
tree - interfaces for tree manipulation
uri - library of generic URI related routines
valid - The DTD validation
xinclude - implementation of XInclude
xlink - unfinished XLink detection module
xmlIO - interface for the I/O interfaces used by the parser
xmlautomata - API to build regexp automata
xmlerror - error handling
xmlexports - macros for marking symbols as exportable/importable.
xmlmemory - interface for the memory allocator
xmlmodule - dynamic module loading
xmlreader - the XMLReader implementation
xmlregexp - regular expressions handling
xmlsave - the XML document serializer
xmlschemas - incomplete XML Schemas structure implementation
xmlschemastypes - implementation of XML Schema Datatypes
xmlstring - set of routines to process strings
xmlunicode - Unicode character APIs
xmlversion - compile-time version informations
xmlwriter - text writing API for XML
xpath - XML Path Language implementation
xpathInternals - internal interfaces for XML Path Language implementation
xpointer - API to handle XML Pointers

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xpathInternals.html0000644000175000017500000043302112134171044022211 0ustar aronaron xpathInternals: internal interfaces for XML Path Language implementation

xpathInternals

xpathInternals - internal interfaces for XML Path Language implementation

internal interfaces for XML Path Language implementation used to build new modules on top of XPath like XPointer and XSLT

Author(s): Daniel Veillard

Synopsis

#define xmlXPathStackIsExternal(ctxt);
#define xmlXPathReturnEmptyString(ctxt);
#define XP_ERROR0(X);
#define xmlXPathSetTypeError(ctxt);
#define xmlXPathReturnEmptyNodeSet(ctxt);
#define xmlXPathReturnTrue(ctxt);
#define xmlXPathReturnBoolean(ctxt, val);
#define xmlXPathGetContextNode(ctxt);
#define CAST_TO_NUMBER;
#define CHECK_ARITY(x);
#define CHECK_TYPE0(typeval);
#define CAST_TO_STRING;
#define xmlXPathReturnExternal(ctxt, val);
#define xmlXPathStackIsNodeSet(ctxt);
#define xmlXPathCheckError(ctxt);
#define xmlXPathSetError(ctxt, err);
#define CHECK_ERROR;
#define xmlXPathReturnString(ctxt, str);
#define CAST_TO_BOOLEAN;
#define xmlXPathSetArityError(ctxt);
#define CHECK_TYPE(typeval);
#define xmlXPathReturnFalse(ctxt);
#define xmlXPathReturnNumber(ctxt, val);
#define CHECK_ERROR0;
#define xmlXPathGetDocument(ctxt);
#define xmlXPathGetError(ctxt);
#define XP_ERROR(X);
#define xmlXPathEmptyNodeSet(ns);
#define xmlXPathReturnNodeSet(ctxt, ns);
xmlNodeSetPtr	xmlXPathNodeSetMerge	(xmlNodeSetPtr val1, 
xmlNodeSetPtr val2); void xmlXPathNumberFunction (xmlXPathParserContextPtr ctxt,
int nargs); const xmlChar * xmlXPathNsLookup (xmlXPathContextPtr ctxt,
const xmlChar * prefix); xmlXPathObjectPtr xmlXPathNewNodeSet (xmlNodePtr val); xmlNodePtr xmlXPathNextAncestorOrSelf (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); void xmlXPathNodeSetRemove (xmlNodeSetPtr cur,
int val); xmlXPathObjectPtr xmlXPathNewNodeSetList (xmlNodeSetPtr val); int xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt); xmlXPathObjectPtr xmlXPathNewString (const xmlChar * val); xmlNodeSetPtr xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes,
xmlNodePtr node); xmlNodePtr xmlXPathNextChild (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); xmlNodePtr xmlXPathNextFollowingSibling (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); xmlChar * xmlXPathPopString (xmlXPathParserContextPtr ctxt); void xmlXPathNamespaceURIFunction (xmlXPathParserContextPtr ctxt,
int nargs); int xmlXPathCompareValues (xmlXPathParserContextPtr ctxt,
int inf,
int strict); void xmlXPathConcatFunction (xmlXPathParserContextPtr ctxt,
int nargs); int xmlXPathNodeSetContains (xmlNodeSetPtr cur,
xmlNodePtr val); void xmlXPatherror (xmlXPathParserContextPtr ctxt,
const char * file,
int line,
int no); xmlNodePtr xmlXPathNextAncestor (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); void xmlXPathBooleanFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathRoot (xmlXPathParserContextPtr ctxt); void xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt); int xmlXPathIsNodeType (const xmlChar * name); xmlNodePtr xmlXPathNextFollowing (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); void xmlXPathAddValues (xmlXPathParserContextPtr ctxt); int xmlXPathRegisterVariable (xmlXPathContextPtr ctxt,
const xmlChar * name,
xmlXPathObjectPtr value); xmlXPathObjectPtr valuePop (xmlXPathParserContextPtr ctxt); void xmlXPathCeilingFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlNodeSetPtr xmlXPathIntersection (xmlNodeSetPtr nodes1,
xmlNodeSetPtr nodes2); void xmlXPathContainsFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathNodeSetSort (xmlNodeSetPtr set); void xmlXPathStartsWithFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlNodeSetPtr xmlXPathNodeLeading (xmlNodeSetPtr nodes,
xmlNodePtr node); void xmlXPathSumFunction (xmlXPathParserContextPtr ctxt,
int nargs); int xmlXPathNotEqualValues (xmlXPathParserContextPtr ctxt); int xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt,
xmlXPathObjectPtr res); void xmlXPathErr (xmlXPathParserContextPtr ctxt,
int error); xmlNodePtr xmlXPathNextPreceding (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); xmlXPathFunction xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt,
const xmlChar * name,
const xmlChar * ns_uri); void xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt); void xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt); xmlXPathFunction xmlXPathFunctionLookup (xmlXPathContextPtr ctxt,
const xmlChar * name); void xmlXPathPositionFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathSubstringBeforeFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathRegisteredVariablesCleanup (xmlXPathContextPtr ctxt); xmlXPathObjectPtr xmlXPathNewFloat (double val); int xmlXPathRegisterNs (xmlXPathContextPtr ctxt,
const xmlChar * prefix,
const xmlChar * ns_uri); xmlNodePtr xmlXPathNextParent (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); void xmlXPathNodeSetFreeNs (xmlNsPtr ns); int xmlXPathHasSameNodes (xmlNodeSetPtr nodes1,
xmlNodeSetPtr nodes2); xmlNodeSetPtr xmlXPathDistinctSorted (xmlNodeSetPtr nodes); int valuePush (xmlXPathParserContextPtr ctxt,
xmlXPathObjectPtr value); void xmlXPathSubstringFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathStringFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathFloorFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathIdFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathLastFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathStringLengthFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlNodePtr xmlXPathNextSelf (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); void xmlXPathDebugDumpCompExpr (FILE * output,
xmlXPathCompExprPtr comp,
int depth); void xmlXPathFalseFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathValueFlipSign (xmlXPathParserContextPtr ctxt); void xmlXPathTranslateFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
xmlXPathFuncLookupFunc f,
void * funcCtxt); double xmlXPathPopNumber (xmlXPathParserContextPtr ctxt); void xmlXPathRoundFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlNodeSetPtr xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt); void xmlXPathCountFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlChar * xmlXPathParseNCName (xmlXPathParserContextPtr ctxt); void xmlXPathTrueFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlXPathObjectPtr xmlXPathNewBoolean (int val); void xmlXPathSubValues (xmlXPathParserContextPtr ctxt); int xmlXPathEqualValues (xmlXPathParserContextPtr ctxt); xmlNodeSetPtr xmlXPathTrailingSorted (xmlNodeSetPtr nodes1,
xmlNodeSetPtr nodes2); void xmlXPathMultValues (xmlXPathParserContextPtr ctxt); void xmlXPathModValues (xmlXPathParserContextPtr ctxt); xmlXPathParserContextPtr xmlXPathNewParserContext (const xmlChar * str,
xmlXPathContextPtr ctxt); xmlXPathObjectPtr xmlXPathWrapNodeSet (xmlNodeSetPtr val); xmlXPathObjectPtr xmlXPathWrapString (xmlChar * val); void xmlXPathLangFunction (xmlXPathParserContextPtr ctxt,
int nargs); int xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt,
const xmlChar * name,
const xmlChar * ns_uri,
xmlXPathFunction f); int xmlXPathNodeSetAddNs (xmlNodeSetPtr cur,
xmlNodePtr node,
xmlNsPtr ns); void xmlXPathLocalNameFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlNodeSetPtr xmlXPathDifference (xmlNodeSetPtr nodes1,
xmlNodeSetPtr nodes2); xmlNodeSetPtr xmlXPathLeadingSorted (xmlNodeSetPtr nodes1,
xmlNodeSetPtr nodes2); xmlNodePtr xmlXPathNextPrecedingSibling (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); void * xmlXPathPopExternal (xmlXPathParserContextPtr ctxt); void xmlXPathNormalizeFunction (xmlXPathParserContextPtr ctxt,
int nargs); void xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt,
xmlXPathVariableLookupFunc f,
void * data); void xmlXPathNodeSetDel (xmlNodeSetPtr cur,
xmlNodePtr val); xmlNodeSetPtr xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes,
xmlNodePtr node); xmlXPathObjectPtr xmlXPathNewCString (const char * val); int xmlXPathRegisterFunc (xmlXPathContextPtr ctxt,
const xmlChar * name,
xmlXPathFunction f); void xmlXPathSubstringAfterFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlNodePtr xmlXPathNextDescendant (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); xmlNodePtr xmlXPathNextNamespace (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); xmlXPathObjectPtr xmlXPathWrapCString (char * val); void xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt); xmlNodeSetPtr xmlXPathNodeTrailing (xmlNodeSetPtr nodes,
xmlNodePtr node); int xmlXPathNodeSetAdd (xmlNodeSetPtr cur,
xmlNodePtr val); int xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur,
xmlNodePtr val); xmlXPathObjectPtr xmlXPathNewValueTree (xmlNodePtr val); xmlNodeSetPtr xmlXPathDistinct (xmlNodeSetPtr nodes); xmlXPathObjectPtr xmlXPathVariableLookup (xmlXPathContextPtr ctxt,
const xmlChar * name); void xmlXPathNotFunction (xmlXPathParserContextPtr ctxt,
int nargs); double xmlXPathStringEvalNumber (const xmlChar * str); xmlNodePtr xmlXPathNextDescendantOrSelf (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); xmlXPathObjectPtr xmlXPathWrapExternal (void * val); xmlNodePtr xmlXPathNextAttribute (xmlXPathParserContextPtr ctxt,
xmlNodePtr cur); void xmlXPathDivValues (xmlXPathParserContextPtr ctxt); xmlXPathObjectPtr xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt,
const xmlChar * name,
const xmlChar * ns_uri); int xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt,
const xmlChar * name,
const xmlChar * ns_uri,
xmlXPathObjectPtr value); xmlNodeSetPtr xmlXPathTrailing (xmlNodeSetPtr nodes1,
xmlNodeSetPtr nodes2); void xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt); void xmlXPathDebugDumpObject (FILE * output,
xmlXPathObjectPtr cur,
int depth); xmlNodeSetPtr xmlXPathLeading (xmlNodeSetPtr nodes1,
xmlNodeSetPtr nodes2); xmlChar * xmlXPathParseName (xmlXPathParserContextPtr ctxt);

Description

Details

Macro CAST_TO_BOOLEAN

#define CAST_TO_BOOLEAN;

Macro to try to cast the value on the top of the XPath stack to a boolean.


Macro CAST_TO_NUMBER

#define CAST_TO_NUMBER;

Macro to try to cast the value on the top of the XPath stack to a number.


Macro CAST_TO_STRING

#define CAST_TO_STRING;

Macro to try to cast the value on the top of the XPath stack to a string.


Macro CHECK_ARITY

#define CHECK_ARITY(x);

Macro to check that the number of args passed to an XPath function matches.

x:the number of expected args

Macro CHECK_ERROR

#define CHECK_ERROR;

Macro to return from the function if an XPath error was detected.


Macro CHECK_ERROR0

#define CHECK_ERROR0;

Macro to return 0 from the function if an XPath error was detected.


Macro CHECK_TYPE

#define CHECK_TYPE(typeval);

Macro to check that the value on top of the XPath stack is of a given type.

typeval:the XPath type

Macro CHECK_TYPE0

#define CHECK_TYPE0(typeval);

Macro to check that the value on top of the XPath stack is of a given type. Return(0) in case of failure

typeval:the XPath type

Macro XP_ERROR

#define XP_ERROR(X);

Macro to raise an XPath error and return.

X:the error code

Macro XP_ERROR0

#define XP_ERROR0(X);

Macro to raise an XPath error and return 0.

X:the error code

Macro xmlXPathCheckError

#define xmlXPathCheckError(ctxt);

Check if an XPath error was raised. Returns true if an error has been raised, false otherwise.

ctxt:an XPath parser context

Macro xmlXPathEmptyNodeSet

#define xmlXPathEmptyNodeSet(ns);

Empties a node-set.

ns:a node-set

Macro xmlXPathGetContextNode

#define xmlXPathGetContextNode(ctxt);

Get the context node of an XPath context. Returns the context node.

ctxt:an XPath parser context

Macro xmlXPathGetDocument

#define xmlXPathGetDocument(ctxt);

Get the document of an XPath context. Returns the context document.

ctxt:an XPath parser context

Macro xmlXPathGetError

#define xmlXPathGetError(ctxt);

Get the error code of an XPath context. Returns the context error.

ctxt:an XPath parser context

Macro xmlXPathReturnBoolean

#define xmlXPathReturnBoolean(ctxt, val);

Pushes the boolean @val on the context stack.

ctxt:an XPath parser context
val:a boolean

Macro xmlXPathReturnEmptyNodeSet

#define xmlXPathReturnEmptyNodeSet(ctxt);

Pushes an empty node-set on the context stack.

ctxt:an XPath parser context

Macro xmlXPathReturnEmptyString

#define xmlXPathReturnEmptyString(ctxt);

Pushes an empty string on the stack.

ctxt:an XPath parser context

Macro xmlXPathReturnExternal

#define xmlXPathReturnExternal(ctxt, val);

Pushes user data on the context stack.

ctxt:an XPath parser context
val:user data

Macro xmlXPathReturnFalse

#define xmlXPathReturnFalse(ctxt);

Pushes false on the context stack.

ctxt:an XPath parser context

Macro xmlXPathReturnNodeSet

#define xmlXPathReturnNodeSet(ctxt, ns);

Pushes the node-set @ns on the context stack.

ctxt:an XPath parser context
ns:a node-set

Macro xmlXPathReturnNumber

#define xmlXPathReturnNumber(ctxt, val);

Pushes the double @val on the context stack.

ctxt:an XPath parser context
val:a double

Macro xmlXPathReturnString

#define xmlXPathReturnString(ctxt, str);

Pushes the string @str on the context stack.

ctxt:an XPath parser context
str:a string

Macro xmlXPathReturnTrue

#define xmlXPathReturnTrue(ctxt);

Pushes true on the context stack.

ctxt:an XPath parser context

Macro xmlXPathSetArityError

#define xmlXPathSetArityError(ctxt);

Raises an XPATH_INVALID_ARITY error.

ctxt:an XPath parser context

Macro xmlXPathSetError

#define xmlXPathSetError(ctxt, err);

Raises an error.

ctxt:an XPath parser context
err:an xmlXPathError code

Macro xmlXPathSetTypeError

#define xmlXPathSetTypeError(ctxt);

Raises an XPATH_INVALID_TYPE error.

ctxt:an XPath parser context

Macro xmlXPathStackIsExternal

#define xmlXPathStackIsExternal(ctxt);

Checks if the current value on the XPath stack is an external object. Returns true if the current object on the stack is an external object.

ctxt:an XPath parser context

Macro xmlXPathStackIsNodeSet

#define xmlXPathStackIsNodeSet(ctxt);

Check if the current value on the XPath stack is a node set or an XSLT value tree. Returns true if the current object on the stack is a node-set.

ctxt:an XPath parser context

valuePop ()

xmlXPathObjectPtr	valuePop	(xmlXPathParserContextPtr ctxt)

Pops the top XPath object from the value stack

ctxt:an XPath evaluation context
Returns:the XPath object just removed

valuePush ()

int	valuePush			(xmlXPathParserContextPtr ctxt, 
xmlXPathObjectPtr value)

Pushes a new XPath object on top of the value stack

ctxt:an XPath evaluation context
value:the XPath object
Returns:the number of items on the value stack

xmlXPathAddValues ()

void	xmlXPathAddValues		(xmlXPathParserContextPtr ctxt)

Implement the add operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.

ctxt:the XPath Parser context

xmlXPathBooleanFunction ()

void	xmlXPathBooleanFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the boolean() XPath function boolean boolean(object) The boolean function converts its argument to a boolean as follows: - a number is true if and only if it is neither positive or negative zero nor NaN - a node-set is true if and only if it is non-empty - a string is true if and only if its length is non-zero

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathCeilingFunction ()

void	xmlXPathCeilingFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the ceiling() XPath function number ceiling(number) The ceiling function returns the smallest (closest to negative infinity) number that is not less than the argument and that is an integer.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathCompareValues ()

int	xmlXPathCompareValues		(xmlXPathParserContextPtr ctxt, 
int inf,
int strict)

Implement the compare operation on XPath objects: @arg1 < @arg2 (1, 1, ... @arg1 <= @arg2 (1, 0, ... @arg1 > @arg2 (0, 1, ... @arg1 >= @arg2 (0, 0, ... When neither object to be compared is a node-set and the operator is <=, <, >=, >, then the objects are compared by converted both objects to numbers and comparing the numbers according to IEEE 754. The < comparison will be true if and only if the first number is less than the second number. The <= comparison will be true if and only if the first number is less than or equal to the second number. The > comparison will be true if and only if the first number is greater than the second number. The >= comparison will be true if and only if the first number is greater than or equal to the second number.

ctxt:the XPath Parser context
inf:less than (1) or greater than (0)
strict:is the comparison strict
Returns:1 if the comparison succeeded, 0 if it failed

xmlXPathConcatFunction ()

void	xmlXPathConcatFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the concat() XPath function string concat(string, string, string*) The concat function returns the concatenation of its arguments.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathContainsFunction ()

void	xmlXPathContainsFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the contains() XPath function boolean contains(string, string) The contains function returns true if the first argument string contains the second argument string, and otherwise returns false.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathCountFunction ()

void	xmlXPathCountFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the count() XPath function number count(node-set)

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathDebugDumpCompExpr ()

void	xmlXPathDebugDumpCompExpr	(FILE * output, 
xmlXPathCompExprPtr comp,
int depth)

Dumps the tree of the compiled XPath expression.

output:the FILE * for the output
comp:the precompiled XPath expression
depth:the indentation level.

xmlXPathDebugDumpObject ()

void	xmlXPathDebugDumpObject		(FILE * output, 
xmlXPathObjectPtr cur,
int depth)

Dump the content of the object for debugging purposes

output:the FILE * to dump the output
cur:the object to inspect
depth:indentation level

xmlXPathDifference ()

xmlNodeSetPtr	xmlXPathDifference	(xmlNodeSetPtr nodes1, 
xmlNodeSetPtr nodes2)

Implements the EXSLT - Sets difference() function: node-set set:difference (node-set, node-set)

nodes1:a node-set
nodes2:a node-set
Returns:the difference between the two node sets, or nodes1 if nodes2 is empty

xmlXPathDistinct ()

xmlNodeSetPtr	xmlXPathDistinct	(xmlNodeSetPtr nodes)

Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set) @nodes is sorted by document order, then #exslSetsDistinctSorted is called with the sorted node-set

nodes:a node-set
Returns:a subset of the nodes contained in @nodes, or @nodes if it is empty

xmlXPathDistinctSorted ()

xmlNodeSetPtr	xmlXPathDistinctSorted	(xmlNodeSetPtr nodes)

Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set)

nodes:a node-set, sorted by document order
Returns:a subset of the nodes contained in @nodes, or @nodes if it is empty

xmlXPathDivValues ()

void	xmlXPathDivValues		(xmlXPathParserContextPtr ctxt)

Implement the div operation on XPath objects @arg1 / @arg2: The numeric operators convert their operands to numbers as if by calling the number function.

ctxt:the XPath Parser context

xmlXPathEqualValues ()

int	xmlXPathEqualValues		(xmlXPathParserContextPtr ctxt)

Implement the equal operation on XPath objects content: @arg1 == @arg2

ctxt:the XPath Parser context
Returns:0 or 1 depending on the results of the test.

xmlXPathErr ()

void	xmlXPathErr			(xmlXPathParserContextPtr ctxt, 
int error)

Handle an XPath error

ctxt:a XPath parser context
error:the error code

xmlXPathEvalExpr ()

void	xmlXPathEvalExpr		(xmlXPathParserContextPtr ctxt)

Parse and evaluate an XPath expression in the given context, then push the result on the context stack

ctxt:the XPath Parser context

xmlXPathEvaluatePredicateResult ()

int	xmlXPathEvaluatePredicateResult	(xmlXPathParserContextPtr ctxt, 
xmlXPathObjectPtr res)

Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function.

ctxt:the XPath Parser context
res:the Predicate Expression evaluation result
Returns:1 if predicate is true, 0 otherwise

xmlXPathFalseFunction ()

void	xmlXPathFalseFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the false() XPath function boolean false()

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathFloorFunction ()

void	xmlXPathFloorFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the floor() XPath function number floor(number) The floor function returns the largest (closest to positive infinity) number that is not greater than the argument and that is an integer.

ctxt:the XPath Parser context
nargs:the number of arguments


xmlXPathFunctionLookup ()

xmlXPathFunction	xmlXPathFunctionLookup	(xmlXPathContextPtr ctxt, 
const xmlChar * name)

Search in the Function array of the context for the given function.

ctxt:the XPath context
name:the function name
Returns:the xmlXPathFunction or NULL if not found

xmlXPathFunctionLookupNS ()

xmlXPathFunction	xmlXPathFunctionLookupNS	(xmlXPathContextPtr ctxt, 
const xmlChar * name,
const xmlChar * ns_uri)

Search in the Function array of the context for the given function.

ctxt:the XPath context
name:the function name
ns_uri:the function namespace URI
Returns:the xmlXPathFunction or NULL if not found

xmlXPathHasSameNodes ()

int	xmlXPathHasSameNodes		(xmlNodeSetPtr nodes1, 
xmlNodeSetPtr nodes2)

Implements the EXSLT - Sets has-same-nodes function: boolean set:has-same-node(node-set, node-set)

nodes1:a node-set
nodes2:a node-set
Returns:true (1) if @nodes1 shares any node with @nodes2, false (0) otherwise

xmlXPathIdFunction ()

void	xmlXPathIdFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the id() XPath function node-set id(object) The id function selects elements by their unique ID (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, then the result is the union of the result of applying id to the string value of each of the nodes in the argument node-set. When the argument to id is of any other type, the argument is converted to a string as if by a call to the string function; the string is split into a whitespace-separated list of tokens (whitespace is any sequence of characters matching the production S); the result is a node-set containing the elements in the same document as the context node that have a unique ID equal to any of the tokens in the list.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathIntersection ()

xmlNodeSetPtr	xmlXPathIntersection	(xmlNodeSetPtr nodes1, 
xmlNodeSetPtr nodes2)

Implements the EXSLT - Sets intersection() function: node-set set:intersection (node-set, node-set)

nodes1:a node-set
nodes2:a node-set
Returns:a node set comprising the nodes that are within both the node sets passed as arguments

xmlXPathIsNodeType ()

int	xmlXPathIsNodeType		(const xmlChar * name)

Is the name given a NodeType one. [38] NodeType ::= 'comment' | 'text' | 'processing-instruction' | 'node'

name:a name string
Returns:1 if true 0 otherwise

xmlXPathLangFunction ()

void	xmlXPathLangFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the lang() XPath function boolean lang(string) The lang function returns true or false depending on whether the language of the context node as specified by xml:lang attributes is the same as or is a sublanguage of the language specified by the argument string. The language of the context node is determined by the value of the xml:lang attribute on the context node, or, if the context node has no xml:lang attribute, by the value of the xml:lang attribute on the nearest ancestor of the context node that has an xml:lang attribute. If there is no such attribute, then lang

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathLastFunction ()

void	xmlXPathLastFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the last() XPath function number last() The last function returns the number of nodes in the context node list.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathLeading ()

xmlNodeSetPtr	xmlXPathLeading		(xmlNodeSetPtr nodes1, 
xmlNodeSetPtr nodes2)

Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #exslSetsLeadingSorted is called.

nodes1:a node-set
nodes2:a node-set
Returns:the nodes in @nodes1 that precede the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

xmlXPathLeadingSorted ()

xmlNodeSetPtr	xmlXPathLeadingSorted	(xmlNodeSetPtr nodes1, 
xmlNodeSetPtr nodes2)

Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set)

nodes1:a node-set, sorted by document order
nodes2:a node-set, sorted by document order
Returns:the nodes in @nodes1 that precede the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

xmlXPathLocalNameFunction ()

void	xmlXPathLocalNameFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the local-name() XPath function string local-name(node-set?) The local-name function returns a string containing the local part of the name of the node in the argument node-set that is first in document order. If the node-set is empty or the first node has no name, an empty string is returned. If the argument is omitted it defaults to the context node.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathModValues ()

void	xmlXPathModValues		(xmlXPathParserContextPtr ctxt)

Implement the mod operation on XPath objects: @arg1 / @arg2 The numeric operators convert their operands to numbers as if by calling the number function.

ctxt:the XPath Parser context

xmlXPathMultValues ()

void	xmlXPathMultValues		(xmlXPathParserContextPtr ctxt)

Implement the multiply operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.

ctxt:the XPath Parser context

xmlXPathNamespaceURIFunction ()

void	xmlXPathNamespaceURIFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the namespace-uri() XPath function string namespace-uri(node-set?) The namespace-uri function returns a string containing the namespace URI of the expanded name of the node in the argument node-set that is first in document order. If the node-set is empty, the first node has no name, or the expanded name has no namespace URI, an empty string is returned. If the argument is omitted it defaults to the context node.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathNewBoolean ()

xmlXPathObjectPtr	xmlXPathNewBoolean	(int val)

Create a new xmlXPathObjectPtr of type boolean and of value @val

val:the boolean value
Returns:the newly created object.

xmlXPathNewCString ()

xmlXPathObjectPtr	xmlXPathNewCString	(const char * val)

Create a new xmlXPathObjectPtr of type string and of value @val

val:the char * value
Returns:the newly created object.

xmlXPathNewFloat ()

xmlXPathObjectPtr	xmlXPathNewFloat	(double val)

Create a new xmlXPathObjectPtr of type double and of value @val

val:the double value
Returns:the newly created object.

xmlXPathNewNodeSet ()

xmlXPathObjectPtr	xmlXPathNewNodeSet	(xmlNodePtr val)

Create a new xmlXPathObjectPtr of type NodeSet and initialize it with the single Node @val

val:the NodePtr value
Returns:the newly created object.

xmlXPathNewNodeSetList ()

xmlXPathObjectPtr	xmlXPathNewNodeSetList	(xmlNodeSetPtr val)

Create a new xmlXPathObjectPtr of type NodeSet and initialize it with the Nodeset @val

val:an existing NodeSet
Returns:the newly created object.

xmlXPathNewParserContext ()

xmlXPathParserContextPtr	xmlXPathNewParserContext	(const xmlChar * str, 
xmlXPathContextPtr ctxt)

Create a new xmlXPathParserContext

str:the XPath expression
ctxt:the XPath context
Returns:the xmlXPathParserContext just allocated.

xmlXPathNewString ()

xmlXPathObjectPtr	xmlXPathNewString	(const xmlChar * val)

Create a new xmlXPathObjectPtr of type string and of value @val

val:the xmlChar * value
Returns:the newly created object.

xmlXPathNewValueTree ()

xmlXPathObjectPtr	xmlXPathNewValueTree	(xmlNodePtr val)

Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize it with the tree root @val

val:the NodePtr value
Returns:the newly created object.

xmlXPathNextAncestor ()

xmlNodePtr	xmlXPathNextAncestor	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "ancestor" direction the ancestor axis contains the ancestors of the context node; the ancestors of the context node consist of the parent of context node and the parent's parent and so on; the nodes are ordered in reverse document order; thus the parent is the first node on the axis, and the parent's parent is the second node on the axis

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextAncestorOrSelf ()

xmlNodePtr	xmlXPathNextAncestorOrSelf	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "ancestor-or-self" direction he ancestor-or-self axis contains the context node and ancestors of the context node in reverse document order; thus the context node is the first node on the axis, and the context node's parent the second; parent here is defined the same as with the parent axis.

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextAttribute ()

xmlNodePtr	xmlXPathNextAttribute	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "attribute" direction TODO: support DTD inherited default attributes

ctxt:the XPath Parser context
cur:the current attribute in the traversal
Returns:the next element following that axis

xmlXPathNextChild ()

xmlNodePtr	xmlXPathNextChild	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "child" direction The child axis contains the children of the context node in document order.

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextDescendant ()

xmlNodePtr	xmlXPathNextDescendant	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "descendant" direction the descendant axis contains the descendants of the context node in document order; a descendant is a child or a child of a child and so on.

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextDescendantOrSelf ()

xmlNodePtr	xmlXPathNextDescendantOrSelf	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "descendant-or-self" direction the descendant-or-self axis contains the context node and the descendants of the context node in document order; thus the context node is the first node on the axis, and the first child of the context node is the second node on the axis

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextFollowing ()

xmlNodePtr	xmlXPathNextFollowing	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "following" direction The following axis contains all nodes in the same document as the context node that are after the context node in document order, excluding any descendants and excluding attribute nodes and namespace nodes; the nodes are ordered in document order

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextFollowingSibling ()

xmlNodePtr	xmlXPathNextFollowingSibling	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "following-sibling" direction The following-sibling axis contains the following siblings of the context node in document order.

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextNamespace ()

xmlNodePtr	xmlXPathNextNamespace	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "namespace" direction the namespace axis contains the namespace nodes of the context node; the order of nodes on this axis is implementation-defined; the axis will be empty unless the context node is an element We keep the XML namespace node at the end of the list.

ctxt:the XPath Parser context
cur:the current attribute in the traversal
Returns:the next element following that axis

xmlXPathNextParent ()

xmlNodePtr	xmlXPathNextParent	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "parent" direction The parent axis contains the parent of the context node, if there is one.

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextPreceding ()

xmlNodePtr	xmlXPathNextPreceding	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "preceding" direction the preceding axis contains all nodes in the same document as the context node that are before the context node in document order, excluding any ancestors and excluding attribute nodes and namespace nodes; the nodes are ordered in reverse document order

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextPrecedingSibling ()

xmlNodePtr	xmlXPathNextPrecedingSibling	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "preceding-sibling" direction The preceding-sibling axis contains the preceding siblings of the context node in reverse document order; the first preceding sibling is first on the axis; the sibling preceding that node is the second on the axis and so on.

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNextSelf ()

xmlNodePtr	xmlXPathNextSelf	(xmlXPathParserContextPtr ctxt, 
xmlNodePtr cur)

Traversal function for the "self" direction The self axis contains just the context node itself

ctxt:the XPath Parser context
cur:the current node in the traversal
Returns:the next element following that axis

xmlXPathNodeLeading ()

xmlNodeSetPtr	xmlXPathNodeLeading	(xmlNodeSetPtr nodes, 
xmlNodePtr node)

Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes is sorted by document order, then #exslSetsNodeLeadingSorted is called.

nodes:a node-set
node:a node
Returns:the nodes in @nodes that precede @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

xmlXPathNodeLeadingSorted ()

xmlNodeSetPtr	xmlXPathNodeLeadingSorted	(xmlNodeSetPtr nodes, 
xmlNodePtr node)

Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set)

nodes:a node-set, sorted by document order
node:a node
Returns:the nodes in @nodes that precede @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

xmlXPathNodeSetAdd ()

int	xmlXPathNodeSetAdd		(xmlNodeSetPtr cur, 
xmlNodePtr val)

add a new xmlNodePtr to an existing NodeSet

cur:the initial node set
val:a new xmlNodePtr
Returns:0 in case of success, and -1 in case of error

xmlXPathNodeSetAddNs ()

int	xmlXPathNodeSetAddNs		(xmlNodeSetPtr cur, 
xmlNodePtr node,
xmlNsPtr ns)

add a new namespace node to an existing NodeSet

cur:the initial node set
node:the hosting node
ns:a the namespace node
Returns:0 in case of success and -1 in case of error

xmlXPathNodeSetAddUnique ()

int	xmlXPathNodeSetAddUnique	(xmlNodeSetPtr cur, 
xmlNodePtr val)

add a new xmlNodePtr to an existing NodeSet, optimized version when we are sure the node is not already in the set.

cur:the initial node set
val:a new xmlNodePtr
Returns:0 in case of success and -1 in case of failure

xmlXPathNodeSetContains ()

int	xmlXPathNodeSetContains		(xmlNodeSetPtr cur, 
xmlNodePtr val)

checks whether @cur contains @val

cur:the node-set
val:the node
Returns:true (1) if @cur contains @val, false (0) otherwise

xmlXPathNodeSetDel ()

void	xmlXPathNodeSetDel		(xmlNodeSetPtr cur, 
xmlNodePtr val)

Removes an xmlNodePtr from an existing NodeSet

cur:the initial node set
val:an xmlNodePtr

xmlXPathNodeSetFreeNs ()

void	xmlXPathNodeSetFreeNs		(xmlNsPtr ns)

Namespace nodes in libxml don't match the XPath semantic. In a node set the namespace nodes are duplicated and the next pointer is set to the parent node in the XPath semantic. Check if such a node needs to be freed

ns:the XPath namespace node found in a nodeset.

xmlXPathNodeSetMerge ()

xmlNodeSetPtr	xmlXPathNodeSetMerge	(xmlNodeSetPtr val1, 
xmlNodeSetPtr val2)

Merges two nodesets, all nodes from @val2 are added to @val1 if @val1 is NULL, a new set is created and copied from @val2

val1:the first NodeSet or NULL
val2:the second NodeSet
Returns:@val1 once extended or NULL in case of error.

xmlXPathNodeSetRemove ()

void	xmlXPathNodeSetRemove		(xmlNodeSetPtr cur, 
int val)

Removes an entry from an existing NodeSet list.

cur:the initial node set
val:the index to remove

xmlXPathNodeSetSort ()

void	xmlXPathNodeSetSort		(xmlNodeSetPtr set)

Sort the node set in document order

set:the node set

xmlXPathNodeTrailing ()

xmlNodeSetPtr	xmlXPathNodeTrailing	(xmlNodeSetPtr nodes, 
xmlNodePtr node)

Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted is called.

nodes:a node-set
node:a node
Returns:the nodes in @nodes that follow @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

xmlXPathNodeTrailingSorted ()

xmlNodeSetPtr	xmlXPathNodeTrailingSorted	(xmlNodeSetPtr nodes, 
xmlNodePtr node)

Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set)

nodes:a node-set, sorted by document order
node:a node
Returns:the nodes in @nodes that follow @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

xmlXPathNormalizeFunction ()

void	xmlXPathNormalizeFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the normalize-space() XPath function string normalize-space(string?) The normalize-space function returns the argument string with white space normalized by stripping leading and trailing whitespace and replacing sequences of whitespace characters by a single space. Whitespace characters are the same allowed by the S production in XML. If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathNotEqualValues ()

int	xmlXPathNotEqualValues		(xmlXPathParserContextPtr ctxt)

Implement the equal operation on XPath objects content: @arg1 == @arg2

ctxt:the XPath Parser context
Returns:0 or 1 depending on the results of the test.

xmlXPathNotFunction ()

void	xmlXPathNotFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the not() XPath function boolean not(boolean) The not function returns true if its argument is false, and false otherwise.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathNsLookup ()

const xmlChar *	xmlXPathNsLookup	(xmlXPathContextPtr ctxt, 
const xmlChar * prefix)

Search in the namespace declaration array of the context for the given namespace name associated to the given prefix

ctxt:the XPath context
prefix:the namespace prefix value
Returns:the value or NULL if not found

xmlXPathNumberFunction ()

void	xmlXPathNumberFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the number() XPath function number number(object?)

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathParseNCName ()

xmlChar *	xmlXPathParseNCName	(xmlXPathParserContextPtr ctxt)

parse an XML namespace non qualified name. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender

ctxt:the XPath Parser context
Returns:the namespace name or NULL

xmlXPathParseName ()

xmlChar *	xmlXPathParseName	(xmlXPathParserContextPtr ctxt)

parse an XML name [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)*

ctxt:the XPath Parser context
Returns:the namespace name or NULL

xmlXPathPopBoolean ()

int	xmlXPathPopBoolean		(xmlXPathParserContextPtr ctxt)

Pops a boolean from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

ctxt:an XPath parser context
Returns:the boolean

xmlXPathPopExternal ()

void *	xmlXPathPopExternal		(xmlXPathParserContextPtr ctxt)

Pops an external object from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

ctxt:an XPath parser context
Returns:the object

xmlXPathPopNodeSet ()

xmlNodeSetPtr	xmlXPathPopNodeSet	(xmlXPathParserContextPtr ctxt)

Pops a node-set from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

ctxt:an XPath parser context
Returns:the node-set

xmlXPathPopNumber ()

double	xmlXPathPopNumber		(xmlXPathParserContextPtr ctxt)

Pops a number from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

ctxt:an XPath parser context
Returns:the number

xmlXPathPopString ()

xmlChar *	xmlXPathPopString	(xmlXPathParserContextPtr ctxt)

Pops a string from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

ctxt:an XPath parser context
Returns:the string

xmlXPathPositionFunction ()

void	xmlXPathPositionFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the position() XPath function number position() The position function returns the position of the context node in the context node list. The first position is 1, and so the last position will be equal to last().

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathRegisterAllFunctions ()

void	xmlXPathRegisterAllFunctions	(xmlXPathContextPtr ctxt)

Registers all default XPath functions in this context

ctxt:the XPath context

xmlXPathRegisterFunc ()

int	xmlXPathRegisterFunc		(xmlXPathContextPtr ctxt, 
const xmlChar * name,
xmlXPathFunction f)

Register a new function. If @f is NULL it unregisters the function

ctxt:the XPath context
name:the function name
f:the function implementation or NULL
Returns:0 in case of success, -1 in case of error

xmlXPathRegisterFuncLookup ()

void	xmlXPathRegisterFuncLookup	(xmlXPathContextPtr ctxt, 
xmlXPathFuncLookupFunc f,
void * funcCtxt)

Registers an external mechanism to do function lookup.

ctxt:the XPath context
f:the lookup function
funcCtxt:the lookup data

xmlXPathRegisterFuncNS ()

int	xmlXPathRegisterFuncNS		(xmlXPathContextPtr ctxt, 
const xmlChar * name,
const xmlChar * ns_uri,
xmlXPathFunction f)

Register a new function. If @f is NULL it unregisters the function

ctxt:the XPath context
name:the function name
ns_uri:the function namespace URI
f:the function implementation or NULL
Returns:0 in case of success, -1 in case of error

xmlXPathRegisterNs ()

int	xmlXPathRegisterNs		(xmlXPathContextPtr ctxt, 
const xmlChar * prefix,
const xmlChar * ns_uri)

Register a new namespace. If @ns_uri is NULL it unregisters the namespace

ctxt:the XPath context
prefix:the namespace prefix cannot be NULL or empty string
ns_uri:the namespace name
Returns:0 in case of success, -1 in case of error

xmlXPathRegisterVariable ()

int	xmlXPathRegisterVariable	(xmlXPathContextPtr ctxt, 
const xmlChar * name,
xmlXPathObjectPtr value)

Register a new variable value. If @value is NULL it unregisters the variable

ctxt:the XPath context
name:the variable name
value:the variable value or NULL
Returns:0 in case of success, -1 in case of error

xmlXPathRegisterVariableLookup ()

void	xmlXPathRegisterVariableLookup	(xmlXPathContextPtr ctxt, 
xmlXPathVariableLookupFunc f,
void * data)

register an external mechanism to do variable lookup

ctxt:the XPath context
f:the lookup function
data:the lookup data

xmlXPathRegisterVariableNS ()

int	xmlXPathRegisterVariableNS	(xmlXPathContextPtr ctxt, 
const xmlChar * name,
const xmlChar * ns_uri,
xmlXPathObjectPtr value)

Register a new variable value. If @value is NULL it unregisters the variable

ctxt:the XPath context
name:the variable name
ns_uri:the variable namespace URI
value:the variable value or NULL
Returns:0 in case of success, -1 in case of error

xmlXPathRegisteredFuncsCleanup ()

void	xmlXPathRegisteredFuncsCleanup	(xmlXPathContextPtr ctxt)

Cleanup the XPath context data associated to registered functions

ctxt:the XPath context

xmlXPathRegisteredNsCleanup ()

void	xmlXPathRegisteredNsCleanup	(xmlXPathContextPtr ctxt)

Cleanup the XPath context data associated to registered variables

ctxt:the XPath context

xmlXPathRegisteredVariablesCleanup ()

void	xmlXPathRegisteredVariablesCleanup	(xmlXPathContextPtr ctxt)

Cleanup the XPath context data associated to registered variables

ctxt:the XPath context

xmlXPathRoot ()

void	xmlXPathRoot			(xmlXPathParserContextPtr ctxt)

Initialize the context to the root of the document

ctxt:the XPath Parser context

xmlXPathRoundFunction ()

void	xmlXPathRoundFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the round() XPath function number round(number) The round function returns the number that is closest to the argument and that is an integer. If there are two such numbers, then the one that is even is returned.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathStartsWithFunction ()

void	xmlXPathStartsWithFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the starts-with() XPath function boolean starts-with(string, string) The starts-with function returns true if the first argument string starts with the second argument string, and otherwise returns false.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathStringEvalNumber ()

double	xmlXPathStringEvalNumber	(const xmlChar * str)

[30a] Float ::= Number ('e' Digits?)? [30] Number ::= Digits ('.' Digits?)? | '.' Digits [31] Digits ::= [0-9]+ Compile a Number in the string In complement of the Number expression, this function also handles negative values : '-' Number.

str:A string to scan
Returns:the double value.

xmlXPathStringFunction ()

void	xmlXPathStringFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the string() XPath function string string(object?) The string function converts an object to a string as follows: - A node-set is converted to a string by returning the value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned. - A number is converted to a string as follows + NaN is converted to the string NaN + positive zero is converted to the string 0 + negative zero is converted to the string 0 + positive infinity is converted to the string Infinity + negative infinity is converted to the string -Infinity + if the number is an integer, the number is represented in decimal form as a Number with no decimal point and no leading zeros, preceded by a minus sign (-) if the number is negative + otherwise, the number is represented in decimal form as a Number including a decimal point with at least one digit before the decimal point and at least one digit after the decimal point, preceded by a minus sign (-) if the number is negative; there must be no leading zeros before the decimal point apart possibly from the one required digit immediately before the decimal point; beyond the one required digit after the decimal point there must be as many, but only as many, more digits as are needed to uniquely distinguish the number from all other IEEE 754 numeric values. - The boolean false value is converted to the string false. The boolean true value is converted to the string true. If the argument is omitted, it defaults to a node-set with the context node as its only member.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathStringLengthFunction ()

void	xmlXPathStringLengthFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the string-length() XPath function number string-length(string?) The string-length returns the number of characters in the string (see [3.6 Strings]). If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathSubValues ()

void	xmlXPathSubValues		(xmlXPathParserContextPtr ctxt)

Implement the subtraction operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.

ctxt:the XPath Parser context

xmlXPathSubstringAfterFunction ()

void	xmlXPathSubstringAfterFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the substring-after() XPath function string substring-after(string, string) The substring-after function returns the substring of the first argument string that follows the first occurrence of the second argument string in the first argument string, or the empty stringi if the first argument string does not contain the second argument string. For example, substring-after("1999/04/01","/") returns 04/01, and substring-after("1999/04/01","19") returns 99/04/01.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathSubstringBeforeFunction ()

void	xmlXPathSubstringBeforeFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the substring-before() XPath function string substring-before(string, string) The substring-before function returns the substring of the first argument string that precedes the first occurrence of the second argument string in the first argument string, or the empty string if the first argument string does not contain the second argument string. For example, substring-before("1999/04/01","/") returns 1999.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathSubstringFunction ()

void	xmlXPathSubstringFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the substring() XPath function string substring(string, number, number?) The substring function returns the substring of the first argument starting at the position specified in the second argument with length specified in the third argument. For example, substring("12345",2,3) returns "234". If the third argument is not specified, it returns the substring starting at the position specified in the second argument and continuing to the end of the string. For example, substring("12345",2) returns "2345". More precisely, each character in the string (see [3.6 Strings]) is considered to have a numeric position: the position of the first character is 1, the position of the second character is 2 and so on. The returned substring contains those characters for which the position of the character is greater than or equal to the second argument and, if the third argument is specified, less than the sum of the second and third arguments; the comparisons and addition used for the above follow the standard IEEE 754 rules. Thus: - substring("12345", 1.5, 2.6) returns "234" - substring("12345", 0, 3) returns "12" - substring("12345", 0 div 0, 3) returns "" - substring("12345", 1, 0 div 0) returns "" - substring("12345", -42, 1 div 0) returns "12345" - substring("12345", -1 div 0, 1 div 0) returns ""

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathSumFunction ()

void	xmlXPathSumFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the sum() XPath function number sum(node-set) The sum function returns the sum of the values of the nodes in the argument node-set.

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathTrailing ()

xmlNodeSetPtr	xmlXPathTrailing	(xmlNodeSetPtr nodes1, 
xmlNodeSetPtr nodes2)

Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #xmlXPathTrailingSorted is called.

nodes1:a node-set
nodes2:a node-set
Returns:the nodes in @nodes1 that follow the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

xmlXPathTrailingSorted ()

xmlNodeSetPtr	xmlXPathTrailingSorted	(xmlNodeSetPtr nodes1, 
xmlNodeSetPtr nodes2)

Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set)

nodes1:a node-set, sorted by document order
nodes2:a node-set, sorted by document order
Returns:the nodes in @nodes1 that follow the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

xmlXPathTranslateFunction ()

void	xmlXPathTranslateFunction	(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the translate() XPath function string translate(string, string, string) The translate function returns the first argument string with occurrences of characters in the second argument string replaced by the character at the corresponding position in the third argument string. For example, translate("bar","abc","ABC") returns the string BAr. If there is a character in the second argument string with no character at a corresponding position in the third argument string (because the second argument string is longer than the third argument string), then occurrences of that character in the first argument string are removed. For example, translate("--aaa--","abc-","ABC")

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathTrueFunction ()

void	xmlXPathTrueFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the true() XPath function boolean true()

ctxt:the XPath Parser context
nargs:the number of arguments

xmlXPathValueFlipSign ()

void	xmlXPathValueFlipSign		(xmlXPathParserContextPtr ctxt)

Implement the unary - operation on an XPath object The numeric operators convert their operands to numbers as if by calling the number function.

ctxt:the XPath Parser context

xmlXPathVariableLookup ()

xmlXPathObjectPtr	xmlXPathVariableLookup	(xmlXPathContextPtr ctxt, 
const xmlChar * name)

Search in the Variable array of the context for the given variable value.

ctxt:the XPath context
name:the variable name
Returns:a copy of the value or NULL if not found

xmlXPathVariableLookupNS ()

xmlXPathObjectPtr	xmlXPathVariableLookupNS	(xmlXPathContextPtr ctxt, 
const xmlChar * name,
const xmlChar * ns_uri)

Search in the Variable array of the context for the given variable value.

ctxt:the XPath context
name:the variable name
ns_uri:the variable namespace URI
Returns:the a copy of the value or NULL if not found

xmlXPathWrapCString ()

xmlXPathObjectPtr	xmlXPathWrapCString	(char * val)

Wraps a string into an XPath object.

val:the char * value
Returns:the newly created object.

xmlXPathWrapExternal ()

xmlXPathObjectPtr	xmlXPathWrapExternal	(void * val)

Wraps the @val data into an XPath object.

val:the user data
Returns:the newly created object.

xmlXPathWrapNodeSet ()

xmlXPathObjectPtr	xmlXPathWrapNodeSet	(xmlNodeSetPtr val)

Wrap the Nodeset @val in a new xmlXPathObjectPtr

val:the NodePtr value
Returns:the newly created object.

xmlXPathWrapString ()

xmlXPathObjectPtr	xmlXPathWrapString	(xmlChar * val)

Wraps the @val string into an XPath object.

val:the xmlChar * value
Returns:the newly created object.

xmlXPatherror ()

void	xmlXPatherror			(xmlXPathParserContextPtr ctxt, 
const char * file,
int line,
int no)

Formats an error message.

ctxt:the XPath Parser context
file:the file name
line:the line number
no:the error number

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-nanoftp.html0000644000175000017500000005360312134171044020656 0ustar aronaron nanoftp: minimal FTP implementation

nanoftp

nanoftp - minimal FTP implementation

minimal FTP implementation allowing to fetch resources like external subset.

Author(s): Daniel Veillard

Synopsis

#define INVALID_SOCKET;
#define SOCKET;
int	xmlNanoFTPQuit			(void * ctx);
int	xmlNanoFTPClose			(void * ctx);
typedef void ftpListCallback			(void * userData, 
const char * filename,
const char * attrib,
const char * owner,
const char * group,
unsigned long size,
int links,
int year,
const char * month,
int day,
int hour,
int minute); int xmlNanoFTPCloseConnection (void * ctx); void xmlNanoFTPProxy (const char * host,
int port,
const char * user,
const char * passwd,
int type); int xmlNanoFTPUpdateURL (void * ctx,
const char * URL); SOCKET xmlNanoFTPGetConnection (void * ctx); int xmlNanoFTPDele (void * ctx,
const char * file); void * xmlNanoFTPNewCtxt (const char * URL); int xmlNanoFTPCheckResponse (void * ctx); void xmlNanoFTPScanProxy (const char * URL); typedef void ftpDataCallback (void * userData,
const char * data,
int len); int xmlNanoFTPGetResponse (void * ctx); int xmlNanoFTPCwd (void * ctx,
const char * directory); void xmlNanoFTPInit (void); void * xmlNanoFTPConnectTo (const char * server,
int port); int xmlNanoFTPList (void * ctx,
ftpListCallback callback,
void * userData,
const char * filename); void * xmlNanoFTPOpen (const char * URL); int xmlNanoFTPConnect (void * ctx); SOCKET xmlNanoFTPGetSocket (void * ctx,
const char * filename); int xmlNanoFTPGet (void * ctx,
ftpDataCallback callback,
void * userData,
const char * filename); int xmlNanoFTPRead (void * ctx,
void * dest,
int len); void xmlNanoFTPFreeCtxt (void * ctx); void xmlNanoFTPCleanup (void);

Description

Details

Macro INVALID_SOCKET

#define INVALID_SOCKET;

macro used to provide portability of code to windows sockets the value to be used when the socket is not valid


Macro SOCKET

#define SOCKET;

macro used to provide portability of code to windows sockets


Function type ftpDataCallback

void	ftpDataCallback			(void * userData, 
const char * data,
int len)

A callback for the xmlNanoFTPGet command.

userData:the user provided context
data:the data received
len:its size in bytes

Function type ftpListCallback

void	ftpListCallback			(void * userData, 
const char * filename,
const char * attrib,
const char * owner,
const char * group,
unsigned long size,
int links,
int year,
const char * month,
int day,
int hour,
int minute)

A callback for the xmlNanoFTPList command. Note that only one of year and day:minute are specified.

userData:user provided data for the callback
filename:the file name (including "->" when links are shown)
attrib:the attribute string
owner:the owner string
group:the group string
size:the file size
links:the link count
year:the year
month:the month
day:the day
hour:the hour
minute:the minute










xmlNanoFTPGet ()

int	xmlNanoFTPGet			(void * ctx, 
ftpDataCallback callback,
void * userData,
const char * filename)

Fetch the given file from the server. All data are passed back in the callbacks. The last callback has a size of 0 block.

ctx:an FTP context
callback:the user callback
userData:the user callback data
filename:the file to retrieve
Returns:-1 incase of error, 0 otherwise

xmlNanoFTPGetConnection ()

SOCKET	xmlNanoFTPGetConnection		(void * ctx)

Try to open a data connection to the server. Currently only passive mode is supported.

ctx:an FTP context
Returns:-1 incase of error, 0 otherwise


xmlNanoFTPGetSocket ()

SOCKET	xmlNanoFTPGetSocket		(void * ctx, 
const char * filename)

Initiate fetch of the given file from the server.

ctx:an FTP context
filename:the file to retrieve (or NULL if path is in context).
Returns:the socket for the data connection, or <0 in case of error


xmlNanoFTPList ()

int	xmlNanoFTPList			(void * ctx, 
ftpListCallback callback,
void * userData,
const char * filename)

Do a listing on the server. All files info are passed back in the callbacks.

ctx:an FTP context
callback:the user callback
userData:the user callback data
filename:optional files to list
Returns:-1 incase of error, 0 otherwise








libxml2-2.9.1+dfsg1/doc/devhelp/right.png0000644000175000017500000000073011234335462016576 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2 I%Á=eIDATxœ­”!oÂ@†Ÿ.'**M0$ÄÁ$¿?1~¢vIeEuLlÉ&–Ô4‚ä Í¶B»Ý›œ¹|÷>ï—ûî …$ݶ©oc<”´ÑA©¤×€X’ò schematron: XML Schemastron implementation

schematron

schematron - XML Schemastron implementation

interface to the XML Schematron validity checking.

Author(s): Daniel Veillard

Description

Details

Structure xmlSchematron

struct _xmlSchematron {
The content of this structure is not made public by the API.
} xmlSchematron;


Structure xmlSchematronParserCtxt

struct _xmlSchematronParserCtxt {
The content of this structure is not made public by the API.
} xmlSchematronParserCtxt;


Typedef xmlSchematronParserCtxtPtr

xmlSchematronParserCtxt * xmlSchematronParserCtxtPtr;


Typedef xmlSchematronPtr

xmlSchematron * xmlSchematronPtr;


Structure xmlSchematronValidCtxt

struct _xmlSchematronValidCtxt {
The content of this structure is not made public by the API.
} xmlSchematronValidCtxt;


Typedef xmlSchematronValidCtxtPtr

xmlSchematronValidCtxt * xmlSchematronValidCtxtPtr;


Enum xmlSchematronValidOptions

enum xmlSchematronValidOptions {
    XML_SCHEMATRON_OUT_QUIET = 1 /* quiet no report */
    XML_SCHEMATRON_OUT_TEXT = 2 /* build a textual report */
    XML_SCHEMATRON_OUT_XML = 4 /* output SVRL */
    XML_SCHEMATRON_OUT_ERROR = 8 /* output via xmlStructuredErrorFunc */
    XML_SCHEMATRON_OUT_FILE = 256 /* output to a file descriptor */
    XML_SCHEMATRON_OUT_BUFFER = 512 /* output to a buffer */
    XML_SCHEMATRON_OUT_IO = 1024 /*  output to I/O mechanism */
};




xmlSchematronFree ()

void	xmlSchematronFree		(xmlSchematronPtr schema)

Deallocate a Schematron structure.

schema:a schema structure

xmlSchematronFreeParserCtxt ()

void	xmlSchematronFreeParserCtxt	(xmlSchematronParserCtxtPtr ctxt)

Free the resources associated to the schema parser context

ctxt:the schema parser context

xmlSchematronFreeValidCtxt ()

void	xmlSchematronFreeValidCtxt	(xmlSchematronValidCtxtPtr ctxt)

Free the resources associated to the schema validation context

ctxt:the schema validation context

xmlSchematronNewDocParserCtxt ()

xmlSchematronParserCtxtPtr	xmlSchematronNewDocParserCtxt	(xmlDocPtr doc)

Create an XML Schematrons parse context for that document. NB. The document may be modified during the parsing process.

doc:a preparsed document tree
Returns:the parser context or NULL in case of error

xmlSchematronNewMemParserCtxt ()

xmlSchematronParserCtxtPtr	xmlSchematronNewMemParserCtxt	(const char * buffer, 
int size)

Create an XML Schematrons parse context for that memory buffer expected to contain an XML Schematrons file.

buffer:a pointer to a char array containing the schemas
size:the size of the array
Returns:the parser context or NULL in case of error

xmlSchematronNewParserCtxt ()

xmlSchematronParserCtxtPtr	xmlSchematronNewParserCtxt	(const char * URL)

Create an XML Schematrons parse context for that file/resource expected to contain an XML Schematrons file.

URL:the location of the schema
Returns:the parser context or NULL in case of error

xmlSchematronNewValidCtxt ()

xmlSchematronValidCtxtPtr	xmlSchematronNewValidCtxt	(xmlSchematronPtr schema, 
int options)

Create an XML Schematrons validation context based on the given schema.

schema:a precompiled XML Schematrons
options:a set of xmlSchematronValidOptions
Returns:the validation context or NULL in case of error

xmlSchematronParse ()

xmlSchematronPtr	xmlSchematronParse	(xmlSchematronParserCtxtPtr ctxt)

parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances.

ctxt:a schema validation context
Returns:the internal XML Schematron structure built from the resource or NULL in case of error

xmlSchematronSetValidStructuredErrors ()

void	xmlSchematronSetValidStructuredErrors	(xmlSchematronValidCtxtPtr ctxt, 
xmlStructuredErrorFunc serror,
void * ctx)

Set the structured error callback

ctxt:a Schematron validation context
serror:the structured error function
ctx:the functions context

xmlSchematronValidateDoc ()

int	xmlSchematronValidateDoc	(xmlSchematronValidCtxtPtr ctxt, 
xmlDocPtr instance)

Validate a tree instance against the schematron

ctxt:the schema validation context
instance:the document instace tree
Returns:0 in case of success, -1 in case of internal error and an error count otherwise.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-debugXML.html0000644000175000017500000010104512134171043020651 0ustar aronaron debugXML: Tree debugging APIs

debugXML

debugXML - Tree debugging APIs

Interfaces to a set of routines used for debugging the tree produced by the XML parser.

Author(s): Daniel Veillard

Synopsis

typedef struct _xmlShellCtxt xmlShellCtxt;
typedef xmlShellCtxt * xmlShellCtxtPtr;
void	xmlDebugDumpAttrList		(FILE * output, 
xmlAttrPtr attr,
int depth); void xmlLsOneNode (FILE * output,
xmlNodePtr node); typedef char * xmlShellReadlineFunc (char * prompt); int xmlShellSave (xmlShellCtxtPtr ctxt,
char * filename,
xmlNodePtr node,
xmlNodePtr node2); const char * xmlBoolToText (int boolval); int xmlShellWrite (xmlShellCtxtPtr ctxt,
char * filename,
xmlNodePtr node,
xmlNodePtr node2); int xmlShellDu (xmlShellCtxtPtr ctxt,
char * arg,
xmlNodePtr tree,
xmlNodePtr node2); int xmlShellValidate (xmlShellCtxtPtr ctxt,
char * dtd,
xmlNodePtr node,
xmlNodePtr node2); int xmlDebugCheckDocument (FILE * output,
xmlDocPtr doc); void xmlShellPrintXPathResult (xmlXPathObjectPtr list); typedef int xmlShellCmd (xmlShellCtxtPtr ctxt,
char * arg,
xmlNodePtr node,
xmlNodePtr node2); int xmlShellLoad (xmlShellCtxtPtr ctxt,
char * filename,
xmlNodePtr node,
xmlNodePtr node2); void xmlDebugDumpString (FILE * output,
const xmlChar * str); int xmlShellBase (xmlShellCtxtPtr ctxt,
char * arg,
xmlNodePtr node,
xmlNodePtr node2); int xmlShellCat (xmlShellCtxtPtr ctxt,
char * arg,
xmlNodePtr node,
xmlNodePtr node2); void xmlDebugDumpDTD (FILE * output,
xmlDtdPtr dtd); void xmlDebugDumpNode (FILE * output,
xmlNodePtr node,
int depth); void xmlDebugDumpEntities (FILE * output,
xmlDocPtr doc); void xmlShellPrintNode (xmlNodePtr node); int xmlShellPwd (xmlShellCtxtPtr ctxt,
char * buffer,
xmlNodePtr node,
xmlNodePtr node2); void xmlDebugDumpNodeList (FILE * output,
xmlNodePtr node,
int depth); void xmlDebugDumpAttr (FILE * output,
xmlAttrPtr attr,
int depth); void xmlDebugDumpDocument (FILE * output,
xmlDocPtr doc); int xmlLsCountNode (xmlNodePtr node); void xmlShellPrintXPathError (int errorType,
const char * arg); int xmlShellDir (xmlShellCtxtPtr ctxt,
char * arg,
xmlNodePtr node,
xmlNodePtr node2); void xmlDebugDumpOneNode (FILE * output,
xmlNodePtr node,
int depth); int xmlShellList (xmlShellCtxtPtr ctxt,
char * arg,
xmlNodePtr node,
xmlNodePtr node2); void xmlDebugDumpDocumentHead (FILE * output,
xmlDocPtr doc); void xmlShell (xmlDocPtr doc,
char * filename,
xmlShellReadlineFunc input,
FILE * output);

Description

Details

Structure xmlShellCtxt

struct _xmlShellCtxt {
    char *	filename
    xmlDocPtr	doc
    xmlNodePtr	node
    xmlXPathContextPtr	pctxt
    int	loaded
    FILE *	output
    xmlShellReadlineFunc	input
} xmlShellCtxt;


Typedef xmlShellCtxtPtr

xmlShellCtxt * xmlShellCtxtPtr;


Function type xmlShellCmd

int	xmlShellCmd			(xmlShellCtxtPtr ctxt, 
char * arg,
xmlNodePtr node,
xmlNodePtr node2)

This is a generic signature for the XML shell functions.

ctxt:a shell context
arg:a string argument
node:a first node
node2:a second node
Returns:an int, negative returns indicating errors.



xmlDebugCheckDocument ()

int	xmlDebugCheckDocument		(FILE * output, 
xmlDocPtr doc)

Check the document for potential content problems, and output the errors to @output

output:the FILE * for the output
doc:the document
Returns:the number of errors found

xmlDebugDumpAttr ()

void	xmlDebugDumpAttr		(FILE * output, 
xmlAttrPtr attr,
int depth)

Dumps debug information for the attribute

output:the FILE * for the output
attr:the attribute
depth:the indentation level.

xmlDebugDumpAttrList ()

void	xmlDebugDumpAttrList		(FILE * output, 
xmlAttrPtr attr,
int depth)

Dumps debug information for the attribute list

output:the FILE * for the output
attr:the attribute list
depth:the indentation level.

xmlDebugDumpDTD ()

void	xmlDebugDumpDTD			(FILE * output, 
xmlDtdPtr dtd)

Dumps debug information for the DTD

output:the FILE * for the output
dtd:the DTD

xmlDebugDumpDocument ()

void	xmlDebugDumpDocument		(FILE * output, 
xmlDocPtr doc)

Dumps debug information for the document, it's recursive

output:the FILE * for the output
doc:the document

xmlDebugDumpDocumentHead ()

void	xmlDebugDumpDocumentHead	(FILE * output, 
xmlDocPtr doc)

Dumps debug information cncerning the document, not recursive

output:the FILE * for the output
doc:the document

xmlDebugDumpEntities ()

void	xmlDebugDumpEntities		(FILE * output, 
xmlDocPtr doc)

Dumps debug information for all the entities in use by the document

output:the FILE * for the output
doc:the document

xmlDebugDumpNode ()

void	xmlDebugDumpNode		(FILE * output, 
xmlNodePtr node,
int depth)

Dumps debug information for the element node, it is recursive

output:the FILE * for the output
node:the node
depth:the indentation level.

xmlDebugDumpNodeList ()

void	xmlDebugDumpNodeList		(FILE * output, 
xmlNodePtr node,
int depth)

Dumps debug information for the list of element node, it is recursive

output:the FILE * for the output
node:the node list
depth:the indentation level.

xmlDebugDumpOneNode ()

void	xmlDebugDumpOneNode		(FILE * output, 
xmlNodePtr node,
int depth)

Dumps debug information for the element node, it is not recursive

output:the FILE * for the output
node:the node
depth:the indentation level.

xmlDebugDumpString ()

void	xmlDebugDumpString		(FILE * output, 
const
xmlChar * str)

Dumps informations about the string, shorten it if necessary

output:the FILE * for the output
str:the string

xmlLsCountNode ()

int	xmlLsCountNode			(xmlNodePtr node)

Count the children of @node.

node:the node to count
Returns:the number of children of @node.

xmlLsOneNode ()

void	xmlLsOneNode			(FILE * output, 
xmlNodePtr node)

Dump to @output the type and name of @node.

output:the FILE * for the output
node:the node to dump

xmlShell ()

void	xmlShell			(xmlDocPtr doc, 
char * filename,
xmlShellReadlineFunc input,
FILE * output)

Implements the XML shell This allow to load, validate, view, modify and save a document using a environment similar to a UNIX commandline.

doc:the initial document
filename:the output buffer
input:the line reading function
output:the output FILE*, defaults to stdout if NULL

xmlShellBase ()

int	xmlShellBase			(xmlShellCtxtPtr ctxt, 
char * arg,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "base" dumps the current XML base of the node

ctxt:the shell context
arg:unused
node:a node
node2:unused
Returns:0

xmlShellCat ()

int	xmlShellCat			(xmlShellCtxtPtr ctxt, 
char * arg,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "cat" dumps the serialization node content (XML or HTML).

ctxt:the shell context
arg:unused
node:a node
node2:unused
Returns:0

xmlShellDir ()

int	xmlShellDir			(xmlShellCtxtPtr ctxt, 
char * arg,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "dir" dumps informations about the node (namespace, attributes, content).

ctxt:the shell context
arg:unused
node:a node
node2:unused
Returns:0

xmlShellDu ()

int	xmlShellDu			(xmlShellCtxtPtr ctxt, 
char * arg,
xmlNodePtr tree,
xmlNodePtr node2)

Implements the XML shell function "du" show the structure of the subtree under node @tree If @tree is null, the command works on the current node.

ctxt:the shell context
arg:unused
tree:a node defining a subtree
node2:unused
Returns:0 or -1 in case of error

xmlShellList ()

int	xmlShellList			(xmlShellCtxtPtr ctxt, 
char * arg,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "ls" Does an Unix like listing of the given node (like a directory)

ctxt:the shell context
arg:unused
node:a node
node2:unused
Returns:0

xmlShellLoad ()

int	xmlShellLoad			(xmlShellCtxtPtr ctxt, 
char * filename,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "load" loads a new document specified by the filename

ctxt:the shell context
filename:the file name
node:unused
node2:unused
Returns:0 or -1 if loading failed

xmlShellPrintNode ()

void	xmlShellPrintNode		(xmlNodePtr node)

Print node to the output FILE

node:a non-null node to print to the output FILE


xmlShellPrintXPathResult ()

void	xmlShellPrintXPathResult	(xmlXPathObjectPtr list)

Prints result to the output FILE

list:a valid result generated by an xpath evaluation

xmlShellPwd ()

int	xmlShellPwd			(xmlShellCtxtPtr ctxt, 
char * buffer,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "pwd" Show the full path from the root to the node, if needed building thumblers when similar elements exists at a given ancestor level. The output is compatible with XPath commands.

ctxt:the shell context
buffer:the output buffer
node:a node
node2:unused
Returns:0 or -1 in case of error

xmlShellSave ()

int	xmlShellSave			(xmlShellCtxtPtr ctxt, 
char * filename,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "save" Write the current document to the filename, or it's original name

ctxt:the shell context
filename:the file name (optional)
node:unused
node2:unused
Returns:0 or -1 in case of error

xmlShellValidate ()

int	xmlShellValidate		(xmlShellCtxtPtr ctxt, 
char * dtd,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "validate" Validate the document, if a DTD path is provided, then the validation is done against the given DTD.

ctxt:the shell context
dtd:the DTD URI (optional)
node:unused
node2:unused
Returns:0 or -1 in case of error

xmlShellWrite ()

int	xmlShellWrite			(xmlShellCtxtPtr ctxt, 
char * filename,
xmlNodePtr node,
xmlNodePtr node2)

Implements the XML shell function "write" Write the current node to the filename, it saves the serialization of the subtree under the @node specified

ctxt:the shell context
filename:the file name
node:a node in the tree
node2:unused
Returns:0 or -1 in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlexports.html0000644000175000017500000000700112134171044021425 0ustar aronaron xmlexports: macros for marking symbols as exportable/importable.

xmlexports

xmlexports - macros for marking symbols as exportable/importable.

macros for marking symbols as exportable/importable.

Author(s): Igor Zlatovic <igor@zlatkovic.com>

Synopsis

#define _REENTRANT;
#define XMLCDECL;
#define XMLPUBVAR;
#define LIBXML_DLL_IMPORT;
#define XMLCALL;
#define XMLPUBFUN;

Description

Details

Macro LIBXML_DLL_IMPORT

#define LIBXML_DLL_IMPORT;


Macro XMLCALL

#define XMLCALL;


Macro XMLCDECL

#define XMLCDECL;


Macro XMLPUBFUN

#define XMLPUBFUN;


Macro XMLPUBVAR

#define XMLPUBVAR;


Macro _REENTRANT

#define _REENTRANT;


libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlreader.html0000644000175000017500000032307512134171044021177 0ustar aronaron xmlreader: the XMLReader implementation

xmlreader

xmlreader - the XMLReader implementation

API of the XML streaming API based on C# interfaces.

Author(s): Daniel Veillard

Synopsis

typedef xmlTextReader * xmlTextReaderPtr;
typedef enum xmlParserSeverities;
typedef enum xmlParserProperties;
typedef enum xmlTextReaderMode;
typedef struct _xmlTextReader xmlTextReader;
typedef void * xmlTextReaderLocatorPtr;
typedef enum xmlReaderTypes;
xmlTextReaderPtr	xmlNewTextReaderFilename	(const char * URI);
int	xmlTextReaderHasAttributes	(xmlTextReaderPtr reader);
int	xmlTextReaderReadState		(xmlTextReaderPtr reader);
xmlTextReaderPtr	xmlReaderForFile	(const char * filename, 
const char * encoding,
int options); const xmlChar * xmlTextReaderConstNamespaceUri (xmlTextReaderPtr reader); xmlDocPtr xmlTextReaderCurrentDoc (xmlTextReaderPtr reader); int xmlTextReaderGetParserLineNumber (xmlTextReaderPtr reader); xmlNodePtr xmlTextReaderExpand (xmlTextReaderPtr reader); xmlChar * xmlTextReaderXmlLang (xmlTextReaderPtr reader); xmlTextReaderPtr xmlReaderForDoc (const xmlChar * cur,
const char * URL,
const char * encoding,
int options); int xmlReaderNewIO (xmlTextReaderPtr reader,
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options); int xmlTextReaderClose (xmlTextReaderPtr reader); xmlChar * xmlTextReaderReadInnerXml (xmlTextReaderPtr reader); const xmlChar * xmlTextReaderConstEncoding (xmlTextReaderPtr reader); int xmlTextReaderNormalization (xmlTextReaderPtr reader); int xmlTextReaderGetParserProp (xmlTextReaderPtr reader,
int prop); int xmlTextReaderMoveToAttribute (xmlTextReaderPtr reader,
const xmlChar * name); int xmlTextReaderQuoteChar (xmlTextReaderPtr reader); int xmlTextReaderSetSchema (xmlTextReaderPtr reader,
xmlSchemaPtr schema); xmlChar * xmlTextReaderValue (xmlTextReaderPtr reader); int xmlTextReaderIsValid (xmlTextReaderPtr reader); int xmlTextReaderMoveToFirstAttribute (xmlTextReaderPtr reader); int xmlTextReaderGetParserColumnNumber (xmlTextReaderPtr reader); const xmlChar * xmlTextReaderConstValue (xmlTextReaderPtr reader); xmlTextReaderPtr xmlNewTextReader (xmlParserInputBufferPtr input,
const char * URI); xmlChar * xmlTextReaderGetAttributeNo (xmlTextReaderPtr reader,
int no); xmlChar * xmlTextReaderGetAttributeNs (xmlTextReaderPtr reader,
const xmlChar * localName,
const xmlChar * namespaceURI); const xmlChar * xmlTextReaderConstName (xmlTextReaderPtr reader); const xmlChar * xmlTextReaderConstString (xmlTextReaderPtr reader,
const xmlChar * str); const xmlChar * xmlTextReaderConstXmlVersion (xmlTextReaderPtr reader); int xmlTextReaderDepth (xmlTextReaderPtr reader); xmlChar * xmlTextReaderReadString (xmlTextReaderPtr reader); int xmlTextReaderIsDefault (xmlTextReaderPtr reader); int xmlTextReaderMoveToNextAttribute (xmlTextReaderPtr reader); int xmlReaderNewWalker (xmlTextReaderPtr reader,
xmlDocPtr doc); const xmlChar * xmlTextReaderConstPrefix (xmlTextReaderPtr reader); xmlTextReaderPtr xmlReaderWalker (xmlDocPtr doc); const xmlChar * xmlTextReaderConstLocalName (xmlTextReaderPtr reader); int xmlTextReaderNodeType (xmlTextReaderPtr reader); void xmlFreeTextReader (xmlTextReaderPtr reader); xmlChar * xmlTextReaderName (xmlTextReaderPtr reader); int xmlTextReaderRead (xmlTextReaderPtr reader); int xmlTextReaderIsEmptyElement (xmlTextReaderPtr reader); int xmlReaderNewMemory (xmlTextReaderPtr reader,
const char * buffer,
int size,
const char * URL,
const char * encoding,
int options); int xmlTextReaderSchemaValidateCtxt (xmlTextReaderPtr reader,
xmlSchemaValidCtxtPtr ctxt,
int options); int xmlTextReaderHasValue (xmlTextReaderPtr reader); const xmlChar * xmlTextReaderConstBaseUri (xmlTextReaderPtr reader); xmlChar * xmlTextReaderBaseUri (xmlTextReaderPtr reader); int xmlTextReaderMoveToAttributeNo (xmlTextReaderPtr reader,
int no); int xmlTextReaderLocatorLineNumber (xmlTextReaderLocatorPtr locator); int xmlTextReaderMoveToAttributeNs (xmlTextReaderPtr reader,
const xmlChar * localName,
const xmlChar * namespaceURI); int xmlTextReaderNext (xmlTextReaderPtr reader); int xmlTextReaderAttributeCount (xmlTextReaderPtr reader); xmlChar * xmlTextReaderLookupNamespace (xmlTextReaderPtr reader,
const xmlChar * prefix); int xmlTextReaderMoveToElement (xmlTextReaderPtr reader); xmlTextReaderPtr xmlReaderForIO (xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options); xmlChar * xmlTextReaderReadOuterXml (xmlTextReaderPtr reader); int xmlTextReaderRelaxNGValidateCtxt (xmlTextReaderPtr reader,
xmlRelaxNGValidCtxtPtr ctxt,
int options); xmlChar * xmlTextReaderPrefix (xmlTextReaderPtr reader); int xmlTextReaderReadAttributeValue (xmlTextReaderPtr reader); int xmlTextReaderNextSibling (xmlTextReaderPtr reader); typedef void xmlTextReaderErrorFunc (void * arg,
const char * msg,
xmlParserSeverities severity,
xmlTextReaderLocatorPtr locator); xmlTextReaderPtr xmlReaderForFd (int fd,
const char * URL,
const char * encoding,
int options); xmlChar * xmlTextReaderGetAttribute (xmlTextReaderPtr reader,
const xmlChar * name); xmlChar * xmlTextReaderLocalName (xmlTextReaderPtr reader); xmlNodePtr xmlTextReaderPreserve (xmlTextReaderPtr reader); xmlNodePtr xmlTextReaderCurrentNode (xmlTextReaderPtr reader); int xmlTextReaderSetParserProp (xmlTextReaderPtr reader,
int prop,
int value); xmlParserInputBufferPtr xmlTextReaderGetRemainder (xmlTextReaderPtr reader); void xmlTextReaderSetErrorHandler (xmlTextReaderPtr reader,
xmlTextReaderErrorFunc f,
void * arg); int xmlTextReaderIsNamespaceDecl (xmlTextReaderPtr reader); int xmlReaderNewDoc (xmlTextReaderPtr reader,
const xmlChar * cur,
const char * URL,
const char * encoding,
int options); int xmlTextReaderPreservePattern (xmlTextReaderPtr reader,
const xmlChar * pattern,
const xmlChar ** namespaces); const xmlChar * xmlTextReaderConstXmlLang (xmlTextReaderPtr reader); void xmlTextReaderGetErrorHandler (xmlTextReaderPtr reader,
xmlTextReaderErrorFunc * f,
void ** arg); void xmlTextReaderSetStructuredErrorHandler (xmlTextReaderPtr reader,
xmlStructuredErrorFunc f,
void * arg); int xmlReaderNewFile (xmlTextReaderPtr reader,
const char * filename,
const char * encoding,
int options); int xmlTextReaderRelaxNGSetSchema (xmlTextReaderPtr reader,
xmlRelaxNGPtr schema); int xmlReaderNewFd (xmlTextReaderPtr reader,
int fd,
const char * URL,
const char * encoding,
int options); int xmlTextReaderRelaxNGValidate (xmlTextReaderPtr reader,
const char * rng); xmlTextReaderPtr xmlReaderForMemory (const char * buffer,
int size,
const char * URL,
const char * encoding,
int options); int xmlTextReaderSetup (xmlTextReaderPtr reader,
xmlParserInputBufferPtr input,
const char * URL,
const char * encoding,
int options); long xmlTextReaderByteConsumed (xmlTextReaderPtr reader); xmlChar * xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator); xmlChar * xmlTextReaderNamespaceUri (xmlTextReaderPtr reader); int xmlTextReaderSchemaValidate (xmlTextReaderPtr reader,
const char * xsd); int xmlTextReaderStandalone (xmlTextReaderPtr reader);

Description

Details




Structure xmlTextReader

struct _xmlTextReader {
The content of this structure is not made public by the API.
} xmlTextReader;


Typedef xmlTextReaderLocatorPtr

void * xmlTextReaderLocatorPtr;



Typedef xmlTextReaderPtr

xmlTextReader * xmlTextReaderPtr;

Pointer to an xmlReader context.


Function type xmlTextReaderErrorFunc

void	xmlTextReaderErrorFunc		(void * arg, 
const char * msg,
xmlParserSeverities severity,
xmlTextReaderLocatorPtr locator)

Signature of an error callback from a reader parser

arg:the user argument
msg:the message
severity:the severity of the error
locator:a locator indicating where the error occured

xmlFreeTextReader ()

void	xmlFreeTextReader		(xmlTextReaderPtr reader)

Deallocate all the resources associated to the reader

reader:the xmlTextReaderPtr

xmlNewTextReader ()

xmlTextReaderPtr	xmlNewTextReader	(xmlParserInputBufferPtr input, 
const char * URI)

Create an xmlTextReader structure fed with @input

input:the xmlParserInputBufferPtr used to read data
URI:the URI information for the source if available
Returns:the new xmlTextReaderPtr or NULL in case of error

xmlNewTextReaderFilename ()

xmlTextReaderPtr	xmlNewTextReaderFilename	(const char * URI)

Create an xmlTextReader structure fed with the resource at @URI

URI:the URI of the resource to process
Returns:the new xmlTextReaderPtr or NULL in case of error

xmlReaderForDoc ()

xmlTextReaderPtr	xmlReaderForDoc	(const xmlChar * cur, 
const char * URL,
const char * encoding,
int options)

Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption.

cur:a pointer to a zero terminated string
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the new reader or NULL in case of error.

xmlReaderForFd ()

xmlTextReaderPtr	xmlReaderForFd	(int fd, 
const char * URL,
const char * encoding,
int options)

Create an xmltextReader for an XML from a file descriptor. The parsing flags @options are a combination of xmlParserOption. NOTE that the file descriptor will not be closed when the reader is closed or reset.

fd:an open file descriptor
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the new reader or NULL in case of error.

xmlReaderForFile ()

xmlTextReaderPtr	xmlReaderForFile	(const char * filename, 
const char * encoding,
int options)

parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption.

filename:a file or URL
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the new reader or NULL in case of error.

xmlReaderForIO ()

xmlTextReaderPtr	xmlReaderForIO	(xmlInputReadCallback ioread, 
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options)

Create an xmltextReader for an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption.

ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the new reader or NULL in case of error.

xmlReaderForMemory ()

xmlTextReaderPtr	xmlReaderForMemory	(const char * buffer, 
int size,
const char * URL,
const char * encoding,
int options)

Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption.

buffer:a pointer to a char array
size:the size of the array
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:the new reader or NULL in case of error.

xmlReaderNewDoc ()

int	xmlReaderNewDoc			(xmlTextReaderPtr reader, 
const xmlChar * cur,
const char * URL,
const char * encoding,
int options)

Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

reader:an XML reader
cur:a pointer to a zero terminated string
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:0 in case of success and -1 in case of error

xmlReaderNewFd ()

int	xmlReaderNewFd			(xmlTextReaderPtr reader, 
int fd,
const char * URL,
const char * encoding,
int options)

Setup an xmltextReader to parse an XML from a file descriptor. NOTE that the file descriptor will not be closed when the reader is closed or reset. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

reader:an XML reader
fd:an open file descriptor
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:0 in case of success and -1 in case of error

xmlReaderNewFile ()

int	xmlReaderNewFile		(xmlTextReaderPtr reader, 
const char * filename,
const char * encoding,
int options)

parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

reader:an XML reader
filename:a file or URL
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:0 in case of success and -1 in case of error

xmlReaderNewIO ()

int	xmlReaderNewIO			(xmlTextReaderPtr reader, 
xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
const char * URL,
const char * encoding,
int options)

Setup an xmltextReader to parse an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

reader:an XML reader
ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:0 in case of success and -1 in case of error

xmlReaderNewMemory ()

int	xmlReaderNewMemory		(xmlTextReaderPtr reader, 
const char * buffer,
int size,
const char * URL,
const char * encoding,
int options)

Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

reader:an XML reader
buffer:a pointer to a char array
size:the size of the array
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:0 in case of success and -1 in case of error

xmlReaderNewWalker ()

int	xmlReaderNewWalker		(xmlTextReaderPtr reader, 
xmlDocPtr doc)

Setup an xmltextReader to parse a preparsed XML document. This reuses the existing @reader xmlTextReader.

reader:an XML reader
doc:a preparsed document
Returns:0 in case of success and -1 in case of error

xmlReaderWalker ()

xmlTextReaderPtr	xmlReaderWalker	(xmlDocPtr doc)

Create an xmltextReader for a preparsed document.

doc:a preparsed document
Returns:the new reader or NULL in case of error.

xmlTextReaderAttributeCount ()

int	xmlTextReaderAttributeCount	(xmlTextReaderPtr reader)

Provides the number of attributes of the current node

reader:the xmlTextReaderPtr used
Returns:0 i no attributes, -1 in case of error or the attribute count

xmlTextReaderBaseUri ()

xmlChar *	xmlTextReaderBaseUri	(xmlTextReaderPtr reader)

The base URI of the node.

reader:the xmlTextReaderPtr used
Returns:the base URI or NULL if not available, if non NULL it need to be freed by the caller.

xmlTextReaderByteConsumed ()

long	xmlTextReaderByteConsumed	(xmlTextReaderPtr reader)

This function provides the current index of the parser used by the reader, relative to the start of the current entity. This function actually just wraps a call to xmlBytesConsumed() for the parser context associated with the reader. See xmlBytesConsumed() for more information.

reader:an XML reader
Returns:the index in bytes from the beginning of the entity or -1 in case the index could not be computed.

xmlTextReaderClose ()

int	xmlTextReaderClose		(xmlTextReaderPtr reader)

This method releases any resources allocated by the current instance changes the state to Closed and close any underlying input.

reader:the xmlTextReaderPtr used
Returns:0 or -1 in case of error

xmlTextReaderConstBaseUri ()

const xmlChar *	xmlTextReaderConstBaseUri	(xmlTextReaderPtr reader)

The base URI of the node.

reader:the xmlTextReaderPtr used
Returns:the base URI or NULL if not available, the string will be deallocated with the reader

xmlTextReaderConstEncoding ()

const xmlChar *	xmlTextReaderConstEncoding	(xmlTextReaderPtr reader)

Determine the encoding of the document being read.

reader:the xmlTextReaderPtr used
Returns:a string containing the encoding of the document or NULL in case of error. The string is deallocated with the reader.

xmlTextReaderConstLocalName ()

const xmlChar *	xmlTextReaderConstLocalName	(xmlTextReaderPtr reader)

The local name of the node.

reader:the xmlTextReaderPtr used
Returns:the local name or NULL if not available, the string will be deallocated with the reader.

xmlTextReaderConstName ()

const xmlChar *	xmlTextReaderConstName	(xmlTextReaderPtr reader)

The qualified name of the node, equal to Prefix :LocalName.

reader:the xmlTextReaderPtr used
Returns:the local name or NULL if not available, the string is deallocated with the reader.

xmlTextReaderConstNamespaceUri ()

const xmlChar *	xmlTextReaderConstNamespaceUri	(xmlTextReaderPtr reader)

The URI defining the namespace associated with the node.

reader:the xmlTextReaderPtr used
Returns:the namespace URI or NULL if not available, the string will be deallocated with the reader

xmlTextReaderConstPrefix ()

const xmlChar *	xmlTextReaderConstPrefix	(xmlTextReaderPtr reader)

A shorthand reference to the namespace associated with the node.

reader:the xmlTextReaderPtr used
Returns:the prefix or NULL if not available, the string is deallocated with the reader.

xmlTextReaderConstString ()

const xmlChar *	xmlTextReaderConstString	(xmlTextReaderPtr reader, 
const xmlChar * str)

Get an interned string from the reader, allows for example to speedup string name comparisons

reader:the xmlTextReaderPtr used
str:the string to intern.
Returns:an interned copy of the string or NULL in case of error. The string will be deallocated with the reader.

xmlTextReaderConstValue ()

const xmlChar *	xmlTextReaderConstValue	(xmlTextReaderPtr reader)

Provides the text value of the node if present

reader:the xmlTextReaderPtr used
Returns:the string or NULL if not available. The result will be deallocated on the next Read() operation.

xmlTextReaderConstXmlLang ()

const xmlChar *	xmlTextReaderConstXmlLang	(xmlTextReaderPtr reader)

The xml:lang scope within which the node resides.

reader:the xmlTextReaderPtr used
Returns:the xml:lang value or NULL if none exists.

xmlTextReaderConstXmlVersion ()

const xmlChar *	xmlTextReaderConstXmlVersion	(xmlTextReaderPtr reader)

Determine the XML version of the document being read.

reader:the xmlTextReaderPtr used
Returns:a string containing the XML version of the document or NULL in case of error. The string is deallocated with the reader.

xmlTextReaderCurrentDoc ()

xmlDocPtr	xmlTextReaderCurrentDoc	(xmlTextReaderPtr reader)

Hacking interface allowing to get the xmlDocPtr correponding to the current document being accessed by the xmlTextReader. NOTE: as a result of this call, the reader will not destroy the associated XML document and calling xmlFreeDoc() on the result is needed once the reader parsing has finished.

reader:the xmlTextReaderPtr used
Returns:the xmlDocPtr or NULL in case of error.

xmlTextReaderCurrentNode ()

xmlNodePtr	xmlTextReaderCurrentNode	(xmlTextReaderPtr reader)

Hacking interface allowing to get the xmlNodePtr correponding to the current node being accessed by the xmlTextReader. This is dangerous because the underlying node may be destroyed on the next Reads.

reader:the xmlTextReaderPtr used
Returns:the xmlNodePtr or NULL in case of error.

xmlTextReaderDepth ()

int	xmlTextReaderDepth		(xmlTextReaderPtr reader)

The depth of the node in the tree.

reader:the xmlTextReaderPtr used
Returns:the depth or -1 in case of error

xmlTextReaderExpand ()

xmlNodePtr	xmlTextReaderExpand	(xmlTextReaderPtr reader)

Reads the contents of the current node and the full subtree. It then makes the subtree available until the next xmlTextReaderRead() call

reader:the xmlTextReaderPtr used
Returns:a node pointer valid until the next xmlTextReaderRead() call or NULL in case of error.

xmlTextReaderGetAttribute ()

xmlChar *	xmlTextReaderGetAttribute	(xmlTextReaderPtr reader, 
const xmlChar * name)

Provides the value of the attribute with the specified qualified name.

reader:the xmlTextReaderPtr used
name:the qualified name of the attribute.
Returns:a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.

xmlTextReaderGetAttributeNo ()

xmlChar *	xmlTextReaderGetAttributeNo	(xmlTextReaderPtr reader, 
int no)

Provides the value of the attribute with the specified index relative to the containing element.

reader:the xmlTextReaderPtr used
no:the zero-based index of the attribute relative to the containing element
Returns:a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.

xmlTextReaderGetAttributeNs ()

xmlChar *	xmlTextReaderGetAttributeNs	(xmlTextReaderPtr reader, 
const xmlChar * localName,
const xmlChar * namespaceURI)

Provides the value of the specified attribute

reader:the xmlTextReaderPtr used
localName:the local name of the attribute.
namespaceURI:the namespace URI of the attribute.
Returns:a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.

xmlTextReaderGetErrorHandler ()

void	xmlTextReaderGetErrorHandler	(xmlTextReaderPtr reader, 
xmlTextReaderErrorFunc * f,
void ** arg)

Retrieve the error callback function and user argument.

reader:the xmlTextReaderPtr used
f:the callback function or NULL is no callback has been registered
arg:a user argument

xmlTextReaderGetParserColumnNumber ()

int	xmlTextReaderGetParserColumnNumber	(xmlTextReaderPtr reader)

Provide the column number of the current parsing point.

reader:the user data (XML reader context)
Returns:an int or 0 if not available

xmlTextReaderGetParserLineNumber ()

int	xmlTextReaderGetParserLineNumber	(xmlTextReaderPtr reader)

Provide the line number of the current parsing point.

reader:the user data (XML reader context)
Returns:an int or 0 if not available

xmlTextReaderGetParserProp ()

int	xmlTextReaderGetParserProp	(xmlTextReaderPtr reader, 
int prop)

Read the parser internal property.

reader:the xmlTextReaderPtr used
prop:the xmlParserProperties to get
Returns:the value, usually 0 or 1, or -1 in case of error.

xmlTextReaderGetRemainder ()

xmlParserInputBufferPtr	xmlTextReaderGetRemainder	(xmlTextReaderPtr reader)

Method to get the remainder of the buffered XML. this method stops the parser, set its state to End Of File and return the input stream with what is left that the parser did not use. The implementation is not good, the parser certainly procgressed past what's left in reader->input, and there is an allocation problem. Best would be to rewrite it differently.

reader:the xmlTextReaderPtr used
Returns:the xmlParserInputBufferPtr attached to the XML or NULL in case of error.

xmlTextReaderHasAttributes ()

int	xmlTextReaderHasAttributes	(xmlTextReaderPtr reader)

Whether the node has attributes.

reader:the xmlTextReaderPtr used
Returns:1 if true, 0 if false, and -1 in case or error

xmlTextReaderHasValue ()

int	xmlTextReaderHasValue		(xmlTextReaderPtr reader)

Whether the node can have a text value.

reader:the xmlTextReaderPtr used
Returns:1 if true, 0 if false, and -1 in case or error

xmlTextReaderIsDefault ()

int	xmlTextReaderIsDefault		(xmlTextReaderPtr reader)

Whether an Attribute node was generated from the default value defined in the DTD or schema.

reader:the xmlTextReaderPtr used
Returns:0 if not defaulted, 1 if defaulted, and -1 in case of error

xmlTextReaderIsEmptyElement ()

int	xmlTextReaderIsEmptyElement	(xmlTextReaderPtr reader)

Check if the current node is empty

reader:the xmlTextReaderPtr used
Returns:1 if empty, 0 if not and -1 in case of error

xmlTextReaderIsNamespaceDecl ()

int	xmlTextReaderIsNamespaceDecl	(xmlTextReaderPtr reader)

Determine whether the current node is a namespace declaration rather than a regular attribute.

reader:the xmlTextReaderPtr used
Returns:1 if the current node is a namespace declaration, 0 if it is a regular attribute or other type of node, or -1 in case of error.

xmlTextReaderIsValid ()

int	xmlTextReaderIsValid		(xmlTextReaderPtr reader)

Retrieve the validity status from the parser context

reader:the xmlTextReaderPtr used
Returns:the flag value 1 if valid, 0 if no, and -1 in case of error

xmlTextReaderLocalName ()

xmlChar *	xmlTextReaderLocalName	(xmlTextReaderPtr reader)

The local name of the node.

reader:the xmlTextReaderPtr used
Returns:the local name or NULL if not available, if non NULL it need to be freed by the caller.

xmlTextReaderLocatorBaseURI ()

xmlChar *	xmlTextReaderLocatorBaseURI	(xmlTextReaderLocatorPtr locator)

Obtain the base URI for the given locator.

locator:the xmlTextReaderLocatorPtr used
Returns:the base URI or NULL in case of error, if non NULL it need to be freed by the caller.

xmlTextReaderLocatorLineNumber ()

int	xmlTextReaderLocatorLineNumber	(xmlTextReaderLocatorPtr locator)

Obtain the line number for the given locator.

locator:the xmlTextReaderLocatorPtr used
Returns:the line number or -1 in case of error.

xmlTextReaderLookupNamespace ()

xmlChar *	xmlTextReaderLookupNamespace	(xmlTextReaderPtr reader, 
const xmlChar * prefix)

Resolves a namespace prefix in the scope of the current element.

reader:the xmlTextReaderPtr used
prefix:the prefix whose namespace URI is to be resolved. To return the default namespace, specify NULL
Returns:a string containing the namespace URI to which the prefix maps or NULL in case of error. The string must be deallocated by the caller.

xmlTextReaderMoveToAttribute ()

int	xmlTextReaderMoveToAttribute	(xmlTextReaderPtr reader, 
const xmlChar * name)

Moves the position of the current instance to the attribute with the specified qualified name.

reader:the xmlTextReaderPtr used
name:the qualified name of the attribute.
Returns:1 in case of success, -1 in case of error, 0 if not found

xmlTextReaderMoveToAttributeNo ()

int	xmlTextReaderMoveToAttributeNo	(xmlTextReaderPtr reader, 
int no)

Moves the position of the current instance to the attribute with the specified index relative to the containing element.

reader:the xmlTextReaderPtr used
no:the zero-based index of the attribute relative to the containing element.
Returns:1 in case of success, -1 in case of error, 0 if not found

xmlTextReaderMoveToAttributeNs ()

int	xmlTextReaderMoveToAttributeNs	(xmlTextReaderPtr reader, 
const xmlChar * localName,
const xmlChar * namespaceURI)

Moves the position of the current instance to the attribute with the specified local name and namespace URI.

reader:the xmlTextReaderPtr used
localName:the local name of the attribute.
namespaceURI:the namespace URI of the attribute.
Returns:1 in case of success, -1 in case of error, 0 if not found

xmlTextReaderMoveToElement ()

int	xmlTextReaderMoveToElement	(xmlTextReaderPtr reader)

Moves the position of the current instance to the node that contains the current Attribute node.

reader:the xmlTextReaderPtr used
Returns:1 in case of success, -1 in case of error, 0 if not moved

xmlTextReaderMoveToFirstAttribute ()

int	xmlTextReaderMoveToFirstAttribute	(xmlTextReaderPtr reader)

Moves the position of the current instance to the first attribute associated with the current node.

reader:the xmlTextReaderPtr used
Returns:1 in case of success, -1 in case of error, 0 if not found

xmlTextReaderMoveToNextAttribute ()

int	xmlTextReaderMoveToNextAttribute	(xmlTextReaderPtr reader)

Moves the position of the current instance to the next attribute associated with the current node.

reader:the xmlTextReaderPtr used
Returns:1 in case of success, -1 in case of error, 0 if not found

xmlTextReaderName ()

xmlChar *	xmlTextReaderName	(xmlTextReaderPtr reader)

The qualified name of the node, equal to Prefix :LocalName.

reader:the xmlTextReaderPtr used
Returns:the local name or NULL if not available, if non NULL it need to be freed by the caller.

xmlTextReaderNamespaceUri ()

xmlChar *	xmlTextReaderNamespaceUri	(xmlTextReaderPtr reader)

The URI defining the namespace associated with the node.

reader:the xmlTextReaderPtr used
Returns:the namespace URI or NULL if not available, if non NULL it need to be freed by the caller.

xmlTextReaderNext ()

int	xmlTextReaderNext		(xmlTextReaderPtr reader)

Skip to the node following the current one in document order while avoiding the subtree if any.

reader:the xmlTextReaderPtr used
Returns:1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error

xmlTextReaderNextSibling ()

int	xmlTextReaderNextSibling	(xmlTextReaderPtr reader)

Skip to the node following the current one in document order while avoiding the subtree if any. Currently implemented only for Readers built on a document

reader:the xmlTextReaderPtr used
Returns:1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error

xmlTextReaderNodeType ()

int	xmlTextReaderNodeType		(xmlTextReaderPtr reader)

Get the node type of the current node Reference: http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html

reader:the xmlTextReaderPtr used
Returns:the xmlNodeType of the current node or -1 in case of error

xmlTextReaderNormalization ()

int	xmlTextReaderNormalization	(xmlTextReaderPtr reader)

The value indicating whether to normalize white space and attribute values. Since attribute value and end of line normalizations are a MUST in the XML specification only the value true is accepted. The broken bahaviour of accepting out of range character entities like &#0; is of course not supported either.

reader:the xmlTextReaderPtr used
Returns:1 or -1 in case of error.

xmlTextReaderPrefix ()

xmlChar *	xmlTextReaderPrefix	(xmlTextReaderPtr reader)

A shorthand reference to the namespace associated with the node.

reader:the xmlTextReaderPtr used
Returns:the prefix or NULL if not available, if non NULL it need to be freed by the caller.

xmlTextReaderPreserve ()

xmlNodePtr	xmlTextReaderPreserve	(xmlTextReaderPtr reader)

This tells the XML Reader to preserve the current node. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished

reader:the xmlTextReaderPtr used
Returns:the xmlNodePtr or NULL in case of error.

xmlTextReaderPreservePattern ()

int	xmlTextReaderPreservePattern	(xmlTextReaderPtr reader, 
const xmlChar * pattern,
const xmlChar ** namespaces)

This tells the XML Reader to preserve all nodes matched by the pattern. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished

reader:the xmlTextReaderPtr used
pattern:an XPath subset pattern
namespaces:the prefix definitions, array of [URI, prefix] or NULL
Returns:a positive number in case of success and -1 in case of error

xmlTextReaderQuoteChar ()

int	xmlTextReaderQuoteChar		(xmlTextReaderPtr reader)

The quotation mark character used to enclose the value of an attribute.

reader:the xmlTextReaderPtr used
Returns:" or ' and -1 in case of error

xmlTextReaderRead ()

int	xmlTextReaderRead		(xmlTextReaderPtr reader)

Moves the position of the current instance to the next node in the stream, exposing its properties.

reader:the xmlTextReaderPtr used
Returns:1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error

xmlTextReaderReadAttributeValue ()

int	xmlTextReaderReadAttributeValue	(xmlTextReaderPtr reader)

Parses an attribute value into one or more Text and EntityReference nodes.

reader:the xmlTextReaderPtr used
Returns:1 in case of success, 0 if the reader was not positionned on an ttribute node or all the attribute values have been read, or -1 in case of error.

xmlTextReaderReadInnerXml ()

xmlChar *	xmlTextReaderReadInnerXml	(xmlTextReaderPtr reader)

Reads the contents of the current node, including child nodes and markup.

reader:the xmlTextReaderPtr used
Returns:a string containing the XML content, or NULL if the current node is neither an element nor attribute, or has no child nodes. The string must be deallocated by the caller.

xmlTextReaderReadOuterXml ()

xmlChar *	xmlTextReaderReadOuterXml	(xmlTextReaderPtr reader)

Reads the contents of the current node, including child nodes and markup.

reader:the xmlTextReaderPtr used
Returns:a string containing the node and any XML content, or NULL if the current node cannot be serialized. The string must be deallocated by the caller.

xmlTextReaderReadState ()

int	xmlTextReaderReadState		(xmlTextReaderPtr reader)

Gets the read state of the reader.

reader:the xmlTextReaderPtr used
Returns:the state value, or -1 in case of error

xmlTextReaderReadString ()

xmlChar *	xmlTextReaderReadString	(xmlTextReaderPtr reader)

Reads the contents of an element or a text node as a string.

reader:the xmlTextReaderPtr used
Returns:a string containing the contents of the Element or Text node, or NULL if the reader is positioned on any other type of node. The string must be deallocated by the caller.

xmlTextReaderRelaxNGSetSchema ()

int	xmlTextReaderRelaxNGSetSchema	(xmlTextReaderPtr reader, 
xmlRelaxNGPtr schema)

Use RelaxNG to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then RelaxNG validation is desactivated. @ The @schema should not be freed until the reader is deallocated or its use has been deactivated.

reader:the xmlTextReaderPtr used
schema:a precompiled RelaxNG schema
Returns:0 in case the RelaxNG validation could be (des)activated and -1 in case of error.

xmlTextReaderRelaxNGValidate ()

int	xmlTextReaderRelaxNGValidate	(xmlTextReaderPtr reader, 
const char * rng)

Use RelaxNG schema to validate the document as it is processed. Activation is only possible before the first Read(). If @rng is NULL, then RelaxNG schema validation is deactivated.

reader:the xmlTextReaderPtr used
rng:the path to a RelaxNG schema or NULL
Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

xmlTextReaderRelaxNGValidateCtxt ()

int	xmlTextReaderRelaxNGValidateCtxt	(xmlTextReaderPtr reader, 
xmlRelaxNGValidCtxtPtr ctxt,
int options)

Use RelaxNG schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then RelaxNG schema validation is deactivated.

reader:the xmlTextReaderPtr used
ctxt:the RelaxNG schema validation context or NULL
options:options (not used yet)
Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

xmlTextReaderSchemaValidate ()

int	xmlTextReaderSchemaValidate	(xmlTextReaderPtr reader, 
const char * xsd)

Use W3C XSD schema to validate the document as it is processed. Activation is only possible before the first Read(). If @xsd is NULL, then XML Schema validation is deactivated.

reader:the xmlTextReaderPtr used
xsd:the path to a W3C XSD schema or NULL
Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

xmlTextReaderSchemaValidateCtxt ()

int	xmlTextReaderSchemaValidateCtxt	(xmlTextReaderPtr reader, 
xmlSchemaValidCtxtPtr ctxt,
int options)

Use W3C XSD schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then XML Schema validation is deactivated.

reader:the xmlTextReaderPtr used
ctxt:the XML Schema validation context or NULL
options:options (not used yet)
Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

xmlTextReaderSetErrorHandler ()

void	xmlTextReaderSetErrorHandler	(xmlTextReaderPtr reader, 
xmlTextReaderErrorFunc f,
void * arg)

Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored.

reader:the xmlTextReaderPtr used
f:the callback function to call on error and warnings
arg:a user argument to pass to the callback function

xmlTextReaderSetParserProp ()

int	xmlTextReaderSetParserProp	(xmlTextReaderPtr reader, 
int prop,
int value)

Change the parser processing behaviour by changing some of its internal properties. Note that some properties can only be changed before any read has been done.

reader:the xmlTextReaderPtr used
prop:the xmlParserProperties to set
value:usually 0 or 1 to (de)activate it
Returns:0 if the call was successful, or -1 in case of error

xmlTextReaderSetSchema ()

int	xmlTextReaderSetSchema		(xmlTextReaderPtr reader, 
xmlSchemaPtr schema)

Use XSD Schema to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then Schema validation is desactivated. @ The @schema should not be freed until the reader is deallocated or its use has been deactivated.

reader:the xmlTextReaderPtr used
schema:a precompiled Schema schema
Returns:0 in case the Schema validation could be (des)activated and -1 in case of error.

xmlTextReaderSetStructuredErrorHandler ()

void	xmlTextReaderSetStructuredErrorHandler	(xmlTextReaderPtr reader, 
xmlStructuredErrorFunc f,
void * arg)

Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored.

reader:the xmlTextReaderPtr used
f:the callback function to call on error and warnings
arg:a user argument to pass to the callback function

xmlTextReaderSetup ()

int	xmlTextReaderSetup		(xmlTextReaderPtr reader, 
xmlParserInputBufferPtr input,
const char * URL,
const char * encoding,
int options)

Setup an XML reader with new options

reader:an XML reader
input:xmlParserInputBufferPtr used to feed the reader, will be destroyed with it.
URL:the base URL to use for the document
encoding:the document encoding, or NULL
options:a combination of xmlParserOption
Returns:0 in case of success and -1 in case of error.

xmlTextReaderStandalone ()

int	xmlTextReaderStandalone		(xmlTextReaderPtr reader)

Determine the standalone status of the document being read.

reader:the xmlTextReaderPtr used
Returns:1 if the document was declared to be standalone, 0 if it was declared to be not standalone, or -1 if the document did not specify its standalone status or in case of error.

xmlTextReaderValue ()

xmlChar *	xmlTextReaderValue	(xmlTextReaderPtr reader)

Provides the text value of the node if present

reader:the xmlTextReaderPtr used
Returns:the string or NULL if not available. The result must be deallocated with xmlFree()

xmlTextReaderXmlLang ()

xmlChar *	xmlTextReaderXmlLang	(xmlTextReaderPtr reader)

The xml:lang scope within which the node resides.

reader:the xmlTextReaderPtr used
Returns:the xml:lang value or NULL if none exists., if non NULL it need to be freed by the caller.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlwriter.html0000644000175000017500000033271512134171044021252 0ustar aronaron xmlwriter: text writing API for XML

xmlwriter

xmlwriter - text writing API for XML

text writing API for XML

Author(s): Alfred Mickautsch <alfred@mickautsch.de>

Synopsis

#define xmlTextWriterWriteProcessingInstruction;
#define xmlTextWriterWriteDocType;
typedef struct _xmlTextWriter xmlTextWriter;
typedef xmlTextWriter * xmlTextWriterPtr;
int	xmlTextWriterStartDocument	(xmlTextWriterPtr writer, 
const char * version,
const char * encoding,
const char * standalone); int xmlTextWriterEndPI (xmlTextWriterPtr writer); int xmlTextWriterWriteBase64 (xmlTextWriterPtr writer,
const char * data,
int start,
int len); int xmlTextWriterSetIndentString (xmlTextWriterPtr writer,
const xmlChar * str); int xmlTextWriterStartAttribute (xmlTextWriterPtr writer,
const xmlChar * name); int xmlTextWriterEndComment (xmlTextWriterPtr writer); int xmlTextWriterWriteRawLen (xmlTextWriterPtr writer,
const xmlChar * content,
int len); int xmlTextWriterWriteDTDExternalEntityContents (xmlTextWriterPtr writer,
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * ndataid); int xmlTextWriterWriteVFormatCDATA (xmlTextWriterPtr writer,
const char * format,
va_list argptr); int xmlTextWriterStartAttributeNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI); xmlTextWriterPtr xmlNewTextWriterPushParser (xmlParserCtxtPtr ctxt,
int compression); int xmlTextWriterWriteFormatAttributeNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
... ...); int xmlTextWriterWriteDTDEntity (xmlTextWriterPtr writer,
int pe,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * ndataid,
const xmlChar * content); int xmlTextWriterWriteVFormatPI (xmlTextWriterPtr writer,
const xmlChar * target,
const char * format,
va_list argptr); int xmlTextWriterWriteBinHex (xmlTextWriterPtr writer,
const char * data,
int start,
int len); int xmlTextWriterEndAttribute (xmlTextWriterPtr writer); int xmlTextWriterSetIndent (xmlTextWriterPtr writer,
int indent); int xmlTextWriterWriteFormatPI (xmlTextWriterPtr writer,
const xmlChar * target,
const char * format,
... ...); int xmlTextWriterEndDocument (xmlTextWriterPtr writer); int xmlTextWriterWriteDTDAttlist (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * content); int xmlTextWriterStartComment (xmlTextWriterPtr writer); int xmlTextWriterWriteVFormatDTD (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const char * format,
va_list argptr); int xmlTextWriterEndCDATA (xmlTextWriterPtr writer); int xmlTextWriterStartElementNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI); int xmlTextWriterEndDTDEntity (xmlTextWriterPtr writer); xmlTextWriterPtr xmlNewTextWriter (xmlOutputBufferPtr out); void xmlFreeTextWriter (xmlTextWriterPtr writer); int xmlTextWriterWriteVFormatDTDAttlist (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
va_list argptr); int xmlTextWriterStartPI (xmlTextWriterPtr writer,
const xmlChar * target); int xmlTextWriterStartElement (xmlTextWriterPtr writer,
const xmlChar * name); int xmlTextWriterWriteDTDExternalEntity (xmlTextWriterPtr writer,
int pe,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * ndataid); int xmlTextWriterWriteFormatRaw (xmlTextWriterPtr writer,
const char * format,
... ...); int xmlTextWriterWriteCDATA (xmlTextWriterPtr writer,
const xmlChar * content); int xmlTextWriterWriteVFormatDTDInternalEntity (xmlTextWriterPtr writer,
int pe,
const xmlChar * name,
const char * format,
va_list argptr); int xmlTextWriterWriteVFormatAttribute (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
va_list argptr); int xmlTextWriterEndDTDElement (xmlTextWriterPtr writer); int xmlTextWriterEndDTD (xmlTextWriterPtr writer); int xmlTextWriterWriteElement (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * content); int xmlTextWriterEndElement (xmlTextWriterPtr writer); int xmlTextWriterWriteVFormatComment (xmlTextWriterPtr writer,
const char * format,
va_list argptr); int xmlTextWriterStartCDATA (xmlTextWriterPtr writer); xmlTextWriterPtr xmlNewTextWriterFilename (const char * uri,
int compression); int xmlTextWriterWriteVFormatElement (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
va_list argptr); int xmlTextWriterWriteFormatComment (xmlTextWriterPtr writer,
const char * format,
... ...); int xmlTextWriterWriteAttributeNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const xmlChar * content); int xmlTextWriterWritePI (xmlTextWriterPtr writer,
const xmlChar * target,
const xmlChar * content); int xmlTextWriterWriteFormatDTDInternalEntity (xmlTextWriterPtr writer,
int pe,
const xmlChar * name,
const char * format,
... ...); int xmlTextWriterWriteVFormatString (xmlTextWriterPtr writer,
const char * format,
va_list argptr); int xmlTextWriterWriteDTDInternalEntity (xmlTextWriterPtr writer,
int pe,
const xmlChar * name,
const xmlChar * content); int xmlTextWriterWriteVFormatElementNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
va_list argptr); int xmlTextWriterWriteDTDNotation (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid); int xmlTextWriterWriteFormatElement (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
... ...); int xmlTextWriterSetQuoteChar (xmlTextWriterPtr writer,
xmlChar quotechar); int xmlTextWriterWriteString (xmlTextWriterPtr writer,
const xmlChar * content); int xmlTextWriterWriteElementNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const xmlChar * content); int xmlTextWriterFullEndElement (xmlTextWriterPtr writer); int xmlTextWriterWriteVFormatAttributeNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
va_list argptr); int xmlTextWriterFlush (xmlTextWriterPtr writer); int xmlTextWriterStartDTD (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid); int xmlTextWriterWriteAttribute (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * content); xmlTextWriterPtr xmlNewTextWriterDoc (xmlDocPtr * doc,
int compression); int xmlTextWriterWriteFormatDTDElement (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
... ...); int xmlTextWriterEndDTDAttlist (xmlTextWriterPtr writer); xmlTextWriterPtr xmlNewTextWriterTree (xmlDocPtr doc,
xmlNodePtr node,
int compression); xmlTextWriterPtr xmlNewTextWriterMemory (xmlBufferPtr buf,
int compression); int xmlTextWriterWriteFormatCDATA (xmlTextWriterPtr writer,
const char * format,
... ...); int xmlTextWriterStartDTDAttlist (xmlTextWriterPtr writer,
const xmlChar * name); int xmlTextWriterWriteFormatString (xmlTextWriterPtr writer,
const char * format,
... ...); int xmlTextWriterWriteComment (xmlTextWriterPtr writer,
const xmlChar * content); int xmlTextWriterWriteVFormatRaw (xmlTextWriterPtr writer,
const char * format,
va_list argptr); int xmlTextWriterWriteFormatDTD (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const char * format,
... ...); int xmlTextWriterWriteFormatDTDAttlist (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
... ...); int xmlTextWriterWriteRaw (xmlTextWriterPtr writer,
const xmlChar * content); int xmlTextWriterWriteDTDElement (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * content); int xmlTextWriterWriteDTD (xmlTextWriterPtr writer,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * subset); int xmlTextWriterWriteFormatAttribute (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
... ...); int xmlTextWriterStartDTDEntity (xmlTextWriterPtr writer,
int pe,
const xmlChar * name); int xmlTextWriterWriteVFormatDTDElement (xmlTextWriterPtr writer,
const xmlChar * name,
const char * format,
va_list argptr); int xmlTextWriterStartDTDElement (xmlTextWriterPtr writer,
const xmlChar * name); int xmlTextWriterWriteFormatElementNS (xmlTextWriterPtr writer,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
... ...);

Description

Details

Macro xmlTextWriterWriteDocType

#define xmlTextWriterWriteDocType;

this macro maps to xmlTextWriterWriteDTD


Macro xmlTextWriterWriteProcessingInstruction

#define xmlTextWriterWriteProcessingInstruction;

This macro maps to xmlTextWriterWritePI


Structure xmlTextWriter

struct _xmlTextWriter {
The content of this structure is not made public by the API.
} xmlTextWriter;


Typedef xmlTextWriterPtr

xmlTextWriter * xmlTextWriterPtr;


xmlFreeTextWriter ()

void	xmlFreeTextWriter		(xmlTextWriterPtr writer)

Deallocate all the resources associated to the writer

writer:the xmlTextWriterPtr

xmlNewTextWriter ()

xmlTextWriterPtr	xmlNewTextWriter	(xmlOutputBufferPtr out)

Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr NOTE: the @out parameter will be deallocated when the writer is closed (if the call succeed.)

out:an xmlOutputBufferPtr
Returns:the new xmlTextWriterPtr or NULL in case of error

xmlNewTextWriterDoc ()

xmlTextWriterPtr	xmlNewTextWriterDoc	(xmlDocPtr * doc, 
int compression)

Create a new xmlNewTextWriter structure with @*doc as output

doc:address of a xmlDocPtr to hold the new XML document tree
compression:compress the output?
Returns:the new xmlTextWriterPtr or NULL in case of error

xmlNewTextWriterFilename ()

xmlTextWriterPtr	xmlNewTextWriterFilename	(const char * uri, 
int compression)

Create a new xmlNewTextWriter structure with @uri as output

uri:the URI of the resource for the output
compression:compress the output?
Returns:the new xmlTextWriterPtr or NULL in case of error

xmlNewTextWriterMemory ()

xmlTextWriterPtr	xmlNewTextWriterMemory	(xmlBufferPtr buf, 
int compression)

Create a new xmlNewTextWriter structure with @buf as output TODO: handle compression

buf:xmlBufferPtr
compression:compress the output?
Returns:the new xmlTextWriterPtr or NULL in case of error

xmlNewTextWriterPushParser ()

xmlTextWriterPtr	xmlNewTextWriterPushParser	(xmlParserCtxtPtr ctxt, 
int compression)

Create a new xmlNewTextWriter structure with @ctxt as output NOTE: the @ctxt context will be freed with the resulting writer (if the call succeeds). TODO: handle compression

ctxt:xmlParserCtxtPtr to hold the new XML document tree
compression:compress the output?
Returns:the new xmlTextWriterPtr or NULL in case of error

xmlNewTextWriterTree ()

xmlTextWriterPtr	xmlNewTextWriterTree	(xmlDocPtr doc, 
xmlNodePtr node,
int compression)

Create a new xmlNewTextWriter structure with @doc as output starting at @node

doc:xmlDocPtr
node:xmlNodePtr or NULL for doc->children
compression:compress the output?
Returns:the new xmlTextWriterPtr or NULL in case of error

xmlTextWriterEndAttribute ()

int	xmlTextWriterEndAttribute	(xmlTextWriterPtr writer)

End the current xml element.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndCDATA ()

int	xmlTextWriterEndCDATA		(xmlTextWriterPtr writer)

End an xml CDATA section.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndComment ()

int	xmlTextWriterEndComment		(xmlTextWriterPtr writer)

End the current xml coment.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndDTD ()

int	xmlTextWriterEndDTD		(xmlTextWriterPtr writer)

End an xml DTD.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndDTDAttlist ()

int	xmlTextWriterEndDTDAttlist	(xmlTextWriterPtr writer)

End an xml DTD attribute list.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndDTDElement ()

int	xmlTextWriterEndDTDElement	(xmlTextWriterPtr writer)

End an xml DTD element.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndDTDEntity ()

int	xmlTextWriterEndDTDEntity	(xmlTextWriterPtr writer)

End an xml DTD entity.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndDocument ()

int	xmlTextWriterEndDocument	(xmlTextWriterPtr writer)

End an xml document. All open elements are closed, and the content is flushed to the output.

writer:the xmlTextWriterPtr
Returns:the bytes written or -1 in case of error

xmlTextWriterEndElement ()

int	xmlTextWriterEndElement		(xmlTextWriterPtr writer)

End the current xml element.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterEndPI ()

int	xmlTextWriterEndPI		(xmlTextWriterPtr writer)

End the current xml PI.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterFlush ()

int	xmlTextWriterFlush		(xmlTextWriterPtr writer)

Flush the output buffer.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterFullEndElement ()

int	xmlTextWriterFullEndElement	(xmlTextWriterPtr writer)

End the current xml element. Writes an end tag even if the element is empty

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterSetIndent ()

int	xmlTextWriterSetIndent		(xmlTextWriterPtr writer, 
int indent)

Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.

writer:the xmlTextWriterPtr
indent:do indentation?
Returns:-1 on error or 0 otherwise.

xmlTextWriterSetIndentString ()

int	xmlTextWriterSetIndentString	(xmlTextWriterPtr writer, 
const xmlChar * str)

Set string indentation.

writer:the xmlTextWriterPtr
str:the xmlChar string
Returns:-1 on error or 0 otherwise.

xmlTextWriterSetQuoteChar ()

int	xmlTextWriterSetQuoteChar	(xmlTextWriterPtr writer, 
xmlChar quotechar)

Set the character used for quoting attributes.

writer:the xmlTextWriterPtr
quotechar:the quote character
Returns:-1 on error or 0 otherwise.

xmlTextWriterStartAttribute ()

int	xmlTextWriterStartAttribute	(xmlTextWriterPtr writer, 
const xmlChar * name)

Start an xml attribute.

writer:the xmlTextWriterPtr
name:element name
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartAttributeNS ()

int	xmlTextWriterStartAttributeNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI)

Start an xml attribute with namespace support.

writer:the xmlTextWriterPtr
prefix:namespace prefix or NULL
name:element local name
namespaceURI:namespace URI or NULL
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartCDATA ()

int	xmlTextWriterStartCDATA		(xmlTextWriterPtr writer)

Start an xml CDATA section.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartComment ()

int	xmlTextWriterStartComment	(xmlTextWriterPtr writer)

Start an xml comment.

writer:the xmlTextWriterPtr
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartDTD ()

int	xmlTextWriterStartDTD		(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid)

Start an xml DTD.

writer:the xmlTextWriterPtr
name:the name of the DTD
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartDTDAttlist ()

int	xmlTextWriterStartDTDAttlist	(xmlTextWriterPtr writer, 
const xmlChar * name)

Start an xml DTD ATTLIST.

writer:the xmlTextWriterPtr
name:the name of the DTD ATTLIST
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartDTDElement ()

int	xmlTextWriterStartDTDElement	(xmlTextWriterPtr writer, 
const xmlChar * name)

Start an xml DTD element.

writer:the xmlTextWriterPtr
name:the name of the DTD element
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartDTDEntity ()

int	xmlTextWriterStartDTDEntity	(xmlTextWriterPtr writer, 
int pe,
const xmlChar * name)

Start an xml DTD ATTLIST.

writer:the xmlTextWriterPtr
pe:TRUE if this is a parameter entity, FALSE if not
name:the name of the DTD ATTLIST
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartDocument ()

int	xmlTextWriterStartDocument	(xmlTextWriterPtr writer, 
const char * version,
const char * encoding,
const char * standalone)

Start a new xml document

writer:the xmlTextWriterPtr
version:the xml version ("1.0") or NULL for default ("1.0")
encoding:the encoding or NULL for default
standalone:"yes" or "no" or NULL for default
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartElement ()

int	xmlTextWriterStartElement	(xmlTextWriterPtr writer, 
const xmlChar * name)

Start an xml element.

writer:the xmlTextWriterPtr
name:element name
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartElementNS ()

int	xmlTextWriterStartElementNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI)

Start an xml element with namespace support.

writer:the xmlTextWriterPtr
prefix:namespace prefix or NULL
name:element local name
namespaceURI:namespace URI or NULL
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterStartPI ()

int	xmlTextWriterStartPI		(xmlTextWriterPtr writer, 
const xmlChar * target)

Start an xml PI.

writer:the xmlTextWriterPtr
target:PI target
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteAttribute ()

int	xmlTextWriterWriteAttribute	(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * content)

Write an xml attribute.

writer:the xmlTextWriterPtr
name:attribute name
content:attribute content
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteAttributeNS ()

int	xmlTextWriterWriteAttributeNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const xmlChar * content)

Write an xml attribute.

writer:the xmlTextWriterPtr
prefix:namespace prefix
name:attribute local name
namespaceURI:namespace URI
content:attribute content
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteBase64 ()

int	xmlTextWriterWriteBase64	(xmlTextWriterPtr writer, 
const char * data,
int start,
int len)

Write an base64 encoded xml text.

writer:the xmlTextWriterPtr
data:binary data
start:the position within the data of the first byte to encode
len:the number of bytes to encode
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteBinHex ()

int	xmlTextWriterWriteBinHex	(xmlTextWriterPtr writer, 
const char * data,
int start,
int len)

Write a BinHex encoded xml text.

writer:the xmlTextWriterPtr
data:binary data
start:the position within the data of the first byte to encode
len:the number of bytes to encode
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteCDATA ()

int	xmlTextWriterWriteCDATA		(xmlTextWriterPtr writer, 
const xmlChar * content)

Write an xml CDATA.

writer:the xmlTextWriterPtr
content:CDATA content
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteComment ()

int	xmlTextWriterWriteComment	(xmlTextWriterPtr writer, 
const xmlChar * content)

Write an xml comment.

writer:the xmlTextWriterPtr
content:comment string
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTD ()

int	xmlTextWriterWriteDTD		(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * subset)

Write a DTD.

writer:the xmlTextWriterPtr
name:the name of the DTD
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
subset:string content of the DTD
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTDAttlist ()

int	xmlTextWriterWriteDTDAttlist	(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * content)

Write a DTD ATTLIST.

writer:the xmlTextWriterPtr
name:the name of the DTD ATTLIST
content:content of the ATTLIST
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTDElement ()

int	xmlTextWriterWriteDTDElement	(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * content)

Write a DTD element.

writer:the xmlTextWriterPtr
name:the name of the DTD element
content:content of the element
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTDEntity ()

int	xmlTextWriterWriteDTDEntity	(xmlTextWriterPtr writer, 
int pe,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * ndataid,
const xmlChar * content)

Write a DTD entity.

writer:the xmlTextWriterPtr
pe:TRUE if this is a parameter entity, FALSE if not
name:the name of the DTD entity
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
ndataid:the xml notation name.
content:content of the entity
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTDExternalEntity ()

int	xmlTextWriterWriteDTDExternalEntity	(xmlTextWriterPtr writer, 
int pe,
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * ndataid)

Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity

writer:the xmlTextWriterPtr
pe:TRUE if this is a parameter entity, FALSE if not
name:the name of the DTD entity
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
ndataid:the xml notation name.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTDExternalEntityContents ()

int	xmlTextWriterWriteDTDExternalEntityContents	(xmlTextWriterPtr writer, 
const xmlChar * pubid,
const xmlChar * sysid,
const xmlChar * ndataid)

Write the contents of a DTD external entity.

writer:the xmlTextWriterPtr
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
ndataid:the xml notation name.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTDInternalEntity ()

int	xmlTextWriterWriteDTDInternalEntity	(xmlTextWriterPtr writer, 
int pe,
const xmlChar * name,
const xmlChar * content)

Write a DTD internal entity.

writer:the xmlTextWriterPtr
pe:TRUE if this is a parameter entity, FALSE if not
name:the name of the DTD entity
content:content of the entity
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteDTDNotation ()

int	xmlTextWriterWriteDTDNotation	(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid)

Write a DTD entity.

writer:the xmlTextWriterPtr
name:the name of the xml notation
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteElement ()

int	xmlTextWriterWriteElement	(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * content)

Write an xml element.

writer:the xmlTextWriterPtr
name:element name
content:element content
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteElementNS ()

int	xmlTextWriterWriteElementNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const xmlChar * content)

Write an xml element with namespace support.

writer:the xmlTextWriterPtr
prefix:namespace prefix
name:element local name
namespaceURI:namespace URI
content:element content
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatAttribute ()

int	xmlTextWriterWriteFormatAttribute	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
... ...)

Write a formatted xml attribute.

writer:the xmlTextWriterPtr
name:attribute name
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatAttributeNS ()

int	xmlTextWriterWriteFormatAttributeNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
... ...)

Write a formatted xml attribute.with namespace support

writer:the xmlTextWriterPtr
prefix:namespace prefix
name:attribute local name
namespaceURI:namespace URI
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatCDATA ()

int	xmlTextWriterWriteFormatCDATA	(xmlTextWriterPtr writer, 
const char * format,
... ...)

Write a formatted xml CDATA.

writer:the xmlTextWriterPtr
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatComment ()

int	xmlTextWriterWriteFormatComment	(xmlTextWriterPtr writer, 
const char * format,
... ...)

Write an xml comment.

writer:the xmlTextWriterPtr
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatDTD ()

int	xmlTextWriterWriteFormatDTD	(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const char * format,
... ...)

Write a DTD with a formatted markup declarations part.

writer:the xmlTextWriterPtr
name:the name of the DTD
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatDTDAttlist ()

int	xmlTextWriterWriteFormatDTDAttlist	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
... ...)

Write a formatted DTD ATTLIST.

writer:the xmlTextWriterPtr
name:the name of the DTD ATTLIST
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatDTDElement ()

int	xmlTextWriterWriteFormatDTDElement	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
... ...)

Write a formatted DTD element.

writer:the xmlTextWriterPtr
name:the name of the DTD element
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatDTDInternalEntity ()

int	xmlTextWriterWriteFormatDTDInternalEntity	(xmlTextWriterPtr writer, 
int pe,
const xmlChar * name,
const char * format,
... ...)

Write a formatted DTD internal entity.

writer:the xmlTextWriterPtr
pe:TRUE if this is a parameter entity, FALSE if not
name:the name of the DTD entity
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatElement ()

int	xmlTextWriterWriteFormatElement	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
... ...)

Write a formatted xml element.

writer:the xmlTextWriterPtr
name:element name
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatElementNS ()

int	xmlTextWriterWriteFormatElementNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
... ...)

Write a formatted xml element with namespace support.

writer:the xmlTextWriterPtr
prefix:namespace prefix
name:element local name
namespaceURI:namespace URI
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatPI ()

int	xmlTextWriterWriteFormatPI	(xmlTextWriterPtr writer, 
const xmlChar * target,
const char * format,
... ...)

Write a formatted PI.

writer:the xmlTextWriterPtr
target:PI target
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatRaw ()

int	xmlTextWriterWriteFormatRaw	(xmlTextWriterPtr writer, 
const char * format,
... ...)

Write a formatted raw xml text.

writer:the xmlTextWriterPtr
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteFormatString ()

int	xmlTextWriterWriteFormatString	(xmlTextWriterPtr writer, 
const char * format,
... ...)

Write a formatted xml text.

writer:the xmlTextWriterPtr
format:format string (see printf)
...:extra parameters for the format
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWritePI ()

int	xmlTextWriterWritePI		(xmlTextWriterPtr writer, 
const xmlChar * target,
const xmlChar * content)

Write an xml PI.

writer:the xmlTextWriterPtr
target:PI target
content:PI content
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteRaw ()

int	xmlTextWriterWriteRaw		(xmlTextWriterPtr writer, 
const xmlChar * content)

Write a raw xml text.

writer:the xmlTextWriterPtr
content:text string
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteRawLen ()

int	xmlTextWriterWriteRawLen	(xmlTextWriterPtr writer, 
const xmlChar * content,
int len)

Write an xml text. TODO: what about entities and special chars??

writer:the xmlTextWriterPtr
content:text string
len:length of the text string
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteString ()

int	xmlTextWriterWriteString	(xmlTextWriterPtr writer, 
const xmlChar * content)

Write an xml text.

writer:the xmlTextWriterPtr
content:text string
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatAttribute ()

int	xmlTextWriterWriteVFormatAttribute	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
va_list argptr)

Write a formatted xml attribute.

writer:the xmlTextWriterPtr
name:attribute name
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatAttributeNS ()

int	xmlTextWriterWriteVFormatAttributeNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
va_list argptr)

Write a formatted xml attribute.with namespace support

writer:the xmlTextWriterPtr
prefix:namespace prefix
name:attribute local name
namespaceURI:namespace URI
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatCDATA ()

int	xmlTextWriterWriteVFormatCDATA	(xmlTextWriterPtr writer, 
const char * format,
va_list argptr)

Write a formatted xml CDATA.

writer:the xmlTextWriterPtr
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatComment ()

int	xmlTextWriterWriteVFormatComment	(xmlTextWriterPtr writer, 
const char * format,
va_list argptr)

Write an xml comment.

writer:the xmlTextWriterPtr
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatDTD ()

int	xmlTextWriterWriteVFormatDTD	(xmlTextWriterPtr writer, 
const xmlChar * name,
const xmlChar * pubid,
const xmlChar * sysid,
const char * format,
va_list argptr)

Write a DTD with a formatted markup declarations part.

writer:the xmlTextWriterPtr
name:the name of the DTD
pubid:the public identifier, which is an alternative to the system identifier
sysid:the system identifier, which is the URI of the DTD
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatDTDAttlist ()

int	xmlTextWriterWriteVFormatDTDAttlist	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
va_list argptr)

Write a formatted DTD ATTLIST.

writer:the xmlTextWriterPtr
name:the name of the DTD ATTLIST
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatDTDElement ()

int	xmlTextWriterWriteVFormatDTDElement	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
va_list argptr)

Write a formatted DTD element.

writer:the xmlTextWriterPtr
name:the name of the DTD element
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatDTDInternalEntity ()

int	xmlTextWriterWriteVFormatDTDInternalEntity	(xmlTextWriterPtr writer, 
int pe,
const xmlChar * name,
const char * format,
va_list argptr)

Write a formatted DTD internal entity.

writer:the xmlTextWriterPtr
pe:TRUE if this is a parameter entity, FALSE if not
name:the name of the DTD entity
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatElement ()

int	xmlTextWriterWriteVFormatElement	(xmlTextWriterPtr writer, 
const xmlChar * name,
const char * format,
va_list argptr)

Write a formatted xml element.

writer:the xmlTextWriterPtr
name:element name
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatElementNS ()

int	xmlTextWriterWriteVFormatElementNS	(xmlTextWriterPtr writer, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * namespaceURI,
const char * format,
va_list argptr)

Write a formatted xml element with namespace support.

writer:the xmlTextWriterPtr
prefix:namespace prefix
name:element local name
namespaceURI:namespace URI
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatPI ()

int	xmlTextWriterWriteVFormatPI	(xmlTextWriterPtr writer, 
const xmlChar * target,
const char * format,
va_list argptr)

Write a formatted xml PI.

writer:the xmlTextWriterPtr
target:PI target
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatRaw ()

int	xmlTextWriterWriteVFormatRaw	(xmlTextWriterPtr writer, 
const char * format,
va_list argptr)

Write a formatted raw xml text.

writer:the xmlTextWriterPtr
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

xmlTextWriterWriteVFormatString ()

int	xmlTextWriterWriteVFormatString	(xmlTextWriterPtr writer, 
const char * format,
va_list argptr)

Write a formatted xml text.

writer:the xmlTextWriterPtr
format:format string (see printf)
argptr:pointer to the first member of the variable argument list.
Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xpath.html0000644000175000017500000017151512134171044020340 0ustar aronaron xpath: XML Path Language implementation

xpath

xpath - XML Path Language implementation

API for the XML Path Language implementation XML Path Language implementation XPath is a language for addressing parts of an XML document, designed to be used by both XSLT and XPointer

Author(s): Daniel Veillard

Synopsis

#define xmlXPathNodeSetGetLength(ns);
#define XML_XPATH_CHECKNS;
#define XML_XPATH_NOVAR;
#define xmlXPathNodeSetItem(ns, index);
#define xmlXPathNodeSetIsEmpty(ns);
typedef enum xmlXPathObjectType;
typedef xmlXPathVariable * xmlXPathVariablePtr;
typedef struct _xmlXPathContext xmlXPathContext;
typedef enum xmlXPathError;
typedef struct _xmlXPathFunct xmlXPathFunct;
typedef xmlXPathType * xmlXPathTypePtr;
typedef struct _xmlXPathType xmlXPathType;
typedef xmlNodeSet * xmlNodeSetPtr;
typedef xmlXPathFunct * xmlXPathFuncPtr;
typedef xmlXPathCompExpr * xmlXPathCompExprPtr;
typedef struct _xmlXPathObject xmlXPathObject;
typedef struct _xmlXPathCompExpr xmlXPathCompExpr;
typedef xmlXPathContext * xmlXPathContextPtr;
typedef xmlXPathParserContext * xmlXPathParserContextPtr;
typedef struct _xmlNodeSet xmlNodeSet;
typedef struct _xmlXPathVariable xmlXPathVariable;
typedef xmlXPathObject * xmlXPathObjectPtr;
typedef struct _xmlXPathAxis xmlXPathAxis;
typedef xmlXPathAxis * xmlXPathAxisPtr;
typedef struct _xmlXPathParserContext xmlXPathParserContext;
int	xmlXPathCastNodeSetToBoolean	(xmlNodeSetPtr ns);
typedef xmlXPathFunction xmlXPathFuncLookupFunc	(void * ctxt, 
const xmlChar * name,
const xmlChar * ns_uri); xmlXPathObjectPtr xmlXPathNodeEval (xmlNodePtr node,
const xmlChar * str,
xmlXPathContextPtr ctx); xmlChar * xmlXPathCastNodeToString (xmlNodePtr node); int xmlXPathIsNaN (double val); int xmlXPathContextSetCache (xmlXPathContextPtr ctxt,
int active,
int value,
int options); xmlXPathObjectPtr xmlXPathConvertString (xmlXPathObjectPtr val); int xmlXPathCompiledEvalToBoolean (xmlXPathCompExprPtr comp,
xmlXPathContextPtr ctxt); int xmlXPathIsInf (double val); long xmlXPathOrderDocElems (xmlDocPtr doc); xmlNodeSetPtr xmlXPathNodeSetCreate (xmlNodePtr val); double xmlXPathCastBooleanToNumber (int val); double xmlXPathCastNodeToNumber (xmlNodePtr node); double xmlXPathCastStringToNumber (const xmlChar * val); typedef xmlXPathObjectPtr xmlXPathAxisFunc (xmlXPathParserContextPtr ctxt,
xmlXPathObjectPtr cur); double xmlXPathCastToNumber (xmlXPathObjectPtr val); int xmlXPathCastStringToBoolean (const xmlChar * val); xmlChar * xmlXPathCastNumberToString (double val); typedef xmlXPathObjectPtr xmlXPathVariableLookupFunc (void * ctxt,
const xmlChar * name,
const xmlChar * ns_uri); void xmlXPathFreeObject (xmlXPathObjectPtr obj); int xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
xmlXPathObjectPtr res); void xmlXPathFreeContext (xmlXPathContextPtr ctxt); xmlXPathObjectPtr xmlXPathObjectCopy (xmlXPathObjectPtr val); void xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj); xmlXPathObjectPtr xmlXPathEval (const xmlChar * str,
xmlXPathContextPtr ctx); xmlChar * xmlXPathCastNodeSetToString (xmlNodeSetPtr ns); xmlXPathObjectPtr xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
xmlXPathContextPtr ctx); xmlXPathObjectPtr xmlXPathEvalExpression (const xmlChar * str,
xmlXPathContextPtr ctxt); void xmlXPathInit (void); xmlXPathObjectPtr xmlXPathConvertBoolean (xmlXPathObjectPtr val); typedef int xmlXPathConvertFunc (xmlXPathObjectPtr obj,
int type); typedef void xmlXPathFunction (xmlXPathParserContextPtr ctxt,
int nargs); int xmlXPathCmpNodes (xmlNodePtr node1,
xmlNodePtr node2); xmlChar * xmlXPathCastToString (xmlXPathObjectPtr val); xmlXPathCompExprPtr xmlXPathCtxtCompile (xmlXPathContextPtr ctxt,
const xmlChar * str); typedef void xmlXPathEvalFunc (xmlXPathParserContextPtr ctxt,
int nargs); xmlChar * xmlXPathCastBooleanToString (int val); int xmlXPathSetContextNode (xmlNodePtr node,
xmlXPathContextPtr ctx); int xmlXPathCastNumberToBoolean (double val); void xmlXPathFreeNodeSet (xmlNodeSetPtr obj); void xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp); xmlXPathContextPtr xmlXPathNewContext (xmlDocPtr doc); xmlXPathObjectPtr xmlXPathConvertNumber (xmlXPathObjectPtr val); xmlXPathCompExprPtr xmlXPathCompile (const xmlChar * str); double xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns); int xmlXPathCastToBoolean (xmlXPathObjectPtr val);

Description

Details

Macro XML_XPATH_CHECKNS

#define XML_XPATH_CHECKNS;

check namespaces at compilation


Macro XML_XPATH_NOVAR

#define XML_XPATH_NOVAR;

forbid variables in expression


Macro xmlXPathNodeSetGetLength

#define xmlXPathNodeSetGetLength(ns);

Implement a functionality similar to the DOM NodeList.length. Returns the number of nodes in the node-set.

ns:a node-set

Macro xmlXPathNodeSetIsEmpty

#define xmlXPathNodeSetIsEmpty(ns);

Checks whether @ns is empty or not. Returns %TRUE if @ns is an empty node-set.

ns:a node-set

Macro xmlXPathNodeSetItem

#define xmlXPathNodeSetItem(ns, index);

Implements a functionality similar to the DOM NodeList.item(). Returns the xmlNodePtr at the given @index in @ns or NULL if @index is out of range (0 to length-1)

ns:a node-set
index:index of a node in the set

Structure xmlNodeSet

struct _xmlNodeSet {
    int	nodeNr	: number of nodes in the set
    int	nodeMax	: size of the array as allocated
    xmlNodePtr *	nodeTab	: array of nodes in no particular order @@ with_ns to check wether name
} xmlNodeSet;


Typedef xmlNodeSetPtr

xmlNodeSet * xmlNodeSetPtr;


Structure xmlXPathAxis

struct _xmlXPathAxis {
    const xmlChar *	name	: the axis name
    xmlXPathAxisFunc	func	: the search function
} xmlXPathAxis;


Typedef xmlXPathAxisPtr

xmlXPathAxis * xmlXPathAxisPtr;


Structure xmlXPathCompExpr

struct _xmlXPathCompExpr {
The content of this structure is not made public by the API.
} xmlXPathCompExpr;


Typedef xmlXPathCompExprPtr

xmlXPathCompExpr * xmlXPathCompExprPtr;


Structure xmlXPathContext

struct _xmlXPathContext {
    xmlDocPtr	doc	: The current document
    xmlNodePtr	node	: The current node
    int	nb_variables_unused	: unused (hash table)
    int	max_variables_unused	: unused (hash table)
    xmlHashTablePtr	varHash	: Hash table of defined variables
    int	nb_types	: number of defined types
    int	max_types	: max number of types
    xmlXPathTypePtr	types	: Array of defined types
    int	nb_funcs_unused	: unused (hash table)
    int	max_funcs_unused	: unused (hash table)
    xmlHashTablePtr	funcHash	: Hash table of defined funcs
    int	nb_axis	: number of defined axis
    int	max_axis	: max number of axis
    xmlXPathAxisPtr	axis	: Array of defined axis the namespace nodes of the context node
    xmlNsPtr *	namespaces	: Array of namespaces
    int	nsNr	: number of namespace in scope
    void *	user	: function to free extra variables
    int	contextSize	: the context size
    int	proximityPosition	: the proximity position extra stuff for XPointer
    int	xptr	: is this an XPointer context?
    xmlNodePtr	here	: for here()
    xmlNodePtr	origin	: for origin() the set of namespace declarations in scope for the expre
    xmlHashTablePtr	nsHash	: The namespaces hash table
    xmlXPathVariableLookupFunc	varLookupFunc	: variable lookup func
    void *	varLookupData	: variable lookup data Possibility to link in an extra item
    void *	extra	: needed for XSLT The function name and URI when calling a function
    const xmlChar *	function
    const xmlChar *	functionURI	: function lookup function and data
    xmlXPathFuncLookupFunc	funcLookupFunc	: function lookup func
    void *	funcLookupData	: function lookup data temporary namespace lists kept for walking the n
    xmlNsPtr *	tmpNsList	: Array of namespaces
    int	tmpNsNr	: number of namespaces in scope error reporting mechanism
    void *	userData	: user specific data block
    xmlStructuredErrorFunc	error	: the callback in case of errors
    xmlError	lastError	: the last error
    xmlNodePtr	debugNode	: the source node XSLT dictionary
    xmlDictPtr	dict	: dictionary if any
    int	flags	: flags to control compilation Cache for reusal of XPath objects
    void *	cache
} xmlXPathContext;


Typedef xmlXPathContextPtr

xmlXPathContext * xmlXPathContextPtr;



Typedef xmlXPathFuncPtr

xmlXPathFunct * xmlXPathFuncPtr;


Structure xmlXPathFunct

struct _xmlXPathFunct {
    const xmlChar *	name	: the function name
    xmlXPathEvalFunc	func	: the evaluation function
} xmlXPathFunct;


Structure xmlXPathObject

struct _xmlXPathObject {
    xmlXPathObjectType	type
    xmlNodeSetPtr	nodesetval
    int	boolval
    double	floatval
    xmlChar *	stringval
    void *	user
    int	index
    void *	user2
    int	index2
} xmlXPathObject;


Typedef xmlXPathObjectPtr

xmlXPathObject * xmlXPathObjectPtr;


Enum xmlXPathObjectType

enum xmlXPathObjectType {
    XPATH_UNDEFINED = 0
    XPATH_NODESET = 1
    XPATH_BOOLEAN = 2
    XPATH_NUMBER = 3
    XPATH_STRING = 4
    XPATH_POINT = 5
    XPATH_RANGE = 6
    XPATH_LOCATIONSET = 7
    XPATH_USERS = 8
    XPATH_XSLT_TREE = 9 /*  An XSLT value tree, non modifiable */
};


Structure xmlXPathParserContext

struct _xmlXPathParserContext {
    const xmlChar *	cur	: the current char being parsed
    const xmlChar *	base	: the full expression
    int	error	: error code
    xmlXPathContextPtr	context	: the evaluation context
    xmlXPathObjectPtr	value	: the current value
    int	valueNr	: number of values stacked
    int	valueMax	: max number of values stacked
    xmlXPathObjectPtr *	valueTab	: stack of values
    xmlXPathCompExprPtr	comp	: the precompiled expression
    int	xptr	: it this an XPointer expression
    xmlNodePtr	ancestor	: used for walking preceding axis
    int	valueFrame	: used to limit Pop on the stack
} xmlXPathParserContext;


Typedef xmlXPathParserContextPtr

xmlXPathParserContext * xmlXPathParserContextPtr;


Structure xmlXPathType

struct _xmlXPathType {
    const xmlChar *	name	: the type name
    xmlXPathConvertFunc	func	: the conversion function
} xmlXPathType;


Typedef xmlXPathTypePtr

xmlXPathType * xmlXPathTypePtr;


Structure xmlXPathVariable

struct _xmlXPathVariable {
    const xmlChar *	name	: the variable name
    xmlXPathObjectPtr	value	: the value
} xmlXPathVariable;


Typedef xmlXPathVariablePtr

xmlXPathVariable * xmlXPathVariablePtr;


Function type xmlXPathAxisFunc

xmlXPathObjectPtr	xmlXPathAxisFunc	(xmlXPathParserContextPtr ctxt, 
xmlXPathObjectPtr cur)

An axis traversal function. To traverse an axis, the engine calls the first time with cur == NULL and repeat until the function returns NULL indicating the end of the axis traversal.

ctxt:the XPath interpreter context
cur:the previous node being explored on that axis
Returns:the next node in that axis or NULL if at the end of the axis.

Function type xmlXPathConvertFunc

int	xmlXPathConvertFunc		(xmlXPathObjectPtr obj, 
int type)

A conversion function is associated to a type and used to cast the new type to primitive values.

obj:an XPath object
type:the number of the target type
Returns:-1 in case of error, 0 otherwise

Function type xmlXPathEvalFunc

void	xmlXPathEvalFunc		(xmlXPathParserContextPtr ctxt, 
int nargs)

An XPath evaluation function, the parameters are on the XPath context stack.

ctxt:an XPath parser context
nargs:the number of arguments passed to the function

Function type xmlXPathFuncLookupFunc

xmlXPathFunction	xmlXPathFuncLookupFunc	(void * ctxt, 
const xmlChar * name,
const xmlChar * ns_uri)

Prototype for callbacks used to plug function lookup in the XPath engine.

ctxt:an XPath context
name:name of the function
ns_uri:the namespace name hosting this function
Returns:the XPath function or NULL if not found.

Function type xmlXPathFunction

void	xmlXPathFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

An XPath function. The arguments (if any) are popped out from the context stack and the result is pushed on the stack.

ctxt:the XPath interprestation context
nargs:the number of arguments

Function type xmlXPathVariableLookupFunc

xmlXPathObjectPtr	xmlXPathVariableLookupFunc	(void * ctxt, 
const xmlChar * name,
const xmlChar * ns_uri)

Prototype for callbacks used to plug variable lookup in the XPath engine.

ctxt:an XPath context
name:name of the variable
ns_uri:the namespace name hosting this variable
Returns:the XPath object value or NULL if not found.

Variable xmlXPathNAN

double xmlXPathNAN;


Variable xmlXPathNINF

double xmlXPathNINF;


Variable xmlXPathPINF

double xmlXPathPINF;



xmlXPathCastBooleanToString ()

xmlChar *	xmlXPathCastBooleanToString	(int val)

Converts a boolean to its string value.

val:a boolean
Returns:a newly allocated string.

xmlXPathCastNodeSetToBoolean ()

int	xmlXPathCastNodeSetToBoolean	(xmlNodeSetPtr ns)

Converts a node-set to its boolean value

ns:a node-set
Returns:the boolean value

xmlXPathCastNodeSetToNumber ()

double	xmlXPathCastNodeSetToNumber	(xmlNodeSetPtr ns)

Converts a node-set to its number value

ns:a node-set
Returns:the number value

xmlXPathCastNodeSetToString ()

xmlChar *	xmlXPathCastNodeSetToString	(xmlNodeSetPtr ns)

Converts a node-set to its string value.

ns:a node-set
Returns:a newly allocated string.

xmlXPathCastNodeToNumber ()

double	xmlXPathCastNodeToNumber	(xmlNodePtr node)

Converts a node to its number value

node:a node
Returns:the number value

xmlXPathCastNodeToString ()

xmlChar *	xmlXPathCastNodeToString	(xmlNodePtr node)

Converts a node to its string value.

node:a node
Returns:a newly allocated string.


xmlXPathCastNumberToString ()

xmlChar *	xmlXPathCastNumberToString	(double val)

Converts a number to its string value.

val:a number
Returns:a newly allocated string.

xmlXPathCastStringToBoolean ()

int	xmlXPathCastStringToBoolean	(const xmlChar * val)

Converts a string to its boolean value

val:a string
Returns:the boolean value

xmlXPathCastStringToNumber ()

double	xmlXPathCastStringToNumber	(const xmlChar * val)

Converts a string to its number value

val:a string
Returns:the number value

xmlXPathCastToBoolean ()

int	xmlXPathCastToBoolean		(xmlXPathObjectPtr val)

Converts an XPath object to its boolean value

val:an XPath object
Returns:the boolean value

xmlXPathCastToNumber ()

double	xmlXPathCastToNumber		(xmlXPathObjectPtr val)

Converts an XPath object to its number value

val:an XPath object
Returns:the number value

xmlXPathCastToString ()

xmlChar *	xmlXPathCastToString	(xmlXPathObjectPtr val)

Converts an existing object to its string() equivalent

val:an XPath object
Returns:the allocated string value of the object, NULL in case of error. It's up to the caller to free the string memory with xmlFree().

xmlXPathCmpNodes ()

int	xmlXPathCmpNodes		(xmlNodePtr node1, 
xmlNodePtr node2)

Compare two nodes w.r.t document order

node1:the first node
node2:the second node
Returns:-2 in case of error 1 if first point < second point, 0 if it's the same node, -1 otherwise

xmlXPathCompile ()

xmlXPathCompExprPtr	xmlXPathCompile	(const xmlChar * str)

Compile an XPath expression

str:the XPath expression
Returns:the xmlXPathCompExprPtr resulting from the compilation or NULL. the caller has to free the object.

xmlXPathCompiledEval ()

xmlXPathObjectPtr	xmlXPathCompiledEval	(xmlXPathCompExprPtr comp, 
xmlXPathContextPtr ctx)

Evaluate the Precompiled XPath expression in the given context.

comp:the compiled XPath expression
ctx:the XPath context
Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

xmlXPathCompiledEvalToBoolean ()

int	xmlXPathCompiledEvalToBoolean	(xmlXPathCompExprPtr comp, 
xmlXPathContextPtr ctxt)

Applies the XPath boolean() function on the result of the given compiled expression.

comp:the compiled XPath expression
ctxt:the XPath context
Returns:1 if the expression evaluated to true, 0 if to false and -1 in API and internal errors.

xmlXPathContextSetCache ()

int	xmlXPathContextSetCache		(xmlXPathContextPtr ctxt, 
int active,
int value,
int options)

Creates/frees an object cache on the XPath context. If activates XPath objects (xmlXPathObject) will be cached internally to be reused. @options: 0: This will set the XPath object caching: @value: This will set the maximum number of XPath objects to be cached per slot There are 5 slots for: node-set, string, number, boolean, and misc objects. Use <0 for the default number (100). Other values for @options have currently no effect.

ctxt:the XPath context
active:enables/disables (creates/frees) the cache
value:a value with semantics dependant on @options
options:options (currently only the value 0 is used)
Returns:0 if the setting succeeded, and -1 on API or internal errors.

xmlXPathConvertBoolean ()

xmlXPathObjectPtr	xmlXPathConvertBoolean	(xmlXPathObjectPtr val)

Converts an existing object to its boolean() equivalent

val:an XPath object
Returns:the new object, the old one is freed (or the operation is done directly on @val)

xmlXPathConvertNumber ()

xmlXPathObjectPtr	xmlXPathConvertNumber	(xmlXPathObjectPtr val)

Converts an existing object to its number() equivalent

val:an XPath object
Returns:the new object, the old one is freed (or the operation is done directly on @val)

xmlXPathConvertString ()

xmlXPathObjectPtr	xmlXPathConvertString	(xmlXPathObjectPtr val)

Converts an existing object to its string() equivalent

val:an XPath object
Returns:the new object, the old one is freed (or the operation is done directly on @val)

xmlXPathCtxtCompile ()

xmlXPathCompExprPtr	xmlXPathCtxtCompile	(xmlXPathContextPtr ctxt, 
const xmlChar * str)

Compile an XPath expression

ctxt:an XPath context
str:the XPath expression
Returns:the xmlXPathCompExprPtr resulting from the compilation or NULL. the caller has to free the object.

xmlXPathEval ()

xmlXPathObjectPtr	xmlXPathEval	(const xmlChar * str, 
xmlXPathContextPtr ctx)

Evaluate the XPath Location Path in the given context.

str:the XPath expression
ctx:the XPath context
Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

xmlXPathEvalExpression ()

xmlXPathObjectPtr	xmlXPathEvalExpression	(const xmlChar * str, 
xmlXPathContextPtr ctxt)

Evaluate the XPath expression in the given context.

str:the XPath expression
ctxt:the XPath context
Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

xmlXPathEvalPredicate ()

int	xmlXPathEvalPredicate		(xmlXPathContextPtr ctxt, 
xmlXPathObjectPtr res)

Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function.

ctxt:the XPath context
res:the Predicate Expression evaluation result
Returns:1 if predicate is true, 0 otherwise

xmlXPathFreeCompExpr ()

void	xmlXPathFreeCompExpr		(xmlXPathCompExprPtr comp)

Free up the memory allocated by @comp

comp:an XPATH comp


xmlXPathFreeNodeSet ()

void	xmlXPathFreeNodeSet		(xmlNodeSetPtr obj)

Free the NodeSet compound (not the actual nodes !).

obj:the xmlNodeSetPtr to free

xmlXPathFreeNodeSetList ()

void	xmlXPathFreeNodeSetList		(xmlXPathObjectPtr obj)

Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in the list contrary to xmlXPathFreeObject().

obj:an existing NodeSetList object





xmlXPathNewContext ()

xmlXPathContextPtr	xmlXPathNewContext	(xmlDocPtr doc)

Create a new xmlXPathContext

doc:the XML document
Returns:the xmlXPathContext just allocated. The caller will need to free it.

xmlXPathNodeEval ()

xmlXPathObjectPtr	xmlXPathNodeEval	(xmlNodePtr node, 
const xmlChar * str,
xmlXPathContextPtr ctx)

Evaluate the XPath Location Path in the given context. The node 'node' is set as the context node. The context node is not restored.

node:the node to to use as the context node
str:the XPath expression
ctx:the XPath context
Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

xmlXPathNodeSetCreate ()

xmlNodeSetPtr	xmlXPathNodeSetCreate	(xmlNodePtr val)

Create a new xmlNodeSetPtr of type double and of value @val

val:an initial xmlNodePtr, or NULL
Returns:the newly created object.

xmlXPathObjectCopy ()

xmlXPathObjectPtr	xmlXPathObjectCopy	(xmlXPathObjectPtr val)

allocate a new copy of a given object

val:the original object
Returns:the newly created object.

xmlXPathOrderDocElems ()

long	xmlXPathOrderDocElems		(xmlDocPtr doc)

Call this routine to speed up XPath computation on static documents. This stamps all the element nodes with the document order Like for line information, the order is kept in the element->content field, the value stored is actually - the node number (starting at -1) to be able to differentiate from line numbers.

doc:an input document
Returns:the number of elements found in the document or -1 in case of error.

xmlXPathSetContextNode ()

int	xmlXPathSetContextNode		(xmlNodePtr node, 
xmlXPathContextPtr ctx)

Sets 'node' as the context node. The node must be in the same document as that associated with the context.

node:the node to to use as the context node
ctx:the XPath context
Returns:-1 in case of error or 0 if successful

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlIO.html0000644000175000017500000016023012134171044020234 0ustar aronaron xmlIO: interface for the I/O interfaces used by the parser

xmlIO

xmlIO - interface for the I/O interfaces used by the parser

interface for the I/O interfaces used by the parser

Author(s): Daniel Veillard

Synopsis

int	xmlIOHTTPRead			(void * context, 
char * buffer,
int len); typedef int xmlInputMatchCallback (char const * filename); void xmlRegisterDefaultOutputCallbacks (void); int xmlFileClose (void * context); typedef int xmlOutputMatchCallback (char const * filename); int xmlParserInputBufferPush (xmlParserInputBufferPtr in,
int len,
const char * buf); int xmlIOFTPRead (void * context,
char * buffer,
int len); void xmlRegisterHTTPPostCallbacks (void); void * xmlIOFTPOpen (const char * filename); int xmlIOFTPClose (void * context); void * xmlFileOpen (const char * filename); xmlOutputBufferPtr xmlOutputBufferCreateFile (FILE * file,
xmlCharEncodingHandlerPtr encoder); int xmlCheckFilename (const char * path); typedef void * xmlOutputOpenCallback (char const * filename); xmlParserInputBufferPtr xmlParserInputBufferCreateFilename (const char * URI,
xmlCharEncoding enc); int xmlOutputBufferClose (xmlOutputBufferPtr out); xmlParserInputBufferPtr xmlAllocParserInputBuffer (xmlCharEncoding enc); xmlOutputBufferPtr xmlOutputBufferCreateIO (xmlOutputWriteCallback iowrite,
xmlOutputCloseCallback ioclose,
void * ioctx,
xmlCharEncodingHandlerPtr encoder); typedef int xmlOutputWriteCallback (void * context,
const char * buffer,
int len); int xmlOutputBufferFlush (xmlOutputBufferPtr out); xmlParserInputPtr xmlCheckHTTPInput (xmlParserCtxtPtr ctxt,
xmlParserInputPtr ret); int xmlRegisterOutputCallbacks (xmlOutputMatchCallback matchFunc,
xmlOutputOpenCallback openFunc,
xmlOutputWriteCallback writeFunc,
xmlOutputCloseCallback closeFunc); xmlParserInputBufferPtr xmlParserInputBufferCreateMem (const char * mem,
int size,
xmlCharEncoding enc); int xmlIOFTPMatch (const char * filename); int xmlRegisterInputCallbacks (xmlInputMatchCallback matchFunc,
xmlInputOpenCallback openFunc,
xmlInputReadCallback readFunc,
xmlInputCloseCallback closeFunc); void xmlFreeParserInputBuffer (xmlParserInputBufferPtr in); void xmlRegisterDefaultInputCallbacks (void); int xmlParserInputBufferGrow (xmlParserInputBufferPtr in,
int len); typedef int xmlOutputCloseCallback (void * context); xmlOutputBufferPtr xmlAllocOutputBuffer (xmlCharEncodingHandlerPtr encoder); xmlParserInputPtr xmlNoNetExternalEntityLoader (const char * URL,
const char * ID,
xmlParserCtxtPtr ctxt); xmlOutputBufferPtr xmlOutputBufferCreateBuffer (xmlBufferPtr buffer,
xmlCharEncodingHandlerPtr encoder); int xmlIOHTTPMatch (const char * filename); void * xmlIOHTTPOpen (const char * filename); xmlParserInputBufferPtr xmlParserInputBufferCreateIO (xmlInputReadCallback ioread,
xmlInputCloseCallback ioclose,
void * ioctx,
xmlCharEncoding enc); xmlOutputBufferPtr xmlOutputBufferCreateFd (int fd,
xmlCharEncodingHandlerPtr encoder); xmlChar * xmlNormalizeWindowsPath (const xmlChar * path); typedef int xmlInputReadCallback (void * context,
char * buffer,
int len); xmlParserInputBufferPtr xmlParserInputBufferCreateStatic (const char * mem,
int size,
xmlCharEncoding enc); const xmlChar * xmlOutputBufferGetContent (xmlOutputBufferPtr out); int xmlIOHTTPClose (void * context); int xmlOutputBufferWriteEscape (xmlOutputBufferPtr out,
const xmlChar * str,
xmlCharEncodingOutputFunc escaping); xmlOutputBufferPtr xmlOutputBufferCreateFilename (const char * URI,
xmlCharEncodingHandlerPtr encoder,
int compression); size_t xmlOutputBufferGetSize (xmlOutputBufferPtr out); void xmlCleanupOutputCallbacks (void); typedef void * xmlInputOpenCallback (char const * filename); int xmlParserInputBufferRead (xmlParserInputBufferPtr in,
int len); int xmlOutputBufferWriteString (xmlOutputBufferPtr out,
const char * str); int xmlFileMatch (const char * filename); int xmlPopInputCallbacks (void); int xmlFileRead (void * context,
char * buffer,
int len); xmlParserInputBufferPtr xmlParserInputBufferCreateFile (FILE * file,
xmlCharEncoding enc); char * xmlParserGetDirectory (const char * filename); int xmlOutputBufferWrite (xmlOutputBufferPtr out,
int len,
const char * buf); void xmlCleanupInputCallbacks (void); typedef int xmlInputCloseCallback (void * context); void * xmlIOHTTPOpenW (const char * post_uri,
int compression); xmlParserInputBufferPtr xmlParserInputBufferCreateFd (int fd,
xmlCharEncoding enc);

Description

Details









xmlAllocOutputBuffer ()

xmlOutputBufferPtr	xmlAllocOutputBuffer	(xmlCharEncodingHandlerPtr encoder)

Create a buffered parser output

encoder:the encoding converter or NULL
Returns:the new parser output or NULL

xmlAllocParserInputBuffer ()

xmlParserInputBufferPtr	xmlAllocParserInputBuffer	(xmlCharEncoding enc)

Create a buffered parser input for progressive parsing

enc:the charset encoding if known
Returns:the new parser input or NULL


xmlCheckHTTPInput ()

xmlParserInputPtr	xmlCheckHTTPInput	(xmlParserCtxtPtr ctxt, 
xmlParserInputPtr ret)

Check an input in case it was created from an HTTP stream, in that case it will handle encoding and update of the base URL in case of redirection. It also checks for HTTP errors in which case the input is cleanly freed up and an appropriate error is raised in context

ctxt:an XML parser context
ret:an XML parser input
Returns:the input or NULL in case of HTTP error.







xmlFreeParserInputBuffer ()

void	xmlFreeParserInputBuffer	(xmlParserInputBufferPtr in)

Free up the memory used by a buffered parser input

in:a buffered parser input










xmlNoNetExternalEntityLoader ()

xmlParserInputPtr	xmlNoNetExternalEntityLoader	(const char * URL, 
const char * ID,
xmlParserCtxtPtr ctxt)

A specific entity loader disabling network accesses, though still allowing local catalog accesses for resolution.

URL:the URL for the entity to load
ID:the System ID for the entity to load
ctxt:the context in which the entity is called or NULL
Returns:a new allocated xmlParserInputPtr, or NULL.

xmlNormalizeWindowsPath ()

xmlChar *	xmlNormalizeWindowsPath	(const xmlChar * path)

This function is obsolete. Please see xmlURIFromPath in uri.c for a better solution.

path:the input file path
Returns:a canonicalized version of the path

xmlOutputBufferClose ()

int	xmlOutputBufferClose		(xmlOutputBufferPtr out)

flushes and close the output I/O channel and free up all the associated resources

out:a buffered output
Returns:the number of byte written or -1 in case of error.

xmlOutputBufferCreateBuffer ()

xmlOutputBufferPtr	xmlOutputBufferCreateBuffer	(xmlBufferPtr buffer, 
xmlCharEncodingHandlerPtr encoder)

Create a buffered output for the progressive saving to a xmlBuffer

buffer:a xmlBufferPtr
encoder:the encoding converter or NULL
Returns:the new parser output or NULL

xmlOutputBufferCreateFd ()

xmlOutputBufferPtr	xmlOutputBufferCreateFd	(int fd, 
xmlCharEncodingHandlerPtr encoder)

Create a buffered output for the progressive saving to a file descriptor

fd:a file descriptor number
encoder:the encoding converter or NULL
Returns:the new parser output or NULL

xmlOutputBufferCreateFile ()

xmlOutputBufferPtr	xmlOutputBufferCreateFile	(FILE * file, 
xmlCharEncodingHandlerPtr encoder)

Create a buffered output for the progressive saving to a FILE * buffered C I/O

file:a FILE*
encoder:the encoding converter or NULL
Returns:the new parser output or NULL

xmlOutputBufferCreateFilename ()

xmlOutputBufferPtr	xmlOutputBufferCreateFilename	(const char * URI, 
xmlCharEncodingHandlerPtr encoder,
int compression)

Create a buffered output for the progressive saving of a file If filename is "-' then we use stdout as the output. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. TODO: currently if compression is set, the library only support writing to a local file.

URI:a C string containing the URI or filename
encoder:the encoding converter or NULL
compression:the compression ration (0 none, 9 max).
Returns:the new output or NULL

xmlOutputBufferCreateIO ()

xmlOutputBufferPtr	xmlOutputBufferCreateIO	(xmlOutputWriteCallback iowrite, 
xmlOutputCloseCallback ioclose,
void * ioctx,
xmlCharEncodingHandlerPtr encoder)

Create a buffered output for the progressive saving to an I/O handler

iowrite:an I/O write function
ioclose:an I/O close function
ioctx:an I/O handler
encoder:the charset encoding if known
Returns:the new parser output or NULL

xmlOutputBufferFlush ()

int	xmlOutputBufferFlush		(xmlOutputBufferPtr out)

flushes the output I/O channel

out:a buffered output
Returns:the number of byte written or -1 in case of error.

xmlOutputBufferGetContent ()

const xmlChar *	xmlOutputBufferGetContent	(xmlOutputBufferPtr out)

Gives a pointer to the data currently held in the output buffer

out:an xmlOutputBufferPtr
Returns:a pointer to the data or NULL in case of error

xmlOutputBufferGetSize ()

size_t	xmlOutputBufferGetSize		(xmlOutputBufferPtr out)

Gives the length of the data currently held in the output buffer

out:an xmlOutputBufferPtr
Returns:0 in case or error or no data is held, the size otherwise

xmlOutputBufferWrite ()

int	xmlOutputBufferWrite		(xmlOutputBufferPtr out, 
int len,
const char * buf)

Write the content of the array in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.

out:a buffered parser output
len:the size in bytes of the array.
buf:an char array
Returns:the number of chars immediately written, or -1 in case of error.

xmlOutputBufferWriteEscape ()

int	xmlOutputBufferWriteEscape	(xmlOutputBufferPtr out, 
const xmlChar * str,
xmlCharEncodingOutputFunc escaping)

Write the content of the string in the output I/O buffer This routine escapes the caracters and then handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.

out:a buffered parser output
str:a zero terminated UTF-8 string
escaping:an optional escaping function (or NULL)
Returns:the number of chars immediately written, or -1 in case of error.

xmlOutputBufferWriteString ()

int	xmlOutputBufferWriteString	(xmlOutputBufferPtr out, 
const char * str)

Write the content of the string in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.

out:a buffered parser output
str:a zero terminated C string
Returns:the number of chars immediately written, or -1 in case of error.


xmlParserInputBufferCreateFd ()

xmlParserInputBufferPtr	xmlParserInputBufferCreateFd	(int fd, 
xmlCharEncoding enc)

Create a buffered parser input for the progressive parsing for the input from a file descriptor

fd:a file descriptor number
enc:the charset encoding if known
Returns:the new parser input or NULL

xmlParserInputBufferCreateFile ()

xmlParserInputBufferPtr	xmlParserInputBufferCreateFile	(FILE * file, 
xmlCharEncoding enc)

Create a buffered parser input for the progressive parsing of a FILE * buffered C I/O

file:a FILE*
enc:the charset encoding if known
Returns:the new parser input or NULL

xmlParserInputBufferCreateFilename ()

xmlParserInputBufferPtr	xmlParserInputBufferCreateFilename	(const char * URI, 
xmlCharEncoding enc)

Create a buffered parser input for the progressive parsing of a file If filename is "-' then we use stdin as the input. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. Do an encoding check if enc == XML_CHAR_ENCODING_NONE

URI:a C string containing the URI or filename
enc:the charset encoding if known
Returns:the new parser input or NULL

xmlParserInputBufferCreateIO ()

xmlParserInputBufferPtr	xmlParserInputBufferCreateIO	(xmlInputReadCallback ioread, 
xmlInputCloseCallback ioclose,
void * ioctx,
xmlCharEncoding enc)

Create a buffered parser input for the progressive parsing for the input from an I/O handler

ioread:an I/O read function
ioclose:an I/O close function
ioctx:an I/O handler
enc:the charset encoding if known
Returns:the new parser input or NULL

xmlParserInputBufferCreateMem ()

xmlParserInputBufferPtr	xmlParserInputBufferCreateMem	(const char * mem, 
int size,
xmlCharEncoding enc)

Create a buffered parser input for the progressive parsing for the input from a memory area.

mem:the memory input
size:the length of the memory block
enc:the charset encoding if known
Returns:the new parser input or NULL

xmlParserInputBufferCreateStatic ()

xmlParserInputBufferPtr	xmlParserInputBufferCreateStatic	(const char * mem, 
int size,
xmlCharEncoding enc)

Create a buffered parser input for the progressive parsing for the input from an immutable memory area. This will not copy the memory area to the buffer, but the memory is expected to be available until the end of the parsing, this is useful for example when using mmap'ed file.

mem:the memory input
size:the length of the memory block
enc:the charset encoding if known
Returns:the new parser input or NULL

xmlParserInputBufferGrow ()

int	xmlParserInputBufferGrow	(xmlParserInputBufferPtr in, 
int len)

Grow up the content of the input buffer, the old data are preserved This routine handle the I18N transcoding to internal UTF-8 This routine is used when operating the parser in normal (pull) mode TODO: one should be able to remove one extra copy by copying directly onto in->buffer or in->raw

in:a buffered parser input
len:indicative value of the amount of chars to read
Returns:the number of chars read and stored in the buffer, or -1 in case of error.

xmlParserInputBufferPush ()

int	xmlParserInputBufferPush	(xmlParserInputBufferPtr in, 
int len,
const char * buf)

Push the content of the arry in the input buffer This routine handle the I18N transcoding to internal UTF-8 This is used when operating the parser in progressive (push) mode.

in:a buffered parser input
len:the size in bytes of the array.
buf:an char array
Returns:the number of chars read and stored in the buffer, or -1 in case of error.

xmlParserInputBufferRead ()

int	xmlParserInputBufferRead	(xmlParserInputBufferPtr in, 
int len)

Refresh the content of the input buffer, the old data are considered consumed This routine handle the I18N transcoding to internal UTF-8

in:a buffered parser input
len:indicative value of the amount of chars to read
Returns:the number of chars read and stored in the buffer, or -1 in case of error.





xmlRegisterInputCallbacks ()

int	xmlRegisterInputCallbacks	(xmlInputMatchCallback matchFunc, 
xmlInputOpenCallback openFunc,
xmlInputReadCallback readFunc,
xmlInputCloseCallback closeFunc)

Register a new set of I/O callback for handling parser input.

matchFunc:the xmlInputMatchCallback
openFunc:the xmlInputOpenCallback
readFunc:the xmlInputReadCallback
closeFunc:the xmlInputCloseCallback
Returns:the registered handler number or -1 in case of error

xmlRegisterOutputCallbacks ()

int	xmlRegisterOutputCallbacks	(xmlOutputMatchCallback matchFunc, 
xmlOutputOpenCallback openFunc,
xmlOutputWriteCallback writeFunc,
xmlOutputCloseCallback closeFunc)

Register a new set of I/O callback for handling output.

matchFunc:the xmlOutputMatchCallback
openFunc:the xmlOutputOpenCallback
writeFunc:the xmlOutputWriteCallback
closeFunc:the xmlOutputCloseCallback
Returns:the registered handler number or -1 in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-valid.html0000644000175000017500000030031012134171044020276 0ustar aronaron valid: The DTD validation

valid

valid - The DTD validation

API for the DTD handling and the validity checking

Author(s): Daniel Veillard

Synopsis

#define XML_CTXT_FINISH_DTD_0;
#define XML_CTXT_FINISH_DTD_1;
typedef struct _xmlHashTable xmlElementTable;
typedef xmlValidState * xmlValidStatePtr;
typedef xmlIDTable * xmlIDTablePtr;
typedef xmlNotationTable * xmlNotationTablePtr;
typedef struct _xmlValidCtxt xmlValidCtxt;
typedef xmlElementTable * xmlElementTablePtr;
typedef xmlRefTable * xmlRefTablePtr;
typedef struct _xmlHashTable xmlNotationTable;
typedef struct _xmlHashTable xmlRefTable;
typedef struct _xmlValidState xmlValidState;
typedef struct _xmlHashTable xmlAttributeTable;
typedef xmlAttributeTable * xmlAttributeTablePtr;
typedef struct _xmlHashTable xmlIDTable;
typedef xmlValidCtxt * xmlValidCtxtPtr;
void	xmlFreeNotationTable		(xmlNotationTablePtr table);
int	xmlValidateNameValue		(const xmlChar * value);
void	xmlSnprintfElementContent	(char * buf, 
int size,
xmlElementContentPtr content,
int englob); xmlRefPtr xmlAddRef (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
const xmlChar * value,
xmlAttrPtr attr); void xmlDumpAttributeDecl (xmlBufferPtr buf,
xmlAttributePtr attr); int xmlValidateDocumentFinal (xmlValidCtxtPtr ctxt,
xmlDocPtr doc); int xmlValidateDtdFinal (xmlValidCtxtPtr ctxt,
xmlDocPtr doc); void xmlDumpAttributeTable (xmlBufferPtr buf,
xmlAttributeTablePtr table); xmlEnumerationPtr xmlCreateEnumeration (const xmlChar * name); int xmlValidateOneAttribute (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem,
xmlAttrPtr attr,
const xmlChar * value); int xmlValidGetValidElements (xmlNode * prev,
xmlNode * next,
const xmlChar ** names,
int max); int xmlIsMixedElement (xmlDocPtr doc,
const xmlChar * name); void xmlDumpNotationDecl (xmlBufferPtr buf,
xmlNotationPtr nota); int xmlIsID (xmlDocPtr doc,
xmlNodePtr elem,
xmlAttrPtr attr); xmlAttributePtr xmlGetDtdQAttrDesc (xmlDtdPtr dtd,
const xmlChar * elem,
const xmlChar * name,
const xmlChar * prefix); xmlElementContentPtr xmlNewDocElementContent (xmlDocPtr doc,
const xmlChar * name,
xmlElementContentType type); void xmlFreeAttributeTable (xmlAttributeTablePtr table); typedef void xmlValidityErrorFunc (void * ctx,
const char * msg,
... ...); int xmlValidateAttributeDecl (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlAttributePtr attr); xmlElementPtr xmlGetDtdQElementDesc (xmlDtdPtr dtd,
const xmlChar * name,
const xmlChar * prefix); xmlNotationTablePtr xmlCopyNotationTable (xmlNotationTablePtr table); int xmlValidateDocument (xmlValidCtxtPtr ctxt,
xmlDocPtr doc); int xmlValidGetPotentialChildren (xmlElementContent * ctree,
const xmlChar ** names,
int * len,
int max); xmlNotationPtr xmlAddNotationDecl (xmlValidCtxtPtr ctxt,
xmlDtdPtr dtd,
const xmlChar * name,
const xmlChar * PublicID,
const xmlChar * SystemID); int xmlValidateElementDecl (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlElementPtr elem); xmlAttributePtr xmlAddAttributeDecl (xmlValidCtxtPtr ctxt,
xmlDtdPtr dtd,
const xmlChar * elem,
const xmlChar * name,
const xmlChar * ns,
xmlAttributeType type,
xmlAttributeDefault def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree); xmlAttrPtr xmlGetID (xmlDocPtr doc,
const xmlChar * ID); xmlElementTablePtr xmlCopyElementTable (xmlElementTablePtr table); xmlListPtr xmlGetRefs (xmlDocPtr doc,
const xmlChar * ID); void xmlSprintfElementContent (char * buf,
xmlElementContentPtr content,
int englob); int xmlValidateOneElement (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem); int xmlValidateNmtokenValue (const xmlChar * value); void xmlDumpElementTable (xmlBufferPtr buf,
xmlElementTablePtr table); xmlChar * xmlValidCtxtNormalizeAttributeValue (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * name,
const xmlChar * value); void xmlDumpElementDecl (xmlBufferPtr buf,
xmlElementPtr elem); void xmlFreeElementContent (xmlElementContentPtr cur); int xmlValidateOneNamespace (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * prefix,
xmlNsPtr ns,
const xmlChar * value); int xmlValidatePushElement (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * qname); int xmlIsRef (xmlDocPtr doc,
xmlNodePtr elem,
xmlAttrPtr attr); xmlElementContentPtr xmlCopyDocElementContent (xmlDocPtr doc,
xmlElementContentPtr cur); xmlIDPtr xmlAddID (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
const xmlChar * value,
xmlAttrPtr attr); void xmlFreeRefTable (xmlRefTablePtr table); int xmlValidateNamesValue (const xmlChar * value); int xmlRemoveID (xmlDocPtr doc,
xmlAttrPtr attr); void xmlFreeElementTable (xmlElementTablePtr table); void xmlFreeIDTable (xmlIDTablePtr table); void xmlFreeValidCtxt (xmlValidCtxtPtr cur); xmlAttributeTablePtr xmlCopyAttributeTable (xmlAttributeTablePtr table); xmlElementContentPtr xmlCopyElementContent (xmlElementContentPtr cur); int xmlValidateAttributeValue (xmlAttributeType type,
const xmlChar * value); int xmlRemoveRef (xmlDocPtr doc,
xmlAttrPtr attr); typedef void xmlValidityWarningFunc (void * ctx,
const char * msg,
... ...); int xmlValidatePopElement (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * qname); void xmlFreeEnumeration (xmlEnumerationPtr cur); xmlEnumerationPtr xmlCopyEnumeration (xmlEnumerationPtr cur); xmlAttributePtr xmlGetDtdAttrDesc (xmlDtdPtr dtd,
const xmlChar * elem,
const xmlChar * name); int xmlValidateDtd (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlDtdPtr dtd); xmlValidCtxtPtr xmlNewValidCtxt (void); void xmlDumpNotationTable (xmlBufferPtr buf,
xmlNotationTablePtr table); xmlElementPtr xmlAddElementDecl (xmlValidCtxtPtr ctxt,
xmlDtdPtr dtd,
const xmlChar * name,
xmlElementTypeVal type,
xmlElementContentPtr content); xmlChar * xmlValidNormalizeAttributeValue (xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * name,
const xmlChar * value); int xmlValidBuildContentModel (xmlValidCtxtPtr ctxt,
xmlElementPtr elem); int xmlValidateElement (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem); int xmlValidateNotationUse (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
const xmlChar * notationName); int xmlValidateRoot (xmlValidCtxtPtr ctxt,
xmlDocPtr doc); int xmlValidateNotationDecl (xmlValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNotationPtr nota); xmlElementContentPtr xmlNewElementContent (const xmlChar * name,
xmlElementContentType type); xmlElementPtr xmlGetDtdElementDesc (xmlDtdPtr dtd,
const xmlChar * name); xmlNotationPtr xmlGetDtdNotationDesc (xmlDtdPtr dtd,
const xmlChar * name); int xmlValidatePushCData (xmlValidCtxtPtr ctxt,
const xmlChar * data,
int len); int xmlValidateNmtokensValue (const xmlChar * value); void xmlFreeDocElementContent (xmlDocPtr doc,
xmlElementContentPtr cur);

Description

Details

Macro XML_CTXT_FINISH_DTD_0

#define XML_CTXT_FINISH_DTD_0;

Special value for finishDtd field when embedded in an xmlParserCtxt


Macro XML_CTXT_FINISH_DTD_1

#define XML_CTXT_FINISH_DTD_1;

Special value for finishDtd field when embedded in an xmlParserCtxt


Structure xmlAttributeTable

struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlAttributeTable;


Typedef xmlAttributeTablePtr

xmlAttributeTable * xmlAttributeTablePtr;


Structure xmlElementTable

struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlElementTable;


Typedef xmlElementTablePtr

xmlElementTable * xmlElementTablePtr;


Structure xmlIDTable

struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlIDTable;


Typedef xmlIDTablePtr

xmlIDTable * xmlIDTablePtr;


Structure xmlNotationTable

struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlNotationTable;


Typedef xmlNotationTablePtr

xmlNotationTable * xmlNotationTablePtr;


Structure xmlRefTable

struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlRefTable;


Typedef xmlRefTablePtr

xmlRefTable * xmlRefTablePtr;


Structure xmlValidCtxt

struct _xmlValidCtxt {
    void *	userData	: user specific data block
    xmlValidityErrorFunc	error	: the callback in case of errors
    xmlValidityWarningFunc	warning	: the callback in case of warning Node analysis stack used when validat
    xmlNodePtr	node	: Current parsed Node
    int	nodeNr	: Depth of the parsing stack
    int	nodeMax	: Max depth of the parsing stack
    xmlNodePtr *	nodeTab	: array of nodes
    unsigned int	finishDtd	: finished validating the Dtd ?
    xmlDocPtr	doc	: the document
    int	valid	: temporary validity check result state state used for non-determinist
    xmlValidState *	vstate	: current state
    int	vstateNr	: Depth of the validation stack
    int	vstateMax	: Max depth of the validation stack
    xmlValidState *	vstateTab	: array of validation states
    xmlAutomataPtr	am	: the automata
    xmlAutomataStatePtr	state	: used to build the automata
    void *	am
    void *	state
} xmlValidCtxt;


Typedef xmlValidCtxtPtr

xmlValidCtxt * xmlValidCtxtPtr;


Structure xmlValidState

struct _xmlValidState {
The content of this structure is not made public by the API.
} xmlValidState;


Typedef xmlValidStatePtr

xmlValidState * xmlValidStatePtr;




xmlAddAttributeDecl ()

xmlAttributePtr	xmlAddAttributeDecl	(xmlValidCtxtPtr ctxt, 
xmlDtdPtr dtd,
const xmlChar * elem,
const xmlChar * name,
const xmlChar * ns,
xmlAttributeType type,
xmlAttributeDefault def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree)

Register a new attribute declaration Note that @tree becomes the ownership of the DTD

ctxt:the validation context
dtd:pointer to the DTD
elem:the element name
name:the attribute name
ns:the attribute namespace prefix
type:the attribute type
def:the attribute default type
defaultValue:the attribute default value
tree:if it's an enumeration, the associated list
Returns:NULL if not new, otherwise the attribute decl

xmlAddElementDecl ()

xmlElementPtr	xmlAddElementDecl	(xmlValidCtxtPtr ctxt, 
xmlDtdPtr dtd,
const xmlChar * name,
xmlElementTypeVal type,
xmlElementContentPtr content)

Register a new element declaration

ctxt:the validation context
dtd:pointer to the DTD
name:the entity name
type:the element type
content:the element content tree or NULL
Returns:NULL if not, otherwise the entity

xmlAddID ()

xmlIDPtr	xmlAddID		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
const xmlChar * value,
xmlAttrPtr attr)

Register a new id declaration

ctxt:the validation context
doc:pointer to the document
value:the value name
attr:the attribute holding the ID
Returns:NULL if not, otherwise the new xmlIDPtr

xmlAddNotationDecl ()

xmlNotationPtr	xmlAddNotationDecl	(xmlValidCtxtPtr ctxt, 
xmlDtdPtr dtd,
const xmlChar * name,
const xmlChar * PublicID,
const xmlChar * SystemID)

Register a new notation declaration

ctxt:the validation context
dtd:pointer to the DTD
name:the entity name
PublicID:the public identifier or NULL
SystemID:the system identifier or NULL
Returns:NULL if not, otherwise the entity

xmlAddRef ()

xmlRefPtr	xmlAddRef		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
const xmlChar * value,
xmlAttrPtr attr)

Register a new ref declaration

ctxt:the validation context
doc:pointer to the document
value:the value name
attr:the attribute holding the Ref
Returns:NULL if not, otherwise the new xmlRefPtr

xmlCopyAttributeTable ()

xmlAttributeTablePtr	xmlCopyAttributeTable	(xmlAttributeTablePtr table)

Build a copy of an attribute table.

table:An attribute table
Returns:the new xmlAttributeTablePtr or NULL in case of error.

xmlCopyDocElementContent ()

xmlElementContentPtr	xmlCopyDocElementContent	(xmlDocPtr doc, 
xmlElementContentPtr cur)

Build a copy of an element content description.

doc:the document owning the element declaration
cur:An element content pointer.
Returns:the new xmlElementContentPtr or NULL in case of error.

xmlCopyElementContent ()

xmlElementContentPtr	xmlCopyElementContent	(xmlElementContentPtr cur)

Build a copy of an element content description. Deprecated, use xmlCopyDocElementContent instead

cur:An element content pointer.
Returns:the new xmlElementContentPtr or NULL in case of error.

xmlCopyElementTable ()

xmlElementTablePtr	xmlCopyElementTable	(xmlElementTablePtr table)

Build a copy of an element table.

table:An element table
Returns:the new xmlElementTablePtr or NULL in case of error.

xmlCopyEnumeration ()

xmlEnumerationPtr	xmlCopyEnumeration	(xmlEnumerationPtr cur)

Copy an enumeration attribute node (recursive).

cur:the tree to copy.
Returns:the xmlEnumerationPtr just created or NULL in case of error.

xmlCopyNotationTable ()

xmlNotationTablePtr	xmlCopyNotationTable	(xmlNotationTablePtr table)

Build a copy of a notation table.

table:A notation table
Returns:the new xmlNotationTablePtr or NULL in case of error.

xmlCreateEnumeration ()

xmlEnumerationPtr	xmlCreateEnumeration	(const xmlChar * name)

create and initialize an enumeration attribute node.

name:the enumeration name or NULL
Returns:the xmlEnumerationPtr just created or NULL in case of error.

xmlDumpAttributeDecl ()

void	xmlDumpAttributeDecl		(xmlBufferPtr buf, 
xmlAttributePtr attr)

This will dump the content of the attribute declaration as an XML DTD definition

buf:the XML buffer output
attr:An attribute declaration

xmlDumpAttributeTable ()

void	xmlDumpAttributeTable		(xmlBufferPtr buf, 
xmlAttributeTablePtr table)

This will dump the content of the attribute table as an XML DTD definition

buf:the XML buffer output
table:An attribute table

xmlDumpElementDecl ()

void	xmlDumpElementDecl		(xmlBufferPtr buf, 
xmlElementPtr elem)

This will dump the content of the element declaration as an XML DTD definition

buf:the XML buffer output
elem:An element table

xmlDumpElementTable ()

void	xmlDumpElementTable		(xmlBufferPtr buf, 
xmlElementTablePtr table)

This will dump the content of the element table as an XML DTD definition

buf:the XML buffer output
table:An element table

xmlDumpNotationDecl ()

void	xmlDumpNotationDecl		(xmlBufferPtr buf, 
xmlNotationPtr nota)

This will dump the content the notation declaration as an XML DTD definition

buf:the XML buffer output
nota:A notation declaration

xmlDumpNotationTable ()

void	xmlDumpNotationTable		(xmlBufferPtr buf, 
xmlNotationTablePtr table)

This will dump the content of the notation table as an XML DTD definition

buf:the XML buffer output
table:A notation table

xmlFreeAttributeTable ()

void	xmlFreeAttributeTable		(xmlAttributeTablePtr table)

Deallocate the memory used by an entities hash table.

table:An attribute table

xmlFreeDocElementContent ()

void	xmlFreeDocElementContent	(xmlDocPtr doc, 
xmlElementContentPtr cur)

Free an element content structure. The whole subtree is removed.

doc:the document owning the element declaration
cur:the element content tree to free

xmlFreeElementContent ()

void	xmlFreeElementContent		(xmlElementContentPtr cur)

Free an element content structure. The whole subtree is removed. Deprecated, use xmlFreeDocElementContent instead

cur:the element content tree to free

xmlFreeElementTable ()

void	xmlFreeElementTable		(xmlElementTablePtr table)

Deallocate the memory used by an element hash table.

table:An element table

xmlFreeEnumeration ()

void	xmlFreeEnumeration		(xmlEnumerationPtr cur)

free an enumeration attribute node (recursive).

cur:the tree to free.

xmlFreeIDTable ()

void	xmlFreeIDTable			(xmlIDTablePtr table)

Deallocate the memory used by an ID hash table.

table:An id table

xmlFreeNotationTable ()

void	xmlFreeNotationTable		(xmlNotationTablePtr table)

Deallocate the memory used by an entities hash table.

table:An notation table

xmlFreeRefTable ()

void	xmlFreeRefTable			(xmlRefTablePtr table)

Deallocate the memory used by an Ref hash table.

table:An ref table

xmlFreeValidCtxt ()

void	xmlFreeValidCtxt		(xmlValidCtxtPtr cur)

Free a validation context structure.

cur:the validation context to free

xmlGetDtdAttrDesc ()

xmlAttributePtr	xmlGetDtdAttrDesc	(xmlDtdPtr dtd, 
const xmlChar * elem,
const xmlChar * name)

Search the DTD for the description of this attribute on this element.

dtd:a pointer to the DtD to search
elem:the element name
name:the attribute name
Returns:the xmlAttributePtr if found or NULL

xmlGetDtdElementDesc ()

xmlElementPtr	xmlGetDtdElementDesc	(xmlDtdPtr dtd, 
const xmlChar * name)

Search the DTD for the description of this element

dtd:a pointer to the DtD to search
name:the element name
Returns:the xmlElementPtr if found or NULL

xmlGetDtdNotationDesc ()

xmlNotationPtr	xmlGetDtdNotationDesc	(xmlDtdPtr dtd, 
const xmlChar * name)

Search the DTD for the description of this notation

dtd:a pointer to the DtD to search
name:the notation name
Returns:the xmlNotationPtr if found or NULL

xmlGetDtdQAttrDesc ()

xmlAttributePtr	xmlGetDtdQAttrDesc	(xmlDtdPtr dtd, 
const xmlChar * elem,
const xmlChar * name,
const xmlChar * prefix)

Search the DTD for the description of this qualified attribute on this element.

dtd:a pointer to the DtD to search
elem:the element name
name:the attribute name
prefix:the attribute namespace prefix
Returns:the xmlAttributePtr if found or NULL

xmlGetDtdQElementDesc ()

xmlElementPtr	xmlGetDtdQElementDesc	(xmlDtdPtr dtd, 
const xmlChar * name,
const xmlChar * prefix)

Search the DTD for the description of this element

dtd:a pointer to the DtD to search
name:the element name
prefix:the element namespace prefix
Returns:the xmlElementPtr if found or NULL

xmlGetID ()

xmlAttrPtr	xmlGetID		(xmlDocPtr doc, 
const xmlChar * ID)

Search the attribute declaring the given ID

doc:pointer to the document
ID:the ID value
Returns:NULL if not found, otherwise the xmlAttrPtr defining the ID

xmlGetRefs ()

xmlListPtr	xmlGetRefs		(xmlDocPtr doc, 
const xmlChar * ID)

Find the set of references for the supplied ID.

doc:pointer to the document
ID:the ID value
Returns:NULL if not found, otherwise node set for the ID.

xmlIsID ()

int	xmlIsID			(xmlDocPtr doc, 
xmlNodePtr elem,
xmlAttrPtr attr)

Determine whether an attribute is of type ID. In case we have DTD(s) then this is done if DTD loading has been requested. In the case of HTML documents parsed with the HTML parser, then ID detection is done systematically.

doc:the document
elem:the element carrying the attribute
attr:the attribute
Returns:0 or 1 depending on the lookup result

xmlIsMixedElement ()

int	xmlIsMixedElement		(xmlDocPtr doc, 
const xmlChar * name)

Search in the DtDs whether an element accept Mixed content (or ANY) basically if it is supposed to accept text childs

doc:the document
name:the element name
Returns:0 if no, 1 if yes, and -1 if no element description is available

xmlIsRef ()

int	xmlIsRef			(xmlDocPtr doc, 
xmlNodePtr elem,
xmlAttrPtr attr)

Determine whether an attribute is of type Ref. In case we have DTD(s) then this is simple, otherwise we use an heuristic: name Ref (upper or lowercase).

doc:the document
elem:the element carrying the attribute
attr:the attribute
Returns:0 or 1 depending on the lookup result

xmlNewDocElementContent ()

xmlElementContentPtr	xmlNewDocElementContent	(xmlDocPtr doc, 
const xmlChar * name,
xmlElementContentType type)

Allocate an element content structure for the document.

doc:the document
name:the subelement name or NULL
type:the type of element content decl
Returns:NULL if not, otherwise the new element content structure

xmlNewElementContent ()

xmlElementContentPtr	xmlNewElementContent	(const xmlChar * name, 
xmlElementContentType type)

Allocate an element content structure. Deprecated in favor of xmlNewDocElementContent

name:the subelement name or NULL
type:the type of element content decl
Returns:NULL if not, otherwise the new element content structure

xmlNewValidCtxt ()

xmlValidCtxtPtr	xmlNewValidCtxt		(void)

Allocate a validation context structure.

Returns:NULL if not, otherwise the new validation context structure

xmlRemoveID ()

int	xmlRemoveID			(xmlDocPtr doc, 
xmlAttrPtr attr)

Remove the given attribute from the ID table maintained internally.

doc:the document
attr:the attribute
Returns:-1 if the lookup failed and 0 otherwise

xmlRemoveRef ()

int	xmlRemoveRef			(xmlDocPtr doc, 
xmlAttrPtr attr)

Remove the given attribute from the Ref table maintained internally.

doc:the document
attr:the attribute
Returns:-1 if the lookup failed and 0 otherwise

xmlSnprintfElementContent ()

void	xmlSnprintfElementContent	(char * buf, 
int size,
xmlElementContentPtr content,
int englob)

This will dump the content of the element content definition Intended just for the debug routine

buf:an output buffer
size:the buffer size
content:An element table
englob:1 if one must print the englobing parenthesis, 0 otherwise

xmlSprintfElementContent ()

void	xmlSprintfElementContent	(char * buf, 
xmlElementContentPtr content,
int englob)

Deprecated, unsafe, use xmlSnprintfElementContent

buf:an output buffer
content:An element table
englob:1 if one must print the englobing parenthesis, 0 otherwise

xmlValidBuildContentModel ()

int	xmlValidBuildContentModel	(xmlValidCtxtPtr ctxt, 
xmlElementPtr elem)

(Re)Build the automata associated to the content model of this element

ctxt:a validation context
elem:an element declaration node
Returns:1 in case of success, 0 in case of error

xmlValidCtxtNormalizeAttributeValue ()

xmlChar *	xmlValidCtxtNormalizeAttributeValue	(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * name,
const xmlChar * value)

Does the validation related extra step of the normalization of attribute values: If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by single space (#x20) character. Also check VC: Standalone Document Declaration in P32, and update ctxt->valid accordingly

ctxt:the validation context or NULL
doc:the document
elem:the parent
name:the attribute name
value:the attribute value
Returns:a new normalized string if normalization is needed, NULL otherwise the caller must free the returned value.

xmlValidGetPotentialChildren ()

int	xmlValidGetPotentialChildren	(xmlElementContent * ctree, 
const xmlChar ** names,
int * len,
int max)

Build/extend a list of potential children allowed by the content tree

ctree:an element content tree
names:an array to store the list of child names
len:a pointer to the number of element in the list
max:the size of the array
Returns:the number of element in the list, or -1 in case of error.

xmlValidGetValidElements ()

int	xmlValidGetValidElements	(xmlNode * prev, 
xmlNode * next,
const xmlChar ** names,
int max)

This function returns the list of authorized children to insert within an existing tree while respecting the validity constraints forced by the Dtd. The insertion point is defined using @prev and @next in the following ways: to insert before 'node': xmlValidGetValidElements(node->prev, node, ... to insert next 'node': xmlValidGetValidElements(node, node->next, ... to replace 'node': xmlValidGetValidElements(node->prev, node->next, ... to prepend a child to 'node': xmlValidGetValidElements(NULL, node->childs, to append a child to 'node': xmlValidGetValidElements(node->last, NULL, ... pointers to the element names are inserted at the beginning of the array and do not need to be freed.

prev:an element to insert after
next:an element to insert next
names:an array to store the list of child names
max:the size of the array
Returns:the number of element in the list, or -1 in case of error. If the function returns the value @max the caller is invited to grow the receiving array and retry.

xmlValidNormalizeAttributeValue ()

xmlChar *	xmlValidNormalizeAttributeValue	(xmlDocPtr doc, 
xmlNodePtr elem,
const xmlChar * name,
const xmlChar * value)

Does the validation related extra step of the normalization of attribute values: If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by single space (#x20) character.

doc:the document
elem:the parent
name:the attribute name
value:the attribute value
Returns:a new normalized string if normalization is needed, NULL otherwise the caller must free the returned value.

xmlValidateAttributeDecl ()

int	xmlValidateAttributeDecl	(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlAttributePtr attr)

Try to validate a single attribute definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Default Legal ] - [ VC: Enumeration ] - [ VC: ID Attribute Default ] The ID/IDREF uniqueness and matching are done separately

ctxt:the validation context
doc:a document instance
attr:an attribute definition
Returns:1 if valid or 0 otherwise

xmlValidateAttributeValue ()

int	xmlValidateAttributeValue	(xmlAttributeType type, 
const xmlChar * value)

Validate that the given attribute value match the proper production [ VC: ID ] Values of type ID must match the Name production.... [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names ... [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names ... [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens.

type:an attribute type
value:an attribute value
Returns:1 if valid or 0 otherwise

xmlValidateDocument ()

int	xmlValidateDocument		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc)

Try to validate the document instance basically it does the all the checks described by the XML Rec i.e. validates the internal and external subset (if present) and validate the document tree.

ctxt:the validation context
doc:a document instance
Returns:1 if valid or 0 otherwise

xmlValidateDocumentFinal ()

int	xmlValidateDocumentFinal	(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc)

Does the final step for the document validation once all the incremental validation steps have been completed basically it does the following checks described by the XML Rec Check all the IDREF/IDREFS attributes definition for validity

ctxt:the validation context
doc:a document instance
Returns:1 if valid or 0 otherwise

xmlValidateDtd ()

int	xmlValidateDtd			(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlDtdPtr dtd)

Try to validate the document against the dtd instance Basically it does check all the definitions in the DtD. Note the the internal subset (if present) is de-coupled (i.e. not used), which could give problems if ID or IDREF is present.

ctxt:the validation context
doc:a document instance
dtd:a dtd instance
Returns:1 if valid or 0 otherwise

xmlValidateDtdFinal ()

int	xmlValidateDtdFinal		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc)

Does the final step for the dtds validation once all the subsets have been parsed basically it does the following checks described by the XML Rec - check that ENTITY and ENTITIES type attributes default or possible values matches one of the defined entities. - check that NOTATION type attributes default or possible values matches one of the defined notations.

ctxt:the validation context
doc:a document instance
Returns:1 if valid or 0 if invalid and -1 if not well-formed

xmlValidateElement ()

int	xmlValidateElement		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem)

Try to validate the subtree under an element

ctxt:the validation context
doc:a document instance
elem:an element instance
Returns:1 if valid or 0 otherwise

xmlValidateElementDecl ()

int	xmlValidateElementDecl		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlElementPtr elem)

Try to validate a single element definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: One ID per Element Type ] - [ VC: No Duplicate Types ] - [ VC: Unique Element Type Declaration ]

ctxt:the validation context
doc:a document instance
elem:an element definition
Returns:1 if valid or 0 otherwise

xmlValidateNameValue ()

int	xmlValidateNameValue		(const xmlChar * value)

Validate that the given value match Name production

value:an Name value
Returns:1 if valid or 0 otherwise

xmlValidateNamesValue ()

int	xmlValidateNamesValue		(const xmlChar * value)

Validate that the given value match Names production

value:an Names value
Returns:1 if valid or 0 otherwise

xmlValidateNmtokenValue ()

int	xmlValidateNmtokenValue		(const xmlChar * value)

Validate that the given value match Nmtoken production [ VC: Name Token ]

value:an Nmtoken value
Returns:1 if valid or 0 otherwise

xmlValidateNmtokensValue ()

int	xmlValidateNmtokensValue	(const xmlChar * value)

Validate that the given value match Nmtokens production [ VC: Name Token ]

value:an Nmtokens value
Returns:1 if valid or 0 otherwise

xmlValidateNotationDecl ()

int	xmlValidateNotationDecl		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNotationPtr nota)

Try to validate a single notation definition basically it does the following checks as described by the XML-1.0 recommendation: - it seems that no validity constraint exists on notation declarations But this function get called anyway ...

ctxt:the validation context
doc:a document instance
nota:a notation definition
Returns:1 if valid or 0 otherwise

xmlValidateNotationUse ()

int	xmlValidateNotationUse		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
const xmlChar * notationName)

Validate that the given name match a notation declaration. - [ VC: Notation Declared ]

ctxt:the validation context
doc:the document
notationName:the notation name to check
Returns:1 if valid or 0 otherwise

xmlValidateOneAttribute ()

int	xmlValidateOneAttribute		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem,
xmlAttrPtr attr,
const xmlChar * value)

Try to validate a single attribute for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately

ctxt:the validation context
doc:a document instance
elem:an element instance
attr:an attribute instance
value:the attribute value (without entities processing)
Returns:1 if valid or 0 otherwise

xmlValidateOneElement ()

int	xmlValidateOneElement		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem)

Try to validate a single element and it's attributes, basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Element Valid ] - [ VC: Required Attribute ] Then call xmlValidateOneAttribute() for each attribute present. The ID/IDREF checkings are done separately

ctxt:the validation context
doc:a document instance
elem:an element instance
Returns:1 if valid or 0 otherwise

xmlValidateOneNamespace ()

int	xmlValidateOneNamespace		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * prefix,
xmlNsPtr ns,
const xmlChar * value)

Try to validate a single namespace declaration for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately

ctxt:the validation context
doc:a document instance
elem:an element instance
prefix:the namespace prefix
ns:an namespace declaration instance
value:the attribute value (without entities processing)
Returns:1 if valid or 0 otherwise

xmlValidatePopElement ()

int	xmlValidatePopElement		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * qname)

Pop the element end from the validation stack.

ctxt:the validation context
doc:a document instance
elem:an element instance
qname:the qualified name as appearing in the serialization
Returns:1 if no validation problem was found or 0 otherwise

xmlValidatePushCData ()

int	xmlValidatePushCData		(xmlValidCtxtPtr ctxt, 
const xmlChar * data,
int len)

check the CData parsed for validation in the current stack

ctxt:the validation context
data:some character data read
len:the length of the data
Returns:1 if no validation problem was found or 0 otherwise

xmlValidatePushElement ()

int	xmlValidatePushElement		(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem,
const xmlChar * qname)

Push a new element start on the validation stack.

ctxt:the validation context
doc:a document instance
elem:an element instance
qname:the qualified name as appearing in the serialization
Returns:1 if no validation problem was found or 0 otherwise

xmlValidateRoot ()

int	xmlValidateRoot			(xmlValidCtxtPtr ctxt, 
xmlDocPtr doc)

Try to validate a the root element basically it does the following check as described by the XML-1.0 recommendation: - [ VC: Root Element Type ] it doesn't try to recurse or apply other check to the element

ctxt:the validation context
doc:a document instance
Returns:1 if valid or 0 otherwise

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-nanohttp.html0000644000175000017500000004034612134171044021044 0ustar aronaron nanohttp: minimal HTTP implementation

nanohttp

nanohttp - minimal HTTP implementation

minimal HTTP implementation allowing to fetch resources like external subset.

Author(s): Daniel Veillard

Synopsis

int	xmlNanoHTTPRead			(void * ctx, 
void * dest,
int len); int xmlNanoHTTPSave (void * ctxt,
const char * filename); const char * xmlNanoHTTPRedir (void * ctx); const char * xmlNanoHTTPAuthHeader (void * ctx); int xmlNanoHTTPFetch (const char * URL,
const char * filename,
char ** contentType); int xmlNanoHTTPContentLength (void * ctx); const char * xmlNanoHTTPMimeType (void * ctx); void xmlNanoHTTPClose (void * ctx); void xmlNanoHTTPCleanup (void); void * xmlNanoHTTPMethod (const char * URL,
const char * method,
const char * input,
char ** contentType,
const char * headers,
int ilen); void xmlNanoHTTPInit (void); void * xmlNanoHTTPOpen (const char * URL,
char ** contentType); void * xmlNanoHTTPOpenRedir (const char * URL,
char ** contentType,
char ** redir); void * xmlNanoHTTPMethodRedir (const char * URL,
const char * method,
const char * input,
char ** contentType,
char ** redir,
const char * headers,
int ilen); void xmlNanoHTTPScanProxy (const char * URL); const char * xmlNanoHTTPEncoding (void * ctx); int xmlNanoHTTPReturnCode (void * ctx);

Description

Details


















libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlerror.html0000644000175000017500000024535012134171044021065 0ustar aronaron xmlerror: error handling

xmlerror

xmlerror - error handling

the API used to report errors

Author(s): Daniel Veillard

Synopsis

typedef xmlError * xmlErrorPtr;
typedef enum xmlErrorLevel;
typedef enum xmlParserErrors;
typedef enum xmlErrorDomain;
typedef struct _xmlError xmlError;
void	xmlParserValidityError		(void * ctx, 
const char * msg,
... ...); typedef void xmlGenericErrorFunc (void * ctx,
const char * msg,
... ...); void xmlSetGenericErrorFunc (void * ctx,
xmlGenericErrorFunc handler); void xmlParserPrintFileInfo (xmlParserInputPtr input); void xmlCtxtResetLastError (void * ctx); void xmlResetLastError (void); void initGenericErrorDefaultFunc (xmlGenericErrorFunc * handler); int xmlCopyError (xmlErrorPtr from,
xmlErrorPtr to); void xmlParserValidityWarning (void * ctx,
const char * msg,
... ...); void xmlParserPrintFileContext (xmlParserInputPtr input); void xmlParserError (void * ctx,
const char * msg,
... ...); void xmlParserWarning (void * ctx,
const char * msg,
... ...); typedef void xmlStructuredErrorFunc (void * userData,
xmlErrorPtr error); void xmlSetStructuredErrorFunc (void * ctx,
xmlStructuredErrorFunc handler); void xmlResetError (xmlErrorPtr err); xmlErrorPtr xmlGetLastError (void); xmlErrorPtr xmlCtxtGetLastError (void * ctx);

Description

Details

Structure xmlError

struct _xmlError {
    int	domain	: What part of the library raised this error
    int	code	: The error code, e.g. an xmlParserError
    char *	message	: human-readable informative error message
    xmlErrorLevel	level	: how consequent is the error
    char *	file	: the filename
    int	line	: the line number if available
    char *	str1	: extra string information
    char *	str2	: extra string information
    char *	str3	: extra string information
    int	int1	: extra number information
    int	int2	: column number of the error or 0 if N/A (todo: rename this field when
    void *	ctxt	: the parser context if available
    void *	node	: the node in the tree
} xmlError;


Enum xmlErrorDomain

enum xmlErrorDomain {
    XML_FROM_NONE = 0
    XML_FROM_PARSER = 1 /* The XML parser */
    XML_FROM_TREE = 2 /* The tree module */
    XML_FROM_NAMESPACE = 3 /* The XML Namespace module */
    XML_FROM_DTD = 4 /* The XML DTD validation with parser contex */
    XML_FROM_HTML = 5 /* The HTML parser */
    XML_FROM_MEMORY = 6 /* The memory allocator */
    XML_FROM_OUTPUT = 7 /* The serialization code */
    XML_FROM_IO = 8 /* The Input/Output stack */
    XML_FROM_FTP = 9 /* The FTP module */
    XML_FROM_HTTP = 10 /* The HTTP module */
    XML_FROM_XINCLUDE = 11 /* The XInclude processing */
    XML_FROM_XPATH = 12 /* The XPath module */
    XML_FROM_XPOINTER = 13 /* The XPointer module */
    XML_FROM_REGEXP = 14 /* The regular expressions module */
    XML_FROM_DATATYPE = 15 /* The W3C XML Schemas Datatype module */
    XML_FROM_SCHEMASP = 16 /* The W3C XML Schemas parser module */
    XML_FROM_SCHEMASV = 17 /* The W3C XML Schemas validation module */
    XML_FROM_RELAXNGP = 18 /* The Relax-NG parser module */
    XML_FROM_RELAXNGV = 19 /* The Relax-NG validator module */
    XML_FROM_CATALOG = 20 /* The Catalog module */
    XML_FROM_C14N = 21 /* The Canonicalization module */
    XML_FROM_XSLT = 22 /* The XSLT engine from libxslt */
    XML_FROM_VALID = 23 /* The XML DTD validation with valid context */
    XML_FROM_CHECK = 24 /* The error checking module */
    XML_FROM_WRITER = 25 /* The xmlwriter module */
    XML_FROM_MODULE = 26 /* The dynamically loaded module modul */
    XML_FROM_I18N = 27 /* The module handling character conversion */
    XML_FROM_SCHEMATRONV = 28 /* The Schematron validator module */
    XML_FROM_BUFFER = 29 /* The buffers module */
    XML_FROM_URI = 30 /*  The URI module */
};


Enum xmlErrorLevel

enum xmlErrorLevel {
    XML_ERR_NONE = 0
    XML_ERR_WARNING = 1 /* A simple warning */
    XML_ERR_ERROR = 2 /* A recoverable error */
    XML_ERR_FATAL = 3 /*  A fatal error */
};


Typedef xmlErrorPtr

xmlError * xmlErrorPtr;


Enum xmlParserErrors

enum xmlParserErrors {
    XML_ERR_OK = 0
    XML_ERR_INTERNAL_ERROR = 1 /* 1 */
    XML_ERR_NO_MEMORY = 2 /* 2 */
    XML_ERR_DOCUMENT_START = 3 /* 3 */
    XML_ERR_DOCUMENT_EMPTY = 4 /* 4 */
    XML_ERR_DOCUMENT_END = 5 /* 5 */
    XML_ERR_INVALID_HEX_CHARREF = 6 /* 6 */
    XML_ERR_INVALID_DEC_CHARREF = 7 /* 7 */
    XML_ERR_INVALID_CHARREF = 8 /* 8 */
    XML_ERR_INVALID_CHAR = 9 /* 9 */
    XML_ERR_CHARREF_AT_EOF = 10 /* 10 */
    XML_ERR_CHARREF_IN_PROLOG = 11 /* 11 */
    XML_ERR_CHARREF_IN_EPILOG = 12 /* 12 */
    XML_ERR_CHARREF_IN_DTD = 13 /* 13 */
    XML_ERR_ENTITYREF_AT_EOF = 14 /* 14 */
    XML_ERR_ENTITYREF_IN_PROLOG = 15 /* 15 */
    XML_ERR_ENTITYREF_IN_EPILOG = 16 /* 16 */
    XML_ERR_ENTITYREF_IN_DTD = 17 /* 17 */
    XML_ERR_PEREF_AT_EOF = 18 /* 18 */
    XML_ERR_PEREF_IN_PROLOG = 19 /* 19 */
    XML_ERR_PEREF_IN_EPILOG = 20 /* 20 */
    XML_ERR_PEREF_IN_INT_SUBSET = 21 /* 21 */
    XML_ERR_ENTITYREF_NO_NAME = 22 /* 22 */
    XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 /* 23 */
    XML_ERR_PEREF_NO_NAME = 24 /* 24 */
    XML_ERR_PEREF_SEMICOL_MISSING = 25 /* 25 */
    XML_ERR_UNDECLARED_ENTITY = 26 /* 26 */
    XML_WAR_UNDECLARED_ENTITY = 27 /* 27 */
    XML_ERR_UNPARSED_ENTITY = 28 /* 28 */
    XML_ERR_ENTITY_IS_EXTERNAL = 29 /* 29 */
    XML_ERR_ENTITY_IS_PARAMETER = 30 /* 30 */
    XML_ERR_UNKNOWN_ENCODING = 31 /* 31 */
    XML_ERR_UNSUPPORTED_ENCODING = 32 /* 32 */
    XML_ERR_STRING_NOT_STARTED = 33 /* 33 */
    XML_ERR_STRING_NOT_CLOSED = 34 /* 34 */
    XML_ERR_NS_DECL_ERROR = 35 /* 35 */
    XML_ERR_ENTITY_NOT_STARTED = 36 /* 36 */
    XML_ERR_ENTITY_NOT_FINISHED = 37 /* 37 */
    XML_ERR_LT_IN_ATTRIBUTE = 38 /* 38 */
    XML_ERR_ATTRIBUTE_NOT_STARTED = 39 /* 39 */
    XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 /* 40 */
    XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 /* 41 */
    XML_ERR_ATTRIBUTE_REDEFINED = 42 /* 42 */
    XML_ERR_LITERAL_NOT_STARTED = 43 /* 43 */
    XML_ERR_LITERAL_NOT_FINISHED = 44 /* 44 */
    XML_ERR_COMMENT_NOT_FINISHED = 45 /* 45 */
    XML_ERR_PI_NOT_STARTED = 46 /* 46 */
    XML_ERR_PI_NOT_FINISHED = 47 /* 47 */
    XML_ERR_NOTATION_NOT_STARTED = 48 /* 48 */
    XML_ERR_NOTATION_NOT_FINISHED = 49 /* 49 */
    XML_ERR_ATTLIST_NOT_STARTED = 50 /* 50 */
    XML_ERR_ATTLIST_NOT_FINISHED = 51 /* 51 */
    XML_ERR_MIXED_NOT_STARTED = 52 /* 52 */
    XML_ERR_MIXED_NOT_FINISHED = 53 /* 53 */
    XML_ERR_ELEMCONTENT_NOT_STARTED = 54 /* 54 */
    XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 /* 55 */
    XML_ERR_XMLDECL_NOT_STARTED = 56 /* 56 */
    XML_ERR_XMLDECL_NOT_FINISHED = 57 /* 57 */
    XML_ERR_CONDSEC_NOT_STARTED = 58 /* 58 */
    XML_ERR_CONDSEC_NOT_FINISHED = 59 /* 59 */
    XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 /* 60 */
    XML_ERR_DOCTYPE_NOT_FINISHED = 61 /* 61 */
    XML_ERR_MISPLACED_CDATA_END = 62 /* 62 */
    XML_ERR_CDATA_NOT_FINISHED = 63 /* 63 */
    XML_ERR_RESERVED_XML_NAME = 64 /* 64 */
    XML_ERR_SPACE_REQUIRED = 65 /* 65 */
    XML_ERR_SEPARATOR_REQUIRED = 66 /* 66 */
    XML_ERR_NMTOKEN_REQUIRED = 67 /* 67 */
    XML_ERR_NAME_REQUIRED = 68 /* 68 */
    XML_ERR_PCDATA_REQUIRED = 69 /* 69 */
    XML_ERR_URI_REQUIRED = 70 /* 70 */
    XML_ERR_PUBID_REQUIRED = 71 /* 71 */
    XML_ERR_LT_REQUIRED = 72 /* 72 */
    XML_ERR_GT_REQUIRED = 73 /* 73 */
    XML_ERR_LTSLASH_REQUIRED = 74 /* 74 */
    XML_ERR_EQUAL_REQUIRED = 75 /* 75 */
    XML_ERR_TAG_NAME_MISMATCH = 76 /* 76 */
    XML_ERR_TAG_NOT_FINISHED = 77 /* 77 */
    XML_ERR_STANDALONE_VALUE = 78 /* 78 */
    XML_ERR_ENCODING_NAME = 79 /* 79 */
    XML_ERR_HYPHEN_IN_COMMENT = 80 /* 80 */
    XML_ERR_INVALID_ENCODING = 81 /* 81 */
    XML_ERR_EXT_ENTITY_STANDALONE = 82 /* 82 */
    XML_ERR_CONDSEC_INVALID = 83 /* 83 */
    XML_ERR_VALUE_REQUIRED = 84 /* 84 */
    XML_ERR_NOT_WELL_BALANCED = 85 /* 85 */
    XML_ERR_EXTRA_CONTENT = 86 /* 86 */
    XML_ERR_ENTITY_CHAR_ERROR = 87 /* 87 */
    XML_ERR_ENTITY_PE_INTERNAL = 88 /* 88 */
    XML_ERR_ENTITY_LOOP = 89 /* 89 */
    XML_ERR_ENTITY_BOUNDARY = 90 /* 90 */
    XML_ERR_INVALID_URI = 91 /* 91 */
    XML_ERR_URI_FRAGMENT = 92 /* 92 */
    XML_WAR_CATALOG_PI = 93 /* 93 */
    XML_ERR_NO_DTD = 94 /* 94 */
    XML_ERR_CONDSEC_INVALID_KEYWORD = 95 /* 95 */
    XML_ERR_VERSION_MISSING = 96 /* 96 */
    XML_WAR_UNKNOWN_VERSION = 97 /* 97 */
    XML_WAR_LANG_VALUE = 98 /* 98 */
    XML_WAR_NS_URI = 99 /* 99 */
    XML_WAR_NS_URI_RELATIVE = 100 /* 100 */
    XML_ERR_MISSING_ENCODING = 101 /* 101 */
    XML_WAR_SPACE_VALUE = 102 /* 102 */
    XML_ERR_NOT_STANDALONE = 103 /* 103 */
    XML_ERR_ENTITY_PROCESSING = 104 /* 104 */
    XML_ERR_NOTATION_PROCESSING = 105 /* 105 */
    XML_WAR_NS_COLUMN = 106 /* 106 */
    XML_WAR_ENTITY_REDEFINED = 107 /* 107 */
    XML_ERR_UNKNOWN_VERSION = 108 /* 108 */
    XML_ERR_VERSION_MISMATCH = 109 /* 109 */
    XML_ERR_NAME_TOO_LONG = 110 /* 110 */
    XML_ERR_USER_STOP = 111 /* 111 */
    XML_NS_ERR_XML_NAMESPACE = 200
    XML_NS_ERR_UNDEFINED_NAMESPACE = 201 /* 201 */
    XML_NS_ERR_QNAME = 202 /* 202 */
    XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 /* 203 */
    XML_NS_ERR_EMPTY = 204 /* 204 */
    XML_NS_ERR_COLON = 205 /* 205 */
    XML_DTD_ATTRIBUTE_DEFAULT = 500
    XML_DTD_ATTRIBUTE_REDEFINED = 501 /* 501 */
    XML_DTD_ATTRIBUTE_VALUE = 502 /* 502 */
    XML_DTD_CONTENT_ERROR = 503 /* 503 */
    XML_DTD_CONTENT_MODEL = 504 /* 504 */
    XML_DTD_CONTENT_NOT_DETERMINIST = 505 /* 505 */
    XML_DTD_DIFFERENT_PREFIX = 506 /* 506 */
    XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 /* 507 */
    XML_DTD_ELEM_NAMESPACE = 508 /* 508 */
    XML_DTD_ELEM_REDEFINED = 509 /* 509 */
    XML_DTD_EMPTY_NOTATION = 510 /* 510 */
    XML_DTD_ENTITY_TYPE = 511 /* 511 */
    XML_DTD_ID_FIXED = 512 /* 512 */
    XML_DTD_ID_REDEFINED = 513 /* 513 */
    XML_DTD_ID_SUBSET = 514 /* 514 */
    XML_DTD_INVALID_CHILD = 515 /* 515 */
    XML_DTD_INVALID_DEFAULT = 516 /* 516 */
    XML_DTD_LOAD_ERROR = 517 /* 517 */
    XML_DTD_MISSING_ATTRIBUTE = 518 /* 518 */
    XML_DTD_MIXED_CORRUPT = 519 /* 519 */
    XML_DTD_MULTIPLE_ID = 520 /* 520 */
    XML_DTD_NO_DOC = 521 /* 521 */
    XML_DTD_NO_DTD = 522 /* 522 */
    XML_DTD_NO_ELEM_NAME = 523 /* 523 */
    XML_DTD_NO_PREFIX = 524 /* 524 */
    XML_DTD_NO_ROOT = 525 /* 525 */
    XML_DTD_NOTATION_REDEFINED = 526 /* 526 */
    XML_DTD_NOTATION_VALUE = 527 /* 527 */
    XML_DTD_NOT_EMPTY = 528 /* 528 */
    XML_DTD_NOT_PCDATA = 529 /* 529 */
    XML_DTD_NOT_STANDALONE = 530 /* 530 */
    XML_DTD_ROOT_NAME = 531 /* 531 */
    XML_DTD_STANDALONE_WHITE_SPACE = 532 /* 532 */
    XML_DTD_UNKNOWN_ATTRIBUTE = 533 /* 533 */
    XML_DTD_UNKNOWN_ELEM = 534 /* 534 */
    XML_DTD_UNKNOWN_ENTITY = 535 /* 535 */
    XML_DTD_UNKNOWN_ID = 536 /* 536 */
    XML_DTD_UNKNOWN_NOTATION = 537 /* 537 */
    XML_DTD_STANDALONE_DEFAULTED = 538 /* 538 */
    XML_DTD_XMLID_VALUE = 539 /* 539 */
    XML_DTD_XMLID_TYPE = 540 /* 540 */
    XML_DTD_DUP_TOKEN = 541 /* 541 */
    XML_HTML_STRUCURE_ERROR = 800
    XML_HTML_UNKNOWN_TAG = 801 /* 801 */
    XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000
    XML_RNGP_ATTR_CONFLICT = 1001 /* 1001 */
    XML_RNGP_ATTRIBUTE_CHILDREN = 1002 /* 1002 */
    XML_RNGP_ATTRIBUTE_CONTENT = 1003 /* 1003 */
    XML_RNGP_ATTRIBUTE_EMPTY = 1004 /* 1004 */
    XML_RNGP_ATTRIBUTE_NOOP = 1005 /* 1005 */
    XML_RNGP_CHOICE_CONTENT = 1006 /* 1006 */
    XML_RNGP_CHOICE_EMPTY = 1007 /* 1007 */
    XML_RNGP_CREATE_FAILURE = 1008 /* 1008 */
    XML_RNGP_DATA_CONTENT = 1009 /* 1009 */
    XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 /* 1010 */
    XML_RNGP_DEFINE_CREATE_FAILED = 1011 /* 1011 */
    XML_RNGP_DEFINE_EMPTY = 1012 /* 1012 */
    XML_RNGP_DEFINE_MISSING = 1013 /* 1013 */
    XML_RNGP_DEFINE_NAME_MISSING = 1014 /* 1014 */
    XML_RNGP_ELEM_CONTENT_EMPTY = 1015 /* 1015 */
    XML_RNGP_ELEM_CONTENT_ERROR = 1016 /* 1016 */
    XML_RNGP_ELEMENT_EMPTY = 1017 /* 1017 */
    XML_RNGP_ELEMENT_CONTENT = 1018 /* 1018 */
    XML_RNGP_ELEMENT_NAME = 1019 /* 1019 */
    XML_RNGP_ELEMENT_NO_CONTENT = 1020 /* 1020 */
    XML_RNGP_ELEM_TEXT_CONFLICT = 1021 /* 1021 */
    XML_RNGP_EMPTY = 1022 /* 1022 */
    XML_RNGP_EMPTY_CONSTRUCT = 1023 /* 1023 */
    XML_RNGP_EMPTY_CONTENT = 1024 /* 1024 */
    XML_RNGP_EMPTY_NOT_EMPTY = 1025 /* 1025 */
    XML_RNGP_ERROR_TYPE_LIB = 1026 /* 1026 */
    XML_RNGP_EXCEPT_EMPTY = 1027 /* 1027 */
    XML_RNGP_EXCEPT_MISSING = 1028 /* 1028 */
    XML_RNGP_EXCEPT_MULTIPLE = 1029 /* 1029 */
    XML_RNGP_EXCEPT_NO_CONTENT = 1030 /* 1030 */
    XML_RNGP_EXTERNALREF_EMTPY = 1031 /* 1031 */
    XML_RNGP_EXTERNAL_REF_FAILURE = 1032 /* 1032 */
    XML_RNGP_EXTERNALREF_RECURSE = 1033 /* 1033 */
    XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 /* 1034 */
    XML_RNGP_FOREIGN_ELEMENT = 1035 /* 1035 */
    XML_RNGP_GRAMMAR_CONTENT = 1036 /* 1036 */
    XML_RNGP_GRAMMAR_EMPTY = 1037 /* 1037 */
    XML_RNGP_GRAMMAR_MISSING = 1038 /* 1038 */
    XML_RNGP_GRAMMAR_NO_START = 1039 /* 1039 */
    XML_RNGP_GROUP_ATTR_CONFLICT = 1040 /* 1040 */
    XML_RNGP_HREF_ERROR = 1041 /* 1041 */
    XML_RNGP_INCLUDE_EMPTY = 1042 /* 1042 */
    XML_RNGP_INCLUDE_FAILURE = 1043 /* 1043 */
    XML_RNGP_INCLUDE_RECURSE = 1044 /* 1044 */
    XML_RNGP_INTERLEAVE_ADD = 1045 /* 1045 */
    XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 /* 1046 */
    XML_RNGP_INTERLEAVE_EMPTY = 1047 /* 1047 */
    XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 /* 1048 */
    XML_RNGP_INVALID_DEFINE_NAME = 1049 /* 1049 */
    XML_RNGP_INVALID_URI = 1050 /* 1050 */
    XML_RNGP_INVALID_VALUE = 1051 /* 1051 */
    XML_RNGP_MISSING_HREF = 1052 /* 1052 */
    XML_RNGP_NAME_MISSING = 1053 /* 1053 */
    XML_RNGP_NEED_COMBINE = 1054 /* 1054 */
    XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 /* 1055 */
    XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 /* 1056 */
    XML_RNGP_NSNAME_NO_NS = 1057 /* 1057 */
    XML_RNGP_PARAM_FORBIDDEN = 1058 /* 1058 */
    XML_RNGP_PARAM_NAME_MISSING = 1059 /* 1059 */
    XML_RNGP_PARENTREF_CREATE_FAILED = 1060 /* 1060 */
    XML_RNGP_PARENTREF_NAME_INVALID = 1061 /* 1061 */
    XML_RNGP_PARENTREF_NO_NAME = 1062 /* 1062 */
    XML_RNGP_PARENTREF_NO_PARENT = 1063 /* 1063 */
    XML_RNGP_PARENTREF_NOT_EMPTY = 1064 /* 1064 */
    XML_RNGP_PARSE_ERROR = 1065 /* 1065 */
    XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 /* 1066 */
    XML_RNGP_PAT_ATTR_ATTR = 1067 /* 1067 */
    XML_RNGP_PAT_ATTR_ELEM = 1068 /* 1068 */
    XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 /* 1069 */
    XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 /* 1070 */
    XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 /* 1071 */
    XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 /* 1072 */
    XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 /* 1073 */
    XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 /* 1074 */
    XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 /* 1075 */
    XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 /* 1076 */
    XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 /* 1077 */
    XML_RNGP_PAT_LIST_ATTR = 1078 /* 1078 */
    XML_RNGP_PAT_LIST_ELEM = 1079 /* 1079 */
    XML_RNGP_PAT_LIST_INTERLEAVE = 1080 /* 1080 */
    XML_RNGP_PAT_LIST_LIST = 1081 /* 1081 */
    XML_RNGP_PAT_LIST_REF = 1082 /* 1082 */
    XML_RNGP_PAT_LIST_TEXT = 1083 /* 1083 */
    XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 /* 1084 */
    XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 /* 1085 */
    XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 /* 1086 */
    XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 /* 1087 */
    XML_RNGP_PAT_START_ATTR = 1088 /* 1088 */
    XML_RNGP_PAT_START_DATA = 1089 /* 1089 */
    XML_RNGP_PAT_START_EMPTY = 1090 /* 1090 */
    XML_RNGP_PAT_START_GROUP = 1091 /* 1091 */
    XML_RNGP_PAT_START_INTERLEAVE = 1092 /* 1092 */
    XML_RNGP_PAT_START_LIST = 1093 /* 1093 */
    XML_RNGP_PAT_START_ONEMORE = 1094 /* 1094 */
    XML_RNGP_PAT_START_TEXT = 1095 /* 1095 */
    XML_RNGP_PAT_START_VALUE = 1096 /* 1096 */
    XML_RNGP_PREFIX_UNDEFINED = 1097 /* 1097 */
    XML_RNGP_REF_CREATE_FAILED = 1098 /* 1098 */
    XML_RNGP_REF_CYCLE = 1099 /* 1099 */
    XML_RNGP_REF_NAME_INVALID = 1100 /* 1100 */
    XML_RNGP_REF_NO_DEF = 1101 /* 1101 */
    XML_RNGP_REF_NO_NAME = 1102 /* 1102 */
    XML_RNGP_REF_NOT_EMPTY = 1103 /* 1103 */
    XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 /* 1104 */
    XML_RNGP_START_CONTENT = 1105 /* 1105 */
    XML_RNGP_START_EMPTY = 1106 /* 1106 */
    XML_RNGP_START_MISSING = 1107 /* 1107 */
    XML_RNGP_TEXT_EXPECTED = 1108 /* 1108 */
    XML_RNGP_TEXT_HAS_CHILD = 1109 /* 1109 */
    XML_RNGP_TYPE_MISSING = 1110 /* 1110 */
    XML_RNGP_TYPE_NOT_FOUND = 1111 /* 1111 */
    XML_RNGP_TYPE_VALUE = 1112 /* 1112 */
    XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 /* 1113 */
    XML_RNGP_UNKNOWN_COMBINE = 1114 /* 1114 */
    XML_RNGP_UNKNOWN_CONSTRUCT = 1115 /* 1115 */
    XML_RNGP_UNKNOWN_TYPE_LIB = 1116 /* 1116 */
    XML_RNGP_URI_FRAGMENT = 1117 /* 1117 */
    XML_RNGP_URI_NOT_ABSOLUTE = 1118 /* 1118 */
    XML_RNGP_VALUE_EMPTY = 1119 /* 1119 */
    XML_RNGP_VALUE_NO_CONTENT = 1120 /* 1120 */
    XML_RNGP_XMLNS_NAME = 1121 /* 1121 */
    XML_RNGP_XML_NS = 1122 /* 1122 */
    XML_XPATH_EXPRESSION_OK = 1200
    XML_XPATH_NUMBER_ERROR = 1201 /* 1201 */
    XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 /* 1202 */
    XML_XPATH_START_LITERAL_ERROR = 1203 /* 1203 */
    XML_XPATH_VARIABLE_REF_ERROR = 1204 /* 1204 */
    XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 /* 1205 */
    XML_XPATH_INVALID_PREDICATE_ERROR = 1206 /* 1206 */
    XML_XPATH_EXPR_ERROR = 1207 /* 1207 */
    XML_XPATH_UNCLOSED_ERROR = 1208 /* 1208 */
    XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 /* 1209 */
    XML_XPATH_INVALID_OPERAND = 1210 /* 1210 */
    XML_XPATH_INVALID_TYPE = 1211 /* 1211 */
    XML_XPATH_INVALID_ARITY = 1212 /* 1212 */
    XML_XPATH_INVALID_CTXT_SIZE = 1213 /* 1213 */
    XML_XPATH_INVALID_CTXT_POSITION = 1214 /* 1214 */
    XML_XPATH_MEMORY_ERROR = 1215 /* 1215 */
    XML_XPTR_SYNTAX_ERROR = 1216 /* 1216 */
    XML_XPTR_RESOURCE_ERROR = 1217 /* 1217 */
    XML_XPTR_SUB_RESOURCE_ERROR = 1218 /* 1218 */
    XML_XPATH_UNDEF_PREFIX_ERROR = 1219 /* 1219 */
    XML_XPATH_ENCODING_ERROR = 1220 /* 1220 */
    XML_XPATH_INVALID_CHAR_ERROR = 1221 /* 1221 */
    XML_TREE_INVALID_HEX = 1300
    XML_TREE_INVALID_DEC = 1301 /* 1301 */
    XML_TREE_UNTERMINATED_ENTITY = 1302 /* 1302 */
    XML_TREE_NOT_UTF8 = 1303 /* 1303 */
    XML_SAVE_NOT_UTF8 = 1400
    XML_SAVE_CHAR_INVALID = 1401 /* 1401 */
    XML_SAVE_NO_DOCTYPE = 1402 /* 1402 */
    XML_SAVE_UNKNOWN_ENCODING = 1403 /* 1403 */
    XML_REGEXP_COMPILE_ERROR = 1450
    XML_IO_UNKNOWN = 1500
    XML_IO_EACCES = 1501 /* 1501 */
    XML_IO_EAGAIN = 1502 /* 1502 */
    XML_IO_EBADF = 1503 /* 1503 */
    XML_IO_EBADMSG = 1504 /* 1504 */
    XML_IO_EBUSY = 1505 /* 1505 */
    XML_IO_ECANCELED = 1506 /* 1506 */
    XML_IO_ECHILD = 1507 /* 1507 */
    XML_IO_EDEADLK = 1508 /* 1508 */
    XML_IO_EDOM = 1509 /* 1509 */
    XML_IO_EEXIST = 1510 /* 1510 */
    XML_IO_EFAULT = 1511 /* 1511 */
    XML_IO_EFBIG = 1512 /* 1512 */
    XML_IO_EINPROGRESS = 1513 /* 1513 */
    XML_IO_EINTR = 1514 /* 1514 */
    XML_IO_EINVAL = 1515 /* 1515 */
    XML_IO_EIO = 1516 /* 1516 */
    XML_IO_EISDIR = 1517 /* 1517 */
    XML_IO_EMFILE = 1518 /* 1518 */
    XML_IO_EMLINK = 1519 /* 1519 */
    XML_IO_EMSGSIZE = 1520 /* 1520 */
    XML_IO_ENAMETOOLONG = 1521 /* 1521 */
    XML_IO_ENFILE = 1522 /* 1522 */
    XML_IO_ENODEV = 1523 /* 1523 */
    XML_IO_ENOENT = 1524 /* 1524 */
    XML_IO_ENOEXEC = 1525 /* 1525 */
    XML_IO_ENOLCK = 1526 /* 1526 */
    XML_IO_ENOMEM = 1527 /* 1527 */
    XML_IO_ENOSPC = 1528 /* 1528 */
    XML_IO_ENOSYS = 1529 /* 1529 */
    XML_IO_ENOTDIR = 1530 /* 1530 */
    XML_IO_ENOTEMPTY = 1531 /* 1531 */
    XML_IO_ENOTSUP = 1532 /* 1532 */
    XML_IO_ENOTTY = 1533 /* 1533 */
    XML_IO_ENXIO = 1534 /* 1534 */
    XML_IO_EPERM = 1535 /* 1535 */
    XML_IO_EPIPE = 1536 /* 1536 */
    XML_IO_ERANGE = 1537 /* 1537 */
    XML_IO_EROFS = 1538 /* 1538 */
    XML_IO_ESPIPE = 1539 /* 1539 */
    XML_IO_ESRCH = 1540 /* 1540 */
    XML_IO_ETIMEDOUT = 1541 /* 1541 */
    XML_IO_EXDEV = 1542 /* 1542 */
    XML_IO_NETWORK_ATTEMPT = 1543 /* 1543 */
    XML_IO_ENCODER = 1544 /* 1544 */
    XML_IO_FLUSH = 1545 /* 1545 */
    XML_IO_WRITE = 1546 /* 1546 */
    XML_IO_NO_INPUT = 1547 /* 1547 */
    XML_IO_BUFFER_FULL = 1548 /* 1548 */
    XML_IO_LOAD_ERROR = 1549 /* 1549 */
    XML_IO_ENOTSOCK = 1550 /* 1550 */
    XML_IO_EISCONN = 1551 /* 1551 */
    XML_IO_ECONNREFUSED = 1552 /* 1552 */
    XML_IO_ENETUNREACH = 1553 /* 1553 */
    XML_IO_EADDRINUSE = 1554 /* 1554 */
    XML_IO_EALREADY = 1555 /* 1555 */
    XML_IO_EAFNOSUPPORT = 1556 /* 1556 */
    XML_XINCLUDE_RECURSION = 1600
    XML_XINCLUDE_PARSE_VALUE = 1601 /* 1601 */
    XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 /* 1602 */
    XML_XINCLUDE_NO_HREF = 1603 /* 1603 */
    XML_XINCLUDE_NO_FALLBACK = 1604 /* 1604 */
    XML_XINCLUDE_HREF_URI = 1605 /* 1605 */
    XML_XINCLUDE_TEXT_FRAGMENT = 1606 /* 1606 */
    XML_XINCLUDE_TEXT_DOCUMENT = 1607 /* 1607 */
    XML_XINCLUDE_INVALID_CHAR = 1608 /* 1608 */
    XML_XINCLUDE_BUILD_FAILED = 1609 /* 1609 */
    XML_XINCLUDE_UNKNOWN_ENCODING = 1610 /* 1610 */
    XML_XINCLUDE_MULTIPLE_ROOT = 1611 /* 1611 */
    XML_XINCLUDE_XPTR_FAILED = 1612 /* 1612 */
    XML_XINCLUDE_XPTR_RESULT = 1613 /* 1613 */
    XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 /* 1614 */
    XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 /* 1615 */
    XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 /* 1616 */
    XML_XINCLUDE_DEPRECATED_NS = 1617 /* 1617 */
    XML_XINCLUDE_FRAGMENT_ID = 1618 /* 1618 */
    XML_CATALOG_MISSING_ATTR = 1650
    XML_CATALOG_ENTRY_BROKEN = 1651 /* 1651 */
    XML_CATALOG_PREFER_VALUE = 1652 /* 1652 */
    XML_CATALOG_NOT_CATALOG = 1653 /* 1653 */
    XML_CATALOG_RECURSION = 1654 /* 1654 */
    XML_SCHEMAP_PREFIX_UNDEFINED = 1700
    XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 /* 1701 */
    XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 /* 1702 */
    XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 /* 1703 */
    XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 /* 1704 */
    XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 /* 1705 */
    XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 /* 1706 */
    XML_SCHEMAP_EXTENSION_NO_BASE = 1707 /* 1707 */
    XML_SCHEMAP_FACET_NO_VALUE = 1708 /* 1708 */
    XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 /* 1709 */
    XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 /* 1710 */
    XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 /* 1711 */
    XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 /* 1712 */
    XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 /* 1713 */
    XML_SCHEMAP_INVALID_BOOLEAN = 1714 /* 1714 */
    XML_SCHEMAP_INVALID_ENUM = 1715 /* 1715 */
    XML_SCHEMAP_INVALID_FACET = 1716 /* 1716 */
    XML_SCHEMAP_INVALID_FACET_VALUE = 1717 /* 1717 */
    XML_SCHEMAP_INVALID_MAXOCCURS = 1718 /* 1718 */
    XML_SCHEMAP_INVALID_MINOCCURS = 1719 /* 1719 */
    XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 /* 1720 */
    XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 /* 1721 */
    XML_SCHEMAP_NOATTR_NOREF = 1722 /* 1722 */
    XML_SCHEMAP_NOTATION_NO_NAME = 1723 /* 1723 */
    XML_SCHEMAP_NOTYPE_NOREF = 1724 /* 1724 */
    XML_SCHEMAP_REF_AND_SUBTYPE = 1725 /* 1725 */
    XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 /* 1726 */
    XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 /* 1727 */
    XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 /* 1728 */
    XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 /* 1729 */
    XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 /* 1730 */
    XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 /* 1731 */
    XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 /* 1732 */
    XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 /* 1733 */
    XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 /* 1734 */
    XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 /* 1735 */
    XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 /* 1736 */
    XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 /* 1737 */
    XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 /* 1738 */
    XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 /* 1739 */
    XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 /* 1740 */
    XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 /* 1741 */
    XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 /* 1742 */
    XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 /* 1743 */
    XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 /* 1744 */
    XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 /* 1745 */
    XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 /* 1746 */
    XML_SCHEMAP_UNKNOWN_REF = 1747 /* 1747 */
    XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 /* 1748 */
    XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 /* 1749 */
    XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 /* 1750 */
    XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 /* 1751 */
    XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 /* 1752 */
    XML_SCHEMAP_UNKNOWN_TYPE = 1753 /* 1753 */
    XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 /* 1754 */
    XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 /* 1755 */
    XML_SCHEMAP_REGEXP_INVALID = 1756 /* 1756 */
    XML_SCHEMAP_FAILED_LOAD = 1757 /* 1757 */
    XML_SCHEMAP_NOTHING_TO_PARSE = 1758 /* 1758 */
    XML_SCHEMAP_NOROOT = 1759 /* 1759 */
    XML_SCHEMAP_REDEFINED_GROUP = 1760 /* 1760 */
    XML_SCHEMAP_REDEFINED_TYPE = 1761 /* 1761 */
    XML_SCHEMAP_REDEFINED_ELEMENT = 1762 /* 1762 */
    XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 /* 1763 */
    XML_SCHEMAP_REDEFINED_ATTR = 1764 /* 1764 */
    XML_SCHEMAP_REDEFINED_NOTATION = 1765 /* 1765 */
    XML_SCHEMAP_FAILED_PARSE = 1766 /* 1766 */
    XML_SCHEMAP_UNKNOWN_PREFIX = 1767 /* 1767 */
    XML_SCHEMAP_DEF_AND_PREFIX = 1768 /* 1768 */
    XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 /* 1769 */
    XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 /* 1770 */
    XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 /* 1771 */
    XML_SCHEMAP_NOT_SCHEMA = 1772 /* 1772 */
    XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 /* 1773 */
    XML_SCHEMAP_INVALID_ATTR_USE = 1774 /* 1774 */
    XML_SCHEMAP_RECURSIVE = 1775 /* 1775 */
    XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 /* 1776 */
    XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 /* 1777 */
    XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 /* 1778 */
    XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 /* 1779 */
    XML_SCHEMAP_INVALID_ATTR_NAME = 1780 /* 1780 */
    XML_SCHEMAP_REF_AND_CONTENT = 1781 /* 1781 */
    XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 /* 1782 */
    XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 /* 1783 */
    XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 /* 1784 */
    XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 /* 1785 */
    XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 /* 1786 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 /* 1787 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 /* 1788 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 /* 1789 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 /* 1790 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 /* 1791 */
    XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 /* 1792 */
    XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 /* 1793 */
    XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 /* 1794 */
    XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 /* 1795 */
    XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 /* 1796 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 /* 1797 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 /* 1798 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 /* 1799 */
    XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 /* 1800 */
    XML_SCHEMAV_NOROOT = 1801
    XML_SCHEMAV_UNDECLAREDELEM = 1802 /* 1802 */
    XML_SCHEMAV_NOTTOPLEVEL = 1803 /* 1803 */
    XML_SCHEMAV_MISSING = 1804 /* 1804 */
    XML_SCHEMAV_WRONGELEM = 1805 /* 1805 */
    XML_SCHEMAV_NOTYPE = 1806 /* 1806 */
    XML_SCHEMAV_NOROLLBACK = 1807 /* 1807 */
    XML_SCHEMAV_ISABSTRACT = 1808 /* 1808 */
    XML_SCHEMAV_NOTEMPTY = 1809 /* 1809 */
    XML_SCHEMAV_ELEMCONT = 1810 /* 1810 */
    XML_SCHEMAV_HAVEDEFAULT = 1811 /* 1811 */
    XML_SCHEMAV_NOTNILLABLE = 1812 /* 1812 */
    XML_SCHEMAV_EXTRACONTENT = 1813 /* 1813 */
    XML_SCHEMAV_INVALIDATTR = 1814 /* 1814 */
    XML_SCHEMAV_INVALIDELEM = 1815 /* 1815 */
    XML_SCHEMAV_NOTDETERMINIST = 1816 /* 1816 */
    XML_SCHEMAV_CONSTRUCT = 1817 /* 1817 */
    XML_SCHEMAV_INTERNAL = 1818 /* 1818 */
    XML_SCHEMAV_NOTSIMPLE = 1819 /* 1819 */
    XML_SCHEMAV_ATTRUNKNOWN = 1820 /* 1820 */
    XML_SCHEMAV_ATTRINVALID = 1821 /* 1821 */
    XML_SCHEMAV_VALUE = 1822 /* 1822 */
    XML_SCHEMAV_FACET = 1823 /* 1823 */
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 /* 1824 */
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 /* 1825 */
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 /* 1826 */
    XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 /* 1827 */
    XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 /* 1828 */
    XML_SCHEMAV_CVC_FACET_VALID = 1829 /* 1829 */
    XML_SCHEMAV_CVC_LENGTH_VALID = 1830 /* 1830 */
    XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 /* 1831 */
    XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 /* 1832 */
    XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 /* 1833 */
    XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 /* 1834 */
    XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 /* 1835 */
    XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 /* 1836 */
    XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 /* 1837 */
    XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 /* 1838 */
    XML_SCHEMAV_CVC_PATTERN_VALID = 1839 /* 1839 */
    XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 /* 1840 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 /* 1841 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 /* 1842 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 /* 1843 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 /* 1844 */
    XML_SCHEMAV_CVC_ELT_1 = 1845 /* 1845 */
    XML_SCHEMAV_CVC_ELT_2 = 1846 /* 1846 */
    XML_SCHEMAV_CVC_ELT_3_1 = 1847 /* 1847 */
    XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 /* 1848 */
    XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 /* 1849 */
    XML_SCHEMAV_CVC_ELT_4_1 = 1850 /* 1850 */
    XML_SCHEMAV_CVC_ELT_4_2 = 1851 /* 1851 */
    XML_SCHEMAV_CVC_ELT_4_3 = 1852 /* 1852 */
    XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 /* 1853 */
    XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 /* 1854 */
    XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 /* 1855 */
    XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 /* 1856 */
    XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 /* 1857 */
    XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 /* 1858 */
    XML_SCHEMAV_CVC_ELT_6 = 1859 /* 1859 */
    XML_SCHEMAV_CVC_ELT_7 = 1860 /* 1860 */
    XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 /* 1861 */
    XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 /* 1862 */
    XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 /* 1863 */
    XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 /* 1864 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 /* 1865 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 /* 1866 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 /* 1867 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 /* 1868 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 /* 1869 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 /* 1870 */
    XML_SCHEMAV_ELEMENT_CONTENT = 1871 /* 1871 */
    XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 /* 1872 */
    XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 /* 1873 */
    XML_SCHEMAV_CVC_AU = 1874 /* 1874 */
    XML_SCHEMAV_CVC_TYPE_1 = 1875 /* 1875 */
    XML_SCHEMAV_CVC_TYPE_2 = 1876 /* 1876 */
    XML_SCHEMAV_CVC_IDC = 1877 /* 1877 */
    XML_SCHEMAV_CVC_WILDCARD = 1878 /* 1878 */
    XML_SCHEMAV_MISC = 1879 /* 1879 */
    XML_XPTR_UNKNOWN_SCHEME = 1900
    XML_XPTR_CHILDSEQ_START = 1901 /* 1901 */
    XML_XPTR_EVAL_FAILED = 1902 /* 1902 */
    XML_XPTR_EXTRA_OBJECTS = 1903 /* 1903 */
    XML_C14N_CREATE_CTXT = 1950
    XML_C14N_REQUIRES_UTF8 = 1951 /* 1951 */
    XML_C14N_CREATE_STACK = 1952 /* 1952 */
    XML_C14N_INVALID_NODE = 1953 /* 1953 */
    XML_C14N_UNKNOW_NODE = 1954 /* 1954 */
    XML_C14N_RELATIVE_NAMESPACE = 1955 /* 1955 */
    XML_FTP_PASV_ANSWER = 2000
    XML_FTP_EPSV_ANSWER = 2001 /* 2001 */
    XML_FTP_ACCNT = 2002 /* 2002 */
    XML_FTP_URL_SYNTAX = 2003 /* 2003 */
    XML_HTTP_URL_SYNTAX = 2020
    XML_HTTP_USE_IP = 2021 /* 2021 */
    XML_HTTP_UNKNOWN_HOST = 2022 /* 2022 */
    XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000
    XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 /* 3001 */
    XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 /* 3002 */
    XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 /* 3003 */
    XML_SCHEMAP_SRC_RESOLVE = 3004 /* 3004 */
    XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 /* 3005 */
    XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 /* 3006 */
    XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 /* 3007 */
    XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 /* 3008 */
    XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 /* 3009 */
    XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 /* 3010 */
    XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 /* 3011 */
    XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 /* 3012 */
    XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 /* 3013 */
    XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 /* 3014 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 /* 3015 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 /* 3016 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 /* 3017 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 /* 3018 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 /* 3019 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 /* 3020 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 /* 3021 */
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 /* 3022 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 /* 3023 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 /* 3024 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 /* 3025 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 /* 3026 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 /* 3027 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 /* 3028 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 /* 3029 */
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 /* 3030 */
    XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 /* 3031 */
    XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 /* 3032 */
    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 /* 3033 */
    XML_SCHEMAP_S4S_ELEM_MISSING = 3034 /* 3034 */
    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 /* 3035 */
    XML_SCHEMAP_S4S_ATTR_MISSING = 3036 /* 3036 */
    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 /* 3037 */
    XML_SCHEMAP_SRC_ELEMENT_1 = 3038 /* 3038 */
    XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 /* 3039 */
    XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 /* 3040 */
    XML_SCHEMAP_SRC_ELEMENT_3 = 3041 /* 3041 */
    XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 /* 3042 */
    XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 /* 3043 */
    XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 /* 3044 */
    XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 /* 3045 */
    XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 /* 3046 */
    XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 /* 3047 */
    XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 /* 3048 */
    XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 /* 3049 */
    XML_SCHEMAP_SRC_INCLUDE = 3050 /* 3050 */
    XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 /* 3051 */
    XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 /* 3052 */
    XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 /* 3053 */
    XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 /* 3054 */
    XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 /* 3055 */
    XML_SCHEMAP_NO_XMLNS = 3056 /* 3056 */
    XML_SCHEMAP_NO_XSI = 3057 /* 3057 */
    XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 /* 3058 */
    XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 /* 3059 */
    XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 /* 3060 */
    XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 /* 3061 */
    XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 /* 3062 */
    XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 /* 3063 */
    XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 /* 3064 */
    XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 /* 3065 */
    XML_SCHEMAP_SRC_IMPORT_2 = 3066 /* 3066 */
    XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 /* 3067 */
    XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 /* 3068 */
    XML_SCHEMAP_INTERNAL = 3069 /* 3069 non-W3C */
    XML_SCHEMAP_NOT_DETERMINISTIC = 3070 /* 3070 non-W3C */
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 /* 3071 */
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 /* 3072 */
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 /* 3073 */
    XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 /* 3074 */
    XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 /* 3075 */
    XML_SCHEMAP_SRC_CT_1 = 3076 /* 3076 */
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 /* 3077 */
    XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 /* 3078 */
    XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 /* 3079 */
    XML_SCHEMAP_C_PROPS_CORRECT = 3080 /* 3080 */
    XML_SCHEMAP_SRC_REDEFINE = 3081 /* 3081 */
    XML_SCHEMAP_SRC_IMPORT = 3082 /* 3082 */
    XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 /* 3083 */
    XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 /* 3084 */
    XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 /* 3085 */
    XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 /* 3085 */
    XML_SCHEMAP_AG_PROPS_CORRECT = 3087 /* 3086 */
    XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 /* 3087 */
    XML_SCHEMAP_AU_PROPS_CORRECT = 3089 /* 3088 */
    XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 /* 3089 */
    XML_SCHEMAP_COS_ALL_LIMITED = 3091 /* 3090 */
    XML_SCHEMATRONV_ASSERT = 4000 /* 4000 */
    XML_SCHEMATRONV_REPORT = 4001
    XML_MODULE_OPEN = 4900 /* 4900 */
    XML_MODULE_CLOSE = 4901 /* 4901 */
    XML_CHECK_FOUND_ELEMENT = 5000
    XML_CHECK_FOUND_ATTRIBUTE = 5001 /* 5001 */
    XML_CHECK_FOUND_TEXT = 5002 /* 5002 */
    XML_CHECK_FOUND_CDATA = 5003 /* 5003 */
    XML_CHECK_FOUND_ENTITYREF = 5004 /* 5004 */
    XML_CHECK_FOUND_ENTITY = 5005 /* 5005 */
    XML_CHECK_FOUND_PI = 5006 /* 5006 */
    XML_CHECK_FOUND_COMMENT = 5007 /* 5007 */
    XML_CHECK_FOUND_DOCTYPE = 5008 /* 5008 */
    XML_CHECK_FOUND_FRAGMENT = 5009 /* 5009 */
    XML_CHECK_FOUND_NOTATION = 5010 /* 5010 */
    XML_CHECK_UNKNOWN_NODE = 5011 /* 5011 */
    XML_CHECK_ENTITY_TYPE = 5012 /* 5012 */
    XML_CHECK_NO_PARENT = 5013 /* 5013 */
    XML_CHECK_NO_DOC = 5014 /* 5014 */
    XML_CHECK_NO_NAME = 5015 /* 5015 */
    XML_CHECK_NO_ELEM = 5016 /* 5016 */
    XML_CHECK_WRONG_DOC = 5017 /* 5017 */
    XML_CHECK_NO_PREV = 5018 /* 5018 */
    XML_CHECK_WRONG_PREV = 5019 /* 5019 */
    XML_CHECK_NO_NEXT = 5020 /* 5020 */
    XML_CHECK_WRONG_NEXT = 5021 /* 5021 */
    XML_CHECK_NOT_DTD = 5022 /* 5022 */
    XML_CHECK_NOT_ATTR = 5023 /* 5023 */
    XML_CHECK_NOT_ATTR_DECL = 5024 /* 5024 */
    XML_CHECK_NOT_ELEM_DECL = 5025 /* 5025 */
    XML_CHECK_NOT_ENTITY_DECL = 5026 /* 5026 */
    XML_CHECK_NOT_NS_DECL = 5027 /* 5027 */
    XML_CHECK_NO_HREF = 5028 /* 5028 */
    XML_CHECK_WRONG_PARENT = 5029 /* 5029 */
    XML_CHECK_NS_SCOPE = 5030 /* 5030 */
    XML_CHECK_NS_ANCESTOR = 5031 /* 5031 */
    XML_CHECK_NOT_UTF8 = 5032 /* 5032 */
    XML_CHECK_NO_DICT = 5033 /* 5033 */
    XML_CHECK_NOT_NCNAME = 5034 /* 5034 */
    XML_CHECK_OUTSIDE_DICT = 5035 /* 5035 */
    XML_CHECK_WRONG_NAME = 5036 /* 5036 */
    XML_CHECK_NAME_NOT_NULL = 5037 /* 5037 */
    XML_I18N_NO_NAME = 6000
    XML_I18N_NO_HANDLER = 6001 /* 6001 */
    XML_I18N_EXCESS_HANDLER = 6002 /* 6002 */
    XML_I18N_CONV_FAILED = 6003 /* 6003 */
    XML_I18N_NO_OUTPUT = 6004 /* 6004 */
    XML_BUF_OVERFLOW = 7000
};



Function type xmlStructuredErrorFunc

void	xmlStructuredErrorFunc		(void * userData, 
xmlErrorPtr error)

Signature of the function to use when there is an error and the module handles the new error reporting mechanism.

userData:user provided data for the error callback
error:the error being raised.

initGenericErrorDefaultFunc ()

void	initGenericErrorDefaultFunc	(xmlGenericErrorFunc * handler)

Set or reset (if NULL) the default handler for generic errors to the builtin error function.

handler:the handler

xmlCopyError ()

int	xmlCopyError			(xmlErrorPtr from, 
xmlErrorPtr to)

Save the original error to the new place.

from:a source error
to:a target error
Returns:0 in case of success and -1 in case of error.

xmlCtxtGetLastError ()

xmlErrorPtr	xmlCtxtGetLastError	(void * ctx)

Get the last parsing error registered.

ctx:an XML parser context
Returns:NULL if no error occured or a pointer to the error


xmlGetLastError ()

xmlErrorPtr	xmlGetLastError		(void)

Get the last global error registered. This is per thread if compiled with thread support.

Returns:NULL if no error occured or a pointer to the error


xmlParserPrintFileContext ()

void	xmlParserPrintFileContext	(xmlParserInputPtr input)

Displays current context within the input content for error tracking

input:an xmlParserInputPtr input

xmlParserPrintFileInfo ()

void	xmlParserPrintFileInfo		(xmlParserInputPtr input)

Displays the associated file and line informations for the current input

input:an xmlParserInputPtr input




xmlResetError ()

void	xmlResetError			(xmlErrorPtr err)

Cleanup the error.

err:pointer to the error.


xmlSetGenericErrorFunc ()

void	xmlSetGenericErrorFunc		(void * ctx, 
xmlGenericErrorFunc handler)

Function to reset the handler and the error context for out of context error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler One can simply force messages to be emitted to another FILE * than stderr by setting @ctx to this file handle and @handler to NULL. For multi-threaded applications, this must be set separately for each thread.

ctx:the new error handling context
handler:the new handler function

xmlSetStructuredErrorFunc ()

void	xmlSetStructuredErrorFunc	(void * ctx, 
xmlStructuredErrorFunc handler)

Function to reset the handler and the error context for out of context structured error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler For multi-threaded applications, this must be set separately for each thread.

ctx:the new error handling context
handler:the new handler function

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-uri.html0000644000175000017500000004400212134171044020001 0ustar aronaron uri: library of generic URI related routines

uri

uri - library of generic URI related routines

library of generic URI related routines Implements RFC 2396

Author(s): Daniel Veillard

Synopsis

typedef struct _xmlURI xmlURI;
typedef xmlURI * xmlURIPtr;
int	xmlNormalizeURIPath		(char * path);
void	xmlPrintURI			(FILE * stream, 
xmlURIPtr uri); xmlURIPtr xmlParseURIRaw (const char * str,
int raw); char * xmlURIUnescapeString (const char * str,
int len,
char * target); xmlURIPtr xmlParseURI (const char * str); xmlURIPtr xmlCreateURI (void); xmlChar * xmlURIEscapeStr (const xmlChar * str,
const xmlChar * list); xmlChar * xmlPathToURI (const xmlChar * path); xmlChar * xmlCanonicPath (const xmlChar * path); void xmlFreeURI (xmlURIPtr uri); int xmlParseURIReference (xmlURIPtr uri,
const char * str); xmlChar * xmlBuildRelativeURI (const xmlChar * URI,
const xmlChar * base); xmlChar * xmlSaveUri (xmlURIPtr uri); xmlChar * xmlURIEscape (const xmlChar * str); xmlChar * xmlBuildURI (const xmlChar * URI,
const xmlChar * base);

Description

Details

Structure xmlURI

struct _xmlURI {
    char *	scheme	: the URI scheme
    char *	opaque	: opaque part
    char *	authority	: the authority part
    char *	server	: the server part
    char *	user	: the user part
    int	port	: the port number
    char *	path	: the path string
    char *	query	: the query string (deprecated - use with caution)
    char *	fragment	: the fragment identifier
    int	cleanup	: parsing potentially unclean URI
    char *	query_raw	: the query string (as it appears in the URI)
} xmlURI;


Typedef xmlURIPtr

xmlURI * xmlURIPtr;


xmlBuildRelativeURI ()

xmlChar *	xmlBuildRelativeURI	(const xmlChar * URI, 
const xmlChar * base)

Expresses the URI of the reference in terms relative to the base. Some examples of this operation include: base = "http://site1.com/docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif pic1.gif http://site2.com/docs/pic1.gif http://site2.com/docs/pic1.gif base = "docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif http://site1.com/docs/pic1.gif Note: if the URI reference is really wierd or complicated, it may be worthwhile to first convert it into a "nice" one by calling xmlBuildURI (using 'base') before calling this routine, since this routine (for reasonable efficiency) assumes URI has already been through some validation.

URI:the URI reference under consideration
base:the base value
Returns:a new URI string (to be freed by the caller) or NULL in case error.

xmlBuildURI ()

xmlChar *	xmlBuildURI		(const xmlChar * URI, 
const xmlChar * base)

Computes he final URI of the reference done by checking that the given URI is valid, and building the final URI using the base URI. This is processed according to section 5.2 of the RFC 2396 5.2. Resolving Relative References to Absolute Form

URI:the URI instance found in the document
base:the base value
Returns:a new URI string (to be freed by the caller) or NULL in case of error.

xmlCanonicPath ()

xmlChar *	xmlCanonicPath		(const xmlChar * path)

Constructs a canonic path from the specified path.

path:the resource locator in a filesystem notation
Returns:a new canonic path, or a duplicate of the path parameter if the construction fails. The caller is responsible for freeing the memory occupied by the returned string. If there is insufficient memory available, or the argument is NULL, the function returns NULL.

xmlCreateURI ()

xmlURIPtr	xmlCreateURI		(void)

Simply creates an empty xmlURI

Returns:the new structure or NULL in case of error

xmlFreeURI ()

void	xmlFreeURI			(xmlURIPtr uri)

Free up the xmlURI struct

uri:pointer to an xmlURI


xmlParseURI ()

xmlURIPtr	xmlParseURI		(const char * str)

Parse an URI based on RFC 3986 URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

str:the URI string to analyze
Returns:a newly built xmlURIPtr or NULL in case of error

xmlParseURIRaw ()

xmlURIPtr	xmlParseURIRaw		(const char * str, 
int raw)

Parse an URI but allows to keep intact the original fragments. URI-reference = URI / relative-ref

str:the URI string to analyze
raw:if 1 unescaping of URI pieces are disabled
Returns:a newly built xmlURIPtr or NULL in case of error

xmlParseURIReference ()

int	xmlParseURIReference		(xmlURIPtr uri, 
const char * str)

Parse an URI reference string based on RFC 3986 and fills in the appropriate fields of the @uri structure URI-reference = URI / relative-ref

uri:pointer to an URI structure
str:the string to analyze
Returns:0 or the error code

xmlPathToURI ()

xmlChar *	xmlPathToURI		(const xmlChar * path)

Constructs an URI expressing the existing path

path:the resource locator in a filesystem notation
Returns:a new URI, or a duplicate of the path parameter if the construction fails. The caller is responsible for freeing the memory occupied by the returned string. If there is insufficient memory available, or the argument is NULL, the function returns NULL.

xmlPrintURI ()

void	xmlPrintURI			(FILE * stream, 
xmlURIPtr uri)

Prints the URI in the stream @stream.

stream:a FILE* for the output
uri:pointer to an xmlURI

xmlSaveUri ()

xmlChar *	xmlSaveUri		(xmlURIPtr uri)

Save the URI as an escaped string

uri:pointer to an xmlURI
Returns:a new string (to be deallocated by caller)

xmlURIEscape ()

xmlChar *	xmlURIEscape		(const xmlChar * str)

Escaping routine, does not do validity checks ! It will try to escape the chars needing this, but this is heuristic based it's impossible to be sure.

str:the string of the URI to escape
Returns:an copy of the string, but escaped 25 May 2001 Uses xmlParseURI and xmlURIEscapeStr to try to escape correctly according to RFC2396. - Carl Douglas

xmlURIEscapeStr ()

xmlChar *	xmlURIEscapeStr		(const xmlChar * str, 
const xmlChar * list)

This routine escapes a string to hex, ignoring reserved characters (a-z) and the characters in the exception list.

str:string to escape
list:exception list string of chars not to escape
Returns:a new escaped string or NULL in case of error.


libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlmodule.html0000644000175000017500000001631212134171044021213 0ustar aronaron xmlmodule: dynamic module loading

xmlmodule

xmlmodule - dynamic module loading

basic API for dynamic module loading, used by libexslt added in 2.6.17

Author(s): Joel W. Reed

Synopsis

typedef struct _xmlModule xmlModule;
typedef xmlModule * xmlModulePtr;
typedef enum xmlModuleOption;
int	xmlModuleFree			(xmlModulePtr module);
int	xmlModuleSymbol			(xmlModulePtr module, 
const char * name,
void ** symbol); xmlModulePtr xmlModuleOpen (const char * name,
int options); int xmlModuleClose (xmlModulePtr module);

Description

Details

Structure xmlModule

struct _xmlModule {
The content of this structure is not made public by the API.
} xmlModule;


Enum xmlModuleOption

enum xmlModuleOption {
    XML_MODULE_LAZY = 1 /* lazy binding */
    XML_MODULE_LOCAL = 2 /*  local binding */
};


Typedef xmlModulePtr

xmlModule * xmlModulePtr;

A handle to a dynamically loaded module


xmlModuleClose ()

int	xmlModuleClose			(xmlModulePtr module)

The close operations unload the associated module and free the data associated to the module.

module:the module handle
Returns:0 in case of success, -1 in case of argument error and -2 if the module could not be closed/unloaded.

xmlModuleFree ()

int	xmlModuleFree			(xmlModulePtr module)

The free operations free the data associated to the module but does not unload the associated shared library which may still be in use.

module:the module handle
Returns:0 in case of success, -1 in case of argument error

xmlModuleOpen ()

xmlModulePtr	xmlModuleOpen		(const char * name, 
int options)

Opens a module/shared library given its name or path NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We canot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const xmlChar * . TODO: options are not yet implemented.

name:the module name
options:a set of xmlModuleOption
Returns:a handle for the module or NULL in case of error

xmlModuleSymbol ()

int	xmlModuleSymbol			(xmlModulePtr module, 
const char * name,
void ** symbol)

Lookup for a symbol address in the given module NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We canot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const xmlChar * .

module:the module
name:the name of the symbol
symbol:the resulting symbol address
Returns:0 if the symbol was found, or -1 in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlschemas.html0000644000175000017500000012303112134171044021346 0ustar aronaron xmlschemas: incomplete XML Schemas structure implementation

xmlschemas

xmlschemas - incomplete XML Schemas structure implementation

interface to the XML Schemas handling and schema validity checking, it is incomplete right now.

Author(s): Daniel Veillard

Synopsis

typedef xmlSchema * xmlSchemaPtr;
typedef struct _xmlSchemaParserCtxt xmlSchemaParserCtxt;
typedef enum xmlSchemaValidOption;
typedef xmlSchemaSAXPlugStruct * xmlSchemaSAXPlugPtr;
typedef struct _xmlSchemaSAXPlug xmlSchemaSAXPlugStruct;
typedef xmlSchemaValidCtxt * xmlSchemaValidCtxtPtr;
typedef xmlSchemaParserCtxt * xmlSchemaParserCtxtPtr;
typedef struct _xmlSchema xmlSchema;
typedef enum xmlSchemaValidError;
typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt;
xmlSchemaParserCtxtPtr	xmlSchemaNewDocParserCtxt	(xmlDocPtr doc);
int	xmlSchemaSAXUnplug		(xmlSchemaSAXPlugPtr plug);
xmlSchemaPtr	xmlSchemaParse		(xmlSchemaParserCtxtPtr ctxt);
void	xmlSchemaFreeParserCtxt		(xmlSchemaParserCtxtPtr ctxt);
void	xmlSchemaValidateSetFilename	(xmlSchemaValidCtxtPtr vctxt, 
const char * filename); xmlSchemaParserCtxtPtr xmlSchemaNewParserCtxt (const char * URL); int xmlSchemaIsValid (xmlSchemaValidCtxtPtr ctxt); typedef void xmlSchemaValidityErrorFunc (void * ctx,
const char * msg,
... ...); xmlSchemaSAXPlugPtr xmlSchemaSAXPlug (xmlSchemaValidCtxtPtr ctxt,
xmlSAXHandlerPtr * sax,
void ** user_data); int xmlSchemaValidateStream (xmlSchemaValidCtxtPtr ctxt,
xmlParserInputBufferPtr input,
xmlCharEncoding enc,
xmlSAXHandlerPtr sax,
void * user_data); int xmlSchemaGetParserErrors (xmlSchemaParserCtxtPtr ctxt,
xmlSchemaValidityErrorFunc * err,
xmlSchemaValidityWarningFunc * warn,
void ** ctx); void xmlSchemaValidateSetLocator (xmlSchemaValidCtxtPtr vctxt,
xmlSchemaValidityLocatorFunc f,
void * ctxt); int xmlSchemaValidateOneElement (xmlSchemaValidCtxtPtr ctxt,
xmlNodePtr elem); void xmlSchemaSetValidStructuredErrors (xmlSchemaValidCtxtPtr ctxt,
xmlStructuredErrorFunc serror,
void * ctx); void xmlSchemaSetValidErrors (xmlSchemaValidCtxtPtr ctxt,
xmlSchemaValidityErrorFunc err,
xmlSchemaValidityWarningFunc warn,
void * ctx); int xmlSchemaValidCtxtGetOptions (xmlSchemaValidCtxtPtr ctxt); int xmlSchemaValidateFile (xmlSchemaValidCtxtPtr ctxt,
const char * filename,
int options); int xmlSchemaValidateDoc (xmlSchemaValidCtxtPtr ctxt,
xmlDocPtr doc); void xmlSchemaFree (xmlSchemaPtr schema); xmlSchemaParserCtxtPtr xmlSchemaNewMemParserCtxt (const char * buffer,
int size); typedef int xmlSchemaValidityLocatorFunc (void * ctx,
const char ** file,
unsigned long * line); int xmlSchemaGetValidErrors (xmlSchemaValidCtxtPtr ctxt,
xmlSchemaValidityErrorFunc * err,
xmlSchemaValidityWarningFunc * warn,
void ** ctx); int xmlSchemaSetValidOptions (xmlSchemaValidCtxtPtr ctxt,
int options); void xmlSchemaSetParserErrors (xmlSchemaParserCtxtPtr ctxt,
xmlSchemaValidityErrorFunc err,
xmlSchemaValidityWarningFunc warn,
void * ctx); typedef void xmlSchemaValidityWarningFunc (void * ctx,
const char * msg,
... ...); void xmlSchemaDump (FILE * output,
xmlSchemaPtr schema); void xmlSchemaFreeValidCtxt (xmlSchemaValidCtxtPtr ctxt); xmlParserCtxtPtr xmlSchemaValidCtxtGetParserCtxt (xmlSchemaValidCtxtPtr ctxt); void xmlSchemaSetParserStructuredErrors (xmlSchemaParserCtxtPtr ctxt,
xmlStructuredErrorFunc serror,
void * ctx); xmlSchemaValidCtxtPtr xmlSchemaNewValidCtxt (xmlSchemaPtr schema);

Description

Details

Structure xmlSchema

struct _xmlSchema {
    const xmlChar *	name	: schema name
    const xmlChar *	targetNamespace	: the target namespace
    const xmlChar *	version
    const xmlChar *	id	: Obsolete
    xmlDocPtr	doc
    xmlSchemaAnnotPtr	annot
    int	flags
    xmlHashTablePtr	typeDecl
    xmlHashTablePtr	attrDecl
    xmlHashTablePtr	attrgrpDecl
    xmlHashTablePtr	elemDecl
    xmlHashTablePtr	notaDecl
    xmlHashTablePtr	schemasImports
    void *	_private	: unused by the library for users or bindings
    xmlHashTablePtr	groupDecl
    xmlDictPtr	dict
    void *	includes	: the includes, this is opaque for now
    int	preserve	: whether to free the document
    int	counter	: used to give ononymous components unique names
    xmlHashTablePtr	idcDef	: All identity-constraint defs.
    void *	volatiles	: Obsolete
} xmlSchema;


Structure xmlSchemaParserCtxt

struct _xmlSchemaParserCtxt {
The content of this structure is not made public by the API.
} xmlSchemaParserCtxt;


Typedef xmlSchemaParserCtxtPtr

xmlSchemaParserCtxt * xmlSchemaParserCtxtPtr;


Typedef xmlSchemaPtr

xmlSchema * xmlSchemaPtr;


Typedef xmlSchemaSAXPlugPtr

xmlSchemaSAXPlugStruct * xmlSchemaSAXPlugPtr;


Structure xmlSchemaSAXPlugStruct

struct _xmlSchemaSAXPlug {
The content of this structure is not made public by the API.
} xmlSchemaSAXPlugStruct;


Structure xmlSchemaValidCtxt

struct _xmlSchemaValidCtxt {
The content of this structure is not made public by the API.
} xmlSchemaValidCtxt;


Typedef xmlSchemaValidCtxtPtr

xmlSchemaValidCtxt * xmlSchemaValidCtxtPtr;



Enum xmlSchemaValidOption

enum xmlSchemaValidOption {
    XML_SCHEMA_VAL_VC_I_CREATE = 1 /*  Default/fixed: create an attribute node * or an element's text node on the instance. * */
};





xmlSchemaDump ()

void	xmlSchemaDump			(FILE * output, 
xmlSchemaPtr schema)

Dump a Schema structure.

output:the file output
schema:a schema structure

xmlSchemaFree ()

void	xmlSchemaFree			(xmlSchemaPtr schema)

Deallocate a Schema structure.

schema:a schema structure

xmlSchemaFreeParserCtxt ()

void	xmlSchemaFreeParserCtxt		(xmlSchemaParserCtxtPtr ctxt)

Free the resources associated to the schema parser context

ctxt:the schema parser context

xmlSchemaFreeValidCtxt ()

void	xmlSchemaFreeValidCtxt		(xmlSchemaValidCtxtPtr ctxt)

Free the resources associated to the schema validation context

ctxt:the schema validation context

xmlSchemaGetParserErrors ()

int	xmlSchemaGetParserErrors	(xmlSchemaParserCtxtPtr ctxt, 
xmlSchemaValidityErrorFunc * err,
xmlSchemaValidityWarningFunc * warn,
void ** ctx)

Get the callback information used to handle errors for a parser context

ctxt:a XMl-Schema parser context
err:the error callback result
warn:the warning callback result
ctx:contextual data for the callbacks result
Returns:-1 in case of failure, 0 otherwise

xmlSchemaGetValidErrors ()

int	xmlSchemaGetValidErrors		(xmlSchemaValidCtxtPtr ctxt, 
xmlSchemaValidityErrorFunc * err,
xmlSchemaValidityWarningFunc * warn,
void ** ctx)

Get the error and warning callback informations

ctxt:a XML-Schema validation context
err:the error function result
warn:the warning function result
ctx:the functions context result
Returns:-1 in case of error and 0 otherwise

xmlSchemaIsValid ()

int	xmlSchemaIsValid		(xmlSchemaValidCtxtPtr ctxt)

Check if any error was detected during validation.

ctxt:the schema validation context
Returns:1 if valid so far, 0 if errors were detected, and -1 in case of internal error.

xmlSchemaNewDocParserCtxt ()

xmlSchemaParserCtxtPtr	xmlSchemaNewDocParserCtxt	(xmlDocPtr doc)

Create an XML Schemas parse context for that document. NB. The document may be modified during the parsing process.

doc:a preparsed document tree
Returns:the parser context or NULL in case of error

xmlSchemaNewMemParserCtxt ()

xmlSchemaParserCtxtPtr	xmlSchemaNewMemParserCtxt	(const char * buffer, 
int size)

Create an XML Schemas parse context for that memory buffer expected to contain an XML Schemas file.

buffer:a pointer to a char array containing the schemas
size:the size of the array
Returns:the parser context or NULL in case of error

xmlSchemaNewParserCtxt ()

xmlSchemaParserCtxtPtr	xmlSchemaNewParserCtxt	(const char * URL)

Create an XML Schemas parse context for that file/resource expected to contain an XML Schemas file.

URL:the location of the schema
Returns:the parser context or NULL in case of error

xmlSchemaNewValidCtxt ()

xmlSchemaValidCtxtPtr	xmlSchemaNewValidCtxt	(xmlSchemaPtr schema)

Create an XML Schemas validation context based on the given schema.

schema:a precompiled XML Schemas
Returns:the validation context or NULL in case of error

xmlSchemaParse ()

xmlSchemaPtr	xmlSchemaParse		(xmlSchemaParserCtxtPtr ctxt)

parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances.

ctxt:a schema validation context
Returns:the internal XML Schema structure built from the resource or NULL in case of error

xmlSchemaSAXPlug ()

xmlSchemaSAXPlugPtr	xmlSchemaSAXPlug	(xmlSchemaValidCtxtPtr ctxt, 
xmlSAXHandlerPtr * sax,
void ** user_data)

Plug a SAX based validation layer in a SAX parsing event flow. The original @saxptr and @dataptr data are replaced by new pointers but the calls to the original will be maintained.

ctxt:a schema validation context
sax:a pointer to the original xmlSAXHandlerPtr
user_data:a pointer to the original SAX user data pointer
Returns:a pointer to a data structure needed to unplug the validation layer or NULL in case of errors.

xmlSchemaSAXUnplug ()

int	xmlSchemaSAXUnplug		(xmlSchemaSAXPlugPtr plug)

Unplug a SAX based validation layer in a SAX parsing event flow. The original pointers used in the call are restored.

plug:a data structure returned by xmlSchemaSAXPlug
Returns:0 in case of success and -1 in case of failure.

xmlSchemaSetParserErrors ()

void	xmlSchemaSetParserErrors	(xmlSchemaParserCtxtPtr ctxt, 
xmlSchemaValidityErrorFunc err,
xmlSchemaValidityWarningFunc warn,
void * ctx)

Set the callback functions used to handle errors for a validation context

ctxt:a schema validation context
err:the error callback
warn:the warning callback
ctx:contextual data for the callbacks

xmlSchemaSetParserStructuredErrors ()

void	xmlSchemaSetParserStructuredErrors	(xmlSchemaParserCtxtPtr ctxt, 
xmlStructuredErrorFunc serror,
void * ctx)

Set the structured error callback

ctxt:a schema parser context
serror:the structured error function
ctx:the functions context

xmlSchemaSetValidErrors ()

void	xmlSchemaSetValidErrors		(xmlSchemaValidCtxtPtr ctxt, 
xmlSchemaValidityErrorFunc err,
xmlSchemaValidityWarningFunc warn,
void * ctx)

Set the error and warning callback informations

ctxt:a schema validation context
err:the error function
warn:the warning function
ctx:the functions context

xmlSchemaSetValidOptions ()

int	xmlSchemaSetValidOptions	(xmlSchemaValidCtxtPtr ctxt, 
int options)

Sets the options to be used during the validation.

ctxt:a schema validation context
options:a combination of xmlSchemaValidOption
Returns:0 in case of success, -1 in case of an API error.

xmlSchemaSetValidStructuredErrors ()

void	xmlSchemaSetValidStructuredErrors	(xmlSchemaValidCtxtPtr ctxt, 
xmlStructuredErrorFunc serror,
void * ctx)

Set the structured error callback

ctxt:a schema validation context
serror:the structured error function
ctx:the functions context

xmlSchemaValidCtxtGetOptions ()

int	xmlSchemaValidCtxtGetOptions	(xmlSchemaValidCtxtPtr ctxt)

Get the validation context options.

ctxt:a schema validation context
Returns:the option combination or -1 on error.

xmlSchemaValidCtxtGetParserCtxt ()

xmlParserCtxtPtr	xmlSchemaValidCtxtGetParserCtxt	(xmlSchemaValidCtxtPtr ctxt)

allow access to the parser context of the schema validation context

ctxt:a schema validation context
Returns:the parser context of the schema validation context or NULL in case of error.

xmlSchemaValidateDoc ()

int	xmlSchemaValidateDoc		(xmlSchemaValidCtxtPtr ctxt, 
xmlDocPtr doc)

Validate a document tree in memory.

ctxt:a schema validation context
doc:a parsed document tree
Returns:0 if the document is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

xmlSchemaValidateFile ()

int	xmlSchemaValidateFile		(xmlSchemaValidCtxtPtr ctxt, 
const char * filename,
int options)

Do a schemas validation of the given resource, it will use the SAX streamable validation internally.

ctxt:a schema validation context
filename:the URI of the instance
options:a future set of options, currently unused
Returns:0 if the document is valid, a positive error code number otherwise and -1 in case of an internal or API error.

xmlSchemaValidateOneElement ()

int	xmlSchemaValidateOneElement	(xmlSchemaValidCtxtPtr ctxt, 
xmlNodePtr elem)

Validate a branch of a tree, starting with the given @elem.

ctxt:a schema validation context
elem:an element node
Returns:0 if the element and its subtree is valid, a positive error code number otherwise and -1 in case of an internal or API error.

xmlSchemaValidateSetFilename ()

void	xmlSchemaValidateSetFilename	(xmlSchemaValidCtxtPtr vctxt, 
const char * filename)

Workaround to provide file error reporting information when this is not provided by current APIs

vctxt:the schema validation context
filename:the file name

xmlSchemaValidateSetLocator ()

void	xmlSchemaValidateSetLocator	(xmlSchemaValidCtxtPtr vctxt, 
xmlSchemaValidityLocatorFunc f,
void * ctxt)

Allows to set a locator function to the validation context, which will be used to provide file and line information since those are not provided as part of the SAX validation flow Setting @f to NULL disable the locator.

vctxt:a schema validation context
f:the locator function pointer
ctxt:the locator context

xmlSchemaValidateStream ()

int	xmlSchemaValidateStream		(xmlSchemaValidCtxtPtr ctxt, 
xmlParserInputBufferPtr input,
xmlCharEncoding enc,
xmlSAXHandlerPtr sax,
void * user_data)

Validate an input based on a flow of SAX event from the parser and forward the events to the @sax handler with the provided @user_data the user provided @sax handler must be a SAX2 one.

ctxt:a schema validation context
input:the input to use for reading the data
enc:an optional encoding information
sax:a SAX handler for the resulting events
user_data:the context to provide to the SAX handler.
Returns:0 if the document is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlstring.html0000644000175000017500000010445112134171044021236 0ustar aronaron xmlstring: set of routines to process strings

xmlstring

xmlstring - set of routines to process strings

type and interfaces needed for the internal string handling of the library, especially UTF8 processing.

Author(s): Daniel Veillard

Synopsis

#define BAD_CAST;
typedef unsigned char xmlChar;
int	xmlStrcmp			(const xmlChar * str1, 
const xmlChar * str2); xmlChar * xmlCharStrndup (const char * cur,
int len); const xmlChar * xmlStrcasestr (const xmlChar * str,
const xmlChar * val); xmlChar * xmlStrcat (xmlChar * cur,
const xmlChar * add); int xmlStrPrintf (xmlChar * buf,
int len,
const xmlChar * msg,
... ...); const xmlChar * xmlStrstr (const xmlChar * str,
const xmlChar * val); int xmlUTF8Size (const xmlChar * utf); int xmlStrQEqual (const xmlChar * pref,
const xmlChar * name,
const xmlChar * str); xmlChar * xmlStrncatNew (const xmlChar * str1,
const xmlChar * str2,
int len); const xmlChar * xmlUTF8Strpos (const xmlChar * utf,
int pos); xmlChar * xmlStrdup (const xmlChar * cur); xmlChar * xmlCharStrdup (const char * cur); const xmlChar * xmlStrchr (const xmlChar * str,
xmlChar val); int xmlStrlen (const xmlChar * str); int xmlStrncmp (const xmlChar * str1,
const xmlChar * str2,
int len); xmlChar * xmlStrsub (const xmlChar * str,
int start,
int len); xmlChar * xmlStrncat (xmlChar * cur,
const xmlChar * add,
int len); int xmlGetUTF8Char (const unsigned char * utf,
int * len); int xmlStrcasecmp (const xmlChar * str1,
const xmlChar * str2); xmlChar * xmlStrndup (const xmlChar * cur,
int len); int xmlStrVPrintf (xmlChar * buf,
int len,
const xmlChar * msg,
va_list ap); int xmlUTF8Strsize (const xmlChar * utf,
int len); int xmlCheckUTF8 (const unsigned char * utf); int xmlStrncasecmp (const xmlChar * str1,
const xmlChar * str2,
int len); int xmlUTF8Strlen (const xmlChar * utf); xmlChar * xmlUTF8Strsub (const xmlChar * utf,
int start,
int len); int xmlStrEqual (const xmlChar * str1,
const xmlChar * str2); int xmlUTF8Charcmp (const xmlChar * utf1,
const xmlChar * utf2); xmlChar * xmlUTF8Strndup (const xmlChar * utf,
int len); int xmlUTF8Strloc (const xmlChar * utf,
const xmlChar * utfchar);

Description

Details

Macro BAD_CAST

#define BAD_CAST;

Macro to cast a string to an xmlChar * when one know its safe.


Typedef xmlChar

unsigned char xmlChar;

This is a basic byte in an UTF-8 encoded string. It's unsigned allowing to pinpoint case where char * are assigned to xmlChar * (possibly making serialization back impossible).


xmlCharStrdup ()

xmlChar *	xmlCharStrdup		(const char * cur)

a strdup for char's to xmlChar's

cur:the input char *
Returns:a new xmlChar * or NULL

xmlCharStrndup ()

xmlChar *	xmlCharStrndup		(const char * cur, 
int len)

a strndup for char's to xmlChar's

cur:the input char *
len:the len of @cur
Returns:a new xmlChar * or NULL



xmlStrEqual ()

int	xmlStrEqual			(const xmlChar * str1, 
const xmlChar * str2)

Check if both strings are equal of have same content. Should be a bit more readable and faster than xmlStrcmp()

str1:the first xmlChar *
str2:the second xmlChar *
Returns:1 if they are equal, 0 if they are different

xmlStrPrintf ()

int	xmlStrPrintf			(xmlChar * buf, 
int len,
const xmlChar * msg,
... ...)

Formats @msg and places result into @buf.

buf:the result buffer.
len:the result buffer length.
msg:the message with printf formatting.
...:extra parameters for the message.
Returns:the number of characters written to @buf or -1 if an error occurs.

xmlStrQEqual ()

int	xmlStrQEqual			(const xmlChar * pref, 
const xmlChar * name,
const xmlChar * str)

Check if a QName is Equal to a given string

pref:the prefix of the QName
name:the localname of the QName
str:the second xmlChar *
Returns:1 if they are equal, 0 if they are different

xmlStrVPrintf ()

int	xmlStrVPrintf			(xmlChar * buf, 
int len,
const xmlChar * msg,
va_list ap)

Formats @msg and places result into @buf.

buf:the result buffer.
len:the result buffer length.
msg:the message with printf formatting.
ap:extra parameters for the message.
Returns:the number of characters written to @buf or -1 if an error occurs.

xmlStrcasecmp ()

int	xmlStrcasecmp			(const xmlChar * str1, 
const xmlChar * str2)

a strcasecmp for xmlChar's

str1:the first xmlChar *
str2:the second xmlChar *
Returns:the integer result of the comparison

xmlStrcasestr ()

const xmlChar *	xmlStrcasestr		(const xmlChar * str, 
const xmlChar * val)

a case-ignoring strstr for xmlChar's

str:the xmlChar * array (haystack)
val:the xmlChar to search (needle)
Returns:the xmlChar * for the first occurrence or NULL.

xmlStrcat ()

xmlChar *	xmlStrcat		(xmlChar * cur, 
const xmlChar * add)

a strcat for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'.

cur:the original xmlChar * array
add:the xmlChar * array added
Returns:a new xmlChar * containing the concatenated string.

xmlStrchr ()

const xmlChar *	xmlStrchr		(const xmlChar * str, 
xmlChar val)

a strchr for xmlChar's

str:the xmlChar * array
val:the xmlChar to search
Returns:the xmlChar * for the first occurrence or NULL.

xmlStrcmp ()

int	xmlStrcmp			(const xmlChar * str1, 
const xmlChar * str2)

a strcmp for xmlChar's

str1:the first xmlChar *
str2:the second xmlChar *
Returns:the integer result of the comparison

xmlStrdup ()

xmlChar *	xmlStrdup		(const xmlChar * cur)

a strdup for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'.

cur:the input xmlChar *
Returns:a new xmlChar * or NULL

xmlStrlen ()

int	xmlStrlen			(const xmlChar * str)

length of a xmlChar's string

str:the xmlChar * array
Returns:the number of xmlChar contained in the ARRAY.

xmlStrncasecmp ()

int	xmlStrncasecmp			(const xmlChar * str1, 
const xmlChar * str2,
int len)

a strncasecmp for xmlChar's

str1:the first xmlChar *
str2:the second xmlChar *
len:the max comparison length
Returns:the integer result of the comparison

xmlStrncat ()

xmlChar *	xmlStrncat		(xmlChar * cur, 
const xmlChar * add,
int len)

a strncat for array of xmlChar's, it will extend @cur with the len first bytes of @add. Note that if @len < 0 then this is an API error and NULL will be returned.

cur:the original xmlChar * array
add:the xmlChar * array added
len:the length of @add
Returns:a new xmlChar *, the original @cur is reallocated if needed and should not be freed

xmlStrncatNew ()

xmlChar *	xmlStrncatNew		(const xmlChar * str1, 
const xmlChar * str2,
int len)

same as xmlStrncat, but creates a new string. The original two strings are not freed. If @len is < 0 then the length will be calculated automatically.

str1:first xmlChar string
str2:second xmlChar string
len:the len of @str2 or < 0
Returns:a new xmlChar * or NULL

xmlStrncmp ()

int	xmlStrncmp			(const xmlChar * str1, 
const xmlChar * str2,
int len)

a strncmp for xmlChar's

str1:the first xmlChar *
str2:the second xmlChar *
len:the max comparison length
Returns:the integer result of the comparison

xmlStrndup ()

xmlChar *	xmlStrndup		(const xmlChar * cur, 
int len)

a strndup for array of xmlChar's

cur:the input xmlChar *
len:the len of @cur
Returns:a new xmlChar * or NULL

xmlStrstr ()

const xmlChar *	xmlStrstr		(const xmlChar * str, 
const xmlChar * val)

a strstr for xmlChar's

str:the xmlChar * array (haystack)
val:the xmlChar to search (needle)
Returns:the xmlChar * for the first occurrence or NULL.

xmlStrsub ()

xmlChar *	xmlStrsub		(const xmlChar * str, 
int start,
int len)

Extract a substring of a given string

str:the xmlChar * array (haystack)
start:the index of the first char (zero based)
len:the length of the substring
Returns:the xmlChar * for the first occurrence or NULL.

xmlUTF8Charcmp ()

int	xmlUTF8Charcmp			(const xmlChar * utf1, 
const xmlChar * utf2)

compares the two UCS4 values

utf1:pointer to first UTF8 char
utf2:pointer to second UTF8 char
Returns:result of the compare as with xmlStrncmp

xmlUTF8Size ()

int	xmlUTF8Size			(const xmlChar * utf)

calculates the internal size of a UTF8 character

utf:pointer to the UTF8 character
Returns:the numbers of bytes in the character, -1 on format error

xmlUTF8Strlen ()

int	xmlUTF8Strlen			(const xmlChar * utf)

compute the length of an UTF8 string, it doesn't do a full UTF8 checking of the content of the string.

utf:a sequence of UTF-8 encoded bytes
Returns:the number of characters in the string or -1 in case of error

xmlUTF8Strloc ()

int	xmlUTF8Strloc			(const xmlChar * utf, 
const xmlChar * utfchar)

a function to provide the relative location of a UTF8 char

utf:the input UTF8 *
utfchar:the UTF8 character to be found
Returns:the relative character position of the desired char or -1 if not found

xmlUTF8Strndup ()

xmlChar *	xmlUTF8Strndup		(const xmlChar * utf, 
int len)

a strndup for array of UTF8's

utf:the input UTF8 *
len:the len of @utf (in chars)
Returns:a new UTF8 * or NULL

xmlUTF8Strpos ()

const xmlChar *	xmlUTF8Strpos		(const xmlChar * utf, 
int pos)

a function to provide the equivalent of fetching a character from a string array

utf:the input UTF8 *
pos:the position of the desired UTF8 char (in chars)
Returns:a pointer to the UTF8 character or NULL

xmlUTF8Strsize ()

int	xmlUTF8Strsize			(const xmlChar * utf, 
int len)

storage size of an UTF8 string the behaviour is not garanteed if the input string is not UTF-8

utf:a sequence of UTF-8 encoded bytes
len:the number of characters in the array
Returns:the storage size of the first 'len' characters of ARRAY

xmlUTF8Strsub ()

xmlChar *	xmlUTF8Strsub		(const xmlChar * utf, 
int start,
int len)

Create a substring from a given UTF-8 string Note: positions are given in units of UTF-8 chars

utf:a sequence of UTF-8 encoded bytes
start:relative pos of first char
len:total number to copy
Returns:a pointer to a newly created string or NULL if any problem

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-entities.html0000644000175000017500000005511612134171044021036 0ustar aronaron entities: interface for the XML entities handling

entities

entities - interface for the XML entities handling

this module provides some of the entity API needed for the parser and applications.

Author(s): Daniel Veillard

Synopsis

typedef enum xmlEntityType;
typedef struct _xmlHashTable xmlEntitiesTable;
typedef xmlEntitiesTable * xmlEntitiesTablePtr;
xmlEntityPtr	xmlAddDocEntity		(xmlDocPtr doc, 
const xmlChar * name,
int type,
const xmlChar * ExternalID,
const xmlChar * SystemID,
const xmlChar * content); xmlEntityPtr xmlNewEntity (xmlDocPtr doc,
const xmlChar * name,
int type,
const xmlChar * ExternalID,
const xmlChar * SystemID,
const xmlChar * content); xmlChar * xmlEncodeEntitiesReentrant (xmlDocPtr doc,
const xmlChar * input); xmlEntityPtr xmlGetDocEntity (xmlDocPtr doc,
const xmlChar * name); xmlEntityPtr xmlGetDtdEntity (xmlDocPtr doc,
const xmlChar * name); xmlEntityPtr xmlAddDtdEntity (xmlDocPtr doc,
const xmlChar * name,
int type,
const xmlChar * ExternalID,
const xmlChar * SystemID,
const xmlChar * content); xmlEntitiesTablePtr xmlCopyEntitiesTable (xmlEntitiesTablePtr table); void xmlFreeEntitiesTable (xmlEntitiesTablePtr table); xmlEntityPtr xmlGetParameterEntity (xmlDocPtr doc,
const xmlChar * name); void xmlDumpEntitiesTable (xmlBufferPtr buf,
xmlEntitiesTablePtr table); void xmlDumpEntityDecl (xmlBufferPtr buf,
xmlEntityPtr ent); void xmlCleanupPredefinedEntities (void); xmlEntitiesTablePtr xmlCreateEntitiesTable (void); const xmlChar * xmlEncodeEntities (xmlDocPtr doc,
const xmlChar * input); xmlChar * xmlEncodeSpecialChars (xmlDocPtr doc,
const xmlChar * input); xmlEntityPtr xmlGetPredefinedEntity (const xmlChar * name); void xmlInitializePredefinedEntities (void);

Description

Details

Structure xmlEntitiesTable

struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlEntitiesTable;


Typedef xmlEntitiesTablePtr

xmlEntitiesTable * xmlEntitiesTablePtr;



xmlAddDocEntity ()

xmlEntityPtr	xmlAddDocEntity		(xmlDocPtr doc, 
const xmlChar * name,
int type,
const xmlChar * ExternalID,
const xmlChar * SystemID,
const xmlChar * content)

Register a new entity for this document.

doc:the document
name:the entity name
type:the entity type XML_xxx_yyy_ENTITY
ExternalID:the entity external ID if available
SystemID:the entity system ID if available
content:the entity content
Returns:a pointer to the entity or NULL in case of error

xmlAddDtdEntity ()

xmlEntityPtr	xmlAddDtdEntity		(xmlDocPtr doc, 
const xmlChar * name,
int type,
const xmlChar * ExternalID,
const xmlChar * SystemID,
const xmlChar * content)

Register a new entity for this document DTD external subset.

doc:the document
name:the entity name
type:the entity type XML_xxx_yyy_ENTITY
ExternalID:the entity external ID if available
SystemID:the entity system ID if available
content:the entity content
Returns:a pointer to the entity or NULL in case of error


xmlCopyEntitiesTable ()

xmlEntitiesTablePtr	xmlCopyEntitiesTable	(xmlEntitiesTablePtr table)

Build a copy of an entity table.

table:An entity table
Returns:the new xmlEntitiesTablePtr or NULL in case of error.

xmlCreateEntitiesTable ()

xmlEntitiesTablePtr	xmlCreateEntitiesTable	(void)

create and initialize an empty entities hash table. This really doesn't make sense and should be deprecated

Returns:the xmlEntitiesTablePtr just created or NULL in case of error.

xmlDumpEntitiesTable ()

void	xmlDumpEntitiesTable		(xmlBufferPtr buf, 
xmlEntitiesTablePtr table)

This will dump the content of the entity table as an XML DTD definition

buf:An XML buffer.
table:An entity table

xmlDumpEntityDecl ()

void	xmlDumpEntityDecl		(xmlBufferPtr buf, 
xmlEntityPtr ent)

This will dump the content of the entity table as an XML DTD definition

buf:An XML buffer.
ent:An entity table

xmlEncodeEntities ()

const xmlChar *	xmlEncodeEntities	(xmlDocPtr doc, 
const xmlChar * input)

TODO: remove xmlEncodeEntities, once we are not afraid of breaking binary compatibility People must migrate their code to xmlEncodeEntitiesReentrant ! This routine will issue a warning when encountered.

doc:the document containing the string
input:A string to convert to XML.
Returns:NULL

xmlEncodeEntitiesReentrant ()

xmlChar *	xmlEncodeEntitiesReentrant	(xmlDocPtr doc, 
const xmlChar * input)

Do a global encoding of a string, replacing the predefined entities and non ASCII values with their entities and CharRef counterparts. Contrary to xmlEncodeEntities, this routine is reentrant, and result must be deallocated.

doc:the document containing the string
input:A string to convert to XML.
Returns:A newly allocated string with the substitution done.

xmlEncodeSpecialChars ()

xmlChar *	xmlEncodeSpecialChars	(xmlDocPtr doc, 
const xmlChar * input)

Do a global encoding of a string, replacing the predefined entities this routine is reentrant, and result must be deallocated.

doc:the document containing the string
input:A string to convert to XML.
Returns:A newly allocated string with the substitution done.

xmlFreeEntitiesTable ()

void	xmlFreeEntitiesTable		(xmlEntitiesTablePtr table)

Deallocate the memory used by an entities hash table.

table:An entity table

xmlGetDocEntity ()

xmlEntityPtr	xmlGetDocEntity		(xmlDocPtr doc, 
const xmlChar * name)

Do an entity lookup in the document entity hash table and

doc:the document referencing the entity
name:the entity name
Returns:the corresponding entity, otherwise a lookup is done in the predefined entities too. Returns A pointer to the entity structure or NULL if not found.

xmlGetDtdEntity ()

xmlEntityPtr	xmlGetDtdEntity		(xmlDocPtr doc, 
const xmlChar * name)

Do an entity lookup in the DTD entity hash table and

doc:the document referencing the entity
name:the entity name
Returns:the corresponding entity, if found. Note: the first argument is the document node, not the DTD node. Returns A pointer to the entity structure or NULL if not found.

xmlGetParameterEntity ()

xmlEntityPtr	xmlGetParameterEntity	(xmlDocPtr doc, 
const xmlChar * name)

Do an entity lookup in the internal and external subsets and

doc:the document referencing the entity
name:the entity name
Returns:the corresponding parameter entity, if found. Returns A pointer to the entity structure or NULL if not found.

xmlGetPredefinedEntity ()

xmlEntityPtr	xmlGetPredefinedEntity	(const xmlChar * name)

Check whether this name is an predefined entity.

name:the entity name
Returns:NULL if not, otherwise the entity


xmlNewEntity ()

xmlEntityPtr	xmlNewEntity		(xmlDocPtr doc, 
const xmlChar * name,
int type,
const xmlChar * ExternalID,
const xmlChar * SystemID,
const xmlChar * content)

Create a new entity, this differs from xmlAddDocEntity() that if the document is NULL or has no internal subset defined, then an unlinked entity structure will be returned, it is then the responsability of the caller to link it to the document later or free it when not needed anymore.

doc:the document
name:the entity name
type:the entity type XML_xxx_yyy_ENTITY
ExternalID:the entity external ID if available
SystemID:the entity system ID if available
content:the entity content
Returns:a pointer to the entity or NULL in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-threads.html0000644000175000017500000003114012134171044020633 0ustar aronaron threads: interfaces for thread handling

threads

threads - interfaces for thread handling

set of generic threading related routines should work with pthreads, Windows native or TLS threads

Author(s): Daniel Veillard

Synopsis

typedef struct _xmlMutex xmlMutex;
typedef struct _xmlRMutex xmlRMutex;
typedef xmlRMutex * xmlRMutexPtr;
typedef xmlMutex * xmlMutexPtr;
void	xmlFreeRMutex			(xmlRMutexPtr tok);
int	xmlGetThreadId			(void);
void	xmlMutexUnlock			(xmlMutexPtr tok);
void	xmlCleanupThreads		(void);
void	xmlLockLibrary			(void);
xmlRMutexPtr	xmlNewRMutex		(void);
void	xmlMutexLock			(xmlMutexPtr tok);
int	xmlIsMainThread			(void);
void	xmlRMutexUnlock			(xmlRMutexPtr tok);
xmlGlobalStatePtr	xmlGetGlobalState	(void);
xmlMutexPtr	xmlNewMutex		(void);
int	xmlDllMain			(void * hinstDLL, 
unsigned long fdwReason,
void * lpvReserved); void xmlFreeMutex (xmlMutexPtr tok); void xmlUnlockLibrary (void); void xmlInitThreads (void); void xmlRMutexLock (xmlRMutexPtr tok);

Description

Details

Structure xmlMutex

struct _xmlMutex {
The content of this structure is not made public by the API.
} xmlMutex;


Typedef xmlMutexPtr

xmlMutex * xmlMutexPtr;


Structure xmlRMutex

struct _xmlRMutex {
The content of this structure is not made public by the API.
} xmlRMutex;


Typedef xmlRMutexPtr

xmlRMutex * xmlRMutexPtr;




xmlFreeMutex ()

void	xmlFreeMutex			(xmlMutexPtr tok)

xmlFreeMutex() is used to reclaim resources associated with a libxml2 token struct.

tok:the simple mutex

xmlFreeRMutex ()

void	xmlFreeRMutex			(xmlRMutexPtr tok)

xmlRFreeMutex() is used to reclaim resources associated with a reentrant mutex.

tok:the reentrant mutex

xmlGetGlobalState ()

xmlGlobalStatePtr	xmlGetGlobalState	(void)

xmlGetGlobalState() is called to retrieve the global state for a thread.

Returns:the thread global state or NULL in case of error





xmlMutexLock ()

void	xmlMutexLock			(xmlMutexPtr tok)

xmlMutexLock() is used to lock a libxml2 token.

tok:the simple mutex

xmlMutexUnlock ()

void	xmlMutexUnlock			(xmlMutexPtr tok)

xmlMutexUnlock() is used to unlock a libxml2 token.

tok:the simple mutex

xmlNewMutex ()

xmlMutexPtr	xmlNewMutex		(void)

xmlNewMutex() is used to allocate a libxml2 token struct for use in synchronizing access to data.

Returns:a new simple mutex pointer or NULL in case of error

xmlNewRMutex ()

xmlRMutexPtr	xmlNewRMutex		(void)

xmlRNewMutex() is used to allocate a reentrant mutex for use in synchronizing access to data. token_r is a re-entrant lock and thus useful for synchronizing access to data structures that may be manipulated in a recursive fashion.

Returns:the new reentrant mutex pointer or NULL in case of error

xmlRMutexLock ()

void	xmlRMutexLock			(xmlRMutexPtr tok)

xmlRMutexLock() is used to lock a libxml2 token_r.

tok:the reentrant mutex

xmlRMutexUnlock ()

void	xmlRMutexUnlock			(xmlRMutexPtr tok)

xmlRMutexUnlock() is used to unlock a libxml2 token_r.

tok:the reentrant mutex


libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-chvalid.html0000644000175000017500000004657312134171043020632 0ustar aronaron chvalid: Unicode character range checking

chvalid

chvalid - Unicode character range checking

this module exports interfaces for the character range validation APIs This file is automatically generated from the cvs source definition files using the genChRanges.py Python script

Author(s): William Brack <wbrack@mmm.com.hk>

Synopsis

#define xmlIsExtender_ch(c);
#define xmlIsPubidCharQ(c);
#define xmlIsPubidChar_ch(c);
#define xmlIsIdeographicQ(c);
#define xmlIsExtenderQ(c);
#define xmlIsChar_ch(c);
#define xmlIsDigitQ(c);
#define xmlIsDigit_ch(c);
#define xmlIsBaseChar_ch(c);
#define xmlIsCombiningQ(c);
#define xmlIsBlankQ(c);
#define xmlIsCharQ(c);
#define xmlIsBaseCharQ(c);
#define xmlIsBlank_ch(c);
typedef struct _xmlChLRange xmlChLRange;
typedef xmlChSRange * xmlChSRangePtr;
typedef xmlChLRange * xmlChLRangePtr;
typedef xmlChRangeGroup * xmlChRangeGroupPtr;
typedef struct _xmlChSRange xmlChSRange;
typedef struct _xmlChRangeGroup xmlChRangeGroup;
int	xmlIsChar			(unsigned int ch);
int	xmlIsDigit			(unsigned int ch);
int	xmlIsBlank			(unsigned int ch);
int	xmlIsIdeographic		(unsigned int ch);
int	xmlCharInRange			(unsigned int val, 
const xmlChRangeGroup * rptr); int xmlIsPubidChar (unsigned int ch); int xmlIsCombining (unsigned int ch); int xmlIsBaseChar (unsigned int ch); int xmlIsExtender (unsigned int ch);

Description

Details

Macro xmlIsBaseCharQ

#define xmlIsBaseCharQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsBaseChar_ch

#define xmlIsBaseChar_ch(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsBlankQ

#define xmlIsBlankQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsBlank_ch

#define xmlIsBlank_ch(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsCharQ

#define xmlIsCharQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsChar_ch

#define xmlIsChar_ch(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsCombiningQ

#define xmlIsCombiningQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsDigitQ

#define xmlIsDigitQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsDigit_ch

#define xmlIsDigit_ch(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsExtenderQ

#define xmlIsExtenderQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsExtender_ch

#define xmlIsExtender_ch(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsIdeographicQ

#define xmlIsIdeographicQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsPubidCharQ

#define xmlIsPubidCharQ(c);

Automatically generated by genChRanges.py

c:char to validate

Macro xmlIsPubidChar_ch

#define xmlIsPubidChar_ch(c);

Automatically generated by genChRanges.py

c:char to validate

Structure xmlChLRange

struct _xmlChLRange {
    unsigned int	low
    unsigned int	high
} xmlChLRange;


Typedef xmlChLRangePtr

xmlChLRange * xmlChLRangePtr;


Structure xmlChRangeGroup

struct _xmlChRangeGroup {
    int	nbShortRange
    int	nbLongRange
    const xmlChSRange *	shortRange	: points to an array of ranges
    const xmlChLRange *	longRange
} xmlChRangeGroup;


Typedef xmlChRangeGroupPtr

xmlChRangeGroup * xmlChRangeGroupPtr;


Structure xmlChSRange

struct _xmlChSRange {
    unsigned short	low
    unsigned short	high
} xmlChSRange;


Typedef xmlChSRangePtr

xmlChSRange * xmlChSRangePtr;


Variable xmlIsBaseCharGroup

const xmlChRangeGroup xmlIsBaseCharGroup;


Variable xmlIsCharGroup

const xmlChRangeGroup xmlIsCharGroup;


Variable xmlIsCombiningGroup

const xmlChRangeGroup xmlIsCombiningGroup;


Variable xmlIsDigitGroup

const xmlChRangeGroup xmlIsDigitGroup;


Variable xmlIsExtenderGroup

const xmlChRangeGroup xmlIsExtenderGroup;


Variable xmlIsIdeographicGroup

const xmlChRangeGroup xmlIsIdeographicGroup;


Variable xmlIsPubidChar_tab

const unsigned charxmlIsPubidChar_tab[256] xmlIsPubidChar_tab;


xmlCharInRange ()

int	xmlCharInRange			(unsigned int val, 
const
xmlChRangeGroup * rptr)

Does a binary search of the range table to determine if char is valid

val:character to be validated
rptr:pointer to range to be used to validate
Returns:true if character valid, false otherwise

xmlIsBaseChar ()

int	xmlIsBaseChar			(unsigned int ch)

This function is DEPRECATED. Use xmlIsBaseChar_ch or xmlIsBaseCharQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

xmlIsBlank ()

int	xmlIsBlank			(unsigned int ch)

This function is DEPRECATED. Use xmlIsBlank_ch or xmlIsBlankQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

xmlIsChar ()

int	xmlIsChar			(unsigned int ch)

This function is DEPRECATED. Use xmlIsChar_ch or xmlIsCharQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

xmlIsCombining ()

int	xmlIsCombining			(unsigned int ch)

This function is DEPRECATED. Use xmlIsCombiningQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

xmlIsDigit ()

int	xmlIsDigit			(unsigned int ch)

This function is DEPRECATED. Use xmlIsDigit_ch or xmlIsDigitQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

xmlIsExtender ()

int	xmlIsExtender			(unsigned int ch)

This function is DEPRECATED. Use xmlIsExtender_ch or xmlIsExtenderQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

xmlIsIdeographic ()

int	xmlIsIdeographic		(unsigned int ch)

This function is DEPRECATED. Use xmlIsIdeographicQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

xmlIsPubidChar ()

int	xmlIsPubidChar			(unsigned int ch)

This function is DEPRECATED. Use xmlIsPubidChar_ch or xmlIsPubidCharQ instead

ch:character to validate
Returns:true if argument valid, false otherwise

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xpointer.html0000644000175000017500000006155512134171044021066 0ustar aronaron xpointer: API to handle XML Pointers

xpointer

xpointer - API to handle XML Pointers

API to handle XML Pointers Base implementation was made accordingly to W3C Candidate Recommendation 7 June 2000

Author(s): Daniel Veillard

Synopsis

typedef struct _xmlLocationSet xmlLocationSet;
typedef xmlLocationSet * xmlLocationSetPtr;
xmlXPathObjectPtr	xmlXPtrNewRange	(xmlNodePtr start, 
int startindex,
xmlNodePtr end,
int endindex); void xmlXPtrFreeLocationSet (xmlLocationSetPtr obj); xmlXPathObjectPtr xmlXPtrWrapLocationSet (xmlLocationSetPtr val); xmlNodePtr xmlXPtrBuildNodeList (xmlXPathObjectPtr obj); xmlXPathObjectPtr xmlXPtrEval (const xmlChar * str,
xmlXPathContextPtr ctx); xmlXPathObjectPtr xmlXPtrNewRangeNodes (xmlNodePtr start,
xmlNodePtr end); void xmlXPtrLocationSetAdd (xmlLocationSetPtr cur,
xmlXPathObjectPtr val); void xmlXPtrRangeToFunction (xmlXPathParserContextPtr ctxt,
int nargs); xmlXPathObjectPtr xmlXPtrNewCollapsedRange (xmlNodePtr start); xmlXPathObjectPtr xmlXPtrNewRangePoints (xmlXPathObjectPtr start,
xmlXPathObjectPtr end); xmlXPathObjectPtr xmlXPtrNewLocationSetNodeSet (xmlNodeSetPtr set); xmlXPathObjectPtr xmlXPtrNewRangePointNode (xmlXPathObjectPtr start,
xmlNodePtr end); xmlLocationSetPtr xmlXPtrLocationSetCreate (xmlXPathObjectPtr val); xmlXPathObjectPtr xmlXPtrNewRangeNodeObject (xmlNodePtr start,
xmlXPathObjectPtr end); xmlXPathContextPtr xmlXPtrNewContext (xmlDocPtr doc,
xmlNodePtr here,
xmlNodePtr origin); void xmlXPtrLocationSetRemove (xmlLocationSetPtr cur,
int val); xmlXPathObjectPtr xmlXPtrNewRangeNodePoint (xmlNodePtr start,
xmlXPathObjectPtr end); void xmlXPtrLocationSetDel (xmlLocationSetPtr cur,
xmlXPathObjectPtr val); xmlLocationSetPtr xmlXPtrLocationSetMerge (xmlLocationSetPtr val1,
xmlLocationSetPtr val2); void xmlXPtrEvalRangePredicate (xmlXPathParserContextPtr ctxt); xmlXPathObjectPtr xmlXPtrNewLocationSetNodes (xmlNodePtr start,
xmlNodePtr end);

Description

Details

Structure xmlLocationSet

struct _xmlLocationSet {
    int	locNr	: number of locations in the set
    int	locMax	: size of the array as allocated
    xmlXPathObjectPtr *	locTab	: array of locations
} xmlLocationSet;


Typedef xmlLocationSetPtr

xmlLocationSet * xmlLocationSetPtr;


xmlXPtrBuildNodeList ()

xmlNodePtr	xmlXPtrBuildNodeList	(xmlXPathObjectPtr obj)

Build a node list tree copy of the XPointer result. This will drop Attributes and Namespace declarations.

obj:the XPointer result from the evaluation.
Returns:an xmlNodePtr list or NULL. the caller has to free the node tree.

xmlXPtrEval ()

xmlXPathObjectPtr	xmlXPtrEval	(const xmlChar * str, 
xmlXPathContextPtr ctx)

Evaluate the XPath Location Path in the given context.

str:the XPointer expression
ctx:the XPointer context
Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

xmlXPtrEvalRangePredicate ()

void	xmlXPtrEvalRangePredicate	(xmlXPathParserContextPtr ctxt)

[8] Predicate ::= '[' PredicateExpr ']' [9] PredicateExpr ::= Expr Evaluate a predicate as in xmlXPathEvalPredicate() but for a Location Set instead of a node set

ctxt:the XPointer Parser context

xmlXPtrFreeLocationSet ()

void	xmlXPtrFreeLocationSet		(xmlLocationSetPtr obj)

Free the LocationSet compound (not the actual ranges !).

obj:the xmlLocationSetPtr to free

xmlXPtrLocationSetAdd ()

void	xmlXPtrLocationSetAdd		(xmlLocationSetPtr cur, 
xmlXPathObjectPtr val)

add a new xmlXPathObjectPtr to an existing LocationSet If the location already exist in the set @val is freed.

cur:the initial range set
val:a new xmlXPathObjectPtr

xmlXPtrLocationSetCreate ()

xmlLocationSetPtr	xmlXPtrLocationSetCreate	(xmlXPathObjectPtr val)

Create a new xmlLocationSetPtr of type double and of value @val

val:an initial xmlXPathObjectPtr, or NULL
Returns:the newly created object.

xmlXPtrLocationSetDel ()

void	xmlXPtrLocationSetDel		(xmlLocationSetPtr cur, 
xmlXPathObjectPtr val)

Removes an xmlXPathObjectPtr from an existing LocationSet

cur:the initial range set
val:an xmlXPathObjectPtr

xmlXPtrLocationSetMerge ()

xmlLocationSetPtr	xmlXPtrLocationSetMerge	(xmlLocationSetPtr val1, 
xmlLocationSetPtr val2)

Merges two rangesets, all ranges from @val2 are added to @val1

val1:the first LocationSet
val2:the second LocationSet
Returns:val1 once extended or NULL in case of error.

xmlXPtrLocationSetRemove ()

void	xmlXPtrLocationSetRemove	(xmlLocationSetPtr cur, 
int val)

Removes an entry from an existing LocationSet list.

cur:the initial range set
val:the index to remove

xmlXPtrNewCollapsedRange ()

xmlXPathObjectPtr	xmlXPtrNewCollapsedRange	(xmlNodePtr start)

Create a new xmlXPathObjectPtr of type range using a single nodes

start:the starting and ending node
Returns:the newly created object.

xmlXPtrNewContext ()

xmlXPathContextPtr	xmlXPtrNewContext	(xmlDocPtr doc, 
xmlNodePtr here,
xmlNodePtr origin)

Create a new XPointer context

doc:the XML document
here:the node that directly contains the XPointer being evaluated or NULL
origin:the element from which a user or program initiated traversal of the link, or NULL.
Returns:the xmlXPathContext just allocated.

xmlXPtrNewLocationSetNodeSet ()

xmlXPathObjectPtr	xmlXPtrNewLocationSetNodeSet	(xmlNodeSetPtr set)

Create a new xmlXPathObjectPtr of type LocationSet and initialize it with all the nodes from @set

set:a node set
Returns:the newly created object.

xmlXPtrNewLocationSetNodes ()

xmlXPathObjectPtr	xmlXPtrNewLocationSetNodes	(xmlNodePtr start, 
xmlNodePtr end)

Create a new xmlXPathObjectPtr of type LocationSet and initialize it with the single range made of the two nodes @start and @end

start:the start NodePtr value
end:the end NodePtr value or NULL
Returns:the newly created object.

xmlXPtrNewRange ()

xmlXPathObjectPtr	xmlXPtrNewRange	(xmlNodePtr start, 
int startindex,
xmlNodePtr end,
int endindex)

Create a new xmlXPathObjectPtr of type range

start:the starting node
startindex:the start index
end:the ending point
endindex:the ending index
Returns:the newly created object.

xmlXPtrNewRangeNodeObject ()

xmlXPathObjectPtr	xmlXPtrNewRangeNodeObject	(xmlNodePtr start, 
xmlXPathObjectPtr end)

Create a new xmlXPathObjectPtr of type range from a not to an object

start:the starting node
end:the ending object
Returns:the newly created object.

xmlXPtrNewRangeNodePoint ()

xmlXPathObjectPtr	xmlXPtrNewRangeNodePoint	(xmlNodePtr start, 
xmlXPathObjectPtr end)

Create a new xmlXPathObjectPtr of type range from a node to a point

start:the starting node
end:the ending point
Returns:the newly created object.

xmlXPtrNewRangeNodes ()

xmlXPathObjectPtr	xmlXPtrNewRangeNodes	(xmlNodePtr start, 
xmlNodePtr end)

Create a new xmlXPathObjectPtr of type range using 2 nodes

start:the starting node
end:the ending node
Returns:the newly created object.

xmlXPtrNewRangePointNode ()

xmlXPathObjectPtr	xmlXPtrNewRangePointNode	(xmlXPathObjectPtr start, 
xmlNodePtr end)

Create a new xmlXPathObjectPtr of type range from a point to a node

start:the starting point
end:the ending node
Returns:the newly created object.

xmlXPtrNewRangePoints ()

xmlXPathObjectPtr	xmlXPtrNewRangePoints	(xmlXPathObjectPtr start, 
xmlXPathObjectPtr end)

Create a new xmlXPathObjectPtr of type range using 2 Points

start:the starting point
end:the ending point
Returns:the newly created object.

xmlXPtrRangeToFunction ()

void	xmlXPtrRangeToFunction		(xmlXPathParserContextPtr ctxt, 
int nargs)

Implement the range-to() XPointer function

ctxt:the XPointer Parser context
nargs:the number of args

xmlXPtrWrapLocationSet ()

xmlXPathObjectPtr	xmlXPtrWrapLocationSet	(xmlLocationSetPtr val)

Wrap the LocationSet @val in a new xmlXPathObjectPtr

val:the LocationSet value
Returns:the newly created object.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlregexp.html0000644000175000017500000012203512134171044021220 0ustar aronaron xmlregexp: regular expressions handling

xmlregexp

xmlregexp - regular expressions handling

basic API for libxml regular expressions handling used for XML Schemas and validation.

Author(s): Daniel Veillard

Synopsis

typedef xmlRegExecCtxt * xmlRegExecCtxtPtr;
typedef struct _xmlExpCtxt xmlExpCtxt;
typedef xmlExpNode * xmlExpNodePtr;
typedef xmlExpCtxt * xmlExpCtxtPtr;
typedef enum xmlExpNodeType;
typedef struct _xmlRegExecCtxt xmlRegExecCtxt;
typedef struct _xmlExpNode xmlExpNode;
typedef struct _xmlRegexp xmlRegexp;
typedef xmlRegexp * xmlRegexpPtr;
typedef void xmlRegExecCallbacks		(xmlRegExecCtxtPtr exec, 
const xmlChar * token,
void * transdata,
void * inputdata); xmlRegExecCtxtPtr xmlRegNewExecCtxt (xmlRegexpPtr comp,
xmlRegExecCallbacks callback,
void * data); xmlExpNodePtr xmlExpNewOr (xmlExpCtxtPtr ctxt,
xmlExpNodePtr left,
xmlExpNodePtr right); void xmlRegFreeRegexp (xmlRegexpPtr regexp); void xmlExpRef (xmlExpNodePtr exp); int xmlRegexpIsDeterminist (xmlRegexpPtr comp); int xmlRegExecErrInfo (xmlRegExecCtxtPtr exec,
const xmlChar ** string,
int * nbval,
int * nbneg,
xmlChar ** values,
int * terminal); void xmlRegFreeExecCtxt (xmlRegExecCtxtPtr exec); int xmlExpCtxtNbCons (xmlExpCtxtPtr ctxt); int xmlExpSubsume (xmlExpCtxtPtr ctxt,
xmlExpNodePtr exp,
xmlExpNodePtr sub); int xmlRegExecPushString2 (xmlRegExecCtxtPtr exec,
const xmlChar * value,
const xmlChar * value2,
void * data); int xmlRegExecNextValues (xmlRegExecCtxtPtr exec,
int * nbval,
int * nbneg,
xmlChar ** values,
int * terminal); xmlExpNodePtr xmlExpExpDerive (xmlExpCtxtPtr ctxt,
xmlExpNodePtr exp,
xmlExpNodePtr sub); int xmlExpIsNillable (xmlExpNodePtr exp); void xmlExpFreeCtxt (xmlExpCtxtPtr ctxt); void xmlExpDump (xmlBufferPtr buf,
xmlExpNodePtr expr); xmlExpNodePtr xmlExpNewSeq (xmlExpCtxtPtr ctxt,
xmlExpNodePtr left,
xmlExpNodePtr right); void xmlExpFree (xmlExpCtxtPtr ctxt,
xmlExpNodePtr exp); xmlExpNodePtr xmlExpNewRange (xmlExpCtxtPtr ctxt,
xmlExpNodePtr subset,
int min,
int max); xmlRegexpPtr xmlRegexpCompile (const xmlChar * regexp); xmlExpNodePtr xmlExpNewAtom (xmlExpCtxtPtr ctxt,
const xmlChar * name,
int len); int xmlRegexpExec (xmlRegexpPtr comp,
const xmlChar * content); int xmlRegExecPushString (xmlRegExecCtxtPtr exec,
const xmlChar * value,
void * data); int xmlExpGetStart (xmlExpCtxtPtr ctxt,
xmlExpNodePtr exp,
const xmlChar ** tokList,
int len); xmlExpNodePtr xmlExpParse (xmlExpCtxtPtr ctxt,
const char * expr); xmlExpCtxtPtr xmlExpNewCtxt (int maxNodes,
xmlDictPtr dict); int xmlExpGetLanguage (xmlExpCtxtPtr ctxt,
xmlExpNodePtr exp,
const xmlChar ** langList,
int len); xmlExpNodePtr xmlExpStringDerive (xmlExpCtxtPtr ctxt,
xmlExpNodePtr exp,
const xmlChar * str,
int len); int xmlExpCtxtNbNodes (xmlExpCtxtPtr ctxt); int xmlExpMaxToken (xmlExpNodePtr expr); void xmlRegexpPrint (FILE * output,
xmlRegexpPtr regexp);

Description

Details

Structure xmlExpCtxt

struct _xmlExpCtxt {
The content of this structure is not made public by the API.
} xmlExpCtxt;


Typedef xmlExpCtxtPtr

xmlExpCtxt * xmlExpCtxtPtr;


Structure xmlExpNode

struct _xmlExpNode {
The content of this structure is not made public by the API.
} xmlExpNode;


Typedef xmlExpNodePtr

xmlExpNode * xmlExpNodePtr;



Structure xmlRegExecCtxt

struct _xmlRegExecCtxt {
The content of this structure is not made public by the API.
} xmlRegExecCtxt;


Typedef xmlRegExecCtxtPtr

xmlRegExecCtxt * xmlRegExecCtxtPtr;

A libxml progressive regular expression evaluation context


Structure xmlRegexp

struct _xmlRegexp {
The content of this structure is not made public by the API.
} xmlRegexp;


Typedef xmlRegexpPtr

xmlRegexp * xmlRegexpPtr;

A libxml regular expression, they can actually be far more complex thank the POSIX regex expressions.


Function type xmlRegExecCallbacks

void	xmlRegExecCallbacks		(xmlRegExecCtxtPtr exec, 
const xmlChar * token,
void * transdata,
void * inputdata)

Callback function when doing a transition in the automata

exec:the regular expression context
token:the current token string
transdata:transition data
inputdata:input data

Variable emptyExp

xmlExpNodePtr emptyExp;


Variable forbiddenExp

xmlExpNodePtr forbiddenExp;


xmlExpCtxtNbCons ()

int	xmlExpCtxtNbCons		(xmlExpCtxtPtr ctxt)

Debugging facility provides the number of allocated nodes over lifetime

ctxt:an expression context
Returns:the number of nodes ever allocated or -1 in case of error

xmlExpCtxtNbNodes ()

int	xmlExpCtxtNbNodes		(xmlExpCtxtPtr ctxt)

Debugging facility provides the number of allocated nodes at a that point

ctxt:an expression context
Returns:the number of nodes in use or -1 in case of error

xmlExpDump ()

void	xmlExpDump			(xmlBufferPtr buf, 
xmlExpNodePtr expr)

Serialize the expression as compiled to the buffer

buf:a buffer to receive the output
expr:the compiled expression

xmlExpExpDerive ()

xmlExpNodePtr	xmlExpExpDerive		(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr exp,
xmlExpNodePtr sub)

Evaluates the expression resulting from @exp consuming a sub expression @sub Based on algebraic derivation and sometimes direct Brzozowski derivation it usually tatkes less than linear time and can handle expressions generating infinite languages.

ctxt:the expressions context
exp:the englobing expression
sub:the subexpression
Returns:the resulting expression or NULL in case of internal error, the result must be freed

xmlExpFree ()

void	xmlExpFree			(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr exp)

Dereference the expression

ctxt:the expression context
exp:the expression

xmlExpFreeCtxt ()

void	xmlExpFreeCtxt			(xmlExpCtxtPtr ctxt)

Free an expression context

ctxt:an expression context

xmlExpGetLanguage ()

int	xmlExpGetLanguage		(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr exp,
const xmlChar ** langList,
int len)

Find all the strings used in @exp and store them in @list

ctxt:the expression context
exp:the expression
langList:where to store the tokens
len:the allocated length of @list
Returns:the number of unique strings found, -1 in case of errors and -2 if there is more than @len strings

xmlExpGetStart ()

int	xmlExpGetStart			(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr exp,
const xmlChar ** tokList,
int len)

Find all the strings that appears at the start of the languages accepted by @exp and store them in @list. E.g. for (a, b) | c it will return the list [a, c]

ctxt:the expression context
exp:the expression
tokList:where to store the tokens
len:the allocated length of @list
Returns:the number of unique strings found, -1 in case of errors and -2 if there is more than @len strings

xmlExpIsNillable ()

int	xmlExpIsNillable		(xmlExpNodePtr exp)

Finds if the expression is nillable, i.e. if it accepts the empty sequqnce

exp:the expression
Returns:1 if nillable, 0 if not and -1 in case of error

xmlExpMaxToken ()

int	xmlExpMaxToken			(xmlExpNodePtr expr)

Indicate the maximum number of input a expression can accept

expr:a compiled expression
Returns:the maximum length or -1 in case of error

xmlExpNewAtom ()

xmlExpNodePtr	xmlExpNewAtom		(xmlExpCtxtPtr ctxt, 
const xmlChar * name,
int len)

Get the atom associated to this name from that context

ctxt:the expression context
name:the atom name
len:the atom name length in byte (or -1);
Returns:the node or NULL in case of error

xmlExpNewCtxt ()

xmlExpCtxtPtr	xmlExpNewCtxt		(int maxNodes, 
xmlDictPtr dict)

Creates a new context for manipulating expressions

maxNodes:the maximum number of nodes
dict:optional dictionnary to use internally
Returns:the context or NULL in case of error

xmlExpNewOr ()

xmlExpNodePtr	xmlExpNewOr		(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr left,
xmlExpNodePtr right)

Get the atom associated to the choice @left | @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL).

ctxt:the expression context
left:left expression
right:right expression
Returns:the node or NULL in case of error

xmlExpNewRange ()

xmlExpNodePtr	xmlExpNewRange		(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr subset,
int min,
int max)

Get the atom associated to the range (@subset){@min, @max} Note that @subset is consumed in the operation, to keep an handle on it use xmlExpRef() and use xmlExpFree() to release it, this is true even in case of failure (unless ctxt == NULL).

ctxt:the expression context
subset:the expression to be repeated
min:the lower bound for the repetition
max:the upper bound for the repetition, -1 means infinite
Returns:the node or NULL in case of error

xmlExpNewSeq ()

xmlExpNodePtr	xmlExpNewSeq		(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr left,
xmlExpNodePtr right)

Get the atom associated to the sequence @left , @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL).

ctxt:the expression context
left:left expression
right:right expression
Returns:the node or NULL in case of error

xmlExpParse ()

xmlExpNodePtr	xmlExpParse		(xmlExpCtxtPtr ctxt, 
const char * expr)

Minimal parser for regexps, it understand the following constructs - string terminals - choice operator | - sequence operator , - subexpressions (...) - usual cardinality operators + * and ? - finite sequences { min, max } - infinite sequences { min, * } There is minimal checkings made especially no checking on strings values

ctxt:the expressions context
expr:the 0 terminated string
Returns:a new expression or NULL in case of failure

xmlExpRef ()

void	xmlExpRef			(xmlExpNodePtr exp)

Increase the reference count of the expression

exp:the expression

xmlExpStringDerive ()

xmlExpNodePtr	xmlExpStringDerive	(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr exp,
const xmlChar * str,
int len)

Do one step of Brzozowski derivation of the expression @exp with respect to the input string

ctxt:the expression context
exp:the expression
str:the string
len:the string len in bytes if available
Returns:the resulting expression or NULL in case of internal error

xmlExpSubsume ()

int	xmlExpSubsume			(xmlExpCtxtPtr ctxt, 
xmlExpNodePtr exp,
xmlExpNodePtr sub)

Check whether @exp accepts all the languages accexpted by @sub the input being a subexpression.

ctxt:the expressions context
exp:the englobing expression
sub:the subexpression
Returns:1 if true 0 if false and -1 in case of failure.

xmlRegExecErrInfo ()

int	xmlRegExecErrInfo		(xmlRegExecCtxtPtr exec, 
const xmlChar ** string,
int * nbval,
int * nbneg,
xmlChar ** values,
int * terminal)

Extract error informations from the regexp execution, the parameter @string will be updated with the value pushed and not accepted, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values

exec:a regexp execution context generating an error
string:return value for the error string
nbval:pointer to the number of accepted values IN/OUT
nbneg:return number of negative transitions
values:pointer to the array of acceptable values
terminal:return value if this was a terminal state
Returns:will be freed with the @exec context and don't need to be deallocated. Returns: 0 in case of success or -1 in case of error.

xmlRegExecNextValues ()

int	xmlRegExecNextValues		(xmlRegExecCtxtPtr exec, 
int * nbval,
int * nbneg,
xmlChar ** values,
int * terminal)

Extract informations from the regexp execution, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values

exec:a regexp execution context
nbval:pointer to the number of accepted values IN/OUT
nbneg:return number of negative transitions
values:pointer to the array of acceptable values
terminal:return value if this was a terminal state
Returns:will be freed with the @exec context and don't need to be deallocated. Returns: 0 in case of success or -1 in case of error.

xmlRegExecPushString ()

int	xmlRegExecPushString		(xmlRegExecCtxtPtr exec, 
const xmlChar * value,
void * data)

Push one input token in the execution context

exec:a regexp execution context or NULL to indicate the end
value:a string token input
data:data associated to the token to reuse in callbacks
Returns:1 if the regexp reached a final state, 0 if non-final, and a negative value in case of error.

xmlRegExecPushString2 ()

int	xmlRegExecPushString2		(xmlRegExecCtxtPtr exec, 
const xmlChar * value,
const xmlChar * value2,
void * data)

Push one input token in the execution context

exec:a regexp execution context or NULL to indicate the end
value:the first string token input
value2:the second string token input
data:data associated to the token to reuse in callbacks
Returns:1 if the regexp reached a final state, 0 if non-final, and a negative value in case of error.

xmlRegFreeExecCtxt ()

void	xmlRegFreeExecCtxt		(xmlRegExecCtxtPtr exec)

Free the structures associated to a regular expression evaulation context.

exec:a regular expression evaulation context

xmlRegFreeRegexp ()

void	xmlRegFreeRegexp		(xmlRegexpPtr regexp)

Free a regexp

regexp:the regexp

xmlRegNewExecCtxt ()

xmlRegExecCtxtPtr	xmlRegNewExecCtxt	(xmlRegexpPtr comp, 
xmlRegExecCallbacks callback,
void * data)

Build a context used for progressive evaluation of a regexp.

comp:a precompiled regular expression
callback:a callback function used for handling progresses in the automata matching phase
data:the context data associated to the callback in this context
Returns:the new context

xmlRegexpCompile ()

xmlRegexpPtr	xmlRegexpCompile	(const xmlChar * regexp)

Parses a regular expression conforming to XML Schemas Part 2 Datatype Appendix F and builds an automata suitable for testing strings against that regular expression

regexp:a regular expression string
Returns:the compiled expression or NULL in case of error

xmlRegexpExec ()

int	xmlRegexpExec			(xmlRegexpPtr comp, 
const xmlChar * content)

Check if the regular expression generates the value

comp:the compiled regular expression
content:the value to check against the regular expression
Returns:1 if it matches, 0 if not and a negative value in case of error

xmlRegexpIsDeterminist ()

int	xmlRegexpIsDeterminist		(xmlRegexpPtr comp)

Check if the regular expression is determinist

comp:the compiled regular expression
Returns:1 if it yes, 0 if not and a negative value in case of error

xmlRegexpPrint ()

void	xmlRegexpPrint			(FILE * output, 
xmlRegexpPtr regexp)

Print the content of the compiled regular expression

output:the file for the output debug
regexp:the compiled regexp

libxml2-2.9.1+dfsg1/doc/devhelp/home.png0000644000175000017500000000121611234335462016411 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1õÚKvIDATxœÕ•±kqÅ?ßrC‡ßàpà ~C„np¼¡CAAJ .B-\'G‡]:Ü “‚ƒCÇ -(ˆ8´à Ô€!…fD°€…çÒ“klbRÛÁoyüxïûîËïwpðIJº<°of_®-@ÒððçRH•´ÏfÖŸtèÂü¤^¯×ÓÚÚš’$Q«ÕÒ|“ôpâ’¶€gív;X^^&Ïs¢(bww—Z­F£ÑÀ9Çææ&Þû3à¶™ Æ’^IRµZUE.0Z]]Uš¦ ÃPY–Mü8óHÒGIÚÙÙÑìììæeŸkqqñÒ€™!ó  $ÛÛÛ¬¯¯3Œn eýþ{-/seeeìÔÃŒãXóóóåO‡Í·$ý8==UÇS™—é½×ÑÑQòRR€¤'ã–9-sÚÛÛ+B^ éC·Û•sîŸÍËÂ+%À°<7³ŸWô˜¿ õâ:™2IEND®B`‚libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlsave.html0000644000175000017500000003477212134171044020676 0ustar aronaron xmlsave: the XML document serializer

xmlsave

xmlsave - the XML document serializer

API to save document or subtree of document

Author(s): Daniel Veillard

Synopsis

typedef enum xmlSaveOption;
typedef struct _xmlSaveCtxt xmlSaveCtxt;
typedef xmlSaveCtxt * xmlSaveCtxtPtr;
xmlSaveCtxtPtr	xmlSaveToIO		(xmlOutputWriteCallback iowrite, 
xmlOutputCloseCallback ioclose,
void * ioctx,
const char * encoding,
int options); xmlSaveCtxtPtr xmlSaveToFd (int fd,
const char * encoding,
int options); int xmlSaveClose (xmlSaveCtxtPtr ctxt); int xmlSaveSetAttrEscape (xmlSaveCtxtPtr ctxt,
xmlCharEncodingOutputFunc escape); xmlSaveCtxtPtr xmlSaveToBuffer (xmlBufferPtr buffer,
const char * encoding,
int options); xmlSaveCtxtPtr xmlSaveToFilename (const char * filename,
const char * encoding,
int options); int xmlSaveFlush (xmlSaveCtxtPtr ctxt); long xmlSaveDoc (xmlSaveCtxtPtr ctxt,
xmlDocPtr doc); int xmlSaveSetEscape (xmlSaveCtxtPtr ctxt,
xmlCharEncodingOutputFunc escape); long xmlSaveTree (xmlSaveCtxtPtr ctxt,
xmlNodePtr node);

Description

Details

Structure xmlSaveCtxt

struct _xmlSaveCtxt {
The content of this structure is not made public by the API.
} xmlSaveCtxt;


Typedef xmlSaveCtxtPtr

xmlSaveCtxt * xmlSaveCtxtPtr;


Enum xmlSaveOption

enum xmlSaveOption {
    XML_SAVE_FORMAT = 1 /* format save output */
    XML_SAVE_NO_DECL = 2 /* drop the xml declaration */
    XML_SAVE_NO_EMPTY = 4 /* no empty tags */
    XML_SAVE_NO_XHTML = 8 /* disable XHTML1 specific rules */
    XML_SAVE_XHTML = 16 /* force XHTML1 specific rules */
    XML_SAVE_AS_XML = 32 /* force XML serialization on HTML doc */
    XML_SAVE_AS_HTML = 64 /* force HTML serialization on XML doc */
    XML_SAVE_WSNONSIG = 128 /*  format with non-significant whitespace */
};


xmlSaveClose ()

int	xmlSaveClose			(xmlSaveCtxtPtr ctxt)

Close a document saving context, i.e. make sure that all bytes have been output and free the associated data.

ctxt:a document saving context
Returns:the number of byte written or -1 in case of error.

xmlSaveDoc ()

long	xmlSaveDoc			(xmlSaveCtxtPtr ctxt, 
xmlDocPtr doc)

Save a full document to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead

ctxt:a document saving context
doc:a document
Returns:the number of byte written or -1 in case of error

xmlSaveFlush ()

int	xmlSaveFlush			(xmlSaveCtxtPtr ctxt)

Flush a document saving context, i.e. make sure that all bytes have been output.

ctxt:a document saving context
Returns:the number of byte written or -1 in case of error.

xmlSaveSetAttrEscape ()

int	xmlSaveSetAttrEscape		(xmlSaveCtxtPtr ctxt, 
xmlCharEncodingOutputFunc escape)

Set a custom escaping function to be used for text in attribute content

ctxt:a document saving context
escape:the escaping function
Returns:0 if successful or -1 in case of error.

xmlSaveSetEscape ()

int	xmlSaveSetEscape		(xmlSaveCtxtPtr ctxt, 
xmlCharEncodingOutputFunc escape)

Set a custom escaping function to be used for text in element content

ctxt:a document saving context
escape:the escaping function
Returns:0 if successful or -1 in case of error.

xmlSaveToBuffer ()

xmlSaveCtxtPtr	xmlSaveToBuffer		(xmlBufferPtr buffer, 
const char * encoding,
int options)

Create a document saving context serializing to a buffer with the encoding and the options given

buffer:a buffer
encoding:the encoding name to use or NULL
options:a set of xmlSaveOptions
Returns:a new serialization context or NULL in case of error.

xmlSaveToFd ()

xmlSaveCtxtPtr	xmlSaveToFd		(int fd, 
const char * encoding,
int options)

Create a document saving context serializing to a file descriptor with the encoding and the options given.

fd:a file descriptor number
encoding:the encoding name to use or NULL
options:a set of xmlSaveOptions
Returns:a new serialization context or NULL in case of error.

xmlSaveToFilename ()

xmlSaveCtxtPtr	xmlSaveToFilename	(const char * filename, 
const char * encoding,
int options)

Create a document saving context serializing to a filename or possibly to an URL (but this is less reliable) with the encoding and the options given.

filename:a file name or an URL
encoding:the encoding name to use or NULL
options:a set of xmlSaveOptions
Returns:a new serialization context or NULL in case of error.

xmlSaveToIO ()

xmlSaveCtxtPtr	xmlSaveToIO		(xmlOutputWriteCallback iowrite, 
xmlOutputCloseCallback ioclose,
void * ioctx,
const char * encoding,
int options)

Create a document saving context serializing to a file descriptor with the encoding and the options given

iowrite:an I/O write function
ioclose:an I/O close function
ioctx:an I/O handler
encoding:the encoding name to use or NULL
options:a set of xmlSaveOptions
Returns:a new serialization context or NULL in case of error.

xmlSaveTree ()

long	xmlSaveTree			(xmlSaveCtxtPtr ctxt, 
xmlNodePtr node)

Save a subtree starting at the node parameter to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead

ctxt:a document saving context
node:the top node of the subtree to save
Returns:the number of byte written or -1 in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-pattern.html0000644000175000017500000004564212134171044020672 0ustar aronaron pattern: pattern expression handling

pattern

pattern - pattern expression handling

allows to compile and test pattern expressions for nodes either in a tree or based on a parser state.

Author(s): Daniel Veillard

Synopsis

typedef xmlStreamCtxt * xmlStreamCtxtPtr;
typedef enum xmlPatternFlags;
typedef struct _xmlStreamCtxt xmlStreamCtxt;
typedef struct _xmlPattern xmlPattern;
typedef xmlPattern * xmlPatternPtr;
int	xmlPatternMinDepth		(xmlPatternPtr comp);
xmlStreamCtxtPtr	xmlPatternGetStreamCtxt	(xmlPatternPtr comp);
int	xmlPatternFromRoot		(xmlPatternPtr comp);
void	xmlFreePatternList		(xmlPatternPtr comp);
int	xmlPatternStreamable		(xmlPatternPtr comp);
int	xmlStreamPushAttr		(xmlStreamCtxtPtr stream, 
const xmlChar * name,
const xmlChar * ns); int xmlPatternMatch (xmlPatternPtr comp,
xmlNodePtr node); int xmlStreamWantsAnyNode (xmlStreamCtxtPtr streamCtxt); int xmlStreamPop (xmlStreamCtxtPtr stream); void xmlFreePattern (xmlPatternPtr comp); int xmlStreamPush (xmlStreamCtxtPtr stream,
const xmlChar * name,
const xmlChar * ns); int xmlPatternMaxDepth (xmlPatternPtr comp); xmlPatternPtr xmlPatterncompile (const xmlChar * pattern,
xmlDict * dict,
int flags,
const xmlChar ** namespaces); int xmlStreamPushNode (xmlStreamCtxtPtr stream,
const xmlChar * name,
const xmlChar * ns,
int nodeType); void xmlFreeStreamCtxt (xmlStreamCtxtPtr stream);

Description

Details

Structure xmlPattern

struct _xmlPattern {
The content of this structure is not made public by the API.
} xmlPattern;


Enum xmlPatternFlags

enum xmlPatternFlags {
    XML_PATTERN_DEFAULT = 0 /* simple pattern match */
    XML_PATTERN_XPATH = 1 /* standard XPath pattern */
    XML_PATTERN_XSSEL = 2 /* XPath subset for schema selector */
    XML_PATTERN_XSFIELD = 4 /*  XPath subset for schema field */
};


Typedef xmlPatternPtr

xmlPattern * xmlPatternPtr;


Structure xmlStreamCtxt

struct _xmlStreamCtxt {
The content of this structure is not made public by the API.
} xmlStreamCtxt;


Typedef xmlStreamCtxtPtr

xmlStreamCtxt * xmlStreamCtxtPtr;


xmlFreePattern ()

void	xmlFreePattern			(xmlPatternPtr comp)

Free up the memory allocated by @comp

comp:an XSLT comp

xmlFreePatternList ()

void	xmlFreePatternList		(xmlPatternPtr comp)

Free up the memory allocated by all the elements of @comp

comp:an XSLT comp list

xmlFreeStreamCtxt ()

void	xmlFreeStreamCtxt		(xmlStreamCtxtPtr stream)

Free the stream context

stream:the stream context

xmlPatternFromRoot ()

int	xmlPatternFromRoot		(xmlPatternPtr comp)

Check if the pattern must be looked at from the root.

comp:the precompiled pattern
Returns:1 if true, 0 if false and -1 in case of error

xmlPatternGetStreamCtxt ()

xmlStreamCtxtPtr	xmlPatternGetStreamCtxt	(xmlPatternPtr comp)

Get a streaming context for that pattern Use xmlFreeStreamCtxt to free the context.

comp:the precompiled pattern
Returns:a pointer to the context or NULL in case of failure

xmlPatternMatch ()

int	xmlPatternMatch			(xmlPatternPtr comp, 
xmlNodePtr node)

Test whether the node matches the pattern

comp:the precompiled pattern
node:a node
Returns:1 if it matches, 0 if it doesn't and -1 in case of failure

xmlPatternMaxDepth ()

int	xmlPatternMaxDepth		(xmlPatternPtr comp)

Check the maximum depth reachable by a pattern

comp:the precompiled pattern
Returns:-2 if no limit (using //), otherwise the depth, and -1 in case of error

xmlPatternMinDepth ()

int	xmlPatternMinDepth		(xmlPatternPtr comp)

Check the minimum depth reachable by a pattern, 0 mean the / or . are part of the set.

comp:the precompiled pattern
Returns:-1 in case of error otherwise the depth,

xmlPatternStreamable ()

int	xmlPatternStreamable		(xmlPatternPtr comp)

Check if the pattern is streamable i.e. xmlPatternGetStreamCtxt() should work.

comp:the precompiled pattern
Returns:1 if streamable, 0 if not and -1 in case of error.

xmlPatterncompile ()

xmlPatternPtr	xmlPatterncompile	(const xmlChar * pattern, 
xmlDict * dict,
int flags,
const xmlChar ** namespaces)

Compile a pattern.

pattern:the pattern to compile
dict:an optional dictionary for interned strings
flags:compilation flags, see xmlPatternFlags
namespaces:the prefix definitions, array of [URI, prefix] or NULL
Returns:the compiled form of the pattern or NULL in case of error

xmlStreamPop ()

int	xmlStreamPop			(xmlStreamCtxtPtr stream)

push one level from the stream.

stream:the stream context
Returns:-1 in case of error, 0 otherwise.

xmlStreamPush ()

int	xmlStreamPush			(xmlStreamCtxtPtr stream, 
const xmlChar * name,
const xmlChar * ns)

Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an element-node.

stream:the stream context
name:the current name
ns:the namespace name
Returns:-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.

xmlStreamPushAttr ()

int	xmlStreamPushAttr		(xmlStreamCtxtPtr stream, 
const xmlChar * name,
const xmlChar * ns)

Push new attribute data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an attribute-node.

stream:the stream context
name:the current name
ns:the namespace name
Returns:-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.

xmlStreamPushNode ()

int	xmlStreamPushNode		(xmlStreamCtxtPtr stream, 
const xmlChar * name,
const xmlChar * ns,
int nodeType)

Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Different from xmlStreamPush() this function can be fed with nodes of type: element-, attribute-, text-, cdata-section-, comment- and processing-instruction-node.

stream:the stream context
name:the current name
ns:the namespace name
nodeType:the type of the node being pushed
Returns:-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.

xmlStreamWantsAnyNode ()

int	xmlStreamWantsAnyNode		(xmlStreamCtxtPtr streamCtxt)

Query if the streaming pattern additionally needs to be fed with text-, cdata-section-, comment- and processing-instruction-nodes. If the result is 0 then only element-nodes and attribute-nodes need to be pushed.

streamCtxt:the stream context
Returns:1 in case of need of nodes of the above described types, 0 otherwise. -1 on API errors.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-catalog.html0000644000175000017500000010730512134171043020621 0ustar aronaron catalog: interfaces to the Catalog handling system

catalog

catalog - interfaces to the Catalog handling system

the catalog module implements the support for XML Catalogs and SGML catalogs

Author(s): Daniel Veillard

Synopsis

#define XML_CATALOG_PI;
#define XML_CATALOGS_NAMESPACE;
typedef enum xmlCatalogAllow;
typedef enum xmlCatalogPrefer;
typedef struct _xmlCatalog xmlCatalog;
typedef xmlCatalog * xmlCatalogPtr;
void	xmlFreeCatalog			(xmlCatalogPtr catal);
void	xmlLoadCatalogs			(const char * pathss);
xmlChar *	xmlCatalogLocalResolve	(void * catalogs, 
const xmlChar * pubID,
const xmlChar * sysID); int xmlACatalogAdd (xmlCatalogPtr catal,
const xmlChar * type,
const xmlChar * orig,
const xmlChar * replace); xmlChar * xmlACatalogResolvePublic (xmlCatalogPtr catal,
const xmlChar * pubID); xmlCatalogAllow xmlCatalogGetDefaults (void); int xmlACatalogRemove (xmlCatalogPtr catal,
const xmlChar * value); xmlCatalogPrefer xmlCatalogSetDefaultPrefer (xmlCatalogPrefer prefer); xmlChar * xmlACatalogResolveURI (xmlCatalogPtr catal,
const xmlChar * URI); int xmlCatalogAdd (const xmlChar * type,
const xmlChar * orig,
const xmlChar * replace); xmlChar * xmlCatalogResolvePublic (const xmlChar * pubID); const xmlChar * xmlCatalogGetSystem (const xmlChar * sysID); void xmlInitializeCatalog (void); int xmlLoadCatalog (const char * filename); int xmlCatalogRemove (const xmlChar * value); int xmlCatalogIsEmpty (xmlCatalogPtr catal); void xmlACatalogDump (xmlCatalogPtr catal,
FILE * out); void xmlCatalogFreeLocal (void * catalogs); xmlChar * xmlACatalogResolve (xmlCatalogPtr catal,
const xmlChar * pubID,
const xmlChar * sysID); xmlChar * xmlCatalogResolveSystem (const xmlChar * sysID); xmlCatalogPtr xmlLoadSGMLSuperCatalog (const char * filename); int xmlCatalogConvert (void); const xmlChar * xmlCatalogGetPublic (const xmlChar * pubID); xmlCatalogPtr xmlLoadACatalog (const char * filename); xmlChar * xmlACatalogResolveSystem (xmlCatalogPtr catal,
const xmlChar * sysID); xmlChar * xmlCatalogLocalResolveURI (void * catalogs,
const xmlChar * URI); int xmlConvertSGMLCatalog (xmlCatalogPtr catal); void * xmlCatalogAddLocal (void * catalogs,
const xmlChar * URL); xmlCatalogPtr xmlNewCatalog (int sgml); xmlDocPtr xmlParseCatalogFile (const char * filename); int xmlCatalogSetDebug (int level); xmlChar * xmlCatalogResolve (const xmlChar * pubID,
const xmlChar * sysID); void xmlCatalogSetDefaults (xmlCatalogAllow allow); void xmlCatalogDump (FILE * out); void xmlCatalogCleanup (void); xmlChar * xmlCatalogResolveURI (const xmlChar * URI);

Description

Details

Macro XML_CATALOGS_NAMESPACE

#define XML_CATALOGS_NAMESPACE;

The namespace for the XML Catalogs elements.


Macro XML_CATALOG_PI

#define XML_CATALOG_PI;

The specific XML Catalog Processing Instuction name.


Structure xmlCatalog

struct _xmlCatalog {
The content of this structure is not made public by the API.
} xmlCatalog;




Typedef xmlCatalogPtr

xmlCatalog * xmlCatalogPtr;


xmlACatalogAdd ()

int	xmlACatalogAdd			(xmlCatalogPtr catal, 
const xmlChar * type,
const xmlChar * orig,
const xmlChar * replace)

Add an entry in the catalog, it may overwrite existing but different entries.

catal:a Catalog
type:the type of record to add to the catalog
orig:the system, public or prefix to match
replace:the replacement value for the match
Returns:0 if successful, -1 otherwise

xmlACatalogDump ()

void	xmlACatalogDump			(xmlCatalogPtr catal, 
FILE * out)

Dump the given catalog to the given file.

catal:a Catalog
out:the file.

xmlACatalogRemove ()

int	xmlACatalogRemove		(xmlCatalogPtr catal, 
const xmlChar * value)

Remove an entry from the catalog

catal:a Catalog
value:the value to remove
Returns:the number of entries removed if successful, -1 otherwise

xmlACatalogResolve ()

xmlChar *	xmlACatalogResolve	(xmlCatalogPtr catal, 
const xmlChar * pubID,
const xmlChar * sysID)

Do a complete resolution lookup of an External Identifier

catal:a Catalog
pubID:the public ID string
sysID:the system ID string
Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

xmlACatalogResolvePublic ()

xmlChar *	xmlACatalogResolvePublic	(xmlCatalogPtr catal, 
const xmlChar * pubID)

Try to lookup the catalog local reference associated to a public ID in that catalog

catal:a Catalog
pubID:the public ID string
Returns:the local resource if found or NULL otherwise, the value returned must be freed by the caller.

xmlACatalogResolveSystem ()

xmlChar *	xmlACatalogResolveSystem	(xmlCatalogPtr catal, 
const xmlChar * sysID)

Try to lookup the catalog resource for a system ID

catal:a Catalog
sysID:the system ID string
Returns:the resource if found or NULL otherwise, the value returned must be freed by the caller.

xmlACatalogResolveURI ()

xmlChar *	xmlACatalogResolveURI	(xmlCatalogPtr catal, 
const xmlChar * URI)

Do a complete resolution lookup of an URI

catal:a Catalog
URI:the URI
Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

xmlCatalogAdd ()

int	xmlCatalogAdd			(const xmlChar * type, 
const xmlChar * orig,
const xmlChar * replace)

Add an entry in the catalog, it may overwrite existing but different entries. If called before any other catalog routine, allows to override the default shared catalog put in place by xmlInitializeCatalog();

type:the type of record to add to the catalog
orig:the system, public or prefix to match
replace:the replacement value for the match
Returns:0 if successful, -1 otherwise

xmlCatalogAddLocal ()

void *	xmlCatalogAddLocal		(void * catalogs, 
const
xmlChar * URL)

Add the new entry to the catalog list

catalogs:a document's list of catalogs
URL:the URL to a new local catalog
Returns:the updated list





xmlCatalogGetDefaults ()

xmlCatalogAllow	xmlCatalogGetDefaults	(void)

Used to get the user preference w.r.t. to what catalogs should be accepted

Returns:the current xmlCatalogAllow value

xmlCatalogGetPublic ()

const xmlChar *	xmlCatalogGetPublic	(const xmlChar * pubID)

Try to lookup the catalog reference associated to a public ID DEPRECATED, use xmlCatalogResolvePublic()

pubID:the public ID string
Returns:the resource if found or NULL otherwise.

xmlCatalogGetSystem ()

const xmlChar *	xmlCatalogGetSystem	(const xmlChar * sysID)

Try to lookup the catalog reference associated to a system ID DEPRECATED, use xmlCatalogResolveSystem()

sysID:the system ID string
Returns:the resource if found or NULL otherwise.

xmlCatalogIsEmpty ()

int	xmlCatalogIsEmpty		(xmlCatalogPtr catal)

Check is a catalog is empty

catal:should this create an SGML catalog
Returns:1 if the catalog is empty, 0 if not, amd -1 in case of error.

xmlCatalogLocalResolve ()

xmlChar *	xmlCatalogLocalResolve	(void * catalogs, 
const xmlChar * pubID,
const xmlChar * sysID)

Do a complete resolution lookup of an External Identifier using a document's private catalog list

catalogs:a document's list of catalogs
pubID:the public ID string
sysID:the system ID string
Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

xmlCatalogLocalResolveURI ()

xmlChar *	xmlCatalogLocalResolveURI	(void * catalogs, 
const xmlChar * URI)

Do a complete resolution lookup of an URI using a document's private catalog list

catalogs:a document's list of catalogs
URI:the URI
Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

xmlCatalogRemove ()

int	xmlCatalogRemove		(const xmlChar * value)

Remove an entry from the catalog

value:the value to remove
Returns:the number of entries removed if successful, -1 otherwise

xmlCatalogResolve ()

xmlChar *	xmlCatalogResolve	(const xmlChar * pubID, 
const xmlChar * sysID)

Do a complete resolution lookup of an External Identifier

pubID:the public ID string
sysID:the system ID string
Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

xmlCatalogResolvePublic ()

xmlChar *	xmlCatalogResolvePublic	(const xmlChar * pubID)

Try to lookup the catalog reference associated to a public ID

pubID:the public ID string
Returns:the resource if found or NULL otherwise, the value returned must be freed by the caller.

xmlCatalogResolveSystem ()

xmlChar *	xmlCatalogResolveSystem	(const xmlChar * sysID)

Try to lookup the catalog resource for a system ID

sysID:the system ID string
Returns:the resource if found or NULL otherwise, the value returned must be freed by the caller.

xmlCatalogResolveURI ()

xmlChar *	xmlCatalogResolveURI	(const xmlChar * URI)

Do a complete resolution lookup of an URI

URI:the URI
Returns:the URI of the resource or NULL if not found, it must be freed by the caller.


xmlCatalogSetDefaultPrefer ()

xmlCatalogPrefer	xmlCatalogSetDefaultPrefer	(xmlCatalogPrefer prefer)

Allows to set the preference between public and system for deletion in XML Catalog resolution. C.f. section 4.1.1 of the spec Values accepted are XML_CATA_PREFER_PUBLIC or XML_CATA_PREFER_SYSTEM

prefer:the default preference for delegation
Returns:the previous value of the default preference for delegation

xmlCatalogSetDefaults ()

void	xmlCatalogSetDefaults		(xmlCatalogAllow allow)

Used to set the user preference w.r.t. to what catalogs should be accepted

allow:what catalogs should be accepted

xmlConvertSGMLCatalog ()

int	xmlConvertSGMLCatalog		(xmlCatalogPtr catal)

Convert all the SGML catalog entries as XML ones

catal:the catalog
Returns:the number of entries converted if successful, -1 otherwise

xmlFreeCatalog ()

void	xmlFreeCatalog			(xmlCatalogPtr catal)

Free the memory allocated to a Catalog

catal:a Catalog


xmlLoadACatalog ()

xmlCatalogPtr	xmlLoadACatalog		(const char * filename)

Load the catalog and build the associated data structures. This can be either an XML Catalog or an SGML Catalog It will recurse in SGML CATALOG entries. On the other hand XML Catalogs are not handled recursively.

filename:a file path
Returns:the catalog parsed or NULL in case of error



xmlLoadSGMLSuperCatalog ()

xmlCatalogPtr	xmlLoadSGMLSuperCatalog	(const char * filename)

Load an SGML super catalog. It won't expand CATALOG or DELEGATE references. This is only needed for manipulating SGML Super Catalogs like adding and removing CATALOG or DELEGATE entries.

filename:a file path
Returns:the catalog parsed or NULL in case of error

xmlNewCatalog ()

xmlCatalogPtr	xmlNewCatalog		(int sgml)

create a new Catalog.

sgml:should this create an SGML catalog
Returns:the xmlCatalogPtr or NULL in case of error

xmlParseCatalogFile ()

xmlDocPtr	xmlParseCatalogFile	(const char * filename)

parse an XML file and build a tree. It's like xmlParseFile() except it bypass all catalog lookups.

filename:the filename
Returns:the resulting document tree or NULL in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-encoding.html0000644000175000017500000007151312134171043020776 0ustar aronaron encoding: interface for the encoding conversion functions

encoding

encoding - interface for the encoding conversion functions

interface for the encoding conversion functions needed for XML basic encoding and iconv() support. Related specs are rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies [ISO-10646] UTF-8 and UTF-16 in Annexes [ISO-8859-1] ISO Latin-1 characters codes. [UNICODE] The Unicode Consortium, "The Unicode Standard -- Worldwide Character Encoding -- Version 1.0", Addison- Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is described in Unicode Technical Report #4. [US-ASCII] Coded Character Set--7-bit American Standard Code for Information Interchange, ANSI X3.4-1986.

Author(s): Daniel Veillard

Synopsis

typedef struct _uconv_t uconv_t;
typedef enum xmlCharEncoding;
typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler;
typedef xmlCharEncodingHandler * xmlCharEncodingHandlerPtr;
int	xmlDelEncodingAlias		(const char * alias);
const char *	xmlGetEncodingAlias	(const char * alias);
void	xmlRegisterCharEncodingHandler	(xmlCharEncodingHandlerPtr handler);
int	UTF8Toisolat1			(unsigned char * out, 
int * outlen,
const unsigned char * in,
int * inlen); void xmlInitCharEncodingHandlers (void); int xmlAddEncodingAlias (const char * name,
const char * alias); void xmlCleanupEncodingAliases (void); int xmlCharEncOutFunc (xmlCharEncodingHandler * handler,
xmlBufferPtr out,
xmlBufferPtr in); xmlCharEncoding xmlParseCharEncoding (const char * name); typedef int xmlCharEncodingInputFunc (unsigned char * out,
int * outlen,
const unsigned char * in,
int * inlen); void xmlCleanupCharEncodingHandlers (void); xmlCharEncodingHandlerPtr xmlNewCharEncodingHandler (const char * name,
xmlCharEncodingInputFunc input,
xmlCharEncodingOutputFunc output); typedef int xmlCharEncodingOutputFunc (unsigned char * out,
int * outlen,
const unsigned char * in,
int * inlen); int isolat1ToUTF8 (unsigned char * out,
int * outlen,
const unsigned char * in,
int * inlen); xmlCharEncodingHandlerPtr xmlFindCharEncodingHandler (const char * name); int xmlCharEncInFunc (xmlCharEncodingHandler * handler,
xmlBufferPtr out,
xmlBufferPtr in); xmlCharEncodingHandlerPtr xmlGetCharEncodingHandler (xmlCharEncoding enc); int xmlCharEncFirstLine (xmlCharEncodingHandler * handler,
xmlBufferPtr out,
xmlBufferPtr in); xmlCharEncoding xmlDetectCharEncoding (const unsigned char * in,
int len); int xmlCharEncCloseFunc (xmlCharEncodingHandler * handler); const char * xmlGetCharEncodingName (xmlCharEncoding enc);

Description

Details

Structure uconv_t

struct _uconv_t {
    UConverter *	uconv	: for conversion between an encoding and UTF-16
    UConverter *	utf8	: for conversion between UTF-8 and UTF-16
} uconv_t;


Enum xmlCharEncoding

enum xmlCharEncoding {
    XML_CHAR_ENCODING_ERROR = -1 /* No char encoding detected */
    XML_CHAR_ENCODING_NONE = 0 /* No char encoding detected */
    XML_CHAR_ENCODING_UTF8 = 1 /* UTF-8 */
    XML_CHAR_ENCODING_UTF16LE = 2 /* UTF-16 little endian */
    XML_CHAR_ENCODING_UTF16BE = 3 /* UTF-16 big endian */
    XML_CHAR_ENCODING_UCS4LE = 4 /* UCS-4 little endian */
    XML_CHAR_ENCODING_UCS4BE = 5 /* UCS-4 big endian */
    XML_CHAR_ENCODING_EBCDIC = 6 /* EBCDIC uh! */
    XML_CHAR_ENCODING_UCS4_2143 = 7 /* UCS-4 unusual ordering */
    XML_CHAR_ENCODING_UCS4_3412 = 8 /* UCS-4 unusual ordering */
    XML_CHAR_ENCODING_UCS2 = 9 /* UCS-2 */
    XML_CHAR_ENCODING_8859_1 = 10 /* ISO-8859-1 ISO Latin 1 */
    XML_CHAR_ENCODING_8859_2 = 11 /* ISO-8859-2 ISO Latin 2 */
    XML_CHAR_ENCODING_8859_3 = 12 /* ISO-8859-3 */
    XML_CHAR_ENCODING_8859_4 = 13 /* ISO-8859-4 */
    XML_CHAR_ENCODING_8859_5 = 14 /* ISO-8859-5 */
    XML_CHAR_ENCODING_8859_6 = 15 /* ISO-8859-6 */
    XML_CHAR_ENCODING_8859_7 = 16 /* ISO-8859-7 */
    XML_CHAR_ENCODING_8859_8 = 17 /* ISO-8859-8 */
    XML_CHAR_ENCODING_8859_9 = 18 /* ISO-8859-9 */
    XML_CHAR_ENCODING_2022_JP = 19 /* ISO-2022-JP */
    XML_CHAR_ENCODING_SHIFT_JIS = 20 /* Shift_JIS */
    XML_CHAR_ENCODING_EUC_JP = 21 /* EUC-JP */
    XML_CHAR_ENCODING_ASCII = 22 /*  pure ASCII */
};


Structure xmlCharEncodingHandler

struct _xmlCharEncodingHandler {
    char *	name
    xmlCharEncodingInputFunc	input
    xmlCharEncodingOutputFunc	output
    iconv_t	iconv_in
    iconv_t	iconv_out
    uconv_t *	uconv_in
    uconv_t *	uconv_out
} xmlCharEncodingHandler;


Typedef xmlCharEncodingHandlerPtr

xmlCharEncodingHandler * xmlCharEncodingHandlerPtr;







xmlCharEncCloseFunc ()

int	xmlCharEncCloseFunc		(xmlCharEncodingHandler * handler)

Generic front-end for encoding handler close function

handler:char enconding transformation data structure
Returns:0 if success, or -1 in case of error

xmlCharEncFirstLine ()

int	xmlCharEncFirstLine		(xmlCharEncodingHandler * handler, 
xmlBufferPtr out,
xmlBufferPtr in)

Front-end for the encoding handler input function, but handle only the very first line, i.e. limit itself to 45 chars.

handler:char enconding transformation data structure
out:an xmlBuffer for the output.
in:an xmlBuffer for the input
Returns:the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or

xmlCharEncInFunc ()

int	xmlCharEncInFunc		(xmlCharEncodingHandler * handler, 
xmlBufferPtr out,
xmlBufferPtr in)

Generic front-end for the encoding handler input function

handler:char encoding transformation data structure
out:an xmlBuffer for the output.
in:an xmlBuffer for the input
Returns:the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or

xmlCharEncOutFunc ()

int	xmlCharEncOutFunc		(xmlCharEncodingHandler * handler, 
xmlBufferPtr out,
xmlBufferPtr in)

Generic front-end for the encoding handler output function a first call with @in == NULL has to be made firs to initiate the output in case of non-stateless encoding needing to initiate their state or the output (like the BOM in UTF16). In case of UTF8 sequence conversion errors for the given encoder, the content will be automatically remapped to a CharRef sequence.

handler:char enconding transformation data structure
out:an xmlBuffer for the output.
in:an xmlBuffer for the input
Returns:the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or




xmlDetectCharEncoding ()

xmlCharEncoding	xmlDetectCharEncoding	(const unsigned char * in, 
int len)

Guess the encoding of the entity using the first bytes of the entity content according to the non-normative appendix F of the XML-1.0 recommendation.

in:a pointer to the first bytes of the XML entity, must be at least 2 bytes long (at least 4 if encoding is UTF4 variant).
len:pointer to the length of the buffer
Returns:one of the XML_CHAR_ENCODING_... values.

xmlFindCharEncodingHandler ()

xmlCharEncodingHandlerPtr	xmlFindCharEncodingHandler	(const char * name)

Search in the registered set the handler able to read/write that encoding.

name:a string describing the char encoding.
Returns:the handler or NULL if not found

xmlGetCharEncodingHandler ()

xmlCharEncodingHandlerPtr	xmlGetCharEncodingHandler	(xmlCharEncoding enc)

Search in the registered set the handler able to read/write that encoding.

enc:an xmlCharEncoding value.
Returns:the handler or NULL if not found

xmlGetCharEncodingName ()

const char *	xmlGetCharEncodingName	(xmlCharEncoding enc)

The "canonical" name for XML encoding. C.f. http://www.w3.org/TR/REC-xml#charencoding Section 4.3.3 Character Encoding in Entities

enc:the encoding
Returns:the canonical name for the given encoding



xmlNewCharEncodingHandler ()

xmlCharEncodingHandlerPtr	xmlNewCharEncodingHandler	(const char * name, 
xmlCharEncodingInputFunc input,
xmlCharEncodingOutputFunc output)

Create and registers an xmlCharEncodingHandler.

name:the encoding name, in UTF-8 format (ASCII actually)
input:the xmlCharEncodingInputFunc to read that encoding
output:the xmlCharEncodingOutputFunc to write that encoding
Returns:the xmlCharEncodingHandlerPtr created (or NULL in case of error).

xmlParseCharEncoding ()

xmlCharEncoding	xmlParseCharEncoding	(const char * name)

Compare the string to the encoding schemes already known. Note that the comparison is case insensitive accordingly to the section [XML] 4.3.3 Character Encoding in Entities.

name:the encoding name as parsed, in UTF-8 format (ASCII actually)
Returns:one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE if not recognized.

xmlRegisterCharEncodingHandler ()

void	xmlRegisterCharEncodingHandler	(xmlCharEncodingHandlerPtr handler)

Register the char encoding handler, surprising, isn't it ?

handler:the xmlCharEncodingHandlerPtr handler block

libxml2-2.9.1+dfsg1/doc/devhelp/html.xsl0000644000175000017500000005310011234335462016446 0ustar aronaron ( void ,
);
typedef ( void ,
);
typedef ; #define ( , ) ;

Structure

     {

    
      The content of this structure is not made public by the API.

    
    
            
	
	  
	
		
	
	
	  	: 
	  
	    
	  
	
	

    
    } 
    
    ;

    




Enum

    enum 
    
     {

    
      
          
      
      
         = 
	
      
      
         /* 
	
         */
      
      

    
    };

    


Macro

    #define 
    
    
      (
      
        
	
	  , 
	
      
      )
    
    ;

    

:

()

    
      
    
    	
    
    
      	
    
    
      	
    
    	(
    
      void
    
    
      
        
      
       
      
      
        , 
)

:
Returns:

Function type

    
      
    
    	
    
    
      	
    
    
      	
    
    	(
    
      void
    
    
      
        
      
       
      
      
        , 
)

:
Returns:

<xsl:value-of select="concat(@name, ': ', summary)"/>

libxml2 API Modules

-

libxml2 Reference Manual

libxml2 Reference Manual

Libxml2 is the XML C parser and toolkit developed for the Gnome project (but usable outside of the Gnome platform), it is free software available under the MIT License. XML itself is a metalanguage to design markup languages, i.e. text language where semantic and structure are added to the content using extra "markup" information enclosed between angle brackets. HTML is the most well-known markup language. Though the library is written in C a variety of language bindings make it available in other environments.

Libxml2 implements a number of existing standards related to markup languages:

As a result the libxml2 API is very large. If you get lost searching for some specific API use the online search engine hosted on xmlsoft.org the libxml2 and libxslt project page.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlmemory.html0000644000175000017500000005671412134171044021250 0ustar aronaron xmlmemory: interface for the memory allocator

xmlmemory

xmlmemory - interface for the memory allocator

provides interfaces for the memory allocator, including debugging capabilities.

Author(s): Daniel Veillard

Synopsis

#define xmlRealloc;
#define xmlMalloc;
#define xmlMallocAtomic;
#define DEBUG_MEMORY;
#define xmlMemStrdup;
void *	xmlMemRealloc			(void * ptr, 
size_t size); int xmlInitMemory (void); void xmlMemFree (void * ptr); void * xmlMemMalloc (size_t size); void xmlMemDisplayLast (FILE * fp,
long nbBytes); int xmlMemGet (xmlFreeFunc * freeFunc,
xmlMallocFunc * mallocFunc,
xmlReallocFunc * reallocFunc,
xmlStrdupFunc * strdupFunc); void xmlMemoryDump (void); void * xmlMallocLoc (size_t size,
const char * file,
int line); void xmlMemDisplay (FILE * fp); int xmlMemBlocks (void); int xmlGcMemGet (xmlFreeFunc * freeFunc,
xmlMallocFunc * mallocFunc,
xmlMallocFunc * mallocAtomicFunc,
xmlReallocFunc * reallocFunc,
xmlStrdupFunc * strdupFunc); typedef char * xmlStrdupFunc (const char * str); typedef void xmlFreeFunc (void * mem); void xmlMemShow (FILE * fp,
int nr); void * xmlMallocAtomicLoc (size_t size,
const char * file,
int line); void * xmlReallocLoc (void * ptr,
size_t size,
const char * file,
int line); void xmlCleanupMemory (void); int xmlMemUsed (void); int xmlMemSetup (xmlFreeFunc freeFunc,
xmlMallocFunc mallocFunc,
xmlReallocFunc reallocFunc,
xmlStrdupFunc strdupFunc); typedef void * xmlReallocFunc (void * mem,
size_t size); typedef void * xmlMallocFunc (size_t size); int xmlGcMemSetup (xmlFreeFunc freeFunc,
xmlMallocFunc mallocFunc,
xmlMallocFunc mallocAtomicFunc,
xmlReallocFunc reallocFunc,
xmlStrdupFunc strdupFunc); char * xmlMemoryStrdup (const char * str); char * xmlMemStrdupLoc (const char * str,
const char * file,
int line);

Description

Details

Macro DEBUG_MEMORY

#define DEBUG_MEMORY;

DEBUG_MEMORY replaces the allocator with a collect and debug shell to the libc allocator. DEBUG_MEMORY should only be activated when debugging libxml i.e. if libxml has been configured with --with-debug-mem too. #define DEBUG_MEMORY_FREED #define DEBUG_MEMORY_LOCATION







xmlGcMemGet ()

int	xmlGcMemGet			(xmlFreeFunc * freeFunc, 
xmlMallocFunc * mallocFunc,
xmlMallocFunc * mallocAtomicFunc,
xmlReallocFunc * reallocFunc,
xmlStrdupFunc * strdupFunc)

Provides the memory access functions set currently in use The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators

freeFunc:place to save the free() function in use
mallocFunc:place to save the malloc() function in use
mallocAtomicFunc:place to save the atomic malloc() function in use
reallocFunc:place to save the realloc() function in use
strdupFunc:place to save the strdup() function in use
Returns:0 on success

xmlGcMemSetup ()

int	xmlGcMemSetup			(xmlFreeFunc freeFunc, 
xmlMallocFunc mallocFunc,
xmlMallocFunc mallocAtomicFunc,
xmlReallocFunc reallocFunc,
xmlStrdupFunc strdupFunc)

Override the default memory access functions with a new set This has to be called before any other libxml routines ! The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators Should this be blocked if there was already some allocations done ?

freeFunc:the free() function to use
mallocFunc:the malloc() function to use
mallocAtomicFunc:the malloc() function to use for atomic allocations
reallocFunc:the realloc() function to use
strdupFunc:the strdup() function to use
Returns:0 on success








xmlMemGet ()

int	xmlMemGet			(xmlFreeFunc * freeFunc, 
xmlMallocFunc * mallocFunc,
xmlReallocFunc * reallocFunc,
xmlStrdupFunc * strdupFunc)

Provides the memory access functions set currently in use

freeFunc:place to save the free() function in use
mallocFunc:place to save the malloc() function in use
reallocFunc:place to save the realloc() function in use
strdupFunc:place to save the strdup() function in use
Returns:0 on success



xmlMemSetup ()

int	xmlMemSetup			(xmlFreeFunc freeFunc, 
xmlMallocFunc mallocFunc,
xmlReallocFunc reallocFunc,
xmlStrdupFunc strdupFunc)

Override the default memory access functions with a new set This has to be called before any other libxml routines ! Should this be blocked if there was already some allocations done ?

freeFunc:the free() function to use
mallocFunc:the malloc() function to use
reallocFunc:the realloc() function to use
strdupFunc:the strdup() function to use
Returns:0 on success







libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-HTMLtree.html0000644000175000017500000005754012134171043020640 0ustar aronaron HTMLtree: specific APIs to process HTML tree, especially serialization

HTMLtree

HTMLtree - specific APIs to process HTML tree, especially serialization

this module implements a few function needed to process tree in an HTML specific way.

Author(s): Daniel Veillard

Synopsis

#define HTML_ENTITY_REF_NODE;
#define HTML_COMMENT_NODE;
#define HTML_PRESERVE_NODE;
#define HTML_TEXT_NODE;
#define HTML_PI_NODE;
int	htmlNodeDumpFileFormat		(FILE * out, 
xmlDocPtr doc,
xmlNodePtr cur,
const char * encoding,
int format); void htmlDocDumpMemory (xmlDocPtr cur,
xmlChar ** mem,
int * size); int htmlSaveFile (const char * filename,
xmlDocPtr cur); int htmlDocDump (FILE * f,
xmlDocPtr cur); void htmlDocDumpMemoryFormat (xmlDocPtr cur,
xmlChar ** mem,
int * size,
int format); int htmlIsBooleanAttr (const xmlChar * name); int htmlSaveFileFormat (const char * filename,
xmlDocPtr cur,
const char * encoding,
int format); void htmlNodeDumpFormatOutput (xmlOutputBufferPtr buf,
xmlDocPtr doc,
xmlNodePtr cur,
const char * encoding,
int format); int htmlSetMetaEncoding (htmlDocPtr doc,
const xmlChar * encoding); int htmlSaveFileEnc (const char * filename,
xmlDocPtr cur,
const char * encoding); void htmlNodeDumpOutput (xmlOutputBufferPtr buf,
xmlDocPtr doc,
xmlNodePtr cur,
const char * encoding); int htmlNodeDump (xmlBufferPtr buf,
xmlDocPtr doc,
xmlNodePtr cur); htmlDocPtr htmlNewDoc (const xmlChar * URI,
const xmlChar * ExternalID); const xmlChar * htmlGetMetaEncoding (htmlDocPtr doc); void htmlNodeDumpFile (FILE * out,
xmlDocPtr doc,
xmlNodePtr cur); void htmlDocContentDumpFormatOutput (xmlOutputBufferPtr buf,
xmlDocPtr cur,
const char * encoding,
int format); htmlDocPtr htmlNewDocNoDtD (const xmlChar * URI,
const xmlChar * ExternalID); void htmlDocContentDumpOutput (xmlOutputBufferPtr buf,
xmlDocPtr cur,
const char * encoding);

Description

Details

Macro HTML_COMMENT_NODE

#define HTML_COMMENT_NODE;

Macro. A comment in a HTML document is really implemented the same way as a comment in an XML document.


Macro HTML_ENTITY_REF_NODE

#define HTML_ENTITY_REF_NODE;

Macro. An entity reference in a HTML document is really implemented the same way as an entity reference in an XML document.


Macro HTML_PI_NODE

#define HTML_PI_NODE;

Macro. A processing instruction in a HTML document is really implemented the same way as a processing instruction in an XML document.


Macro HTML_PRESERVE_NODE

#define HTML_PRESERVE_NODE;

Macro. A preserved node in a HTML document is really implemented the same way as a CDATA section in an XML document.


Macro HTML_TEXT_NODE

#define HTML_TEXT_NODE;

Macro. A text node in a HTML document is really implemented the same way as a text node in an XML document.


htmlDocContentDumpFormatOutput ()

void	htmlDocContentDumpFormatOutput	(xmlOutputBufferPtr buf, 
xmlDocPtr cur,
const char * encoding,
int format)

Dump an HTML document.

buf:the HTML buffer output
cur:the document
encoding:the encoding string
format:should formatting spaces been added

htmlDocContentDumpOutput ()

void	htmlDocContentDumpOutput	(xmlOutputBufferPtr buf, 
xmlDocPtr cur,
const char * encoding)

Dump an HTML document. Formating return/spaces are added.

buf:the HTML buffer output
cur:the document
encoding:the encoding string

htmlDocDump ()

int	htmlDocDump			(FILE * f, 
xmlDocPtr cur)

Dump an HTML document to an open FILE.

f:the FILE*
cur:the document
Returns:the number of byte written or -1 in case of failure.

htmlDocDumpMemory ()

void	htmlDocDumpMemory		(xmlDocPtr cur, 
xmlChar ** mem,
int * size)

Dump an HTML document in memory and return the xmlChar * and it's size. It's up to the caller to free the memory.

cur:the document
mem:OUT: the memory pointer
size:OUT: the memory length

htmlDocDumpMemoryFormat ()

void	htmlDocDumpMemoryFormat		(xmlDocPtr cur, 
xmlChar ** mem,
int * size,
int format)

Dump an HTML document in memory and return the xmlChar * and it's size. It's up to the caller to free the memory.

cur:the document
mem:OUT: the memory pointer
size:OUT: the memory length
format:should formatting spaces been added

htmlGetMetaEncoding ()

const xmlChar *	htmlGetMetaEncoding	(htmlDocPtr doc)

Encoding definition lookup in the Meta tags

doc:the document
Returns:the current encoding as flagged in the HTML source

htmlIsBooleanAttr ()

int	htmlIsBooleanAttr		(const xmlChar * name)

Determine if a given attribute is a boolean attribute.

name:the name of the attribute to check
Returns:false if the attribute is not boolean, true otherwise.

htmlNewDoc ()

htmlDocPtr	htmlNewDoc		(const xmlChar * URI, 
const xmlChar * ExternalID)

Creates a new HTML document

URI:URI for the dtd, or NULL
ExternalID:the external ID of the DTD, or NULL
Returns:a new document

htmlNewDocNoDtD ()

htmlDocPtr	htmlNewDocNoDtD		(const xmlChar * URI, 
const xmlChar * ExternalID)

Creates a new HTML document without a DTD node if @URI and @ExternalID are NULL

URI:URI for the dtd, or NULL
ExternalID:the external ID of the DTD, or NULL
Returns:a new document, do not initialize the DTD if not provided

htmlNodeDump ()

int	htmlNodeDump			(xmlBufferPtr buf, 
xmlDocPtr doc,
xmlNodePtr cur)

Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added.

buf:the HTML buffer output
doc:the document
cur:the current node
Returns:the number of byte written or -1 in case of error

htmlNodeDumpFile ()

void	htmlNodeDumpFile		(FILE * out, 
xmlDocPtr doc,
xmlNodePtr cur)

Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added.

out:the FILE pointer
doc:the document
cur:the current node

htmlNodeDumpFileFormat ()

int	htmlNodeDumpFileFormat		(FILE * out, 
xmlDocPtr doc,
xmlNodePtr cur,
const char * encoding,
int format)

Dump an HTML node, recursive behaviour,children are printed too. TODO: if encoding == NULL try to save in the doc encoding

out:the FILE pointer
doc:the document
cur:the current node
encoding:the document encoding
format:should formatting spaces been added
Returns:the number of byte written or -1 in case of failure.

htmlNodeDumpFormatOutput ()

void	htmlNodeDumpFormatOutput	(xmlOutputBufferPtr buf, 
xmlDocPtr doc,
xmlNodePtr cur,
const char * encoding,
int format)

Dump an HTML node, recursive behaviour,children are printed too.

buf:the HTML buffer output
doc:the document
cur:the current node
encoding:the encoding string
format:should formatting spaces been added

htmlNodeDumpOutput ()

void	htmlNodeDumpOutput		(xmlOutputBufferPtr buf, 
xmlDocPtr doc,
xmlNodePtr cur,
const char * encoding)

Dump an HTML node, recursive behaviour,children are printed too, and formatting returns/spaces are added.

buf:the HTML buffer output
doc:the document
cur:the current node
encoding:the encoding string

htmlSaveFile ()

int	htmlSaveFile			(const char * filename, 
xmlDocPtr cur)

Dump an HTML document to a file. If @filename is "-" the stdout file is used.

filename:the filename (or URL)
cur:the document
Returns:the number of byte written or -1 in case of failure.

htmlSaveFileEnc ()

int	htmlSaveFileEnc			(const char * filename, 
xmlDocPtr cur,
const char * encoding)

Dump an HTML document to a file using a given encoding and formatting returns/spaces are added.

filename:the filename
cur:the document
encoding:the document encoding
Returns:the number of byte written or -1 in case of failure.

htmlSaveFileFormat ()

int	htmlSaveFileFormat		(const char * filename, 
xmlDocPtr cur,
const char * encoding,
int format)

Dump an HTML document to a file using a given encoding.

filename:the filename
cur:the document
encoding:the document encoding
format:should formatting spaces been added
Returns:the number of byte written or -1 in case of failure.

htmlSetMetaEncoding ()

int	htmlSetMetaEncoding		(htmlDocPtr doc, 
const xmlChar * encoding)

Sets the current encoding in the Meta tags NOTE: this will not change the document content encoding, just the META flag associated.

doc:the document
encoding:the encoding string
Returns:0 in case of success and -1 in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-list.html0000644000175000017500000006174012134171044020165 0ustar aronaron list: lists interfaces

list

list - lists interfaces

this module implement the list support used in various place in the library.

Author(s): Gary Pennington <Gary.Pennington@uk.sun.com>

Synopsis

typedef struct _xmlLink xmlLink;
typedef xmlLink * xmlLinkPtr;
typedef struct _xmlList xmlList;
typedef xmlList * xmlListPtr;
int	xmlListInsert			(xmlListPtr l, 
void * data); int xmlListEmpty (xmlListPtr l); void xmlListSort (xmlListPtr l); typedef void xmlListDeallocator (xmlLinkPtr lk); void xmlListMerge (xmlListPtr l1,
xmlListPtr l2); xmlListPtr xmlListCreate (xmlListDeallocator deallocator,
xmlListDataCompare compare); xmlListPtr xmlListDup (const xmlListPtr old); int xmlListRemoveLast (xmlListPtr l,
void * data); void xmlListWalk (xmlListPtr l,
xmlListWalker walker,
const void * user); int xmlListRemoveAll (xmlListPtr l,
void * data); int xmlListCopy (xmlListPtr cur,
const xmlListPtr old); void xmlListPopFront (xmlListPtr l); void * xmlListSearch (xmlListPtr l,
void * data); typedef int xmlListWalker (const void * data,
const void * user); int xmlListRemoveFirst (xmlListPtr l,
void * data); void xmlListReverseWalk (xmlListPtr l,
xmlListWalker walker,
const void * user); void * xmlLinkGetData (xmlLinkPtr lk); void xmlListClear (xmlListPtr l); int xmlListAppend (xmlListPtr l,
void * data); void xmlListReverse (xmlListPtr l); typedef int xmlListDataCompare (const void * data0,
const void * data1); int xmlListSize (xmlListPtr l); int xmlListPushFront (xmlListPtr l,
void * data); xmlLinkPtr xmlListEnd (xmlListPtr l); void xmlListPopBack (xmlListPtr l); void * xmlListReverseSearch (xmlListPtr l,
void * data); int xmlListPushBack (xmlListPtr l,
void * data); xmlLinkPtr xmlListFront (xmlListPtr l); void xmlListDelete (xmlListPtr l);

Description

Details

Structure xmlLink

struct _xmlLink {
The content of this structure is not made public by the API.
} xmlLink;


Typedef xmlLinkPtr

xmlLink * xmlLinkPtr;


Structure xmlList

struct _xmlList {
The content of this structure is not made public by the API.
} xmlList;


Typedef xmlListPtr

xmlList * xmlListPtr;



Function type xmlListDeallocator

void	xmlListDeallocator		(xmlLinkPtr lk)

Callback function used to free data from a list.

lk:the data to deallocate


xmlLinkGetData ()

void *	xmlLinkGetData			(xmlLinkPtr lk)

See Returns.

lk:a link
Returns:a pointer to the data referenced from this link

xmlListAppend ()

int	xmlListAppend			(xmlListPtr l, 
void * data)

Insert data in the ordered list at the end for this value

l:a list
data:the data
Returns:0 in case of success, 1 in case of failure

xmlListClear ()

void	xmlListClear			(xmlListPtr l)

Remove the all data in the list

l:a list

xmlListCopy ()

int	xmlListCopy			(xmlListPtr cur, 
const xmlListPtr old)

Move all the element from the old list in the new list

cur:the new list
old:the old list
Returns:0 in case of success 1 in case of error

xmlListCreate ()

xmlListPtr	xmlListCreate		(xmlListDeallocator deallocator, 
xmlListDataCompare compare)

Create a new list

deallocator:an optional deallocator function
compare:an optional comparison function
Returns:the new list or NULL in case of error

xmlListDelete ()

void	xmlListDelete			(xmlListPtr l)

Deletes the list and its associated data

l:a list

xmlListDup ()

xmlListPtr	xmlListDup		(const xmlListPtr old)

Duplicate the list

old:the list
Returns:a new copy of the list or NULL in case of error

xmlListEmpty ()

int	xmlListEmpty			(xmlListPtr l)

Is the list empty ?

l:a list
Returns:1 if the list is empty, 0 if not empty and -1 in case of error

xmlListEnd ()

xmlLinkPtr	xmlListEnd		(xmlListPtr l)

Get the last element in the list

l:a list
Returns:the last element in the list, or NULL

xmlListFront ()

xmlLinkPtr	xmlListFront		(xmlListPtr l)

Get the first element in the list

l:a list
Returns:the first element in the list, or NULL

xmlListInsert ()

int	xmlListInsert			(xmlListPtr l, 
void * data)

Insert data in the ordered list at the beginning for this value

l:a list
data:the data
Returns:0 in case of success, 1 in case of failure

xmlListMerge ()

void	xmlListMerge			(xmlListPtr l1, 
xmlListPtr l2)

include all the elements of the second list in the first one and clear the second list

l1:the original list
l2:the new list

xmlListPopBack ()

void	xmlListPopBack			(xmlListPtr l)

Removes the last element in the list

l:a list

xmlListPopFront ()

void	xmlListPopFront			(xmlListPtr l)

Removes the first element in the list

l:a list

xmlListPushBack ()

int	xmlListPushBack			(xmlListPtr l, 
void * data)

add the new data at the end of the list

l:a list
data:new data
Returns:1 if successful, 0 otherwise

xmlListPushFront ()

int	xmlListPushFront		(xmlListPtr l, 
void * data)

add the new data at the beginning of the list

l:a list
data:new data
Returns:1 if successful, 0 otherwise

xmlListRemoveAll ()

int	xmlListRemoveAll		(xmlListPtr l, 
void * data)

Remove the all instance associated to data in the list

l:a list
data:list data
Returns:the number of deallocation, or 0 if not found

xmlListRemoveFirst ()

int	xmlListRemoveFirst		(xmlListPtr l, 
void * data)

Remove the first instance associated to data in the list

l:a list
data:list data
Returns:1 if a deallocation occured, or 0 if not found

xmlListRemoveLast ()

int	xmlListRemoveLast		(xmlListPtr l, 
void * data)

Remove the last instance associated to data in the list

l:a list
data:list data
Returns:1 if a deallocation occured, or 0 if not found

xmlListReverse ()

void	xmlListReverse			(xmlListPtr l)

Reverse the order of the elements in the list

l:a list

xmlListReverseSearch ()

void *	xmlListReverseSearch		(xmlListPtr l, 
void * data)

Search the list in reverse order for an existing value of @data

l:a list
data:a search value
Returns:the value associated to @data or NULL in case of error

xmlListReverseWalk ()

void	xmlListReverseWalk		(xmlListPtr l, 
xmlListWalker walker,
const void * user)

Walk all the element of the list in reverse order and apply the walker function to it

l:a list
walker:a processing function
user:a user parameter passed to the walker function

xmlListSearch ()

void *	xmlListSearch			(xmlListPtr l, 
void * data)

Search the list for an existing value of @data

l:a list
data:a search value
Returns:the value associated to @data or NULL in case of error

xmlListSize ()

int	xmlListSize			(xmlListPtr l)

Get the number of elements in the list

l:a list
Returns:the number of elements in the list or -1 in case of error

xmlListSort ()

void	xmlListSort			(xmlListPtr l)

Sort all the elements in the list

l:a list

xmlListWalk ()

void	xmlListWalk			(xmlListPtr l, 
xmlListWalker walker,
const void * user)

Walk all the element of the first from first to last and apply the walker function to it

l:a list
walker:a processing function
user:a user parameter passed to the walker function

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2.devhelp0000644000175000017500000123622112134171044017676 0ustar aronaron libxml2-2.9.1+dfsg1/doc/devhelp/left.png0000644000175000017500000000071311234335462016414 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1&¹³[(XIDATxœµ•!OÃPEïÛ*ˆ‰ŠID%~ꊯ˜ÄÕ"pæ'öŘ`sÜ–¥rKf–´‚¤â h—mi—ÇIžz}÷ܯIû¤–.pÚö\“`xä‹ ˆl‡?l·[²,H¬‡¯×k<Ï#Žcþ%\’AUx[S³7–n6ù¾¯år¹ßèõzE‰‡’s’žŒ1³ºö“²æÅj@œ—NL$ݤiª0 ¿5/ð}¿²\E‡Ž¤KIo¥Í“$a0üjÞdF£bŠkIê„‹æAh>ŸW¶lC'?“tk;|/t*I»ÝN«ÕÊZø^`Œy•4ë÷ûšN§r]×® çJÒÌó<«’½À“Út»Ýú€à`±Xàºî1@p´ä€¸d½÷ŽZ')høÖÚK¬ ª$V?%Å]€­+³L’sgUKà"ÿw5â3O·•ÜòIEND®B`‚libxml2-2.9.1+dfsg1/doc/devhelp/Makefile.in0000644000175000017500000004324112134171754017026 0ustar aronaron# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/devhelp DIST_COMMON = $(dist_devhelp_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(devhelpdir)" DATA = $(dist_devhelp_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_THREAD_LIBS = @BASE_THREAD_LIBS@ C14N_OBJ = @C14N_OBJ@ CATALOG_OBJ = @CATALOG_OBJ@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@ CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@ DEBUG_OBJ = @DEBUG_OBJ@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCB_OBJ = @DOCB_OBJ@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTP_OBJ = @FTP_OBJ@ GREP = @GREP@ HAVE_ISINF = @HAVE_ISINF@ HAVE_ISNAN = @HAVE_ISNAN@ HTML_DIR = @HTML_DIR@ HTML_OBJ = @HTML_OBJ@ HTTP_OBJ = @HTTP_OBJ@ ICONV_LIBS = @ICONV_LIBS@ ICU_LIBS = @ICU_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_MAJOR_VERSION = @LIBXML_MAJOR_VERSION@ LIBXML_MICRO_VERSION = @LIBXML_MICRO_VERSION@ LIBXML_MINOR_VERSION = @LIBXML_MINOR_VERSION@ LIBXML_VERSION = @LIBXML_VERSION@ LIBXML_VERSION_EXTRA = @LIBXML_VERSION_EXTRA@ LIBXML_VERSION_INFO = @LIBXML_VERSION_INFO@ LIBXML_VERSION_NUMBER = @LIBXML_VERSION_NUMBER@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LZMA_CFLAGS = @LZMA_CFLAGS@ LZMA_LIBS = @LZMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODULE_EXTENSION = @MODULE_EXTENSION@ MODULE_PLATFORM_LIBS = @MODULE_PLATFORM_LIBS@ MV = @MV@ M_LIBS = @M_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PYTHON = @PYTHON@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_SITE_PACKAGES = @PYTHON_SITE_PACKAGES@ PYTHON_SUBDIR = @PYTHON_SUBDIR@ PYTHON_TESTS = @PYTHON_TESTS@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RDL_LIBS = @RDL_LIBS@ READER_TEST = @READER_TEST@ RELDATE = @RELDATE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STATIC_BINARIES = @STATIC_BINARIES@ STRIP = @STRIP@ TAR = @TAR@ TEST_C14N = @TEST_C14N@ TEST_CATALOG = @TEST_CATALOG@ TEST_DEBUG = @TEST_DEBUG@ TEST_HTML = @TEST_HTML@ TEST_MODULES = @TEST_MODULES@ TEST_PATTERN = @TEST_PATTERN@ TEST_PHTML = @TEST_PHTML@ TEST_PUSH = @TEST_PUSH@ TEST_REGEXPS = @TEST_REGEXPS@ TEST_SAX = @TEST_SAX@ TEST_SCHEMAS = @TEST_SCHEMAS@ TEST_SCHEMATRON = @TEST_SCHEMATRON@ TEST_THREADS = @TEST_THREADS@ TEST_VALID = @TEST_VALID@ TEST_VTIME = @TEST_VTIME@ TEST_XINCLUDE = @TEST_XINCLUDE@ TEST_XPATH = @TEST_XPATH@ TEST_XPTR = @TEST_XPTR@ THREAD_CFLAGS = @THREAD_CFLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ WITH_DOCB = @WITH_DOCB@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_LZMA = @WITH_LZMA@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ WITH_MODULES = @WITH_MODULES@ WITH_OUTPUT = @WITH_OUTPUT@ WITH_PATTERN = @WITH_PATTERN@ WITH_PUSH = @WITH_PUSH@ WITH_READER = @WITH_READER@ WITH_REGEXPS = @WITH_REGEXPS@ WITH_RUN_DEBUG = @WITH_RUN_DEBUG@ WITH_SAX1 = @WITH_SAX1@ WITH_SCHEMAS = @WITH_SCHEMAS@ WITH_SCHEMATRON = @WITH_SCHEMATRON@ WITH_THREADS = @WITH_THREADS@ WITH_THREAD_ALLOC = @WITH_THREAD_ALLOC@ WITH_TREE = @WITH_TREE@ WITH_TRIO = @WITH_TRIO@ WITH_VALID = @WITH_VALID@ WITH_WRITER = @WITH_WRITER@ WITH_XINCLUDE = @WITH_XINCLUDE@ WITH_XPATH = @WITH_XPATH@ WITH_XPTR = @WITH_XPTR@ WITH_ZLIB = @WITH_ZLIB@ XINCLUDE_OBJ = @XINCLUDE_OBJ@ XMLLINT = @XMLLINT@ XML_CFLAGS = @XML_CFLAGS@ XML_INCLUDEDIR = @XML_INCLUDEDIR@ XML_LIBDIR = @XML_LIBDIR@ XML_LIBS = @XML_LIBS@ XML_LIBTOOLLIBS = @XML_LIBTOOLLIBS@ XPATH_OBJ = @XPATH_OBJ@ XPTR_OBJ = @XPTR_OBJ@ XSLTPROC = @XSLTPROC@ Z_CFLAGS = @Z_CFLAGS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ devhelpdir = $(datadir)/gtk-doc/html/libxml2 dist_devhelp_DATA = \ libxml2.devhelp \ $(HTML_FILES) \ $(EXTRA_FORMAT) HTML_FILES = \ general.html \ index.html \ $(HTML_MODULES) HTML_MODULES = \ libxml2-c14n.html \ libxml2-catalog.html \ libxml2-chvalid.html \ libxml2-debugXML.html \ libxml2-dict.html \ libxml2-DOCBparser.html \ libxml2-encoding.html \ libxml2-entities.html \ libxml2-globals.html \ libxml2-hash.html \ libxml2-HTMLparser.html \ libxml2-HTMLtree.html \ libxml2-list.html \ libxml2-nanoftp.html \ libxml2-nanohttp.html \ libxml2-parser.html \ libxml2-parserInternals.html \ libxml2-pattern.html \ libxml2-relaxng.html \ libxml2-SAX2.html \ libxml2-SAX.html \ libxml2-schemasInternals.html \ libxml2-schematron.html \ libxml2-threads.html \ libxml2-tree.html \ libxml2-uri.html \ libxml2-valid.html \ libxml2-xinclude.html \ libxml2-xlink.html \ libxml2-xmlautomata.html \ libxml2-xmlerror.html \ libxml2-xmlexports.html \ libxml2-xmlIO.html \ libxml2-xmlmemory.html \ libxml2-xmlmodule.html \ libxml2-xmlreader.html \ libxml2-xmlregexp.html \ libxml2-xmlsave.html \ libxml2-xmlschemas.html \ libxml2-xmlschemastypes.html \ libxml2-xmlstring.html \ libxml2-xmlunicode.html \ libxml2-xmlversion.html \ libxml2-xmlwriter.html \ libxml2-xpath.html \ libxml2-xpathInternals.html \ libxml2-xpointer.html EXTRA_FORMAT = \ home.png \ left.png \ right.png \ up.png \ style.css EXTRA_DIST = devhelp.xsl html.xsl all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/devhelp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/devhelp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_devhelpDATA: $(dist_devhelp_DATA) @$(NORMAL_INSTALL) @list='$(dist_devhelp_DATA)'; test -n "$(devhelpdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(devhelpdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(devhelpdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devhelpdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(devhelpdir)" || exit $$?; \ done uninstall-dist_devhelpDATA: @$(NORMAL_UNINSTALL) @list='$(dist_devhelp_DATA)'; test -n "$(devhelpdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(devhelpdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(devhelpdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_devhelpDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_devhelpDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dist_devhelpDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-dist_devhelpDATA @REBUILD_DOCS_TRUE@rebuild: libxml2.devhelp $(HTML_FILES) @REBUILD_DOCS_TRUE@.PHONY: rebuild @REBUILD_DOCS_TRUE@libxml2.devhelp $(HTML_FILES): devhelp.xsl html.xsl $(top_srcdir)/doc/libxml2-api.xml @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ echo Rebuilding devhelp files ; \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet -o $(srcdir)/libxml2.devhelp $(srcdir)/devhelp.xsl $(top_srcdir)/doc/libxml2-api.xml ; fi ); # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libxml2-2.9.1+dfsg1/doc/devhelp/style.css0000644000175000017500000000146411234335462016632 0ustar aronaron.synopsis, .classsynopsis { background: #eeeeee; border: solid 1px #aaaaaa; padding: 0.5em; } .programlisting { background: #eeeeff; border: solid 1px #aaaaff; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } table.navigation { background: #ffeeee; border: solid 1px #ffaaaa; margin-top: 0.5em; margin-bottom: 0.5em; } .navigation a { color: #770000; } .navigation a:visited { color: #550000; } .navigation .title { font-size: 200%; } div.refnamediv { margin-top: 2em; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a { text-decoration: none; } a:hover { text-decoration: underline; color: #FF0000; } libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xinclude.html0000644000175000017500000003706012134171044021023 0ustar aronaron xinclude: implementation of XInclude

xinclude

xinclude - implementation of XInclude

API to handle XInclude processing, implements the World Wide Web Consortium Last Call Working Draft 10 November 2003

Author(s): Daniel Veillard

Description

Details

Macro XINCLUDE_FALLBACK

#define XINCLUDE_FALLBACK;

Macro defining "fallback"


Macro XINCLUDE_HREF

#define XINCLUDE_HREF;

Macro defining "href"


Macro XINCLUDE_NODE

#define XINCLUDE_NODE;

Macro defining "include"


Macro XINCLUDE_NS

#define XINCLUDE_NS;

Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude


Macro XINCLUDE_OLD_NS

#define XINCLUDE_OLD_NS;

Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude


Macro XINCLUDE_PARSE

#define XINCLUDE_PARSE;

Macro defining "parse"


Macro XINCLUDE_PARSE_ENCODING

#define XINCLUDE_PARSE_ENCODING;

Macro defining "encoding"


Macro XINCLUDE_PARSE_TEXT

#define XINCLUDE_PARSE_TEXT;

Macro defining "text"


Macro XINCLUDE_PARSE_XML

#define XINCLUDE_PARSE_XML;

Macro defining "xml"


Macro XINCLUDE_PARSE_XPOINTER

#define XINCLUDE_PARSE_XPOINTER;

Macro defining "xpointer"


Structure xmlXIncludeCtxt

struct _xmlXIncludeCtxt {
The content of this structure is not made public by the API.
} xmlXIncludeCtxt;


Typedef xmlXIncludeCtxtPtr

xmlXIncludeCtxt * xmlXIncludeCtxtPtr;


xmlXIncludeFreeContext ()

void	xmlXIncludeFreeContext		(xmlXIncludeCtxtPtr ctxt)

Free an XInclude context

ctxt:the XInclude context

xmlXIncludeNewContext ()

xmlXIncludeCtxtPtr	xmlXIncludeNewContext	(xmlDocPtr doc)

Creates a new XInclude context

doc:an XML Document
Returns:the new set

xmlXIncludeProcess ()

int	xmlXIncludeProcess		(xmlDocPtr doc)

Implement the XInclude substitution on the XML document @doc

doc:an XML document
Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

xmlXIncludeProcessFlags ()

int	xmlXIncludeProcessFlags		(xmlDocPtr doc, 
int flags)

Implement the XInclude substitution on the XML document @doc

doc:an XML document
flags:a set of xmlParserOption used for parsing XML includes
Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

xmlXIncludeProcessFlagsData ()

int	xmlXIncludeProcessFlagsData	(xmlDocPtr doc, 
int flags,
void * data)

Implement the XInclude substitution on the XML document @doc

doc:an XML document
flags:a set of xmlParserOption used for parsing XML includes
data:application data that will be passed to the parser context in the _private field of the parser context(s)
Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

xmlXIncludeProcessNode ()

int	xmlXIncludeProcessNode		(xmlXIncludeCtxtPtr ctxt, 
xmlNodePtr node)

Implement the XInclude substitution for the given subtree reusing the informations and data coming from the given context.

ctxt:an existing XInclude context
node:a node in an XML document
Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

xmlXIncludeProcessTree ()

int	xmlXIncludeProcessTree		(xmlNodePtr tree)

Implement the XInclude substitution for the given subtree

tree:a node in an XML document
Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

xmlXIncludeProcessTreeFlags ()

int	xmlXIncludeProcessTreeFlags	(xmlNodePtr tree, 
int flags)

Implement the XInclude substitution for the given subtree

tree:a node in an XML document
flags:a set of xmlParserOption used for parsing XML includes
Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

xmlXIncludeProcessTreeFlagsData ()

int	xmlXIncludeProcessTreeFlagsData	(xmlNodePtr tree, 
int flags,
void * data)

Implement the XInclude substitution on the XML node @tree

tree:an XML node
flags:a set of xmlParserOption used for parsing XML includes
data:application data that will be passed to the parser context in the _private field of the parser context(s)
Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

xmlXIncludeSetFlags ()

int	xmlXIncludeSetFlags		(xmlXIncludeCtxtPtr ctxt, 
int flags)

Set the flags used for further processing of XML resources.

ctxt:an XInclude processing context
flags:a set of xmlParserOption used for parsing XML includes
Returns:0 in case of success and -1 in case of error.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-SAX.html0000644000175000017500000011373312134171043017644 0ustar aronaron SAX: Old SAX version 1 handler, deprecated

SAX

SAX - Old SAX version 1 handler, deprecated

DEPRECATED set of SAX version 1 interfaces used to build the DOM tree.

WARNING: this module is deprecated !

Author(s): Daniel Veillard

Synopsis

void	comment			(void * ctx, 
const xmlChar * value); int checkNamespace (void * ctx,
xmlChar * namespace); int getColumnNumber (void * ctx); void entityDecl (void * ctx,
const xmlChar * name,
int type,
const xmlChar * publicId,
const xmlChar * systemId,
xmlChar * content); void attribute (void * ctx,
const xmlChar * fullname,
const xmlChar * value); xmlNsPtr getNamespace (void * ctx); void setDocumentLocator (void * ctx,
xmlSAXLocatorPtr loc); void initxmlDefaultSAXHandler (xmlSAXHandlerV1 * hdlr,
int warning); void ignorableWhitespace (void * ctx,
const xmlChar * ch,
int len); int hasExternalSubset (void * ctx); void unparsedEntityDecl (void * ctx,
const xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId,
const xmlChar * notationName); void globalNamespace (void * ctx,
const xmlChar * href,
const xmlChar * prefix); int hasInternalSubset (void * ctx); void reference (void * ctx,
const xmlChar * name); void notationDecl (void * ctx,
const xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId); const xmlChar * getSystemId (void * ctx); void externalSubset (void * ctx,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); xmlParserInputPtr resolveEntity (void * ctx,
const xmlChar * publicId,
const xmlChar * systemId); void startDocument (void * ctx); void setNamespace (void * ctx,
const xmlChar * name); void cdataBlock (void * ctx,
const xmlChar * value,
int len); const xmlChar * getPublicId (void * ctx); void inithtmlDefaultSAXHandler (xmlSAXHandlerV1 * hdlr); void processingInstruction (void * ctx,
const xmlChar * target,
const xmlChar * data); void endElement (void * ctx,
const xmlChar * name); void namespaceDecl (void * ctx,
const xmlChar * href,
const xmlChar * prefix); void initdocbDefaultSAXHandler (xmlSAXHandlerV1 * hdlr); xmlEntityPtr getEntity (void * ctx,
const xmlChar * name); void characters (void * ctx,
const xmlChar * ch,
int len); void elementDecl (void * ctx,
const xmlChar * name,
int type,
xmlElementContentPtr content); void startElement (void * ctx,
const xmlChar * fullname,
const xmlChar ** atts); xmlEntityPtr getParameterEntity (void * ctx,
const xmlChar * name); void attributeDecl (void * ctx,
const xmlChar * elem,
const xmlChar * fullname,
int type,
int def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree); int isStandalone (void * ctx); void internalSubset (void * ctx,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); void endDocument (void * ctx); int getLineNumber (void * ctx);

Description

Details

attribute ()

void	attribute			(void * ctx, 
const
xmlChar * fullname,
const xmlChar * value)

Handle an attribute that has been read by the parser. The default handling is to convert the attribute into an DOM subtree and past it in a new xmlAttr element added to the element. DEPRECATED: use xmlSAX2Attribute()

ctx:the user data (XML parser context)
fullname:The attribute name, including namespace prefix
value:The attribute value

attributeDecl ()

void	attributeDecl			(void * ctx, 
const
xmlChar * elem,
const xmlChar * fullname,
int type,
int def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree)

An attribute definition has been parsed DEPRECATED: use xmlSAX2AttributeDecl()

ctx:the user data (XML parser context)
elem:the name of the element
fullname:the attribute name
type:the attribute type
def:the type of default value
defaultValue:the attribute default value
tree:the tree of enumerated value set

cdataBlock ()

void	cdataBlock			(void * ctx, 
const
xmlChar * value,
int len)

called when a pcdata block has been parsed DEPRECATED: use xmlSAX2CDataBlock()

ctx:the user data (XML parser context)
value:The pcdata content
len:the block length

characters ()

void	characters			(void * ctx, 
const
xmlChar * ch,
int len)

receiving some chars from the parser. DEPRECATED: use xmlSAX2Characters()

ctx:the user data (XML parser context)
ch:a xmlChar string
len:the number of xmlChar

checkNamespace ()

int	checkNamespace			(void * ctx, 
xmlChar * namespace)

Check that the current element namespace is the same as the one read upon parsing. DEPRECATED

ctx:the user data (XML parser context)
namespace:the namespace to check against
Returns:1 if true 0 otherwise

comment ()

void	comment			(void * ctx, 
const
xmlChar * value)

A comment has been parsed. DEPRECATED: use xmlSAX2Comment()

ctx:the user data (XML parser context)
value:the comment content

elementDecl ()

void	elementDecl			(void * ctx, 
const
xmlChar * name,
int type,
xmlElementContentPtr content)

An element definition has been parsed DEPRECATED: use xmlSAX2ElementDecl()

ctx:the user data (XML parser context)
name:the element name
type:the element type
content:the element value tree


endElement ()

void	endElement			(void * ctx, 
const
xmlChar * name)

called when the end of an element has been detected. DEPRECATED: use xmlSAX2EndElement()

ctx:the user data (XML parser context)
name:The element name

entityDecl ()

void	entityDecl			(void * ctx, 
const
xmlChar * name,
int type,
const xmlChar * publicId,
const xmlChar * systemId,
xmlChar * content)

An entity definition has been parsed DEPRECATED: use xmlSAX2EntityDecl()

ctx:the user data (XML parser context)
name:the entity name
type:the entity type
publicId:The public ID of the entity
systemId:The system ID of the entity
content:the entity value (without processing).

externalSubset ()

void	externalSubset			(void * ctx, 
const
xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Callback on external subset declaration. DEPRECATED: use xmlSAX2ExternalSubset()

ctx:the user data (XML parser context)
name:the root element name
ExternalID:the external ID
SystemID:the SYSTEM ID (e.g. filename or URL)


getEntity ()

xmlEntityPtr	getEntity		(void * ctx, 
const xmlChar * name)

Get an entity by name DEPRECATED: use xmlSAX2GetEntity()

ctx:the user data (XML parser context)
name:The entity name
Returns:the xmlEntityPtr if found.


getNamespace ()

xmlNsPtr	getNamespace		(void * ctx)

Get the current element namespace. DEPRECATED

ctx:the user data (XML parser context)
Returns:the xmlNsPtr or NULL if none

getParameterEntity ()

xmlEntityPtr	getParameterEntity	(void * ctx, 
const xmlChar * name)

Get a parameter entity by name DEPRECATED: use xmlSAX2GetParameterEntity()

ctx:the user data (XML parser context)
name:The entity name
Returns:the xmlEntityPtr if found.

getPublicId ()

const xmlChar *	getPublicId		(void * ctx)

Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" DEPRECATED: use xmlSAX2GetPublicId()

ctx:the user data (XML parser context)
Returns:a xmlChar *

getSystemId ()

const xmlChar *	getSystemId		(void * ctx)

Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd DEPRECATED: use xmlSAX2GetSystemId()

ctx:the user data (XML parser context)
Returns:a xmlChar *

globalNamespace ()

void	globalNamespace			(void * ctx, 
const
xmlChar * href,
const xmlChar * prefix)

An old global namespace has been parsed. DEPRECATED

ctx:the user data (XML parser context)
href:the namespace associated URN
prefix:the namespace prefix



ignorableWhitespace ()

void	ignorableWhitespace		(void * ctx, 
const
xmlChar * ch,
int len)

receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use characters DEPRECATED: use xmlSAX2IgnorableWhitespace()

ctx:the user data (XML parser context)
ch:a xmlChar string
len:the number of xmlChar

initdocbDefaultSAXHandler ()

void	initdocbDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr)

Initialize the default DocBook SAX version 1 handler DEPRECATED: use xmlSAX2InitDocbDefaultSAXHandler() for the new SAX2 blocks

hdlr:the SAX handler

inithtmlDefaultSAXHandler ()

void	inithtmlDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr)

Initialize the default HTML SAX version 1 handler DEPRECATED: use xmlSAX2InitHtmlDefaultSAXHandler() for the new SAX2 blocks

hdlr:the SAX handler

initxmlDefaultSAXHandler ()

void	initxmlDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr, 
int warning)

Initialize the default XML SAX version 1 handler DEPRECATED: use xmlSAX2InitDefaultSAXHandler() for the new SAX2 blocks

hdlr:the SAX handler
warning:flag if non-zero sets the handler warning procedure

internalSubset ()

void	internalSubset			(void * ctx, 
const
xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Callback on internal subset declaration. DEPRECATED: use xmlSAX2InternalSubset()

ctx:the user data (XML parser context)
name:the root element name
ExternalID:the external ID
SystemID:the SYSTEM ID (e.g. filename or URL)


namespaceDecl ()

void	namespaceDecl			(void * ctx, 
const
xmlChar * href,
const xmlChar * prefix)

A namespace has been parsed. DEPRECATED

ctx:the user data (XML parser context)
href:the namespace associated URN
prefix:the namespace prefix

notationDecl ()

void	notationDecl			(void * ctx, 
const
xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId)

What to do when a notation declaration has been parsed. DEPRECATED: use xmlSAX2NotationDecl()

ctx:the user data (XML parser context)
name:The name of the notation
publicId:The public ID of the entity
systemId:The system ID of the entity

processingInstruction ()

void	processingInstruction		(void * ctx, 
const
xmlChar * target,
const xmlChar * data)

A processing instruction has been parsed. DEPRECATED: use xmlSAX2ProcessingInstruction()

ctx:the user data (XML parser context)
target:the target name
data:the PI data's

reference ()

void	reference			(void * ctx, 
const
xmlChar * name)

called when an entity reference is detected. DEPRECATED: use xmlSAX2Reference()

ctx:the user data (XML parser context)
name:The entity name

resolveEntity ()

xmlParserInputPtr	resolveEntity	(void * ctx, 
const xmlChar * publicId,
const xmlChar * systemId)

The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine DEPRECATED: use xmlSAX2ResolveEntity()

ctx:the user data (XML parser context)
publicId:The public ID of the entity
systemId:The system ID of the entity
Returns:the xmlParserInputPtr if inlined or NULL for DOM behaviour.

setDocumentLocator ()

void	setDocumentLocator		(void * ctx, 
xmlSAXLocatorPtr loc)

Receive the document locator at startup, actually xmlDefaultSAXLocator Everything is available on the context, so this is useless in our case. DEPRECATED

ctx:the user data (XML parser context)
loc:A SAX Locator

setNamespace ()

void	setNamespace			(void * ctx, 
const
xmlChar * name)

Set the current element namespace. DEPRECATED

ctx:the user data (XML parser context)
name:the namespace prefix


startElement ()

void	startElement			(void * ctx, 
const
xmlChar * fullname,
const xmlChar ** atts)

called when an opening tag has been processed. DEPRECATED: use xmlSAX2StartElement()

ctx:the user data (XML parser context)
fullname:The element name, including namespace prefix
atts:An array of name/value attributes pairs, NULL terminated

unparsedEntityDecl ()

void	unparsedEntityDecl		(void * ctx, 
const
xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId,
const xmlChar * notationName)

What to do when an unparsed entity declaration is parsed DEPRECATED: use xmlSAX2UnparsedEntityDecl()

ctx:the user data (XML parser context)
name:The name of the entity
publicId:The public ID of the entity
systemId:The system ID of the entity
notationName:the name of the notation

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-globals.html0000644000175000017500000010547212134171044020636 0ustar aronaron globals: interface for all global variables of the library

globals

globals - interface for all global variables of the library

all the global variables and thread handling for those variables is handled by this module. The bottom of this file is automatically generated by build_glob.py based on the description file global.data

Author(s): Gary Pennington <Gary.Pennington@uk.sun.com>, Daniel Veillard

Synopsis

typedef xmlGlobalState * xmlGlobalStatePtr;
typedef struct _xmlGlobalState xmlGlobalState;
void	xmlThrDefSetStructuredErrorFunc	(void * ctx, 
xmlStructuredErrorFunc handler); void xmlInitializeGlobalState (xmlGlobalStatePtr gs); xmlBufferAllocationScheme xmlThrDefBufferAllocScheme (xmlBufferAllocationScheme v); int xmlThrDefPedanticParserDefaultValue (int v); xmlRegisterNodeFunc xmlRegisterNodeDefault (xmlRegisterNodeFunc func); typedef xmlParserInputBufferPtr xmlParserInputBufferCreateFilenameFunc (const char * URI,
xmlCharEncoding enc); xmlOutputBufferCreateFilenameFunc xmlThrDefOutputBufferCreateFilenameDefault (xmlOutputBufferCreateFilenameFunc func); xmlDeregisterNodeFunc xmlDeregisterNodeDefault (xmlDeregisterNodeFunc func); int xmlThrDefDefaultBufferSize (int v); xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameDefault (xmlOutputBufferCreateFilenameFunc func); int xmlThrDefLoadExtDtdDefaultValue (int v); xmlRegisterNodeFunc xmlThrDefRegisterNodeDefault (xmlRegisterNodeFunc func); int xmlThrDefKeepBlanksDefaultValue (int v); typedef void xmlDeregisterNodeFunc (xmlNodePtr node); int xmlThrDefParserDebugEntities (int v); xmlParserInputBufferCreateFilenameFunc xmlThrDefParserInputBufferCreateFilenameDefault (xmlParserInputBufferCreateFilenameFunc func); void xmlThrDefSetGenericErrorFunc (void * ctx,
xmlGenericErrorFunc handler); xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameDefault (xmlParserInputBufferCreateFilenameFunc func); int xmlThrDefDoValidityCheckingDefaultValue (int v); void xmlCleanupGlobals (void); int xmlThrDefGetWarningsDefaultValue (int v); xmlDeregisterNodeFunc xmlThrDefDeregisterNodeDefault (xmlDeregisterNodeFunc func); int xmlThrDefSubstituteEntitiesDefaultValue (int v); typedef void xmlRegisterNodeFunc (xmlNodePtr node); int xmlThrDefSaveNoEmptyTags (int v); int xmlThrDefIndentTreeOutput (int v); typedef xmlOutputBufferPtr xmlOutputBufferCreateFilenameFunc (const char * URI,
xmlCharEncodingHandlerPtr encoder,
int compression); void xmlInitGlobals (void); int xmlThrDefLineNumbersDefaultValue (int v); const char * xmlThrDefTreeIndentString (const char * v);

Description

Details

Structure xmlGlobalState

struct _xmlGlobalState {
    const char *	xmlParserVersion
    xmlSAXLocator	xmlDefaultSAXLocator
    xmlSAXHandlerV1	xmlDefaultSAXHandler
    xmlSAXHandlerV1	docbDefaultSAXHandler
    xmlSAXHandlerV1	htmlDefaultSAXHandler
    xmlFreeFunc	xmlFree
    xmlMallocFunc	xmlMalloc
    xmlStrdupFunc	xmlMemStrdup
    xmlReallocFunc	xmlRealloc
    xmlGenericErrorFunc	xmlGenericError
    xmlStructuredErrorFunc	xmlStructuredError
    void *	xmlGenericErrorContext
    int	oldXMLWDcompatibility
    xmlBufferAllocationScheme	xmlBufferAllocScheme
    int	xmlDefaultBufferSize
    int	xmlSubstituteEntitiesDefaultValue
    int	xmlDoValidityCheckingDefaultValue
    int	xmlGetWarningsDefaultValue
    int	xmlKeepBlanksDefaultValue
    int	xmlLineNumbersDefaultValue
    int	xmlLoadExtDtdDefaultValue
    int	xmlParserDebugEntities
    int	xmlPedanticParserDefaultValue
    int	xmlSaveNoEmptyTags
    int	xmlIndentTreeOutput
    const char *	xmlTreeIndentString
    xmlRegisterNodeFunc	xmlRegisterNodeDefaultValue
    xmlDeregisterNodeFunc	xmlDeregisterNodeDefaultValue
    xmlMallocFunc	xmlMallocAtomic
    xmlError	xmlLastError
    xmlParserInputBufferCreateFilenameFunc	xmlParserInputBufferCreateFilenameValue
    xmlOutputBufferCreateFilenameFunc	xmlOutputBufferCreateFilenameValue
    void *	xmlStructuredErrorContext
} xmlGlobalState;


Typedef xmlGlobalStatePtr

xmlGlobalState * xmlGlobalStatePtr;


Function type xmlDeregisterNodeFunc

void	xmlDeregisterNodeFunc		(xmlNodePtr node)

Signature for the deregistration callback of a discarded node

node:the current node

Function type xmlOutputBufferCreateFilenameFunc

xmlOutputBufferPtr	xmlOutputBufferCreateFilenameFunc	(const char * URI, 
xmlCharEncodingHandlerPtr encoder,
int compression)

Signature for the function doing the lookup for a suitable output method corresponding to an URI.

URI:the URI to write to
encoder:
compression:
Returns:the new xmlOutputBufferPtr in case of success or NULL if no method was found.

Function type xmlParserInputBufferCreateFilenameFunc

xmlParserInputBufferPtr	xmlParserInputBufferCreateFilenameFunc	(const char * URI, 
xmlCharEncoding enc)

Signature for the function doing the lookup for a suitable input method corresponding to an URI.

URI:the URI to read from
enc:the requested source encoding
Returns:the new xmlParserInputBufferPtr in case of success or NULL if no method was found.

Function type xmlRegisterNodeFunc

void	xmlRegisterNodeFunc		(xmlNodePtr node)

Signature for the registration callback of a created node

node:the current node

Variable docbDefaultSAXHandler

xmlSAXHandlerV1 docbDefaultSAXHandler;


Variable htmlDefaultSAXHandler

xmlSAXHandlerV1 htmlDefaultSAXHandler;


Variable oldXMLWDcompatibility

int oldXMLWDcompatibility;


Variable xmlBufferAllocScheme

xmlBufferAllocationScheme xmlBufferAllocScheme;


Variable xmlDefaultBufferSize

int xmlDefaultBufferSize;


Variable xmlDefaultSAXHandler

xmlSAXHandlerV1 xmlDefaultSAXHandler;


Variable xmlDefaultSAXLocator

xmlSAXLocator xmlDefaultSAXLocator;


Variable xmlDeregisterNodeDefaultValue

xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue;


Variable xmlDoValidityCheckingDefaultValue

int xmlDoValidityCheckingDefaultValue;


Variable xmlFree

xmlFreeFunc xmlFree;


Variable xmlGenericError

xmlGenericErrorFunc xmlGenericError;


Variable xmlGenericErrorContext

void * xmlGenericErrorContext;


Variable xmlGetWarningsDefaultValue

int xmlGetWarningsDefaultValue;


Variable xmlIndentTreeOutput

int xmlIndentTreeOutput;


Variable xmlKeepBlanksDefaultValue

int xmlKeepBlanksDefaultValue;


Variable xmlLastError

xmlError xmlLastError;


Variable xmlLineNumbersDefaultValue

int xmlLineNumbersDefaultValue;


Variable xmlLoadExtDtdDefaultValue

int xmlLoadExtDtdDefaultValue;


Variable xmlMalloc

xmlMallocFunc xmlMalloc;


Variable xmlMallocAtomic

xmlMallocFunc xmlMallocAtomic;


Variable xmlMemStrdup

xmlStrdupFunc xmlMemStrdup;


Variable xmlOutputBufferCreateFilenameValue

xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue;


Variable xmlParserDebugEntities

int xmlParserDebugEntities;


Variable xmlParserInputBufferCreateFilenameValue

xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue;


Variable xmlParserVersion

const char * xmlParserVersion;


Variable xmlPedanticParserDefaultValue

int xmlPedanticParserDefaultValue;


Variable xmlRealloc

xmlReallocFunc xmlRealloc;


Variable xmlRegisterNodeDefaultValue

xmlRegisterNodeFunc xmlRegisterNodeDefaultValue;


Variable xmlSaveNoEmptyTags

int xmlSaveNoEmptyTags;


Variable xmlStructuredError

xmlStructuredErrorFunc xmlStructuredError;


Variable xmlStructuredErrorContext

void * xmlStructuredErrorContext;


Variable xmlSubstituteEntitiesDefaultValue

int xmlSubstituteEntitiesDefaultValue;


Variable xmlTreeIndentString

const char * xmlTreeIndentString;



xmlDeregisterNodeDefault ()

xmlDeregisterNodeFunc	xmlDeregisterNodeDefault	(xmlDeregisterNodeFunc func)

Registers a callback for node destruction

func:function pointer to the new DeregisterNodeFunc
Returns:the previous value of the deregistration function


xmlInitializeGlobalState ()

void	xmlInitializeGlobalState	(xmlGlobalStatePtr gs)

xmlInitializeGlobalState() initialize a global state with all the default values of the library.

gs:a pointer to a newly allocated global state

xmlOutputBufferCreateFilenameDefault ()

xmlOutputBufferCreateFilenameFunc	xmlOutputBufferCreateFilenameDefault	(xmlOutputBufferCreateFilenameFunc func)

Registers a callback for URI output file handling

func:function pointer to the new OutputBufferCreateFilenameFunc
Returns:the old value of the registration function

xmlParserInputBufferCreateFilenameDefault ()

xmlParserInputBufferCreateFilenameFunc	xmlParserInputBufferCreateFilenameDefault	(xmlParserInputBufferCreateFilenameFunc func)

Registers a callback for URI input file handling

func:function pointer to the new ParserInputBufferCreateFilenameFunc
Returns:the old value of the registration function

xmlRegisterNodeDefault ()

xmlRegisterNodeFunc	xmlRegisterNodeDefault	(xmlRegisterNodeFunc func)

Registers a callback for node creation

func:function pointer to the new RegisterNodeFunc
Returns:the old value of the registration function



xmlThrDefDeregisterNodeDefault ()

xmlDeregisterNodeFunc	xmlThrDefDeregisterNodeDefault	(xmlDeregisterNodeFunc func)

func:
Returns:











xmlThrDefRegisterNodeDefault ()

xmlRegisterNodeFunc	xmlThrDefRegisterNodeDefault	(xmlRegisterNodeFunc func)

func:
Returns:






libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-tree.html0000644000175000017500000071151312134171044020151 0ustar aronaron tree: interfaces for tree manipulation

tree

tree - interfaces for tree manipulation

this module describes the structures found in an tree resulting from an XML or HTML parsing, as well as the API provided for various processing on that tree

Author(s): Daniel Veillard

Synopsis

#define XML_LOCAL_NAMESPACE;
#define BASE_BUFFER_SIZE;
#define XML_XML_ID;
#define xmlRootNode;
#define XML_GET_LINE;
#define XML_GET_CONTENT;
#define xmlChildrenNode;
#define XML_XML_NAMESPACE;
#define LIBXML2_NEW_BUFFER;
typedef struct _xmlNs xmlNs;
typedef struct _xmlElementContent xmlElementContent;
typedef xmlEnumeration * xmlEnumerationPtr;
typedef struct _xmlBuffer xmlBuffer;
typedef xmlParserInput * xmlParserInputPtr;
typedef xmlSAXLocator * xmlSAXLocatorPtr;
typedef struct _xmlParserInput xmlParserInput;
typedef struct _xmlElement xmlElement;
typedef xmlElementType xmlNsType;
typedef enum xmlBufferAllocationScheme;
typedef struct _xmlNode xmlNode;
typedef xmlDoc * xmlDocPtr;
typedef xmlBuffer * xmlBufferPtr;
typedef xmlDOMWrapCtxt * xmlDOMWrapCtxtPtr;
typedef xmlRef * xmlRefPtr;
typedef struct _xmlParserInputBuffer xmlParserInputBuffer;
typedef struct _xmlRef xmlRef;
typedef struct _xmlDOMWrapCtxt xmlDOMWrapCtxt;
typedef xmlNode * xmlNodePtr;
typedef struct _xmlParserCtxt xmlParserCtxt;
typedef xmlDtd * xmlDtdPtr;
typedef enum xmlAttributeDefault;
typedef struct _xmlBuf xmlBuf;
typedef struct _xmlNotation xmlNotation;
typedef enum xmlElementType;
typedef struct _xmlEntity xmlEntity;
typedef struct _xmlAttr xmlAttr;
typedef xmlAttribute * xmlAttributePtr;
typedef enum xmlElementTypeVal;
typedef xmlNotation * xmlNotationPtr;
typedef xmlElement * xmlElementPtr;
typedef xmlBuf * xmlBufPtr;
typedef enum xmlElementContentOccur;
typedef xmlAttr * xmlAttrPtr;
typedef struct _xmlDoc xmlDoc;
typedef struct _xmlID xmlID;
typedef xmlParserCtxt * xmlParserCtxtPtr;
typedef xmlEntity * xmlEntityPtr;
typedef struct _xmlEnumeration xmlEnumeration;
typedef enum xmlAttributeType;
typedef xmlNs * xmlNsPtr;
typedef xmlParserInputBuffer * xmlParserInputBufferPtr;
typedef struct _xmlSAXHandler xmlSAXHandler;
typedef struct _xmlOutputBuffer xmlOutputBuffer;
typedef struct _xmlSAXLocator xmlSAXLocator;
typedef xmlElementContent * xmlElementContentPtr;
typedef enum xmlElementContentType;
typedef enum xmlDocProperties;
typedef xmlID * xmlIDPtr;
typedef struct _xmlDtd xmlDtd;
typedef struct _xmlAttribute xmlAttribute;
typedef xmlOutputBuffer * xmlOutputBufferPtr;
typedef xmlSAXHandler * xmlSAXHandlerPtr;
xmlNodePtr	xmlDocCopyNode		(const xmlNodePtr node, 
xmlDocPtr doc,
int extended); xmlNodePtr xmlNewDocRawNode (xmlDocPtr doc,
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content); xmlChar * xmlBufContent (const xmlBufPtr buf); xmlAttrPtr xmlNewNsPropEatName (xmlNodePtr node,
xmlNsPtr ns,
xmlChar * name,
const xmlChar * value); xmlNodePtr xmlStringGetNodeList (xmlDocPtr doc,
const xmlChar * value); xmlNodePtr xmlNewCDataBlock (xmlDocPtr doc,
const xmlChar * content,
int len); void xmlBufferWriteCHAR (xmlBufferPtr buf,
const xmlChar * string); xmlChar * xmlNodeGetBase (xmlDocPtr doc,
xmlNodePtr cur); void xmlBufferEmpty (xmlBufferPtr buf); xmlChar * xmlBuildQName (const xmlChar * ncname,
const xmlChar * prefix,
xmlChar * memory,
int len); int xmlValidateNMToken (const xmlChar * value,
int space); int xmlSaveFormatFileEnc (const char * filename,
xmlDocPtr cur,
const char * encoding,
int format); xmlNodePtr xmlAddSibling (xmlNodePtr cur,
xmlNodePtr elem); xmlBufferPtr xmlBufferCreate (void); xmlNodePtr xmlNewDocFragment (xmlDocPtr doc); xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc); xmlChar * xmlGetProp (xmlNodePtr node,
const xmlChar * name); int xmlValidateName (const xmlChar * value,
int space); xmlChar * xmlBufEnd (const xmlBufPtr buf); int xmlValidateQName (const xmlChar * value,
int space); xmlAttrPtr xmlHasNsProp (xmlNodePtr node,
const xmlChar * name,
const xmlChar * nameSpace); xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur,
xmlNodePtr elem); int xmlBufferAddHead (xmlBufferPtr buf,
const xmlChar * str,
int len); xmlNodePtr xmlNewPI (const xmlChar * name,
const xmlChar * content); void xmlDocDumpFormatMemoryEnc (xmlDocPtr out_doc,
xmlChar ** doc_txt_ptr,
int * doc_txt_len,
const char * txt_encoding,
int format); xmlAttrPtr xmlSetProp (xmlNodePtr node,
const xmlChar * name,
const xmlChar * value); unsigned long xmlChildElementCount (xmlNodePtr parent); void xmlElemDump (FILE * f,
xmlDocPtr doc,
xmlNodePtr cur); int xmlSaveFormatFileTo (xmlOutputBufferPtr buf,
xmlDocPtr cur,
const char * encoding,
int format); xmlDtdPtr xmlGetIntSubset (xmlDocPtr doc); int xmlNodeBufGetContent (xmlBufferPtr buffer,
xmlNodePtr cur); xmlNodePtr xmlNextElementSibling (xmlNodePtr node); void xmlBufferWriteChar (xmlBufferPtr buf,
const char * string); void xmlBufferFree (xmlBufferPtr buf); int xmlDOMWrapCloneNode (xmlDOMWrapCtxtPtr ctxt,
xmlDocPtr sourceDoc,
xmlNodePtr node,
xmlNodePtr * resNode,
xmlDocPtr destDoc,
xmlNodePtr destParent,
int deep,
int options); xmlNodePtr xmlNewNode (xmlNsPtr ns,
const xmlChar * name); int xmlSaveFileTo (xmlOutputBufferPtr buf,
xmlDocPtr cur,
const char * encoding); xmlNodePtr xmlNewTextLen (const xmlChar * content,
int len); xmlNodePtr xmlNewTextChild (xmlNodePtr parent,
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content); void xmlNodeSetContent (xmlNodePtr cur,
const xmlChar * content); int xmlBufferAdd (xmlBufferPtr buf,
const xmlChar * str,
int len); void xmlNodeDumpOutput (xmlOutputBufferPtr buf,
xmlDocPtr doc,
xmlNodePtr cur,
int level,
int format,
const char * encoding); xmlNsPtr xmlCopyNamespace (xmlNsPtr cur); xmlNsPtr xmlSearchNsByHref (xmlDocPtr doc,
xmlNodePtr node,
const xmlChar * href); xmlNodePtr xmlAddChild (xmlNodePtr parent,
xmlNodePtr cur); int xmlReconciliateNs (xmlDocPtr doc,
xmlNodePtr tree); int xmlValidateNCName (const xmlChar * value,
int space); xmlNodePtr xmlNewDocComment (xmlDocPtr doc,
const xmlChar * content); int xmlGetCompressMode (void); int xmlNodeDump (xmlBufferPtr buf,
xmlDocPtr doc,
xmlNodePtr cur,
int level,
int format); xmlBufferPtr xmlBufferCreateSize (size_t size); xmlChar * xmlNodeListGetString (xmlDocPtr doc,
xmlNodePtr list,
int inLine); void xmlSetCompressMode (int mode); void xmlSetTreeDoc (xmlNodePtr tree,
xmlDocPtr doc); int xmlDOMWrapAdoptNode (xmlDOMWrapCtxtPtr ctxt,
xmlDocPtr sourceDoc,
xmlNodePtr node,
xmlDocPtr destDoc,
xmlNodePtr destParent,
int options); xmlNodePtr xmlCopyNodeList (const xmlNodePtr node); xmlNodePtr xmlNewDocNodeEatName (xmlDocPtr doc,
xmlNsPtr ns,
xmlChar * name,
const xmlChar * content); xmlNodePtr xmlAddChildList (xmlNodePtr parent,
xmlNodePtr cur); xmlChar * xmlGetNodePath (xmlNodePtr node); void xmlFreePropList (xmlAttrPtr cur); void xmlNodeAddContent (xmlNodePtr cur,
const xmlChar * content); int xmlUnsetNsProp (xmlNodePtr node,
xmlNsPtr ns,
const xmlChar * name); xmlNodePtr xmlFirstElementChild (xmlNodePtr parent); xmlNodePtr xmlAddNextSibling (xmlNodePtr cur,
xmlNodePtr elem); int xmlIsBlankNode (xmlNodePtr node); xmlNsPtr xmlNewGlobalNs (xmlDocPtr doc,
const xmlChar * href,
const xmlChar * prefix); int xmlBufferDump (FILE * file,
xmlBufferPtr buf); xmlChar * xmlNodeGetContent (xmlNodePtr cur); xmlDocPtr xmlCopyDoc (xmlDocPtr doc,
int recursive); xmlDOMWrapCtxtPtr xmlDOMWrapNewCtxt (void); void xmlDocDumpMemoryEnc (xmlDocPtr out_doc,
xmlChar ** doc_txt_ptr,
int * doc_txt_len,
const char * txt_encoding); int xmlBufGetNodeContent (xmlBufPtr buf,
xmlNodePtr cur); xmlNodePtr xmlTextMerge (xmlNodePtr first,
xmlNodePtr second); void xmlDocDumpMemory (xmlDocPtr cur,
xmlChar ** mem,
int * size); xmlNodePtr xmlNewDocPI (xmlDocPtr doc,
const xmlChar * name,
const xmlChar * content); void xmlFreeNs (xmlNsPtr cur); int xmlDocDump (FILE * f,
xmlDocPtr cur); void xmlFreeProp (xmlAttrPtr cur); xmlChar * xmlGetNoNsProp (xmlNodePtr node,
const xmlChar * name); xmlChar * xmlSplitQName2 (const xmlChar * name,
xmlChar ** prefix); xmlAttrPtr xmlNewProp (xmlNodePtr node,
const xmlChar * name,
const xmlChar * value); int xmlTextConcat (xmlNodePtr node,
const xmlChar * content,
int len); int xmlNodeGetSpacePreserve (xmlNodePtr cur); int xmlBufferShrink (xmlBufferPtr buf,
unsigned int len); xmlNodePtr xmlPreviousElementSibling (xmlNodePtr node); void xmlNodeSetContentLen (xmlNodePtr cur,
const xmlChar * content,
int len); void xmlNodeAddContentLen (xmlNodePtr cur,
const xmlChar * content,
int len); void xmlBufferWriteQuotedString (xmlBufferPtr buf,
const xmlChar * string); xmlAttrPtr xmlCopyProp (xmlNodePtr target,
xmlAttrPtr cur); xmlNodePtr xmlReplaceNode (xmlNodePtr old,
xmlNodePtr cur); void xmlSetDocCompressMode (xmlDocPtr doc,
int mode); xmlNodePtr xmlCopyNode (const xmlNodePtr node,
int extended); void xmlUnlinkNode (xmlNodePtr cur); const xmlChar * xmlSplitQName3 (const xmlChar * name,
int * len); typedef xmlNsPtr xmlDOMWrapAcquireNsFunction (xmlDOMWrapCtxtPtr ctxt,
xmlNodePtr node,
const xmlChar * nsName,
const xmlChar * nsPrefix); size_t xmlBufUse (const xmlBufPtr buf); xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc,
xmlNodePtr root); long xmlGetLineNo (xmlNodePtr node); const xmlChar * xmlBufferContent (const xmlBufferPtr buf); int xmlRemoveProp (xmlAttrPtr cur); xmlNodePtr xmlLastElementChild (xmlNodePtr parent); xmlChar * xmlNodeGetLang (xmlNodePtr cur); int xmlGetDocCompressMode (xmlDocPtr doc); size_t xmlBufNodeDump (xmlBufPtr buf,
xmlDocPtr doc,
xmlNodePtr cur,
int level,
int format); xmlChar * xmlGetNsProp (xmlNodePtr node,
const xmlChar * name,
const xmlChar * nameSpace); xmlAttrPtr xmlNewDocProp (xmlDocPtr doc,
const xmlChar * name,
const xmlChar * value); void xmlFreeNode (xmlNodePtr cur); xmlAttrPtr xmlNewNsProp (xmlNodePtr node,
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * value); void xmlDOMWrapFreeCtxt (xmlDOMWrapCtxtPtr ctxt); xmlChar * xmlBufferDetach (xmlBufferPtr buf); void xmlBufferSetAllocationScheme (xmlBufferPtr buf,
xmlBufferAllocationScheme scheme); xmlNodePtr xmlNewChild (xmlNodePtr parent,
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content); xmlNsPtr xmlSearchNs (xmlDocPtr doc,
xmlNodePtr node,
const xmlChar * nameSpace); xmlNodePtr xmlStringLenGetNodeList (xmlDocPtr doc,
const xmlChar * value,
int len); int xmlSaveFormatFile (const char * filename,
xmlDocPtr cur,
int format); xmlAttrPtr xmlCopyPropList (xmlNodePtr target,
xmlAttrPtr cur); int xmlDocFormatDump (FILE * f,
xmlDocPtr cur,
int format); void xmlNodeSetSpacePreserve (xmlNodePtr cur,
int val); xmlAttrPtr xmlHasProp (xmlNodePtr node,
const xmlChar * name); int xmlBufferCat (xmlBufferPtr buf,
const xmlChar * str); xmlDtdPtr xmlCreateIntSubset (xmlDocPtr doc,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); xmlDocPtr xmlNewDoc (const xmlChar * version); xmlNodePtr xmlNewCharRef (xmlDocPtr doc,
const xmlChar * name); xmlNsPtr xmlCopyNamespaceList (xmlNsPtr cur); xmlNodePtr xmlNewNodeEatName (xmlNsPtr ns,
xmlChar * name); int xmlBufferResize (xmlBufferPtr buf,
unsigned int size); void xmlNodeSetBase (xmlNodePtr cur,
const xmlChar * uri); xmlNodePtr xmlNewComment (const xmlChar * content); int xmlBufferLength (const xmlBufferPtr buf); xmlNodePtr xmlNewText (const xmlChar * content); int xmlUnsetProp (xmlNodePtr node,
const xmlChar * name); xmlBufferAllocationScheme xmlGetBufferAllocationScheme (void); int xmlSaveFile (const char * filename,
xmlDocPtr cur); xmlNodePtr xmlDocCopyNodeList (xmlDocPtr doc,
const xmlNodePtr node); void xmlSetNs (xmlNodePtr node,
xmlNsPtr ns); xmlNsPtr xmlNewNs (xmlNodePtr node,
const xmlChar * href,
const xmlChar * prefix); int xmlDOMWrapRemoveNode (xmlDOMWrapCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr node,
int options); void xmlAttrSerializeTxtContent (xmlBufferPtr buf,
xmlDocPtr doc,
xmlAttrPtr attr,
const xmlChar * string); xmlDtdPtr xmlCopyDtd (xmlDtdPtr dtd); xmlNodePtr xmlNewDocText (xmlDocPtr doc,
const xmlChar * content); xmlChar * xmlNodeListGetRawString (xmlDocPtr doc,
xmlNodePtr list,
int inLine); xmlBufferPtr xmlBufferCreateStatic (void * mem,
size_t size); xmlNodePtr xmlNewReference (xmlDocPtr doc,
const xmlChar * name); int xmlDOMWrapReconcileNamespaces (xmlDOMWrapCtxtPtr ctxt,
xmlNodePtr elem,
int options); int xmlBufferCCat (xmlBufferPtr buf,
const char * str); xmlNsPtr * xmlGetNsList (xmlDocPtr doc,
xmlNodePtr node); int xmlBufferGrow (xmlBufferPtr buf,
unsigned int len); int xmlNodeIsText (xmlNodePtr node); void xmlSetBufferAllocationScheme (xmlBufferAllocationScheme scheme); int xmlIsXHTML (const xmlChar * systemID,
const xmlChar * publicID); void xmlNodeSetLang (xmlNodePtr cur,
const xmlChar * lang); void xmlFreeDtd (xmlDtdPtr cur); void xmlFreeNodeList (xmlNodePtr cur); void xmlFreeDoc (xmlDocPtr cur); size_t xmlBufShrink (xmlBufPtr buf,
size_t len); xmlNodePtr xmlNewDocNode (xmlDocPtr doc,
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content); int xmlSaveFileEnc (const char * filename,
xmlDocPtr cur,
const char * encoding); xmlAttrPtr xmlSetNsProp (xmlNodePtr node,
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * value); void xmlDocDumpFormatMemory (xmlDocPtr cur,
xmlChar ** mem,
int * size,
int format); void xmlSetListDoc (xmlNodePtr list,
xmlDocPtr doc); void xmlNodeSetName (xmlNodePtr cur,
const xmlChar * name); xmlNodePtr xmlNewDocTextLen (xmlDocPtr doc,
const xmlChar * content,
int len); xmlDtdPtr xmlNewDtd (xmlDocPtr doc,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); void xmlFreeNsList (xmlNsPtr cur); xmlNodePtr xmlGetLastChild (xmlNodePtr parent);

Description

Details

Macro BASE_BUFFER_SIZE

#define BASE_BUFFER_SIZE;

default buffer size 4000.


Macro LIBXML2_NEW_BUFFER

#define LIBXML2_NEW_BUFFER;

Macro used to express that the API use the new buffers for xmlParserInputBuffer and xmlOutputBuffer. The change was introduced in 2.9.0.


Macro XML_GET_CONTENT

#define XML_GET_CONTENT;

Macro to extract the content pointer of a node.


Macro XML_GET_LINE

#define XML_GET_LINE;

Macro to extract the line number of an element node.


Macro XML_LOCAL_NAMESPACE

#define XML_LOCAL_NAMESPACE;

A namespace declaration node.


Macro XML_XML_ID

#define XML_XML_ID;

This is the name for the special xml:id attribute


Macro XML_XML_NAMESPACE

#define XML_XML_NAMESPACE;

This is the namespace for the special xml: prefix predefined in the XML Namespace specification.


Macro xmlChildrenNode

#define xmlChildrenNode;

Macro for compatibility naming layer with libxml1. Maps to "children."


Macro xmlRootNode

#define xmlRootNode;

Macro for compatibility naming layer with libxml1. Maps to "children".


Structure xmlAttr

struct _xmlAttr {
    void *	_private	: application data
    xmlElementType	type	: XML_ATTRIBUTE_NODE, must be second !
    const xmlChar *	name	: the name of the property
    struct _xmlNode *	children	: the value of the property
    struct _xmlNode *	last	: NULL
    struct _xmlNode *	parent	: child->parent link
    struct _xmlAttr *	next	: next sibling link
    struct _xmlAttr *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    xmlNs *	ns	: pointer to the associated namespace
    xmlAttributeType	atype	: the attribute type if validating
    void *	psvi	: for type/PSVI informations
} xmlAttr;


Typedef xmlAttrPtr

xmlAttr * xmlAttrPtr;


Structure xmlAttribute

struct _xmlAttribute {
    void *	_private	: application data
    xmlElementType	type	: XML_ATTRIBUTE_DECL, must be second !
    const xmlChar *	name	: Attribute name
    struct _xmlNode *	children	: NULL
    struct _xmlNode *	last	: NULL
    struct _xmlDtd *	parent	: -> DTD
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    struct _xmlAttribute *	nexth	: next in hash table
    xmlAttributeType	atype	: The attribute type
    xmlAttributeDefault	def	: the default
    const xmlChar *	defaultValue	: or the default value
    xmlEnumerationPtr	tree	: or the enumeration tree if any
    const xmlChar *	prefix	: the namespace prefix if any
    const xmlChar *	elem	: Element holding the attribute
} xmlAttribute;



Typedef xmlAttributePtr

xmlAttribute * xmlAttributePtr;



Structure xmlBuf

struct _xmlBuf {
The content of this structure is not made public by the API.
} xmlBuf;


Typedef xmlBufPtr

xmlBuf * xmlBufPtr;

A pointer to a buffer structure, the actual structure internals are not public


Structure xmlBuffer

struct _xmlBuffer {
    xmlChar *	content	: The buffer content UTF8
    unsigned int	use	: The buffer size used
    unsigned int	size	: The buffer size
    xmlBufferAllocationScheme	alloc	: The realloc method
    xmlChar *	contentIO	: in IO mode we may have a different base
} xmlBuffer;


Enum xmlBufferAllocationScheme

enum xmlBufferAllocationScheme {
    XML_BUFFER_ALLOC_DOUBLEIT = 1 /* double each time one need to grow */
    XML_BUFFER_ALLOC_EXACT = 2 /* grow only to the minimal size */
    XML_BUFFER_ALLOC_IMMUTABLE = 3 /* immutable buffer */
    XML_BUFFER_ALLOC_IO = 4 /* special allocation scheme used for I/O */
    XML_BUFFER_ALLOC_HYBRID = 5 /*  exact up to a threshold, and doubleit thereafter */
};


Typedef xmlBufferPtr

xmlBuffer * xmlBufferPtr;


Structure xmlDOMWrapCtxt

struct _xmlDOMWrapCtxt {
    void *	_private	: * The type of this context, just in case we need specialized * context
    int	type	: * Internal namespace map used for various operations. *
    void *	namespaceMap	: * Use this one to acquire an xmlNsPtr intended for node->ns. * (Note t
    xmlDOMWrapAcquireNsFunction	getNsForNodeFunc
} xmlDOMWrapCtxt;


Typedef xmlDOMWrapCtxtPtr

xmlDOMWrapCtxt * xmlDOMWrapCtxtPtr;


Structure xmlDoc

struct _xmlDoc {
    void *	_private	: application data
    xmlElementType	type	: XML_DOCUMENT_NODE, must be second !
    char *	name	: name/filename/URI of the document
    struct _xmlNode *	children	: the document tree
    struct _xmlNode *	last	: last child link
    struct _xmlNode *	parent	: child->parent link
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: autoreference to itself End of common part
    int	compression	: level of zlib compression
    int	standalone	: standalone document (no external refs) 1 if standalone="yes" 0 if sta
    struct _xmlDtd *	intSubset	: the document internal subset
    struct _xmlDtd *	extSubset	: the document external subset
    struct _xmlNs *	oldNs	: Global namespace, the old way
    const xmlChar *	version	: the XML version string
    const xmlChar *	encoding	: external initial encoding, if any
    void *	ids	: Hash table for ID attributes if any
    void *	refs	: Hash table for IDREFs attributes if any
    const xmlChar *	URL	: The URI for that document
    int	charset	: encoding of the in-memory content actually an xmlCharEncoding
    struct _xmlDict *	dict	: dict used to allocate names or NULL
    void *	psvi	: for type/PSVI informations
    int	parseFlags	: set of xmlParserOption used to parse the document
    int	properties	: set of xmlDocProperties for this document set at the end of parsing
} xmlDoc;


Enum xmlDocProperties

enum xmlDocProperties {
    XML_DOC_WELLFORMED = 1 /* document is XML well formed */
    XML_DOC_NSVALID = 2 /* document is Namespace valid */
    XML_DOC_OLD10 = 4 /* parsed with old XML-1.0 parser */
    XML_DOC_DTDVALID = 8 /* DTD validation was successful */
    XML_DOC_XINCLUDE = 16 /* XInclude substitution was done */
    XML_DOC_USERBUILT = 32 /* Document was built using the API and not by parsing an instance */
    XML_DOC_INTERNAL = 64 /* built for internal processing */
    XML_DOC_HTML = 128 /*  parsed or built HTML document */
};


Typedef xmlDocPtr

xmlDoc * xmlDocPtr;


Structure xmlDtd

struct _xmlDtd {
    void *	_private	: application data
    xmlElementType	type	: XML_DTD_NODE, must be second !
    const xmlChar *	name	: Name of the DTD
    struct _xmlNode *	children	: the value of the property link
    struct _xmlNode *	last	: last child link
    struct _xmlDoc *	parent	: child->parent link
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document End of common part
    void *	notations	: Hash table for notations if any
    void *	elements	: Hash table for elements if any
    void *	attributes	: Hash table for attributes if any
    void *	entities	: Hash table for entities if any
    const xmlChar *	ExternalID	: External identifier for PUBLIC DTD
    const xmlChar *	SystemID	: URI for a SYSTEM or PUBLIC DTD
    void *	pentities	: Hash table for param entities if any
} xmlDtd;


Typedef xmlDtdPtr

xmlDtd * xmlDtdPtr;


Structure xmlElement

struct _xmlElement {
    void *	_private	: application data
    xmlElementType	type	: XML_ELEMENT_DECL, must be second !
    const xmlChar *	name	: Element name
    struct _xmlNode *	children	: NULL
    struct _xmlNode *	last	: NULL
    struct _xmlDtd *	parent	: -> DTD
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    xmlElementTypeVal	etype	: The type
    xmlElementContentPtr	content	: the allowed element content
    xmlAttributePtr	attributes	: List of the declared attributes
    const xmlChar *	prefix	: the namespace prefix if any
    xmlRegexpPtr	contModel	: the validating regexp
    void *	contModel
} xmlElement;


Structure xmlElementContent

struct _xmlElementContent {
    xmlElementContentType	type	: PCDATA, ELEMENT, SEQ or OR
    xmlElementContentOccur	ocur	: ONCE, OPT, MULT or PLUS
    const xmlChar *	name	: Element name
    struct _xmlElementContent *	c1	: first child
    struct _xmlElementContent *	c2	: second child
    struct _xmlElementContent *	parent	: parent
    const xmlChar *	prefix	: Namespace prefix
} xmlElementContent;



Typedef xmlElementContentPtr

xmlElementContent * xmlElementContentPtr;



Typedef xmlElementPtr

xmlElement * xmlElementPtr;




Structure xmlEntity

struct _xmlEntity {
    void *	_private	: application data
    xmlElementType	type	: XML_ENTITY_DECL, must be second !
    const xmlChar *	name	: Entity name
    struct _xmlNode *	children	: First child link
    struct _xmlNode *	last	: Last child link
    struct _xmlDtd *	parent	: -> DTD
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document
    xmlChar *	orig	: content without ref substitution
    xmlChar *	content	: content or ndata if unparsed
    int	length	: the content length
    xmlEntityType	etype	: The entity type
    const xmlChar *	ExternalID	: External identifier for PUBLIC
    const xmlChar *	SystemID	: URI for a SYSTEM or PUBLIC Entity
    struct _xmlEntity *	nexte	: unused
    const xmlChar *	URI	: the full URI as computed
    int	owner	: does the entity own the childrens
    int	checked	: was the entity content checked this is also used to count entites * r
} xmlEntity;


Typedef xmlEntityPtr

xmlEntity * xmlEntityPtr;


Structure xmlEnumeration

struct _xmlEnumeration {
    struct _xmlEnumeration *	next	: next one
    const xmlChar *	name	: Enumeration name
} xmlEnumeration;


Typedef xmlEnumerationPtr

xmlEnumeration * xmlEnumerationPtr;


Structure xmlID

struct _xmlID {
    struct _xmlID *	next	: next ID
    const xmlChar *	value	: The ID name
    xmlAttrPtr	attr	: The attribute holding it
    const xmlChar *	name	: The attribute if attr is not available
    int	lineno	: The line number if attr is not available
    struct _xmlDoc *	doc	: The document holding the ID
} xmlID;


Typedef xmlIDPtr

xmlID * xmlIDPtr;


Structure xmlNode

struct _xmlNode {
    void *	_private	: application data
    xmlElementType	type	: type number, must be second !
    const xmlChar *	name	: the name of the node, or the entity
    struct _xmlNode *	children	: parent->childs link
    struct _xmlNode *	last	: last child link
    struct _xmlNode *	parent	: child->parent link
    struct _xmlNode *	next	: next sibling link
    struct _xmlNode *	prev	: previous sibling link
    struct _xmlDoc *	doc	: the containing document End of common part
    xmlNs *	ns	: pointer to the associated namespace
    xmlChar *	content	: the content
    struct _xmlAttr *	properties	: properties list
    xmlNs *	nsDef	: namespace definitions on this node
    void *	psvi	: for type/PSVI informations
    unsigned short	line	: line number
    unsigned short	extra	: extra data for XPath/XSLT
} xmlNode;


Typedef xmlNodePtr

xmlNode * xmlNodePtr;


Structure xmlNotation

struct _xmlNotation {
    const xmlChar *	name	: Notation name
    const xmlChar *	PublicID	: Public identifier, if any
    const xmlChar *	SystemID	: System identifier, if any
} xmlNotation;


Typedef xmlNotationPtr

xmlNotation * xmlNotationPtr;


Structure xmlNs

struct _xmlNs {
    struct _xmlNs *	next	: next Ns link for this node
    xmlNsType	type	: global or local
    const xmlChar *	href	: URL for the namespace
    const xmlChar *	prefix	: prefix for the namespace
    void *	_private	: application data
    struct _xmlDoc *	context	: normally an xmlDoc
} xmlNs;


Typedef xmlNsPtr

xmlNs * xmlNsPtr;


Typedef xmlNsType

xmlElementType xmlNsType;


Structure xmlOutputBuffer

struct _xmlOutputBuffer {
    void *	context
    xmlOutputWriteCallback	writecallback
    xmlOutputCloseCallback	closecallback
    xmlCharEncodingHandlerPtr	encoder	: I18N conversions to UTF-8
    xmlBufPtr	buffer	: Local buffer encoded in UTF-8 or ISOLatin
    xmlBufPtr	conv	: if encoder != NULL buffer for output
    int	written	: total number of byte written
    int	error
} xmlOutputBuffer;


Typedef xmlOutputBufferPtr

xmlOutputBuffer * xmlOutputBufferPtr;


Structure xmlParserCtxt

struct _xmlParserCtxt {
    struct _xmlSAXHandler *	sax	: The SAX handler
    void *	userData	: For SAX interface only, used by DOM build
    xmlDocPtr	myDoc	: the document being built
    int	wellFormed	: is the document well formed
    int	replaceEntities	: shall we replace entities ?
    const xmlChar *	version	: the XML version string
    const xmlChar *	encoding	: the declared encoding, if any
    int	standalone	: standalone document
    int	html	: an HTML(1)/Docbook(2) document * 3 is HTML after <head> * 10 is HTML
    xmlParserInputPtr	input	: Current input stream
    int	inputNr	: Number of current input streams
    int	inputMax	: Max number of input streams
    xmlParserInputPtr *	inputTab	: stack of inputs Node analysis stack only used for DOM building
    xmlNodePtr	node	: Current parsed Node
    int	nodeNr	: Depth of the parsing stack
    int	nodeMax	: Max depth of the parsing stack
    xmlNodePtr *	nodeTab	: array of nodes
    int	record_info	: Whether node info should be kept
    xmlParserNodeInfoSeq	node_seq	: info about each node parsed
    int	errNo	: error code
    int	hasExternalSubset	: reference and external subset
    int	hasPErefs	: the internal subset has PE refs
    int	external	: are we parsing an external entity
    int	valid	: is the document valid
    int	validate	: shall we try to validate ?
    xmlValidCtxt	vctxt	: The validity context
    xmlParserInputState	instate	: current type of input
    int	token	: next char look-ahead
    char *	directory	: the data directory Node name stack
    const xmlChar *	name	: Current parsed Node
    int	nameNr	: Depth of the parsing stack
    int	nameMax	: Max depth of the parsing stack
    const xmlChar * *	nameTab	: array of nodes
    long	nbChars	: number of xmlChar processed
    long	checkIndex	: used by progressive parsing lookup
    int	keepBlanks	: ugly but ...
    int	disableSAX	: SAX callbacks are disabled
    int	inSubset	: Parsing is in int 1/ext 2 subset
    const xmlChar *	intSubName	: name of subset
    xmlChar *	extSubURI	: URI of external subset
    xmlChar *	extSubSystem	: SYSTEM ID of external subset xml:space values
    int *	space	: Should the parser preserve spaces
    int	spaceNr	: Depth of the parsing stack
    int	spaceMax	: Max depth of the parsing stack
    int *	spaceTab	: array of space infos
    int	depth	: to prevent entity substitution loops
    xmlParserInputPtr	entity	: used to check entities boundaries
    int	charset	: encoding of the in-memory content actually an xmlCharEncoding
    int	nodelen	: Those two fields are there to
    int	nodemem	: Speed up large node parsing
    int	pedantic	: signal pedantic warnings
    void *	_private	: For user data, libxml won't touch it
    int	loadsubset	: should the external subset be loaded
    int	linenumbers	: set line number in element content
    void *	catalogs	: document's own catalog
    int	recovery	: run in recovery mode
    int	progressive	: is this a progressive parsing
    xmlDictPtr	dict	: dictionnary for the parser
    const xmlChar * *	atts	: array for the attributes callbacks
    int	maxatts	: the size of the array
    int	docdict	: * pre-interned strings *
    const xmlChar *	str_xml
    const xmlChar *	str_xmlns
    const xmlChar *	str_xml_ns	: * Everything below is used only by the new SAX mode *
    int	sax2	: operating in the new SAX mode
    int	nsNr	: the number of inherited namespaces
    int	nsMax	: the size of the arrays
    const xmlChar * *	nsTab	: the array of prefix/namespace name
    int *	attallocs	: which attribute were allocated
    void * *	pushTab	: array of data for push
    xmlHashTablePtr	attsDefault	: defaulted attributes if any
    xmlHashTablePtr	attsSpecial	: non-CDATA attributes if any
    int	nsWellFormed	: is the document XML Nanespace okay
    int	options	: * Those fields are needed only for treaming parsing so far *
    int	dictNames	: Use dictionary names for the tree
    int	freeElemsNr	: number of freed element nodes
    xmlNodePtr	freeElems	: List of freed element nodes
    int	freeAttrsNr	: number of freed attributes nodes
    xmlAttrPtr	freeAttrs	: * the complete error informations for the last error. *
    xmlError	lastError
    xmlParserMode	parseMode	: the parser mode
    unsigned long	nbentities	: number of entities references
    unsigned long	sizeentities	: size of parsed entities for use by HTML non-recursive parser
    xmlParserNodeInfo *	nodeInfo	: Current NodeInfo
    int	nodeInfoNr	: Depth of the parsing stack
    int	nodeInfoMax	: Max depth of the parsing stack
    xmlParserNodeInfo *	nodeInfoTab	: array of nodeInfos
    int	input_id	: we need to label inputs
    unsigned long	sizeentcopy	: volume of entity copy
} xmlParserCtxt;


Typedef xmlParserCtxtPtr

xmlParserCtxt * xmlParserCtxtPtr;


Structure xmlParserInput

struct _xmlParserInput {
    xmlParserInputBufferPtr	buf	: UTF-8 encoded buffer
    const char *	filename	: The file analyzed, if any
    const char *	directory	: the directory/base of the file
    const xmlChar *	base	: Base of the array to parse
    const xmlChar *	cur	: Current char being parsed
    const xmlChar *	end	: end of the array to parse
    int	length	: length if known
    int	line	: Current line
    int	col	: * NOTE: consumed is only tested for equality in the parser code, *
    unsigned long	consumed	: How many xmlChars already consumed
    xmlParserInputDeallocate	free	: function to deallocate the base
    const xmlChar *	encoding	: the encoding string for entity
    const xmlChar *	version	: the version string for entity
    int	standalone	: Was that entity marked standalone
    int	id	: an unique identifier for the entity
} xmlParserInput;


Structure xmlParserInputBuffer

struct _xmlParserInputBuffer {
    void *	context
    xmlInputReadCallback	readcallback
    xmlInputCloseCallback	closecallback
    xmlCharEncodingHandlerPtr	encoder	: I18N conversions to UTF-8
    xmlBufPtr	buffer	: Local buffer encoded in UTF-8
    xmlBufPtr	raw	: if encoder != NULL buffer for raw input
    int	compressed	: -1=unknown, 0=not compressed, 1=compressed
    int	error
    unsigned long	rawconsumed	: amount consumed from raw
} xmlParserInputBuffer;


Typedef xmlParserInputBufferPtr

xmlParserInputBuffer * xmlParserInputBufferPtr;


Typedef xmlParserInputPtr

xmlParserInput * xmlParserInputPtr;


Structure xmlRef

struct _xmlRef {
    struct _xmlRef *	next	: next Ref
    const xmlChar *	value	: The Ref name
    xmlAttrPtr	attr	: The attribute holding it
    const xmlChar *	name	: The attribute if attr is not available
    int	lineno	: The line number if attr is not available
} xmlRef;


Typedef xmlRefPtr

xmlRef * xmlRefPtr;


Structure xmlSAXHandler

struct _xmlSAXHandler {
    internalSubsetSAXFunc	internalSubset
    isStandaloneSAXFunc	isStandalone
    hasInternalSubsetSAXFunc	hasInternalSubset
    hasExternalSubsetSAXFunc	hasExternalSubset
    resolveEntitySAXFunc	resolveEntity
    getEntitySAXFunc	getEntity
    entityDeclSAXFunc	entityDecl
    notationDeclSAXFunc	notationDecl
    attributeDeclSAXFunc	attributeDecl
    elementDeclSAXFunc	elementDecl
    unparsedEntityDeclSAXFunc	unparsedEntityDecl
    setDocumentLocatorSAXFunc	setDocumentLocator
    startDocumentSAXFunc	startDocument
    endDocumentSAXFunc	endDocument
    startElementSAXFunc	startElement
    endElementSAXFunc	endElement
    referenceSAXFunc	reference
    charactersSAXFunc	characters
    ignorableWhitespaceSAXFunc	ignorableWhitespace
    processingInstructionSAXFunc	processingInstruction
    commentSAXFunc	comment
    warningSAXFunc	warning
    errorSAXFunc	error
    fatalErrorSAXFunc	fatalError	: unused error() get all the errors
    getParameterEntitySAXFunc	getParameterEntity
    cdataBlockSAXFunc	cdataBlock
    externalSubsetSAXFunc	externalSubset
    unsigned int	initialized	: The following fields are extensions available only on version 2
    void *	_private
    startElementNsSAX2Func	startElementNs
    endElementNsSAX2Func	endElementNs
    xmlStructuredErrorFunc	serror
} xmlSAXHandler;


Typedef xmlSAXHandlerPtr

xmlSAXHandler * xmlSAXHandlerPtr;


Structure xmlSAXLocator

struct _xmlSAXLocator {
    const xmlChar *(*getPublicId)	getPublicId
    const xmlChar *(*getSystemId)	getSystemId
    int(*getLineNumber)	getLineNumber
    int(*getColumnNumber)	getColumnNumber
} xmlSAXLocator;


Typedef xmlSAXLocatorPtr

xmlSAXLocator * xmlSAXLocatorPtr;


Function type xmlDOMWrapAcquireNsFunction

xmlNsPtr	xmlDOMWrapAcquireNsFunction	(xmlDOMWrapCtxtPtr ctxt, 
xmlNodePtr node,
const xmlChar * nsName,
const xmlChar * nsPrefix)

A function called to acquire namespaces (xmlNs) from the wrapper.

ctxt:a DOM wrapper context
node:the context node (element or attribute)
nsName:the requested namespace name
nsPrefix:the requested namespace prefix
Returns:an xmlNsPtr or NULL in case of an error.

xmlAddChild ()

xmlNodePtr	xmlAddChild		(xmlNodePtr parent, 
xmlNodePtr cur)

Add a new node to @parent, at the end of the child (or property) list merging adjacent TEXT nodes (in which case @cur is freed) If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed.

parent:the parent node
cur:the child node
Returns:the child or NULL in case of error.

xmlAddChildList ()

xmlNodePtr	xmlAddChildList		(xmlNodePtr parent, 
xmlNodePtr cur)

Add a list of node at the end of the child list of the parent merging adjacent TEXT nodes (@cur may be freed)

parent:the parent node
cur:the first node in the list
Returns:the last child or NULL in case of error.

xmlAddNextSibling ()

xmlNodePtr	xmlAddNextSibling	(xmlNodePtr cur, 
xmlNodePtr elem)

Add a new node @elem as the next sibling of @cur If the new node was already inserted in a document it is first unlinked from its existing context. As a result of text merging @elem may be freed. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed.

cur:the child node
elem:the new node
Returns:the new node or NULL in case of error.

xmlAddPrevSibling ()

xmlNodePtr	xmlAddPrevSibling	(xmlNodePtr cur, 
xmlNodePtr elem)

Add a new node @elem as the previous sibling of @cur merging adjacent TEXT nodes (@elem may be freed) If the new node was already inserted in a document it is first unlinked from its existing context. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed.

cur:the child node
elem:the new node
Returns:the new node or NULL in case of error.

xmlAddSibling ()

xmlNodePtr	xmlAddSibling		(xmlNodePtr cur, 
xmlNodePtr elem)

Add a new element @elem to the list of siblings of @cur merging adjacent TEXT nodes (@elem may be freed) If the new element was already inserted in a document it is first unlinked from its existing context.

cur:the child node
elem:the new node
Returns:the new element or NULL in case of error.

xmlAttrSerializeTxtContent ()

void	xmlAttrSerializeTxtContent	(xmlBufferPtr buf, 
xmlDocPtr doc,
xmlAttrPtr attr,
const xmlChar * string)

Serialize text attribute values to an xml simple buffer

buf:the XML buffer output
doc:the document
attr:the attribute node
string:the text content

xmlBufContent ()

xmlChar *	xmlBufContent		(const xmlBufPtr buf)

Function to extract the content of a buffer

buf:the buffer
Returns:the internal content

xmlBufEnd ()

xmlChar *	xmlBufEnd		(const xmlBufPtr buf)

Function to extract the end of the content of a buffer

buf:the buffer
Returns:the end of the internal content or NULL in case of error

xmlBufGetNodeContent ()

int	xmlBufGetNodeContent		(xmlBufPtr buf, 
xmlNodePtr cur)

Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buffer with this value

buf:a buffer xmlBufPtr
cur:the node being read
Returns:0 in case of success and -1 in case of error.

xmlBufNodeDump ()

size_t	xmlBufNodeDump			(xmlBufPtr buf, 
xmlDocPtr doc,
xmlNodePtr cur,
int level,
int format)

Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

buf:the XML buffer output
doc:the document
cur:the current node
level:the imbrication level for indenting
format:is formatting allowed
Returns:the number of bytes written to the buffer, in case of error 0 is returned or @buf stores the error

xmlBufShrink ()

size_t	xmlBufShrink			(xmlBufPtr buf, 
size_t len)

Remove the beginning of an XML buffer. NOTE that this routine behaviour differs from xmlBufferShrink() as it will return 0 on error instead of -1 due to size_t being used as the return type.

buf:the buffer to dump
len:the number of xmlChar to remove
Returns:the number of byte removed or 0 in case of failure

xmlBufUse ()

size_t	xmlBufUse			(const xmlBufPtr buf)

Function to get the length of a buffer

buf:the buffer
Returns:the length of data in the internal content

xmlBufferAdd ()

int	xmlBufferAdd			(xmlBufferPtr buf, 
const xmlChar * str,
int len)

Add a string range to an XML buffer. if len == -1, the length of str is recomputed.

buf:the buffer to dump
str:the #xmlChar string
len:the number of #xmlChar to add
Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

xmlBufferAddHead ()

int	xmlBufferAddHead		(xmlBufferPtr buf, 
const xmlChar * str,
int len)

Add a string range to the beginning of an XML buffer. if len == -1, the length of @str is recomputed.

buf:the buffer
str:the #xmlChar string
len:the number of #xmlChar to add
Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

xmlBufferCCat ()

int	xmlBufferCCat			(xmlBufferPtr buf, 
const char * str)

Append a zero terminated C string to an XML buffer.

buf:the buffer to dump
str:the C char string
Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

xmlBufferCat ()

int	xmlBufferCat			(xmlBufferPtr buf, 
const xmlChar * str)

Append a zero terminated string to an XML buffer.

buf:the buffer to add to
str:the #xmlChar string
Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

xmlBufferContent ()

const xmlChar *	xmlBufferContent	(const xmlBufferPtr buf)

Function to extract the content of a buffer

buf:the buffer
Returns:the internal content

xmlBufferCreate ()

xmlBufferPtr	xmlBufferCreate		(void)

routine to create an XML buffer.

Returns:the new structure.

xmlBufferCreateSize ()

xmlBufferPtr	xmlBufferCreateSize	(size_t size)

routine to create an XML buffer.

size:initial size of buffer
Returns:the new structure.

xmlBufferCreateStatic ()

xmlBufferPtr	xmlBufferCreateStatic	(void * mem, 
size_t size)

routine to create an XML buffer from an immutable memory area. The area won't be modified nor copied, and is expected to be present until the end of the buffer lifetime.

mem:the memory area
size:the size in byte
Returns:the new structure.

xmlBufferDetach ()

xmlChar *	xmlBufferDetach		(xmlBufferPtr buf)

Remove the string contained in a buffer and gie it back to the caller. The buffer is reset to an empty content. This doesn't work with immutable buffers as they can't be reset.

buf:the buffer
Returns:the previous string contained by the buffer.

xmlBufferDump ()

int	xmlBufferDump			(FILE * file, 
xmlBufferPtr buf)

Dumps an XML buffer to a FILE *.

file:the file output
buf:the buffer to dump
Returns:the number of #xmlChar written

xmlBufferEmpty ()

void	xmlBufferEmpty			(xmlBufferPtr buf)

empty a buffer.

buf:the buffer

xmlBufferFree ()

void	xmlBufferFree			(xmlBufferPtr buf)

Frees an XML buffer. It frees both the content and the structure which encapsulate it.

buf:the buffer to free

xmlBufferGrow ()

int	xmlBufferGrow			(xmlBufferPtr buf, 
unsigned int len)

Grow the available space of an XML buffer.

buf:the buffer
len:the minimum free size to allocate
Returns:the new available space or -1 in case of error

xmlBufferLength ()

int	xmlBufferLength			(const xmlBufferPtr buf)

Function to get the length of a buffer

buf:the buffer
Returns:the length of data in the internal content

xmlBufferResize ()

int	xmlBufferResize			(xmlBufferPtr buf, 
unsigned int size)

Resize a buffer to accommodate minimum size of @size.

buf:the buffer to resize
size:the desired size
Returns:0 in case of problems, 1 otherwise

xmlBufferSetAllocationScheme ()

void	xmlBufferSetAllocationScheme	(xmlBufferPtr buf, 
xmlBufferAllocationScheme scheme)

Sets the allocation scheme for this buffer

buf:the buffer to tune
scheme:allocation scheme to use

xmlBufferShrink ()

int	xmlBufferShrink			(xmlBufferPtr buf, 
unsigned int len)

Remove the beginning of an XML buffer.

buf:the buffer to dump
len:the number of xmlChar to remove
Returns:the number of #xmlChar removed, or -1 in case of failure.

xmlBufferWriteCHAR ()

void	xmlBufferWriteCHAR		(xmlBufferPtr buf, 
const xmlChar * string)

routine which manages and grows an output buffer. This one adds xmlChars at the end of the buffer.

buf:the XML buffer
string:the string to add

xmlBufferWriteChar ()

void	xmlBufferWriteChar		(xmlBufferPtr buf, 
const char * string)

routine which manage and grows an output buffer. This one add C chars at the end of the array.

buf:the XML buffer output
string:the string to add

xmlBufferWriteQuotedString ()

void	xmlBufferWriteQuotedString	(xmlBufferPtr buf, 
const xmlChar * string)

routine which manage and grows an output buffer. This one writes a quoted or double quoted #xmlChar string, checking first if it holds quote or double-quotes internally

buf:the XML buffer output
string:the string to add

xmlBuildQName ()

xmlChar *	xmlBuildQName		(const xmlChar * ncname, 
const xmlChar * prefix,
xmlChar * memory,
int len)

Builds the QName @prefix:@ncname in @memory if there is enough space and prefix is not NULL nor empty, otherwise allocate a new string. If prefix is NULL or empty it returns ncname.

ncname:the Name
prefix:the prefix
memory:preallocated memory
len:preallocated memory length
Returns:the new string which must be freed by the caller if different from @memory and @ncname or NULL in case of error

xmlChildElementCount ()

unsigned long	xmlChildElementCount	(xmlNodePtr parent)

Finds the current number of child nodes of that element which are element nodes. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

parent:the parent node
Returns:the count of element child or 0 if not available

xmlCopyDoc ()

xmlDocPtr	xmlCopyDoc		(xmlDocPtr doc, 
int recursive)

Do a copy of the document info. If recursive, the content tree will be copied too as well as DTD, namespaces and entities.

doc:the document
recursive:if not zero do a recursive copy.
Returns:a new #xmlDocPtr, or NULL in case of error.

xmlCopyDtd ()

xmlDtdPtr	xmlCopyDtd		(xmlDtdPtr dtd)

Do a copy of the dtd.

dtd:the dtd
Returns:a new #xmlDtdPtr, or NULL in case of error.

xmlCopyNamespace ()

xmlNsPtr	xmlCopyNamespace	(xmlNsPtr cur)

Do a copy of the namespace.

cur:the namespace
Returns:a new #xmlNsPtr, or NULL in case of error.

xmlCopyNamespaceList ()

xmlNsPtr	xmlCopyNamespaceList	(xmlNsPtr cur)

Do a copy of an namespace list.

cur:the first namespace
Returns:a new #xmlNsPtr, or NULL in case of error.

xmlCopyNode ()

xmlNodePtr	xmlCopyNode		(const xmlNodePtr node, 
int extended)

Do a copy of the node.

node:the node
extended:if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable)
Returns:a new #xmlNodePtr, or NULL in case of error.

xmlCopyNodeList ()

xmlNodePtr	xmlCopyNodeList		(const xmlNodePtr node)

Do a recursive copy of the node list. Use xmlDocCopyNodeList() if possible to ensure string interning.

node:the first node in the list.
Returns:a new #xmlNodePtr, or NULL in case of error.

xmlCopyProp ()

xmlAttrPtr	xmlCopyProp		(xmlNodePtr target, 
xmlAttrPtr cur)

Do a copy of the attribute.

target:the element where the attribute will be grafted
cur:the attribute
Returns:a new #xmlAttrPtr, or NULL in case of error.

xmlCopyPropList ()

xmlAttrPtr	xmlCopyPropList		(xmlNodePtr target, 
xmlAttrPtr cur)

Do a copy of an attribute list.

target:the element where the attributes will be grafted
cur:the first attribute
Returns:a new #xmlAttrPtr, or NULL in case of error.

xmlCreateIntSubset ()

xmlDtdPtr	xmlCreateIntSubset	(xmlDocPtr doc, 
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Create the internal subset of a document

doc:the document pointer
name:the DTD name
ExternalID:the external (PUBLIC) ID
SystemID:the system ID
Returns:a pointer to the new DTD structure

xmlDOMWrapAdoptNode ()

int	xmlDOMWrapAdoptNode		(xmlDOMWrapCtxtPtr ctxt, 
xmlDocPtr sourceDoc,
xmlNodePtr node,
xmlDocPtr destDoc,
xmlNodePtr destParent,
int options)

References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc->oldNs entries are used This is the case when you have an unliked node and just want to move it to the context of If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. NOTE: This function was not intensively tested.

ctxt:the optional context for custom processing
sourceDoc:the optional sourceDoc
node:the node to start with
destDoc:the destination doc
destParent:the optional new parent of @node in @destDoc
options:option flags
Returns:0 if the operation succeeded, 1 if a node of unsupported type was given, 2 if a node of not yet supported type was given and -1 on API/internal errors.

xmlDOMWrapCloneNode ()

int	xmlDOMWrapCloneNode		(xmlDOMWrapCtxtPtr ctxt, 
xmlDocPtr sourceDoc,
xmlNodePtr node,
xmlNodePtr * resNode,
xmlDocPtr destDoc,
xmlNodePtr destParent,
int deep,
int options)

References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc->oldNs entries are used. This is the case when you don't know already where the cloned branch will be added to. If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. TODO: 1) What to do with XInclude? Currently this returns an error for XInclude.

ctxt:the optional context for custom processing
sourceDoc:the optional sourceDoc
node:the node to start with
resNode:the clone of the given @node
destDoc:the destination doc
destParent:the optional new parent of @node in @destDoc
deep:descend into child if set
options:option flags
Returns:0 if the operation succeeded, 1 if a node of unsupported (or not yet supported) type was given, -1 on API/internal errors.

xmlDOMWrapFreeCtxt ()

void	xmlDOMWrapFreeCtxt		(xmlDOMWrapCtxtPtr ctxt)

Frees the DOM-wrapper context.

ctxt:the DOM-wrapper context

xmlDOMWrapNewCtxt ()

xmlDOMWrapCtxtPtr	xmlDOMWrapNewCtxt	(void)

Allocates and initializes a new DOM-wrapper context.

Returns:the xmlDOMWrapCtxtPtr or NULL in case of an internal errror.

xmlDOMWrapReconcileNamespaces ()

int	xmlDOMWrapReconcileNamespaces	(xmlDOMWrapCtxtPtr ctxt, 
xmlNodePtr elem,
int options)

Ensures that ns-references point to ns-decls hold on element-nodes. Ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. NOTE: This function was not intensively tested.

ctxt:DOM wrapper context, unused at the moment
elem:the element-node
options:option flags
Returns:0 if succeeded, -1 otherwise and on API/internal errors.

xmlDOMWrapRemoveNode ()

int	xmlDOMWrapRemoveNode		(xmlDOMWrapCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr node,
int options)

Unlinks the given node from its owner. This will substitute ns-references to node->nsDef for ns-references to doc->oldNs, thus ensuring the removed branch to be autark wrt ns-references. NOTE: This function was not intensively tested.

ctxt:a DOM wrapper context
doc:the doc
node:the node to be removed.
options:set of options, unused at the moment
Returns:0 on success, 1 if the node is not supported, -1 on API and internal errors.

xmlDocCopyNode ()

xmlNodePtr	xmlDocCopyNode		(const xmlNodePtr node, 
xmlDocPtr doc,
int extended)

Do a copy of the node to a given document.

node:the node
doc:the document
extended:if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable)
Returns:a new #xmlNodePtr, or NULL in case of error.

xmlDocCopyNodeList ()

xmlNodePtr	xmlDocCopyNodeList	(xmlDocPtr doc, 
const xmlNodePtr node)

Do a recursive copy of the node list.

doc:the target document
node:the first node in the list.
Returns:a new #xmlNodePtr, or NULL in case of error.

xmlDocDump ()

int	xmlDocDump			(FILE * f, 
xmlDocPtr cur)

Dump an XML document to an open FILE.

f:the FILE*
cur:the document
Returns:the number of bytes written or -1 in case of failure.

xmlDocDumpFormatMemory ()

void	xmlDocDumpFormatMemory		(xmlDocPtr cur, 
xmlChar ** mem,
int * size,
int format)

Dump an XML document in memory and return the #xmlChar * and it's size. It's up to the caller to free the memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

cur:the document
mem:OUT: the memory pointer
size:OUT: the memory length
format:should formatting spaces been added

xmlDocDumpFormatMemoryEnc ()

void	xmlDocDumpFormatMemoryEnc	(xmlDocPtr out_doc, 
xmlChar ** doc_txt_ptr,
int * doc_txt_len,
const char * txt_encoding,
int format)

Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

out_doc:Document to generate XML text from
doc_txt_ptr:Memory pointer for allocated XML text
doc_txt_len:Length of the generated XML text
txt_encoding:Character encoding to use when generating XML text
format:should formatting spaces been added

xmlDocDumpMemory ()

void	xmlDocDumpMemory		(xmlDocPtr cur, 
xmlChar ** mem,
int * size)

Dump an XML document in memory and return the #xmlChar * and it's size in bytes. It's up to the caller to free the memory with xmlFree(). The resulting byte array is zero terminated, though the last 0 is not included in the returned size.

cur:the document
mem:OUT: the memory pointer
size:OUT: the memory length

xmlDocDumpMemoryEnc ()

void	xmlDocDumpMemoryEnc		(xmlDocPtr out_doc, 
xmlChar ** doc_txt_ptr,
int * doc_txt_len,
const char * txt_encoding)

Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree().

out_doc:Document to generate XML text from
doc_txt_ptr:Memory pointer for allocated XML text
doc_txt_len:Length of the generated XML text
txt_encoding:Character encoding to use when generating XML text

xmlDocFormatDump ()

int	xmlDocFormatDump		(FILE * f, 
xmlDocPtr cur,
int format)

Dump an XML document to an open FILE.

f:the FILE*
cur:the document
format:should formatting spaces been added
Returns:the number of bytes written or -1 in case of failure. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

xmlDocGetRootElement ()

xmlNodePtr	xmlDocGetRootElement	(xmlDocPtr doc)

Get the root element of the document (doc->children is a list containing possibly comments, PIs, etc ...).

doc:the document
Returns:the #xmlNodePtr for the root or NULL

xmlDocSetRootElement ()

xmlNodePtr	xmlDocSetRootElement	(xmlDocPtr doc, 
xmlNodePtr root)

Set the root element of the document (doc->children is a list containing possibly comments, PIs, etc ...).

doc:the document
root:the new document root element, if root is NULL no action is taken, to remove a node from a document use xmlUnlinkNode(root) instead.
Returns:the old root element if any was found, NULL if root was NULL

xmlElemDump ()

void	xmlElemDump			(FILE * f, 
xmlDocPtr doc,
xmlNodePtr cur)

Dump an XML/HTML node, recursive behaviour, children are printed too.

f:the FILE * for the output
doc:the document
cur:the current node

xmlFirstElementChild ()

xmlNodePtr	xmlFirstElementChild	(xmlNodePtr parent)

Finds the first child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

parent:the parent node
Returns:the first element child or NULL if not available

xmlFreeDoc ()

void	xmlFreeDoc			(xmlDocPtr cur)

Free up all the structures used by a document, tree included.

cur:pointer to the document

xmlFreeDtd ()

void	xmlFreeDtd			(xmlDtdPtr cur)

Free a DTD structure.

cur:the DTD structure to free up

xmlFreeNode ()

void	xmlFreeNode			(xmlNodePtr cur)

Free a node, this is a recursive behaviour, all the children are freed too. This doesn't unlink the child from the list, use xmlUnlinkNode() first.

cur:the node

xmlFreeNodeList ()

void	xmlFreeNodeList			(xmlNodePtr cur)

Free a node and all its siblings, this is a recursive behaviour, all the children are freed too.

cur:the first node in the list

xmlFreeNs ()

void	xmlFreeNs			(xmlNsPtr cur)

Free up the structures associated to a namespace

cur:the namespace pointer

xmlFreeNsList ()

void	xmlFreeNsList			(xmlNsPtr cur)

Free up all the structures associated to the chained namespaces.

cur:the first namespace pointer

xmlFreeProp ()

void	xmlFreeProp			(xmlAttrPtr cur)

Free one attribute, all the content is freed too

cur:an attribute

xmlFreePropList ()

void	xmlFreePropList			(xmlAttrPtr cur)

Free a property and all its siblings, all the children are freed too.

cur:the first property in the list

xmlGetBufferAllocationScheme ()

xmlBufferAllocationScheme	xmlGetBufferAllocationScheme	(void)

Types are XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, improves performance XML_BUFFER_ALLOC_HYBRID - use exact sizes on small strings to keep memory usage tight in normal usage, and doubleit on large strings to avoid pathological performance.

Returns:the current allocation scheme


xmlGetDocCompressMode ()

int	xmlGetDocCompressMode		(xmlDocPtr doc)

get the compression ratio for a document, ZLIB based

doc:the document
Returns:0 (uncompressed) to 9 (max compression)

xmlGetIntSubset ()

xmlDtdPtr	xmlGetIntSubset		(xmlDocPtr doc)

Get the internal subset of a document

doc:the document pointer
Returns:a pointer to the DTD structure or NULL if not found

xmlGetLastChild ()

xmlNodePtr	xmlGetLastChild		(xmlNodePtr parent)

Search the last child of a node.

parent:the parent node
Returns:the last child or NULL if none.

xmlGetLineNo ()

long	xmlGetLineNo			(xmlNodePtr node)

Get line number of @node. Try to override the limitation of lines being store in 16 bits ints if XML_PARSE_BIG_LINES parser option was used

node:valid node
Returns:the line number if successful, -1 otherwise

xmlGetNoNsProp ()

xmlChar *	xmlGetNoNsProp		(xmlNodePtr node, 
const xmlChar * name)

Search and get the value of an attribute associated to a node This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. This function is similar to xmlGetProp except it will accept only an attribute in no namespace.

node:the node
name:the attribute name
Returns:the attribute value or NULL if not found. It's up to the caller to free the memory with xmlFree().

xmlGetNodePath ()

xmlChar *	xmlGetNodePath		(xmlNodePtr node)

Build a structure based Path for the given node

node:a node
Returns:the new path or NULL in case of error. The caller must free the returned string

xmlGetNsList ()

xmlNsPtr *	xmlGetNsList		(xmlDocPtr doc, 
xmlNodePtr node)

Search all the namespace applying to a given element.

doc:the document
node:the current node
Returns:an NULL terminated array of all the #xmlNsPtr found that need to be freed by the caller or NULL if no namespace if defined

xmlGetNsProp ()

xmlChar *	xmlGetNsProp		(xmlNodePtr node, 
const xmlChar * name,
const xmlChar * nameSpace)

Search and get the value of an attribute associated to a node This attribute has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off.

node:the node
name:the attribute name
nameSpace:the URI of the namespace
Returns:the attribute value or NULL if not found. It's up to the caller to free the memory with xmlFree().

xmlGetProp ()

xmlChar *	xmlGetProp		(xmlNodePtr node, 
const xmlChar * name)

Search and get the value of an attribute associated to a node This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. NOTE: this function acts independently of namespaces associated to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp() for namespace aware processing.

node:the node
name:the attribute name
Returns:the attribute value or NULL if not found. It's up to the caller to free the memory with xmlFree().

xmlHasNsProp ()

xmlAttrPtr	xmlHasNsProp		(xmlNodePtr node, 
const xmlChar * name,
const xmlChar * nameSpace)

Search for an attribute associated to a node This attribute has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. Note that a namespace of NULL indicates to use the default namespace.

node:the node
name:the attribute name
nameSpace:the URI of the namespace
Returns:the attribute or the attribute declaration or NULL if neither was found.

xmlHasProp ()

xmlAttrPtr	xmlHasProp		(xmlNodePtr node, 
const xmlChar * name)

Search an attribute associated to a node This function also looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off.

node:the node
name:the attribute name
Returns:the attribute or the attribute declaration or NULL if neither was found.

xmlIsBlankNode ()

int	xmlIsBlankNode			(xmlNodePtr node)

Checks whether this node is an empty or whitespace only (and possibly ignorable) text-node.

node:the node
Returns:1 yes, 0 no

xmlIsXHTML ()

int	xmlIsXHTML			(const xmlChar * systemID, 
const xmlChar * publicID)

Try to find if the document correspond to an XHTML DTD

systemID:the system identifier
publicID:the public identifier
Returns:1 if true, 0 if not and -1 in case of error

xmlLastElementChild ()

xmlNodePtr	xmlLastElementChild	(xmlNodePtr parent)

Finds the last child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

parent:the parent node
Returns:the last element child or NULL if not available

xmlNewCDataBlock ()

xmlNodePtr	xmlNewCDataBlock	(xmlDocPtr doc, 
const xmlChar * content,
int len)

Creation of a new node containing a CDATA block.

doc:the document
content:the CDATA block content content
len:the length of the block
Returns:a pointer to the new node object.

xmlNewCharRef ()

xmlNodePtr	xmlNewCharRef		(xmlDocPtr doc, 
const xmlChar * name)

Creation of a new character reference node.

doc:the document
name:the char ref string, starting with # or "&# ... ;"
Returns:a pointer to the new node object.

xmlNewChild ()

xmlNodePtr	xmlNewChild		(xmlNodePtr parent, 
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content)

Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child list containing the TEXTs and ENTITY_REFs node will be created. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references. XML special chars must be escaped first by using xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used.

parent:the parent node
ns:a namespace if any
name:the name of the child
content:the XML content of the child if any.
Returns:a pointer to the new node object.

xmlNewComment ()

xmlNodePtr	xmlNewComment		(const xmlChar * content)

Creation of a new node containing a comment.

content:the comment content
Returns:a pointer to the new node object.

xmlNewDoc ()

xmlDocPtr	xmlNewDoc		(const xmlChar * version)

Creates a new XML document

version:xmlChar string giving the version of XML "1.0"
Returns:a new document

xmlNewDocComment ()

xmlNodePtr	xmlNewDocComment	(xmlDocPtr doc, 
const xmlChar * content)

Creation of a new node containing a comment within a document.

doc:the document
content:the comment content
Returns:a pointer to the new node object.

xmlNewDocFragment ()

xmlNodePtr	xmlNewDocFragment	(xmlDocPtr doc)

Creation of a new Fragment node.

doc:the document owning the fragment
Returns:a pointer to the new node object.

xmlNewDocNode ()

xmlNodePtr	xmlNewDocNode		(xmlDocPtr doc, 
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content)

Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support.

doc:the document
ns:namespace if any
name:the node name
content:the XML text content if any
Returns:a pointer to the new node object.

xmlNewDocNodeEatName ()

xmlNodePtr	xmlNewDocNodeEatName	(xmlDocPtr doc, 
xmlNsPtr ns,
xmlChar * name,
const xmlChar * content)

Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support.

doc:the document
ns:namespace if any
name:the node name
content:the XML text content if any
Returns:a pointer to the new node object.

xmlNewDocPI ()

xmlNodePtr	xmlNewDocPI		(xmlDocPtr doc, 
const xmlChar * name,
const xmlChar * content)

Creation of a processing instruction element.

doc:the target document
name:the processing instruction name
content:the PI content
Returns:a pointer to the new node object.

xmlNewDocProp ()

xmlAttrPtr	xmlNewDocProp		(xmlDocPtr doc, 
const xmlChar * name,
const xmlChar * value)

Create a new property carried by a document.

doc:the document
name:the name of the attribute
value:the value of the attribute
Returns:a pointer to the attribute

xmlNewDocRawNode ()

xmlNodePtr	xmlNewDocRawNode	(xmlDocPtr doc, 
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content)

Creation of a new node element within a document. @ns and @content are optional (NULL).

doc:the document
ns:namespace if any
name:the node name
content:the text content if any
Returns:a pointer to the new node object.

xmlNewDocText ()

xmlNodePtr	xmlNewDocText		(xmlDocPtr doc, 
const xmlChar * content)

Creation of a new text node within a document.

doc:the document
content:the text content
Returns:a pointer to the new node object.

xmlNewDocTextLen ()

xmlNodePtr	xmlNewDocTextLen	(xmlDocPtr doc, 
const xmlChar * content,
int len)

Creation of a new text node with an extra content length parameter. The text node pertain to a given document.

doc:the document
content:the text content
len:the text len.
Returns:a pointer to the new node object.

xmlNewDtd ()

xmlDtdPtr	xmlNewDtd		(xmlDocPtr doc, 
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Creation of a new DTD for the external subset. To create an internal subset, use xmlCreateIntSubset().

doc:the document pointer
name:the DTD name
ExternalID:the external ID
SystemID:the system ID
Returns:a pointer to the new DTD structure

xmlNewGlobalNs ()

xmlNsPtr	xmlNewGlobalNs		(xmlDocPtr doc, 
const xmlChar * href,
const xmlChar * prefix)

Creation of a Namespace, the old way using PI and without scoping DEPRECATED !!!

doc:the document carrying the namespace
href:the URI associated
prefix:the prefix for the namespace
Returns:NULL this functionality had been removed

xmlNewNode ()

xmlNodePtr	xmlNewNode		(xmlNsPtr ns, 
const xmlChar * name)

Creation of a new node element. @ns is optional (NULL).

ns:namespace if any
name:the node name
Returns:a pointer to the new node object. Uses xmlStrdup() to make copy of @name.

xmlNewNodeEatName ()

xmlNodePtr	xmlNewNodeEatName	(xmlNsPtr ns, 
xmlChar * name)

Creation of a new node element. @ns is optional (NULL).

ns:namespace if any
name:the node name
Returns:a pointer to the new node object, with pointer @name as new node's name. Use xmlNewNode() if a copy of @name string is is needed as new node's name.

xmlNewNs ()

xmlNsPtr	xmlNewNs		(xmlNodePtr node, 
const xmlChar * href,
const xmlChar * prefix)

Creation of a new Namespace. This function will refuse to create a namespace with a similar prefix than an existing one present on this node. We use href==NULL in the case of an element creation where the namespace was not defined.

node:the element carrying the namespace
href:the URI associated
prefix:the prefix for the namespace
Returns:a new namespace pointer or NULL

xmlNewNsProp ()

xmlAttrPtr	xmlNewNsProp		(xmlNodePtr node, 
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * value)

Create a new property tagged with a namespace and carried by a node.

node:the holding node
ns:the namespace
name:the name of the attribute
value:the value of the attribute
Returns:a pointer to the attribute

xmlNewNsPropEatName ()

xmlAttrPtr	xmlNewNsPropEatName	(xmlNodePtr node, 
xmlNsPtr ns,
xmlChar * name,
const xmlChar * value)

Create a new property tagged with a namespace and carried by a node.

node:the holding node
ns:the namespace
name:the name of the attribute
value:the value of the attribute
Returns:a pointer to the attribute

xmlNewPI ()

xmlNodePtr	xmlNewPI		(const xmlChar * name, 
const xmlChar * content)

Creation of a processing instruction element. Use xmlDocNewPI preferably to get string interning

name:the processing instruction name
content:the PI content
Returns:a pointer to the new node object.

xmlNewProp ()

xmlAttrPtr	xmlNewProp		(xmlNodePtr node, 
const xmlChar * name,
const xmlChar * value)

Create a new property carried by a node.

node:the holding node
name:the name of the attribute
value:the value of the attribute
Returns:a pointer to the attribute

xmlNewReference ()

xmlNodePtr	xmlNewReference		(xmlDocPtr doc, 
const xmlChar * name)

Creation of a new reference node.

doc:the document
name:the reference name, or the reference string with & and ;
Returns:a pointer to the new node object.

xmlNewText ()

xmlNodePtr	xmlNewText		(const xmlChar * content)

Creation of a new text node.

content:the text content
Returns:a pointer to the new node object.

xmlNewTextChild ()

xmlNodePtr	xmlNewTextChild		(xmlNodePtr parent, 
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * content)

Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child TEXT node will be created containing the string @content. NOTE: Use xmlNewChild() if @content will contain entities that need to be preserved. Use this function, xmlNewTextChild(), if you need to ensure that reserved XML chars that might appear in @content, such as the ampersand, greater-than or less-than signs, are automatically replaced by their XML escaped entity representations.

parent:the parent node
ns:a namespace if any
name:the name of the child
content:the text content of the child if any.
Returns:a pointer to the new node object.

xmlNewTextLen ()

xmlNodePtr	xmlNewTextLen		(const xmlChar * content, 
int len)

Creation of a new text node with an extra parameter for the content's length

content:the text content
len:the text len.
Returns:a pointer to the new node object.

xmlNextElementSibling ()

xmlNodePtr	xmlNextElementSibling	(xmlNodePtr node)

Finds the first closest next sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

node:the current node
Returns:the next element sibling or NULL if not available

xmlNodeAddContent ()

void	xmlNodeAddContent		(xmlNodePtr cur, 
const xmlChar * content)

Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContent(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported.

cur:the node being modified
content:extra content

xmlNodeAddContentLen ()

void	xmlNodeAddContentLen		(xmlNodePtr cur, 
const xmlChar * content,
int len)

Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContentLen(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported.

cur:the node being modified
content:extra content
len:the size of @content

xmlNodeBufGetContent ()

int	xmlNodeBufGetContent		(xmlBufferPtr buffer, 
xmlNodePtr cur)

Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buffer with this value

buffer:a buffer
cur:the node being read
Returns:0 in case of success and -1 in case of error.

xmlNodeDump ()

int	xmlNodeDump			(xmlBufferPtr buf, 
xmlDocPtr doc,
xmlNodePtr cur,
int level,
int format)

Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called Since this is using xmlBuffer structures it is limited to 2GB and somehow deprecated, use xmlBufNodeDump() instead.

buf:the XML buffer output
doc:the document
cur:the current node
level:the imbrication level for indenting
format:is formatting allowed
Returns:the number of bytes written to the buffer or -1 in case of error

xmlNodeDumpOutput ()

void	xmlNodeDumpOutput		(xmlOutputBufferPtr buf, 
xmlDocPtr doc,
xmlNodePtr cur,
int level,
int format,
const char * encoding)

Dump an XML node, recursive behaviour, children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

buf:the XML buffer output
doc:the document
cur:the current node
level:the imbrication level for indenting
format:is formatting allowed
encoding:an optional encoding string

xmlNodeGetBase ()

xmlChar *	xmlNodeGetBase		(xmlDocPtr doc, 
xmlNodePtr cur)

Searches for the BASE URL. The code should work on both XML and HTML document even if base mechanisms are completely different. It returns the base as defined in RFC 2396 sections 5.1.1. Base URI within Document Content and 5.1.2. Base URI from the Encapsulating Entity However it does not return the document base (5.1.3), use doc->URL in this case

doc:the document the node pertains to
cur:the node being checked
Returns:a pointer to the base URL, or NULL if not found It's up to the caller to free the memory with xmlFree().

xmlNodeGetContent ()

xmlChar *	xmlNodeGetContent	(xmlNodePtr cur)

Read the value of a node, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted.

cur:the node being read
Returns:a new #xmlChar * or NULL if no content is available. It's up to the caller to free the memory with xmlFree().

xmlNodeGetLang ()

xmlChar *	xmlNodeGetLang		(xmlNodePtr cur)

Searches the language of a node, i.e. the values of the xml:lang attribute or the one carried by the nearest ancestor.

cur:the node being checked
Returns:a pointer to the lang value, or NULL if not found It's up to the caller to free the memory with xmlFree().

xmlNodeGetSpacePreserve ()

int	xmlNodeGetSpacePreserve		(xmlNodePtr cur)

Searches the space preserving behaviour of a node, i.e. the values of the xml:space attribute or the one carried by the nearest ancestor.

cur:the node being checked
Returns:-1 if xml:space is not inherited, 0 if "default", 1 if "preserve"

xmlNodeIsText ()

int	xmlNodeIsText			(xmlNodePtr node)

Is this node a Text node ?

node:the node
Returns:1 yes, 0 no

xmlNodeListGetRawString ()

xmlChar *	xmlNodeListGetRawString	(xmlDocPtr doc, 
xmlNodePtr list,
int inLine)

Builds the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString() this function doesn't do any character encoding handling.

doc:the document
list:a Node list
inLine:should we replace entity contents or show their external form
Returns:a pointer to the string copy, the caller must free it with xmlFree().

xmlNodeListGetString ()

xmlChar *	xmlNodeListGetString	(xmlDocPtr doc, 
xmlNodePtr list,
int inLine)

Build the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs

doc:the document
list:a Node list
inLine:should we replace entity contents or show their external form
Returns:a pointer to the string copy, the caller must free it with xmlFree().

xmlNodeSetBase ()

void	xmlNodeSetBase			(xmlNodePtr cur, 
const xmlChar * uri)

Set (or reset) the base URI of a node, i.e. the value of the xml:base attribute.

cur:the node being changed
uri:the new base URI

xmlNodeSetContent ()

void	xmlNodeSetContent		(xmlNodePtr cur, 
const xmlChar * content)

Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().

cur:the node being modified
content:the new value of the content

xmlNodeSetContentLen ()

void	xmlNodeSetContentLen		(xmlNodePtr cur, 
const xmlChar * content,
int len)

Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().

cur:the node being modified
content:the new value of the content
len:the size of @content

xmlNodeSetLang ()

void	xmlNodeSetLang			(xmlNodePtr cur, 
const xmlChar * lang)

Set the language of a node, i.e. the values of the xml:lang attribute.

cur:the node being changed
lang:the language description

xmlNodeSetName ()

void	xmlNodeSetName			(xmlNodePtr cur, 
const xmlChar * name)

Set (or reset) the name of a node.

cur:the node being changed
name:the new tag name

xmlNodeSetSpacePreserve ()

void	xmlNodeSetSpacePreserve		(xmlNodePtr cur, 
int val)

Set (or reset) the space preserving behaviour of a node, i.e. the value of the xml:space attribute.

cur:the node being changed
val:the xml:space value ("0": default, 1: "preserve")

xmlPreviousElementSibling ()

xmlNodePtr	xmlPreviousElementSibling	(xmlNodePtr node)

Finds the first closest previous sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

node:the current node
Returns:the previous element sibling or NULL if not available

xmlReconciliateNs ()

int	xmlReconciliateNs		(xmlDocPtr doc, 
xmlNodePtr tree)

This function checks that all the namespaces declared within the given tree are properly declared. This is needed for example after Copy or Cut and then paste operations. The subtree may still hold pointers to namespace declarations outside the subtree or invalid/masked. As much as possible the function try to reuse the existing namespaces found in the new environment. If not possible the new namespaces are redeclared on @tree at the top of the given subtree.

doc:the document
tree:a node defining the subtree to reconciliate
Returns:the number of namespace declarations created or -1 in case of error.

xmlRemoveProp ()

int	xmlRemoveProp			(xmlAttrPtr cur)

Unlink and free one attribute, all the content is freed too Note this doesn't work for namespace definition attributes

cur:an attribute
Returns:0 if success and -1 in case of error.

xmlReplaceNode ()

xmlNodePtr	xmlReplaceNode		(xmlNodePtr old, 
xmlNodePtr cur)

Unlink the old node from its current context, prune the new one at the same place. If @cur was already inserted in a document it is first unlinked from its existing context.

old:the old node
cur:the node
Returns:the @old node

xmlSaveFile ()

int	xmlSaveFile			(const char * filename, 
xmlDocPtr cur)

Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used.

filename:the filename (or URL)
cur:the document
Returns:the number of bytes written or -1 in case of failure.

xmlSaveFileEnc ()

int	xmlSaveFileEnc			(const char * filename, 
xmlDocPtr cur,
const char * encoding)

Dump an XML document, converting it to the given encoding

filename:the filename (or URL)
cur:the document
encoding:the name of an encoding (or NULL)
Returns:the number of bytes written or -1 in case of failure.

xmlSaveFileTo ()

int	xmlSaveFileTo			(xmlOutputBufferPtr buf, 
xmlDocPtr cur,
const char * encoding)

Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.

buf:an output I/O buffer
cur:the document
encoding:the encoding if any assuming the I/O layer handles the trancoding
Returns:the number of bytes written or -1 in case of failure.

xmlSaveFormatFile ()

int	xmlSaveFormatFile		(const char * filename, 
xmlDocPtr cur,
int format)

Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used. If @format is set then the document will be indented on output. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

filename:the filename (or URL)
cur:the document
format:should formatting spaces been added
Returns:the number of bytes written or -1 in case of failure.

xmlSaveFormatFileEnc ()

int	xmlSaveFormatFileEnc		(const char * filename, 
xmlDocPtr cur,
const char * encoding,
int format)

Dump an XML document to a file or an URL.

filename:the filename or URL to output
cur:the document being saved
encoding:the name of the encoding to use or NULL.
format:should formatting spaces be added.
Returns:the number of bytes written or -1 in case of error. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

xmlSaveFormatFileTo ()

int	xmlSaveFormatFileTo		(xmlOutputBufferPtr buf, 
xmlDocPtr cur,
const char * encoding,
int format)

Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.

buf:an output I/O buffer
cur:the document
encoding:the encoding if any assuming the I/O layer handles the trancoding
format:should formatting spaces been added
Returns:the number of bytes written or -1 in case of failure.

xmlSearchNs ()

xmlNsPtr	xmlSearchNs		(xmlDocPtr doc, 
xmlNodePtr node,
const xmlChar * nameSpace)

Search a Ns registered under a given name space for a document. recurse on the parents until it finds the defined namespace or return NULL otherwise. @nameSpace can be NULL, this is a search for the default namespace. We don't allow to cross entities boundaries. If you don't declare the namespace within those you will be in troubles !!! A warning is generated to cover this case.

doc:the document
node:the current node
nameSpace:the namespace prefix
Returns:the namespace pointer or NULL.

xmlSearchNsByHref ()

xmlNsPtr	xmlSearchNsByHref	(xmlDocPtr doc, 
xmlNodePtr node,
const xmlChar * href)

Search a Ns aliasing a given URI. Recurse on the parents until it finds the defined namespace or return NULL otherwise.

doc:the document
node:the current node
href:the namespace value
Returns:the namespace pointer or NULL.

xmlSetBufferAllocationScheme ()

void	xmlSetBufferAllocationScheme	(xmlBufferAllocationScheme scheme)

Set the buffer allocation method. Types are XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, improves performance

scheme:allocation method to use


xmlSetDocCompressMode ()

void	xmlSetDocCompressMode		(xmlDocPtr doc, 
int mode)

set the compression ratio for a document, ZLIB based Correct values: 0 (uncompressed) to 9 (max compression)

doc:the document
mode:the compression ratio

xmlSetListDoc ()

void	xmlSetListDoc			(xmlNodePtr list, 
xmlDocPtr doc)

update all nodes in the list to point to the right document

list:the first element
doc:the document

xmlSetNs ()

void	xmlSetNs			(xmlNodePtr node, 
xmlNsPtr ns)

Associate a namespace to a node, a posteriori.

node:a node in the document
ns:a namespace pointer

xmlSetNsProp ()

xmlAttrPtr	xmlSetNsProp		(xmlNodePtr node, 
xmlNsPtr ns,
const xmlChar * name,
const xmlChar * value)

Set (or reset) an attribute carried by a node. The ns structure must be in scope, this is not checked

node:the node
ns:the namespace definition
name:the attribute name
value:the attribute value
Returns:the attribute pointer.

xmlSetProp ()

xmlAttrPtr	xmlSetProp		(xmlNodePtr node, 
const xmlChar * name,
const xmlChar * value)

Set (or reset) an attribute carried by a node. If @name has a prefix, then the corresponding namespace-binding will be used, if in scope; it is an error it there's no such ns-binding for the prefix in scope.

node:the node
name:the attribute name (a QName)
value:the attribute value
Returns:the attribute pointer.

xmlSetTreeDoc ()

void	xmlSetTreeDoc			(xmlNodePtr tree, 
xmlDocPtr doc)

update all nodes under the tree to point to the right document

tree:the top element
doc:the document

xmlSplitQName2 ()

xmlChar *	xmlSplitQName2		(const xmlChar * name, 
xmlChar ** prefix)

parse an XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName

name:the full QName
prefix:a xmlChar **
Returns:NULL if not a QName, otherwise the local part, and prefix is updated to get the Prefix if any.

xmlSplitQName3 ()

const xmlChar *	xmlSplitQName3		(const xmlChar * name, 
int * len)

parse an XML qualified name string,i

name:the full QName
len:an int *
Returns:NULL if it is not a Qualified Name, otherwise, update len with the length in byte of the prefix and return a pointer to the start of the name without the prefix

xmlStringGetNodeList ()

xmlNodePtr	xmlStringGetNodeList	(xmlDocPtr doc, 
const xmlChar * value)

Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs.

doc:the document
value:the value of the attribute
Returns:a pointer to the first child

xmlStringLenGetNodeList ()

xmlNodePtr	xmlStringLenGetNodeList	(xmlDocPtr doc, 
const xmlChar * value,
int len)

Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs.

doc:the document
value:the value of the text
len:the length of the string value
Returns:a pointer to the first child

xmlTextConcat ()

int	xmlTextConcat			(xmlNodePtr node, 
const xmlChar * content,
int len)

Concat the given string at the end of the existing node content

node:the node
content:the content
len:@content length
Returns:-1 in case of error, 0 otherwise

xmlTextMerge ()

xmlNodePtr	xmlTextMerge		(xmlNodePtr first, 
xmlNodePtr second)

Merge two text nodes into one

first:the first text node
second:the second text node being merged
Returns:the first text node augmented

xmlUnlinkNode ()

void	xmlUnlinkNode			(xmlNodePtr cur)

Unlink a node from it's current context, the node is not freed If one need to free the node, use xmlFreeNode() routine after the unlink to discard it. Note that namespace nodes can't be unlinked as they do not have pointer to their parent.

cur:the node

xmlUnsetNsProp ()

int	xmlUnsetNsProp			(xmlNodePtr node, 
xmlNsPtr ns,
const xmlChar * name)

Remove an attribute carried by a node.

node:the node
ns:the namespace definition
name:the attribute name
Returns:0 if successful, -1 if not found

xmlUnsetProp ()

int	xmlUnsetProp			(xmlNodePtr node, 
const xmlChar * name)

Remove an attribute carried by a node. This handles only attributes in no namespace.

node:the node
name:the attribute name
Returns:0 if successful, -1 if not found

xmlValidateNCName ()

int	xmlValidateNCName		(const xmlChar * value, 
int space)

Check that a value conforms to the lexical space of NCName

value:the value to check
space:allow spaces in front and end of the string
Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

xmlValidateNMToken ()

int	xmlValidateNMToken		(const xmlChar * value, 
int space)

Check that a value conforms to the lexical space of NMToken

value:the value to check
space:allow spaces in front and end of the string
Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

xmlValidateName ()

int	xmlValidateName			(const xmlChar * value, 
int space)

Check that a value conforms to the lexical space of Name

value:the value to check
space:allow spaces in front and end of the string
Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

xmlValidateQName ()

int	xmlValidateQName		(const xmlChar * value, 
int space)

Check that a value conforms to the lexical space of QName

value:the value to check
space:allow spaces in front and end of the string
Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-hash.html0000644000175000017500000012210712134171044020130 0ustar aronaron hash: Chained hash tables

hash

hash - Chained hash tables

This module implements the hash table support used in various places in the library.

Author(s): Bjorn Reese <bjorn.reese@systematic.dk>

Synopsis

#define XML_CAST_FPTR(fptr);
typedef struct _xmlHashTable xmlHashTable;
typedef xmlHashTable * xmlHashTablePtr;
void	xmlHashScanFull			(xmlHashTablePtr table, 
xmlHashScannerFull f,
void * data); void xmlHashScan (xmlHashTablePtr table,
xmlHashScanner f,
void * data); typedef void xmlHashScannerFull (void * payload,
void * data,
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3); xmlHashTablePtr xmlHashCreateDict (int size,
xmlDictPtr dict); int xmlHashAddEntry (xmlHashTablePtr table,
const xmlChar * name,
void * userdata); int xmlHashUpdateEntry (xmlHashTablePtr table,
const xmlChar * name,
void * userdata,
xmlHashDeallocator f); void * xmlHashQLookup3 (xmlHashTablePtr table,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * prefix2,
const xmlChar * name2,
const xmlChar * prefix3,
const xmlChar * name3); void * xmlHashQLookup2 (xmlHashTablePtr table,
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * prefix2,
const xmlChar * name2); void xmlHashScan3 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
xmlHashScanner f,
void * data); typedef void xmlHashScanner (void * payload,
void * data,
xmlChar * name); typedef void xmlHashDeallocator (void * payload,
xmlChar * name); xmlHashTablePtr xmlHashCreate (int size); void xmlHashFree (xmlHashTablePtr table,
xmlHashDeallocator f); void * xmlHashLookup (xmlHashTablePtr table,
const xmlChar * name); void * xmlHashQLookup (xmlHashTablePtr table,
const xmlChar * prefix,
const xmlChar * name); int xmlHashUpdateEntry2 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
void * userdata,
xmlHashDeallocator f); int xmlHashRemoveEntry2 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
xmlHashDeallocator f); int xmlHashRemoveEntry3 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
xmlHashDeallocator f); xmlHashTablePtr xmlHashCopy (xmlHashTablePtr table,
xmlHashCopier f); void xmlHashScanFull3 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
xmlHashScannerFull f,
void * data); int xmlHashUpdateEntry3 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
void * userdata,
xmlHashDeallocator f); void * xmlHashLookup3 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3); void * xmlHashLookup2 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2); int xmlHashRemoveEntry (xmlHashTablePtr table,
const xmlChar * name,
xmlHashDeallocator f); typedef void * xmlHashCopier (void * payload,
xmlChar * name); int xmlHashAddEntry2 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
void * userdata); int xmlHashAddEntry3 (xmlHashTablePtr table,
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
void * userdata); int xmlHashSize (xmlHashTablePtr table);

Description

Details

Macro XML_CAST_FPTR

#define XML_CAST_FPTR(fptr);

Macro to do a casting from an object pointer to a function pointer without encountering a warning from gcc #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) This macro violated ISO C aliasing rules (gcc4 on s390 broke) so it is disabled now

fptr:pointer to a function

Structure xmlHashTable

struct _xmlHashTable {
The content of this structure is not made public by the API.
} xmlHashTable;


Typedef xmlHashTablePtr

xmlHashTable * xmlHashTablePtr;


Function type xmlHashCopier

void *	xmlHashCopier			(void * payload, 
xmlChar * name)

Callback to copy data from a hash.

payload:the data in the hash
name:the name associated
Returns:a copy of the data or NULL in case of error.

Function type xmlHashDeallocator

void	xmlHashDeallocator		(void * payload, 
xmlChar * name)

Callback to free data from a hash.

payload:the data in the hash
name:the name associated

Function type xmlHashScanner

void	xmlHashScanner			(void * payload, 
void * data,
xmlChar * name)

Callback when scanning data in a hash with the simple scanner.

payload:the data in the hash
data:extra scannner data
name:the name associated

Function type xmlHashScannerFull

void	xmlHashScannerFull		(void * payload, 
void * data,
const
xmlChar * name,
const xmlChar * name2,
const xmlChar * name3)

Callback when scanning data in a hash with the full scanner.

payload:the data in the hash
data:extra scannner data
name:the name associated
name2:the second name associated
name3:the third name associated

xmlHashAddEntry ()

int	xmlHashAddEntry			(xmlHashTablePtr table, 
const xmlChar * name,
void * userdata)

Add the @userdata to the hash @table. This can later be retrieved by using the @name. Duplicate names generate errors.

table:the hash table
name:the name of the userdata
userdata:a pointer to the userdata
Returns:0 the addition succeeded and -1 in case of error.

xmlHashAddEntry2 ()

int	xmlHashAddEntry2		(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
void * userdata)

Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Duplicate tuples generate errors.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
userdata:a pointer to the userdata
Returns:0 the addition succeeded and -1 in case of error.

xmlHashAddEntry3 ()

int	xmlHashAddEntry3		(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
void * userdata)

Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Duplicate entries generate errors.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
name3:a third name of the userdata
userdata:a pointer to the userdata
Returns:0 the addition succeeded and -1 in case of error.

xmlHashCopy ()

xmlHashTablePtr	xmlHashCopy		(xmlHashTablePtr table, 
xmlHashCopier f)

Scan the hash @table and applied @f to each value.

table:the hash table
f:the copier function for items in the hash
Returns:the new table or NULL in case of error.

xmlHashCreate ()

xmlHashTablePtr	xmlHashCreate		(int size)

Create a new xmlHashTablePtr.

size:the size of the hash table
Returns:the newly created object, or NULL if an error occured.

xmlHashCreateDict ()

xmlHashTablePtr	xmlHashCreateDict	(int size, 
xmlDictPtr dict)

Create a new xmlHashTablePtr which will use @dict as the internal dictionary

size:the size of the hash table
dict:a dictionary to use for the hash
Returns:the newly created object, or NULL if an error occured.

xmlHashFree ()

void	xmlHashFree			(xmlHashTablePtr table, 
xmlHashDeallocator f)

Free the hash @table and its contents. The userdata is deallocated with @f if provided.

table:the hash table
f:the deallocator function for items in the hash

xmlHashLookup ()

void *	xmlHashLookup			(xmlHashTablePtr table, 
const xmlChar * name)

Find the userdata specified by the @name.

table:the hash table
name:the name of the userdata
Returns:the pointer to the userdata

xmlHashLookup2 ()

void *	xmlHashLookup2			(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2)

Find the userdata specified by the (@name, @name2) tuple.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
Returns:the pointer to the userdata

xmlHashLookup3 ()

void *	xmlHashLookup3			(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3)

Find the userdata specified by the (@name, @name2, @name3) tuple.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
name3:a third name of the userdata
Returns:the a pointer to the userdata

xmlHashQLookup ()

void *	xmlHashQLookup			(xmlHashTablePtr table, 
const xmlChar * prefix,
const xmlChar * name)

Find the userdata specified by the QName @prefix:@name/@name.

table:the hash table
prefix:the prefix of the userdata
name:the name of the userdata
Returns:the pointer to the userdata

xmlHashQLookup2 ()

void *	xmlHashQLookup2			(xmlHashTablePtr table, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * prefix2,
const xmlChar * name2)

Find the userdata specified by the QNames tuple

table:the hash table
prefix:the prefix of the userdata
name:the name of the userdata
prefix2:the second prefix of the userdata
name2:a second name of the userdata
Returns:the pointer to the userdata

xmlHashQLookup3 ()

void *	xmlHashQLookup3			(xmlHashTablePtr table, 
const xmlChar * prefix,
const xmlChar * name,
const xmlChar * prefix2,
const xmlChar * name2,
const xmlChar * prefix3,
const xmlChar * name3)

Find the userdata specified by the (@name, @name2, @name3) tuple.

table:the hash table
prefix:the prefix of the userdata
name:the name of the userdata
prefix2:the second prefix of the userdata
name2:a second name of the userdata
prefix3:the third prefix of the userdata
name3:a third name of the userdata
Returns:the a pointer to the userdata

xmlHashRemoveEntry ()

int	xmlHashRemoveEntry		(xmlHashTablePtr table, 
const xmlChar * name,
xmlHashDeallocator f)

Find the userdata specified by the @name and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.

table:the hash table
name:the name of the userdata
f:the deallocator function for removed item (if any)
Returns:0 if the removal succeeded and -1 in case of error or not found.

xmlHashRemoveEntry2 ()

int	xmlHashRemoveEntry2		(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
xmlHashDeallocator f)

Find the userdata specified by the (@name, @name2) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
f:the deallocator function for removed item (if any)
Returns:0 if the removal succeeded and -1 in case of error or not found.

xmlHashRemoveEntry3 ()

int	xmlHashRemoveEntry3		(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
xmlHashDeallocator f)

Find the userdata specified by the (@name, @name2, @name3) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
name3:a third name of the userdata
f:the deallocator function for removed item (if any)
Returns:0 if the removal succeeded and -1 in case of error or not found.

xmlHashScan ()

void	xmlHashScan			(xmlHashTablePtr table, 
xmlHashScanner f,
void * data)

Scan the hash @table and applied @f to each value.

table:the hash table
f:the scanner function for items in the hash
data:extra data passed to f

xmlHashScan3 ()

void	xmlHashScan3			(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
xmlHashScanner f,
void * data)

Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match.

table:the hash table
name:the name of the userdata or NULL
name2:a second name of the userdata or NULL
name3:a third name of the userdata or NULL
f:the scanner function for items in the hash
data:extra data passed to f

xmlHashScanFull ()

void	xmlHashScanFull			(xmlHashTablePtr table, 
xmlHashScannerFull f,
void * data)

Scan the hash @table and applied @f to each value.

table:the hash table
f:the scanner function for items in the hash
data:extra data passed to f

xmlHashScanFull3 ()

void	xmlHashScanFull3		(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
xmlHashScannerFull f,
void * data)

Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match.

table:the hash table
name:the name of the userdata or NULL
name2:a second name of the userdata or NULL
name3:a third name of the userdata or NULL
f:the scanner function for items in the hash
data:extra data passed to f

xmlHashSize ()

int	xmlHashSize			(xmlHashTablePtr table)

Query the number of elements installed in the hash @table.

table:the hash table
Returns:the number of elements in the hash table or -1 in case of error

xmlHashUpdateEntry ()

int	xmlHashUpdateEntry		(xmlHashTablePtr table, 
const xmlChar * name,
void * userdata,
xmlHashDeallocator f)

Add the @userdata to the hash @table. This can later be retrieved by using the @name. Existing entry for this @name will be removed and freed with @f if found.

table:the hash table
name:the name of the userdata
userdata:a pointer to the userdata
f:the deallocator function for replaced item (if any)
Returns:0 the addition succeeded and -1 in case of error.

xmlHashUpdateEntry2 ()

int	xmlHashUpdateEntry2		(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
void * userdata,
xmlHashDeallocator f)

Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Existing entry for this tuple will be removed and freed with @f if found.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
userdata:a pointer to the userdata
f:the deallocator function for replaced item (if any)
Returns:0 the addition succeeded and -1 in case of error.

xmlHashUpdateEntry3 ()

int	xmlHashUpdateEntry3		(xmlHashTablePtr table, 
const xmlChar * name,
const xmlChar * name2,
const xmlChar * name3,
void * userdata,
xmlHashDeallocator f)

Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Existing entry for this tuple will be removed and freed with @f if found.

table:the hash table
name:the name of the userdata
name2:a second name of the userdata
name3:a third name of the userdata
userdata:a pointer to the userdata
f:the deallocator function for replaced item (if any)
Returns:0 the addition succeeded and -1 in case of error.

libxml2-2.9.1+dfsg1/doc/devhelp/up.png0000644000175000017500000000062611234335462016111 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2.œE€Ù#IDATxœí“=JÄ@F¿o‰] !+¤œ2…Å[ZÌ<@/á<€¥…XÛ Ú­20v±³ˆÂ…Ïj0»lþvV°ðA`˜ ïÍ ð—t*iùâHÒ­~xR~'IUUÉ9ç#OÁ‘my–eJÓTeY†GvÉ@x¤O#ß;2E>9²|t$DÞ9nnBäíÈjµò‘BRIsIªë:HîŸ8ŽU…œùëùPÖÚN™1fc­sNÎ95Mã§–ɵ¤ ׿ŸØŒ1~¸pEòe$ïIž°€Ç î7nrDòf!;Ã`¨çÝ'äykíÎI’øáû䲤sI_]ÿÇy—‡‘€ÅÀ^^I>O>Á¡ø­§²š?YBIEND®B`‚libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-SAX2.html0000644000175000017500000011535312134171043017726 0ustar aronaron SAX2: SAX2 parser interface used to build the DOM tree

SAX2

SAX2 - SAX2 parser interface used to build the DOM tree

those are the default SAX2 interfaces used by the library when building DOM tree.

Author(s): Daniel Veillard

Synopsis

void	xmlSAX2EndElementNs		(void * ctx, 
const xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI); void xmlSAX2Reference (void * ctx,
const xmlChar * name); void xmlSAX2ElementDecl (void * ctx,
const xmlChar * name,
int type,
xmlElementContentPtr content); void xmlSAX2AttributeDecl (void * ctx,
const xmlChar * elem,
const xmlChar * fullname,
int type,
int def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree); void xmlSAX2Comment (void * ctx,
const xmlChar * value); int xmlSAX2GetColumnNumber (void * ctx); xmlEntityPtr xmlSAX2GetEntity (void * ctx,
const xmlChar * name); void xmlSAX2UnparsedEntityDecl (void * ctx,
const xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId,
const xmlChar * notationName); void xmlSAX2InitDocbDefaultSAXHandler (xmlSAXHandler * hdlr); int xmlSAXVersion (xmlSAXHandler * hdlr,
int version); void xmlSAX2IgnorableWhitespace (void * ctx,
const xmlChar * ch,
int len); void xmlSAX2NotationDecl (void * ctx,
const xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId); void xmlSAX2StartDocument (void * ctx); void xmlSAX2EndElement (void * ctx,
const xmlChar * name); xmlParserInputPtr xmlSAX2ResolveEntity (void * ctx,
const xmlChar * publicId,
const xmlChar * systemId); void xmlSAX2ExternalSubset (void * ctx,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); const xmlChar * xmlSAX2GetPublicId (void * ctx); int xmlSAX2IsStandalone (void * ctx); void xmlSAX2EndDocument (void * ctx); void xmlSAX2ProcessingInstruction (void * ctx,
const xmlChar * target,
const xmlChar * data); void xmlSAX2InternalSubset (void * ctx,
const xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID); void xmlSAX2Characters (void * ctx,
const xmlChar * ch,
int len); int xmlSAXDefaultVersion (int version); void xmlSAX2StartElement (void * ctx,
const xmlChar * fullname,
const xmlChar ** atts); void xmlSAX2SetDocumentLocator (void * ctx,
xmlSAXLocatorPtr loc); void xmlSAX2CDataBlock (void * ctx,
const xmlChar * value,
int len); void xmlSAX2StartElementNs (void * ctx,
const xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI,
int nb_namespaces,
const xmlChar ** namespaces,
int nb_attributes,
int nb_defaulted,
const xmlChar ** attributes); int xmlSAX2HasExternalSubset (void * ctx); void htmlDefaultSAXHandlerInit (void); int xmlSAX2GetLineNumber (void * ctx); int xmlSAX2HasInternalSubset (void * ctx); void xmlSAX2InitHtmlDefaultSAXHandler (xmlSAXHandler * hdlr); void docbDefaultSAXHandlerInit (void); void xmlDefaultSAXHandlerInit (void); void xmlSAX2InitDefaultSAXHandler (xmlSAXHandler * hdlr,
int warning); xmlEntityPtr xmlSAX2GetParameterEntity (void * ctx,
const xmlChar * name); const xmlChar * xmlSAX2GetSystemId (void * ctx); void xmlSAX2EntityDecl (void * ctx,
const xmlChar * name,
int type,
const xmlChar * publicId,
const xmlChar * systemId,
xmlChar * content);

Description

Details




xmlSAX2AttributeDecl ()

void	xmlSAX2AttributeDecl		(void * ctx, 
const
xmlChar * elem,
const xmlChar * fullname,
int type,
int def,
const xmlChar * defaultValue,
xmlEnumerationPtr tree)

An attribute definition has been parsed

ctx:the user data (XML parser context)
elem:the name of the element
fullname:the attribute name
type:the attribute type
def:the type of default value
defaultValue:the attribute default value
tree:the tree of enumerated value set

xmlSAX2CDataBlock ()

void	xmlSAX2CDataBlock		(void * ctx, 
const
xmlChar * value,
int len)

called when a pcdata block has been parsed

ctx:the user data (XML parser context)
value:The pcdata content
len:the block length

xmlSAX2Characters ()

void	xmlSAX2Characters		(void * ctx, 
const
xmlChar * ch,
int len)

receiving some chars from the parser.

ctx:the user data (XML parser context)
ch:a xmlChar string
len:the number of xmlChar

xmlSAX2Comment ()

void	xmlSAX2Comment			(void * ctx, 
const
xmlChar * value)

A xmlSAX2Comment has been parsed.

ctx:the user data (XML parser context)
value:the xmlSAX2Comment content

xmlSAX2ElementDecl ()

void	xmlSAX2ElementDecl		(void * ctx, 
const
xmlChar * name,
int type,
xmlElementContentPtr content)

An element definition has been parsed

ctx:the user data (XML parser context)
name:the element name
type:the element type
content:the element value tree


xmlSAX2EndElement ()

void	xmlSAX2EndElement		(void * ctx, 
const
xmlChar * name)

called when the end of an element has been detected.

ctx:the user data (XML parser context)
name:The element name

xmlSAX2EndElementNs ()

void	xmlSAX2EndElementNs		(void * ctx, 
const
xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI)

SAX2 callback when an element end has been detected by the parser. It provides the namespace informations for the element.

ctx:the user data (XML parser context)
localname:the local name of the element
prefix:the element namespace prefix if available
URI:the element namespace name if available

xmlSAX2EntityDecl ()

void	xmlSAX2EntityDecl		(void * ctx, 
const
xmlChar * name,
int type,
const xmlChar * publicId,
const xmlChar * systemId,
xmlChar * content)

An entity definition has been parsed

ctx:the user data (XML parser context)
name:the entity name
type:the entity type
publicId:The public ID of the entity
systemId:The system ID of the entity
content:the entity value (without processing).

xmlSAX2ExternalSubset ()

void	xmlSAX2ExternalSubset		(void * ctx, 
const
xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Callback on external subset declaration.

ctx:the user data (XML parser context)
name:the root element name
ExternalID:the external ID
SystemID:the SYSTEM ID (e.g. filename or URL)


xmlSAX2GetEntity ()

xmlEntityPtr	xmlSAX2GetEntity	(void * ctx, 
const xmlChar * name)

Get an entity by name

ctx:the user data (XML parser context)
name:The entity name
Returns:the xmlEntityPtr if found.


xmlSAX2GetParameterEntity ()

xmlEntityPtr	xmlSAX2GetParameterEntity	(void * ctx, 
const xmlChar * name)

Get a parameter entity by name

ctx:the user data (XML parser context)
name:The entity name
Returns:the xmlEntityPtr if found.

xmlSAX2GetPublicId ()

const xmlChar *	xmlSAX2GetPublicId	(void * ctx)

Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN"

ctx:the user data (XML parser context)
Returns:a xmlChar *

xmlSAX2GetSystemId ()

const xmlChar *	xmlSAX2GetSystemId	(void * ctx)

Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd

ctx:the user data (XML parser context)
Returns:a xmlChar *



xmlSAX2IgnorableWhitespace ()

void	xmlSAX2IgnorableWhitespace	(void * ctx, 
const
xmlChar * ch,
int len)

receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use xmlSAX2Characters

ctx:the user data (XML parser context)
ch:a xmlChar string
len:the number of xmlChar

xmlSAX2InitDefaultSAXHandler ()

void	xmlSAX2InitDefaultSAXHandler	(xmlSAXHandler * hdlr, 
int warning)

Initialize the default XML SAX2 handler

hdlr:the SAX handler
warning:flag if non-zero sets the handler warning procedure

xmlSAX2InitDocbDefaultSAXHandler ()

void	xmlSAX2InitDocbDefaultSAXHandler	(xmlSAXHandler * hdlr)

Initialize the default DocBook SAX2 handler

hdlr:the SAX handler

xmlSAX2InitHtmlDefaultSAXHandler ()

void	xmlSAX2InitHtmlDefaultSAXHandler	(xmlSAXHandler * hdlr)

Initialize the default HTML SAX2 handler

hdlr:the SAX handler

xmlSAX2InternalSubset ()

void	xmlSAX2InternalSubset		(void * ctx, 
const
xmlChar * name,
const xmlChar * ExternalID,
const xmlChar * SystemID)

Callback on internal subset declaration.

ctx:the user data (XML parser context)
name:the root element name
ExternalID:the external ID
SystemID:the SYSTEM ID (e.g. filename or URL)


xmlSAX2NotationDecl ()

void	xmlSAX2NotationDecl		(void * ctx, 
const
xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId)

What to do when a notation declaration has been parsed.

ctx:the user data (XML parser context)
name:The name of the notation
publicId:The public ID of the entity
systemId:The system ID of the entity

xmlSAX2ProcessingInstruction ()

void	xmlSAX2ProcessingInstruction	(void * ctx, 
const
xmlChar * target,
const xmlChar * data)

A processing instruction has been parsed.

ctx:the user data (XML parser context)
target:the target name
data:the PI data's

xmlSAX2Reference ()

void	xmlSAX2Reference		(void * ctx, 
const
xmlChar * name)

called when an entity xmlSAX2Reference is detected.

ctx:the user data (XML parser context)
name:The entity name

xmlSAX2ResolveEntity ()

xmlParserInputPtr	xmlSAX2ResolveEntity	(void * ctx, 
const xmlChar * publicId,
const xmlChar * systemId)

The entity loader, to control the loading of external entities, the application can either: - override this xmlSAX2ResolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine

ctx:the user data (XML parser context)
publicId:The public ID of the entity
systemId:The system ID of the entity
Returns:the xmlParserInputPtr if inlined or NULL for DOM behaviour.

xmlSAX2SetDocumentLocator ()

void	xmlSAX2SetDocumentLocator	(void * ctx, 
xmlSAXLocatorPtr loc)

Receive the document locator at startup, actually xmlDefaultSAXLocator Everything is available on the context, so this is useless in our case.

ctx:the user data (XML parser context)
loc:A SAX Locator


xmlSAX2StartElement ()

void	xmlSAX2StartElement		(void * ctx, 
const
xmlChar * fullname,
const xmlChar ** atts)

called when an opening tag has been processed.

ctx:the user data (XML parser context)
fullname:The element name, including namespace prefix
atts:An array of name/value attributes pairs, NULL terminated

xmlSAX2StartElementNs ()

void	xmlSAX2StartElementNs		(void * ctx, 
const
xmlChar * localname,
const xmlChar * prefix,
const xmlChar * URI,
int nb_namespaces,
const xmlChar ** namespaces,
int nb_attributes,
int nb_defaulted,
const xmlChar ** attributes)

SAX2 callback when an element start has been detected by the parser. It provides the namespace informations for the element, as well as the new namespace declarations on the element.

ctx:the user data (XML parser context)
localname:the local name of the element
prefix:the element namespace prefix if available
URI:the element namespace name if available
nb_namespaces:number of namespace definitions on that node
namespaces:pointer to the array of prefix/URI pairs namespace definitions
nb_attributes:the number of attributes on that node
nb_defaulted:the number of defaulted attributes.
attributes:pointer to the array of (localname/prefix/URI/value/end) attribute values.

xmlSAX2UnparsedEntityDecl ()

void	xmlSAX2UnparsedEntityDecl	(void * ctx, 
const
xmlChar * name,
const xmlChar * publicId,
const xmlChar * systemId,
const xmlChar * notationName)

What to do when an unparsed entity declaration is parsed

ctx:the user data (XML parser context)
name:The name of the entity
publicId:The public ID of the entity
systemId:The system ID of the entity
notationName:the name of the notation


xmlSAXVersion ()

int	xmlSAXVersion			(xmlSAXHandler * hdlr, 
int version)

Initialize the default XML SAX handler according to the version

hdlr:the SAX handler
version:the version, 1 or 2
Returns:0 in case of success and -1 in case of error.

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-dict.html0000644000175000017500000003241612134171043020132 0ustar aronaron dict: string dictionnary

dict

dict - string dictionnary

dictionary of reusable strings, just used to avoid allocation and freeing operations.

Author(s): Daniel Veillard

Synopsis

typedef struct _xmlDict xmlDict;
typedef xmlDict * xmlDictPtr;
size_t	xmlDictGetUsage			(xmlDictPtr dict);
int	xmlDictReference		(xmlDictPtr dict);
void	xmlDictCleanup			(void);
int	xmlDictSize			(xmlDictPtr dict);
const xmlChar *	xmlDictExists		(xmlDictPtr dict, 
const xmlChar * name,
int len); size_t xmlDictSetLimit (xmlDictPtr dict,
size_t limit); int xmlDictOwns (xmlDictPtr dict,
const xmlChar * str); const xmlChar * xmlDictQLookup (xmlDictPtr dict,
const xmlChar * prefix,
const xmlChar * name); int xmlInitializeDict (void); xmlDictPtr xmlDictCreateSub (xmlDictPtr sub); void xmlDictFree (xmlDictPtr dict); const xmlChar * xmlDictLookup (xmlDictPtr dict,
const xmlChar * name,
int len); xmlDictPtr xmlDictCreate (void);

Description

Details

Structure xmlDict

struct _xmlDict {
The content of this structure is not made public by the API.
} xmlDict;


Typedef xmlDictPtr

xmlDict * xmlDictPtr;



xmlDictCreate ()

xmlDictPtr	xmlDictCreate		(void)

Create a new dictionary

Returns:the newly created dictionnary, or NULL if an error occured.

xmlDictCreateSub ()

xmlDictPtr	xmlDictCreateSub	(xmlDictPtr sub)

Create a new dictionary, inheriting strings from the read-only dictionnary @sub. On lookup, strings are first searched in the new dictionnary, then in @sub, and if not found are created in the new dictionnary.

sub:an existing dictionnary
Returns:the newly created dictionnary, or NULL if an error occured.

xmlDictExists ()

const xmlChar *	xmlDictExists		(xmlDictPtr dict, 
const xmlChar * name,
int len)

Check if the @name exists in the dictionnary @dict.

dict:the dictionnary
name:the name of the userdata
len:the length of the name, if -1 it is recomputed
Returns:the internal copy of the name or NULL if not found.

xmlDictFree ()

void	xmlDictFree			(xmlDictPtr dict)

Free the hash @dict and its contents. The userdata is deallocated with @f if provided.

dict:the dictionnary

xmlDictGetUsage ()

size_t	xmlDictGetUsage			(xmlDictPtr dict)

Get how much memory is used by a dictionary for strings Added in 2.9.0

dict:the dictionnary
Returns:the amount of strings allocated

xmlDictLookup ()

const xmlChar *	xmlDictLookup		(xmlDictPtr dict, 
const xmlChar * name,
int len)

Add the @name to the dictionnary @dict if not present.

dict:the dictionnary
name:the name of the userdata
len:the length of the name, if -1 it is recomputed
Returns:the internal copy of the name or NULL in case of internal error

xmlDictOwns ()

int	xmlDictOwns			(xmlDictPtr dict, 
const xmlChar * str)

check if a string is owned by the disctionary

dict:the dictionnary
str:the string
Returns:1 if true, 0 if false and -1 in case of error -1 in case of error

xmlDictQLookup ()

const xmlChar *	xmlDictQLookup		(xmlDictPtr dict, 
const xmlChar * prefix,
const xmlChar * name)

Add the QName @prefix:@name to the hash @dict if not present.

dict:the dictionnary
prefix:the prefix
name:the name
Returns:the internal copy of the QName or NULL in case of internal error

xmlDictReference ()

int	xmlDictReference		(xmlDictPtr dict)

Increment the reference counter of a dictionary

dict:the dictionnary
Returns:0 in case of success and -1 in case of error

xmlDictSetLimit ()

size_t	xmlDictSetLimit			(xmlDictPtr dict, 
size_t limit)

Set a size limit for the dictionary Added in 2.9.0

dict:the dictionnary
limit:the limit in bytes
Returns:the previous limit of the dictionary or 0

xmlDictSize ()

int	xmlDictSize			(xmlDictPtr dict)

Query the number of elements installed in the hash @dict.

dict:the dictionnary
Returns:the number of elements in the dictionnary or -1 in case of error


libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-parserInternals.html0000644000175000017500000036465512134171044022401 0ustar aronaron parserInternals: internals routines and limits exported by the parser.

parserInternals

parserInternals - internals routines and limits exported by the parser.

this module exports a number of internal parsing routines they are not really all intended for applications but can prove useful doing low level processing.

Author(s): Daniel Veillard

Synopsis

#define XML_SUBSTITUTE_REF;
#define IS_BLANK(c);
#define IS_BYTE_CHAR(c);
#define IS_PUBIDCHAR(c);
#define IS_DIGIT_CH(c);
#define IS_EXTENDER(c);
#define IS_ASCII_DIGIT(c);
#define IS_COMBINING_CH(c);
#define IS_CHAR(c);
#define IS_LETTER(c);
#define IS_IDEOGRAPHIC(c);
#define MOVETO_STARTTAG(p);
#define XML_MAX_NAME_LENGTH;
#define IS_ASCII_LETTER(c);
#define IS_DIGIT(c);
#define XML_MAX_DICTIONARY_LIMIT;
#define XML_SUBSTITUTE_PEREF;
#define MOVETO_ENDTAG(p);
#define SKIP_EOL(p);
#define IS_EXTENDER_CH(c);
#define IS_BLANK_CH(c);
#define IS_LETTER_CH(c);
#define XML_MAX_LOOKUP_LIMIT;
#define XML_MAX_TEXT_LENGTH;
#define XML_SUBSTITUTE_NONE;
#define IS_COMBINING(c);
#define XML_MAX_NAMELEN;
#define IS_BASECHAR(c);
#define INPUT_CHUNK;
#define IS_PUBIDCHAR_CH(c);
#define IS_CHAR_CH(c);
#define XML_SUBSTITUTE_BOTH;
xmlNodePtr	nodePop			(xmlParserCtxtPtr ctxt);
void	xmlParseNotationDecl		(xmlParserCtxtPtr ctxt);
void	xmlParseExternalSubset		(xmlParserCtxtPtr ctxt, 
const xmlChar * ExternalID,
const xmlChar * SystemID); void xmlParseMisc (xmlParserCtxtPtr ctxt); int xmlSwitchInputEncoding (xmlParserCtxtPtr ctxt,
xmlParserInputPtr input,
xmlCharEncodingHandlerPtr handler); xmlParserInputPtr xmlNewStringInputStream (xmlParserCtxtPtr ctxt,
const xmlChar * buffer); xmlChar * xmlParseExternalID (xmlParserCtxtPtr ctxt,
xmlChar ** publicID,
int strict); xmlChar * xmlScanName (xmlParserCtxtPtr ctxt); int xmlParseElementDecl (xmlParserCtxtPtr ctxt); void xmlParseMarkupDecl (xmlParserCtxtPtr ctxt); htmlParserCtxtPtr htmlCreateFileParserCtxt (const char * filename,
const char * encoding); int inputPush (xmlParserCtxtPtr ctxt,
xmlParserInputPtr value); xmlChar * xmlStringLenDecodeEntities (xmlParserCtxtPtr ctxt,
const xmlChar * str,
int len,
int what,
xmlChar end,
xmlChar end2,
xmlChar end3); const xmlChar * namePop (xmlParserCtxtPtr ctxt); void xmlParseContent (xmlParserCtxtPtr ctxt); xmlParserInputPtr xmlNewInputStream (xmlParserCtxtPtr ctxt); xmlChar * xmlNamespaceParseQName (xmlParserCtxtPtr ctxt,
xmlChar ** prefix); xmlParserInputPtr xmlNewInputFromFile (xmlParserCtxtPtr ctxt,
const char * filename); void xmlParserHandlePEReference (xmlParserCtxtPtr ctxt); xmlChar * xmlStringDecodeEntities (xmlParserCtxtPtr ctxt,
const xmlChar * str,
int what,
xmlChar end,
xmlChar end2,
xmlChar end3); xmlParserCtxtPtr xmlCreateFileParserCtxt (const char * filename); int xmlParseCharRef (xmlParserCtxtPtr ctxt); void xmlParseElement (xmlParserCtxtPtr ctxt); void xmlParseTextDecl (xmlParserCtxtPtr ctxt); xmlParserInputPtr xmlNewEntityInputStream (xmlParserCtxtPtr ctxt,
xmlEntityPtr entity); int xmlCopyCharMultiByte (xmlChar * out,
int val); xmlElementContentPtr xmlParseElementChildrenContentDecl (xmlParserCtxtPtr ctxt,
int inputchk); void xmlParseCharData (xmlParserCtxtPtr ctxt,
int cdata); xmlChar * xmlParseVersionInfo (xmlParserCtxtPtr ctxt); int xmlParseSDDecl (xmlParserCtxtPtr ctxt); int xmlParseEnumeratedType (xmlParserCtxtPtr ctxt,
xmlEnumerationPtr * tree); void xmlHandleEntity (xmlParserCtxtPtr ctxt,
xmlEntityPtr entity); int xmlCurrentChar (xmlParserCtxtPtr ctxt,
int * len); int xmlSkipBlankChars (xmlParserCtxtPtr ctxt); xmlEnumerationPtr xmlParseNotationType (xmlParserCtxtPtr ctxt); void xmlParserInputShrink (xmlParserInputPtr in); void xmlSetEntityReferenceFunc (xmlEntityReferenceFunc func); void xmlFreeInputStream (xmlParserInputPtr input); void xmlParsePEReference (xmlParserCtxtPtr ctxt); xmlParserCtxtPtr xmlCreateURLParserCtxt (const char * filename,
int options); int xmlIsLetter (int c); int xmlCheckLanguageID (const xmlChar * lang); void xmlNextChar (xmlParserCtxtPtr ctxt); xmlEnumerationPtr xmlParseEnumerationType (xmlParserCtxtPtr ctxt); int xmlParseAttributeType (xmlParserCtxtPtr ctxt,
xmlEnumerationPtr * tree); int xmlParseDefaultDecl (xmlParserCtxtPtr ctxt,
xmlChar ** value); xmlChar * xmlParseSystemLiteral (xmlParserCtxtPtr ctxt); xmlChar * xmlParseAttValue (xmlParserCtxtPtr ctxt); xmlParserCtxtPtr xmlCreateMemoryParserCtxt (const char * buffer,
int size); void xmlParseAttributeListDecl (xmlParserCtxtPtr ctxt); const xmlChar * xmlParseName (xmlParserCtxtPtr ctxt); xmlChar * xmlParseEncName (xmlParserCtxtPtr ctxt); int nodePush (xmlParserCtxtPtr ctxt,
xmlNodePtr value); int xmlSwitchEncoding (xmlParserCtxtPtr ctxt,
xmlCharEncoding enc); int xmlSwitchToEncoding (xmlParserCtxtPtr ctxt,
xmlCharEncodingHandlerPtr handler); xmlEntityPtr xmlParseEntityRef (xmlParserCtxtPtr ctxt); const xmlChar * xmlParseAttribute (xmlParserCtxtPtr ctxt,
xmlChar ** value); void xmlParseEndTag (xmlParserCtxtPtr ctxt); const xmlChar * xmlParseEncodingDecl (xmlParserCtxtPtr ctxt); void htmlInitAutoClose (void); xmlParserCtxtPtr xmlCreateEntityParserCtxt (const xmlChar * URL,
const xmlChar * ID,
const xmlChar * base); xmlChar * xmlSplitQName (xmlParserCtxtPtr ctxt,
const xmlChar * name,
xmlChar ** prefix); void xmlParserHandleReference (xmlParserCtxtPtr ctxt); const xmlChar * xmlParsePITarget (xmlParserCtxtPtr ctxt); int xmlParseElementContentDecl (xmlParserCtxtPtr ctxt,
const xmlChar * name,
xmlElementContentPtr * result); xmlParserInputPtr inputPop (xmlParserCtxtPtr ctxt); xmlChar xmlPopInput (xmlParserCtxtPtr ctxt); xmlChar * xmlParsePubidLiteral (xmlParserCtxtPtr ctxt); int xmlPushInput (xmlParserCtxtPtr ctxt,
xmlParserInputPtr input); xmlChar * xmlParseEntityValue (xmlParserCtxtPtr ctxt,
xmlChar ** orig); xmlChar * xmlDecodeEntities (xmlParserCtxtPtr ctxt,
int len,
int what,
xmlChar end,
xmlChar end2,
xmlChar end3); xmlChar * xmlParseVersionNum (xmlParserCtxtPtr ctxt); void xmlParseXMLDecl (xmlParserCtxtPtr ctxt); typedef void xmlEntityReferenceFunc (xmlEntityPtr ent,
xmlNodePtr firstNode,
xmlNodePtr lastNode); xmlElementContentPtr xmlParseElementMixedContentDecl (xmlParserCtxtPtr ctxt,
int inputchk); xmlChar * xmlParseQuotedString (xmlParserCtxtPtr ctxt); xmlChar * xmlNamespaceParseNSDef (xmlParserCtxtPtr ctxt); void xmlParseCDSect (xmlParserCtxtPtr ctxt); int xmlStringCurrentChar (xmlParserCtxtPtr ctxt,
const xmlChar * cur,
int * len); void xmlParseComment (xmlParserCtxtPtr ctxt); void xmlErrMemory (xmlParserCtxtPtr ctxt,
const char * extra); xmlChar * xmlNamespaceParseNCName (xmlParserCtxtPtr ctxt); xmlChar * xmlParseNmtoken (xmlParserCtxtPtr ctxt); void xmlParseReference (xmlParserCtxtPtr ctxt); int namePush (xmlParserCtxtPtr ctxt,
const xmlChar * value); void xmlParseNamespace (xmlParserCtxtPtr ctxt); int xmlCopyChar (int len,
xmlChar * out,
int val); void xmlParsePI (xmlParserCtxtPtr ctxt); void xmlParseDocTypeDecl (xmlParserCtxtPtr ctxt); const xmlChar * xmlParseStartTag (xmlParserCtxtPtr ctxt); void xmlParseEntityDecl (xmlParserCtxtPtr ctxt);

Description

Details

Macro INPUT_CHUNK

#define INPUT_CHUNK;

The parser tries to always have that amount of input ready. One of the point is providing context when reporting errors.


Macro IS_ASCII_DIGIT

#define IS_ASCII_DIGIT(c);

Macro to check [0-9]

c:an xmlChar value

Macro IS_ASCII_LETTER

#define IS_ASCII_LETTER(c);

Macro to check [a-zA-Z]

c:an xmlChar value

Macro IS_BASECHAR

#define IS_BASECHAR(c);

Macro to check the following production in the XML spec: [85] BaseChar ::= ... long list see REC ...

c:an UNICODE value (int)

Macro IS_BLANK

#define IS_BLANK(c);

Macro to check the following production in the XML spec: [3] S ::= (#x20 | #x9 | #xD | #xA)+

c:an UNICODE value (int)

Macro IS_BLANK_CH

#define IS_BLANK_CH(c);

Behaviour same as IS_BLANK

c:an xmlChar value (normally unsigned char)

Macro IS_BYTE_CHAR

#define IS_BYTE_CHAR(c);

Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20...] any byte character in the accepted range

c:an byte value (int)

Macro IS_CHAR

#define IS_CHAR(c);

Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.

c:an UNICODE value (int)

Macro IS_CHAR_CH

#define IS_CHAR_CH(c);

Behaves like IS_CHAR on single-byte value

c:an xmlChar (usually an unsigned char)

Macro IS_COMBINING

#define IS_COMBINING(c);

Macro to check the following production in the XML spec: [87] CombiningChar ::= ... long list see REC ...

c:an UNICODE value (int)

Macro IS_COMBINING_CH

#define IS_COMBINING_CH(c);

Always false (all combining chars > 0xff)

c:an xmlChar (usually an unsigned char)

Macro IS_DIGIT

#define IS_DIGIT(c);

Macro to check the following production in the XML spec: [88] Digit ::= ... long list see REC ...

c:an UNICODE value (int)

Macro IS_DIGIT_CH

#define IS_DIGIT_CH(c);

Behaves like IS_DIGIT but with a single byte argument

c:an xmlChar value (usually an unsigned char)

Macro IS_EXTENDER

#define IS_EXTENDER(c);

Macro to check the following production in the XML spec: [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]

c:an UNICODE value (int)

Macro IS_EXTENDER_CH

#define IS_EXTENDER_CH(c);

Behaves like IS_EXTENDER but with a single-byte argument

c:an xmlChar value (usually an unsigned char)

Macro IS_IDEOGRAPHIC

#define IS_IDEOGRAPHIC(c);

Macro to check the following production in the XML spec: [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]

c:an UNICODE value (int)

Macro IS_LETTER

#define IS_LETTER(c);

Macro to check the following production in the XML spec: [84] Letter ::= BaseChar | Ideographic

c:an UNICODE value (int)

Macro IS_LETTER_CH

#define IS_LETTER_CH(c);

Macro behaves like IS_LETTER, but only check base chars

c:an xmlChar value (normally unsigned char)

Macro IS_PUBIDCHAR

#define IS_PUBIDCHAR(c);

Macro to check the following production in the XML spec: [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

c:an UNICODE value (int)

Macro IS_PUBIDCHAR_CH

#define IS_PUBIDCHAR_CH(c);

Same as IS_PUBIDCHAR but for single-byte value

c:an xmlChar value (normally unsigned char)

Macro MOVETO_ENDTAG

#define MOVETO_ENDTAG(p);

Skips to the next '>' char.

p:and UTF8 string pointer

Macro MOVETO_STARTTAG

#define MOVETO_STARTTAG(p);

Skips to the next '<' char.

p:and UTF8 string pointer

Macro SKIP_EOL

#define SKIP_EOL(p);

Skips the end of line chars.

p:and UTF8 string pointer

Macro XML_MAX_DICTIONARY_LIMIT

#define XML_MAX_DICTIONARY_LIMIT;

Maximum size allowed by the parser for a dictionary by default This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Introduced in 2.9.0


Macro XML_MAX_LOOKUP_LIMIT

#define XML_MAX_LOOKUP_LIMIT;

Maximum size allowed by the parser for ahead lookup This is an upper boundary enforced by the parser to avoid bad behaviour on "unfriendly' content Introduced in 2.9.0


Macro XML_MAX_NAMELEN

#define XML_MAX_NAMELEN;

Identifiers can be longer, but this will be more costly at runtime.


Macro XML_MAX_NAME_LENGTH

#define XML_MAX_NAME_LENGTH;

Maximum size allowed for a markup identitier This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Note that with the use of parsing dictionaries overriding the limit may result in more runtime memory usage in face of "unfriendly' content Introduced in 2.9.0


Macro XML_MAX_TEXT_LENGTH

#define XML_MAX_TEXT_LENGTH;

Maximum size allowed for a single text node when building a tree. This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Introduced in 2.9.0


Macro XML_SUBSTITUTE_BOTH

#define XML_SUBSTITUTE_BOTH;

Both general and parameter entities need to be substituted.


Macro XML_SUBSTITUTE_NONE

#define XML_SUBSTITUTE_NONE;

If no entities need to be substituted.


Macro XML_SUBSTITUTE_PEREF

#define XML_SUBSTITUTE_PEREF;

Whether parameter entities need to be substituted.


Macro XML_SUBSTITUTE_REF

#define XML_SUBSTITUTE_REF;

Whether general entities need to be substituted.


Function type xmlEntityReferenceFunc

void	xmlEntityReferenceFunc		(xmlEntityPtr ent, 
xmlNodePtr firstNode,
xmlNodePtr lastNode)

Callback function used when one needs to be able to track back the provenance of a chunk of nodes inherited from an entity replacement.

ent:the entity
firstNode:the fist node in the chunk
lastNode:the last nod in the chunk

Variable xmlParserMaxDepth

unsigned int xmlParserMaxDepth;


Variable xmlStringComment

const xmlCharxmlStringComment[] xmlStringComment;


Variable xmlStringText

const xmlCharxmlStringText[] xmlStringText;


Variable xmlStringTextNoenc

const xmlCharxmlStringTextNoenc[] xmlStringTextNoenc;


htmlCreateFileParserCtxt ()

htmlParserCtxtPtr	htmlCreateFileParserCtxt	(const char * filename, 
const char * encoding)

Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

filename:the filename
encoding:a free form C string describing the HTML document encoding, or NULL
Returns:the new parser context or NULL


inputPop ()

xmlParserInputPtr	inputPop	(xmlParserCtxtPtr ctxt)

Pops the top parser input from the input stack

ctxt:an XML parser context
Returns:the input just removed

inputPush ()

int	inputPush			(xmlParserCtxtPtr ctxt, 
xmlParserInputPtr value)

Pushes a new parser input on top of the input stack

ctxt:an XML parser context
value:the parser input
Returns:-1 in case of error, the index in the stack otherwise

namePop ()

const xmlChar *	namePop			(xmlParserCtxtPtr ctxt)

Pops the top element name from the name stack

ctxt:an XML parser context
Returns:the name just removed

namePush ()

int	namePush			(xmlParserCtxtPtr ctxt, 
const xmlChar * value)

Pushes a new element name on top of the name stack

ctxt:an XML parser context
value:the element name
Returns:-1 in case of error, the index in the stack otherwise

nodePop ()

xmlNodePtr	nodePop			(xmlParserCtxtPtr ctxt)

Pops the top element node from the node stack

ctxt:an XML parser context
Returns:the node just removed

nodePush ()

int	nodePush			(xmlParserCtxtPtr ctxt, 
xmlNodePtr value)

Pushes a new element node on top of the node stack

ctxt:an XML parser context
value:the element node
Returns:-1 in case of error, the index in the stack otherwise

xmlCheckLanguageID ()

int	xmlCheckLanguageID		(const xmlChar * lang)

Checks that the value conforms to the LanguageID production: NOTE: this is somewhat deprecated, those productions were removed from the XML Second edition. [33] LanguageID ::= Langcode ('-' Subcode)* [34] Langcode ::= ISO639Code | IanaCode | UserCode [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ [38] Subcode ::= ([a-z] | [A-Z])+ The current REC reference the sucessors of RFC 1766, currently 5646 http://www.rfc-editor.org/rfc/rfc5646.txt langtag = language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse] language = 2*3ALPHA ; shortest ISO 639 code ["-" extlang] ; sometimes followed by ; extended language subtags / 4ALPHA ; or reserved for future use / 5*8ALPHA ; or registered language subtag extlang = 3ALPHA ; selected ISO 639 codes *2("-" 3ALPHA) ; permanently reserved script = 4ALPHA ; ISO 15924 code region = 2ALPHA ; ISO 3166-1 code / 3DIGIT ; UN M.49 code variant = 5*8alphanum ; registered variants / (DIGIT 3alphanum) extension = singleton 1*("-" (2*8alphanum)) ; Single alphanumerics ; "x" reserved for private use singleton = DIGIT ; 0 - 9 / %x41-57 ; A - W / %x59-5A ; Y - Z / %x61-77 ; a - w / %x79-7A ; y - z it sounds right to still allow Irregular i-xxx IANA and user codes too The parser below doesn't try to cope with extension or privateuse that could be added but that's not interoperable anyway

lang:pointer to the string value
Returns:1 if correct 0 otherwise

xmlCopyChar ()

int	xmlCopyChar			(int len, 
xmlChar * out,
int val)

append the char value in the array

len:Ignored, compatibility
out:pointer to an array of xmlChar
val:the char value
Returns:the number of xmlChar written

xmlCopyCharMultiByte ()

int	xmlCopyCharMultiByte		(xmlChar * out, 
int val)

append the char value in the array

out:pointer to an array of xmlChar
val:the char value
Returns:the number of xmlChar written

xmlCreateEntityParserCtxt ()

xmlParserCtxtPtr	xmlCreateEntityParserCtxt	(const xmlChar * URL, 
const xmlChar * ID,
const xmlChar * base)

Create a parser context for an external entity Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

URL:the entity URL
ID:the entity PUBLIC ID
base:a possible base for the target URI
Returns:the new parser context or NULL

xmlCreateFileParserCtxt ()

xmlParserCtxtPtr	xmlCreateFileParserCtxt	(const char * filename)

Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

filename:the filename
Returns:the new parser context or NULL

xmlCreateMemoryParserCtxt ()

xmlParserCtxtPtr	xmlCreateMemoryParserCtxt	(const char * buffer, 
int size)

Create a parser context for an XML in-memory document.

buffer:a pointer to a char array
size:the size of the array
Returns:the new parser context or NULL

xmlCreateURLParserCtxt ()

xmlParserCtxtPtr	xmlCreateURLParserCtxt	(const char * filename, 
int options)

Create a parser context for a file or URL content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time and for file accesses

filename:the filename or URL
options:a combination of xmlParserOption
Returns:the new parser context or NULL

xmlCurrentChar ()

int	xmlCurrentChar			(xmlParserCtxtPtr ctxt, 
int * len)

The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer. Implement the end of line normalization: 2.11 End-of-Line Handling Wherever an external parsed entity or the literal entity value of an internal parsed entity contains either the literal two-character sequence "#xD#xA" or a standalone literal #xD, an XML processor must pass to the application the single character #xA. This behavior can conveniently be produced by normalizing all line breaks to #xA on input, before parsing.)

ctxt:the XML parser context
len:pointer to the length of the char read
Returns:the current char value and its length

xmlDecodeEntities ()

xmlChar *	xmlDecodeEntities	(xmlParserCtxtPtr ctxt, 
int len,
int what,
xmlChar end,
xmlChar end2,
xmlChar end3)

This function is deprecated, we now always process entities content through xmlStringDecodeEntities TODO: remove it in next major release. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'

ctxt:the parser context
len:the len to decode (in bytes !), -1 for no size limit
what:combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF
end:an end marker xmlChar, 0 if none
end2:an end marker xmlChar, 0 if none
end3:an end marker xmlChar, 0 if none
Returns:A newly allocated string with the substitution done. The caller must deallocate it !

xmlErrMemory ()

void	xmlErrMemory			(xmlParserCtxtPtr ctxt, 
const char * extra)

Handle a redefinition of attribute error

ctxt:an XML parser context
extra:extra informations


xmlHandleEntity ()

void	xmlHandleEntity			(xmlParserCtxtPtr ctxt, 
xmlEntityPtr entity)

Default handling of defined entities, when should we define a new input stream ? When do we just handle that as a set of chars ? OBSOLETE: to be removed at some point.

ctxt:an XML parser context
entity:an XML entity pointer.


xmlNamespaceParseNCName ()

xmlChar *	xmlNamespaceParseNCName	(xmlParserCtxtPtr ctxt)

parse an XML namespace name. TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender

ctxt:an XML parser context
Returns:the namespace name or NULL

xmlNamespaceParseNSDef ()

xmlChar *	xmlNamespaceParseNSDef	(xmlParserCtxtPtr ctxt)

parse a namespace prefix declaration TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 1] NSDef ::= PrefixDef Eq SystemLiteral [NS 2] PrefixDef ::= 'xmlns' (':' NCName)?

ctxt:an XML parser context
Returns:the namespace name

xmlNamespaceParseQName ()

xmlChar *	xmlNamespaceParseQName	(xmlParserCtxtPtr ctxt, 
xmlChar ** prefix)

TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. parse an XML qualified name [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName

ctxt:an XML parser context
prefix:a xmlChar **
Returns:the local part, and prefix is updated to get the Prefix if any.

xmlNewEntityInputStream ()

xmlParserInputPtr	xmlNewEntityInputStream	(xmlParserCtxtPtr ctxt, 
xmlEntityPtr entity)

Create a new input stream based on an xmlEntityPtr

ctxt:an XML parser context
entity:an Entity pointer
Returns:the new input stream or NULL

xmlNewInputFromFile ()

xmlParserInputPtr	xmlNewInputFromFile	(xmlParserCtxtPtr ctxt, 
const char * filename)

Create a new input stream based on a file or an URL.

ctxt:an XML parser context
filename:the filename to use as entity
Returns:the new input stream or NULL in case of error

xmlNewInputStream ()

xmlParserInputPtr	xmlNewInputStream	(xmlParserCtxtPtr ctxt)

Create a new input stream structure.

ctxt:an XML parser context
Returns:the new input stream or NULL

xmlNewStringInputStream ()

xmlParserInputPtr	xmlNewStringInputStream	(xmlParserCtxtPtr ctxt, 
const xmlChar * buffer)

Create a new input stream based on a memory buffer.

ctxt:an XML parser context
buffer:an memory buffer
Returns:the new input stream

xmlNextChar ()

void	xmlNextChar			(xmlParserCtxtPtr ctxt)

Skip to the next char input char.

ctxt:the XML parser context

xmlParseAttValue ()

xmlChar *	xmlParseAttValue	(xmlParserCtxtPtr ctxt)

parse a value for an attribute Note: the parser won't do substitution of entities here, this will be handled later in xmlStringGetNodeList [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'" 3.3.3 Attribute-Value Normalization: Before the value of an attribute is passed to the application or checked for validity, the XML processor must normalize it as follows: - a character reference is processed by appending the referenced character to the attribute value - an entity reference is processed by recursively processing the replacement text of the entity - a whitespace character (#x20, #xD, #xA, #x9) is processed by appending #x20 to the normalized value, except that only a single #x20 is appended for a "#xD#xA" sequence that is part of an external parsed entity or the literal entity value of an internal parsed entity - other characters are processed by appending them to the normalized value If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by a single space (#x20) character. All attributes for which no declaration has been read should be treated by a non-validating parser as if declared CDATA.

ctxt:an XML parser context
Returns:the AttValue parsed or NULL. The value has to be freed by the caller.

xmlParseAttribute ()

const xmlChar *	xmlParseAttribute	(xmlParserCtxtPtr ctxt, 
xmlChar ** value)

parse an attribute [41] Attribute ::= Name Eq AttValue [ WFC: No External Entity References ] Attribute values cannot contain direct or indirect entity references to external entities. [ WFC: No < in Attribute Values ] The replacement text of any entity referred to directly or indirectly in an attribute value (other than "&lt;") must not contain a <. [ VC: Attribute Value Type ] The attribute must have been declared; the value must be of the type declared for it. [25] Eq ::= S? '=' S? With namespace: [NS 11] Attribute ::= QName Eq AttValue Also the case QName == xmlns:??? is handled independently as a namespace definition.

ctxt:an XML parser context
value:a xmlChar ** used to store the value of the attribute
Returns:the attribute name, and the value in *value.

xmlParseAttributeListDecl ()

void	xmlParseAttributeListDecl	(xmlParserCtxtPtr ctxt)

: parse the Attribute list def for an element [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' [53] AttDef ::= S Name S AttType S DefaultDecl

ctxt:an XML parser context

xmlParseAttributeType ()

int	xmlParseAttributeType		(xmlParserCtxtPtr ctxt, 
xmlEnumerationPtr * tree)

parse the Attribute list def for an element [54] AttType ::= StringType | TokenizedType | EnumeratedType [55] StringType ::= 'CDATA' [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' Validity constraints for attribute values syntax are checked in xmlValidateAttributeValue() [ VC: ID ] Values of type ID must match the Name production. A name must not appear more than once in an XML document as a value of this type; i.e., ID values must uniquely identify the elements which bear them. [ VC: One ID per Element Type ] No element type may have more than one ID attribute specified. [ VC: ID Attribute Default ] An ID attribute must have a declared default of #IMPLIED or #REQUIRED. [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names; each IDREF Name must match the value of an ID attribute on some element in the XML document; i.e. IDREF values must match the value of some ID attribute. [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names; each Entity Name must match the name of an unparsed entity declared in the DTD. [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens.

ctxt:an XML parser context
tree:the enumeration tree built while parsing
Returns:the attribute type

xmlParseCDSect ()

void	xmlParseCDSect			(xmlParserCtxtPtr ctxt)

Parse escaped pure raw content. [18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '<![CDATA[' [20] Data ::= (Char* - (Char* ']]>' Char*)) [21] CDEnd ::= ']]>'

ctxt:an XML parser context

xmlParseCharData ()

void	xmlParseCharData		(xmlParserCtxtPtr ctxt, 
int cdata)

parse a CharData section. if we are within a CDATA section ']]>' marks an end of section. The right angle bracket (>) may be represented using the string "&gt;", and must, for compatibility, be escaped using "&gt;" or a character reference when it appears in the string "]]>" in content, when that string is not marking the end of a CDATA section. [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

ctxt:an XML parser context
cdata:int indicating whether we are within a CDATA section

xmlParseCharRef ()

int	xmlParseCharRef			(xmlParserCtxtPtr ctxt)

parse Reference declarations [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' [ WFC: Legal Character ] Characters referred to using character references must match the production for Char.

ctxt:an XML parser context
Returns:the value parsed (as an int), 0 in case of error

xmlParseComment ()

void	xmlParseComment			(xmlParserCtxtPtr ctxt)

Skip an XML (SGML) comment <!-- .... --> The spec says that "For compatibility, the string "--" (double-hyphen) must not occur within comments. " [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

ctxt:an XML parser context

xmlParseContent ()

void	xmlParseContent			(xmlParserCtxtPtr ctxt)

Parse a content: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

ctxt:an XML parser context

xmlParseDefaultDecl ()

int	xmlParseDefaultDecl		(xmlParserCtxtPtr ctxt, 
xmlChar ** value)

Parse an attribute default declaration [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) [ VC: Required Attribute ] if the default declaration is the keyword #REQUIRED, then the attribute must be specified for all elements of the type in the attribute-list declaration. [ VC: Attribute Default Legal ] The declared default value must meet the lexical constraints of the declared attribute type c.f. xmlValidateAttributeDecl() [ VC: Fixed Attribute Default ] if an attribute has a default value declared with the #FIXED keyword, instances of that attribute must match the default value. [ WFC: No < in Attribute Values ] handled in xmlParseAttValue()

ctxt:an XML parser context
value:Receive a possible fixed default value for the attribute
Returns:XML_ATTRIBUTE_NONE, XML_ATTRIBUTE_REQUIRED, XML_ATTRIBUTE_IMPLIED or XML_ATTRIBUTE_FIXED.

xmlParseDocTypeDecl ()

void	xmlParseDocTypeDecl		(xmlParserCtxtPtr ctxt)

parse a DOCTYPE declaration [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>' [ VC: Root Element Type ] The Name in the document type declaration must match the element type of the root element.

ctxt:an XML parser context

xmlParseElement ()

void	xmlParseElement			(xmlParserCtxtPtr ctxt)

parse an XML element, this is highly recursive [39] element ::= EmptyElemTag | STag content ETag [ WFC: Element Type Match ] The Name in an element's end-tag must match the element type in the start-tag.

ctxt:an XML parser context

xmlParseElementChildrenContentDecl ()

xmlElementContentPtr	xmlParseElementChildrenContentDecl	(xmlParserCtxtPtr ctxt, 
int inputchk)

parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in xmlParseElementContentDecl [47] children ::= (choice | seq) ('?' | '*' | '+')? [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [ VC: Proper Group/PE Nesting ] applies to [49] and [50] TODO Parameter-entity replacement text must be properly nested with parenthesized groups. That is to say, if either of the opening or closing parentheses in a choice, seq, or Mixed construct is contained in the replacement text for a parameter entity, both must be contained in the same replacement text. For interoperability, if a parameter-entity reference appears in a choice, seq, or Mixed construct, its replacement text should not be empty, and neither the first nor last non-blank character of the replacement text should be a connector (| or ,).

ctxt:an XML parser context
inputchk:the input used for the current entity, needed for boundary checks
Returns:the tree of xmlElementContentPtr describing the element hierarchy.

xmlParseElementContentDecl ()

int	xmlParseElementContentDecl	(xmlParserCtxtPtr ctxt, 
const xmlChar * name,
xmlElementContentPtr * result)

parse the declaration for an Element content either Mixed or Children, the cases EMPTY and ANY are handled directly in xmlParseElementDecl [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

ctxt:an XML parser context
name:the name of the element being defined.
result:the Element Content pointer will be stored here if any
Returns:the type of element content XML_ELEMENT_TYPE_xxx

xmlParseElementDecl ()

int	xmlParseElementDecl		(xmlParserCtxtPtr ctxt)

parse an Element declaration. [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [ VC: Unique Element Type Declaration ] No element type may be declared more than once

ctxt:an XML parser context
Returns:the type of the element, or -1 in case of error

xmlParseElementMixedContentDecl ()

xmlElementContentPtr	xmlParseElementMixedContentDecl	(xmlParserCtxtPtr ctxt, 
int inputchk)

parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in xmlParseElementContentDecl [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49]) [ VC: No Duplicate Types ] The same name must not appear more than once in a single mixed-content declaration.

ctxt:an XML parser context
inputchk:the input used for the current entity, needed for boundary checks
Returns:the list of the xmlElementContentPtr describing the element choices

xmlParseEncName ()

xmlChar *	xmlParseEncName		(xmlParserCtxtPtr ctxt)

parse the XML encoding name [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*

ctxt:an XML parser context
Returns:the encoding name value or NULL

xmlParseEncodingDecl ()

const xmlChar *	xmlParseEncodingDecl	(xmlParserCtxtPtr ctxt)

parse the XML encoding declaration [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") this setups the conversion filters.

ctxt:an XML parser context
Returns:the encoding value or NULL

xmlParseEndTag ()

void	xmlParseEndTag			(xmlParserCtxtPtr ctxt)

parse an end of tag [42] ETag ::= '</' Name S? '>' With namespace [NS 9] ETag ::= '</' QName S? '>'

ctxt:an XML parser context

xmlParseEntityDecl ()

void	xmlParseEntityDecl		(xmlParserCtxtPtr ctxt)

parse <!ENTITY declarations [70] EntityDecl ::= GEDecl | PEDecl [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID [76] NDataDecl ::= S 'NDATA' S Name [ VC: Notation Declared ] The Name must match the declared name of a notation.

ctxt:an XML parser context

xmlParseEntityRef ()

xmlEntityPtr	xmlParseEntityRef	(xmlParserCtxtPtr ctxt)

parse ENTITY references declarations [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", the Name given in the entity reference must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. The declaration of a parameter entity must precede any reference to it. Similarly, the declaration of a general entity must precede any reference to it which appears in a default value in an attribute-list declaration. Note that if entities are declared in the external subset or in external parameter entities, a non-validating processor is not obligated to read and process their declarations; for such documents, the rule that an entity must be declared is a well-formedness constraint only if standalone='yes'. [ WFC: Parsed Entity ] An entity reference must not contain the name of an unparsed entity

ctxt:an XML parser context
Returns:the xmlEntityPtr if found, or NULL otherwise.

xmlParseEntityValue ()

xmlChar *	xmlParseEntityValue	(xmlParserCtxtPtr ctxt, 
xmlChar ** orig)

parse a value for ENTITY declarations [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | "'" ([^%&'] | PEReference | Reference)* "'"

ctxt:an XML parser context
orig:if non-NULL store a copy of the original entity value
Returns:the EntityValue parsed with reference substituted or NULL

xmlParseEnumeratedType ()

int	xmlParseEnumeratedType		(xmlParserCtxtPtr ctxt, 
xmlEnumerationPtr * tree)

parse an Enumerated attribute type. [57] EnumeratedType ::= NotationType | Enumeration [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'

ctxt:an XML parser context
tree:the enumeration tree built while parsing
Returns:XML_ATTRIBUTE_ENUMERATION or XML_ATTRIBUTE_NOTATION

xmlParseEnumerationType ()

xmlEnumerationPtr	xmlParseEnumerationType	(xmlParserCtxtPtr ctxt)

parse an Enumeration attribute type. [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [ VC: Enumeration ] Values of this type must match one of the Nmtoken tokens in the declaration

ctxt:an XML parser context
Returns:the enumeration attribute tree built while parsing

xmlParseExternalID ()

xmlChar *	xmlParseExternalID	(xmlParserCtxtPtr ctxt, 
xmlChar ** publicID,
int strict)

Parse an External ID or a Public ID NOTE: Productions [75] and [83] interact badly since [75] can generate 'PUBLIC' S PubidLiteral S SystemLiteral [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral [83] PublicID ::= 'PUBLIC' S PubidLiteral

ctxt:an XML parser context
publicID:a xmlChar** receiving PubidLiteral
strict:indicate whether we should restrict parsing to only production [75], see NOTE below
Returns:the function returns SystemLiteral and in the second case publicID receives PubidLiteral, is strict is off it is possible to return NULL and have publicID set.

xmlParseExternalSubset ()

void	xmlParseExternalSubset		(xmlParserCtxtPtr ctxt, 
const xmlChar * ExternalID,
const xmlChar * SystemID)

parse Markup declarations from an external subset [30] extSubset ::= textDecl? extSubsetDecl [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) *

ctxt:an XML parser context
ExternalID:the external identifier
SystemID:the system identifier (or URL)

xmlParseMarkupDecl ()

void	xmlParseMarkupDecl		(xmlParserCtxtPtr ctxt)

parse Markup declarations [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ VC: Proper Declaration/PE Nesting ] Parameter-entity replacement text must be properly nested with markup declarations. That is to say, if either the first character or the last character of a markup declaration (markupdecl above) is contained in the replacement text for a parameter-entity reference, both must be contained in the same replacement text. [ WFC: PEs in Internal Subset ] In the internal DTD subset, parameter-entity references can occur only where markup declarations can occur, not within markup declarations. (This does not apply to references that occur in external parameter entities or to the external subset.)

ctxt:an XML parser context

xmlParseMisc ()

void	xmlParseMisc			(xmlParserCtxtPtr ctxt)

parse an XML Misc* optional field. [27] Misc ::= Comment | PI | S

ctxt:an XML parser context

xmlParseName ()

const xmlChar *	xmlParseName		(xmlParserCtxtPtr ctxt)

parse an XML name. [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (#x20 Name)*

ctxt:an XML parser context
Returns:the Name parsed or NULL

xmlParseNamespace ()

void	xmlParseNamespace		(xmlParserCtxtPtr ctxt)

xmlParseNamespace: parse specific PI '<?namespace ...' constructs. This is what the older xml-name Working Draft specified, a bunch of other stuff may still rely on it, so support is still here as if it was declared on the root of the Tree:-( TODO: remove from library To be removed at next drop of binary compatibility

ctxt:an XML parser context

xmlParseNmtoken ()

xmlChar *	xmlParseNmtoken		(xmlParserCtxtPtr ctxt)

parse an XML Nmtoken. [7] Nmtoken ::= (NameChar)+ [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*

ctxt:an XML parser context
Returns:the Nmtoken parsed or NULL

xmlParseNotationDecl ()

void	xmlParseNotationDecl		(xmlParserCtxtPtr ctxt)

parse a notation declaration [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' Hence there is actually 3 choices: 'PUBLIC' S PubidLiteral 'PUBLIC' S PubidLiteral S SystemLiteral and 'SYSTEM' S SystemLiteral See the NOTE on xmlParseExternalID().

ctxt:an XML parser context

xmlParseNotationType ()

xmlEnumerationPtr	xmlParseNotationType	(xmlParserCtxtPtr ctxt)

parse an Notation attribute type. Note: the leading 'NOTATION' S part has already being parsed... [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [ VC: Notation Attributes ] Values of this type must match one of the notation names included in the declaration; all notation names in the declaration must be declared.

ctxt:an XML parser context
Returns:the notation attribute tree built while parsing

xmlParsePEReference ()

void	xmlParsePEReference		(xmlParserCtxtPtr ctxt)

parse PEReference declarations The entity content is handled directly by pushing it's content as a new input stream. [69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive reference to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any reference to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any reference to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled.

ctxt:an XML parser context

xmlParsePI ()

void	xmlParsePI			(xmlParserCtxtPtr ctxt)

parse an XML Processing Instruction. [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' The processing is transfered to SAX once parsed.

ctxt:an XML parser context

xmlParsePITarget ()

const xmlChar *	xmlParsePITarget	(xmlParserCtxtPtr ctxt)

parse the name of a PI [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

ctxt:an XML parser context
Returns:the PITarget name or NULL

xmlParsePubidLiteral ()

xmlChar *	xmlParsePubidLiteral	(xmlParserCtxtPtr ctxt)

parse an XML public literal [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"

ctxt:an XML parser context
Returns:the PubidLiteral parsed or NULL.

xmlParseQuotedString ()

xmlChar *	xmlParseQuotedString	(xmlParserCtxtPtr ctxt)

Parse and return a string between quotes or doublequotes TODO: Deprecated, to be removed at next drop of binary compatibility

ctxt:an XML parser context
Returns:the string parser or NULL.

xmlParseReference ()

void	xmlParseReference		(xmlParserCtxtPtr ctxt)

parse and handle entity references in content, depending on the SAX interface, this may end-up in a call to character() if this is a CharRef, a predefined entity, if there is no reference() callback. or if the parser was asked to switch to that mode. [67] Reference ::= EntityRef | CharRef

ctxt:an XML parser context

xmlParseSDDecl ()

int	xmlParseSDDecl			(xmlParserCtxtPtr ctxt)

parse the XML standalone declaration [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no')'"')) [ VC: Standalone Document Declaration ] TODO The standalone document declaration must have the value "no" if any external markup declarations contain declarations of: - attributes with default values, if elements to which these attributes apply appear in the document without specifications of values for these attributes, or - entities (other than amp, lt, gt, apos, quot), if references to those entities appear in the document, or - attributes with values subject to normalization, where the attribute appears in the document with a value which will change as a result of normalization, or - element types with element content, if white space occurs directly within any instance of those types.

ctxt:an XML parser context
Returns:1 if standalone="yes" 0 if standalone="no" -2 if standalone attribute is missing or invalid (A standalone value of -2 means that the XML declaration was found, but no value was specified for the standalone attribute).

xmlParseStartTag ()

const xmlChar *	xmlParseStartTag	(xmlParserCtxtPtr ctxt)

parse a start of tag either for rule element or EmptyElement. In both case we don't parse the tag closing chars. [40] STag ::= '<' Name (S Attribute)* S? '>' [ WFC: Unique Att Spec ] No attribute name may appear more than once in the same start-tag or empty-element tag. [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [ WFC: Unique Att Spec ] No attribute name may appear more than once in the same start-tag or empty-element tag. With namespace: [NS 8] STag ::= '<' QName (S Attribute)* S? '>' [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>'

ctxt:an XML parser context
Returns:the element name parsed

xmlParseSystemLiteral ()

xmlChar *	xmlParseSystemLiteral	(xmlParserCtxtPtr ctxt)

parse an XML Literal [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")

ctxt:an XML parser context
Returns:the SystemLiteral parsed or NULL

xmlParseTextDecl ()

void	xmlParseTextDecl		(xmlParserCtxtPtr ctxt)

parse an XML declaration header for external entities [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'

ctxt:an XML parser context

xmlParseVersionInfo ()

xmlChar *	xmlParseVersionInfo	(xmlParserCtxtPtr ctxt)

parse the XML version. [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ") [25] Eq ::= S? '=' S?

ctxt:an XML parser context
Returns:the version string, e.g. "1.0"

xmlParseVersionNum ()

xmlChar *	xmlParseVersionNum	(xmlParserCtxtPtr ctxt)

parse the XML version value. [26] VersionNum ::= '1.' [0-9]+ In practice allow [0-9].[0-9]+ at that level

ctxt:an XML parser context
Returns:the string giving the XML version number, or NULL

xmlParseXMLDecl ()

void	xmlParseXMLDecl			(xmlParserCtxtPtr ctxt)

parse an XML declaration header [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

ctxt:an XML parser context

xmlParserHandlePEReference ()

void	xmlParserHandlePEReference	(xmlParserCtxtPtr ctxt)

[69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive reference to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any reference to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any reference to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled. A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc i.e. - Included in literal in entity values - Included as Parameter Entity reference within DTDs

ctxt:the parser context

xmlParserHandleReference ()

void	xmlParserHandleReference	(xmlParserCtxtPtr ctxt)

TODO: Remove, now deprecated ... the test is done directly in the content parsing routines. [67] Reference ::= EntityRef | CharRef [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] the Name given in the entity reference must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. [ WFC: Parsed Entity ] An entity reference must not contain the name of an unparsed entity [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc

ctxt:the parser context

xmlParserInputShrink ()

void	xmlParserInputShrink		(xmlParserInputPtr in)

This function removes used input for the parser.

in:an XML parser input

xmlPopInput ()

xmlChar	xmlPopInput			(xmlParserCtxtPtr ctxt)

xmlPopInput: the current input pointed by ctxt->input came to an end pop it and return the next char.

ctxt:an XML parser context
Returns:the current xmlChar in the parser context

xmlPushInput ()

int	xmlPushInput			(xmlParserCtxtPtr ctxt, 
xmlParserInputPtr input)

xmlPushInput: switch to a new input stream which is stacked on top of the previous one(s).

ctxt:an XML parser context
input:an XML parser input fragment (entity, XML fragment ...).
Returns:-1 in case of error or the index in the input stack

xmlScanName ()

xmlChar *	xmlScanName		(xmlParserCtxtPtr ctxt)

Trickery: parse an XML name but without consuming the input flow Needed for rollback cases. Used only when parsing entities references. TODO: seems deprecated now, only used in the default part of xmlParserHandleReference [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (S Name)*

ctxt:an XML parser context
Returns:the Name parsed or NULL

xmlSetEntityReferenceFunc ()

void	xmlSetEntityReferenceFunc	(xmlEntityReferenceFunc func)

Set the function to call call back when a xml reference has been made

func:A valid function

xmlSkipBlankChars ()

int	xmlSkipBlankChars		(xmlParserCtxtPtr ctxt)

skip all blanks character found at that point in the input streams. It pops up finished entities in the process if allowable at that point.

ctxt:the XML parser context
Returns:the number of space chars skipped

xmlSplitQName ()

xmlChar *	xmlSplitQName		(xmlParserCtxtPtr ctxt, 
const xmlChar * name,
xmlChar ** prefix)

parse an UTF8 encoded XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName

ctxt:an XML parser context
name:an XML parser context
prefix:a xmlChar **
Returns:the local part, and prefix is updated to get the Prefix if any.

xmlStringCurrentChar ()

int	xmlStringCurrentChar		(xmlParserCtxtPtr ctxt, 
const xmlChar * cur,
int * len)

The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer.

ctxt:the XML parser context
cur:pointer to the beginning of the char
len:pointer to the length of the char read
Returns:the current char value and its length

xmlStringDecodeEntities ()

xmlChar *	xmlStringDecodeEntities	(xmlParserCtxtPtr ctxt, 
const xmlChar * str,
int what,
xmlChar end,
xmlChar end2,
xmlChar end3)

Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'

ctxt:the parser context
str:the input string
what:combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF
end:an end marker xmlChar, 0 if none
end2:an end marker xmlChar, 0 if none
end3:an end marker xmlChar, 0 if none
Returns:A newly allocated string with the substitution done. The caller must deallocate it !

xmlStringLenDecodeEntities ()

xmlChar *	xmlStringLenDecodeEntities	(xmlParserCtxtPtr ctxt, 
const xmlChar * str,
int len,
int what,
xmlChar end,
xmlChar end2,
xmlChar end3)

Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'

ctxt:the parser context
str:the input string
len:the string length
what:combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF
end:an end marker xmlChar, 0 if none
end2:an end marker xmlChar, 0 if none
end3:an end marker xmlChar, 0 if none
Returns:A newly allocated string with the substitution done. The caller must deallocate it !

xmlSwitchEncoding ()

int	xmlSwitchEncoding		(xmlParserCtxtPtr ctxt, 
xmlCharEncoding enc)

change the input functions when discovering the character encoding of a given entity.

ctxt:the parser context
enc:the encoding value (number)
Returns:0 in case of success, -1 otherwise

xmlSwitchInputEncoding ()

int	xmlSwitchInputEncoding		(xmlParserCtxtPtr ctxt, 
xmlParserInputPtr input,
xmlCharEncodingHandlerPtr handler)

change the input functions when discovering the character encoding of a given entity.

ctxt:the parser context
input:the input stream
handler:the encoding handler
Returns:0 in case of success, -1 otherwise

xmlSwitchToEncoding ()

int	xmlSwitchToEncoding		(xmlParserCtxtPtr ctxt, 
xmlCharEncodingHandlerPtr handler)

change the input functions when discovering the character encoding of a given entity.

ctxt:the parser context
handler:the encoding handler
Returns:0 in case of success, -1 otherwise

libxml2-2.9.1+dfsg1/doc/devhelp/Makefile.am0000644000175000017500000000355512113312340017002 0ustar aronarondevhelpdir = $(datadir)/gtk-doc/html/libxml2 dist_devhelp_DATA = \ libxml2.devhelp \ $(HTML_FILES) \ $(EXTRA_FORMAT) HTML_FILES = \ general.html \ index.html \ $(HTML_MODULES) HTML_MODULES= \ libxml2-c14n.html \ libxml2-catalog.html \ libxml2-chvalid.html \ libxml2-debugXML.html \ libxml2-dict.html \ libxml2-DOCBparser.html \ libxml2-encoding.html \ libxml2-entities.html \ libxml2-globals.html \ libxml2-hash.html \ libxml2-HTMLparser.html \ libxml2-HTMLtree.html \ libxml2-list.html \ libxml2-nanoftp.html \ libxml2-nanohttp.html \ libxml2-parser.html \ libxml2-parserInternals.html \ libxml2-pattern.html \ libxml2-relaxng.html \ libxml2-SAX2.html \ libxml2-SAX.html \ libxml2-schemasInternals.html \ libxml2-schematron.html \ libxml2-threads.html \ libxml2-tree.html \ libxml2-uri.html \ libxml2-valid.html \ libxml2-xinclude.html \ libxml2-xlink.html \ libxml2-xmlautomata.html \ libxml2-xmlerror.html \ libxml2-xmlexports.html \ libxml2-xmlIO.html \ libxml2-xmlmemory.html \ libxml2-xmlmodule.html \ libxml2-xmlreader.html \ libxml2-xmlregexp.html \ libxml2-xmlsave.html \ libxml2-xmlschemas.html \ libxml2-xmlschemastypes.html \ libxml2-xmlstring.html \ libxml2-xmlunicode.html \ libxml2-xmlversion.html \ libxml2-xmlwriter.html \ libxml2-xpath.html \ libxml2-xpathInternals.html \ libxml2-xpointer.html EXTRA_FORMAT= \ home.png \ left.png \ right.png \ up.png \ style.css EXTRA_DIST = devhelp.xsl html.xsl if REBUILD_DOCS rebuild: libxml2.devhelp $(HTML_FILES) .PHONY: rebuild libxml2.devhelp $(HTML_FILES): devhelp.xsl html.xsl $(top_srcdir)/doc/libxml2-api.xml -@(if [ -x $(XSLTPROC) ] ; then \ echo Rebuilding devhelp files ; \ $(XSLTPROC) --nonet -o $(srcdir)/libxml2.devhelp $(srcdir)/devhelp.xsl $(top_srcdir)/doc/libxml2-api.xml ; fi ); endif libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-schemasInternals.html0000644000175000017500000017713712134171044022525 0ustar aronaron schemasInternals: internal interfaces for XML Schemas

schemasInternals

schemasInternals - internal interfaces for XML Schemas

internal interfaces for the XML Schemas handling and schema validity checking The Schemas development is a Work In Progress. Some of those interfaces are not garanteed to be API or ABI stable !

Author(s): Daniel Veillard

Synopsis

#define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
#define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
#define XML_SCHEMAS_TYPE_FIXUP_1;
#define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
#define XML_SCHEMAS_ELEM_CIRCULAR;
#define XML_SCHEMAS_QUALIF_ATTR;
#define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
#define XML_SCHEMAS_ATTR_USE_REQUIRED;
#define XML_SCHEMAS_FACET_COLLAPSE;
#define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
#define XML_SCHEMAS_TYPE_VARIETY_UNION;
#define XML_SCHEMAS_ANY_STRICT;
#define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
#define XML_SCHEMAS_QUALIF_ELEM;
#define XML_SCHEMAS_TYPE_VARIETY_LIST;
#define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
#define XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
#define XML_SCHEMAS_INCLUDING_CONVERT_NS;
#define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
#define XML_SCHEMAS_ATTR_USE_PROHIBITED;
#define XML_SCHEMAS_ELEM_NILLABLE;
#define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
#define XML_SCHEMAS_ATTRGROUP_REDEFINED;
#define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
#define XML_SCHEMAS_TYPE_BLOCK_DEFAULT;
#define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
#define XML_SCHEMAS_TYPE_FINAL_EXTENSION;
#define XML_SCHEMAS_TYPE_REDEFINED;
#define XML_SCHEMAS_ELEM_FIXED;
#define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD;
#define XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
#define XML_SCHEMAS_TYPE_FINAL_LIST;
#define XML_SCHEMAS_ATTR_USE_OPTIONAL;
#define XML_SCHEMAS_ATTR_NSDEFAULT;
#define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
#define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
#define XML_SCHEMAS_ANYATTR_STRICT;
#define XML_SCHEMAS_FACET_UNKNOWN;
#define XML_SCHEMAS_ATTRGROUP_MARKED;
#define XML_SCHEMAS_FACET_PRESERVE;
#define XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
#define XML_SCHEMAS_ATTR_GLOBAL;
#define XML_SCHEMAS_ANYATTR_SKIP;
#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
#define XML_SCHEMAS_ANYATTR_LAX;
#define XML_SCHEMAS_TYPE_GLOBAL;
#define XML_SCHEMAS_TYPE_ABSTRACT;
#define XML_SCHEMAS_TYPE_MIXED;
#define XML_SCHEMAS_ATTR_FIXED;
#define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
#define XML_SCHEMAS_ANY_SKIP;
#define XML_SCHEMAS_FINAL_DEFAULT_LIST;
#define XML_SCHEMAS_TYPE_VARIETY_ABSENT;
#define XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
#define XML_SCHEMAS_WILDCARD_COMPLETE;
#define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
#define XML_SCHEMAS_ELEM_NSDEFAULT;
#define XML_SCHEMAS_ELEM_GLOBAL;
#define XML_SCHEMAS_ELEM_TOPLEVEL;
#define XML_SCHEMAS_ANY_LAX;
#define XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
#define XML_SCHEMAS_TYPE_HAS_FACETS;
#define XML_SCHEMAS_ELEM_FINAL_EXTENSION;
#define XML_SCHEMAS_TYPE_NORMVALUENEEDED;
#define XML_SCHEMAS_ELEM_FINAL_ABSENT;
#define XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
#define XML_SCHEMAS_TYPE_INTERNAL_INVALID;
#define XML_SCHEMAS_ATTRGROUP_HAS_REFS;
#define XML_SCHEMAS_ELEM_ABSTRACT;
#define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
#define XML_SCHEMAS_TYPE_FINAL_UNION;
#define XML_SCHEMAS_TYPE_FINAL_DEFAULT;
#define XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
#define XML_SCHEMAS_FINAL_DEFAULT_UNION;
#define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
#define XML_SCHEMAS_FACET_REPLACE;
#define XML_SCHEMAS_ELEM_DEFAULT;
#define XML_SCHEMAS_TYPE_MARKED;
#define XML_SCHEMAS_ELEM_BLOCK_ABSENT;
#define XML_SCHEMAS_ATTRGROUP_GLOBAL;
#define XML_SCHEMAS_ELEM_REF;
typedef xmlSchemaAttributeGroup * xmlSchemaAttributeGroupPtr;
typedef xmlSchemaElement * xmlSchemaElementPtr;
typedef xmlSchemaFacetLink * xmlSchemaFacetLinkPtr;
typedef struct _xmlSchemaVal xmlSchemaVal;
typedef xmlSchemaAttributeLink * xmlSchemaAttributeLinkPtr;
typedef struct _xmlSchemaType xmlSchemaType;
typedef struct _xmlSchemaAnnot xmlSchemaAnnot;
typedef xmlSchemaAnnot * xmlSchemaAnnotPtr;
typedef struct _xmlSchemaElement xmlSchemaElement;
typedef struct _xmlSchemaWildcard xmlSchemaWildcard;
typedef xmlSchemaWildcard * xmlSchemaWildcardPtr;
typedef xmlSchemaFacet * xmlSchemaFacetPtr;
typedef struct _xmlSchemaTypeLink xmlSchemaTypeLink;
typedef struct _xmlSchemaAttributeLink xmlSchemaAttributeLink;
typedef xmlSchemaVal * xmlSchemaValPtr;
typedef struct _xmlSchemaFacetLink xmlSchemaFacetLink;
typedef xmlSchemaWildcardNs * xmlSchemaWildcardNsPtr;
typedef struct _xmlSchemaAttributeGroup xmlSchemaAttributeGroup;
typedef xmlSchemaTypeLink * xmlSchemaTypeLinkPtr;
typedef struct _xmlSchemaWildcardNs xmlSchemaWildcardNs;
typedef xmlSchemaAttribute * xmlSchemaAttributePtr;
typedef xmlSchemaNotation * xmlSchemaNotationPtr;
typedef enum xmlSchemaValType;
typedef xmlSchemaType * xmlSchemaTypePtr;
typedef struct _xmlSchemaNotation xmlSchemaNotation;
typedef struct _xmlSchemaFacet xmlSchemaFacet;
typedef enum xmlSchemaContentType;
typedef enum xmlSchemaTypeType;
typedef struct _xmlSchemaAttribute xmlSchemaAttribute;
void	xmlSchemaFreeType		(xmlSchemaTypePtr type);
void	xmlSchemaFreeWildcard		(xmlSchemaWildcardPtr wildcard);

Description

Details

Macro XML_SCHEMAS_ANYATTR_LAX

#define XML_SCHEMAS_ANYATTR_LAX;

Ignore validation non definition on attributes Obsolete, not used anymore.


Macro XML_SCHEMAS_ANYATTR_SKIP

#define XML_SCHEMAS_ANYATTR_SKIP;

Skip unknown attribute from validation Obsolete, not used anymore.


Macro XML_SCHEMAS_ANYATTR_STRICT

#define XML_SCHEMAS_ANYATTR_STRICT;

Apply strict validation rules on attributes Obsolete, not used anymore.


Macro XML_SCHEMAS_ANY_LAX

#define XML_SCHEMAS_ANY_LAX;

Used by wildcards. Validate if type found, don't worry if not found


Macro XML_SCHEMAS_ANY_SKIP

#define XML_SCHEMAS_ANY_SKIP;

Skip unknown attribute from validation


Macro XML_SCHEMAS_ANY_STRICT

#define XML_SCHEMAS_ANY_STRICT;

Used by wildcards. Apply strict validation rules


Macro XML_SCHEMAS_ATTRGROUP_GLOBAL

#define XML_SCHEMAS_ATTRGROUP_GLOBAL;

The attribute wildcard has been already builded.


Macro XML_SCHEMAS_ATTRGROUP_HAS_REFS

#define XML_SCHEMAS_ATTRGROUP_HAS_REFS;

Whether this attr. group contains attr. group references.


Macro XML_SCHEMAS_ATTRGROUP_MARKED

#define XML_SCHEMAS_ATTRGROUP_MARKED;

Marks the attr group as marked; used for circular checks.


Macro XML_SCHEMAS_ATTRGROUP_REDEFINED

#define XML_SCHEMAS_ATTRGROUP_REDEFINED;

The attr group was redefined.


Macro XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED

#define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;

The attribute wildcard has been already builded.


Macro XML_SCHEMAS_ATTR_FIXED

#define XML_SCHEMAS_ATTR_FIXED;

the attribute has a fixed value


Macro XML_SCHEMAS_ATTR_GLOBAL

#define XML_SCHEMAS_ATTR_GLOBAL;

allow elements in no namespace


Macro XML_SCHEMAS_ATTR_INTERNAL_RESOLVED

#define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;

this is set when the "type" and "ref" references have been resolved.


Macro XML_SCHEMAS_ATTR_NSDEFAULT

#define XML_SCHEMAS_ATTR_NSDEFAULT;

allow elements in no namespace


Macro XML_SCHEMAS_ATTR_USE_OPTIONAL

#define XML_SCHEMAS_ATTR_USE_OPTIONAL;

The attribute is optional.


Macro XML_SCHEMAS_ATTR_USE_PROHIBITED

#define XML_SCHEMAS_ATTR_USE_PROHIBITED;

Used by wildcards. The attribute is prohibited.


Macro XML_SCHEMAS_ATTR_USE_REQUIRED

#define XML_SCHEMAS_ATTR_USE_REQUIRED;

The attribute is required.


Macro XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION

#define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;

the schema has "extension" in the set of blockDefault.


Macro XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION

#define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;

the schema has "restriction" in the set of blockDefault.


Macro XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION

#define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;

the schema has "substitution" in the set of blockDefault.


Macro XML_SCHEMAS_ELEM_ABSTRACT

#define XML_SCHEMAS_ELEM_ABSTRACT;

the element is abstract


Macro XML_SCHEMAS_ELEM_BLOCK_ABSENT

#define XML_SCHEMAS_ELEM_BLOCK_ABSENT;

the "block" attribute is absent


Macro XML_SCHEMAS_ELEM_BLOCK_EXTENSION

#define XML_SCHEMAS_ELEM_BLOCK_EXTENSION;

disallowed substitutions are absent


Macro XML_SCHEMAS_ELEM_BLOCK_RESTRICTION

#define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;

disallowed substitutions: "restriction"


Macro XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION

#define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;

disallowed substitutions: "substituion"


Macro XML_SCHEMAS_ELEM_CIRCULAR

#define XML_SCHEMAS_ELEM_CIRCULAR;

a helper flag for the search of circular references.


Macro XML_SCHEMAS_ELEM_DEFAULT

#define XML_SCHEMAS_ELEM_DEFAULT;

the element has a default value


Macro XML_SCHEMAS_ELEM_FINAL_ABSENT

#define XML_SCHEMAS_ELEM_FINAL_ABSENT;

substitution group exclusions are absent


Macro XML_SCHEMAS_ELEM_FINAL_EXTENSION

#define XML_SCHEMAS_ELEM_FINAL_EXTENSION;

substitution group exclusions: "extension"


Macro XML_SCHEMAS_ELEM_FINAL_RESTRICTION

#define XML_SCHEMAS_ELEM_FINAL_RESTRICTION;

substitution group exclusions: "restriction"


Macro XML_SCHEMAS_ELEM_FIXED

#define XML_SCHEMAS_ELEM_FIXED;

the element has a fixed value


Macro XML_SCHEMAS_ELEM_GLOBAL

#define XML_SCHEMAS_ELEM_GLOBAL;

the element is global


Macro XML_SCHEMAS_ELEM_INTERNAL_CHECKED

#define XML_SCHEMAS_ELEM_INTERNAL_CHECKED;

this is set when the elem decl has been checked against all constraints


Macro XML_SCHEMAS_ELEM_INTERNAL_RESOLVED

#define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;

this is set when "type", "ref", "substitutionGroup" references have been resolved.


Macro XML_SCHEMAS_ELEM_NILLABLE

#define XML_SCHEMAS_ELEM_NILLABLE;

the element is nillable


Macro XML_SCHEMAS_ELEM_NSDEFAULT

#define XML_SCHEMAS_ELEM_NSDEFAULT;

allow elements in no namespace Obsolete, not used anymore.


Macro XML_SCHEMAS_ELEM_REF

#define XML_SCHEMAS_ELEM_REF;

the element is a reference to a type


Macro XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD

#define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;

the declaration is a substitution group head


Macro XML_SCHEMAS_ELEM_TOPLEVEL

#define XML_SCHEMAS_ELEM_TOPLEVEL;

the element is top level obsolete: use XML_SCHEMAS_ELEM_GLOBAL instead


Macro XML_SCHEMAS_FACET_COLLAPSE

#define XML_SCHEMAS_FACET_COLLAPSE;

collapse the types of the facet


Macro XML_SCHEMAS_FACET_PRESERVE

#define XML_SCHEMAS_FACET_PRESERVE;

preserve the type of the facet


Macro XML_SCHEMAS_FACET_REPLACE

#define XML_SCHEMAS_FACET_REPLACE;

replace the type of the facet


Macro XML_SCHEMAS_FACET_UNKNOWN

#define XML_SCHEMAS_FACET_UNKNOWN;

unknown facet handling


Macro XML_SCHEMAS_FINAL_DEFAULT_EXTENSION

#define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;

the schema has "extension" in the set of finalDefault.


Macro XML_SCHEMAS_FINAL_DEFAULT_LIST

#define XML_SCHEMAS_FINAL_DEFAULT_LIST;

the cshema has "list" in the set of finalDefault.


Macro XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION

#define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;

the schema has "restriction" in the set of finalDefault.


Macro XML_SCHEMAS_FINAL_DEFAULT_UNION

#define XML_SCHEMAS_FINAL_DEFAULT_UNION;

the schema has "union" in the set of finalDefault.


Macro XML_SCHEMAS_INCLUDING_CONVERT_NS

#define XML_SCHEMAS_INCLUDING_CONVERT_NS;

the schema is currently including an other schema with no target namespace.


Macro XML_SCHEMAS_QUALIF_ATTR

#define XML_SCHEMAS_QUALIF_ATTR;

Reflects attributeFormDefault == qualified in an XML schema document.


Macro XML_SCHEMAS_QUALIF_ELEM

#define XML_SCHEMAS_QUALIF_ELEM;

Reflects elementFormDefault == qualified in an XML schema document.


Macro XML_SCHEMAS_TYPE_ABSTRACT

#define XML_SCHEMAS_TYPE_ABSTRACT;

the simple/complexType is abstract.


Macro XML_SCHEMAS_TYPE_BLOCK_DEFAULT

#define XML_SCHEMAS_TYPE_BLOCK_DEFAULT;

the complexType did not specify 'block' so use the default of the <schema> item.


Macro XML_SCHEMAS_TYPE_BLOCK_EXTENSION

#define XML_SCHEMAS_TYPE_BLOCK_EXTENSION;

the complexType has a 'block' of "extension".


Macro XML_SCHEMAS_TYPE_BLOCK_RESTRICTION

#define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;

the complexType has a 'block' of "restriction".


Macro XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE

#define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;

Marks the item as a builtin primitive.


Macro XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION

#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;

the simple or complex type has a derivation method of "extension".


Macro XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION

#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;

the simple or complex type has a derivation method of "restriction".


Macro XML_SCHEMAS_TYPE_FACETSNEEDVALUE

#define XML_SCHEMAS_TYPE_FACETSNEEDVALUE;

indicates if the facets need a computed value


Macro XML_SCHEMAS_TYPE_FINAL_DEFAULT

#define XML_SCHEMAS_TYPE_FINAL_DEFAULT;

the simpleType has a final of "default".


Macro XML_SCHEMAS_TYPE_FINAL_EXTENSION

#define XML_SCHEMAS_TYPE_FINAL_EXTENSION;

the complexType has a final of "extension".


Macro XML_SCHEMAS_TYPE_FINAL_LIST

#define XML_SCHEMAS_TYPE_FINAL_LIST;

the simpleType has a final of "list".


Macro XML_SCHEMAS_TYPE_FINAL_RESTRICTION

#define XML_SCHEMAS_TYPE_FINAL_RESTRICTION;

the simpleType/complexType has a final of "restriction".


Macro XML_SCHEMAS_TYPE_FINAL_UNION

#define XML_SCHEMAS_TYPE_FINAL_UNION;

the simpleType has a final of "union".


Macro XML_SCHEMAS_TYPE_FIXUP_1

#define XML_SCHEMAS_TYPE_FIXUP_1;

First stage of fixup was done.


Macro XML_SCHEMAS_TYPE_GLOBAL

#define XML_SCHEMAS_TYPE_GLOBAL;

the type is global


Macro XML_SCHEMAS_TYPE_HAS_FACETS

#define XML_SCHEMAS_TYPE_HAS_FACETS;

has facets


Macro XML_SCHEMAS_TYPE_INTERNAL_INVALID

#define XML_SCHEMAS_TYPE_INTERNAL_INVALID;

indicates that the type is invalid


Macro XML_SCHEMAS_TYPE_INTERNAL_RESOLVED

#define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;

indicates that the type was typefixed


Macro XML_SCHEMAS_TYPE_MARKED

#define XML_SCHEMAS_TYPE_MARKED;

Marks the item as marked; used for circular checks.


Macro XML_SCHEMAS_TYPE_MIXED

#define XML_SCHEMAS_TYPE_MIXED;

the element content type is mixed


Macro XML_SCHEMAS_TYPE_NORMVALUENEEDED

#define XML_SCHEMAS_TYPE_NORMVALUENEEDED;

indicates if the facets (pattern) need a normalized value


Macro XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD

#define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD;

the complexType owns an attribute wildcard, i.e. it can be freed by the complexType


Macro XML_SCHEMAS_TYPE_REDEFINED

#define XML_SCHEMAS_TYPE_REDEFINED;

The type was redefined.


Macro XML_SCHEMAS_TYPE_VARIETY_ABSENT

#define XML_SCHEMAS_TYPE_VARIETY_ABSENT;

the simpleType has a variety of "absent". TODO: Actually not necessary :-/, since if none of the variety flags occur then it's automatically absent.


Macro XML_SCHEMAS_TYPE_VARIETY_ATOMIC

#define XML_SCHEMAS_TYPE_VARIETY_ATOMIC;

the simpleType has a variety of "union".


Macro XML_SCHEMAS_TYPE_VARIETY_LIST

#define XML_SCHEMAS_TYPE_VARIETY_LIST;

the simpleType has a variety of "list".


Macro XML_SCHEMAS_TYPE_VARIETY_UNION

#define XML_SCHEMAS_TYPE_VARIETY_UNION;

the simpleType has a variety of "union".


Macro XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE

#define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;

a whitespace-facet value of "collapse"


Macro XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE

#define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;

a whitespace-facet value of "preserve"


Macro XML_SCHEMAS_TYPE_WHITESPACE_REPLACE

#define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;

a whitespace-facet value of "replace"


Macro XML_SCHEMAS_WILDCARD_COMPLETE

#define XML_SCHEMAS_WILDCARD_COMPLETE;

If the wildcard is complete.


Structure xmlSchemaAnnot

struct _xmlSchemaAnnot {
    struct _xmlSchemaAnnot *	next
    xmlNodePtr	content	: the annotation
} xmlSchemaAnnot;


Typedef xmlSchemaAnnotPtr

xmlSchemaAnnot * xmlSchemaAnnotPtr;


Structure xmlSchemaAttribute

struct _xmlSchemaAttribute {
    xmlSchemaTypeType	type
    struct _xmlSchemaAttribute *	next	: the next attribute (not used?)
    const xmlChar *	name	: the name of the declaration
    const xmlChar *	id	: Deprecated; not used
    const xmlChar *	ref	: Deprecated; not used
    const xmlChar *	refNs	: Deprecated; not used
    const xmlChar *	typeName	: the local name of the type definition
    const xmlChar *	typeNs	: the ns URI of the type definition
    xmlSchemaAnnotPtr	annot
    xmlSchemaTypePtr	base	: Deprecated; not used
    int	occurs	: Deprecated; not used
    const xmlChar *	defValue	: The initial value of the value constraint
    xmlSchemaTypePtr	subtypes	: the type definition
    xmlNodePtr	node
    const xmlChar *	targetNamespace
    int	flags
    const xmlChar *	refPrefix	: Deprecated; not used
    xmlSchemaValPtr	defVal	: The compiled value constraint
    xmlSchemaAttributePtr	refDecl	: Deprecated; not used
} xmlSchemaAttribute;


Structure xmlSchemaAttributeGroup

struct _xmlSchemaAttributeGroup {
    xmlSchemaTypeType	type	: The kind of type
    struct _xmlSchemaAttribute *	next	: the next attribute if in a group ...
    const xmlChar *	name
    const xmlChar *	id
    const xmlChar *	ref	: Deprecated; not used
    const xmlChar *	refNs	: Deprecated; not used
    xmlSchemaAnnotPtr	annot
    xmlSchemaAttributePtr	attributes	: Deprecated; not used
    xmlNodePtr	node
    int	flags
    xmlSchemaWildcardPtr	attributeWildcard
    const xmlChar *	refPrefix	: Deprecated; not used
    xmlSchemaAttributeGroupPtr	refItem	: Deprecated; not used
    const xmlChar *	targetNamespace
    void *	attrUses
} xmlSchemaAttributeGroup;


Typedef xmlSchemaAttributeGroupPtr

xmlSchemaAttributeGroup * xmlSchemaAttributeGroupPtr;


Structure xmlSchemaAttributeLink

struct _xmlSchemaAttributeLink {
    struct _xmlSchemaAttributeLink *	next	: the next attribute link ...
    struct _xmlSchemaAttribute *	attr	: the linked attribute
} xmlSchemaAttributeLink;


Typedef xmlSchemaAttributeLinkPtr

xmlSchemaAttributeLink * xmlSchemaAttributeLinkPtr;


Typedef xmlSchemaAttributePtr

xmlSchemaAttribute * xmlSchemaAttributePtr;



Structure xmlSchemaElement

struct _xmlSchemaElement {
    xmlSchemaTypeType	type	: The kind of type
    struct _xmlSchemaType *	next	: Not used?
    const xmlChar *	name
    const xmlChar *	id	: Deprecated; not used
    const xmlChar *	ref	: Deprecated; not used
    const xmlChar *	refNs	: Deprecated; not used
    xmlSchemaAnnotPtr	annot
    xmlSchemaTypePtr	subtypes	: the type definition
    xmlSchemaAttributePtr	attributes
    xmlNodePtr	node
    int	minOccurs	: Deprecated; not used
    int	maxOccurs	: Deprecated; not used
    int	flags
    const xmlChar *	targetNamespace
    const xmlChar *	namedType
    const xmlChar *	namedTypeNs
    const xmlChar *	substGroup
    const xmlChar *	substGroupNs
    const xmlChar *	scope
    const xmlChar *	value	: The original value of the value constraint.
    struct _xmlSchemaElement *	refDecl	: This will now be used for the substitution group affiliation
    xmlRegexpPtr	contModel	: Obsolete for WXS, maybe used for RelaxNG
    xmlSchemaContentType	contentType
    const xmlChar *	refPrefix	: Deprecated; not used
    xmlSchemaValPtr	defVal	: The compiled value contraint.
    void *	idcs	: The identity-constraint defs
} xmlSchemaElement;


Typedef xmlSchemaElementPtr

xmlSchemaElement * xmlSchemaElementPtr;


Structure xmlSchemaFacet

struct _xmlSchemaFacet {
    xmlSchemaTypeType	type	: The kind of type
    struct _xmlSchemaFacet *	next	: the next type if in a sequence ...
    const xmlChar *	value	: The original value
    const xmlChar *	id	: Obsolete
    xmlSchemaAnnotPtr	annot
    xmlNodePtr	node
    int	fixed	: XML_SCHEMAS_FACET_PRESERVE, etc.
    int	whitespace
    xmlSchemaValPtr	val	: The compiled value
    xmlRegexpPtr	regexp	: The regex for patterns
} xmlSchemaFacet;


Structure xmlSchemaFacetLink

struct _xmlSchemaFacetLink {
    struct _xmlSchemaFacetLink *	next	: the next facet link ...
    xmlSchemaFacetPtr	facet	: the linked facet
} xmlSchemaFacetLink;


Typedef xmlSchemaFacetLinkPtr

xmlSchemaFacetLink * xmlSchemaFacetLinkPtr;


Typedef xmlSchemaFacetPtr

xmlSchemaFacet * xmlSchemaFacetPtr;


Structure xmlSchemaNotation

struct _xmlSchemaNotation {
    xmlSchemaTypeType	type	: The kind of type
    const xmlChar *	name
    xmlSchemaAnnotPtr	annot
    const xmlChar *	identifier
    const xmlChar *	targetNamespace
} xmlSchemaNotation;


Typedef xmlSchemaNotationPtr

xmlSchemaNotation * xmlSchemaNotationPtr;


Structure xmlSchemaType

struct _xmlSchemaType {
    xmlSchemaTypeType	type	: The kind of type
    struct _xmlSchemaType *	next	: the next type if in a sequence ...
    const xmlChar *	name
    const xmlChar *	id	: Deprecated; not used
    const xmlChar *	ref	: Deprecated; not used
    const xmlChar *	refNs	: Deprecated; not used
    xmlSchemaAnnotPtr	annot
    xmlSchemaTypePtr	subtypes
    xmlSchemaAttributePtr	attributes	: Deprecated; not used
    xmlNodePtr	node
    int	minOccurs	: Deprecated; not used
    int	maxOccurs	: Deprecated; not used
    int	flags
    xmlSchemaContentType	contentType
    const xmlChar *	base	: Base type's local name
    const xmlChar *	baseNs	: Base type's target namespace
    xmlSchemaTypePtr	baseType	: The base type component
    xmlSchemaFacetPtr	facets	: Local facets
    struct _xmlSchemaType *	redef	: Deprecated; not used
    int	recurse	: Obsolete
    xmlSchemaAttributeLinkPtr *	attributeUses	: Deprecated; not used
    xmlSchemaWildcardPtr	attributeWildcard
    int	builtInType	: Type of built-in types.
    xmlSchemaTypeLinkPtr	memberTypes	: member-types if a union type.
    xmlSchemaFacetLinkPtr	facetSet	: All facets (incl. inherited)
    const xmlChar *	refPrefix	: Deprecated; not used
    xmlSchemaTypePtr	contentTypeDef	: Used for the simple content of complex types. Could we use @subtypes
    xmlRegexpPtr	contModel	: Holds the automaton of the content model
    const xmlChar *	targetNamespace
    void *	attrUses
} xmlSchemaType;


Structure xmlSchemaTypeLink

struct _xmlSchemaTypeLink {
    struct _xmlSchemaTypeLink *	next	: the next type link ...
    xmlSchemaTypePtr	type	: the linked type
} xmlSchemaTypeLink;


Typedef xmlSchemaTypeLinkPtr

xmlSchemaTypeLink * xmlSchemaTypeLinkPtr;


Typedef xmlSchemaTypePtr

xmlSchemaType * xmlSchemaTypePtr;



Structure xmlSchemaVal

struct _xmlSchemaVal {
The content of this structure is not made public by the API.
} xmlSchemaVal;


Typedef xmlSchemaValPtr

xmlSchemaVal * xmlSchemaValPtr;



Structure xmlSchemaWildcard

struct _xmlSchemaWildcard {
    xmlSchemaTypeType	type	: The kind of type
    const xmlChar *	id	: Deprecated; not used
    xmlSchemaAnnotPtr	annot
    xmlNodePtr	node
    int	minOccurs	: Deprecated; not used
    int	maxOccurs	: Deprecated; not used
    int	processContents
    int	any	: Indicates if the ns constraint is of ##any
    xmlSchemaWildcardNsPtr	nsSet	: The list of allowed namespaces
    xmlSchemaWildcardNsPtr	negNsSet	: The negated namespace
    int	flags
} xmlSchemaWildcard;


Structure xmlSchemaWildcardNs

struct _xmlSchemaWildcardNs {
    struct _xmlSchemaWildcardNs *	next	: the next constraint link ...
    const xmlChar *	value	: the value
} xmlSchemaWildcardNs;


Typedef xmlSchemaWildcardNsPtr

xmlSchemaWildcardNs * xmlSchemaWildcardNsPtr;


Typedef xmlSchemaWildcardPtr

xmlSchemaWildcard * xmlSchemaWildcardPtr;


xmlSchemaFreeType ()

void	xmlSchemaFreeType		(xmlSchemaTypePtr type)

Deallocate a Schema Type structure.

type:a schema type structure

xmlSchemaFreeWildcard ()

void	xmlSchemaFreeWildcard		(xmlSchemaWildcardPtr wildcard)

Deallocates a wildcard structure.

wildcard:a wildcard structure

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-xmlunicode.html0000644000175000017500000032014412134171044021355 0ustar aronaron xmlunicode: Unicode character APIs

xmlunicode

xmlunicode - Unicode character APIs

API for the Unicode character APIs This file is automatically generated from the UCS description files of the Unicode Character Database

Author(s): Daniel Veillard

Synopsis

int	xmlUCSIsBlockElements		(int code);
int	xmlUCSIsBopomofo		(int code);
int	xmlUCSIsDingbats		(int code);
int	xmlUCSIsSuperscriptsandSubscripts	(int code);
int	xmlUCSIsCombiningHalfMarks	(int code);
int	xmlUCSIsTibetan			(int code);
int	xmlUCSIsYiRadicals		(int code);
int	xmlUCSIsCombiningMarksforSymbols	(int code);
int	xmlUCSIsHangulSyllables		(int code);
int	xmlUCSIsBasicLatin		(int code);
int	xmlUCSIsCatSc			(int code);
int	xmlUCSIsCatSo			(int code);
int	xmlUCSIsLimbu			(int code);
int	xmlUCSIsCatSm			(int code);
int	xmlUCSIsCatSk			(int code);
int	xmlUCSIsKhmerSymbols		(int code);
int	xmlUCSIsMongolian		(int code);
int	xmlUCSIsMalayalam		(int code);
int	xmlUCSIsMathematicalAlphanumericSymbols	(int code);
int	xmlUCSIsThaana			(int code);
int	xmlUCSIsMyanmar			(int code);
int	xmlUCSIsTags			(int code);
int	xmlUCSIsCJKCompatibilityIdeographs	(int code);
int	xmlUCSIsTelugu			(int code);
int	xmlUCSIsLowSurrogates		(int code);
int	xmlUCSIsOsmanya			(int code);
int	xmlUCSIsSyriac			(int code);
int	xmlUCSIsEthiopic		(int code);
int	xmlUCSIsBoxDrawing		(int code);
int	xmlUCSIsGreekExtended		(int code);
int	xmlUCSIsGreekandCoptic		(int code);
int	xmlUCSIsKannada			(int code);
int	xmlUCSIsByzantineMusicalSymbols	(int code);
int	xmlUCSIsEnclosedCJKLettersandMonths	(int code);
int	xmlUCSIsCJKCompatibilityForms	(int code);
int	xmlUCSIsCatCs			(int code);
int	xmlUCSIsCJKRadicalsSupplement	(int code);
int	xmlUCSIsCatCf			(int code);
int	xmlUCSIsSmallFormVariants	(int code);
int	xmlUCSIsHangulCompatibilityJamo	(int code);
int	xmlUCSIsCatCc			(int code);
int	xmlUCSIsCatCo			(int code);
int	xmlUCSIsCherokee		(int code);
int	xmlUCSIsGothic			(int code);
int	xmlUCSIsKhmer			(int code);
int	xmlUCSIsCombiningDiacriticalMarksforSymbols	(int code);
int	xmlUCSIsOgham			(int code);
int	xmlUCSIsOriya			(int code);
int	xmlUCSIsLinearBIdeograms	(int code);
int	xmlUCSIsBlock			(int code, 
const char * block); int xmlUCSIsBopomofoExtended (int code); int xmlUCSIsHangulJamo (int code); int xmlUCSIsTagbanwa (int code); int xmlUCSIsGeneralPunctuation (int code); int xmlUCSIsCyrillic (int code); int xmlUCSIsArrows (int code); int xmlUCSIsControlPictures (int code); int xmlUCSIsCJKUnifiedIdeographs (int code); int xmlUCSIsCatNl (int code); int xmlUCSIsCatNo (int code); int xmlUCSIsYijingHexagramSymbols (int code); int xmlUCSIsVariationSelectorsSupplement (int code); int xmlUCSIsBengali (int code); int xmlUCSIsPrivateUse (int code); int xmlUCSIsMusicalSymbols (int code); int xmlUCSIsMiscellaneousSymbols (int code); int xmlUCSIsCJKCompatibility (int code); int xmlUCSIsAegeanNumbers (int code); int xmlUCSIsDevanagari (int code); int xmlUCSIsSupplementalArrowsA (int code); int xmlUCSIsSupplementalArrowsB (int code); int xmlUCSIsNumberForms (int code); int xmlUCSIsSpacingModifierLetters (int code); int xmlUCSIsOpticalCharacterRecognition (int code); int xmlUCSIsCatPc (int code); int xmlUCSIsCatPf (int code); int xmlUCSIsCyrillicSupplement (int code); int xmlUCSIsCatPd (int code); int xmlUCSIsCatPi (int code); int xmlUCSIsCatPo (int code); int xmlUCSIsHighPrivateUseSurrogates (int code); int xmlUCSIsLatinExtendedAdditional (int code); int xmlUCSIsCatPs (int code); int xmlUCSIsHighSurrogates (int code); int xmlUCSIsLao (int code); int xmlUCSIsBraillePatterns (int code); int xmlUCSIsDeseret (int code); int xmlUCSIsEnclosedAlphanumerics (int code); int xmlUCSIsCombiningDiacriticalMarks (int code); int xmlUCSIsIdeographicDescriptionCharacters (int code); int xmlUCSIsPrivateUseArea (int code); int xmlUCSIsCat (int code,
const char * cat); int xmlUCSIsCatLu (int code); int xmlUCSIsCatLt (int code); int xmlUCSIsYiSyllables (int code); int xmlUCSIsShavian (int code); int xmlUCSIsCatLo (int code); int xmlUCSIsCatLm (int code); int xmlUCSIsCatLl (int code); int xmlUCSIsMiscellaneousTechnical (int code); int xmlUCSIsUgaritic (int code); int xmlUCSIsCJKCompatibilityIdeographsSupplement (int code); int xmlUCSIsCypriotSyllabary (int code); int xmlUCSIsTamil (int code); int xmlUCSIsCatC (int code); int xmlUCSIsCatN (int code); int xmlUCSIsCatL (int code); int xmlUCSIsCatM (int code); int xmlUCSIsUnifiedCanadianAboriginalSyllabics (int code); int xmlUCSIsCatS (int code); int xmlUCSIsCatP (int code); int xmlUCSIsSinhala (int code); int xmlUCSIsGeorgian (int code); int xmlUCSIsCatZ (int code); int xmlUCSIsIPAExtensions (int code); int xmlUCSIsKangxiRadicals (int code); int xmlUCSIsGreek (int code); int xmlUCSIsCatPe (int code); int xmlUCSIsHanunoo (int code); int xmlUCSIsArmenian (int code); int xmlUCSIsSupplementaryPrivateUseAreaB (int code); int xmlUCSIsSupplementaryPrivateUseAreaA (int code); int xmlUCSIsKatakanaPhoneticExtensions (int code); int xmlUCSIsLetterlikeSymbols (int code); int xmlUCSIsPhoneticExtensions (int code); int xmlUCSIsArabic (int code); int xmlUCSIsHebrew (int code); int xmlUCSIsOldItalic (int code); int xmlUCSIsArabicPresentationFormsA (int code); int xmlUCSIsCatZp (int code); int xmlUCSIsCatZs (int code); int xmlUCSIsArabicPresentationFormsB (int code); int xmlUCSIsGeometricShapes (int code); int xmlUCSIsCatZl (int code); int xmlUCSIsTagalog (int code); int xmlUCSIsSpecials (int code); int xmlUCSIsGujarati (int code); int xmlUCSIsKatakana (int code); int xmlUCSIsHalfwidthandFullwidthForms (int code); int xmlUCSIsLatinExtendedB (int code); int xmlUCSIsLatinExtendedA (int code); int xmlUCSIsBuhid (int code); int xmlUCSIsMiscellaneousSymbolsandArrows (int code); int xmlUCSIsTaiLe (int code); int xmlUCSIsCJKSymbolsandPunctuation (int code); int xmlUCSIsTaiXuanJingSymbols (int code); int xmlUCSIsGurmukhi (int code); int xmlUCSIsMathematicalOperators (int code); int xmlUCSIsAlphabeticPresentationForms (int code); int xmlUCSIsCurrencySymbols (int code); int xmlUCSIsSupplementalMathematicalOperators (int code); int xmlUCSIsCJKUnifiedIdeographsExtensionA (int code); int xmlUCSIsKanbun (int code); int xmlUCSIsCJKUnifiedIdeographsExtensionB (int code); int xmlUCSIsThai (int code); int xmlUCSIsRunic (int code); int xmlUCSIsCatNd (int code); int xmlUCSIsLatin1Supplement (int code); int xmlUCSIsLinearBSyllabary (int code); int xmlUCSIsHiragana (int code); int xmlUCSIsMiscellaneousMathematicalSymbolsB (int code); int xmlUCSIsMiscellaneousMathematicalSymbolsA (int code); int xmlUCSIsCatMn (int code); int xmlUCSIsVariationSelectors (int code); int xmlUCSIsCatMc (int code); int xmlUCSIsCatMe (int code);

Description

Details







































































































































































libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-relaxng.html0000644000175000017500000010463612134171044020654 0ustar aronaron relaxng: implementation of the Relax-NG validation

relaxng

relaxng - implementation of the Relax-NG validation

implementation of the Relax-NG validation

Author(s): Daniel Veillard

Synopsis

typedef struct _xmlRelaxNG xmlRelaxNG;
typedef xmlRelaxNG * xmlRelaxNGPtr;
typedef enum xmlRelaxNGValidErr;
typedef struct _xmlRelaxNGParserCtxt xmlRelaxNGParserCtxt;
typedef xmlRelaxNGParserCtxt * xmlRelaxNGParserCtxtPtr;
typedef enum xmlRelaxNGParserFlag;
typedef struct _xmlRelaxNGValidCtxt xmlRelaxNGValidCtxt;
typedef xmlRelaxNGValidCtxt * xmlRelaxNGValidCtxtPtr;
void	xmlRelaxNGFreeValidCtxt		(xmlRelaxNGValidCtxtPtr ctxt);
xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewDocParserCtxt	(xmlDocPtr doc);
void	xmlRelaxNGSetValidErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
xmlRelaxNGValidityErrorFunc err,
xmlRelaxNGValidityWarningFunc warn,
void * ctx); xmlRelaxNGParserCtxtPtr xmlRelaxNGNewParserCtxt (const char * URL); int xmlRelaxNGGetParserErrors (xmlRelaxNGParserCtxtPtr ctxt,
xmlRelaxNGValidityErrorFunc * err,
xmlRelaxNGValidityWarningFunc * warn,
void ** ctx); int xmlRelaxNGValidatePopElement (xmlRelaxNGValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem); xmlRelaxNGValidCtxtPtr xmlRelaxNGNewValidCtxt (xmlRelaxNGPtr schema); xmlRelaxNGParserCtxtPtr xmlRelaxNGNewMemParserCtxt (const char * buffer,
int size); void xmlRelaxNGDump (FILE * output,
xmlRelaxNGPtr schema); void xmlRelaxNGSetParserErrors (xmlRelaxNGParserCtxtPtr ctxt,
xmlRelaxNGValidityErrorFunc err,
xmlRelaxNGValidityWarningFunc warn,
void * ctx); xmlRelaxNGPtr xmlRelaxNGParse (xmlRelaxNGParserCtxtPtr ctxt); void xmlRelaxNGSetParserStructuredErrors (xmlRelaxNGParserCtxtPtr ctxt,
xmlStructuredErrorFunc serror,
void * ctx); int xmlRelaxNGValidateFullElement (xmlRelaxNGValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem); typedef void xmlRelaxNGValidityErrorFunc (void * ctx,
const char * msg,
... ...); int xmlRelaxNGValidatePushElement (xmlRelaxNGValidCtxtPtr ctxt,
xmlDocPtr doc,
xmlNodePtr elem); void xmlRelaxNGFree (xmlRelaxNGPtr schema); int xmlRelaxNGValidateDoc (xmlRelaxNGValidCtxtPtr ctxt,
xmlDocPtr doc); void xmlRelaxNGSetValidStructuredErrors (xmlRelaxNGValidCtxtPtr ctxt,
xmlStructuredErrorFunc serror,
void * ctx); void xmlRelaxNGFreeParserCtxt (xmlRelaxNGParserCtxtPtr ctxt); int xmlRelaxNGGetValidErrors (xmlRelaxNGValidCtxtPtr ctxt,
xmlRelaxNGValidityErrorFunc * err,
xmlRelaxNGValidityWarningFunc * warn,
void ** ctx); int xmlRelaxNGInitTypes (void); void xmlRelaxNGDumpTree (FILE * output,
xmlRelaxNGPtr schema); void xmlRelaxNGCleanupTypes (void); int xmlRelaxNGValidatePushCData (xmlRelaxNGValidCtxtPtr ctxt,
const xmlChar * data,
int len); int xmlRelaxParserSetFlag (xmlRelaxNGParserCtxtPtr ctxt,
int flags); typedef void xmlRelaxNGValidityWarningFunc (void * ctx,
const char * msg,
... ...);

Description

Details

Structure xmlRelaxNG

struct _xmlRelaxNG {
The content of this structure is not made public by the API.
} xmlRelaxNG;


Structure xmlRelaxNGParserCtxt

struct _xmlRelaxNGParserCtxt {
The content of this structure is not made public by the API.
} xmlRelaxNGParserCtxt;


Typedef xmlRelaxNGParserCtxtPtr

xmlRelaxNGParserCtxt * xmlRelaxNGParserCtxtPtr;



Typedef xmlRelaxNGPtr

xmlRelaxNG * xmlRelaxNGPtr;


Structure xmlRelaxNGValidCtxt

struct _xmlRelaxNGValidCtxt {
The content of this structure is not made public by the API.
} xmlRelaxNGValidCtxt;


Typedef xmlRelaxNGValidCtxtPtr

xmlRelaxNGValidCtxt * xmlRelaxNGValidCtxtPtr;






xmlRelaxNGDump ()

void	xmlRelaxNGDump			(FILE * output, 
xmlRelaxNGPtr schema)

Dump a RelaxNG structure back

output:the file output
schema:a schema structure

xmlRelaxNGDumpTree ()

void	xmlRelaxNGDumpTree		(FILE * output, 
xmlRelaxNGPtr schema)

Dump the transformed RelaxNG tree.

output:the file output
schema:a schema structure

xmlRelaxNGFree ()

void	xmlRelaxNGFree			(xmlRelaxNGPtr schema)

Deallocate a RelaxNG structure.

schema:a schema structure

xmlRelaxNGFreeParserCtxt ()

void	xmlRelaxNGFreeParserCtxt	(xmlRelaxNGParserCtxtPtr ctxt)

Free the resources associated to the schema parser context

ctxt:the schema parser context

xmlRelaxNGFreeValidCtxt ()

void	xmlRelaxNGFreeValidCtxt		(xmlRelaxNGValidCtxtPtr ctxt)

Free the resources associated to the schema validation context

ctxt:the schema validation context

xmlRelaxNGGetParserErrors ()

int	xmlRelaxNGGetParserErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
xmlRelaxNGValidityErrorFunc * err,
xmlRelaxNGValidityWarningFunc * warn,
void ** ctx)

Get the callback information used to handle errors for a validation context

ctxt:a Relax-NG validation context
err:the error callback result
warn:the warning callback result
ctx:contextual data for the callbacks result
Returns:-1 in case of failure, 0 otherwise.

xmlRelaxNGGetValidErrors ()

int	xmlRelaxNGGetValidErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
xmlRelaxNGValidityErrorFunc * err,
xmlRelaxNGValidityWarningFunc * warn,
void ** ctx)

Get the error and warning callback informations

ctxt:a Relax-NG validation context
err:the error function result
warn:the warning function result
ctx:the functions context result
Returns:-1 in case of error and 0 otherwise


xmlRelaxNGNewDocParserCtxt ()

xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewDocParserCtxt	(xmlDocPtr doc)

Create an XML RelaxNGs parser context for that document. Note: since the process of compiling a RelaxNG schemas modifies the document, the @doc parameter is duplicated internally.

doc:a preparsed document tree
Returns:the parser context or NULL in case of error

xmlRelaxNGNewMemParserCtxt ()

xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewMemParserCtxt	(const char * buffer, 
int size)

Create an XML RelaxNGs parse context for that memory buffer expected to contain an XML RelaxNGs file.

buffer:a pointer to a char array containing the schemas
size:the size of the array
Returns:the parser context or NULL in case of error

xmlRelaxNGNewParserCtxt ()

xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewParserCtxt	(const char * URL)

Create an XML RelaxNGs parse context for that file/resource expected to contain an XML RelaxNGs file.

URL:the location of the schema
Returns:the parser context or NULL in case of error

xmlRelaxNGNewValidCtxt ()

xmlRelaxNGValidCtxtPtr	xmlRelaxNGNewValidCtxt	(xmlRelaxNGPtr schema)

Create an XML RelaxNGs validation context based on the given schema

schema:a precompiled XML RelaxNGs
Returns:the validation context or NULL in case of error

xmlRelaxNGParse ()

xmlRelaxNGPtr	xmlRelaxNGParse		(xmlRelaxNGParserCtxtPtr ctxt)

parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances.

ctxt:a Relax-NG parser context
Returns:the internal XML RelaxNG structure built from the resource or NULL in case of error

xmlRelaxNGSetParserErrors ()

void	xmlRelaxNGSetParserErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
xmlRelaxNGValidityErrorFunc err,
xmlRelaxNGValidityWarningFunc warn,
void * ctx)

Set the callback functions used to handle errors for a validation context

ctxt:a Relax-NG validation context
err:the error callback
warn:the warning callback
ctx:contextual data for the callbacks

xmlRelaxNGSetParserStructuredErrors ()

void	xmlRelaxNGSetParserStructuredErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
xmlStructuredErrorFunc serror,
void * ctx)

Set the callback functions used to handle errors for a parsing context

ctxt:a Relax-NG parser context
serror:the error callback
ctx:contextual data for the callbacks

xmlRelaxNGSetValidErrors ()

void	xmlRelaxNGSetValidErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
xmlRelaxNGValidityErrorFunc err,
xmlRelaxNGValidityWarningFunc warn,
void * ctx)

Set the error and warning callback informations

ctxt:a Relax-NG validation context
err:the error function
warn:the warning function
ctx:the functions context

xmlRelaxNGSetValidStructuredErrors ()

void	xmlRelaxNGSetValidStructuredErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
xmlStructuredErrorFunc serror,
void * ctx)

Set the structured error callback

ctxt:a Relax-NG validation context
serror:the structured error function
ctx:the functions context

xmlRelaxNGValidateDoc ()

int	xmlRelaxNGValidateDoc		(xmlRelaxNGValidCtxtPtr ctxt, 
xmlDocPtr doc)

Validate a document tree in memory.

ctxt:a Relax-NG validation context
doc:a parsed document tree
Returns:0 if the document is valid, a positive error code number otherwise and -1 in case of internal or API error.

xmlRelaxNGValidateFullElement ()

int	xmlRelaxNGValidateFullElement	(xmlRelaxNGValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem)

Validate a full subtree when xmlRelaxNGValidatePushElement() returned 0 and the content of the node has been expanded.

ctxt:the validation context
doc:a document instance
elem:an element instance
Returns:1 if no validation problem was found or -1 in case of error.

xmlRelaxNGValidatePopElement ()

int	xmlRelaxNGValidatePopElement	(xmlRelaxNGValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem)

Pop the element end from the RelaxNG validation stack.

ctxt:the RelaxNG validation context
doc:a document instance
elem:an element instance
Returns:1 if no validation problem was found or 0 otherwise

xmlRelaxNGValidatePushCData ()

int	xmlRelaxNGValidatePushCData	(xmlRelaxNGValidCtxtPtr ctxt, 
const xmlChar * data,
int len)

check the CData parsed for validation in the current stack

ctxt:the RelaxNG validation context
data:some character data read
len:the length of the data
Returns:1 if no validation problem was found or -1 otherwise

xmlRelaxNGValidatePushElement ()

int	xmlRelaxNGValidatePushElement	(xmlRelaxNGValidCtxtPtr ctxt, 
xmlDocPtr doc,
xmlNodePtr elem)

Push a new element start on the RelaxNG validation stack.

ctxt:the validation context
doc:a document instance
elem:an element instance
Returns:1 if no validation problem was found or 0 if validating the element requires a full node, and -1 in case of error.

xmlRelaxParserSetFlag ()

int	xmlRelaxParserSetFlag		(xmlRelaxNGParserCtxtPtr ctxt, 
int flags)

Semi private function used to pass informations to a parser context which are a combination of xmlRelaxNGParserFlag .

ctxt:a RelaxNG parser context
flags:a set of flags values
Returns:0 if success and -1 in case of error

libxml2-2.9.1+dfsg1/doc/devhelp/devhelp.xsl0000644000175000017500000001257011234335462017137 0ustar aronaron <xsl:value-of select="concat(@name, ': ', summary)"/>

-

WARNING: this module is deprecated !

Author(s):

Synopsis

	    
	  

Description

Details

libxml2-2.9.1+dfsg1/doc/devhelp/libxml2-c14n.html0000644000175000017500000003235212134171043017753 0ustar aronaron c14n: Provide Canonical XML and Exclusive XML Canonicalization

c14n

c14n - Provide Canonical XML and Exclusive XML Canonicalization

the c14n modules provides a "Canonical XML" implementation

Author(s): Aleksey Sanin <aleksey@aleksey.com>

Synopsis

typedef enum xmlC14NMode;
int	xmlC14NExecute			(xmlDocPtr doc, 
xmlC14NIsVisibleCallback is_visible_callback,
void * user_data,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
xmlOutputBufferPtr buf); int xmlC14NDocSaveTo (xmlDocPtr doc,
xmlNodeSetPtr nodes,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
xmlOutputBufferPtr buf); typedef int xmlC14NIsVisibleCallback (void * user_data,
xmlNodePtr node,
xmlNodePtr parent); int xmlC14NDocSave (xmlDocPtr doc,
xmlNodeSetPtr nodes,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
const char * filename,
int compression); int xmlC14NDocDumpMemory (xmlDocPtr doc,
xmlNodeSetPtr nodes,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
xmlChar ** doc_txt_ptr);

Description

Details

Enum xmlC14NMode

enum xmlC14NMode {
    XML_C14N_1_0 = 0 /* Origianal C14N 1.0 spec */
    XML_C14N_EXCLUSIVE_1_0 = 1 /* Exclusive C14N 1.0 spec */
    XML_C14N_1_1 = 2 /*  C14N 1.1 spec */
};


Function type xmlC14NIsVisibleCallback

int	xmlC14NIsVisibleCallback	(void * user_data, 
xmlNodePtr node,
xmlNodePtr parent)

Signature for a C14N callback on visible nodes

user_data:user data
node:the curent node
parent:the parent node
Returns:1 if the node should be included

xmlC14NDocDumpMemory ()

int	xmlC14NDocDumpMemory		(xmlDocPtr doc, 
xmlNodeSetPtr nodes,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
xmlChar ** doc_txt_ptr)

Dumps the canonized image of given XML document into memory. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

doc:the XML document for canonization
nodes:the nodes set to be included in the canonized image or NULL if all document nodes should be included
mode:the c14n mode (see @xmlC14NMode)
inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
with_comments:include comments in the result (!=0) or not (==0)
doc_txt_ptr:the memory pointer for allocated canonical XML text; the caller of this functions is responsible for calling xmlFree() to free allocated memory
Returns:the number of bytes written on success or a negative value on fail

xmlC14NDocSave ()

int	xmlC14NDocSave			(xmlDocPtr doc, 
xmlNodeSetPtr nodes,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
const char * filename,
int compression)

Dumps the canonized image of given XML document into the file. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

doc:the XML document for canonization
nodes:the nodes set to be included in the canonized image or NULL if all document nodes should be included
mode:the c14n mode (see @xmlC14NMode)
inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
with_comments:include comments in the result (!=0) or not (==0)
filename:the filename to store canonical XML image
compression:the compression level (zlib requred): -1 - libxml default, 0 - uncompressed, >0 - compression level
Returns:the number of bytes written success or a negative value on fail

xmlC14NDocSaveTo ()

int	xmlC14NDocSaveTo		(xmlDocPtr doc, 
xmlNodeSetPtr nodes,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
xmlOutputBufferPtr buf)

Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

doc:the XML document for canonization
nodes:the nodes set to be included in the canonized image or NULL if all document nodes should be included
mode:the c14n mode (see @xmlC14NMode)
inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
with_comments:include comments in the result (!=0) or not (==0)
buf:the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output
Returns:non-negative value on success or a negative value on fail

xmlC14NExecute ()

int	xmlC14NExecute			(xmlDocPtr doc, 
xmlC14NIsVisibleCallback is_visible_callback,
void * user_data,
int mode,
xmlChar ** inclusive_ns_prefixes,
int with_comments,
xmlOutputBufferPtr buf)

Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

doc:the XML document for canonization
is_visible_callback:the function to use to determine is node visible or not
user_data:the first parameter for @is_visible_callback function (in most cases, it is nodes set)
mode:the c14n mode (see @xmlC14NMode)
inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
with_comments:include comments in the result (!=0) or not (==0)
buf:the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output
Returns:non-negative value on success or a negative value on fail

libxml2-2.9.1+dfsg1/doc/smallfootonly.gif0000644000175000017500000000532411234335462016721 0ustar aronaronGIF89a0<ç BBD††„¦¦¤ºº´ÊÊÄÖÖÔÞÞÜVVT62,ææäffd&&$êêì“’Œîîì~~|òòôööô›š”nnl²²¬JJLúúü¾´¦šŒ’†|zz|º®¤š’„ ¶ªœbVL>>4’ŽŒ""$¿¶¬>:4ÒÎÄ¥ž”––” vnd‚vlqjdÂÂÄŽ‚|Š‚tÚÖÔ‚ztb^XŽŽŒæâܶ®¬224’’”jb\&"¦–Œ²²´NNL²¦œ¦¢ ®¢œžŽ„ÊÊÌššœ’‚t‡zt*&$wjdª¦œjjd¢–ŒâÞÜJFD¿¶´zrlŽ‚tƾ¼ÖÒÔ–†|ŠŠŒ¾²¬ÖÒÌbZTFFDîêì:6,ÞÚÜ/*,VJD²®¬^ZTÆÂÄÞÚÔ^RL6.,F>4::<¾¾¼&"$ÎÆÄ$h^\ÖÎÌ¢¢¤ªª¬tplXNLކ„~rlž’Œ†vlæâä–Š„²ª¤êæäŠ~t ƺ´¦š”šŠ„VRL¶²´NFD~ndrf\j^T:2,nb\‚‚„^^\ªžœ¾º¼ââ䢖”І„–ŽŒª¢œ¶ª¤ÒÎÌ’‚|>64bZLºº¼º®¬®¦¤**,ª¦¤nbT624F><‚rlB><~vtŠ‚|jjl:64VRTÎÊÄjfdž’„®ž”¦žœ–’”²¢œžšœÊ¾¼ÚÒ̾¼!þCreated with The GIMP,0<þ[H° ÁÀÀ:0á Ã‡6ÈRD "jÜHP#z«Âq`·`Ç“ûÀÚÖà†ž0¬:dD©qÂm JHW@Á‘(ÈØ$(¢"'M‡ø ħOÎP*˜Zåå“,VØPÁ9êðÁz(ÖèêQ®aŸG¡bFIššØHàjI/@«Ü,a‡ÎF®~Üp$ŒÃ(X0I—`9¸v„ 1Ê mUò¹ØI4·£¢Òx`[ú*Èð±dœ% œÓ´(‡=aŠ$®Õ'CiôHˆò3¬„¢s.ô-˜+¿ÔH ÏoÛĸÀ×28ÀZ¨ë: †Ðe ðÒàpì¢ÊpÁÜ€Œh´BSþ @.†wä`€<ˆ<ÀÎHƒˆàœ ÓHŒpä©èÅ#œáŠt8á 0À«"'hB€Àÿ@‚0x Ò«úàŠp”«€ÅꈈsE$0 v :,£‡?OºG8¨ `˜Jã„pdÖpüb¨Á(Ôôá™à؇&º`½¨¡IøAP…xÁæðA$H€Š9`ãàèC?¸ašHA¸ Ž°£Uhâ*ú€zpG.°Ê/d8C±Œ5¬Á{˜9~¡ %4€PC²E´ñMpÀ/€@ FÔa:à$"±Q 5\Ð<Œà jõÁ}Ç&„`ŒEØ€ ¸{ü œ@z¼±oˆÃÜà/ÄÀ°0À61μuSÍþ…T ‘ À!—¸Ç""qoDB>ÈÆ–á"h/ÛðÁ @V²`„UòDÈâ¢ð±eø@ø0æ7:A„)nÁßí^p lPÀ[A šAp@kˆÄ24¡‰o¸!XFŒáG,b Ÿ F0 € €¡y€>¦ i ã:X„ŒaŒb-b  |pQD£s¸!N1†øj(Sƒ,.\ àÃ2ðí|° àƒ]Å-(@ˆÞ¹‹@¶hF8a +@ƒ’[„ÖPãeHÙ²ðY‘Ñ!€)ÑÅ#ÍPCJ@jX¡ ”B§Äñ dt!´ÚœâÁ„5¢äå‚% 0 3”€tê°‚Ì,‹qˆ0P„ ”B EPŸ×!qLãŠØ[ 0À‹ý&!x…æ‡<Ô {ë!P/_G x€$ðptð.ÕËDöêv6@'è@#1‡"h/hDñ¡^ï`‚ ð0 Œ U(¢³9 4àÛI‹H@;libxml2-2.9.1+dfsg1/doc/xmllint.10000644000175000017500000003211012124465262015073 0ustar aronaron'\" t .\" Title: xmllint .\" Author: John Fleck .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: $Date$ .\" Manual: xmllint Manual .\" Source: libxml2 .\" Language: English .\" .TH "XMLLINT" "1" "$Date$" "libxml2" "xmllint Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" xmllint \- command line XML tool .SH "SYNOPSIS" .HP \w'\fBxmllint\fR\ 'u \fBxmllint\fR [\fB\-\-version\fR | \fB\-\-debug\fR | \fB\-\-shell\fR | \fB\-\-xpath\ "\fR\fB\fIXPath_expression\fR\fR\fB"\fR | \fB\-\-debugent\fR | \fB\-\-copy\fR | \fB\-\-recover\fR | \fB\-\-noent\fR | \fB\-\-noout\fR | \fB\-\-nonet\fR | \fB\-\-path\ "\fR\fB\fIPATH(S)\fR\fR\fB"\fR | \fB\-\-load\-trace\fR | \fB\-\-htmlout\fR | \fB\-\-nowrap\fR | \fB\-\-valid\fR | \fB\-\-postvalid\fR | \fB\-\-dtdvalid\ \fR\fB\fIURL\fR\fR | \fB\-\-dtdvalidfpi\ \fR\fB\fIFPI\fR\fR | \fB\-\-timing\fR | \fB\-\-output\ \fR\fB\fIFILE\fR\fR | \fB\-\-repeat\fR | \fB\-\-insert\fR | \fB\-\-compress\fR | \fB\-\-html\fR | \fB\-\-xmlout\fR | \fB\-\-push\fR | \fB\-\-memory\fR | \fB\-\-maxmem\ \fR\fB\fINBBYTES\fR\fR | \fB\-\-nowarning\fR | \fB\-\-noblanks\fR | \fB\-\-nocdata\fR | \fB\-\-format\fR | \fB\-\-encode\ \fR\fB\fIENCODING\fR\fR | \fB\-\-dropdtd\fR | \fB\-\-nsclean\fR | \fB\-\-testIO\fR | \fB\-\-catalogs\fR | \fB\-\-nocatalogs\fR | \fB\-\-auto\fR | \fB\-\-xinclude\fR | \fB\-\-noxincludenode\fR | \fB\-\-loaddtd\fR | \fB\-\-dtdattr\fR | \fB\-\-stream\fR | \fB\-\-walker\fR | \fB\-\-pattern\ \fR\fB\fIPATTERNVALUE\fR\fR | \fB\-\-chkregister\fR | \fB\-\-relaxng\ \fR\fB\fISCHEMA\fR\fR | \fB\-\-schema\ \fR\fB\fISCHEMA\fR\fR | \fB\-\-c14n\fR] {\fIXML\-FILE(S)\fR... | \-} .HP \w'\fBxmllint\fR\ 'u \fBxmllint\fR \fB\-\-help\fR .SH "DESCRIPTION" .PP The \fBxmllint\fR program parses one or more XML files, specified on the command line as \fIXML\-FILE\fR (or the standard input if the filename provided is \fB\-\fR )\&. It prints various types of output, depending upon the options selected\&. It is useful for detecting errors both in XML code and in the XML parser itself\&. .PP \fBxmllint\fR is included in \fBlibxml\fR(3)\&. .SH "OPTIONS" .PP \fBxmllint\fR accepts the following options (in alphabetical order): .PP \fB\-\-auto\fR .RS 4 Generate a small document for testing purposes\&. .RE .PP \fB\-\-catalogs\fR .RS 4 Use the SGML catalog(s) from \fBSGML_CATALOG_FILES\fR\&. Otherwise XML catalogs starting from /etc/xml/catalog are used by default\&. .RE .PP \fB\-\-chkregister\fR .RS 4 Turn on node registration\&. Useful for developers testing \fBlibxml\fR(3) node tracking code\&. .RE .PP \fB\-\-compress\fR .RS 4 Turn on \fBgzip\fR(1) compression of output\&. .RE .PP \fB\-\-copy\fR .RS 4 Test the internal copy implementation\&. .RE .PP \fB\-\-c14n\fR .RS 4 Use the W3C XML Canonicalisation (C14N) to serialize the result of parsing to stdout\&. It keeps comments in the result\&. .RE .PP \fB\-\-dtdvalid \fR\fB\fIURL\fR\fR .RS 4 Use the DTD specified by an \fIURL\fR for validation\&. .RE .PP \fB\-\-dtdvalidfpi \fR\fB\fIFPI\fR\fR .RS 4 Use the DTD specified by a Formal Public Identifier \fIFPI\fR for validation, note that this will require a catalog exporting that Formal Public Identifier to work\&. .RE .PP \fB\-\-debug\fR .RS 4 Parse a file and output an annotated tree of the in\-memory version of the document\&. .RE .PP \fB\-\-debugent\fR .RS 4 Debug the entities defined in the document\&. .RE .PP \fB\-\-dropdtd\fR .RS 4 Remove DTD from output\&. .RE .PP \fB\-\-dtdattr\fR .RS 4 Fetch external DTD and populate the tree with inherited attributes\&. .RE .PP \fB\-\-encode \fR\fB\fIENCODING\fR\fR .RS 4 Output in the given encoding\&. .RE .PP \fB\-\-format\fR .RS 4 Reformat and reindent the output\&. The \fBXMLLINT_INDENT\fR environment variable controls the indentation\&. The default value is two spaces " ")\&. .RE .PP \fB\-\-help\fR .RS 4 Print out a short usage summary for \fBxmllint\fR\&. .RE .PP \fB\-\-html\fR .RS 4 Use the HTML parser\&. .RE .PP \fB\-\-htmlout\fR .RS 4 Output results as an HTML file\&. This causes \fBxmllint\fR to output the necessary HTML tags surrounding the result tree output so the results can be displayed/viewed in a browser\&. .RE .PP \fB\-\-insert\fR .RS 4 Test for valid insertions\&. .RE .PP \fB\-\-loaddtd\fR .RS 4 Fetch an external DTD\&. .RE .PP \fB\-\-load\-trace\fR .RS 4 Display all the documents loaded during the processing to stderr\&. .RE .PP \fB\-\-maxmem \fR\fB\fINNBYTES\fR\fR .RS 4 Test the parser memory support\&. \fINNBYTES\fR is the maximum number of bytes the library is allowed to allocate\&. This can also be used to make sure batch processing of XML files will not exhaust the virtual memory of the server running them\&. .RE .PP \fB\-\-memory\fR .RS 4 Parse from memory\&. .RE .PP \fB\-\-noblanks\fR .RS 4 Drop ignorable blank spaces\&. .RE .PP \fB\-\-nocatalogs\fR .RS 4 Do not use any catalogs\&. .RE .PP \fB\-\-nocdata\fR .RS 4 Substitute CDATA section by equivalent text nodes\&. .RE .PP \fB\-\-noent\fR .RS 4 Substitute entity values for entity references\&. By default, \fBxmllint\fR leaves entity references in place\&. .RE .PP \fB\-\-nonet\fR .RS 4 Do not use the Internet to fetch DTDs or entities\&. .RE .PP \fB\-\-noout\fR .RS 4 Suppress output\&. By default, \fBxmllint\fR outputs the result tree\&. .RE .PP \fB\-\-nowarning\fR .RS 4 Do not emit warnings from the parser and/or validator\&. .RE .PP \fB\-\-nowrap\fR .RS 4 Do not output HTML doc wrapper\&. .RE .PP \fB\-\-noxincludenode\fR .RS 4 Do XInclude processing but do not generate XInclude start and end nodes\&. .RE .PP \fB\-\-nsclean\fR .RS 4 Remove redundant namespace declarations\&. .RE .PP \fB\-\-output \fR\fB\fIFILE\fR\fR .RS 4 Define a file path where \fBxmllint\fR will save the result of parsing\&. Usually the programs build a tree and save it on stdout, with this option the result XML instance will be saved onto a file\&. .RE .PP \fB\-\-path "\fR\fB\fIPATH(S)\fR\fR\fB"\fR .RS 4 Use the (space\- or colon\-separated) list of filesystem paths specified by \fIPATHS\fR to load DTDs or entities\&. Enclose space\-separated lists by quotation marks\&. .RE .PP \fB\-\-pattern \fR\fB\fIPATTERNVALUE\fR\fR .RS 4 Used to exercise the pattern recognition engine, which can be used with the reader interface to the parser\&. It allows to select some nodes in the document based on an XPath (subset) expression\&. Used for debugging\&. .RE .PP \fB\-\-postvalid\fR .RS 4 Validate after parsing has completed\&. .RE .PP \fB\-\-push\fR .RS 4 Use the push mode of the parser\&. .RE .PP \fB\-\-recover\fR .RS 4 Output any parsable portions of an invalid document\&. .RE .PP \fB\-\-relaxng \fR\fB\fISCHEMA\fR\fR .RS 4 Use RelaxNG file named \fISCHEMA\fR for validation\&. .RE .PP \fB\-\-repeat\fR .RS 4 Repeat 100 times, for timing or profiling\&. .RE .PP \fB\-\-schema \fR\fB\fISCHEMA\fR\fR .RS 4 Use a W3C XML Schema file named \fISCHEMA\fR for validation\&. .RE .PP \fB\-\-shell\fR .RS 4 Run a navigating shell\&. Details on available commands in shell mode are below (see the section called \(lqSHELL COMMANDS\(rq)\&. .RE .PP \fB\-\-xpath "\fR\fB\fIXPath_expression\fR\fR\fB"\fR .RS 4 Run an XPath expression given as argument and print the result\&. In case of a nodeset result, each node in the node set is serialized in full in the output\&. In case of an empty node set the "XPath set is empty" result will be shown and an error exit code will be returned\&. .RE .PP \fB\-\-stream\fR .RS 4 Use streaming API \- useful when used in combination with \fB\-\-relaxng\fR or \fB\-\-valid\fR options for validation of files that are too large to be held in memory\&. .RE .PP \fB\-\-testIO\fR .RS 4 Test user input/output support\&. .RE .PP \fB\-\-timing\fR .RS 4 Output information about the time it takes \fBxmllint\fR to perform the various steps\&. .RE .PP \fB\-\-valid\fR .RS 4 Determine if the document is a valid instance of the included Document Type Definition (DTD)\&. A DTD to be validated against also can be specified at the command line using the \fB\-\-dtdvalid\fR option\&. By default, \fBxmllint\fR also checks to determine if the document is well\-formed\&. .RE .PP \fB\-\-version\fR .RS 4 Display the version of \fBlibxml\fR(3) used\&. .RE .PP \fB\-\-walker\fR .RS 4 Test the walker module, which is a reader interface but for a document tree, instead of using the reader API on an unparsed document it works on an existing in\-memory tree\&. Used for debugging\&. .RE .PP \fB\-\-xinclude\fR .RS 4 Do XInclude processing\&. .RE .PP \fB\-\-xmlout\fR .RS 4 Used in conjunction with \fB\-\-html\fR\&. Usually when HTML is parsed the document is saved with the HTML serializer\&. But with this option the resulting document is saved with the XML serializer\&. This is primarily used to generate XHTML from HTML input\&. .RE .SH "SHELL COMMANDS" .PP \fBxmllint\fR offers an interactive shell mode invoked with the \fB\-\-shell\fR command\&. Available commands in shell mode include (in alphabetical order): .PP \fBbase\fR .RS 4 Display XML base of the node\&. .RE .PP \fBbye\fR .RS 4 Leave the shell\&. .RE .PP \fBcat \fR\fB\fINODE\fR\fR .RS 4 Display the given node or the current one\&. .RE .PP \fBcd \fR\fB\fIPATH\fR\fR .RS 4 Change the current node to the given path (if unique) or root if no argument is given\&. .RE .PP \fBdir \fR\fB\fIPATH\fR\fR .RS 4 Dumps information about the node (namespace, attributes, content)\&. .RE .PP \fBdu \fR\fB\fIPATH\fR\fR .RS 4 Show the structure of the subtree under the given path or the current node\&. .RE .PP \fBexit\fR .RS 4 Leave the shell\&. .RE .PP \fBhelp\fR .RS 4 Show this help\&. .RE .PP \fBfree\fR .RS 4 Display memory usage\&. .RE .PP \fBload \fR\fB\fIFILENAME\fR\fR .RS 4 Load a new document with the given filename\&. .RE .PP \fBls \fR\fB\fIPATH\fR\fR .RS 4 List contents of the given path or the current directory\&. .RE .PP \fBpwd\fR .RS 4 Display the path to the current node\&. .RE .PP \fBquit\fR .RS 4 Leave the shell\&. .RE .PP \fBsave \fR\fB\fIFILENAME\fR\fR .RS 4 Save the current document to the given filename or to the original name\&. .RE .PP \fBvalidate\fR .RS 4 Check the document for errors\&. .RE .PP \fBwrite \fR\fB\fIFILENAME\fR\fR .RS 4 Write the current node to the given filename\&. .RE .SH "ENVIRONMENT" .PP \fBSGML_CATALOG_FILES\fR .RS 4 SGML catalog behavior can be changed by redirecting queries to the user\*(Aqs own set of catalogs\&. This can be done by setting the \fBSGML_CATALOG_FILES\fR environment variable to a list of catalogs\&. An empty one should deactivate loading the default /etc/sgml/catalog catalog\&. .RE .PP \fBXML_CATALOG_FILES\fR .RS 4 XML catalog behavior can be changed by redirecting queries to the user\*(Aqs own set of catalogs\&. This can be done by setting the \fBXML_CATALOG_FILES\fR environment variable to a list of catalogs\&. An empty one should deactivate loading the default /etc/xml/catalog catalog\&. .RE .PP \fBXML_DEBUG_CATALOG\fR .RS 4 Setting the environment variable \fBXML_DEBUG_CATALOG\fR to \fInon\-zero\fR using the \fBexport\fR command outputs debugging information related to catalog operations\&. .RE .PP \fBXMLLINT_INDENT\fR .RS 4 Setting the environment variable \fBXMLLINT_INDENT\fR controls the indentation\&. The default value is two spaces " "\&. .RE .SH "DIAGNOSTICS" .PP \fBxmllint\fR return codes provide information that can be used when calling it from scripts\&. .PP \fB0\fR .RS 4 No error .RE .PP \fB1\fR .RS 4 Unclassified .RE .PP \fB2\fR .RS 4 Error in DTD .RE .PP \fB3\fR .RS 4 Validation error .RE .PP \fB4\fR .RS 4 Validation error .RE .PP \fB5\fR .RS 4 Error in schema compilation .RE .PP \fB6\fR .RS 4 Error writing output .RE .PP \fB7\fR .RS 4 Error in pattern (generated when \fB\-\-pattern\fR option is used) .RE .PP \fB8\fR .RS 4 Error in Reader registration (generated when \fB\-\-chkregister\fR option is used) .RE .PP \fB9\fR .RS 4 Out of memory error .RE .SH "SEE ALSO" .PP \fBlibxml\fR(3) .PP More information can be found at .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBlibxml\fR(3) web page \m[blue]\fB\%http://www.xmlsoft.org/\fR\m[] .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} W3C XSLT page \m[blue]\fB\%http://www.w3.org/TR/xslt\fR\m[] .RE .sp .SH "AUTHORS" .PP \fBJohn Fleck\fR <\&jfleck@inkstain\&.net\&> .RS 4 Author. .RE .PP \fBZiying Sherwin\fR <\&sherwin@nlm\&.nih\&.gov\&> .RS 4 Author. .RE .PP \fBHeiko Rupp\fR <\&hwr@pilhuhn\&.de\&> .RS 4 Author. .RE .SH "COPYRIGHT" .br Copyright \(co 2001, 2004 .br libxml2-2.9.1+dfsg1/doc/APIchunk25.html0000644000175000017500000012140212134171042016013 0ustar aronaron API Alphabetic Index t-t for libxml2
Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
Made with Libxml2 Logo

The XML C parser and toolkit of Gnome

API Alphabetic Index t-t for libxml2

Developer Menu
API Indexes
Related links

A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

Letter t:

tag
_htmlElemDesc
htmlAutoCloseTag
htmlIsAutoClosed
htmlTagLookup
startElement
startElementSAXFunc
xmlNodeSetName
xmlParseEndTag
xmlParseStartTag
xmlSAX2StartElement
xmlTextWriterFullEndElement
tagged
isStandalone
isStandaloneSAXFunc
xmlNewNsProp
xmlNewNsPropEatName
xmlSAX2IsStandalone
tags
htmlAutoCloseTag
htmlGetMetaEncoding
htmlHandleOmittedElem
htmlInitAutoClose
htmlIsAutoClosed
htmlSetMetaEncoding
take
xmlLockLibrary
taken
xmlDocSetRootElement
takes
xmlSchemaValidateFacetWhtsp
tatkes
xmlExpExpDerive
tell
XML_COMPLETE_ATTRS
XML_DETECT_IDS
XML_SKIP_IDS
_htmlElemDesc
tells
xmlTextReaderPreserve
xmlTextReaderPreservePattern
temporary
_xmlValidCtxt
_xmlXPathContext
xmlIOHTTPOpenW
terminal
xmlRegExecErrInfo
xmlRegExecNextValues
terminals
xmlExpParse
terminated
htmlCtxtReadDoc
htmlReadDoc
startElement
startElementSAXFunc
xmlBufferCCat
xmlBufferCat
xmlCtxtReadDoc
xmlDocDumpMemory
xmlExpParse
xmlGetNsList
xmlOutputBufferWriteEscape
xmlOutputBufferWriteString
xmlParseBalancedChunkMemory
xmlParseBalancedChunkMemoryRecover
xmlReadDoc
xmlReaderForDoc
xmlReaderNewDoc
xmlSAX2StartElement
xmlStrdupFunc
termination
xmlStrcat
xmlStrdup
terms
xmlBuildRelativeURI
test
xmlParserHandleReference
xmlXPathEqualValues
xmlXPathNotEqualValues
tested
_xmlParserInput
xmlDOMWrapAdoptNode
xmlDOMWrapReconcileNamespaces
xmlDOMWrapRemoveNode
testing
xmlRegexpCompile
text-
xmlStreamPushNode
xmlStreamWantsAnyNode
text-node
xmlIsBlankNode
textDecl?
xmlParseExternalSubset
their
xmlCharEncOutFunc
xmlEncodeEntities
xmlEncodeEntitiesReentrant
xmlLoadCatalogs
xmlNewTextChild
xmlNodeListGetRawString
xmlNodeListGetString
xmlParseEntityRef
xmlUnlinkNode
xmlXPathAddValues
xmlXPathDivValues
xmlXPathIdFunction
xmlXPathModValues
xmlXPathMultValues
xmlXPathSubValues
xmlXPathValueFlipSign
them
xmlExpGetLanguage
xmlExpGetStart
xmlExpNewOr
xmlExpNewSeq
xmlNanoFTPRead
xmlNanoHTTPRead
xmlParseAttValue
xmlParseAttributeType
xmlRegExecErrInfo
xmlRegExecNextValues
these
_htmlElemDesc
xmlCheckUTF8
xmlParseSDDecl
they
_htmlElemDesc
xmlBufferDetach
xmlCreatePushParserCtxt
xmlStrEqual
xmlStrQEqual
xmlStrcat
xmlStrdup
xmlUnlinkNode
third
xmlHashAddEntry3
xmlHashLookup3
xmlHashQLookup3
xmlHashRemoveEntry3
xmlHashScan3
xmlHashScanFull3
xmlHashScannerFull
xmlHashUpdateEntry3
xmlXPathSubstringFunction
xmlXPathTranslateFunction
this?
_xmlSchemaType
those
xmlCheckLanguageID
xmlKeepBlanksDefault
xmlParseSDDecl
xmlSchemaValidateSetLocator
xmlSearchNs
xmlXPathSubstringFunction
though
xmlDocDumpMemory
xmlNoNetExternalEntityLoader
thread
LIBXML_THREAD_ENABLED
xmlCleanupParser
xmlCleanupThreads
xmlGetGlobalState
xmlGetLastError
xmlGetThreadId
xmlInitThreads
xmlInitializeCatalog
xmlIsMainThread
xmlLoadCatalog
xmlLoadCatalogs
xmlSetGenericErrorFunc
xmlSetStructuredErrorFunc
through
xmlBuildRelativeURI
xmlCreatePushParserCtxt
xmlDecodeEntities
xmlNormalizeURIPath
thumblers
xmlShellPwd
thus
xmlDOMWrapRemoveNode
xmlNewRMutex
xmlXPathNextAncestor
xmlXPathNextAncestorOrSelf
xmlXPathNextDescendantOrSelf
tight
xmlGetBufferAllocationScheme
time
xmlExpExpDerive
xmlXPathAxisFunc
title
xlinkSimpleLinkFunk
titles
xlinkExtendedLinkFunk
xlinkExtendedLinkSetFunk
todo:
_xmlError
token
xmlAutomataNewCountTrans
xmlAutomataNewCountTrans2
xmlAutomataNewOnceTrans
xmlAutomataNewOnceTrans2
xmlFreeMutex
xmlMutexLock
xmlMutexUnlock
xmlNewMutex
xmlRegExecCallbacks
xmlRegExecPushString
xmlRegExecPushString2
token_r
xmlNewRMutex
xmlRMutexLock
xmlRMutexUnlock
tokens
xmlExpGetLanguage
xmlExpGetStart
xmlParseEnumerationType
xmlXPathIdFunction
too
DEBUG_MEMORY
htmlNodeDump
htmlNodeDumpFile
htmlNodeDumpFileFormat
htmlNodeDumpFormatOutput
htmlNodeDumpOutput
xmlBufNodeDump
xmlCheckLanguageID
xmlCopyDoc
xmlElemDump
xmlFreeNode
xmlFreeNodeList
xmlFreeProp
xmlFreePropList
xmlGetDocEntity
xmlNodeDump
xmlNodeDumpOutput
xmlParseElementMixedContentDecl
xmlRemoveProp
top
CAST_TO_BOOLEAN
CAST_TO_NUMBER
CAST_TO_STRING
CHECK_TYPE
CHECK_TYPE0
XML_SCHEMAS_ELEM_TOPLEVEL
inputPop
inputPush
namePop
namePush
nodePop
nodePush
valuePop
valuePush
xmlNamespaceParseNCName
xmlNamespaceParseNSDef
xmlNamespaceParseQName
xmlPopInputCallbacks
xmlPushInput
xmlReconciliateNs
xmlSaveTree
xmlSetTreeDoc
total
_xmlOutputBuffer
xmlGetFeaturesList
xmlUTF8Strsub
touch
_xmlParserCtxt
track
xmlEntityReferenceFunc
tracking
xmlParserPrintFileContext
trailing
xmlParseAttValue
xmlValidCtxtNormalizeAttributeValue
xmlValidNormalizeAttributeValue
xmlXPathNodeTrailing
xmlXPathNodeTrailingSorted
xmlXPathNormalizeFunction
xmlXPathTrailing
xmlXPathTrailingSorted
trancoding
xmlSaveFileTo
xmlSaveFormatFileTo
transaction
xmlNanoHTTPSave
transcoding
UTF8ToHtml
UTF8Toisolat1
docbEncodeEntities
htmlEncodeEntities
xmlCharEncFirstLine
xmlCharEncInFunc
xmlCharEncOutFunc
xmlCharEncodingInputFunc
xmlCharEncodingOutputFunc
xmlOutputBufferWrite
xmlOutputBufferWriteEscape
xmlOutputBufferWriteString
xmlParserInputBufferGrow
xmlParserInputBufferPush
xmlParserInputBufferRead
transfered
xmlParsePI
transformation
xmlCharEncCloseFunc
xmlCharEncFirstLine
xmlCharEncInFunc
xmlCharEncOutFunc
transformed
xmlRelaxNGDumpTree
transitions
xmlAutomataNewAllTrans
xmlRegExecErrInfo
xmlRegExecNextValues
translate
xmlXPathTranslateFunction
translation
xmlURIUnescapeString
transmit
errorSAXFunc
fatalErrorSAXFunc
warningSAXFunc
xmlParserError
xmlParserValidityError
xmlParserValidityWarning
xmlParserWarning
transport
xmlNanoFTPClose
traversal
xmlChildElementCount
xmlFirstElementChild
xmlLastElementChild
xmlNextElementSibling
xmlPreviousElementSibling
xmlXPathAxisFunc
xmlXPathNextAncestor
xmlXPathNextAncestorOrSelf
xmlXPathNextAttribute
xmlXPathNextChild
xmlXPathNextDescendant
xmlXPathNextDescendantOrSelf
xmlXPathNextFollowing
xmlXPathNextFollowingSibling
xmlXPathNextNamespace
xmlXPathNextParent
xmlXPathNextPreceding
xmlXPathNextPrecedingSibling
xmlXPathNextSelf
xmlXPtrNewContext
traverse
xmlXPathAxisFunc
treaming
_xmlParserCtxt
treated
xmlParseAttValue
tried
xmlRecoverDoc
xmlRecoverMemory
tries
INPUT_CHUNK
xlinkIsLink
xmlCleanupParser
xmlNanoFTPRead
xmlNanoHTTPRead
xmlParserInputGrow
xmlSAXParseDoc
xmlSAXParseFile
xmlSAXParseFileWithData
xmlSAXParseMemory
xmlSAXParseMemoryWithData
trio
WITHOUT_TRIO
WITH_TRIO
xmlXPathIsInf
xmlXPathIsNaN
troubles
_xmlParserInput
xmlSearchNs
try
CAST_TO_BOOLEAN
CAST_TO_NUMBER
CAST_TO_STRING
UTF8ToHtml
UTF8Toisolat1
_xmlParserCtxt
docbEncodeEntities
htmlEncodeEntities
htmlNodeDumpFileFormat
isolat1ToUTF8
xlinkIsLink
xmlCharEncodingInputFunc
xmlCharEncodingOutputFunc
xmlCheckLanguageID
xmlFileOpen
xmlKeepBlanksDefault
xmlNanoHTTPFetch
xmlNanoHTTPMethod
xmlNanoHTTPMethodRedir
xmlNanoHTTPOpen
xmlNanoHTTPOpenRedir
xmlReconciliateNs
xmlURIEscape
xmlValidateRoot
ttribute
xmlTextReaderReadAttributeValue
tune
xmlBufferSetAllocationScheme
tuple
xmlHashAddEntry2
xmlHashAddEntry3
xmlHashLookup2
xmlHashLookup3
xmlHashQLookup2
xmlHashQLookup3
xmlHashRemoveEntry
xmlHashRemoveEntry2
xmlHashRemoveEntry3
xmlHashScan3
xmlHashScanFull3
xmlHashUpdateEntry2
xmlHashUpdateEntry3
tuples
xmlHashAddEntry2
turn
xmlBoolToText
turned
xmlGetNoNsProp
xmlGetNsProp
xmlGetProp
xmlHasNsProp
xmlHasProp
xmlLineNumbersDefault
two
_xmlParserCtxt
xmlMemDisplayLast
xmlStrncatNew
xmlTextMerge
xmlUTF8Charcmp
xmlXPathCmpNodes
xmlXPathDifference
xmlXPathNodeSetMerge
xmlXPathRoundFunction
xmlXPtrLocationSetMerge
xmlXPtrNewLocationSetNodes
two-character
xmlCurrentChar
txt
xmlCheckLanguageID
type:
xmlStreamPushNode
typefixed
XML_SCHEMAS_TYPE_INTERNAL_RESOLVED
types
XML_SCHEMAS_FACET_COLLAPSE
_xmlSchemaType
_xmlXPathContext
xmlExternalEntityLoader
xmlParseSDDecl
xmlSchemaGetCanonValue
xmlSchemaNewStringValue
xmlSchemaValidateFacetWhtsp
xmlStreamWantsAnyNode

A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

Daniel Veillard

libxml2-2.9.1+dfsg1/doc/bugs.html0000644000175000017500000002400012124524424015143 0ustar aronaron Reporting bugs and getting help
Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
Made with Libxml2 Logo

The XML C parser and toolkit of Gnome

Reporting bugs and getting help

Main Menu
Related links

Well, bugs or missing features are always possible, and I will make a point of fixing them in a timely fashion. The best way to report a bug is to use the Gnome bug tracking database (make sure to use the "libxml2" module name). I look at reports there regularly and it's good to have a reminder when a bug is still open. Be sure to specify that the bug is for the package libxml2.

For small problems you can try to get help on IRC, the #xml channel on irc.gnome.org (port 6667) usually have a few person subscribed which may help (but there is no guarantee and if a real issue is raised it should go on the mailing-list for archival).

There is also a mailing-list xml@gnome.org for libxml, with an on-line archive (old). To subscribe to this list, please visit the associated Web page and follow the instructions. Do not send code, I won't debug it (but patches are really appreciated!).

Please note that with the current amount of virus and SPAM, sending mail to the list without being subscribed won't work. There is *far too many bounces* (in the order of a thousand a day !) I cannot approve them manually anymore. If your mail to the list bounced waiting for administrator approval, it is LOST ! Repost it and fix the problem triggering the error. Also please note that emails with a legal warning asking to not copy or redistribute freely the information they contain are NOT acceptable for the mailing-list, such mail will as much as possible be discarded automatically, and are less likely to be answered if they made it to the list, DO NOT post to the list from an email address where such legal requirements are automatically added, get private paying support if you can't share information.

Check the following before posting:

  • Read the FAQ and use the search engine to get information related to your problem.
  • Make sure you are using a recent version, and that the problem still shows up in a recent version.
  • Check the list archives to see if the problem was reported already. In this case there is probably a fix available, similarly check the registered open bugs.
  • Make sure you can reproduce the bug with xmllint or one of the test programs found in source in the distribution.
  • Please send the command showing the error as well as the input (as an attachment)

Then send the bug with associated information to reproduce it to the xml@gnome.org list; if it's really libxml related I will approve it. Please do not send mail to me directly, it makes things really hard to track and in some cases I am not the best person to answer a given question, ask on the list.

To be really clear about support:

  • Support or help requests MUST be sent to the list or on bugzilla in case of problems, so that the Question and Answers can be shared publicly. Failing to do so carries the implicit message "I want free support but I don't want to share the benefits with others" and is not welcome. I will automatically Carbon-Copy the xml@gnome.org mailing list for any technical reply made about libxml2 or libxslt.
  • There is no guarantee of support. If your question remains unanswered after a week, repost it, making sure you gave all the detail needed and the information requested.
  • Failing to provide information as requested or double checking first for prior feedback also carries the implicit message "the time of the library maintainers is less valuable than my time" and might not be welcome.

Of course, bugs reported with a suggested patch for fixing them will probably be processed faster than those without.

If you're looking for help, a quick look at the list archive may actually provide the answer. I usually send source samples when answering libxml2 usage questions. The auto-generated documentation is not as polished as I would like (i need to learn more about DocBook), but it's a good starting point.

Daniel Veillard

libxml2-2.9.1+dfsg1/doc/examples/0000755000175000017500000000000012134171765015146 5ustar aronaronlibxml2-2.9.1+dfsg1/doc/examples/tree2.res0000644000175000017500000000070511234335462016700 0ustar aronaron content of node 1 this node has attributes other way to create content (which is also a node) libxml2-2.9.1+dfsg1/doc/examples/reader1.res0000644000175000017500000000022511234335462017177 0ustar aronaron0 10 doc 0 0 0 1 doc 0 0 1 14 #text 0 1 1 1 src 1 0 1 14 #text 0 1 1 1 dest 1 0 1 14 #text 0 1 1 1 src 1 0 1 14 #text 0 1 0 15 doc 0 0 libxml2-2.9.1+dfsg1/doc/examples/xpath2.res0000644000175000017500000000136511234335462017070 0ustar aronaron discarded This text node must be discarded discarded content1 content2 too content3 content4 content5 content6 This text node must be discarded discarded This text node must be discarded This text node must be discarded This text node must be discarded discarded This text node must be discarded libxml2-2.9.1+dfsg1/doc/examples/examples.xsl0000644000175000017500000001610011234335462017506 0ustar aronaron ../ Examples Menu
  • line : Type from
  • line : Function from
  • line : Macro from
  • :

    Includes:

    Uses:

    Usage:

    Author:

  • :

    • :
  • The examples are stored per section depending on the main focus of the example:

    Getting the compilation options and libraries dependancies needed to generate binaries from the examples is best done on Linux/Unix by using the xml2-config script which should have been installed as part of make install step or when installing the libxml2 development package:

    gcc -o example `xml2-config --cflags` example.c `xml2-config --libs`

    Examples

    Libxml2 set of examples

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/examples/reader2.c0000644000175000017500000000607512113312341016626 0ustar aronaron/** * section: xmlReader * synopsis: Parse and validate an XML file with an xmlReader * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file * validating the content in the process and activating options * like entities substitution, and DTD attributes defaulting. * (Note that the XMLReader functions require libxml2 version later * than 2.6.) * usage: reader2 * test: reader2 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #ifdef LIBXML_READER_ENABLED /** * processNode: * @reader: the xmlReader * * Dump information about the current node */ static void processNode(xmlTextReaderPtr reader) { const xmlChar *name, *value; name = xmlTextReaderConstName(reader); if (name == NULL) name = BAD_CAST "--"; value = xmlTextReaderConstValue(reader); printf("%d %d %s %d %d", xmlTextReaderDepth(reader), xmlTextReaderNodeType(reader), name, xmlTextReaderIsEmptyElement(reader), xmlTextReaderHasValue(reader)); if (value == NULL) printf("\n"); else { if (xmlStrlen(value) > 40) printf(" %.40s...\n", value); else printf(" %s\n", value); } } /** * streamFile: * @filename: the file name to parse * * Parse, validate and print information about an XML file. */ static void streamFile(const char *filename) { xmlTextReaderPtr reader; int ret; /* * Pass some special parsing options to activate DTD attribute defaulting, * entities substitution and DTD validation */ reader = xmlReaderForFile(filename, NULL, XML_PARSE_DTDATTR | /* default DTD attributes */ XML_PARSE_NOENT | /* substitute entities */ XML_PARSE_DTDVALID); /* validate with the DTD */ if (reader != NULL) { ret = xmlTextReaderRead(reader); while (ret == 1) { processNode(reader); ret = xmlTextReaderRead(reader); } /* * Once the document has been fully parsed check the validation results */ if (xmlTextReaderIsValid(reader) != 1) { fprintf(stderr, "Document %s does not validate\n", filename); } xmlFreeTextReader(reader); if (ret != 0) { fprintf(stderr, "%s : failed to parse\n", filename); } } else { fprintf(stderr, "Unable to open %s\n", filename); } } int main(int argc, char **argv) { if (argc != 2) return(1); /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION streamFile(argv[1]); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else int main(void) { fprintf(stderr, "XInclude support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/index.html0000644000175000017500000010023012117306606017132 0ustar aronaron Libxml2 set of examples
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Libxml2 set of examples

    Examples Menu
    Related links

    The examples are stored per section depending on the main focus of the example:

    • xmlWriter :

    • InputOutput :

      • io1.c: Example of custom Input/Output
      • io2.c: Output to char buffer
    • Tree :

      • tree2.c: Creates a tree
      • tree1.c: Navigates a tree to print element names
    • XPath :

      • xpath1.c: Evaluate XPath expression and prints result node set.
      • xpath2.c: Load a document, locate subelements with XPath, modify said elements and save the resulting document.
    • Parsing :

      • parse3.c: Parse an XML document in memory to a tree and free it
      • parse4.c: Parse an XML document chunk by chunk to a tree and free it
      • parse2.c: Parse and validate an XML file to a tree and free the result
      • parse1.c: Parse an XML file to a tree and free it
    • xmlReader :

      • reader2.c: Parse and validate an XML file with an xmlReader
      • reader1.c: Parse an XML file with an xmlReader
      • reader3.c: Show how to extract subdocuments with xmlReader
      • reader4.c: Parse multiple XML files reusing an xmlReader

    Getting the compilation options and libraries dependancies needed to generate binaries from the examples is best done on Linux/Unix by using the xml2-config script which should have been installed as part of make install step or when installing the libxml2 development package:

    gcc -o example `xml2-config --cflags` example.c `xml2-config --libs`

    InputOutput Examples

    io1.c: Example of custom Input/Output

    Demonstrate the use of xmlRegisterInputCallbacks to build a custom I/O layer, this is used in an XInclude method context to show how dynamic document can be built in a clean way.

    Includes:

    Uses:

    Usage:

    io1

    Author: Daniel Veillard

    io2.c: Output to char buffer

    Demonstrate the use of xmlDocDumpMemory to output document to a character buffer

    Includes:

    Uses:

    Usage:

    io2

    Author: John Fleck

    Parsing Examples

    parse3.c: Parse an XML document in memory to a tree and free it

    Demonstrate the use of xmlReadMemory() to read an XML file into a tree and and xmlFreeDoc() to free the resulting tree

    Includes:

    Uses:

    Usage:

    parse3

    Author: Daniel Veillard

    parse4.c: Parse an XML document chunk by chunk to a tree and free it

    Demonstrate the use of xmlCreatePushParserCtxt() and xmlParseChunk() to read an XML file progressively into a tree and and xmlFreeDoc() to free the resulting tree

    Includes:

    Uses:

    Usage:

    parse4 test3.xml

    Author: Daniel Veillard

    parse2.c: Parse and validate an XML file to a tree and free the result

    Create a parser context for an XML file, then parse and validate the file, creating a tree, check the validation result and xmlFreeDoc() to free the resulting tree.

    Includes:

    Uses:

    Usage:

    parse2 test2.xml

    Author: Daniel Veillard

    parse1.c: Parse an XML file to a tree and free it

    Demonstrate the use of xmlReadFile() to read an XML file into a tree and and xmlFreeDoc() to free the resulting tree

    Includes:

    Uses:

    Usage:

    parse1 test1.xml

    Author: Daniel Veillard

    Tree Examples

    tree2.c: Creates a tree

    Shows how to create document, nodes and dump it to stdout or file.

    Includes:

    Uses:

    Usage:

    tree2 <filename> -Default output: stdout

    Author: Lucas Brasilino <brasilino@recife.pe.gov.br>

    tree1.c: Navigates a tree to print element names

    Parse a file to a tree, use xmlDocGetRootElement() to get the root element, then walk the document and print all the element name in document order.

    Includes:

    Uses:

    Usage:

    tree1 filename_or_URL

    Author: Dodji Seketeli

    XPath Examples

    xpath1.c: Evaluate XPath expression and prints result node set.

    Shows how to evaluate XPath expression and register known namespaces in XPath context.

    Includes:

    Uses:

    Usage:

    xpath1 <xml-file> <xpath-expr> [<known-ns-list>]

    Author: Aleksey Sanin

    xpath2.c: Load a document, locate subelements with XPath, modify said elements and save the resulting document.

    Shows how to make a full round-trip from a load/edit/save

    Includes:

    Uses:

    Usage:

    xpath2 <xml-file> <xpath-expr> <new-value>

    Author: Aleksey Sanin and Daniel Veillard

    xmlReader Examples

    reader2.c: Parse and validate an XML file with an xmlReader

    Demonstrate the use of xmlReaderForFile() to parse an XML file validating the content in the process and activating options like entities substitution, and DTD attributes defaulting. (Note that the XMLReader functions require libxml2 version later than 2.6.)

    Includes:

    Uses:

    Usage:

    reader2 <valid_xml_filename>

    Author: Daniel Veillard

    reader1.c: Parse an XML file with an xmlReader

    Demonstrate the use of xmlReaderForFile() to parse an XML file and dump the informations about the nodes found in the process. (Note that the XMLReader functions require libxml2 version later than 2.6.)

    Includes:

    Uses:

    Usage:

    reader1 <filename>

    Author: Daniel Veillard

    reader3.c: Show how to extract subdocuments with xmlReader

    Demonstrate the use of xmlTextReaderPreservePattern() to parse an XML file with the xmlReader while collecting only some subparts of the document. (Note that the XMLReader functions require libxml2 version later than 2.6.)

    Includes:

    Uses:

    Usage:

    reader3

    Author: Daniel Veillard

    reader4.c: Parse multiple XML files reusing an xmlReader

    Demonstrate the use of xmlReaderForFile() and xmlReaderNewFile to parse XML files while reusing the reader object and parser context. (Note that the XMLReader functions require libxml2 version later than 2.6.)

    Includes:

    Uses:

    Usage:

    reader4 <filename> [ filename ... ]

    Author: Graham Bennett

    xmlWriter Examples

    testWriter.c: use various APIs for the xmlWriter

    tests a number of APIs for the xmlWriter, especially the various methods to write to a filename, to a memory buffer, to a new document, or to a subtree. It shows how to do encoding string conversions too. The resulting documents are then serialized.

    Includes:

    Uses:

    Usage:

    testWriter

    Author: Alfred Mickautsch

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/examples/reader3.c0000644000175000017500000000560312113312341016623 0ustar aronaron/** * section: xmlReader * synopsis: Show how to extract subdocuments with xmlReader * purpose: Demonstrate the use of xmlTextReaderPreservePattern() * to parse an XML file with the xmlReader while collecting * only some subparts of the document. * (Note that the XMLReader functions require libxml2 version later * than 2.6.) * usage: reader3 * test: reader3 > reader3.tmp && diff reader3.tmp $(srcdir)/reader3.res * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) /** * streamFile: * @filename: the file name to parse * * Parse and print information about an XML file. * * Returns the resulting doc with just the elements preserved. */ static xmlDocPtr extractFile(const char *filename, const xmlChar *pattern) { xmlDocPtr doc; xmlTextReaderPtr reader; int ret; /* * build an xmlReader for that file */ reader = xmlReaderForFile(filename, NULL, 0); if (reader != NULL) { /* * add the pattern to preserve */ if (xmlTextReaderPreservePattern(reader, pattern, NULL) < 0) { fprintf(stderr, "%s : failed add preserve pattern %s\n", filename, (const char *) pattern); } /* * Parse and traverse the tree, collecting the nodes in the process */ ret = xmlTextReaderRead(reader); while (ret == 1) { ret = xmlTextReaderRead(reader); } if (ret != 0) { fprintf(stderr, "%s : failed to parse\n", filename); xmlFreeTextReader(reader); return(NULL); } /* * get the resulting nodes */ doc = xmlTextReaderCurrentDoc(reader); /* * Free up the reader */ xmlFreeTextReader(reader); } else { fprintf(stderr, "Unable to open %s\n", filename); return(NULL); } return(doc); } int main(int argc, char **argv) { const char *filename = "test3.xml"; const char *pattern = "preserved"; xmlDocPtr doc; if (argc == 3) { filename = argv[1]; pattern = argv[2]; } /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION doc = extractFile(filename, (const xmlChar *) pattern); if (doc != NULL) { /* * ouptut the result. */ xmlDocDump(stdout, doc); /* * don't forget to free up the doc */ xmlFreeDoc(doc); } /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else int main(void) { fprintf(stderr, "Reader, Pattern or output support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/reader1.c0000644000175000017500000000474212113312341016624 0ustar aronaron/** * section: xmlReader * synopsis: Parse an XML file with an xmlReader * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file * and dump the informations about the nodes found in the process. * (Note that the XMLReader functions require libxml2 version later * than 2.6.) * usage: reader1 * test: reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #ifdef LIBXML_READER_ENABLED /** * processNode: * @reader: the xmlReader * * Dump information about the current node */ static void processNode(xmlTextReaderPtr reader) { const xmlChar *name, *value; name = xmlTextReaderConstName(reader); if (name == NULL) name = BAD_CAST "--"; value = xmlTextReaderConstValue(reader); printf("%d %d %s %d %d", xmlTextReaderDepth(reader), xmlTextReaderNodeType(reader), name, xmlTextReaderIsEmptyElement(reader), xmlTextReaderHasValue(reader)); if (value == NULL) printf("\n"); else { if (xmlStrlen(value) > 40) printf(" %.40s...\n", value); else printf(" %s\n", value); } } /** * streamFile: * @filename: the file name to parse * * Parse and print information about an XML file. */ static void streamFile(const char *filename) { xmlTextReaderPtr reader; int ret; reader = xmlReaderForFile(filename, NULL, 0); if (reader != NULL) { ret = xmlTextReaderRead(reader); while (ret == 1) { processNode(reader); ret = xmlTextReaderRead(reader); } xmlFreeTextReader(reader); if (ret != 0) { fprintf(stderr, "%s : failed to parse\n", filename); } } else { fprintf(stderr, "Unable to open %s\n", filename); } } int main(int argc, char **argv) { if (argc != 2) return(1); /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION streamFile(argv[1]); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else int main(void) { fprintf(stderr, "XInclude support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/tree2.c0000644000175000017500000000661712113312341016325 0ustar aronaron/* * section: Tree * synopsis: Creates a tree * purpose: Shows how to create document, nodes and dump it to stdout or file. * usage: tree2 -Default output: stdout * test: tree2 > tree2.tmp && diff tree2.tmp $(srcdir)/tree2.res * author: Lucas Brasilino * copy: see Copyright for the status of this software */ #include #include #include #if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) /* *To compile this file using gcc you can type *gcc `xml2-config --cflags --libs` -o tree2 tree2.c */ /* A simple example how to create DOM. Libxml2 automagically * allocates the necessary amount of memory to it. */ int main(int argc, char **argv) { xmlDocPtr doc = NULL; /* document pointer */ xmlNodePtr root_node = NULL, node = NULL, node1 = NULL;/* node pointers */ xmlDtdPtr dtd = NULL; /* DTD pointer */ char buff[256]; int i, j; LIBXML_TEST_VERSION; /* * Creates a new document, a node and set it as a root node */ doc = xmlNewDoc(BAD_CAST "1.0"); root_node = xmlNewNode(NULL, BAD_CAST "root"); xmlDocSetRootElement(doc, root_node); /* * Creates a DTD declaration. Isn't mandatory. */ dtd = xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST "tree2.dtd"); /* * xmlNewChild() creates a new node, which is "attached" as child node * of root_node node. */ xmlNewChild(root_node, NULL, BAD_CAST "node1", BAD_CAST "content of node 1"); /* * The same as above, but the new child node doesn't have a content */ xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL); /* * xmlNewProp() creates attributes, which is "attached" to an node. * It returns xmlAttrPtr, which isn't used here. */ node = xmlNewChild(root_node, NULL, BAD_CAST "node3", BAD_CAST "this node has attributes"); xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes"); xmlNewProp(node, BAD_CAST "foo", BAD_CAST "bar"); /* * Here goes another way to create nodes. xmlNewNode() and xmlNewText * creates a node and a text node separately. They are "attached" * by xmlAddChild() */ node = xmlNewNode(NULL, BAD_CAST "node4"); node1 = xmlNewText(BAD_CAST "other way to create content (which is also a node)"); xmlAddChild(node, node1); xmlAddChild(root_node, node); /* * A simple loop that "automates" nodes creation */ for (i = 5; i < 7; i++) { sprintf(buff, "node%d", i); node = xmlNewChild(root_node, NULL, BAD_CAST buff, NULL); for (j = 1; j < 4; j++) { sprintf(buff, "node%d%d", i, j); node1 = xmlNewChild(node, NULL, BAD_CAST buff, NULL); xmlNewProp(node1, BAD_CAST "odd", BAD_CAST((j % 2) ? "no" : "yes")); } } /* * Dumping document to stdio or file */ xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1); /*free the document */ xmlFreeDoc(doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else int main(void) { fprintf(stderr, "tree support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/reader3.res0000644000175000017500000000055011234335462017202 0ustar aronaron content1 content2 too content3 content4 content5 content6 libxml2-2.9.1+dfsg1/doc/examples/examples.xml0000644000175000017500000007664312117306606017521 0ustar aronaron Evaluate XPath expression and prints result node set. Shows how to evaluate XPath expression and register known namespaces in XPath context. xpath1 <xml-file> <xpath-expr> [<known-ns-list>] xpath1 test3.xml '//child2' > xpath1.tmp && diff xpath1.tmp $(srcdir)/xpath1.res Aleksey Sanin see Copyright for the status of this software.
    XPath
    <libxml/parser.h> <libxml/xpath.h> <libxml/xpathInternals.h> <libxml/tree.h>
    Parse an XML document in memory to a tree and free it Demonstrate the use of xmlReadMemory() to read an XML file into a tree and and xmlFreeDoc() to free the resulting tree parse3 parse3 Daniel Veillard see Copyright for the status of this software.
    Parsing
    <libxml/tree.h> <libxml/parser.h>
    Parse and validate an XML file with an xmlReader Demonstrate the use of xmlReaderForFile() to parse an XML file validating the content in the process and activating options like entities substitution, and DTD attributes defaulting. (Note that the XMLReader functions require libxml2 version later than 2.6.) reader2 <valid_xml_filename> reader2 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res Daniel Veillard see Copyright for the status of this software.
    xmlReader
    <libxml/xmlreader.h>
    Creates a tree Shows how to create document, nodes and dump it to stdout or file. tree2 <filename> -Default output: stdout tree2 > tree2.tmp && diff tree2.tmp $(srcdir)/tree2.res Lucas Brasilino <brasilino@recife.pe.gov.br> see Copyright for the status of this software
    Tree
    <libxml/tree.h> <libxml/parser.h>
    Example of custom Input/Output Demonstrate the use of xmlRegisterInputCallbacks to build a custom I/O layer, this is used in an XInclude method context to show how dynamic document can be built in a clean way. io1 io1 > io1.tmp && diff io1.tmp $(srcdir)/io1.res Daniel Veillard see Copyright for the status of this software.
    InputOutput
    <libxml/parser.h> <libxml/xmlIO.h> <libxml/xinclude.h> <libxml/tree.h>
    Parse an XML document chunk by chunk to a tree and free it Demonstrate the use of xmlCreatePushParserCtxt() and xmlParseChunk() to read an XML file progressively into a tree and and xmlFreeDoc() to free the resulting tree parse4 test3.xml parse4 test3.xml Daniel Veillard see Copyright for the status of this software.
    Parsing
    <libxml/tree.h> <libxml/parser.h>
    Load a document, locate subelements with XPath, modify said elements and save the resulting document. Shows how to make a full round-trip from a load/edit/save xpath2 <xml-file> <xpath-expr> <new-value> xpath2 test3.xml '//discarded' discarded > xpath2.tmp && diff xpath2.tmp $(srcdir)/xpath2.res Aleksey Sanin and Daniel Veillard see Copyright for the status of this software.
    XPath
    <libxml/parser.h> <libxml/xpath.h> <libxml/xpathInternals.h> <libxml/tree.h>
    Output to char buffer Demonstrate the use of xmlDocDumpMemory to output document to a character buffer io2 io2 > io2.tmp && diff io2.tmp $(srcdir)/io2.res John Fleck see Copyright for the status of this software.
    InputOutput
    <libxml/parser.h>
    Parse an XML file with an xmlReader Demonstrate the use of xmlReaderForFile() to parse an XML file and dump the informations about the nodes found in the process. (Note that the XMLReader functions require libxml2 version later than 2.6.) reader1 <filename> reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res Daniel Veillard see Copyright for the status of this software.
    xmlReader
    <libxml/xmlreader.h>
    Navigates a tree to print element names Parse a file to a tree, use xmlDocGetRootElement() to get the root element, then walk the document and print all the element name in document order. tree1 filename_or_URL tree1 test2.xml > tree1.tmp && diff tree1.tmp $(srcdir)/tree1.res Dodji Seketeli see Copyright for the status of this software.
    Tree
    <libxml/tree.h> <libxml/parser.h>
    Show how to extract subdocuments with xmlReader Demonstrate the use of xmlTextReaderPreservePattern() to parse an XML file with the xmlReader while collecting only some subparts of the document. (Note that the XMLReader functions require libxml2 version later than 2.6.) reader3 reader3 > reader3.tmp && diff reader3.tmp $(srcdir)/reader3.res Daniel Veillard see Copyright for the status of this software.
    xmlReader
    <libxml/xmlreader.h>
    Parse and validate an XML file to a tree and free the result Create a parser context for an XML file, then parse and validate the file, creating a tree, check the validation result and xmlFreeDoc() to free the resulting tree. parse2 test2.xml parse2 test2.xml Daniel Veillard see Copyright for the status of this software.
    Parsing
    <libxml/tree.h> <libxml/parser.h>
    Parse an XML file to a tree and free it Demonstrate the use of xmlReadFile() to read an XML file into a tree and and xmlFreeDoc() to free the resulting tree parse1 test1.xml parse1 test1.xml Daniel Veillard see Copyright for the status of this software.
    Parsing
    <libxml/tree.h> <libxml/parser.h>
    Parse multiple XML files reusing an xmlReader Demonstrate the use of xmlReaderForFile() and xmlReaderNewFile to parse XML files while reusing the reader object and parser context. (Note that the XMLReader functions require libxml2 version later than 2.6.) reader4 <filename> [ filename ... ] reader4 test1.xml test2.xml test3.xml > reader4.tmp && diff reader4.tmp $(srcdir)/reader4.res Graham Bennett see Copyright for the status of this software.
    xmlReader
    <libxml/xmlreader.h>
    use various APIs for the xmlWriter tests a number of APIs for the xmlWriter, especially the various methods to write to a filename, to a memory buffer, to a new document, or to a subtree. It shows how to do encoding string conversions too. The resulting documents are then serialized. testWriter testWriter && for i in 1 2 3 4 ; do diff $(srcdir)/writer.xml writer$$i.tmp || break ; done Alfred Mickautsch see Copyright for the status of this software.
    xmlWriter
    <libxml/encoding.h> <libxml/xmlwriter.h>
    libxml2-2.9.1+dfsg1/doc/examples/test1.xml0000644000175000017500000000000711234335462016721 0ustar aronaron libxml2-2.9.1+dfsg1/doc/examples/parse1.c0000644000175000017500000000242411234335462016503 0ustar aronaron/** * section: Parsing * synopsis: Parse an XML file to a tree and free it * purpose: Demonstrate the use of xmlReadFile() to read an XML file * into a tree and and xmlFreeDoc() to free the resulting tree * usage: parse1 test1.xml * test: parse1 test1.xml * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #include /** * example1Func: * @filename: a filename or an URL * * Parse the resource and free the resulting tree */ static void example1Func(const char *filename) { xmlDocPtr doc; /* the resulting document tree */ doc = xmlReadFile(filename, NULL, 0); if (doc == NULL) { fprintf(stderr, "Failed to parse %s\n", filename); return; } xmlFreeDoc(doc); } int main(int argc, char **argv) { if (argc != 2) return(1); /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION example1Func(argv[1]); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } libxml2-2.9.1+dfsg1/doc/examples/io2.res0000644000175000017500000000005311234335462016344 0ustar aronaron content libxml2-2.9.1+dfsg1/doc/examples/parse2.c0000644000175000017500000000365711234335462016515 0ustar aronaron/** * section: Parsing * synopsis: Parse and validate an XML file to a tree and free the result * purpose: Create a parser context for an XML file, then parse and validate * the file, creating a tree, check the validation result * and xmlFreeDoc() to free the resulting tree. * usage: parse2 test2.xml * test: parse2 test2.xml * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #include /** * exampleFunc: * @filename: a filename or an URL * * Parse and validate the resource and free the resulting tree */ static void exampleFunc(const char *filename) { xmlParserCtxtPtr ctxt; /* the parser context */ xmlDocPtr doc; /* the resulting document tree */ /* create a parser context */ ctxt = xmlNewParserCtxt(); if (ctxt == NULL) { fprintf(stderr, "Failed to allocate parser context\n"); return; } /* parse the file, activating the DTD validation option */ doc = xmlCtxtReadFile(ctxt, filename, NULL, XML_PARSE_DTDVALID); /* check if parsing suceeded */ if (doc == NULL) { fprintf(stderr, "Failed to parse %s\n", filename); } else { /* check if validation suceeded */ if (ctxt->valid == 0) fprintf(stderr, "Failed to validate %s\n", filename); /* free up the resulting document */ xmlFreeDoc(doc); } /* free up the parser context */ xmlFreeParserCtxt(ctxt); } int main(int argc, char **argv) { if (argc != 2) return(1); /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION exampleFunc(argv[1]); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } libxml2-2.9.1+dfsg1/doc/examples/test3.xml0000644000175000017500000000150111234335462016723 0ustar aronaron This text node must be discarded content1 content2 too content3 content4 content5 content6 This text node must be discarded This text node must be discarded This text node must be discarded This text node must be discarded This text node must be discarded libxml2-2.9.1+dfsg1/doc/examples/io1.c0000644000175000017500000000725112113312341015767 0ustar aronaron/** * section: InputOutput * synopsis: Example of custom Input/Output * purpose: Demonstrate the use of xmlRegisterInputCallbacks * to build a custom I/O layer, this is used in an * XInclude method context to show how dynamic document can * be built in a clean way. * usage: io1 * test: io1 > io1.tmp && diff io1.tmp $(srcdir)/io1.res * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #include #include #include #include #ifdef LIBXML_XINCLUDE_ENABLED static const char *result = "ab"; static const char *cur = NULL; static int rlen; /** * sqlMatch: * @URI: an URI to test * * Check for an sql: query * * Returns 1 if yes and 0 if another Input module should be used */ static int sqlMatch(const char * URI) { if ((URI != NULL) && (!strncmp(URI, "sql:", 4))) return(1); return(0); } /** * sqlOpen: * @URI: an URI to test * * Return a pointer to the sql: query handler, in this example simply * the current pointer... * * Returns an Input context or NULL in case or error */ static void * sqlOpen(const char * URI) { if ((URI == NULL) || (strncmp(URI, "sql:", 4))) return(NULL); cur = result; rlen = strlen(result); return((void *) cur); } /** * sqlClose: * @context: the read context * * Close the sql: query handler * * Returns 0 or -1 in case of error */ static int sqlClose(void * context) { if (context == NULL) return(-1); cur = NULL; rlen = 0; return(0); } /** * sqlRead: * @context: the read context * @buffer: where to store data * @len: number of bytes to read * * Implement an sql: query read. * * Returns the number of bytes read or -1 in case of error */ static int sqlRead(void * context, char * buffer, int len) { const char *ptr = (const char *) context; if ((context == NULL) || (buffer == NULL) || (len < 0)) return(-1); if (len > rlen) len = rlen; memcpy(buffer, ptr, len); rlen -= len; return(len); } const char *include = "\n\ \n\

    List of people:

    \n\ \n\
    \n"; int main(void) { xmlDocPtr doc; /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION /* * register the new I/O handlers */ if (xmlRegisterInputCallbacks(sqlMatch, sqlOpen, sqlRead, sqlClose) < 0) { fprintf(stderr, "failed to register SQL handler\n"); exit(1); } /* * parse include into a document */ doc = xmlReadMemory(include, strlen(include), "include.xml", NULL, 0); if (doc == NULL) { fprintf(stderr, "failed to parse the including file\n"); exit(1); } /* * apply the XInclude process, this should trigger the I/O just * registered. */ if (xmlXIncludeProcess(doc) <= 0) { fprintf(stderr, "XInclude processing failed\n"); exit(1); } #ifdef LIBXML_OUTPUT_ENABLED /* * save the output for checking to stdout */ xmlDocDump(stdout, doc); #endif /* * Free the document */ xmlFreeDoc(doc); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else int main(void) { fprintf(stderr, "XInclude support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/tree1.res0000644000175000017500000000017111234335462016674 0ustar aronaronnode type: Element, name: doc node type: Element, name: src node type: Element, name: dest node type: Element, name: src libxml2-2.9.1+dfsg1/doc/examples/xpath1.res0000644000175000017500000000016211234335462017061 0ustar aronaronResult (4 nodes): = element node "child2" = element node "child2" = element node "child2" = element node "child2" libxml2-2.9.1+dfsg1/doc/examples/Makefile.in0000644000175000017500000007512212134171754017220 0ustar aronaron# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = io1$(EXEEXT) io2$(EXEEXT) parse1$(EXEEXT) \ parse2$(EXEEXT) parse3$(EXEEXT) parse4$(EXEEXT) \ reader1$(EXEEXT) reader2$(EXEEXT) reader3$(EXEEXT) \ reader4$(EXEEXT) testWriter$(EXEEXT) tree1$(EXEEXT) \ tree2$(EXEEXT) xpath1$(EXEEXT) xpath2$(EXEEXT) subdir = doc/examples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_io1_OBJECTS = io1.$(OBJEXT) io1_OBJECTS = $(am_io1_OBJECTS) io1_LDADD = $(LDADD) am__DEPENDENCIES_1 = io1_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am_io2_OBJECTS = io2.$(OBJEXT) io2_OBJECTS = $(am_io2_OBJECTS) io2_LDADD = $(LDADD) io2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_parse1_OBJECTS = parse1.$(OBJEXT) parse1_OBJECTS = $(am_parse1_OBJECTS) parse1_LDADD = $(LDADD) parse1_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_parse2_OBJECTS = parse2.$(OBJEXT) parse2_OBJECTS = $(am_parse2_OBJECTS) parse2_LDADD = $(LDADD) parse2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_parse3_OBJECTS = parse3.$(OBJEXT) parse3_OBJECTS = $(am_parse3_OBJECTS) parse3_LDADD = $(LDADD) parse3_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_parse4_OBJECTS = parse4.$(OBJEXT) parse4_OBJECTS = $(am_parse4_OBJECTS) parse4_LDADD = $(LDADD) parse4_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_reader1_OBJECTS = reader1.$(OBJEXT) reader1_OBJECTS = $(am_reader1_OBJECTS) reader1_LDADD = $(LDADD) reader1_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_reader2_OBJECTS = reader2.$(OBJEXT) reader2_OBJECTS = $(am_reader2_OBJECTS) reader2_LDADD = $(LDADD) reader2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_reader3_OBJECTS = reader3.$(OBJEXT) reader3_OBJECTS = $(am_reader3_OBJECTS) reader3_LDADD = $(LDADD) reader3_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_reader4_OBJECTS = reader4.$(OBJEXT) reader4_OBJECTS = $(am_reader4_OBJECTS) reader4_LDADD = $(LDADD) reader4_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_testWriter_OBJECTS = testWriter.$(OBJEXT) testWriter_OBJECTS = $(am_testWriter_OBJECTS) testWriter_LDADD = $(LDADD) testWriter_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_tree1_OBJECTS = tree1.$(OBJEXT) tree1_OBJECTS = $(am_tree1_OBJECTS) tree1_LDADD = $(LDADD) tree1_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_tree2_OBJECTS = tree2.$(OBJEXT) tree2_OBJECTS = $(am_tree2_OBJECTS) tree2_LDADD = $(LDADD) tree2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_xpath1_OBJECTS = xpath1.$(OBJEXT) xpath1_OBJECTS = $(am_xpath1_OBJECTS) xpath1_LDADD = $(LDADD) xpath1_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_xpath2_OBJECTS = xpath2.$(OBJEXT) xpath2_OBJECTS = $(am_xpath2_OBJECTS) xpath2_LDADD = $(LDADD) xpath2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/libxml2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \ $(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \ $(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \ $(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \ $(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES) DIST_SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \ $(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \ $(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \ $(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \ $(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_THREAD_LIBS = @BASE_THREAD_LIBS@ C14N_OBJ = @C14N_OBJ@ CATALOG_OBJ = @CATALOG_OBJ@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@ CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@ DEBUG_OBJ = @DEBUG_OBJ@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCB_OBJ = @DOCB_OBJ@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTP_OBJ = @FTP_OBJ@ GREP = @GREP@ HAVE_ISINF = @HAVE_ISINF@ HAVE_ISNAN = @HAVE_ISNAN@ HTML_DIR = @HTML_DIR@ HTML_OBJ = @HTML_OBJ@ HTTP_OBJ = @HTTP_OBJ@ ICONV_LIBS = @ICONV_LIBS@ ICU_LIBS = @ICU_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_MAJOR_VERSION = @LIBXML_MAJOR_VERSION@ LIBXML_MICRO_VERSION = @LIBXML_MICRO_VERSION@ LIBXML_MINOR_VERSION = @LIBXML_MINOR_VERSION@ LIBXML_VERSION = @LIBXML_VERSION@ LIBXML_VERSION_EXTRA = @LIBXML_VERSION_EXTRA@ LIBXML_VERSION_INFO = @LIBXML_VERSION_INFO@ LIBXML_VERSION_NUMBER = @LIBXML_VERSION_NUMBER@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LZMA_CFLAGS = @LZMA_CFLAGS@ LZMA_LIBS = @LZMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODULE_EXTENSION = @MODULE_EXTENSION@ MODULE_PLATFORM_LIBS = @MODULE_PLATFORM_LIBS@ MV = @MV@ M_LIBS = @M_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PYTHON = @PYTHON@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_SITE_PACKAGES = @PYTHON_SITE_PACKAGES@ PYTHON_SUBDIR = @PYTHON_SUBDIR@ PYTHON_TESTS = @PYTHON_TESTS@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RDL_LIBS = @RDL_LIBS@ READER_TEST = @READER_TEST@ RELDATE = @RELDATE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STATIC_BINARIES = @STATIC_BINARIES@ STRIP = @STRIP@ TAR = @TAR@ TEST_C14N = @TEST_C14N@ TEST_CATALOG = @TEST_CATALOG@ TEST_DEBUG = @TEST_DEBUG@ TEST_HTML = @TEST_HTML@ TEST_MODULES = @TEST_MODULES@ TEST_PATTERN = @TEST_PATTERN@ TEST_PHTML = @TEST_PHTML@ TEST_PUSH = @TEST_PUSH@ TEST_REGEXPS = @TEST_REGEXPS@ TEST_SAX = @TEST_SAX@ TEST_SCHEMAS = @TEST_SCHEMAS@ TEST_SCHEMATRON = @TEST_SCHEMATRON@ TEST_THREADS = @TEST_THREADS@ TEST_VALID = @TEST_VALID@ TEST_VTIME = @TEST_VTIME@ TEST_XINCLUDE = @TEST_XINCLUDE@ TEST_XPATH = @TEST_XPATH@ TEST_XPTR = @TEST_XPTR@ THREAD_CFLAGS = @THREAD_CFLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ WITH_DOCB = @WITH_DOCB@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_LZMA = @WITH_LZMA@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ WITH_MODULES = @WITH_MODULES@ WITH_OUTPUT = @WITH_OUTPUT@ WITH_PATTERN = @WITH_PATTERN@ WITH_PUSH = @WITH_PUSH@ WITH_READER = @WITH_READER@ WITH_REGEXPS = @WITH_REGEXPS@ WITH_RUN_DEBUG = @WITH_RUN_DEBUG@ WITH_SAX1 = @WITH_SAX1@ WITH_SCHEMAS = @WITH_SCHEMAS@ WITH_SCHEMATRON = @WITH_SCHEMATRON@ WITH_THREADS = @WITH_THREADS@ WITH_THREAD_ALLOC = @WITH_THREAD_ALLOC@ WITH_TREE = @WITH_TREE@ WITH_TRIO = @WITH_TRIO@ WITH_VALID = @WITH_VALID@ WITH_WRITER = @WITH_WRITER@ WITH_XINCLUDE = @WITH_XINCLUDE@ WITH_XPATH = @WITH_XPATH@ WITH_XPTR = @WITH_XPTR@ WITH_ZLIB = @WITH_ZLIB@ XINCLUDE_OBJ = @XINCLUDE_OBJ@ XMLLINT = @XMLLINT@ XML_CFLAGS = @XML_CFLAGS@ XML_INCLUDEDIR = @XML_INCLUDEDIR@ XML_LIBDIR = @XML_LIBDIR@ XML_LIBS = @XML_LIBS@ XML_LIBTOOLLIBS = @XML_LIBTOOLLIBS@ XPATH_OBJ = @XPATH_OBJ@ XPTR_OBJ = @XPTR_OBJ@ XSLTPROC = @XSLTPROC@ Z_CFLAGS = @Z_CFLAGS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/include AM_CFLAGS = $(THREAD_CFLAGS) $(Z_CFLAGS) LDADD = $(RDL_LIBS) $(STATIC_BINARIES) $(top_builddir)/libxml2.la $(THREAD_LIBS) $(Z_LIBS) $(ICONV_LIBS) -lm $(WIN32_EXTRA_LIBADD) CLEANFILES = *.tmp EXTRA_DIST = \ examples.xml \ examples.xsl \ index.html \ index.py \ io1.res \ io2.res \ reader1.res \ reader3.res \ reader4.res \ test1.xml \ test2.xml \ test3.xml \ tree1.res \ tree2.res \ tst.xml \ writer.xml \ xpath1.res \ xpath2.res io1_SOURCES = io1.c io2_SOURCES = io2.c parse1_SOURCES = parse1.c parse2_SOURCES = parse2.c parse3_SOURCES = parse3.c parse4_SOURCES = parse4.c reader1_SOURCES = reader1.c reader2_SOURCES = reader2.c reader3_SOURCES = reader3.c reader4_SOURCES = reader4.c testWriter_SOURCES = testWriter.c tree1_SOURCES = tree1.c tree2_SOURCES = tree2.c xpath1_SOURCES = xpath1.c xpath2_SOURCES = xpath2.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list io1$(EXEEXT): $(io1_OBJECTS) $(io1_DEPENDENCIES) $(EXTRA_io1_DEPENDENCIES) @rm -f io1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(io1_OBJECTS) $(io1_LDADD) $(LIBS) io2$(EXEEXT): $(io2_OBJECTS) $(io2_DEPENDENCIES) $(EXTRA_io2_DEPENDENCIES) @rm -f io2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(io2_OBJECTS) $(io2_LDADD) $(LIBS) parse1$(EXEEXT): $(parse1_OBJECTS) $(parse1_DEPENDENCIES) $(EXTRA_parse1_DEPENDENCIES) @rm -f parse1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parse1_OBJECTS) $(parse1_LDADD) $(LIBS) parse2$(EXEEXT): $(parse2_OBJECTS) $(parse2_DEPENDENCIES) $(EXTRA_parse2_DEPENDENCIES) @rm -f parse2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parse2_OBJECTS) $(parse2_LDADD) $(LIBS) parse3$(EXEEXT): $(parse3_OBJECTS) $(parse3_DEPENDENCIES) $(EXTRA_parse3_DEPENDENCIES) @rm -f parse3$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parse3_OBJECTS) $(parse3_LDADD) $(LIBS) parse4$(EXEEXT): $(parse4_OBJECTS) $(parse4_DEPENDENCIES) $(EXTRA_parse4_DEPENDENCIES) @rm -f parse4$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parse4_OBJECTS) $(parse4_LDADD) $(LIBS) reader1$(EXEEXT): $(reader1_OBJECTS) $(reader1_DEPENDENCIES) $(EXTRA_reader1_DEPENDENCIES) @rm -f reader1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(reader1_OBJECTS) $(reader1_LDADD) $(LIBS) reader2$(EXEEXT): $(reader2_OBJECTS) $(reader2_DEPENDENCIES) $(EXTRA_reader2_DEPENDENCIES) @rm -f reader2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(reader2_OBJECTS) $(reader2_LDADD) $(LIBS) reader3$(EXEEXT): $(reader3_OBJECTS) $(reader3_DEPENDENCIES) $(EXTRA_reader3_DEPENDENCIES) @rm -f reader3$(EXEEXT) $(AM_V_CCLD)$(LINK) $(reader3_OBJECTS) $(reader3_LDADD) $(LIBS) reader4$(EXEEXT): $(reader4_OBJECTS) $(reader4_DEPENDENCIES) $(EXTRA_reader4_DEPENDENCIES) @rm -f reader4$(EXEEXT) $(AM_V_CCLD)$(LINK) $(reader4_OBJECTS) $(reader4_LDADD) $(LIBS) testWriter$(EXEEXT): $(testWriter_OBJECTS) $(testWriter_DEPENDENCIES) $(EXTRA_testWriter_DEPENDENCIES) @rm -f testWriter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testWriter_OBJECTS) $(testWriter_LDADD) $(LIBS) tree1$(EXEEXT): $(tree1_OBJECTS) $(tree1_DEPENDENCIES) $(EXTRA_tree1_DEPENDENCIES) @rm -f tree1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tree1_OBJECTS) $(tree1_LDADD) $(LIBS) tree2$(EXEEXT): $(tree2_OBJECTS) $(tree2_DEPENDENCIES) $(EXTRA_tree2_DEPENDENCIES) @rm -f tree2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tree2_OBJECTS) $(tree2_LDADD) $(LIBS) xpath1$(EXEEXT): $(xpath1_OBJECTS) $(xpath1_DEPENDENCIES) $(EXTRA_xpath1_DEPENDENCIES) @rm -f xpath1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(xpath1_OBJECTS) $(xpath1_LDADD) $(LIBS) xpath2$(EXEEXT): $(xpath2_OBJECTS) $(xpath2_DEPENDENCIES) $(EXTRA_xpath2_DEPENDENCIES) @rm -f xpath2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(xpath2_OBJECTS) $(xpath2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testWriter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath2.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-local clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-local install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am @REBUILD_DOCS_TRUE@rebuild: examples.xml index.html @REBUILD_DOCS_TRUE@.PHONY: rebuild @REBUILD_DOCS_TRUE@examples.xml: index.py $(noinst_PROGRAMS:=.c) @REBUILD_DOCS_TRUE@ cd $(srcdir) && $(PYTHON) index.py @REBUILD_DOCS_TRUE@ $(MAKE) Makefile @REBUILD_DOCS_TRUE@index.html: examples.xml examples.xsl @REBUILD_DOCS_TRUE@ cd $(srcdir) && xsltproc examples.xsl examples.xml && echo "Rebuilt web page" @REBUILD_DOCS_TRUE@ -cd $(srcdir) && xmllint --valid --noout index.html install-data-local: $(MKDIR_P) $(DESTDIR)$(HTML_DIR) -$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(srcdir)/*.xml $(srcdir)/*.xsl $(srcdir)/*.res $(DESTDIR)$(HTML_DIR) clean-local: test -f Makefile.am || rm -f test?.xml valgrind: $(MAKE) CHECKER='valgrind' tests tests: $(noinst_PROGRAMS) test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml . @(echo '## examples regression tests') @(echo > .memdump) $(CHECKER) ./io1 > io1.tmp && diff io1.tmp $(srcdir)/io1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./io2 > io2.tmp && diff io2.tmp $(srcdir)/io2.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse1 test1.xml @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse2 test2.xml @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse3 @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse4 test3.xml @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader2 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader3 > reader3.tmp && diff reader3.tmp $(srcdir)/reader3.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader4 test1.xml test2.xml test3.xml > reader4.tmp && diff reader4.tmp $(srcdir)/reader4.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./testWriter && for i in 1 2 3 4 ; do diff $(srcdir)/writer.xml writer$$i.tmp || break ; done @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./tree1 test2.xml > tree1.tmp && diff tree1.tmp $(srcdir)/tree1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./tree2 > tree2.tmp && diff tree2.tmp $(srcdir)/tree2.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./xpath1 test3.xml '//child2' > xpath1.tmp && diff xpath1.tmp $(srcdir)/xpath1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./xpath2 test3.xml '//discarded' discarded > xpath2.tmp && diff xpath2.tmp $(srcdir)/xpath2.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libxml2-2.9.1+dfsg1/doc/examples/reader4.c0000644000175000017500000000607012113312341016623 0ustar aronaron/** * section: xmlReader * synopsis: Parse multiple XML files reusing an xmlReader * purpose: Demonstrate the use of xmlReaderForFile() and * xmlReaderNewFile to parse XML files while reusing the reader object * and parser context. (Note that the XMLReader functions require * libxml2 version later than 2.6.) * usage: reader4 [ filename ... ] * test: reader4 test1.xml test2.xml test3.xml > reader4.tmp && diff reader4.tmp $(srcdir)/reader4.res * author: Graham Bennett * copy: see Copyright for the status of this software. */ #include #include #ifdef LIBXML_READER_ENABLED static void processDoc(xmlTextReaderPtr readerPtr) { int ret; xmlDocPtr docPtr; const xmlChar *URL; ret = xmlTextReaderRead(readerPtr); while (ret == 1) { ret = xmlTextReaderRead(readerPtr); } /* * One can obtain the document pointer to get insteresting * information about the document like the URL, but one must also * be sure to clean it up at the end (see below). */ docPtr = xmlTextReaderCurrentDoc(readerPtr); if (NULL == docPtr) { fprintf(stderr, "failed to obtain document\n"); return; } URL = docPtr->URL; if (NULL == URL) { fprintf(stderr, "Failed to obtain URL\n"); } if (ret != 0) { fprintf(stderr, "%s: Failed to parse\n", URL); return; } printf("%s: Processed ok\n", (const char *)URL); } int main(int argc, char **argv) { xmlTextReaderPtr readerPtr; int i; xmlDocPtr docPtr; if (argc < 2) return(1); /* * this initialises the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION /* * Create a new reader for the first file and process the * document. */ readerPtr = xmlReaderForFile(argv[1], NULL, 0); if (NULL == readerPtr) { fprintf(stderr, "%s: failed to create reader\n", argv[1]); return(1); } processDoc(readerPtr); /* * The reader can be reused for subsequent files. */ for (i=2; i < argc; ++i) { xmlReaderNewFile(readerPtr, argv[i], NULL, 0); if (NULL == readerPtr) { fprintf(stderr, "%s: failed to create reader\n", argv[i]); return(1); } processDoc(readerPtr); } /* * Since we've called xmlTextReaderCurrentDoc, we now have to * clean up after ourselves. We only have to do this the last * time, because xmlReaderNewFile calls xmlCtxtReset which takes * care of it. */ docPtr = xmlTextReaderCurrentDoc(readerPtr); if (docPtr != NULL) xmlFreeDoc(docPtr); /* * Clean up the reader. */ xmlFreeTextReader(readerPtr); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else int main(void) { fprintf(stderr, "xmlReader support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/tst.xml0000644000175000017500000000013311234335462016473 0ustar aronaron hello goodbye libxml2-2.9.1+dfsg1/doc/examples/testWriter.c0000644000175000017500000011300712113312341017450 0ustar aronaron/** * section: xmlWriter * synopsis: use various APIs for the xmlWriter * purpose: tests a number of APIs for the xmlWriter, especially * the various methods to write to a filename, to a memory * buffer, to a new document, or to a subtree. It shows how to * do encoding string conversions too. The resulting * documents are then serialized. * usage: testWriter * test: testWriter && for i in 1 2 3 4 ; do diff $(srcdir)/writer.xml writer$$i.tmp || break ; done * author: Alfred Mickautsch * copy: see Copyright for the status of this software. */ #include #include #include #include #if defined(LIBXML_WRITER_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) #define MY_ENCODING "ISO-8859-1" void testXmlwriterFilename(const char *uri); void testXmlwriterMemory(const char *file); void testXmlwriterDoc(const char *file); void testXmlwriterTree(const char *file); xmlChar *ConvertInput(const char *in, const char *encoding); int main(void) { /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION /* first, the file version */ testXmlwriterFilename("writer1.tmp"); /* next, the memory version */ testXmlwriterMemory("writer2.tmp"); /* next, the DOM version */ testXmlwriterDoc("writer3.tmp"); /* next, the tree version */ testXmlwriterTree("writer4.tmp"); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return 0; } /** * testXmlwriterFilename: * @uri: the output URI * * test the xmlWriter interface when writing to a new file */ void testXmlwriterFilename(const char *uri) { int rc; xmlTextWriterPtr writer; xmlChar *tmp; /* Create a new XmlWriter for uri, with no compression. */ writer = xmlNewTextWriterFilename(uri, 0); if (writer == NULL) { printf("testXmlwriterFilename: Error creating the xml writer\n"); return; } /* Start the document with the xml default for the version, * encoding ISO 8859-1 and the default for the standalone * declaration. */ rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartDocument\n"); return; } /* Start an element named "EXAMPLE". Since thist is the first * element, this will be the root element of the document. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); return; } /* Write a comment as child of EXAMPLE. * Please observe, that the input to the xmlTextWriter functions * HAS to be in UTF-8, even if the output XML is encoded * in iso-8859-1 */ tmp = ConvertInput("This is a comment with special chars: <äöü>", MY_ENCODING); rc = xmlTextWriterWriteComment(writer, tmp); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "ORDER" as child of EXAMPLE. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); return; } /* Add an attribute with name "version" and value "1.0" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version", BAD_CAST "1.0"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n"); return; } /* Add an attribute with name "xml:lang" and value "de" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", BAD_CAST "de"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n"); return; } /* Write a comment as child of ORDER */ tmp = ConvertInput("<äöü>", MY_ENCODING); rc = xmlTextWriterWriteFormatComment(writer, "This is another comment with special chars: %s", tmp); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "HEADER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "X_ORDER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID", "%010d", 53535); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "CUSTOMER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID", "%d", 1010); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "NAME_1" as child of HEADER. */ tmp = ConvertInput("Müller", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Write an element named "NAME_2" as child of HEADER. */ tmp = ConvertInput("Jörg", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Close the element named HEADER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRIES" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 10); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 20); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n"); return; } /* Close the element named ENTRIES. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "FOOTER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER"); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "TEXT" as child of FOOTER. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT", BAD_CAST "This is a text."); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n"); return; } /* Close the element named FOOTER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n"); return; } /* Here we could close the elements ORDER and EXAMPLE using the * function xmlTextWriterEndElement, but since we do not want to * write any other elements, we simply call xmlTextWriterEndDocument, * which will do all the work. */ rc = xmlTextWriterEndDocument(writer); if (rc < 0) { printf ("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n"); return; } xmlFreeTextWriter(writer); } /** * testXmlwriterMemory: * @file: the output file * * test the xmlWriter interface when writing to memory */ void testXmlwriterMemory(const char *file) { int rc; xmlTextWriterPtr writer; xmlBufferPtr buf; xmlChar *tmp; FILE *fp; /* Create a new XML buffer, to which the XML document will be * written */ buf = xmlBufferCreate(); if (buf == NULL) { printf("testXmlwriterMemory: Error creating the xml buffer\n"); return; } /* Create a new XmlWriter for memory, with no compression. * Remark: there is no compression for this kind of xmlTextWriter */ writer = xmlNewTextWriterMemory(buf, 0); if (writer == NULL) { printf("testXmlwriterMemory: Error creating the xml writer\n"); return; } /* Start the document with the xml default for the version, * encoding ISO 8859-1 and the default for the standalone * declaration. */ rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n"); return; } /* Start an element named "EXAMPLE". Since thist is the first * element, this will be the root element of the document. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"); return; } /* Write a comment as child of EXAMPLE. * Please observe, that the input to the xmlTextWriter functions * HAS to be in UTF-8, even if the output XML is encoded * in iso-8859-1 */ tmp = ConvertInput("This is a comment with special chars: <äöü>", MY_ENCODING); rc = xmlTextWriterWriteComment(writer, tmp); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "ORDER" as child of EXAMPLE. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"); return; } /* Add an attribute with name "version" and value "1.0" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version", BAD_CAST "1.0"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n"); return; } /* Add an attribute with name "xml:lang" and value "de" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", BAD_CAST "de"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n"); return; } /* Write a comment as child of ORDER */ tmp = ConvertInput("<äöü>", MY_ENCODING); rc = xmlTextWriterWriteFormatComment(writer, "This is another comment with special chars: %s", tmp); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "HEADER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "X_ORDER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID", "%010d", 53535); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "CUSTOMER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID", "%d", 1010); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "NAME_1" as child of HEADER. */ tmp = ConvertInput("Müller", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Write an element named "NAME_2" as child of HEADER. */ tmp = ConvertInput("Jörg", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Close the element named HEADER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRIES" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 10); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 20); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"); return; } /* Close the element named ENTRIES. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "FOOTER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER"); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "TEXT" as child of FOOTER. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT", BAD_CAST "This is a text."); if (rc < 0) { printf ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"); return; } /* Close the element named FOOTER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"); return; } /* Here we could close the elements ORDER and EXAMPLE using the * function xmlTextWriterEndElement, but since we do not want to * write any other elements, we simply call xmlTextWriterEndDocument, * which will do all the work. */ rc = xmlTextWriterEndDocument(writer); if (rc < 0) { printf("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n"); return; } xmlFreeTextWriter(writer); fp = fopen(file, "w"); if (fp == NULL) { printf("testXmlwriterMemory: Error at fopen\n"); return; } fprintf(fp, "%s", (const char *) buf->content); fclose(fp); xmlBufferFree(buf); } /** * testXmlwriterDoc: * @file: the output file * * test the xmlWriter interface when creating a new document */ void testXmlwriterDoc(const char *file) { int rc; xmlTextWriterPtr writer; xmlChar *tmp; xmlDocPtr doc; /* Create a new XmlWriter for DOM, with no compression. */ writer = xmlNewTextWriterDoc(&doc, 0); if (writer == NULL) { printf("testXmlwriterDoc: Error creating the xml writer\n"); return; } /* Start the document with the xml default for the version, * encoding ISO 8859-1 and the default for the standalone * declaration. */ rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartDocument\n"); return; } /* Start an element named "EXAMPLE". Since thist is the first * element, this will be the root element of the document. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n"); return; } /* Write a comment as child of EXAMPLE. * Please observe, that the input to the xmlTextWriter functions * HAS to be in UTF-8, even if the output XML is encoded * in iso-8859-1 */ tmp = ConvertInput("This is a comment with special chars: <äöü>", MY_ENCODING); rc = xmlTextWriterWriteComment(writer, tmp); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "ORDER" as child of EXAMPLE. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n"); return; } /* Add an attribute with name "version" and value "1.0" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version", BAD_CAST "1.0"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n"); return; } /* Add an attribute with name "xml:lang" and value "de" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", BAD_CAST "de"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n"); return; } /* Write a comment as child of ORDER */ tmp = ConvertInput("<äöü>", MY_ENCODING); rc = xmlTextWriterWriteFormatComment(writer, "This is another comment with special chars: %s", tmp); if (rc < 0) { printf ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "HEADER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "X_ORDER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID", "%010d", 53535); if (rc < 0) { printf ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "CUSTOMER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID", "%d", 1010); if (rc < 0) { printf ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "NAME_1" as child of HEADER. */ tmp = ConvertInput("Müller", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Write an element named "NAME_2" as child of HEADER. */ tmp = ConvertInput("Jörg", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Close the element named HEADER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRIES" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 10); if (rc < 0) { printf ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 20); if (rc < 0) { printf ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n"); return; } /* Close the element named ENTRIES. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "FOOTER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER"); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "TEXT" as child of FOOTER. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT", BAD_CAST "This is a text."); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n"); return; } /* Close the element named FOOTER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n"); return; } /* Here we could close the elements ORDER and EXAMPLE using the * function xmlTextWriterEndElement, but since we do not want to * write any other elements, we simply call xmlTextWriterEndDocument, * which will do all the work. */ rc = xmlTextWriterEndDocument(writer); if (rc < 0) { printf("testXmlwriterDoc: Error at xmlTextWriterEndDocument\n"); return; } xmlFreeTextWriter(writer); xmlSaveFileEnc(file, doc, MY_ENCODING); xmlFreeDoc(doc); } /** * testXmlwriterTree: * @file: the output file * * test the xmlWriter interface when writing to a subtree */ void testXmlwriterTree(const char *file) { int rc; xmlTextWriterPtr writer; xmlDocPtr doc; xmlNodePtr node; xmlChar *tmp; /* Create a new XML DOM tree, to which the XML document will be * written */ doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); if (doc == NULL) { printf ("testXmlwriterTree: Error creating the xml document tree\n"); return; } /* Create a new XML node, to which the XML document will be * appended */ node = xmlNewDocNode(doc, NULL, BAD_CAST "EXAMPLE", NULL); if (node == NULL) { printf("testXmlwriterTree: Error creating the xml node\n"); return; } /* Make ELEMENT the root node of the tree */ xmlDocSetRootElement(doc, node); /* Create a new XmlWriter for DOM tree, with no compression. */ writer = xmlNewTextWriterTree(doc, node, 0); if (writer == NULL) { printf("testXmlwriterTree: Error creating the xml writer\n"); return; } /* Start the document with the xml default for the version, * encoding ISO 8859-1 and the default for the standalone * declaration. */ rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterStartDocument\n"); return; } /* Write a comment as child of EXAMPLE. * Please observe, that the input to the xmlTextWriter functions * HAS to be in UTF-8, even if the output XML is encoded * in iso-8859-1 */ tmp = ConvertInput("This is a comment with special chars: <äöü>", MY_ENCODING); rc = xmlTextWriterWriteComment(writer, tmp); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterWriteComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "ORDER" as child of EXAMPLE. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER"); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n"); return; } /* Add an attribute with name "version" and value "1.0" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version", BAD_CAST "1.0"); if (rc < 0) { printf ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n"); return; } /* Add an attribute with name "xml:lang" and value "de" to ORDER. */ rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", BAD_CAST "de"); if (rc < 0) { printf ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n"); return; } /* Write a comment as child of ORDER */ tmp = ConvertInput("<äöü>", MY_ENCODING); rc = xmlTextWriterWriteFormatComment(writer, "This is another comment with special chars: %s", tmp); if (rc < 0) { printf ("testXmlwriterTree: Error at xmlTextWriterWriteFormatComment\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Start an element named "HEADER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER"); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "X_ORDER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID", "%010d", 53535); if (rc < 0) { printf ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "CUSTOMER_ID" as child of HEADER. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID", "%d", 1010); if (rc < 0) { printf ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Write an element named "NAME_1" as child of HEADER. */ tmp = ConvertInput("Müller", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Write an element named "NAME_2" as child of HEADER. */ tmp = ConvertInput("Jörg", MY_ENCODING); rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n"); return; } if (tmp != NULL) xmlFree(tmp); /* Close the element named HEADER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRIES" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES"); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 10); if (rc < 0) { printf ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "ENTRY" as child of ENTRIES. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY"); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "ARTICLE" as child of ENTRY. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE", BAD_CAST ""); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n"); return; } /* Write an element named "ENTRY_NO" as child of ENTRY. */ rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d", 20); if (rc < 0) { printf ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n"); return; } /* Close the element named ENTRY. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n"); return; } /* Close the element named ENTRIES. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n"); return; } /* Start an element named "FOOTER" as child of ORDER. */ rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER"); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n"); return; } /* Write an element named "TEXT" as child of FOOTER. */ rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT", BAD_CAST "This is a text."); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n"); return; } /* Close the element named FOOTER. */ rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n"); return; } /* Here we could close the elements ORDER and EXAMPLE using the * function xmlTextWriterEndElement, but since we do not want to * write any other elements, we simply call xmlTextWriterEndDocument, * which will do all the work. */ rc = xmlTextWriterEndDocument(writer); if (rc < 0) { printf("testXmlwriterTree: Error at xmlTextWriterEndDocument\n"); return; } xmlFreeTextWriter(writer); xmlSaveFileEnc(file, doc, MY_ENCODING); xmlFreeDoc(doc); } /** * ConvertInput: * @in: string in a given encoding * @encoding: the encoding used * * Converts @in into UTF-8 for processing with libxml2 APIs * * Returns the converted UTF-8 string, or NULL in case of error. */ xmlChar * ConvertInput(const char *in, const char *encoding) { xmlChar *out; int ret; int size; int out_size; int temp; xmlCharEncodingHandlerPtr handler; if (in == 0) return 0; handler = xmlFindCharEncodingHandler(encoding); if (!handler) { printf("ConvertInput: no encoding handler found for '%s'\n", encoding ? encoding : ""); return 0; } size = (int) strlen(in) + 1; out_size = size * 2 - 1; out = (unsigned char *) xmlMalloc((size_t) out_size); if (out != 0) { temp = size - 1; ret = handler->input(out, &out_size, (const xmlChar *) in, &temp); if ((ret < 0) || (temp - size + 1)) { if (ret < 0) { printf("ConvertInput: conversion wasn't successful.\n"); } else { printf ("ConvertInput: conversion wasn't successful. converted: %i octets.\n", temp); } xmlFree(out); out = 0; } else { out = (unsigned char *) xmlRealloc(out, out_size + 1); out[out_size] = 0; /*null terminating out */ } } else { printf("ConvertInput: no mem\n"); } return out; } #else int main(void) { fprintf(stderr, "Writer or output support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/parse3.c0000644000175000017500000000274211234335462016510 0ustar aronaron/** * section: Parsing * synopsis: Parse an XML document in memory to a tree and free it * purpose: Demonstrate the use of xmlReadMemory() to read an XML file * into a tree and and xmlFreeDoc() to free the resulting tree * usage: parse3 * test: parse3 * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #include static const char *document = ""; /** * example3Func: * @content: the content of the document * @length: the length in bytes * * Parse the in memory document and free the resulting tree */ static void example3Func(const char *content, int length) { xmlDocPtr doc; /* the resulting document tree */ /* * The document being in memory, it have no base per RFC 2396, * and the "noname.xml" argument will serve as its base. */ doc = xmlReadMemory(content, length, "noname.xml", NULL, 0); if (doc == NULL) { fprintf(stderr, "Failed to parse document\n"); return; } xmlFreeDoc(doc); } int main(void) { /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION example3Func(document, 6); /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } libxml2-2.9.1+dfsg1/doc/examples/io1.res0000644000175000017500000000031612113312341016331 0ustar aronaron

    List of people:

    ab
    libxml2-2.9.1+dfsg1/doc/examples/parse4.c0000644000175000017500000000673111234335462016513 0ustar aronaron/** * section: Parsing * synopsis: Parse an XML document chunk by chunk to a tree and free it * purpose: Demonstrate the use of xmlCreatePushParserCtxt() and * xmlParseChunk() to read an XML file progressively * into a tree and and xmlFreeDoc() to free the resulting tree * usage: parse4 test3.xml * test: parse4 test3.xml * author: Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #include #ifdef LIBXML_PUSH_ENABLED static FILE *desc; /** * readPacket: * @mem: array to store the packet * @size: the packet size * * read at most @size bytes from the document and store it in @mem * * Returns the number of bytes read */ static int readPacket(char *mem, int size) { int res; res = fread(mem, 1, size, desc); return(res); } /** * example4Func: * @filename: a filename or an URL * * Parse the resource and free the resulting tree */ static void example4Func(const char *filename) { xmlParserCtxtPtr ctxt; char chars[4]; xmlDocPtr doc; /* the resulting document tree */ int res; /* * Read a few first byte to check the input used for the * encoding detection at the parser level. */ res = readPacket(chars, 4); if (res <= 0) { fprintf(stderr, "Failed to parse %s\n", filename); return; } /* * Create a progressive parsing context, the 2 first arguments * are not used since we want to build a tree and not use a SAX * parsing interface. We also pass the first bytes of the document * to allow encoding detection when creating the parser but this * is optional. */ ctxt = xmlCreatePushParserCtxt(NULL, NULL, chars, res, filename); if (ctxt == NULL) { fprintf(stderr, "Failed to create parser context !\n"); return; } /* * loop on the input getting the document data, of course 4 bytes * at a time is not realistic but allows to verify testing on small * documents. */ while ((res = readPacket(chars, 4)) > 0) { xmlParseChunk(ctxt, chars, res, 0); } /* * there is no more input, indicate the parsing is finished. */ xmlParseChunk(ctxt, chars, 0, 1); /* * collect the document back and if it was wellformed * and destroy the parser context. */ doc = ctxt->myDoc; res = ctxt->wellFormed; xmlFreeParserCtxt(ctxt); if (!res) { fprintf(stderr, "Failed to parse %s\n", filename); } /* * since we don't use the document, destroy it now. */ xmlFreeDoc(doc); } int main(int argc, char **argv) { if (argc != 2) return(1); /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION /* * simulate a progressive parsing using the input file. */ desc = fopen(argv[1], "rb"); if (desc != NULL) { example4Func(argv[1]); fclose(desc); } else { fprintf(stderr, "Failed to parse %s\n", argv[1]); } /* * Cleanup function for the XML library. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return(0); } #else /* ! LIBXML_PUSH_ENABLED */ int main(int argc, char **argv) { fprintf(stderr, "Library not compiled with push parser support\n"); return(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/io2.c0000644000175000017500000000223612113312341015766 0ustar aronaron/** * section: InputOutput * synopsis: Output to char buffer * purpose: Demonstrate the use of xmlDocDumpMemory * to output document to a character buffer * usage: io2 * test: io2 > io2.tmp && diff io2.tmp $(srcdir)/io2.res * author: John Fleck * copy: see Copyright for the status of this software. */ #include #if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int main(void) { xmlNodePtr n; xmlDocPtr doc; xmlChar *xmlbuff; int buffersize; /* * Create the document. */ doc = xmlNewDoc(BAD_CAST "1.0"); n = xmlNewNode(NULL, BAD_CAST "root"); xmlNodeSetContent(n, BAD_CAST "content"); xmlDocSetRootElement(doc, n); /* * Dump the document to a buffer and print it * for demonstration purposes. */ xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); printf("%s", (char *) xmlbuff); /* * Free associated memory. */ xmlFree(xmlbuff); xmlFreeDoc(doc); return (0); } #else #include int main(void) { fprintf(stderr, "library not configured with tree and output support\n"); return (1); } #endif libxml2-2.9.1+dfsg1/doc/examples/writer.xml0000644000175000017500000000104011234335462017173 0ustar aronaron
    00000535351010MüllerJörg
    <Test>
    10
    <Test 2>
    20
    This is a text.
    libxml2-2.9.1+dfsg1/doc/examples/Makefile.am0000644000175000017500000000774512113312341017177 0ustar aronaron## ## This file is auto-generated by index.py ## DO NOT EDIT !!! ## AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/include AM_CFLAGS = $(THREAD_CFLAGS) $(Z_CFLAGS) LDADD = $(RDL_LIBS) $(STATIC_BINARIES) $(top_builddir)/libxml2.la $(THREAD_LIBS) $(Z_LIBS) $(ICONV_LIBS) -lm $(WIN32_EXTRA_LIBADD) CLEANFILES = *.tmp if REBUILD_DOCS rebuild: examples.xml index.html .PHONY: rebuild examples.xml: index.py $(noinst_PROGRAMS:=.c) cd $(srcdir) && $(PYTHON) index.py $(MAKE) Makefile index.html: examples.xml examples.xsl cd $(srcdir) && xsltproc examples.xsl examples.xml && echo "Rebuilt web page" -cd $(srcdir) && xmllint --valid --noout index.html endif install-data-local: $(MKDIR_P) $(DESTDIR)$(HTML_DIR) -$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(srcdir)/*.xml $(srcdir)/*.xsl $(srcdir)/*.res $(DESTDIR)$(HTML_DIR) clean-local: test -f Makefile.am || rm -f test?.xml EXTRA_DIST = \ examples.xml \ examples.xsl \ index.html \ index.py \ io1.res \ io2.res \ reader1.res \ reader3.res \ reader4.res \ test1.xml \ test2.xml \ test3.xml \ tree1.res \ tree2.res \ tst.xml \ writer.xml \ xpath1.res \ xpath2.res noinst_PROGRAMS = \ io1 \ io2 \ parse1 \ parse2 \ parse3 \ parse4 \ reader1 \ reader2 \ reader3 \ reader4 \ testWriter \ tree1 \ tree2 \ xpath1 \ xpath2 io1_SOURCES = io1.c io2_SOURCES = io2.c parse1_SOURCES = parse1.c parse2_SOURCES = parse2.c parse3_SOURCES = parse3.c parse4_SOURCES = parse4.c reader1_SOURCES = reader1.c reader2_SOURCES = reader2.c reader3_SOURCES = reader3.c reader4_SOURCES = reader4.c testWriter_SOURCES = testWriter.c tree1_SOURCES = tree1.c tree2_SOURCES = tree2.c xpath1_SOURCES = xpath1.c xpath2_SOURCES = xpath2.c valgrind: $(MAKE) CHECKER='valgrind' tests tests: $(noinst_PROGRAMS) test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml . @(echo '## examples regression tests') @(echo > .memdump) $(CHECKER) ./io1 > io1.tmp && diff io1.tmp $(srcdir)/io1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./io2 > io2.tmp && diff io2.tmp $(srcdir)/io2.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse1 test1.xml @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse2 test2.xml @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse3 @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./parse4 test3.xml @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader2 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader3 > reader3.tmp && diff reader3.tmp $(srcdir)/reader3.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./reader4 test1.xml test2.xml test3.xml > reader4.tmp && diff reader4.tmp $(srcdir)/reader4.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./testWriter && for i in 1 2 3 4 ; do diff $(srcdir)/writer.xml writer$$i.tmp || break ; done @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./tree1 test2.xml > tree1.tmp && diff tree1.tmp $(srcdir)/tree1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./tree2 > tree2.tmp && diff tree2.tmp $(srcdir)/tree2.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./xpath1 test3.xml '//child2' > xpath1.tmp && diff xpath1.tmp $(srcdir)/xpath1.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 $(CHECKER) ./xpath2 test3.xml '//discarded' discarded > xpath2.tmp && diff xpath2.tmp $(srcdir)/xpath2.res @grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0 libxml2-2.9.1+dfsg1/doc/examples/xpath1.c0000644000175000017500000001474012113312341016505 0ustar aronaron/** * section: XPath * synopsis: Evaluate XPath expression and prints result node set. * purpose: Shows how to evaluate XPath expression and register * known namespaces in XPath context. * usage: xpath1 [] * test: xpath1 test3.xml '//child2' > xpath1.tmp && diff xpath1.tmp $(srcdir)/xpath1.res * author: Aleksey Sanin * copy: see Copyright for the status of this software. */ #include #include #include #include #include #include #include #include #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_SAX1_ENABLED) static void usage(const char *name); int execute_xpath_expression(const char* filename, const xmlChar* xpathExpr, const xmlChar* nsList); int register_namespaces(xmlXPathContextPtr xpathCtx, const xmlChar* nsList); void print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output); int main(int argc, char **argv) { /* Parse command line and process file */ if((argc < 3) || (argc > 4)) { fprintf(stderr, "Error: wrong number of arguments.\n"); usage(argv[0]); return(-1); } /* Init libxml */ xmlInitParser(); LIBXML_TEST_VERSION /* Do the main job */ if(execute_xpath_expression(argv[1], BAD_CAST argv[2], (argc > 3) ? BAD_CAST argv[3] : NULL) < 0) { usage(argv[0]); return(-1); } /* Shutdown libxml */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return 0; } /** * usage: * @name: the program name. * * Prints usage information. */ static void usage(const char *name) { assert(name); fprintf(stderr, "Usage: %s []\n", name); fprintf(stderr, "where is a list of known namespaces\n"); fprintf(stderr, "in \"= =href2> ...\" format\n"); } /** * execute_xpath_expression: * @filename: the input XML filename. * @xpathExpr: the xpath expression for evaluation. * @nsList: the optional list of known namespaces in * "= =href2> ..." format. * * Parses input XML file, evaluates XPath expression and prints results. * * Returns 0 on success and a negative value otherwise. */ int execute_xpath_expression(const char* filename, const xmlChar* xpathExpr, const xmlChar* nsList) { xmlDocPtr doc; xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; assert(filename); assert(xpathExpr); /* Load XML document */ doc = xmlParseFile(filename); if (doc == NULL) { fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename); return(-1); } /* Create xpath evaluation context */ xpathCtx = xmlXPathNewContext(doc); if(xpathCtx == NULL) { fprintf(stderr,"Error: unable to create new XPath context\n"); xmlFreeDoc(doc); return(-1); } /* Register namespaces from list (if any) */ if((nsList != NULL) && (register_namespaces(xpathCtx, nsList) < 0)) { fprintf(stderr,"Error: failed to register namespaces list \"%s\"\n", nsList); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return(-1); } /* Evaluate xpath expression */ xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); if(xpathObj == NULL) { fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return(-1); } /* Print results */ print_xpath_nodes(xpathObj->nodesetval, stdout); /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return(0); } /** * register_namespaces: * @xpathCtx: the pointer to an XPath context. * @nsList: the list of known namespaces in * "= =href2> ..." format. * * Registers namespaces from @nsList in @xpathCtx. * * Returns 0 on success and a negative value otherwise. */ int register_namespaces(xmlXPathContextPtr xpathCtx, const xmlChar* nsList) { xmlChar* nsListDup; xmlChar* prefix; xmlChar* href; xmlChar* next; assert(xpathCtx); assert(nsList); nsListDup = xmlStrdup(nsList); if(nsListDup == NULL) { fprintf(stderr, "Error: unable to strdup namespaces list\n"); return(-1); } next = nsListDup; while(next != NULL) { /* skip spaces */ while((*next) == ' ') next++; if((*next) == '\0') break; /* find prefix */ prefix = next; next = (xmlChar*)xmlStrchr(next, '='); if(next == NULL) { fprintf(stderr,"Error: invalid namespaces list format\n"); xmlFree(nsListDup); return(-1); } *(next++) = '\0'; /* find href */ href = next; next = (xmlChar*)xmlStrchr(next, ' '); if(next != NULL) { *(next++) = '\0'; } /* do register namespace */ if(xmlXPathRegisterNs(xpathCtx, prefix, href) != 0) { fprintf(stderr,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", prefix, href); xmlFree(nsListDup); return(-1); } } xmlFree(nsListDup); return(0); } /** * print_xpath_nodes: * @nodes: the nodes set. * @output: the output file handle. * * Prints the @nodes content to @output. */ void print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output) { xmlNodePtr cur; int size; int i; assert(output); size = (nodes) ? nodes->nodeNr : 0; fprintf(output, "Result (%d nodes):\n", size); for(i = 0; i < size; ++i) { assert(nodes->nodeTab[i]); if(nodes->nodeTab[i]->type == XML_NAMESPACE_DECL) { xmlNsPtr ns; ns = (xmlNsPtr)nodes->nodeTab[i]; cur = (xmlNodePtr)ns->next; if(cur->ns) { fprintf(output, "= namespace \"%s\"=\"%s\" for node %s:%s\n", ns->prefix, ns->href, cur->ns->href, cur->name); } else { fprintf(output, "= namespace \"%s\"=\"%s\" for node %s\n", ns->prefix, ns->href, cur->name); } } else if(nodes->nodeTab[i]->type == XML_ELEMENT_NODE) { cur = nodes->nodeTab[i]; if(cur->ns) { fprintf(output, "= element node \"%s:%s\"\n", cur->ns->href, cur->name); } else { fprintf(output, "= element node \"%s\"\n", cur->name); } } else { cur = nodes->nodeTab[i]; fprintf(output, "= node \"%s\": type %d\n", cur->name, cur->type); } } } #else int main(void) { fprintf(stderr, "XPath support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/reader4.res0000644000175000017500000000011012013315006017157 0ustar aronarontest1.xml: Processed ok test2.xml: Processed ok test3.xml: Processed ok libxml2-2.9.1+dfsg1/doc/examples/index.py0000755000175000017500000002171412113312341016617 0ustar aronaron#!/usr/bin/python -u # # Indexes the examples and build an XML description # import string import glob import sys try: import libxml2 except: sys.exit(1) sys.path.insert(0, "..") from apibuild import CParser, escape examples = [] extras = ['examples.xsl', 'index.html', 'index.py'] tests = [] sections = {} symbols = {} api_dict = None api_doc = None def load_api(): global api_dict global api_doc if api_dict != None: return api_dict = {} try: print "loading ../libxml2-api.xml" api_doc = libxml2.parseFile("../libxml2-api.xml") except: print "failed to parse ../libxml2-api.xml" sys.exit(1) def find_symbol(name): global api_dict global api_doc if api_doc == None: load_api() if name == None: return if api_dict.has_key(name): return api_dict[name] ctxt = api_doc.xpathNewContext() res = ctxt.xpathEval("/api/symbols/*[@name = '%s']" % (name)) if type(res) == type([]) and len(res) >= 1: if len(res) > 1: print "Found %d references to %s in the API" % (len(res), name) node = res[0] typ = node.name file = node.xpathEval("string(@file)") info = node.xpathEval("string(info)") else: print "Reference %s not found in the API" % (name) return None ret = (typ, file, info) api_dict[name] = ret return ret def parse_top_comment(filename, comment): res = {} lines = string.split(comment, "\n") item = None for line in lines: while line != "" and (line[0] == ' ' or line[0] == '\t'): line = line[1:] while line != "" and line[0] == '*': line = line[1:] while line != "" and (line[0] == ' ' or line[0] == '\t'): line = line[1:] try: (it, line) = string.split(line, ":", 1) item = it while line != "" and (line[0] == ' ' or line[0] == '\t'): line = line[1:] if res.has_key(item): res[item] = res[item] + " " + line else: res[item] = line except: if item != None: if res.has_key(item): res[item] = res[item] + " " + line else: res[item] = line return res def parse(filename, output): global symbols global sections parser = CParser(filename) parser.collect_references() idx = parser.parse() info = parse_top_comment(filename, parser.top_comment) output.write(" \n" % filename) try: synopsis = info['synopsis'] output.write(" %s\n" % escape(synopsis)); except: print "Example %s lacks a synopsis description" % (filename) try: purpose = info['purpose'] output.write(" %s\n" % escape(purpose)); except: print "Example %s lacks a purpose description" % (filename) try: usage = info['usage'] output.write(" %s\n" % escape(usage)); except: print "Example %s lacks an usage description" % (filename) try: test = info['test'] output.write(" %s\n" % escape(test)); progname=filename[0:-2] command=string.replace(test, progname, './' + progname, 1) tests.append(command) except: pass try: author = info['author'] output.write(" %s\n" % escape(author)); except: print "Example %s lacks an author description" % (filename) try: copy = info['copy'] output.write(" %s\n" % escape(copy)); except: print "Example %s lacks a copyright description" % (filename) try: section = info['section'] output.write("
    %s
    \n" % escape(section)); if sections.has_key(section): sections[section].append(filename) else: sections[section] = [filename] except: print "Example %s lacks a section description" % (filename) for topic in info.keys(): if topic != "purpose" and topic != "usage" and \ topic != "author" and topic != "copy" and \ topic != "section" and topic != "synopsis" and topic != "test": str = info[topic] output.write(" %s\n" % ( escape(topic), escape(str))) output.write(" \n") for include in idx.includes.keys(): if include.find("libxml") != -1: output.write(" %s\n" % (escape(include))) output.write(" \n") output.write(" \n") for ref in idx.references.keys(): id = idx.references[ref] name = id.get_name() line = id.get_lineno() if symbols.has_key(name): sinfo = symbols[name] refs = sinfo[0] # gather at most 5 references per symbols if refs > 5: continue sinfo.append(filename) sinfo[0] = refs + 1 else: symbols[name] = [1, filename] info = find_symbol(name) if info != None: type = info[0] file = info[1] output.write(" <%s line='%d' file='%s' name='%s'/>\n" % (type, line, file, name)) else: type = id.get_type() output.write(" <%s line='%d' name='%s'/>\n" % (type, line, name)) output.write(" \n") output.write("
    \n") return idx def dump_symbols(output): global symbols output.write(" \n") keys = symbols.keys() keys.sort() for symbol in keys: output.write(" \n" % (symbol)) info = symbols[symbol] i = 1 while i < len(info): output.write(" \n" % (info[i])) i = i + 1 output.write(" \n") output.write(" \n") def dump_sections(output): global sections output.write(" \n") keys = sections.keys() keys.sort() for section in keys: output.write("
    \n" % (section)) info = sections[section] i = 0 while i < len(info): output.write(" \n" % (info[i])) i = i + 1 output.write("
    \n") output.write("
    \n") def dump_Makefile(): for file in glob.glob('*.xml'): extras.append(file) for file in glob.glob('*.res'): extras.append(file) Makefile="""## ## This file is auto-generated by index.py ## DO NOT EDIT !!! ## AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/include AM_CFLAGS = $(THREAD_CFLAGS) $(Z_CFLAGS) LDADD = $(RDL_LIBS) $(STATIC_BINARIES) $(top_builddir)/libxml2.la $(THREAD_LIBS) $(Z_LIBS) $(ICONV_LIBS) -lm $(WIN32_EXTRA_LIBADD) CLEANFILES = *.tmp if REBUILD_DOCS rebuild: examples.xml index.html .PHONY: rebuild examples.xml: index.py $(noinst_PROGRAMS:=.c) cd $(srcdir) && $(PYTHON) index.py $(MAKE) Makefile index.html: examples.xml examples.xsl cd $(srcdir) && xsltproc examples.xsl examples.xml && echo "Rebuilt web page" -cd $(srcdir) && xmllint --valid --noout index.html endif install-data-local: $(MKDIR_P) $(DESTDIR)$(HTML_DIR) -$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(srcdir)/*.xml $(srcdir)/*.xsl $(srcdir)/*.res $(DESTDIR)$(HTML_DIR) clean-local: test -f Makefile.am || rm -f test?.xml """ examples.sort() extras.sort() tests.sort() EXTRA_DIST="" for extra in extras: EXTRA_DIST = EXTRA_DIST + " \\\n\t" + extra Makefile = Makefile + "EXTRA_DIST =%s\n\n" % (EXTRA_DIST) noinst_PROGRAMS="" for example in examples: noinst_PROGRAMS = noinst_PROGRAMS + " \\\n\t" + example Makefile = Makefile + "noinst_PROGRAMS =%s\n\n" % (noinst_PROGRAMS) for example in examples: Makefile = Makefile + "%s_SOURCES = %s.c\n\n" % (example, example) Makefile = Makefile + "valgrind: \n\t$(MAKE) CHECKER='valgrind' tests\n\n" Makefile = Makefile + "tests: $(noinst_PROGRAMS)\n" Makefile = Makefile + "\ttest -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml .\n" Makefile = Makefile + "\t@(echo '## examples regression tests')\n" Makefile = Makefile + "\t@(echo > .memdump)\n" for test in tests: Makefile = Makefile + "\t$(CHECKER) %s\n" % (test) Makefile = Makefile + '\t@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0\n' try: old = open("Makefile.am", "r").read() if old != Makefile: n = open("Makefile.am", "w").write(Makefile) print "Updated Makefile.am" except: print "Failed to read or save Makefile.am" # # # # Autogenerate the .cvsignore too ... DEPRECATED # # # ignore = """.memdump #Makefile.in #Makefile #""" # for example in examples: # ignore = ignore + "%s\n" % (example) # try: # old = open(".cvsignore", "r").read() # if old != ignore: # n = open(".cvsignore", "w").write(ignore) # print "Updated .cvsignore" # except: # print "Failed to read or save .cvsignore" if __name__ == "__main__": load_api() output = open("examples.xml", "w") output.write("\n") for file in glob.glob('*.c'): parse(file, output) examples.append(file[:-2]) dump_symbols(output) dump_sections(output) output.write("\n") output.close() dump_Makefile() libxml2-2.9.1+dfsg1/doc/examples/test2.xml0000644000175000017500000000034311234335462016725 0ustar aronaron ]> libxml2-2.9.1+dfsg1/doc/examples/tree1.c0000644000175000017500000000430512113312341016314 0ustar aronaron/** * section: Tree * synopsis: Navigates a tree to print element names * purpose: Parse a file to a tree, use xmlDocGetRootElement() to * get the root element, then walk the document and print * all the element name in document order. * usage: tree1 filename_or_URL * test: tree1 test2.xml > tree1.tmp && diff tree1.tmp $(srcdir)/tree1.res * author: Dodji Seketeli * copy: see Copyright for the status of this software. */ #include #include #include #ifdef LIBXML_TREE_ENABLED /* *To compile this file using gcc you can type *gcc `xml2-config --cflags --libs` -o xmlexample libxml2-example.c */ /** * print_element_names: * @a_node: the initial xml node to consider. * * Prints the names of the all the xml elements * that are siblings or children of a given xml node. */ static void print_element_names(xmlNode * a_node) { xmlNode *cur_node = NULL; for (cur_node = a_node; cur_node; cur_node = cur_node->next) { if (cur_node->type == XML_ELEMENT_NODE) { printf("node type: Element, name: %s\n", cur_node->name); } print_element_names(cur_node->children); } } /** * Simple example to parse a file called "file.xml", * walk down the DOM, and print the name of the * xml elements nodes. */ int main(int argc, char **argv) { xmlDoc *doc = NULL; xmlNode *root_element = NULL; if (argc != 2) return(1); /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ LIBXML_TEST_VERSION /*parse the file and get the DOM */ doc = xmlReadFile(argv[1], NULL, 0); if (doc == NULL) { printf("error: could not parse file %s\n", argv[1]); } /*Get the root element node */ root_element = xmlDocGetRootElement(doc); print_element_names(root_element); /*free the document */ xmlFreeDoc(doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return 0; } #else int main(void) { fprintf(stderr, "Tree support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/examples/xpath2.c0000644000175000017500000001232212113312341016500 0ustar aronaron/** * section: XPath * synopsis: Load a document, locate subelements with XPath, modify * said elements and save the resulting document. * purpose: Shows how to make a full round-trip from a load/edit/save * usage: xpath2 * test: xpath2 test3.xml '//discarded' discarded > xpath2.tmp && diff xpath2.tmp $(srcdir)/xpath2.res * author: Aleksey Sanin and Daniel Veillard * copy: see Copyright for the status of this software. */ #include #include #include #include #include #include #include #include #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_SAX1_ENABLED) && \ defined(LIBXML_OUTPUT_ENABLED) static void usage(const char *name); static int example4(const char *filename, const xmlChar * xpathExpr, const xmlChar * value); static void update_xpath_nodes(xmlNodeSetPtr nodes, const xmlChar * value); int main(int argc, char **argv) { /* Parse command line and process file */ if (argc != 4) { fprintf(stderr, "Error: wrong number of arguments.\n"); usage(argv[0]); return(-1); } /* Init libxml */ xmlInitParser(); LIBXML_TEST_VERSION /* Do the main job */ if (example4(argv[1], BAD_CAST argv[2], BAD_CAST argv[3])) { usage(argv[0]); return(-1); } /* Shutdown libxml */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); return 0; } /** * usage: * @name: the program name. * * Prints usage information. */ static void usage(const char *name) { assert(name); fprintf(stderr, "Usage: %s \n", name); } /** * example4: * @filename: the input XML filename. * @xpathExpr: the xpath expression for evaluation. * @value: the new node content. * * Parses input XML file, evaluates XPath expression and update the nodes * then print the result. * * Returns 0 on success and a negative value otherwise. */ static int example4(const char* filename, const xmlChar* xpathExpr, const xmlChar* value) { xmlDocPtr doc; xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; assert(filename); assert(xpathExpr); assert(value); /* Load XML document */ doc = xmlParseFile(filename); if (doc == NULL) { fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename); return(-1); } /* Create xpath evaluation context */ xpathCtx = xmlXPathNewContext(doc); if(xpathCtx == NULL) { fprintf(stderr,"Error: unable to create new XPath context\n"); xmlFreeDoc(doc); return(-1); } /* Evaluate xpath expression */ xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); if(xpathObj == NULL) { fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return(-1); } /* update selected nodes */ update_xpath_nodes(xpathObj->nodesetval, value); /* Cleanup of XPath data */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); /* dump the resulting document */ xmlDocDump(stdout, doc); /* free the document */ xmlFreeDoc(doc); return(0); } /** * update_xpath_nodes: * @nodes: the nodes set. * @value: the new value for the node(s) * * Prints the @nodes content to @output. */ static void update_xpath_nodes(xmlNodeSetPtr nodes, const xmlChar* value) { int size; int i; assert(value); size = (nodes) ? nodes->nodeNr : 0; /* * NOTE: the nodes are processed in reverse order, i.e. reverse document * order because xmlNodeSetContent can actually free up descendant * of the node and such nodes may have been selected too ! Handling * in reverse order ensure that descendant are accessed first, before * they get removed. Mixing XPath and modifications on a tree must be * done carefully ! */ for(i = size - 1; i >= 0; i--) { assert(nodes->nodeTab[i]); xmlNodeSetContent(nodes->nodeTab[i], value); /* * All the elements returned by an XPath query are pointers to * elements from the tree *except* namespace nodes where the XPath * semantic is different from the implementation in libxml2 tree. * As a result when a returned node set is freed when * xmlXPathFreeObject() is called, that routine must check the * element type. But node from the returned set may have been removed * by xmlNodeSetContent() resulting in access to freed data. * This can be exercised by running * valgrind xpath2 test3.xml '//discarded' discarded * There is 2 ways around it: * - make a copy of the pointers to the nodes from the result set * then call xmlXPathFreeObject() and then modify the nodes * or * - remove the reference to the modified nodes from the node set * as they are processed, if they are not namespace nodes. */ if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL) nodes->nodeTab[i] = NULL; } } #else int main(void) { fprintf(stderr, "XPath support not compiled in\n"); exit(1); } #endif libxml2-2.9.1+dfsg1/doc/architecture.html0000644000175000017500000001531412124524424016675 0ustar aronaron libxml2 architecture
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    libxml2 architecture

    Developer Menu
    API Indexes
    Related links

    Libxml2 is made of multiple components; some of them are optional, and most of the block interfaces are public. The main components are:

    • an Input/Output layer
    • FTP and HTTP client layers (optional)
    • an Internationalization layer managing the encodings support
    • a URI module
    • the XML parser and its basic SAX interface
    • an HTML parser using the same SAX interface (optional)
    • a SAX tree module to build an in-memory DOM representation
    • a tree module to manipulate the DOM representation
    • a validation module using the DOM representation (optional)
    • an XPath module for global lookup in a DOM representation (optional)
    • a debug module (optional)

    Graphically this gives the following:

    a graphical view of the various

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/DOM.html0000644000175000017500000001473112124524424014634 0ustar aronaron DOM Principles
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    DOM Principles

    Developer Menu
    API Indexes
    Related links

    DOM stands for the Document Object Model; this is an API for accessing XML or HTML structured documents. Native support for DOM in Gnome is on the way (module gnome-dom), and will be based on gnome-xml. This will be a far cleaner interface to manipulate XML files within Gnome since it won't expose the internal structure.

    The current DOM implementation on top of libxml2 is the gdome2 Gnome module, this is a full DOM interface, thanks to Paolo Casarini, check the Gdome2 homepage for more information.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk17.html0000644000175000017500000015145112134171042016023 0ustar aronaron API Alphabetic Index i-i for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index i-i for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter i:

    i-xxx
    xmlCheckLanguageID
    iconv
    LIBXML_ICONV_ENABLED
    LIBXML_ISO8859X_ENABLED
    icu
    LIBXML_ICU_ENABLED
    identify
    xmlParseAttributeType
    identitier
    XML_MAX_NAME_LENGTH
    identity-constraint
    _xmlSchema
    _xmlSchemaElement
    ignorable
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    xmlIsBlankNode
    xmlKeepBlanksDefault
    xmlSAX2IgnorableWhitespace
    ignorableWhitespace
    xmlKeepBlanksDefault
    ignored
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    ignoring
    xmlURIEscapeStr
    image
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    imbrication
    xmlBufNodeDump
    xmlNodeDump
    xmlNodeDumpOutput
    img
    xmlBuildRelativeURI
    immediately
    xmlCheckVersion
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlXPathStringFunction
    immutable
    xmlBufferCreateStatic
    xmlBufferDetach
    xmlParserInputBufferCreateStatic
    implementation
    xmlFreeFunc
    xmlMallocFunc
    xmlReallocFunc
    xmlStrdupFunc
    xmlTextReaderGetRemainder
    xmlXPathRegisterFunc
    xmlXPathRegisterFuncNS
    implementation-defined
    xmlXPathNextNamespace
    implemented
    HTML_COMMENT_NODE
    HTML_ENTITY_REF_NODE
    HTML_PI_NODE
    HTML_PRESERVE_NODE
    HTML_TEXT_NODE
    xmlModuleOpen
    xmlSaveDoc
    xmlSaveTree
    xmlSchemaCopyValue
    xmlTextReaderNextSibling
    implicitly
    htmlAutoCloseTag
    htmlIsAutoClosed
    implied
    _htmlElemDesc
    impossible
    xmlURIEscape
    improves
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    in-
    xmlParserInputBufferGrow
    in-extenso
    xmlMemDisplay
    xmlMemoryDump
    in-memory
    _xmlDoc
    _xmlParserCtxt
    docbParseDoc
    docbSAXParseDoc
    htmlCreateMemoryParserCtxt
    htmlCtxtReadDoc
    htmlCtxtReadMemory
    htmlParseDoc
    htmlReadDoc
    htmlReadMemory
    htmlSAXParseDoc
    xmlCreateDocParserCtxt
    xmlCreateMemoryParserCtxt
    xmlCtxtReadDoc
    xmlCtxtReadMemory
    xmlParseDoc
    xmlParseMemory
    xmlReadDoc
    xmlReadMemory
    xmlReaderForDoc
    xmlReaderForMemory
    xmlReaderNewDoc
    xmlReaderNewMemory
    xmlRecoverDoc
    xmlRecoverMemory
    xmlSAXParseDoc
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlSAXUserParseMemory
    incase
    xmlNanoFTPClose
    xmlNanoFTPCloseConnection
    xmlNanoFTPCwd
    xmlNanoFTPDele
    xmlNanoFTPGet
    xmlNanoFTPGetConnection
    xmlNanoFTPList
    xmlNanoHTTPFetch
    xmlNanoHTTPSave
    incl
    _xmlSchemaType
    include
    XINCLUDE_NODE
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCheckVersion
    xmlListMerge
    include:
    xmlBuildRelativeURI
    included
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NIsVisibleCallback
    xmlDocDumpMemory
    xmlFreeDoc
    xmlNanoHTTPContentLength
    xmlParseNotationType
    includes
    _xmlSchema
    xmlCleanupInputCallbacks
    xmlCleanupOutputCallbacks
    xmlPopInputCallbacks
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    xmlXIncludeSetFlags
    including
    XML_SCHEMAS_INCLUDING_CONVERT_NS
    attribute
    attributeSAXFunc
    ftpListCallback
    startElement
    startElementSAXFunc
    xmlSAX2StartElement
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlXPathStringFunction
    inclusive
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    increase
    xmlParserInputGrow
    increment
    xmlAutomataNewCountedTrans
    incremental
    xmlValidateDocumentFinal
    indent
    xmlTextWriterSetIndent
    indentation
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlKeepBlanksDefault
    xmlTextWriterSetIndent
    xmlTextWriterSetIndentString
    xmlXPathDebugDumpCompExpr
    xmlXPathDebugDumpObject
    indentation?
    xmlTextWriterSetIndent
    indented
    xmlSaveFormatFile
    indenting
    xmlBufNodeDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocFormatDump
    xmlNodeDump
    xmlNodeDumpOutput
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    independently
    xmlGetProp
    xmlParseAttribute
    index
    index
    inputPush
    namePush
    nodePush
    xmlByteConsumed
    xmlParserFindNodeInfoIndex
    xmlPushInput
    xmlStrsub
    xmlTextReaderByteConsumed
    xmlTextReaderGetAttributeNo
    xmlTextReaderMoveToAttributeNo
    xmlXPathNodeSetRemove
    xmlXPtrLocationSetRemove
    xmlXPtrNewRange
    indicate
    LIBXML_ATTR_ALLOC_SIZE
    LIBXML_ATTR_FORMAT
    xmlParseExternalID
    xmlParserInputGrow
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlURIUnescapeString
    indicated
    xmlNanoHTTPFetch
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    indicates
    XML_SCHEMAS_TYPE_FACETSNEEDVALUE
    XML_SCHEMAS_TYPE_INTERNAL_INVALID
    XML_SCHEMAS_TYPE_INTERNAL_RESOLVED
    XML_SCHEMAS_TYPE_NORMVALUENEEDED
    xmlHasNsProp
    xmlNanoFTPRead
    xmlNanoFTPScanProxy
    xmlNanoFTPUpdateURL
    xmlNanoHTTPContentLength
    xmlNanoHTTPRead
    xmlNanoHTTPScanProxy
    indicating
    xmlParseCharData
    xmlParserFindNodeInfoIndex
    xmlShellCmd
    xmlTextReaderErrorFunc
    xmlTextReaderNormalization
    xmlXPathAxisFunc
    indication
    xmlNanoFTPRead
    xmlNanoHTTPRead
    indicative
    xmlParserInputBufferGrow
    xmlParserInputBufferRead
    xmlParserInputGrow
    xmlParserInputRead
    indicator
    docbParseChunk
    htmlParseChunk
    xmlParseChunk
    indirect
    xmlParseAttribute
    indirectly
    xmlParseAttribute
    xmlParsePEReference
    xmlParserHandlePEReference
    infinite
    xmlExpExpDerive
    xmlExpNewRange
    xmlExpParse
    infinity
    xmlXPathCeilingFunction
    xmlXPathFloorFunction
    xmlXPathStringFunction
    info
    _xmlParserCtxt
    xmlCharEncodingOutputFunc
    xmlClearNodeInfoSeq
    xmlCopyDoc
    xmlInitNodeInfoSeq
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlMemStrdupLoc
    xmlMemoryStrdup
    xmlNanoFTPList
    xmlParserAddNodeInfo
    xmlParserFindNodeInfo
    xmlParserFindNodeInfoIndex
    xmlReallocLoc
    information
    LIBXML_VERSION_EXTRA
    _xmlError
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpDTD
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpEntities
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlNanoFTPUpdateURL
    xmlNanoHTTPFetch
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlNewTextReader
    xmlRelaxNGGetParserErrors
    xmlSchemaGetParserErrors
    xmlSchemaValidateSetFilename
    xmlSchemaValidateSetLocator
    xmlSchemaValidateStream
    xmlSchemaValidityLocatorFunc
    xmlTextReaderByteConsumed
    xmlXPathOrderDocElems
    informations
    _xmlAttr
    _xmlDoc
    _xmlNode
    _xmlParserCtxt
    endElementNsSAX2Func
    startElementNsSAX2Func
    xmlDebugDumpString
    xmlErrMemory
    xmlNanoFTPCleanup
    xmlNanoFTPInit
    xmlNanoFTPProxy
    xmlNanoFTPScanProxy
    xmlNanoHTTPInit
    xmlNanoHTTPScanProxy
    xmlParserPrintFileInfo
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRelaxNGGetValidErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxParserSetFlag
    xmlSAX2EndElementNs
    xmlSAX2StartElementNs
    xmlSchemaGetValidErrors
    xmlSchemaSetValidErrors
    xmlSchemaValidityLocatorFunc
    xmlShellDir
    xmlXIncludeProcessNode
    informative
    _xmlError
    infos
    _xmlParserCtxt
    inherited
    _xmlParserCtxt
    _xmlSchemaType
    xmlEntityReferenceFunc
    xmlNodeGetSpacePreserve
    xmlXPathNextAttribute
    inheriting
    xmlDictCreateSub
    inherits
    xmlNewChild
    xmlNewTextChild
    initial
    _xmlDoc
    _xmlSchemaAttribute
    xmlAutomataGetInitState
    xmlBufferCreateSize
    xmlInitNodeInfoSeq
    xmlMemRealloc
    xmlMemStrdupLoc
    xmlMemoryStrdup
    xmlReallocLoc
    xmlShell
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetAddUnique
    xmlXPathNodeSetCreate
    xmlXPathNodeSetDel
    xmlXPathNodeSetRemove
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetCreate
    xmlXPtrLocationSetDel
    xmlXPtrLocationSetRemove
    initialisation
    xmlInitGlobals
    initialization
    xmlInitializeCatalog
    xmlInitializeDict
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlSAXDefaultVersion
    initialize
    XML_COMPLETE_ATTRS
    XML_DETECT_IDS
    XML_SKIP_IDS
    htmlNewDocNoDtD
    htmlNewParserCtxt
    xmlCharEncodingOutputFunc
    xmlCreateEntitiesTable
    xmlCreateEnumeration
    xmlInitThreads
    xmlInitializeGlobalState
    xmlNanoFTPNewCtxt
    xmlNanoFTPScanProxy
    xmlNanoHTTPScanProxy
    xmlNewParserCtxt
    xmlXPathNewNodeSet
    xmlXPathNewNodeSetList
    xmlXPathNewValueTree
    xmlXPtrNewLocationSetNodeSet
    xmlXPtrNewLocationSetNodes
    initialized
    XML_SAX2_MAGIC
    initializes
    xmlDOMWrapNewCtxt
    initiate
    xmlCharEncOutFunc
    initiated
    xmlXPtrNewContext
    inline
    _htmlElemDesc
    inlined
    resolveEntity
    resolveEntitySAXFunc
    xmlSAX2ResolveEntity
    inputs
    _xmlParserCtxt
    insensitive
    xmlParseCharEncoding
    insert
    xmlValidGetValidElements
    inserted
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlAddSibling
    xmlReplaceNode
    xmlValidGetValidElements
    insertion
    htmlHandleOmittedElem
    xmlValidGetValidElements
    inspect
    xmlXPathDebugDumpObject
    instace
    xmlSchematronValidateDoc
    installed
    xmlDictSize
    xmlHashSize
    instances
    _xmlParserInput
    xmlParseDefaultDecl
    xmlRelaxNGParse
    xmlSchemaParse
    xmlSchematronParse
    instead
    XML_SCHEMAS_ELEM_TOPLEVEL
    xmlAddChild
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlBufShrink
    xmlCopyElementContent
    xmlDocSetRootElement
    xmlFreeElementContent
    xmlIsBaseChar
    xmlIsBlank
    xmlIsChar
    xmlIsCombining
    xmlIsDigit
    xmlIsExtender
    xmlIsIdeographic
    xmlIsPubidChar
    xmlKeepBlanksDefault
    xmlNodeDump
    xmlRegisterHTTPPostCallbacks
    xmlSaveDoc
    xmlSaveTree
    xmlSubstituteEntitiesDefault
    xmlXPtrEvalRangePredicate
    instruction
    HTML_PI_NODE
    processingInstruction
    processingInstructionSAXFunc
    xmlNewDocPI
    xmlNewPI
    xmlSAX2ProcessingInstruction
    insufficient
    xmlCanonicPath
    xmlPathToURI
    intact
    xmlParseURIRaw
    integer
    xmlGetThreadId
    xmlStrcasecmp
    xmlStrcmp
    xmlStrncasecmp
    xmlStrncmp
    xmlXPathCeilingFunction
    xmlXPathFloorFunction
    xmlXPathRoundFunction
    xmlXPathStringFunction
    intended
    _xmlDOMWrapCtxt
    xmlSchemaNewStringValue
    intensively
    xmlDOMWrapAdoptNode
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    interact
    xmlParseExternalID
    interface
    LIBXML_PATTERN_ENABLED
    LIBXML_READER_ENABLED
    LIBXML_SAX1_ENABLED
    LIBXML_WRITER_ENABLED
    _xmlParserCtxt
    docbParseDocument
    htmlParseDocument
    xmlParseDocument
    xmlParseReference
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    interfaces
    LIBXML_AUTOMATA_ENABLED
    LIBXML_EXPR_ENABLED
    LIBXML_MODULES_ENABLED
    LIBXML_PUSH_ENABLED
    LIBXML_REGEXP_ENABLED
    LIBXML_SCHEMAS_ENABLED
    LIBXML_SCHEMATRON_ENABLED
    LIBXML_UNICODE_ENABLED
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    intern
    xmlTextReaderConstString
    internally
    xmlBufferWriteQuotedString
    xmlExpNewCtxt
    xmlRelaxNGNewDocParserCtxt
    xmlRemoveID
    xmlRemoveRef
    xmlSchemaValidateFile
    xmlXPathContextSetCache
    interned
    xmlPatterncompile
    xmlTextReaderConstString
    interning
    xmlCopyNodeList
    xmlNewPI
    interoperability
    xmlParseElementChildrenContentDecl
    interoperable
    xmlCheckLanguageID
    interprestation
    xmlXPathFunction
    interpreter
    xmlXPathAxisFunc
    intersection
    xmlXPathIntersection
    introduced
    LIBXML2_NEW_BUFFER
    ints
    xmlGetLineNo
    invalid
    XML_SCHEMAS_TYPE_INTERNAL_INVALID
    xmlParseSDDecl
    xmlReconciliateNs
    xmlValidateDtdFinal
    invited
    xmlValidGetValidElements
    isinf
    xmlXPathIsInf
    isn
    xmlRegisterCharEncodingHandler
    isnan
    xmlXPathIsNaN
    issue
    xmlEncodeEntities
    issued
    xlinkIsLink
    issues
    xmlModuleOpen
    xmlModuleSymbol
    item
    XML_SCHEMAS_TYPE_BLOCK_DEFAULT
    XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE
    XML_SCHEMAS_TYPE_MARKED
    _xmlXPathContext
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlNanoFTPDele
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlXPathNodeSetItem
    items
    valuePush
    xmlHashCopy
    xmlHashFree
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlSchemaValidateListSimpleTypeFacet
    itself
    _xmlDoc
    xlinkIsLink
    xmlCharEncFirstLine
    xmlCleanupParser
    xmlParsePEReference
    xmlParserHandlePEReference
    xmlXPathNextSelf

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xmllint.html0000644000175000017500000003617711234335462015717 0ustar aronaronxmllint

    Name

    xmllint — command line XML tool

    Synopsis

    xmllint [[--version] | [--debug] | [--shell] | [--debugent] | [--copy] | [--recover] | [--noent] | [--noout] | [--nonet] | [--htmlout] | [--nowrap] | [--valid] | [--postvalid] | [--dtdvalid URL] | [--dtdvalidfpi FPI] | [--timing] | [--output file] | [--repeat] | [--insert] | [--compress] | [--html] | [--xmlout] | [--push] | [--memory] | [--maxmem nbbytes] | [--nowarning] | [--noblanks] | [--nocdata] | [--format] | [--encode encoding] | [--dropdtd] | [--nsclean] | [--testIO] | [--catalogs] | [--nocatalogs] | [--auto] | [--xinclude] | [--noxincludenode] | [--loaddtd] | [--dtdattr] | [--stream] | [--walker] | [--pattern patternvalue] | [--chkregister] | [--relaxng] | [--schema] | [--c14n]] [xmlfile]

    Introduction

    The xmllint program parses one or more XML files, specified on the command line as xmlfile. It prints various types of output, depending upon the options selected. It is useful for detecting errors both in XML code and in the XML parser itself.

    It is included in libxml2.

    Options

    --version
    Display the version of libxml2 used.
    --debug
    Parse a file and output an annotated tree of the in-memory version of the document.
    --shell
    Run a navigating shell. Details on available commands in shell mode are below.
    --debugent
    Debug the entities defined in the document.
    --copy
    Test the internal copy implementation.
    --recover
    Output any parsable portions of an invalid document.
    --noent
    Substitute entity values for entity references. By default, xmllint leaves entity references in place.
    --nocdata
    Substitute CDATA section by equivalent text nodes.
    --nsclean
    Remove redundant namespace declarations.
    --noout
    Suppress output. By default, xmllint outputs the result tree.
    --htmlout
    Output results as an HTML file. This causes xmllint to output the necessary HTML tags surrounding the result tree output so the results can be displayed in a browser.
    --nowrap
    Do not output HTML doc wrapper.
    --valid
    Determine if the document is a valid instance of the included Document Type Definition (DTD). A DTD to be validated against also can be specified at the command line using the --dtdvalid option. By default, xmllint also checks to determine if the document is well-formed.
    --postvalid
    Validate after parsing is completed.
    --dtdvalid URL
    Use the DTD specified by URL for validation.
    --dtdvalidfpi FPI
    Use the DTD specified by the Public Identifier FPI for validation, note that this will require a Catalog exporting that Public Identifier to work.
    --timing
    Output information about the time it takes xmllint to perform the various steps.
    --output file
    Define a file path where xmllint will save the result of parsing. Usually the programs build a tree and save it on stdout, with this option the result XML instance will be saved onto a file.
    --repeat
    Repeat 100 times, for timing or profiling.
    --insert
    Test for valid insertions.
    --compress
    Turn on gzip compression of output.
    --html
    Use the HTML parser.
    --xmlout
    Used in conjunction with --html. Usually when HTML is parsed the document is saved with the HTML serializer, but with this option the resulting document is saved with the XML serializer. This is primarily used to generate XHTML from HTML input.
    --push
    Use the push mode of the parser.
    --memory
    Parse from memory.
    --maxmem nnbytes
    Test the parser memory support. nnbytes is the maximum number of bytes the library is allowed to allocate. This can also be used to make sure batch processing of XML files will not exhaust the virtual memory of the server running them.
    --nowarning
    Do not emit warnings from the parser and/or validator.
    --noblanks
    Drop ignorable blank spaces.
    --format
    Reformat and reindent the output. The $XMLLINT_INDENT environment variable controls the indentation (default value is two spaces " ").
    --testIO
    Test user input/output support.
    --encode encoding
    Output in the given encoding.
    --catalogs
    Use the catalogs from $SGML_CATALOG_FILES. Otherwise /etc/xml/catalog is used by default.
    --nocatalogs
    Do not use any catalogs.
    --auto
    Generate a small document for testing purposes.
    --xinclude
    Do XInclude processing.
    --noxincludenode
    Do XInclude processing but do not generate XInclude start and end nodes.
    --loaddtd
    Fetch external DTD.
    --dtdattr
    Fetch external DTD and populate the tree with inherited attributes.
    --dropdtd
    Remove DTD from output.
    --stream
    Use streaming API - useful when used in combination with --relaxng or --valid options for validation of files that are too large to be held in memory.
    --walker
    Test the walker module, which is a reader interface but for a document tree, instead of using the reader API on an unparsed document it works on a existing in-memory tree. Used in debugging.
    --chkregister
    Turn on node registration. Useful for developers testing libxml2 node tracking code.
    --pattern patternvalue
    Used to exercise the pattern recognition engine, which can be used with the reader interface to the parser. It allows to select some nodes in the document based on an XPath (subset) expression. Used for debugging.
    --relaxng schema
    Use RelaxNG file named schema for validation.
    --schema schema
    Use a W3C XML Schema file named schema for validation.
    --c14n
    Use the W3C XML Canonicalisation (C14N) to serialize the result of parsing to stdout. It keeps comments in the result.

    Shell

    xmllint offers an interactive shell mode invoked with the --shell command. Available commands in shell mode include:

    base
    display XML base of the node
    bye
    leave shell
    cat node
    Display node if given or current node.
    cd path
    Change the current node to path (if given and unique) or root if no argument given.
    dir path
    Dumps information about the node (namespace, attributes, content).
    du path
    Show the structure of the subtree under path or the current node.
    exit
    Leave the shell.
    help
    Show this help.
    free
    Display memory usage.
    load name
    Load a new document with the given name.
    ls path
    List contents of path (if given) or the current directory.
    pwd
    Display the path to the current node.
    quit
    Leave the shell.
    save name
    Saves the current document to name if given or to the original name.
    validate
    Check the document for error.
    write name
    Write the current node to the given filename.

    Catalogs

    Catalog behavior can be changed by redirecting queries to the user's own set of catalogs. This can be done by setting the XML_CATALOG_FILES environment variable to a list of catalogs. An empty one should deactivate loading the default /etc/xml/catalog default catalog.

    Debugging Catalogs

    Setting the environment variable XML_DEBUG_CATALOG using the command "export XML_DEBUG_CATALOG=" outputs debugging information related to catalog operations.

    Error Return Codes

    On the completion of execution, Xmllint returns the following error codes:

    0
    No error
    1
    Unclassified
    2
    Error in DTD
    3
    Validation error
    4
    Validation error
    5
    Error in schema compilation
    6
    Error writing output
    7
    Error in pattern (generated when [--pattern] option is used)
    8
    Error in Reader registration (generated when [--chkregister] option is used)
    9
    Out of memory error
    libxml2-2.9.1+dfsg1/doc/libxml2-api.xml0000644000175000017500000504550112134171036016173 0ustar aronaron old DocBook SGML parser interface for a DocBook SGML non-verifying parser This code is DEPRECATED, and should not be used anymore. Daniel Veillard interface for an HTML 4.0 non-verifying parser this module implements an HTML 4.0 non-verifying parser with API compatible with the XML parser ones. It should be able to parse "real world" HTML, even if severely broken from a specification point of view. Daniel Veillard specific APIs to process HTML tree, especially serialization this module implements a few function needed to process tree in an HTML specific way. Daniel Veillard Old SAX version 1 handler, deprecated DEPRECATED set of SAX version 1 interfaces used to build the DOM tree. Daniel Veillard SAX2 parser interface used to build the DOM tree those are the default SAX2 interfaces used by the library when building DOM tree. Daniel Veillard Provide Canonical XML and Exclusive XML Canonicalization the c14n modules provides a "Canonical XML" implementation Aleksey Sanin <aleksey@aleksey.com> interfaces to the Catalog handling system the catalog module implements the support for XML Catalogs and SGML catalogs Daniel Veillard Unicode character range checking this module exports interfaces for the character range validation APIs This file is automatically generated from the cvs source definition files using the genChRanges.py Python script William Brack <wbrack@mmm.com.hk> Tree debugging APIs Interfaces to a set of routines used for debugging the tree produced by the XML parser. Daniel Veillard string dictionnary dictionary of reusable strings, just used to avoid allocation and freeing operations. Daniel Veillard interface for the encoding conversion functions interface for the encoding conversion functions needed for XML basic encoding and iconv() support. Related specs are rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies [ISO-10646] UTF-8 and UTF-16 in Annexes [ISO-8859-1] ISO Latin-1 characters codes. [UNICODE] The Unicode Consortium, "The Unicode Standard -- Worldwide Character Encoding -- Version 1.0", Addison- Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is described in Unicode Technical Report #4. [US-ASCII] Coded Character Set--7-bit American Standard Code for Information Interchange, ANSI X3.4-1986. Daniel Veillard interface for the XML entities handling this module provides some of the entity API needed for the parser and applications. Daniel Veillard interface for all global variables of the library all the global variables and thread handling for those variables is handled by this module. The bottom of this file is automatically generated by build_glob.py based on the description file global.data Gary Pennington <Gary.Pennington@uk.sun.com>, Daniel Veillard Chained hash tables This module implements the hash table support used in various places in the library. Bjorn Reese <bjorn.reese@systematic.dk> lists interfaces this module implement the list support used in various place in the library. Gary Pennington <Gary.Pennington@uk.sun.com> minimal FTP implementation minimal FTP implementation allowing to fetch resources like external subset. Daniel Veillard minimal HTTP implementation minimal HTTP implementation allowing to fetch resources like external subset. Daniel Veillard the core parser module Interfaces, constants and types related to the XML parser Daniel Veillard internals routines and limits exported by the parser. this module exports a number of internal parsing routines they are not really all intended for applications but can prove useful doing low level processing. Daniel Veillard pattern expression handling allows to compile and test pattern expressions for nodes either in a tree or based on a parser state. Daniel Veillard implementation of the Relax-NG validation implementation of the Relax-NG validation Daniel Veillard internal interfaces for XML Schemas internal interfaces for the XML Schemas handling and schema validity checking The Schemas development is a Work In Progress. Some of those interfaces are not garanteed to be API or ABI stable ! Daniel Veillard XML Schemastron implementation interface to the XML Schematron validity checking. Daniel Veillard interfaces for thread handling set of generic threading related routines should work with pthreads, Windows native or TLS threads Daniel Veillard interfaces for tree manipulation this module describes the structures found in an tree resulting from an XML or HTML parsing, as well as the API provided for various processing on that tree Daniel Veillard library of generic URI related routines library of generic URI related routines Implements RFC 2396 Daniel Veillard The DTD validation API for the DTD handling and the validity checking Daniel Veillard implementation of XInclude API to handle XInclude processing, implements the World Wide Web Consortium Last Call Working Draft 10 November 2003 Daniel Veillard unfinished XLink detection module unfinished XLink detection module Daniel Veillard interface for the I/O interfaces used by the parser interface for the I/O interfaces used by the parser Daniel Veillard API to build regexp automata the API to build regexp automata Daniel Veillard error handling the API used to report errors Daniel Veillard macros for marking symbols as exportable/importable. macros for marking symbols as exportable/importable. Igor Zlatovic <igor@zlatkovic.com> interface for the memory allocator provides interfaces for the memory allocator, including debugging capabilities. Daniel Veillard dynamic module loading basic API for dynamic module loading, used by libexslt added in 2.6.17 Joel W. Reed the XMLReader implementation API of the XML streaming API based on C# interfaces. Daniel Veillard regular expressions handling basic API for libxml regular expressions handling used for XML Schemas and validation. Daniel Veillard the XML document serializer API to save document or subtree of document Daniel Veillard incomplete XML Schemas structure implementation interface to the XML Schemas handling and schema validity checking, it is incomplete right now. Daniel Veillard implementation of XML Schema Datatypes module providing the XML Schema Datatypes implementation both definition and validity checking Daniel Veillard set of routines to process strings type and interfaces needed for the internal string handling of the library, especially UTF8 processing. Daniel Veillard Unicode character APIs API for the Unicode character APIs This file is automatically generated from the UCS description files of the Unicode Character Database Daniel Veillard compile-time version informations compile-time version informations for the XML library Daniel Veillard text writing API for XML text writing API for XML Alfred Mickautsch <alfred@mickautsch.de> XML Path Language implementation API for the XML Path Language implementation XML Path Language implementation XPath is a language for addressing parts of an XML document, designed to be used by both XSLT and XPointer Daniel Veillard internal interfaces for XML Path Language implementation internal interfaces for XML Path Language implementation used to build new modules on top of XPath like XPointer and XSLT Daniel Veillard API to handle XML Pointers API to handle XML Pointers Base implementation was made accordingly to W3C Candidate Recommendation 7 June 2000 Daniel Veillard Macro used to signal to GCC unused function parameters Macro to cast a string to an xmlChar * when one know its safe. default buffer size 4000. Macro to try to cast the value on the top of the XPath stack to a boolean. Macro to try to cast the value on the top of the XPath stack to a number. Macro to try to cast the value on the top of the XPath stack to a string. Macro to check that the number of args passed to an XPath function matches. Macro to return from the function if an XPath error was detected. Macro to return 0 from the function if an XPath error was detected. Macro to check that the value on top of the XPath stack is of a given type. Macro to check that the value on top of the XPath stack is of a given type. Return(0) in case of failure DEBUG_MEMORY replaces the allocator with a collect and debug shell to the libc allocator. DEBUG_MEMORY should only be activated when debugging libxml i.e. if libxml has been configured with --with-debug-mem too. #define DEBUG_MEMORY_FREED #define DEBUG_MEMORY_LOCATION Whether the memory debugging is configured in Macro. A comment in a HTML document is really implemented the same way as a comment in an XML document. Macro. An entity reference in a HTML document is really implemented the same way as an entity reference in an XML document. Macro. A processing instruction in a HTML document is really implemented the same way as a processing instruction in an XML document. Macro. A preserved node in a HTML document is really implemented the same way as a CDATA section in an XML document. Macro. A text node in a HTML document is really implemented the same way as a text node in an XML document. The parser tries to always have that amount of input ready. One of the point is providing context when reporting errors. macro used to provide portability of code to windows sockets the value to be used when the socket is not valid Macro to check [0-9] Macro to check [a-zA-Z] Macro to check the following production in the XML spec: [85] BaseChar ::= ... long list see REC ... Macro to check the following production in the XML spec: [3] S ::= (#x20 | #x9 | #xD | #xA)+ Behaviour same as IS_BLANK Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20...] any byte character in the accepted range Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. Behaves like IS_CHAR on single-byte value Macro to check the following production in the XML spec: [87] CombiningChar ::= ... long list see REC ... Always false (all combining chars > 0xff) Macro to check the following production in the XML spec: [88] Digit ::= ... long list see REC ... Behaves like IS_DIGIT but with a single byte argument Macro to check the following production in the XML spec: [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE] Behaves like IS_EXTENDER but with a single-byte argument Macro to check the following production in the XML spec: [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029] Macro to check the following production in the XML spec: [84] Letter ::= BaseChar | Ideographic Macro behaves like IS_LETTER, but only check base chars Macro to check the following production in the XML spec: [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] Same as IS_PUBIDCHAR but for single-byte value Macro used to express that the API use the new buffers for xmlParserInputBuffer and xmlOutputBuffer. The change was introduced in 2.9.0. Macro used to indicate to GCC this is an allocator function Macro used to indicate to GCC the parameter are printf like Whether the automata interfaces are compiled in Whether the Canonicalization support is configured in Whether the Catalog support is configured in Whether Debugging module is configured in Whether the runtime debugging is configured in Whether the SGML Docbook support is configured in the version string like "1.2.3" Whether the formal expressions interfaces are compiled in Whether the FTP support is configured in Whether the HTML support is configured in Whether the HTTP support is configured in Whether iconv support is available Whether icu support is available Whether ISO-8859-* support is made available in case iconv is not Whether the deprecated APIs are compiled in for compatibility Whether the Lzma support is compiled in Whether the module interfaces are compiled in the string suffix used by dynamic modules (usually shared libraries) Whether the serialization/saving support is configured in Whether the xmlPattern node selection interface is configured in Whether the push parsing interfaces are configured in Whether the xmlReader parsing interface is configured in Whether the regular expressions interfaces are compiled in Whether the older SAX1 interface is configured in Whether the Schemas validation interfaces are compiled in Whether the Schematron validation interfaces are compiled in Macro to check that the libxml version in use is compatible with the version the software has been compiled against Whether the allocation hooks are per-thread Whether the thread support is configured in Whether the DOM like tree manipulation API support is configured in Whether the Unicode related interfaces are compiled in Whether the DTD validation support is configured in the version number: 1.2.3 value is 10203 extra version information, used to show a CVS compilation the version number string, 1.2.3 value is "10203" Whether the xmlWriter saving interface is configured in Whether XInclude is configured in Whether XPath is configured in Whether XPointer is configured in Whether the Zlib support is compiled in Skips to the next '>' char. Skips to the next '<' char. Skips the end of line chars. macro used to provide portability of code to windows sockets defined if the trio support should not be configured in defined if the trio support need to be configured in Macro defining "fallback" Macro defining "href" Macro defining "include" Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude Macro defining "parse" Macro defining "encoding" Macro defining "text" Macro defining "xml" Macro defining "xpointer" Macro to do a casting from an object pointer to a function pointer without encountering a warning from gcc #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) This macro violated ISO C aliasing rules (gcc4 on s390 broke) so it is disabled now The namespace for the XML Catalogs elements. The specific XML Catalog Processing Instuction name. Bit in the loadsubset context field to tell to do complete the elements attributes lists with the ones defaulted from the DTDs. Use it to initialize xmlLoadExtDtdDefaultValue. Special value for finishDtd field when embedded in an xmlParserCtxt Special value for finishDtd field when embedded in an xmlParserCtxt The default version of XML used: 1.0 Bit in the loadsubset context field to tell to do ID/REFs lookups. Use it to initialize xmlLoadExtDtdDefaultValue. Macro to extract the content pointer of a node. Macro to extract the line number of an element node. A namespace declaration node. Maximum size allowed by the parser for a dictionary by default This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Introduced in 2.9.0 Maximum size allowed by the parser for ahead lookup This is an upper boundary enforced by the parser to avoid bad behaviour on "unfriendly' content Introduced in 2.9.0 Identifiers can be longer, but this will be more costly at runtime. Maximum size allowed for a markup identitier This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Note that with the use of parsing dictionaries overriding the limit may result in more runtime memory usage in face of "unfriendly' content Introduced in 2.9.0 Maximum size allowed for a single text node when building a tree. This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Introduced in 2.9.0 Special constant found in SAX2 blocks initialized fields Ignore validation non definition on attributes Obsolete, not used anymore. Skip unknown attribute from validation Obsolete, not used anymore. Apply strict validation rules on attributes Obsolete, not used anymore. Used by wildcards. Validate if type found, don't worry if not found Skip unknown attribute from validation Used by wildcards. Apply strict validation rules The attribute wildcard has been already builded. Whether this attr. group contains attr. group references. Marks the attr group as marked; used for circular checks. The attr group was redefined. The attribute wildcard has been already builded. the attribute has a fixed value allow elements in no namespace this is set when the "type" and "ref" references have been resolved. allow elements in no namespace The attribute is optional. Used by wildcards. The attribute is prohibited. The attribute is required. the schema has "extension" in the set of blockDefault. the schema has "restriction" in the set of blockDefault. the schema has "substitution" in the set of blockDefault. the element is abstract the "block" attribute is absent disallowed substitutions are absent disallowed substitutions: "restriction" disallowed substitutions: "substituion" a helper flag for the search of circular references. the element has a default value substitution group exclusions are absent substitution group exclusions: "extension" substitution group exclusions: "restriction" the element has a fixed value the element is global this is set when the elem decl has been checked against all constraints this is set when "type", "ref", "substitutionGroup" references have been resolved. the element is nillable allow elements in no namespace Obsolete, not used anymore. the element is a reference to a type the declaration is a substitution group head the element is top level obsolete: use XML_SCHEMAS_ELEM_GLOBAL instead collapse the types of the facet preserve the type of the facet replace the type of the facet unknown facet handling the schema has "extension" in the set of finalDefault. the cshema has "list" in the set of finalDefault. the schema has "restriction" in the set of finalDefault. the schema has "union" in the set of finalDefault. the schema is currently including an other schema with no target namespace. Reflects attributeFormDefault == qualified in an XML schema document. Reflects elementFormDefault == qualified in an XML schema document. the simple/complexType is abstract. the complexType did not specify 'block' so use the default of the <schema> item. the complexType has a 'block' of "extension". the complexType has a 'block' of "restriction". Marks the item as a builtin primitive. the simple or complex type has a derivation method of "extension". the simple or complex type has a derivation method of "restriction". indicates if the facets need a computed value the simpleType has a final of "default". the complexType has a final of "extension". the simpleType has a final of "list". the simpleType/complexType has a final of "restriction". the simpleType has a final of "union". First stage of fixup was done. the type is global has facets indicates that the type is invalid indicates that the type was typefixed Marks the item as marked; used for circular checks. the element content type is mixed indicates if the facets (pattern) need a normalized value the complexType owns an attribute wildcard, i.e. it can be freed by the complexType The type was redefined. the simpleType has a variety of "absent". TODO: Actually not necessary :-/, since if none of the variety flags occur then it's automatically absent. the simpleType has a variety of "union". the simpleType has a variety of "list". the simpleType has a variety of "union". a whitespace-facet value of "collapse" a whitespace-facet value of "preserve" a whitespace-facet value of "replace" If the wildcard is complete. Bit in the loadsubset context field to tell to not do ID/REFs registration. Used to initialize xmlLoadExtDtdDefaultValue in some special cases. Both general and parameter entities need to be substituted. If no entities need to be substituted. Whether parameter entities need to be substituted. Whether general entities need to be substituted. This is the name for the special xml:id attribute This is the namespace for the special xml: prefix predefined in the XML Namespace specification. check namespaces at compilation forbid variables in expression Macro to raise an XPath error and return. Macro to raise an XPath error and return 0. Returns the default subelement for this element Checks whether an HTML element description may be a direct child of the specified element. Returns 1 if allowed; 0 otherwise. Returns the attributes required for the specified element. Macro for compatibility naming layer with libxml1. Maps to "children." Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Automatically generated by genChRanges.py Macro for compatibility naming layer with libxml1. Maps to "children". this macro maps to xmlTextWriterWriteDTD This macro maps to xmlTextWriterWritePI Check if an XPath error was raised. Returns true if an error has been raised, false otherwise. Empties a node-set. Get the context node of an XPath context. Returns the context node. Get the document of an XPath context. Returns the context document. Get the error code of an XPath context. Returns the context error. Implement a functionality similar to the DOM NodeList.length. Returns the number of nodes in the node-set. Checks whether @ns is empty or not. Returns %TRUE if @ns is an empty node-set. Implements a functionality similar to the DOM NodeList.item(). Returns the xmlNodePtr at the given @index in @ns or NULL if @index is out of range (0 to length-1) Pushes the boolean @val on the context stack. Pushes an empty node-set on the context stack. Pushes an empty string on the stack. Pushes user data on the context stack. Pushes false on the context stack. Pushes the node-set @ns on the context stack. Pushes the double @val on the context stack. Pushes the string @str on the context stack. Pushes true on the context stack. Raises an XPATH_INVALID_ARITY error. Raises an error. Raises an XPATH_INVALID_TYPE error. Checks if the current value on the XPath stack is an external object. Returns true if the current object on the stack is an external object. Check if the current value on the XPath stack is a node set or an XSLT value tree. Returns true if the current object on the stack is a node-set. A libxml automata description, It can be compiled into a regexp A state int the automata description, A pointer to a buffer structure, the actual structure internals are not public This is a basic byte in an UTF-8 encoded string. It's unsigned allowing to pinpoint case where char * are assigned to xmlChar * (possibly making serialization back impossible). A handle to a dynamically loaded module A libxml progressive regular expression evaluation context A libxml regular expression, they can actually be far more complex thank the POSIX regex expressions. Pointer to an xmlReader context. defined(LIBXML_HTML_ENABLED) Take a block of UTF-8 chars in and try to convert it to an ASCII plus HTML entities block of chars out. defined(LIBXML_OUTPUT_ENABLED) Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1 block of chars out. defined(LIBXML_LEGACY_ENABLED) Handle an attribute that has been read by the parser. The default handling is to convert the attribute into an DOM subtree and past it in a new xmlAttr element added to the element. DEPRECATED: use xmlSAX2Attribute() defined(LIBXML_LEGACY_ENABLED) An attribute definition has been parsed DEPRECATED: use xmlSAX2AttributeDecl() An attribute definition has been parsed. Handle an attribute that has been read by the parser. The default handling is to convert the attribute into an DOM subtree and past it in a new xmlAttr element added to the element. defined(LIBXML_LEGACY_ENABLED) called when a pcdata block has been parsed DEPRECATED: use xmlSAX2CDataBlock() Called when a pcdata block has been parsed. defined(LIBXML_LEGACY_ENABLED) receiving some chars from the parser. DEPRECATED: use xmlSAX2Characters() Receiving some chars from the parser. defined(LIBXML_LEGACY_ENABLED) Check that the current element namespace is the same as the one read upon parsing. DEPRECATED defined(LIBXML_LEGACY_ENABLED) A comment has been parsed. DEPRECATED: use xmlSAX2Comment() A comment has been parsed. defined(LIBXML_DOCB_ENABLED) Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. defined(LIBXML_DOCB_ENABLED) Create a parser context for using the DocBook SGML parser in push mode To allow content encoding detection, @size should be >= 4 The value of @filename is used for fetching external entities and error/warning reports. defined(LIBXML_DOCB_ENABLED) Initialize the default SAX handler defined(LIBXML_DOCB_ENABLED) Take a block of UTF-8 chars in and try to convert it to an ASCII plus SGML entities block of chars out. defined(LIBXML_DOCB_ENABLED) Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed. defined(LIBXML_DOCB_ENABLED) Parse a Chunk of memory defined(LIBXML_DOCB_ENABLED) parse an SGML in-memory document and build a tree. defined(LIBXML_DOCB_ENABLED) parse an SGML document (and build a tree if using the standard SAX interface). defined(LIBXML_DOCB_ENABLED) parse a Docbook SGML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. defined(LIBXML_DOCB_ENABLED) parse an SGML in-memory document and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. defined(LIBXML_DOCB_ENABLED) parse an SGML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. defined(LIBXML_LEGACY_ENABLED) An element definition has been parsed DEPRECATED: use xmlSAX2ElementDecl() An element definition has been parsed. defined(LIBXML_LEGACY_ENABLED) called when the document end has been detected. DEPRECATED: use xmlSAX2EndDocument() Called when the document end has been detected. defined(LIBXML_LEGACY_ENABLED) called when the end of an element has been detected. DEPRECATED: use xmlSAX2EndElement() SAX2 callback when an element end has been detected by the parser. It provides the namespace informations for the element. Called when the end of an element has been detected. defined(LIBXML_LEGACY_ENABLED) An entity definition has been parsed DEPRECATED: use xmlSAX2EntityDecl() An entity definition has been parsed. Display and format an error messages, callback. defined(LIBXML_LEGACY_ENABLED) Callback on external subset declaration. DEPRECATED: use xmlSAX2ExternalSubset() Callback on external subset declaration. Display and format fatal error messages, callback. Note: so far fatalError() SAX callbacks are not used, error() get all the callbacks for errors. defined(LIBXML_FTP_ENABLED) A callback for the xmlNanoFTPGet command. defined(LIBXML_FTP_ENABLED) A callback for the xmlNanoFTPList command. Note that only one of year and day:minute are specified. defined(LIBXML_LEGACY_ENABLED) Provide the column number of the current parsing point. DEPRECATED: use xmlSAX2GetColumnNumber() defined(LIBXML_LEGACY_ENABLED) Get an entity by name DEPRECATED: use xmlSAX2GetEntity() Get an entity by name. defined(LIBXML_LEGACY_ENABLED) Provide the line number of the current parsing point. DEPRECATED: use xmlSAX2GetLineNumber() defined(LIBXML_LEGACY_ENABLED) Get the current element namespace. DEPRECATED defined(LIBXML_LEGACY_ENABLED) Get a parameter entity by name DEPRECATED: use xmlSAX2GetParameterEntity() Get a parameter entity by name. defined(LIBXML_LEGACY_ENABLED) Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" DEPRECATED: use xmlSAX2GetPublicId() defined(LIBXML_LEGACY_ENABLED) Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd DEPRECATED: use xmlSAX2GetSystemId() defined(LIBXML_LEGACY_ENABLED) An old global namespace has been parsed. DEPRECATED defined(LIBXML_LEGACY_ENABLED) Does this document has an external subset DEPRECATED: use xmlSAX2HasExternalSubset() Does this document has an external subset? defined(LIBXML_LEGACY_ENABLED) Does this document has an internal subset DEPRECATED: use xmlSAX2HasInternalSubset() Does this document has an internal subset. defined(LIBXML_HTML_ENABLED) Checks whether an attribute is valid for an element Has full knowledge of Required and Deprecated attributes defined(LIBXML_HTML_ENABLED) The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if the element or one of it's children would autoclose the given tag. defined(LIBXML_HTML_ENABLED) Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. defined(LIBXML_HTML_ENABLED) Create a parser context for an HTML in-memory document. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) Create a parser context for using the HTML parser in push mode The value of @filename is used for fetching external entities and error/warning reports. defined(LIBXML_HTML_ENABLED) parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context defined(LIBXML_HTML_ENABLED) parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context defined(LIBXML_HTML_ENABLED) parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context defined(LIBXML_HTML_ENABLED) parse an HTML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context defined(LIBXML_HTML_ENABLED) parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context defined(LIBXML_HTML_ENABLED) Reset a parser context defined(LIBXML_HTML_ENABLED) Applies the options to the parser context defined(LIBXML_HTML_ENABLED) Initialize the default SAX handler defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document. Formating return/spaces are added. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document to an open FILE. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document in memory and return the xmlChar * and it's size. It's up to the caller to free the memory. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document in memory and return the xmlChar * and it's size. It's up to the caller to free the memory. defined(LIBXML_HTML_ENABLED) Checks whether an HTML element may be a direct child of a parent element. Note - doesn't check for deprecated elements defined(LIBXML_HTML_ENABLED) Checks whether an HTML element may be a direct child of a parent element. and if so whether it is valid or deprecated. defined(LIBXML_HTML_ENABLED) Take a block of UTF-8 chars in and try to convert it to an ASCII plus HTML entities block of chars out. defined(LIBXML_HTML_ENABLED) Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed. defined(LIBXML_HTML_ENABLED) Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed. defined(LIBXML_HTML_ENABLED) Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed. defined(LIBXML_HTML_ENABLED) Encoding definition lookup in the Meta tags defined(LIBXML_HTML_ENABLED) Set and return the previous value for handling HTML omitted tags. defined(LIBXML_HTML_ENABLED) Initialize the htmlStartCloseIndex for fast lookup of closing tags names. This is not reentrant. Call xmlInitParser() once before processing in case of use in multithreaded programs. defined(LIBXML_HTML_ENABLED) The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if a tag is autoclosed by one of it's child defined(LIBXML_HTML_ENABLED) Determine if a given attribute is a boolean attribute. defined(LIBXML_HTML_ENABLED) Check if an attribute is of content type Script defined(LIBXML_HTML_ENABLED) Creates a new HTML document defined(LIBXML_HTML_ENABLED) Creates a new HTML document without a DTD node if @URI and @ExternalID are NULL defined(LIBXML_HTML_ENABLED) Allocate and initialize a new parser context. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML node, recursive behaviour,children are printed too. TODO: if encoding == NULL try to save in the doc encoding defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML node, recursive behaviour,children are printed too. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML node, recursive behaviour,children are printed too, and formatting returns/spaces are added. defined(LIBXML_HTML_ENABLED) Checks whether the tree node is valid. Experimental (the author only uses the HTML enhancements in a SAX parser) defined(LIBXML_HTML_ENABLED) parse Reference declarations [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) Parse a Chunk of memory defined(LIBXML_HTML_ENABLED) parse an HTML in-memory document and build a tree. defined(LIBXML_HTML_ENABLED) parse an HTML document (and build a tree if using the standard SAX interface). defined(LIBXML_HTML_ENABLED) parse an HTML element, this is highly recursive this is kept for compatibility with previous code versions [39] element ::= EmptyElemTag | STag content ETag [41] Attribute ::= Name Eq AttValue defined(LIBXML_HTML_ENABLED) parse an HTML ENTITY references [68] EntityRef ::= '&' Name ';' defined(LIBXML_HTML_ENABLED) parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. defined(LIBXML_HTML_ENABLED) parse an XML in-memory document and build a tree. defined(LIBXML_HTML_ENABLED) parse an XML from a file descriptor and build a tree. defined(LIBXML_HTML_ENABLED) parse an XML file from the filesystem or the network. defined(LIBXML_HTML_ENABLED) parse an HTML document from I/O functions and source and build a tree. defined(LIBXML_HTML_ENABLED) parse an XML in-memory document and build a tree. defined(LIBXML_HTML_ENABLED) Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks to handle parse events. If sax is NULL, fallback to the default DOM behavior and return a tree. defined(LIBXML_HTML_ENABLED) parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document to a file. If @filename is "-" the stdout file is used. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document to a file using a given encoding and formatting returns/spaces are added. defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump an HTML document to a file using a given encoding. defined(LIBXML_HTML_ENABLED) Sets the current encoding in the Meta tags NOTE: this will not change the document content encoding, just the META flag associated. defined(LIBXML_HTML_ENABLED) Lookup the HTML tag in the ElementTable defined(LIBXML_LEGACY_ENABLED) receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use characters DEPRECATED: use xmlSAX2IgnorableWhitespace() Receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use characters. Set or reset (if NULL) the default handler for generic errors to the builtin error function. defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) && defined(LIBXML_DOCB_ENABLED) Initialize the default DocBook SAX version 1 handler DEPRECATED: use xmlSAX2InitDocbDefaultSAXHandler() for the new SAX2 blocks defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) && defined(LIBXML_HTML_ENABLED) Initialize the default HTML SAX version 1 handler DEPRECATED: use xmlSAX2InitHtmlDefaultSAXHandler() for the new SAX2 blocks defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) Initialize the default XML SAX version 1 handler DEPRECATED: use xmlSAX2InitDefaultSAXHandler() for the new SAX2 blocks Pops the top parser input from the input stack Pushes a new parser input on top of the input stack defined(LIBXML_LEGACY_ENABLED) Callback on internal subset declaration. DEPRECATED: use xmlSAX2InternalSubset() Callback on internal subset declaration. defined(LIBXML_LEGACY_ENABLED) Is this document tagged standalone ? DEPRECATED: use xmlSAX2IsStandalone() Is this document tagged standalone? Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8 block of chars out. Pops the top element name from the name stack Pushes a new element name on top of the name stack defined(LIBXML_LEGACY_ENABLED) A namespace has been parsed. DEPRECATED Pops the top element node from the node stack Pushes a new element node on top of the node stack defined(LIBXML_LEGACY_ENABLED) What to do when a notation declaration has been parsed. DEPRECATED: use xmlSAX2NotationDecl() What to do when a notation declaration has been parsed. defined(LIBXML_LEGACY_ENABLED) A processing instruction has been parsed. DEPRECATED: use xmlSAX2ProcessingInstruction() A processing instruction has been parsed. defined(LIBXML_LEGACY_ENABLED) called when an entity reference is detected. DEPRECATED: use xmlSAX2Reference() Called when an entity reference is detected. defined(LIBXML_LEGACY_ENABLED) The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine DEPRECATED: use xmlSAX2ResolveEntity() Callback: The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine defined(LIBXML_LEGACY_ENABLED) Receive the document locator at startup, actually xmlDefaultSAXLocator Everything is available on the context, so this is useless in our case. DEPRECATED Receive the document locator at startup, actually xmlDefaultSAXLocator. Everything is available on the context, so this is useless in our case. defined(LIBXML_LEGACY_ENABLED) Set the current element namespace. DEPRECATED defined(LIBXML_LEGACY_ENABLED) called when the document start being processed. DEPRECATED: use xmlSAX2StartDocument() Called when the document start being processed. defined(LIBXML_LEGACY_ENABLED) called when an opening tag has been processed. DEPRECATED: use xmlSAX2StartElement() SAX2 callback when an element start has been detected by the parser. It provides the namespace informations for the element, as well as the new namespace declarations on the element. Called when an opening tag has been processed. defined(LIBXML_LEGACY_ENABLED) What to do when an unparsed entity declaration is parsed DEPRECATED: use xmlSAX2UnparsedEntityDecl() What to do when an unparsed entity declaration is parsed. defined(LIBXML_XPATH_ENABLED) Pops the top XPath object from the value stack defined(LIBXML_XPATH_ENABLED) Pushes a new XPath object on top of the value stack Display and format a warning messages, callback. defined(LIBXML_XPTR_ENABLED) This is the prototype for a extended link detection callback. defined(LIBXML_XPTR_ENABLED) This is the prototype for a extended link set detection callback. defined(LIBXML_XPTR_ENABLED) Get the default xlink detection routine defined(LIBXML_XPTR_ENABLED) Get the default xlink handler. defined(LIBXML_XPTR_ENABLED) Check whether the given node carries the attributes needed to be a link element (or is one of the linking elements issued from the (X)HTML DtDs). This routine don't try to do full checking of the link validity but tries to detect and return the appropriate link type. defined(LIBXML_XPTR_ENABLED) This is the prototype for the link detection routine. It calls the default link detection callbacks upon link detection. defined(LIBXML_XPTR_ENABLED) Set the default xlink detection routine defined(LIBXML_XPTR_ENABLED) Set the default xlink handlers defined(LIBXML_XPTR_ENABLED) This is the prototype for a simple link detection callback. defined(LIBXML_CATALOG_ENABLED) Add an entry in the catalog, it may overwrite existing but different entries. defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump the given catalog to the given file. defined(LIBXML_CATALOG_ENABLED) Remove an entry from the catalog defined(LIBXML_CATALOG_ENABLED) Do a complete resolution lookup of an External Identifier defined(LIBXML_CATALOG_ENABLED) Try to lookup the catalog local reference associated to a public ID in that catalog defined(LIBXML_CATALOG_ENABLED) Try to lookup the catalog resource for a system ID defined(LIBXML_CATALOG_ENABLED) Do a complete resolution lookup of an URI Register a new attribute declaration Note that @tree becomes the ownership of the DTD Add a new node to @parent, at the end of the child (or property) list merging adjacent TEXT nodes (in which case @cur is freed) If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed. Add a list of node at the end of the child list of the parent merging adjacent TEXT nodes (@cur may be freed) Register a new entity for this document. Register a new entity for this document DTD external subset. Register a new element declaration Registers an alias @alias for an encoding named @name. Existing alias will be overwritten. Register a new id declaration Add a new node @elem as the next sibling of @cur If the new node was already inserted in a document it is first unlinked from its existing context. As a result of text merging @elem may be freed. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed. Register a new notation declaration defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Add a new node @elem as the previous sibling of @cur merging adjacent TEXT nodes (@elem may be freed) If the new node was already inserted in a document it is first unlinked from its existing context. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed. Register a new ref declaration Add a new element @elem to the list of siblings of @cur merging adjacent TEXT nodes (@elem may be freed) If the new element was already inserted in a document it is first unlinked from its existing context. defined(LIBXML_OUTPUT_ENABLED) Create a buffered parser output Create a buffered parser input for progressive parsing defined(LIBXML_OUTPUT_ENABLED) Serialize text attribute values to an xml simple buffer defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Compile the automata into a Reg Exp ready for being executed. The automata should be free after this point. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Initial state lookup defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Checks if an automata is determinist. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a an ALL transition from the @from state to the target state. That transition is an epsilon transition allowed only when all transitions from the @from node have been activated. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will increment the counter provided defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Create a new counter defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will be allowed only if the counter is within the right range. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by any value except (@token,@token2) Note that if @token2 is not NULL, then (X, NULL) won't match to follow # the semantic of XSD ##other defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max, moreover that transition can only be crossed once. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max, moreover that transition can only be crossed once. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Create a new disconnected state in the automata defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Makes that state a final state defined(LIBXML_DEBUG_ENABLED) Convenient way to turn bool into text Function to extract the content of a buffer Function to extract the end of the content of a buffer Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buffer with this value defined(LIBXML_OUTPUT_ENABLED) Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called Remove the beginning of an XML buffer. NOTE that this routine behaviour differs from xmlBufferShrink() as it will return 0 on error instead of -1 due to size_t being used as the return type. Function to get the length of a buffer Add a string range to an XML buffer. if len == -1, the length of str is recomputed. Add a string range to the beginning of an XML buffer. if len == -1, the length of @str is recomputed. Append a zero terminated C string to an XML buffer. Append a zero terminated string to an XML buffer. Function to extract the content of a buffer routine to create an XML buffer. routine to create an XML buffer. routine to create an XML buffer from an immutable memory area. The area won't be modified nor copied, and is expected to be present until the end of the buffer lifetime. Remove the string contained in a buffer and gie it back to the caller. The buffer is reset to an empty content. This doesn't work with immutable buffers as they can't be reset. Dumps an XML buffer to a FILE *. empty a buffer. Frees an XML buffer. It frees both the content and the structure which encapsulate it. Grow the available space of an XML buffer. Function to get the length of a buffer Resize a buffer to accommodate minimum size of @size. Sets the allocation scheme for this buffer Remove the beginning of an XML buffer. routine which manages and grows an output buffer. This one adds xmlChars at the end of the buffer. routine which manage and grows an output buffer. This one add C chars at the end of the array. routine which manage and grows an output buffer. This one writes a quoted or double quoted #xmlChar string, checking first if it holds quote or double-quotes internally Builds the QName @prefix:@ncname in @memory if there is enough space and prefix is not NULL nor empty, otherwise allocate a new string. If prefix is NULL or empty it returns ncname. Expresses the URI of the reference in terms relative to the base. Some examples of this operation include: base = "http://site1.com/docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif pic1.gif http://site2.com/docs/pic1.gif http://site2.com/docs/pic1.gif base = "docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif http://site1.com/docs/pic1.gif Note: if the URI reference is really wierd or complicated, it may be worthwhile to first convert it into a "nice" one by calling xmlBuildURI (using 'base') before calling this routine, since this routine (for reasonable efficiency) assumes URI has already been through some validation. Computes he final URI of the reference done by checking that the given URI is valid, and building the final URI using the base URI. This is processed according to section 5.2 of the RFC 2396 5.2. Resolving Relative References to Absolute Form This function provides the current index of the parser relative to the start of the current entity. This function is computed in bytes from the beginning starting at zero and finishing at the size in byte of the file if parsing a file. The function is of constant cost if the input is UTF-8 but can be costly if run on non-UTF-8 input. defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dumps the canonized image of given XML document into memory. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dumps the canonized image of given XML document into the file. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Signature for a C14N callback on visible nodes Constructs a canonic path from the specified path. defined(LIBXML_CATALOG_ENABLED) Add an entry in the catalog, it may overwrite existing but different entries. If called before any other catalog routine, allows to override the default shared catalog put in place by xmlInitializeCatalog(); defined(LIBXML_CATALOG_ENABLED) Add the new entry to the catalog list defined(LIBXML_CATALOG_ENABLED) Free up all the memory associated with catalogs defined(LIBXML_CATALOG_ENABLED) Convert all the SGML catalog entries as XML ones defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump all the global catalog content to the given file. defined(LIBXML_CATALOG_ENABLED) Free up the memory associated to the catalog list defined(LIBXML_CATALOG_ENABLED) Used to get the user preference w.r.t. to what catalogs should be accepted defined(LIBXML_CATALOG_ENABLED) Try to lookup the catalog reference associated to a public ID DEPRECATED, use xmlCatalogResolvePublic() defined(LIBXML_CATALOG_ENABLED) Try to lookup the catalog reference associated to a system ID DEPRECATED, use xmlCatalogResolveSystem() defined(LIBXML_CATALOG_ENABLED) Check is a catalog is empty defined(LIBXML_CATALOG_ENABLED) Do a complete resolution lookup of an External Identifier using a document's private catalog list defined(LIBXML_CATALOG_ENABLED) Do a complete resolution lookup of an URI using a document's private catalog list defined(LIBXML_CATALOG_ENABLED) Remove an entry from the catalog defined(LIBXML_CATALOG_ENABLED) Do a complete resolution lookup of an External Identifier defined(LIBXML_CATALOG_ENABLED) Try to lookup the catalog reference associated to a public ID defined(LIBXML_CATALOG_ENABLED) Try to lookup the catalog resource for a system ID defined(LIBXML_CATALOG_ENABLED) Do a complete resolution lookup of an URI defined(LIBXML_CATALOG_ENABLED) Used to set the debug level for catalog operation, 0 disable debugging, 1 enable it defined(LIBXML_CATALOG_ENABLED) Allows to set the preference between public and system for deletion in XML Catalog resolution. C.f. section 4.1.1 of the spec Values accepted are XML_CATA_PREFER_PUBLIC or XML_CATA_PREFER_SYSTEM defined(LIBXML_CATALOG_ENABLED) Used to set the user preference w.r.t. to what catalogs should be accepted Generic front-end for encoding handler close function Front-end for the encoding handler input function, but handle only the very first line, i.e. limit itself to 45 chars. Generic front-end for the encoding handler input function Generic front-end for the encoding handler output function a first call with @in == NULL has to be made firs to initiate the output in case of non-stateless encoding needing to initiate their state or the output (like the BOM in UTF16). In case of UTF8 sequence conversion errors for the given encoder, the content will be automatically remapped to a CharRef sequence. Take a block of chars in the original encoding and try to convert it to an UTF-8 block of chars out. Take a block of UTF-8 chars in and try to convert it to another encoding. Note: a first call designed to produce heading info is called with in = NULL. If stateful this should also initialize the encoder state. Does a binary search of the range table to determine if char is valid a strdup for char's to xmlChar's a strndup for char's to xmlChar's function checks to see if @path is a valid source (file, socket...) for XML. if stat is not available on the target machine, Check an input in case it was created from an HTTP stream, in that case it will handle encoding and update of the base URL in case of redirection. It also checks for HTTP errors in which case the input is cleanly freed up and an appropriate error is raised in context Checks that the value conforms to the LanguageID production: NOTE: this is somewhat deprecated, those productions were removed from the XML Second edition. [33] LanguageID ::= Langcode ('-' Subcode)* [34] Langcode ::= ISO639Code | IanaCode | UserCode [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ [38] Subcode ::= ([a-z] | [A-Z])+ The current REC reference the sucessors of RFC 1766, currently 5646 http://www.rfc-editor.org/rfc/rfc5646.txt langtag = language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse] language = 2*3ALPHA ; shortest ISO 639 code ["-" extlang] ; sometimes followed by ; extended language subtags / 4ALPHA ; or reserved for future use / 5*8ALPHA ; or registered language subtag extlang = 3ALPHA ; selected ISO 639 codes *2("-" 3ALPHA) ; permanently reserved script = 4ALPHA ; ISO 15924 code region = 2ALPHA ; ISO 3166-1 code / 3DIGIT ; UN M.49 code variant = 5*8alphanum ; registered variants / (DIGIT 3alphanum) extension = singleton 1*("-" (2*8alphanum)) ; Single alphanumerics ; "x" reserved for private use singleton = DIGIT ; 0 - 9 / %x41-57 ; A - W / %x59-5A ; Y - Z / %x61-77 ; a - w / %x79-7A ; y - z it sounds right to still allow Irregular i-xxx IANA and user codes too The parser below doesn't try to cope with extension or privateuse that could be added but that's not interoperable anyway Checks @utf for being valid UTF-8. @utf is assumed to be null-terminated. This function is not super-strict, as it will allow longer UTF-8 sequences than necessary. Note that Java is capable of producing these sequences if provoked. Also note, this routine checks for the 4-byte maximum size, but does not check for 0x10ffff maximum value. check the compiled lib version against the include one. This can warn or immediately kill the application defined(LIBXML_TREE_ENABLED) Finds the current number of child nodes of that element which are element nodes. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references. Cleanup the memory allocated for the char encoding support, it unregisters all the encoding handlers and the aliases. Unregisters all aliases Additional cleanup for multi-threading clears the entire input callback table. this includes the compiled-in I/O. Free up all the memory allocated by the library for its own use. This should not be called by user level code. defined(LIBXML_OUTPUT_ENABLED) clears the entire output callback table. this includes the compiled-in I/O callbacks. This function name is somewhat misleading. It does not clean up parser state, it cleans up memory allocated by the library itself. It is a cleanup function for the XML library. It tries to reclaim all related global memory allocated for the library processing. It doesn't deallocate any document related memory. One should call xmlCleanupParser() only when the process has finished using the library and all XML/HTML documents built with it. See also xmlInitParser() which has the opposite function of preparing the library for operations. WARNING: if your application is multithreaded or has plugin support calling this may crash the application if another thread or a plugin is still using libxml2. It's sometimes very hard to guess if libxml2 is in use in the application, some libraries or plugins may use it without notice. In case of doubt abstain from calling this function or do it just before calling exit() to avoid leak reports from valgrind ! defined(LIBXML_LEGACY_ENABLED) Cleanup up the predefined entities table. Deprecated call xmlCleanupThreads() is used to to cleanup all the thread related data of the libxml2 library once processing has ended. WARNING: if your application is multithreaded or has plugin support calling this may crash the application if another thread or a plugin is still using libxml2. It's sometimes very hard to guess if libxml2 is in use in the application, some libraries or plugins may use it without notice. In case of doubt abstain from calling this function or do it just before calling exit() to avoid leak reports from valgrind ! -- Clear (release memory and reinitialize) node info sequence Clear (release owned resources) and reinitialize a parser context defined(LIBXML_CATALOG_ENABLED) Convert all the SGML catalog entries as XML ones defined(LIBXML_TREE_ENABLED) Build a copy of an attribute table. append the char value in the array append the char value in the array defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Do a copy of the document info. If recursive, the content tree will be copied too as well as DTD, namespaces and entities. Build a copy of an element content description. defined(LIBXML_TREE_ENABLED) Do a copy of the dtd. Build a copy of an element content description. Deprecated, use xmlCopyDocElementContent instead defined(LIBXML_TREE_ENABLED) Build a copy of an element table. defined(LIBXML_TREE_ENABLED) Build a copy of an entity table. defined(LIBXML_TREE_ENABLED) Copy an enumeration attribute node (recursive). Save the original error to the new place. Do a copy of the namespace. Do a copy of an namespace list. Do a copy of the node. Do a recursive copy of the node list. Use xmlDocCopyNodeList() if possible to ensure string interning. defined(LIBXML_TREE_ENABLED) Build a copy of a notation table. Do a copy of the attribute. Do a copy of an attribute list. Creates a parser context for an XML in-memory document. create and initialize an empty entities hash table. This really doesn't make sense and should be deprecated Create a parser context for an external entity Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. create and initialize an enumeration attribute node. Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. Create a parser context for using the XML parser with an existing I/O stream Create the internal subset of a document Create a parser context for an XML in-memory document. defined(LIBXML_PUSH_ENABLED) Create a parser context for using the XML parser in push mode. If @buffer and @size are non-NULL, the data is used to detect the encoding. The remaining characters will be parsed so they don't need to be fed in again through xmlParseChunk. To allow content encoding detection, @size should be >= 4 The value of @filename is used for fetching external entities and error/warning reports. Simply creates an empty xmlURI Create a parser context for a file or URL content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time and for file accesses Get the last parsing error registered. parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context NOTE that the file descriptor will not be closed when the reader is closed or reset. parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context parse an XML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context Reset a parser context Cleanup the last global error registered. For parsing error this does not change the well-formedness result. Reset a push parser context Applies the options to the parser context The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer. Implement the end of line normalization: 2.11 End-of-Line Handling Wherever an external parsed entity or the literal entity value of an internal parsed entity contains either the literal two-character sequence "#xD#xA" or a standalone literal #xD, an XML processor must pass to the application the single character #xA. This behavior can conveniently be produced by normalizing all line breaks to #xA on input, before parsing.) A function called to acquire namespaces (xmlNs) from the wrapper. References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc->oldNs entries are used This is the case when you have an unliked node and just want to move it to the context of If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. NOTE: This function was not intensively tested. References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc->oldNs entries are used. This is the case when you don't know already where the cloned branch will be added to. If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. TODO: 1) What to do with XInclude? Currently this returns an error for XInclude. Frees the DOM-wrapper context. Allocates and initializes a new DOM-wrapper context. Ensures that ns-references point to ns-decls hold on element-nodes. Ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. NOTE: This function was not intensively tested. Unlinks the given node from its owner. This will substitute ns-references to node->nsDef for ns-references to doc->oldNs, thus ensuring the removed branch to be autark wrt ns-references. NOTE: This function was not intensively tested. defined(LIBXML_DEBUG_ENABLED) Check the document for potential content problems, and output the errors to @output defined(LIBXML_DEBUG_ENABLED) Dumps debug information for the attribute defined(LIBXML_DEBUG_ENABLED) Dumps debug information for the attribute list defined(LIBXML_DEBUG_ENABLED) Dumps debug information for the DTD defined(LIBXML_DEBUG_ENABLED) Dumps debug information for the document, it's recursive defined(LIBXML_DEBUG_ENABLED) Dumps debug information cncerning the document, not recursive defined(LIBXML_DEBUG_ENABLED) Dumps debug information for all the entities in use by the document defined(LIBXML_DEBUG_ENABLED) Dumps debug information for the element node, it is recursive defined(LIBXML_DEBUG_ENABLED) Dumps debug information for the list of element node, it is recursive defined(LIBXML_DEBUG_ENABLED) Dumps debug information for the element node, it is not recursive defined(LIBXML_DEBUG_ENABLED) Dumps informations about the string, shorten it if necessary defined(LIBXML_LEGACY_ENABLED) This function is deprecated, we now always process entities content through xmlStringDecodeEntities TODO: remove it in next major release. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';' Initialize the default SAX2 handler Unregisters an encoding alias @alias Registers a callback for node destruction Signature for the deregistration callback of a discarded node Guess the encoding of the entity using the first bytes of the entity content according to the non-normative appendix F of the XML-1.0 recommendation. Free the dictionary mutex. Do not call unless sure the library is not in use anymore ! Create a new dictionary Create a new dictionary, inheriting strings from the read-only dictionnary @sub. On lookup, strings are first searched in the new dictionnary, then in @sub, and if not found are created in the new dictionnary. Check if the @name exists in the dictionnary @dict. Free the hash @dict and its contents. The userdata is deallocated with @f if provided. Get how much memory is used by a dictionary for strings Added in 2.9.0 Add the @name to the dictionnary @dict if not present. check if a string is owned by the disctionary Add the QName @prefix:@name to the hash @dict if not present. Increment the reference counter of a dictionary Set a size limit for the dictionary Added in 2.9.0 Query the number of elements installed in the hash @dict. Do a copy of the node to a given document. Do a recursive copy of the node list. defined(LIBXML_OUTPUT_ENABLED) Dump an XML document to an open FILE. defined(LIBXML_OUTPUT_ENABLED) Dump an XML document in memory and return the #xmlChar * and it's size. It's up to the caller to free the memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called defined(LIBXML_OUTPUT_ENABLED) Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called defined(LIBXML_OUTPUT_ENABLED) Dump an XML document in memory and return the #xmlChar * and it's size in bytes. It's up to the caller to free the memory with xmlFree(). The resulting byte array is zero terminated, though the last 0 is not included in the returned size. defined(LIBXML_OUTPUT_ENABLED) Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree(). defined(LIBXML_OUTPUT_ENABLED) Dump an XML document to an open FILE. Get the root element of the document (doc->children is a list containing possibly comments, PIs, etc ...). defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) Set the root element of the document (doc->children is a list containing possibly comments, PIs, etc ...). defined(LIBXML_OUTPUT_ENABLED) This will dump the content of the attribute declaration as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) This will dump the content of the attribute table as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) This will dump the content of the element declaration as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) This will dump the content of the element table as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) This will dump the content of the entity table as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) This will dump the content of the entity table as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) This will dump the content the notation declaration as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) This will dump the content of the notation table as an XML DTD definition defined(LIBXML_OUTPUT_ENABLED) Dump an XML/HTML node, recursive behaviour, children are printed too. defined(LIBXML_LEGACY_ENABLED) TODO: remove xmlEncodeEntities, once we are not afraid of breaking binary compatibility People must migrate their code to xmlEncodeEntitiesReentrant ! This routine will issue a warning when encountered. Do a global encoding of a string, replacing the predefined entities and non ASCII values with their entities and CharRef counterparts. Contrary to xmlEncodeEntities, this routine is reentrant, and result must be deallocated. Do a global encoding of a string, replacing the predefined entities this routine is reentrant, and result must be deallocated. defined(LIBXML_LEGACY_ENABLED) Callback function used when one needs to be able to track back the provenance of a chunk of nodes inherited from an entity replacement. Handle a redefinition of attribute error defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Debugging facility provides the number of allocated nodes over lifetime defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Debugging facility provides the number of allocated nodes at a that point defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Serialize the expression as compiled to the buffer defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Evaluates the expression resulting from @exp consuming a sub expression @sub Based on algebraic derivation and sometimes direct Brzozowski derivation it usually tatkes less than linear time and can handle expressions generating infinite languages. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Dereference the expression defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Free an expression context defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Find all the strings used in @exp and store them in @list defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Find all the strings that appears at the start of the languages accepted by @exp and store them in @list. E.g. for (a, b) | c it will return the list [a, c] defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Finds if the expression is nillable, i.e. if it accepts the empty sequqnce defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Indicate the maximum number of input a expression can accept defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Get the atom associated to this name from that context defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Creates a new context for manipulating expressions defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Get the atom associated to the choice @left | @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL). defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Get the atom associated to the range (@subset){@min, @max} Note that @subset is consumed in the operation, to keep an handle on it use xmlExpRef() and use xmlExpFree() to release it, this is true even in case of failure (unless ctxt == NULL). defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Get the atom associated to the sequence @left , @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL). defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Minimal parser for regexps, it understand the following constructs - string terminals - choice operator | - sequence operator , - subexpressions (...) - usual cardinality operators + * and ? - finite sequences { min, max } - infinite sequences { min, * } There is minimal checkings made especially no checking on strings values defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Increase the reference count of the expression defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Do one step of Brzozowski derivation of the expression @exp with respect to the input string defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) Check whether @exp accepts all the languages accexpted by @sub the input being a subexpression. External entity loaders types. Close an I/O channel input from FILE * Wrapper around xmlFileOpen_real that try it with an unescaped version of @filename, if this fails fallback to @filename Read @len bytes to @buffer from the I/O channel. Search in the registered set the handler able to read/write that encoding. defined(LIBXML_TREE_ENABLED) Finds the first child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references. Deallocate the memory used by an entities hash table. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Free an automata defined(LIBXML_CATALOG_ENABLED) Free the memory allocated to a Catalog Free up all the structures used by a document, tree included. Free an element content structure. The whole subtree is removed. Free a DTD structure. Free an element content structure. The whole subtree is removed. Deprecated, use xmlFreeDocElementContent instead Deallocate the memory used by an element hash table. Deallocate the memory used by an entities hash table. free an enumeration attribute node (recursive). Signature for a free() implementation. Deallocate the memory used by an ID hash table. Free up an input stream. xmlFreeMutex() is used to reclaim resources associated with a libxml2 token struct. Free a node, this is a recursive behaviour, all the children are freed too. This doesn't unlink the child from the list, use xmlUnlinkNode() first. Free a node and all its siblings, this is a recursive behaviour, all the children are freed too. Deallocate the memory used by an entities hash table. Free up the structures associated to a namespace Free up all the structures associated to the chained namespaces. Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed. Free up the memory used by a buffered parser input defined(LIBXML_PATTERN_ENABLED) Free up the memory allocated by @comp defined(LIBXML_PATTERN_ENABLED) Free up the memory allocated by all the elements of @comp Free one attribute, all the content is freed too Free a property and all its siblings, all the children are freed too. xmlRFreeMutex() is used to reclaim resources associated with a reentrant mutex. Deallocate the memory used by an Ref hash table. defined(LIBXML_PATTERN_ENABLED) Free the stream context defined(LIBXML_READER_ENABLED) Deallocate all the resources associated to the reader defined(LIBXML_WRITER_ENABLED) Deallocate all the resources associated to the writer Free up the xmlURI struct defined(LIBXML_VALID_ENABLED) Free a validation context structure. Provides the memory access functions set currently in use The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators Override the default memory access functions with a new set This has to be called before any other libxml routines ! The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators Should this be blocked if there was already some allocations done ? Signature of the function to use when there is an error and no parsing or validity context available . Types are XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, improves performance XML_BUFFER_ALLOC_HYBRID - use exact sizes on small strings to keep memory usage tight in normal usage, and doubleit on large strings to avoid pathological performance. Search in the registered set the handler able to read/write that encoding. The "canonical" name for XML encoding. C.f. http://www.w3.org/TR/REC-xml#charencoding Section 4.3.3 Character Encoding in Entities get the default compression mode used, ZLIB based. get the compression ratio for a document, ZLIB based Do an entity lookup in the document entity hash table and Search the DTD for the description of this attribute on this element. Search the DTD for the description of this element Do an entity lookup in the DTD entity hash table and Search the DTD for the description of this notation Search the DTD for the description of this qualified attribute on this element. Search the DTD for the description of this element Lookup an encoding name for the given alias. Get the default external entity resolver function for the application defined(LIBXML_LEGACY_ENABLED) Read the current value of one feature of this parser instance defined(LIBXML_LEGACY_ENABLED) Copy at most *@len feature names into the @result array xmlGetGlobalState() is called to retrieve the global state for a thread. Search the attribute declaring the given ID Get the internal subset of a document Search the last child of a node. Get the last global error registered. This is per thread if compiled with thread support. Get line number of @node. Try to override the limitation of lines being store in 16 bits ints if XML_PARSE_BIG_LINES parser option was used Search and get the value of an attribute associated to a node This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. This function is similar to xmlGetProp except it will accept only an attribute in no namespace. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) Build a structure based Path for the given node defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Search all the namespace applying to a given element. Search and get the value of an attribute associated to a node This attribute has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. Do an entity lookup in the internal and external subsets and Check whether this name is an predefined entity. Search and get the value of an attribute associated to a node This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. NOTE: this function acts independently of namespaces associated to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp() for namespace aware processing. Find the set of references for the supplied ID. xmlGetThreadId() find the current thread ID number Note that this is likely to be broken on some platforms using pthreads as the specification doesn't mandate pthread_t to be an integer type Read the first UTF8 character from @utf defined(LIBXML_LEGACY_ENABLED) Default handling of defined entities, when should we define a new input stream ? When do we just handle that as a set of chars ? OBSOLETE: to be removed at some point. Examines if the library has been compiled with a given feature. Search for an attribute associated to a node This attribute has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. Note that a namespace of NULL indicates to use the default namespace. Search an attribute associated to a node This function also looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. Add the @userdata to the hash @table. This can later be retrieved by using the @name. Duplicate names generate errors. Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Duplicate tuples generate errors. Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Duplicate entries generate errors. Callback to copy data from a hash. Scan the hash @table and applied @f to each value. Create a new xmlHashTablePtr. Create a new xmlHashTablePtr which will use @dict as the internal dictionary Callback to free data from a hash. Free the hash @table and its contents. The userdata is deallocated with @f if provided. Find the userdata specified by the @name. Find the userdata specified by the (@name, @name2) tuple. Find the userdata specified by the (@name, @name2, @name3) tuple. Find the userdata specified by the QName @prefix:@name/@name. Find the userdata specified by the QNames tuple Find the userdata specified by the (@name, @name2, @name3) tuple. Find the userdata specified by the @name and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f. Find the userdata specified by the (@name, @name2) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f. Find the userdata specified by the (@name, @name2, @name3) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f. Scan the hash @table and applied @f to each value. Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match. Scan the hash @table and applied @f to each value. Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match. Callback when scanning data in a hash with the simple scanner. Callback when scanning data in a hash with the full scanner. Query the number of elements installed in the hash @table. Add the @userdata to the hash @table. This can later be retrieved by using the @name. Existing entry for this @name will be removed and freed with @f if found. Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Existing entry for this tuple will be removed and freed with @f if found. Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Existing entry for this tuple will be removed and freed with @f if found. defined(LIBXML_FTP_ENABLED) Close an FTP I/O channel defined(LIBXML_FTP_ENABLED) check if the URI matches an FTP one defined(LIBXML_FTP_ENABLED) open an FTP I/O channel defined(LIBXML_FTP_ENABLED) Read @len bytes to @buffer from the I/O channel. defined(LIBXML_HTTP_ENABLED) Close an HTTP I/O channel defined(LIBXML_HTTP_ENABLED) check if the URI matches an HTTP one defined(LIBXML_HTTP_ENABLED) open an HTTP I/O channel defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Open a temporary buffer to collect the document for a subsequent HTTP POST request. Non-static as is called from the output buffer creation routine. defined(LIBXML_HTTP_ENABLED) Read @len bytes to @buffer from the I/O channel. defined(LIBXML_VALID_ENABLED) Load and parse a DTD Initialize the char encoding support, it registers the default encoding supported. NOTE: while public, this function usually doesn't need to be called in normal processing. Additional initialisation for multi-threading Initialize the memory layer. -- Initialize (set to initial state) node info sequence Initialization function for the XML parser. This is not reentrant. Call once before processing in case of use in multithreaded programs. Initialize a parser context xmlInitThreads() is used to to initialize all the thread related data of the libxml2 library. defined(LIBXML_CATALOG_ENABLED) Do the catalog initialization. this function is not thread safe, catalog initialization should preferably be done once at startup Do the dictionary mutex initialization. this function is deprecated xmlInitializeGlobalState() initialize a global state with all the default values of the library. defined(LIBXML_LEGACY_ENABLED) Set up the predefined entities. Deprecated call Callback used in the I/O Input API to close the resource Callback used in the I/O Input API to detect if the current handler can provide input fonctionnalities for this resource. Callback used in the I/O Input API to open the resource Callback used in the I/O Input API to read the resource This function is DEPRECATED. Use xmlIsBaseChar_ch or xmlIsBaseCharQ instead This function is DEPRECATED. Use xmlIsBlank_ch or xmlIsBlankQ instead Checks whether this node is an empty or whitespace only (and possibly ignorable) text-node. This function is DEPRECATED. Use xmlIsChar_ch or xmlIsCharQ instead This function is DEPRECATED. Use xmlIsCombiningQ instead This function is DEPRECATED. Use xmlIsDigit_ch or xmlIsDigitQ instead This function is DEPRECATED. Use xmlIsExtender_ch or xmlIsExtenderQ instead Determine whether an attribute is of type ID. In case we have DTD(s) then this is done if DTD loading has been requested. In the case of HTML documents parsed with the HTML parser, then ID detection is done systematically. This function is DEPRECATED. Use xmlIsIdeographicQ instead Check whether the character is allowed by the production [84] Letter ::= BaseChar | Ideographic xmlIsMainThread() check whether the current thread is the main thread. Search in the DtDs whether an element accept Mixed content (or ANY) basically if it is supposed to accept text childs This function is DEPRECATED. Use xmlIsPubidChar_ch or xmlIsPubidCharQ instead Determine whether an attribute is of type Ref. In case we have DTD(s) then this is simple, otherwise we use an heuristic: name Ref (upper or lowercase). Try to find if the document correspond to an XHTML DTD Set and return the previous value for default blanks text nodes support. The 1.x version of the parser used an heuristic to try to detect ignorable white spaces. As a result the SAX callback was generating xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when using the DOM output text nodes containing those blanks were not generated. The 2.x and later version will switch to the XML standard way and ignorableWhitespace() are only generated when running the parser in validating mode and when the current element doesn't allow CDATA or mixed content. This function is provided as a way to force the standard behavior on 1.X libs and to switch back to the old mode for compatibility when running 1.X client code on 2.X . Upgrade of 1.X code should be done by using xmlIsBlankNode() commodity function to detect the "empty" nodes generated. This value also affect autogeneration of indentation when saving code if blanks sections are kept, indentation is not generated. defined(LIBXML_TREE_ENABLED) Finds the last child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references. Set and return the previous value for enabling line numbers in elements contents. This may break on old application and is turned off by default. See Returns. Insert data in the ordered list at the end for this value Remove the all data in the list Move all the element from the old list in the new list Create a new list Callback function used to compare 2 data. Callback function used to free data from a list. Deletes the list and its associated data Duplicate the list Is the list empty ? Get the last element in the list Get the first element in the list Insert data in the ordered list at the beginning for this value include all the elements of the second list in the first one and clear the second list Removes the last element in the list Removes the first element in the list add the new data at the end of the list add the new data at the beginning of the list Remove the all instance associated to data in the list Remove the first instance associated to data in the list Remove the last instance associated to data in the list Reverse the order of the elements in the list Search the list in reverse order for an existing value of @data Walk all the element of the list in reverse order and apply the walker function to it Search the list for an existing value of @data Get the number of elements in the list Sort all the elements in the list Walk all the element of the first from first to last and apply the walker function to it Callback function used when walking a list with xmlListWalk(). defined(LIBXML_CATALOG_ENABLED) Load the catalog and build the associated data structures. This can be either an XML Catalog or an SGML Catalog It will recurse in SGML CATALOG entries. On the other hand XML Catalogs are not handled recursively. defined(LIBXML_CATALOG_ENABLED) Load the catalog and makes its definitions effective for the default external entity loader. It will recurse in SGML CATALOG entries. this function is not thread safe, catalog initialization should preferably be done once at startup defined(LIBXML_CATALOG_ENABLED) Load the catalogs and makes their definitions effective for the default external entity loader. this function is not thread safe, catalog initialization should preferably be done once at startup Load an external entity, note that the use of this function for unparsed entities may generate problems defined(LIBXML_CATALOG_ENABLED) Load an SGML super catalog. It won't expand CATALOG or DELEGATE references. This is only needed for manipulating SGML Super Catalogs like adding and removing CATALOG or DELEGATE entries. xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 library. defined(LIBXML_DEBUG_ENABLED) Count the children of @node. defined(LIBXML_DEBUG_ENABLED) Dump to @output the type and name of @node. a malloc() equivalent, with logging of the allocation info. Signature for a malloc() implementation. a malloc() equivalent, with logging of the allocation info. Provides the number of memory areas currently allocated show in-extenso the memory blocks allocated the last nbBytes of memory allocated and not freed, useful for dumping the memory left allocated between two places at runtime. a free() equivalent, with error checking. Provides the memory access functions set currently in use a malloc() equivalent, with logging of the allocation info. a realloc() equivalent, with logging of the allocation info. Override the default memory access functions with a new set This has to be called before any other libxml routines ! Should this be blocked if there was already some allocations done ? show a show display of the memory allocated, and dump the @nr last allocated areas which were not freed a strdup() equivalent, with logging of the allocation info. Provides the amount of memory currently allocated Dump in-extenso the memory blocks allocated to the file .memorylist a strdup() equivalent, with logging of the allocation info. defined(LIBXML_MODULES_ENABLED) The close operations unload the associated module and free the data associated to the module. defined(LIBXML_MODULES_ENABLED) The free operations free the data associated to the module but does not unload the associated shared library which may still be in use. defined(LIBXML_MODULES_ENABLED) Opens a module/shared library given its name or path NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We canot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const xmlChar * . TODO: options are not yet implemented. defined(LIBXML_MODULES_ENABLED) Lookup for a symbol address in the given module NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We canot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const xmlChar * . xmlMutexLock() is used to lock a libxml2 token. xmlMutexUnlock() is used to unlock a libxml2 token. defined(LIBXML_LEGACY_ENABLED) parse an XML namespace name. TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender defined(LIBXML_LEGACY_ENABLED) parse a namespace prefix declaration TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 1] NSDef ::= PrefixDef Eq SystemLiteral [NS 2] PrefixDef ::= 'xmlns' (':' NCName)? defined(LIBXML_LEGACY_ENABLED) TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. parse an XML qualified name [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName defined(LIBXML_FTP_ENABLED) Check if there is a response from the FTP server after a command. defined(LIBXML_FTP_ENABLED) Cleanup the FTP protocol layer. This cleanup proxy informations. defined(LIBXML_FTP_ENABLED) Close the connection and both control and transport defined(LIBXML_FTP_ENABLED) Close the data connection from the server defined(LIBXML_FTP_ENABLED) Tries to open a control connection defined(LIBXML_FTP_ENABLED) Tries to open a control connection to the given server/port defined(LIBXML_FTP_ENABLED) Tries to change the remote directory defined(LIBXML_FTP_ENABLED) Tries to delete an item (file or directory) from server defined(LIBXML_FTP_ENABLED) Frees the context after closing the connection. defined(LIBXML_FTP_ENABLED) Fetch the given file from the server. All data are passed back in the callbacks. The last callback has a size of 0 block. defined(LIBXML_FTP_ENABLED) Try to open a data connection to the server. Currently only passive mode is supported. defined(LIBXML_FTP_ENABLED) Get the response from the FTP server after a command. defined(LIBXML_FTP_ENABLED) Initiate fetch of the given file from the server. defined(LIBXML_FTP_ENABLED) Initialize the FTP protocol layer. Currently it just checks for proxy informations, and get the hostname defined(LIBXML_FTP_ENABLED) Do a listing on the server. All files info are passed back in the callbacks. defined(LIBXML_FTP_ENABLED) Allocate and initialize a new FTP context. defined(LIBXML_FTP_ENABLED) Start to fetch the given ftp:// resource defined(LIBXML_FTP_ENABLED) Setup the FTP proxy informations. This can also be done by using ftp_proxy ftp_proxy_user and ftp_proxy_password environment variables. defined(LIBXML_FTP_ENABLED) Send a QUIT command to the server defined(LIBXML_FTP_ENABLED) This function tries to read @len bytes from the existing FTP connection and saves them in @dest. This is a blocking call. defined(LIBXML_FTP_ENABLED) (Re)Initialize the FTP Proxy context by parsing the URL and finding the protocol host port it indicates. Should be like ftp://myproxy/ or ftp://myproxy:3128/ A NULL URL cleans up proxy informations. defined(LIBXML_FTP_ENABLED) Update an FTP context by parsing the URL and finding new path it indicates. If there is an error in the protocol, hostname, port or other information, the error is raised. It indicates a new connection has to be established. defined(LIBXML_HTTP_ENABLED) Get the authentication header of an HTTP context defined(LIBXML_HTTP_ENABLED) Cleanup the HTTP protocol layer. defined(LIBXML_HTTP_ENABLED) This function closes an HTTP context, it ends up the connection and free all data related to it. defined(LIBXML_HTTP_ENABLED) Provides the specified content length from the HTTP header. defined(LIBXML_HTTP_ENABLED) Provides the specified encoding if specified in the HTTP headers. defined(LIBXML_HTTP_ENABLED) This function try to fetch the indicated resource via HTTP GET and save it's content in the file. defined(LIBXML_HTTP_ENABLED) Initialize the HTTP protocol layer. Currently it just checks for proxy informations defined(LIBXML_HTTP_ENABLED) This function try to open a connection to the indicated resource via HTTP using the given @method, adding the given extra headers and the input buffer for the request content. defined(LIBXML_HTTP_ENABLED) This function try to open a connection to the indicated resource via HTTP using the given @method, adding the given extra headers and the input buffer for the request content. defined(LIBXML_HTTP_ENABLED) Provides the specified Mime-Type if specified in the HTTP headers. defined(LIBXML_HTTP_ENABLED) This function try to open a connection to the indicated resource via HTTP GET. defined(LIBXML_HTTP_ENABLED) This function try to open a connection to the indicated resource via HTTP GET. defined(LIBXML_HTTP_ENABLED) This function tries to read @len bytes from the existing HTTP connection and saves them in @dest. This is a blocking call. defined(LIBXML_HTTP_ENABLED) Provides the specified redirection URL if available from the HTTP header. defined(LIBXML_HTTP_ENABLED) Get the latest HTTP return code received defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) This function saves the output of the HTTP transaction to a file It closes and free the context at the end defined(LIBXML_HTTP_ENABLED) (Re)Initialize the HTTP Proxy context by parsing the URL and finding the protocol host port it indicates. Should be like http://myproxy/ or http://myproxy:3128/ A NULL URL cleans up proxy informations. defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) Create a new automata Creation of a new node containing a CDATA block. defined(LIBXML_CATALOG_ENABLED) create a new Catalog. Create and registers an xmlCharEncodingHandler. Creation of a new character reference node. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child list containing the TEXTs and ENTITY_REFs node will be created. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references. XML special chars must be escaped first by using xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used. Creation of a new node containing a comment. Creates a new XML document Creation of a new node containing a comment within a document. Allocate an element content structure for the document. defined(LIBXML_TREE_ENABLED) Creation of a new Fragment node. Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support. Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support. Creation of a processing instruction element. Create a new property carried by a document. defined(LIBXML_TREE_ENABLED) Creation of a new node element within a document. @ns and @content are optional (NULL). Creation of a new text node within a document. Creation of a new text node with an extra content length parameter. The text node pertain to a given document. Creation of a new DTD for the external subset. To create an internal subset, use xmlCreateIntSubset(). Allocate an element content structure. Deprecated in favor of xmlNewDocElementContent Create a new entity, this differs from xmlAddDocEntity() that if the document is NULL or has no internal subset defined, then an unlinked entity structure will be returned, it is then the responsability of the caller to link it to the document later or free it when not needed anymore. Create a new input stream based on an xmlEntityPtr defined(LIBXML_LEGACY_ENABLED) Creation of a Namespace, the old way using PI and without scoping DEPRECATED !!! Create a new input stream structure encapsulating the @input into a stream suitable for the parser. Create a new input stream based on a file or an URL. Create a new input stream structure. xmlNewMutex() is used to allocate a libxml2 token struct for use in synchronizing access to data. Creation of a new node element. @ns is optional (NULL). Creation of a new node element. @ns is optional (NULL). Creation of a new Namespace. This function will refuse to create a namespace with a similar prefix than an existing one present on this node. We use href==NULL in the case of an element creation where the namespace was not defined. Create a new property tagged with a namespace and carried by a node. Create a new property tagged with a namespace and carried by a node. Creation of a processing instruction element. Use xmlDocNewPI preferably to get string interning Allocate and initialize a new parser context. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Create a new property carried by a node. xmlRNewMutex() is used to allocate a reentrant mutex for use in synchronizing access to data. token_r is a re-entrant lock and thus useful for synchronizing access to data structures that may be manipulated in a recursive fashion. Creation of a new reference node. Create a new input stream based on a memory buffer. Creation of a new text node. defined(LIBXML_TREE_ENABLED) Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child TEXT node will be created containing the string @content. NOTE: Use xmlNewChild() if @content will contain entities that need to be preserved. Use this function, xmlNewTextChild(), if you need to ensure that reserved XML chars that might appear in @content, such as the ampersand, greater-than or less-than signs, are automatically replaced by their XML escaped entity representations. Creation of a new text node with an extra parameter for the content's length defined(LIBXML_READER_ENABLED) Create an xmlTextReader structure fed with @input defined(LIBXML_READER_ENABLED) Create an xmlTextReader structure fed with the resource at @URI defined(LIBXML_WRITER_ENABLED) Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr NOTE: the @out parameter will be deallocated when the writer is closed (if the call succeed.) defined(LIBXML_WRITER_ENABLED) Create a new xmlNewTextWriter structure with @*doc as output defined(LIBXML_WRITER_ENABLED) Create a new xmlNewTextWriter structure with @uri as output defined(LIBXML_WRITER_ENABLED) Create a new xmlNewTextWriter structure with @buf as output TODO: handle compression defined(LIBXML_WRITER_ENABLED) Create a new xmlNewTextWriter structure with @ctxt as output NOTE: the @ctxt context will be freed with the resulting writer (if the call succeeds). TODO: handle compression defined(LIBXML_WRITER_ENABLED) Create a new xmlNewTextWriter structure with @doc as output starting at @node defined(LIBXML_VALID_ENABLED) Allocate a validation context structure. Skip to the next char input char. defined(LIBXML_TREE_ENABLED) Finds the first closest next sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references. A specific entity loader disabling network accesses, though still allowing local catalog accesses for resolution. Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContent(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported. Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContentLen(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported. Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buffer with this value defined(LIBXML_OUTPUT_ENABLED) Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called Since this is using xmlBuffer structures it is limited to 2GB and somehow deprecated, use xmlBufNodeDump() instead. defined(LIBXML_OUTPUT_ENABLED) Dump an XML node, recursive behaviour, children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called Searches for the BASE URL. The code should work on both XML and HTML document even if base mechanisms are completely different. It returns the base as defined in RFC 2396 sections 5.1.1. Base URI within Document Content and 5.1.2. Base URI from the Encapsulating Entity However it does not return the document base (5.1.3), use doc->URL in this case Read the value of a node, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Searches the language of a node, i.e. the values of the xml:lang attribute or the one carried by the nearest ancestor. Searches the space preserving behaviour of a node, i.e. the values of the xml:space attribute or the one carried by the nearest ancestor. Is this node a Text node ? defined(LIBXML_TREE_ENABLED) Builds the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString() this function doesn't do any character encoding handling. Build the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) Set (or reset) the base URI of a node, i.e. the value of the xml:base attribute. Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars(). defined(LIBXML_TREE_ENABLED) Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars(). defined(LIBXML_TREE_ENABLED) Set the language of a node, i.e. the values of the xml:lang attribute. defined(LIBXML_TREE_ENABLED) Set (or reset) the name of a node. defined(LIBXML_TREE_ENABLED) Set (or reset) the space preserving behaviour of a node, i.e. the value of the xml:space attribute. Applies the 5 normalization steps to a path string--that is, RFC 2396 Section 5.2, steps 6.c through 6.g. Normalization occurs directly on the string, no new allocation is done This function is obsolete. Please see xmlURIFromPath in uri.c for a better solution. defined(LIBXML_OUTPUT_ENABLED) flushes and close the output I/O channel and free up all the associated resources defined(LIBXML_OUTPUT_ENABLED) Create a buffered output for the progressive saving to a xmlBuffer defined(LIBXML_OUTPUT_ENABLED) Create a buffered output for the progressive saving to a file descriptor defined(LIBXML_OUTPUT_ENABLED) Create a buffered output for the progressive saving to a FILE * buffered C I/O defined(LIBXML_OUTPUT_ENABLED) Create a buffered output for the progressive saving of a file If filename is "-' then we use stdout as the output. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. TODO: currently if compression is set, the library only support writing to a local file. Registers a callback for URI output file handling Signature for the function doing the lookup for a suitable output method corresponding to an URI. defined(LIBXML_OUTPUT_ENABLED) Create a buffered output for the progressive saving to an I/O handler defined(LIBXML_OUTPUT_ENABLED) flushes the output I/O channel defined(LIBXML_OUTPUT_ENABLED) Gives a pointer to the data currently held in the output buffer defined(LIBXML_OUTPUT_ENABLED) Gives the length of the data currently held in the output buffer defined(LIBXML_OUTPUT_ENABLED) Write the content of the array in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes. defined(LIBXML_OUTPUT_ENABLED) Write the content of the string in the output I/O buffer This routine escapes the caracters and then handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes. defined(LIBXML_OUTPUT_ENABLED) Write the content of the string in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes. defined(LIBXML_OUTPUT_ENABLED) Callback used in the I/O Output API to close the resource defined(LIBXML_OUTPUT_ENABLED) Callback used in the I/O Output API to detect if the current handler can provide output fonctionnalities for this resource. defined(LIBXML_OUTPUT_ENABLED) Callback used in the I/O Output API to open the resource defined(LIBXML_OUTPUT_ENABLED) Callback used in the I/O Output API to write to the resource parse a value for an attribute Note: the parser won't do substitution of entities here, this will be handled later in xmlStringGetNodeList [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'" 3.3.3 Attribute-Value Normalization: Before the value of an attribute is passed to the application or checked for validity, the XML processor must normalize it as follows: - a character reference is processed by appending the referenced character to the attribute value - an entity reference is processed by recursively processing the replacement text of the entity - a whitespace character (#x20, #xD, #xA, #x9) is processed by appending #x20 to the normalized value, except that only a single #x20 is appended for a "#xD#xA" sequence that is part of an external parsed entity or the literal entity value of an internal parsed entity - other characters are processed by appending them to the normalized value If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by a single space (#x20) character. All attributes for which no declaration has been read should be treated by a non-validating parser as if declared CDATA. defined(LIBXML_SAX1_ENABLED) parse an attribute [41] Attribute ::= Name Eq AttValue [ WFC: No External Entity References ] Attribute values cannot contain direct or indirect entity references to external entities. [ WFC: No < in Attribute Values ] The replacement text of any entity referred to directly or indirectly in an attribute value (other than "&lt;") must not contain a <. [ VC: Attribute Value Type ] The attribute must have been declared; the value must be of the type declared for it. [25] Eq ::= S? '=' S? With namespace: [NS 11] Attribute ::= QName Eq AttValue Also the case QName == xmlns:??? is handled independently as a namespace definition. : parse the Attribute list def for an element [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' [53] AttDef ::= S Name S AttType S DefaultDecl parse the Attribute list def for an element [54] AttType ::= StringType | TokenizedType | EnumeratedType [55] StringType ::= 'CDATA' [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' Validity constraints for attribute values syntax are checked in xmlValidateAttributeValue() [ VC: ID ] Values of type ID must match the Name production. A name must not appear more than once in an XML document as a value of this type; i.e., ID values must uniquely identify the elements which bear them. [ VC: One ID per Element Type ] No element type may have more than one ID attribute specified. [ VC: ID Attribute Default ] An ID attribute must have a declared default of #IMPLIED or #REQUIRED. [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names; each IDREF Name must match the value of an ID attribute on some element in the XML document; i.e. IDREF values must match the value of some ID attribute. [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names; each Entity Name must match the name of an unparsed entity declared in the DTD. [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens. defined(LIBXML_SAX1_ENABLED) Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* defined(LIBXML_SAX1_ENABLED) Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* Parse escaped pure raw content. [18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '<![CDATA[' [20] Data ::= (Char* - (Char* ']]>' Char*)) [21] CDEnd ::= ']]>' defined(LIBXML_CATALOG_ENABLED) parse an XML file and build a tree. It's like xmlParseFile() except it bypass all catalog lookups. parse a CharData section. if we are within a CDATA section ']]>' marks an end of section. The right angle bracket (>) may be represented using the string "&gt;", and must, for compatibility, be escaped using "&gt;" or a character reference when it appears in the string "]]>" in content, when that string is not marking the end of a CDATA section. [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) Compare the string to the encoding schemes already known. Note that the comparison is case insensitive accordingly to the section [XML] 4.3.3 Character Encoding in Entities. parse Reference declarations [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' [ WFC: Legal Character ] Characters referred to using character references must match the production for Char. defined(LIBXML_PUSH_ENABLED) Parse a Chunk of memory Skip an XML (SGML) comment <!-- .... --> The spec says that "For compatibility, the string "--" (double-hyphen) must not occur within comments. " [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' Parse a content: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* Parse an external general entity within an existing parsing context An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content defined(LIBXML_VALID_ENABLED) Load and parse an external subset. Parse an attribute default declaration [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) [ VC: Required Attribute ] if the default declaration is the keyword #REQUIRED, then the attribute must be specified for all elements of the type in the attribute-list declaration. [ VC: Attribute Default Legal ] The declared default value must meet the lexical constraints of the declared attribute type c.f. xmlValidateAttributeDecl() [ VC: Fixed Attribute Default ] if an attribute has a default value declared with the #FIXED keyword, instances of that attribute must match the default value. [ WFC: No < in Attribute Values ] handled in xmlParseAttValue() defined(LIBXML_SAX1_ENABLED) parse an XML in-memory document and build a tree. parse a DOCTYPE declaration [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>' [ VC: Root Element Type ] The Name in the document type declaration must match the element type of the root element. parse an XML document (and build a tree if using the standard SAX interface). [1] document ::= prolog element Misc* [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? parse an XML element, this is highly recursive [39] element ::= EmptyElemTag | STag content ETag [ WFC: Element Type Match ] The Name in an element's end-tag must match the element type in the start-tag. parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in xmlParseElementContentDecl [47] children ::= (choice | seq) ('?' | '*' | '+')? [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [ VC: Proper Group/PE Nesting ] applies to [49] and [50] TODO Parameter-entity replacement text must be properly nested with parenthesized groups. That is to say, if either of the opening or closing parentheses in a choice, seq, or Mixed construct is contained in the replacement text for a parameter entity, both must be contained in the same replacement text. For interoperability, if a parameter-entity reference appears in a choice, seq, or Mixed construct, its replacement text should not be empty, and neither the first nor last non-blank character of the replacement text should be a connector (| or ,). parse the declaration for an Element content either Mixed or Children, the cases EMPTY and ANY are handled directly in xmlParseElementDecl [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children parse an Element declaration. [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [ VC: Unique Element Type Declaration ] No element type may be declared more than once parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in xmlParseElementContentDecl [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49]) [ VC: No Duplicate Types ] The same name must not appear more than once in a single mixed-content declaration. parse the XML encoding name [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* parse the XML encoding declaration [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") this setups the conversion filters. defined(LIBXML_SAX1_ENABLED) parse an end of tag [42] ETag ::= '</' Name S? '>' With namespace [NS 9] ETag ::= '</' QName S? '>' defined(LIBXML_SAX1_ENABLED) parse an XML external entity out of context and build a tree. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk parse <!ENTITY declarations [70] EntityDecl ::= GEDecl | PEDecl [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID [76] NDataDecl ::= S 'NDATA' S Name [ VC: Notation Declared ] The Name must match the declared name of a notation. parse ENTITY references declarations [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", the Name given in the entity reference must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. The declaration of a parameter entity must precede any reference to it. Similarly, the declaration of a general entity must precede any reference to it which appears in a default value in an attribute-list declaration. Note that if entities are declared in the external subset or in external parameter entities, a non-validating processor is not obligated to read and process their declarations; for such documents, the rule that an entity must be declared is a well-formedness constraint only if standalone='yes'. [ WFC: Parsed Entity ] An entity reference must not contain the name of an unparsed entity parse a value for ENTITY declarations [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | "'" ([^%&'] | PEReference | Reference)* "'" parse an Enumerated attribute type. [57] EnumeratedType ::= NotationType | Enumeration [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' parse an Enumeration attribute type. [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [ VC: Enumeration ] Values of this type must match one of the Nmtoken tokens in the declaration parse a general parsed entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content defined(LIBXML_SAX1_ENABLED) Parse an external general entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content Parse an External ID or a Public ID NOTE: Productions [75] and [83] interact badly since [75] can generate 'PUBLIC' S PubidLiteral S SystemLiteral [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral [83] PublicID ::= 'PUBLIC' S PubidLiteral parse Markup declarations from an external subset [30] extSubset ::= textDecl? extSubsetDecl [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) * defined(LIBXML_SAX1_ENABLED) parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. Parse a well-balanced chunk of an XML document within the context (DTD, namespaces, etc ...) of the given node. The allowed sequence for the data is a Well Balanced Chunk defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* parse Markup declarations [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ VC: Proper Declaration/PE Nesting ] Parameter-entity replacement text must be properly nested with markup declarations. That is to say, if either the first character or the last character of a markup declaration (markupdecl above) is contained in the replacement text for a parameter-entity reference, both must be contained in the same replacement text. [ WFC: PEs in Internal Subset ] In the internal DTD subset, parameter-entity references can occur only where markup declarations can occur, not within markup declarations. (This does not apply to references that occur in external parameter entities or to the external subset.) defined(LIBXML_SAX1_ENABLED) parse an XML in-memory block and build a tree. parse an XML Misc* optional field. [27] Misc ::= Comment | PI | S parse an XML name. [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (#x20 Name)* defined(LIBXML_LEGACY_ENABLED) xmlParseNamespace: parse specific PI '<?namespace ...' constructs. This is what the older xml-name Working Draft specified, a bunch of other stuff may still rely on it, so support is still here as if it was declared on the root of the Tree:-( TODO: remove from library To be removed at next drop of binary compatibility parse an XML Nmtoken. [7] Nmtoken ::= (NameChar)+ [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* parse a notation declaration [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' Hence there is actually 3 choices: 'PUBLIC' S PubidLiteral 'PUBLIC' S PubidLiteral S SystemLiteral and 'SYSTEM' S SystemLiteral See the NOTE on xmlParseExternalID(). parse an Notation attribute type. Note: the leading 'NOTATION' S part has already being parsed... [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [ VC: Notation Attributes ] Values of this type must match one of the notation names included in the declaration; all notation names in the declaration must be declared. parse PEReference declarations The entity content is handled directly by pushing it's content as a new input stream. [69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive reference to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any reference to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any reference to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled. parse an XML Processing Instruction. [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' The processing is transfered to SAX once parsed. parse the name of a PI [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) parse an XML public literal [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" defined(LIBXML_LEGACY_ENABLED) Parse and return a string between quotes or doublequotes TODO: Deprecated, to be removed at next drop of binary compatibility parse and handle entity references in content, depending on the SAX interface, this may end-up in a call to character() if this is a CharRef, a predefined entity, if there is no reference() callback. or if the parser was asked to switch to that mode. [67] Reference ::= EntityRef | CharRef parse the XML standalone declaration [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no')'"')) [ VC: Standalone Document Declaration ] TODO The standalone document declaration must have the value "no" if any external markup declarations contain declarations of: - attributes with default values, if elements to which these attributes apply appear in the document without specifications of values for these attributes, or - entities (other than amp, lt, gt, apos, quot), if references to those entities appear in the document, or - attributes with values subject to normalization, where the attribute appears in the document with a value which will change as a result of normalization, or - element types with element content, if white space occurs directly within any instance of those types. defined(LIBXML_SAX1_ENABLED) parse a start of tag either for rule element or EmptyElement. In both case we don't parse the tag closing chars. [40] STag ::= '<' Name (S Attribute)* S? '>' [ WFC: Unique Att Spec ] No attribute name may appear more than once in the same start-tag or empty-element tag. [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [ WFC: Unique Att Spec ] No attribute name may appear more than once in the same start-tag or empty-element tag. With namespace: [NS 8] STag ::= '<' QName (S Attribute)* S? '>' [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' parse an XML Literal [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") parse an XML declaration header for external entities [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>' Parse an URI based on RFC 3986 URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] Parse an URI but allows to keep intact the original fragments. URI-reference = URI / relative-ref Parse an URI reference string based on RFC 3986 and fills in the appropriate fields of the @uri structure URI-reference = URI / relative-ref parse the XML version. [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ") [25] Eq ::= S? '=' S? parse the XML version value. [26] VersionNum ::= '1.' [0-9]+ In practice allow [0-9].[0-9]+ at that level parse an XML declaration header [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' Insert node info record into the sorted sequence Display and format an error messages, gives file, line, position and extra parameters. Find the parser node info struct for a given node xmlParserFindNodeInfoIndex : Find the index that the info record for the given node is or should be at in a sorted sequence lookup the directory for that file [69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive reference to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any reference to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any reference to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled. A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc i.e. - Included in literal in entity values - Included as Parameter Entity reference within DTDs defined(LIBXML_LEGACY_ENABLED) TODO: Remove, now deprecated ... the test is done directly in the content parsing routines. [67] Reference ::= EntityRef | CharRef [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] the Name given in the entity reference must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. [ WFC: Parsed Entity ] An entity reference must not contain the name of an unparsed entity [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc Create a buffered parser input for the progressive parsing for the input from a file descriptor Create a buffered parser input for the progressive parsing of a FILE * buffered C I/O Create a buffered parser input for the progressive parsing of a file If filename is "-' then we use stdin as the input. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. Do an encoding check if enc == XML_CHAR_ENCODING_NONE Registers a callback for URI input file handling Signature for the function doing the lookup for a suitable input method corresponding to an URI. Create a buffered parser input for the progressive parsing for the input from an I/O handler Create a buffered parser input for the progressive parsing for the input from a memory area. Create a buffered parser input for the progressive parsing for the input from an immutable memory area. This will not copy the memory area to the buffer, but the memory is expected to be available until the end of the parsing, this is useful for example when using mmap'ed file. Grow up the content of the input buffer, the old data are preserved This routine handle the I18N transcoding to internal UTF-8 This routine is used when operating the parser in normal (pull) mode TODO: one should be able to remove one extra copy by copying directly onto in->buffer or in->raw Push the content of the arry in the input buffer This routine handle the I18N transcoding to internal UTF-8 This is used when operating the parser in progressive (push) mode. Refresh the content of the input buffer, the old data are considered consumed This routine handle the I18N transcoding to internal UTF-8 Callback for freeing some parser input allocations. This function increase the input for the parser. It tries to preserve pointers to the input buffer, and keep already read data This function was internal and is deprecated. This function removes used input for the parser. Displays current context within the input content for error tracking Displays the associated file and line informations for the current input Display and format an validity error messages, gives file, line, position and extra parameters. Display and format a validity warning messages, gives file, line, position and extra parameters. Display and format a warning messages, gives file, line, position and extra parameters. Constructs an URI expressing the existing path defined(LIBXML_PATTERN_ENABLED) Check if the pattern must be looked at from the root. defined(LIBXML_PATTERN_ENABLED) Get a streaming context for that pattern Use xmlFreeStreamCtxt to free the context. defined(LIBXML_PATTERN_ENABLED) Test whether the node matches the pattern defined(LIBXML_PATTERN_ENABLED) Check the maximum depth reachable by a pattern defined(LIBXML_PATTERN_ENABLED) Check the minimum depth reachable by a pattern, 0 mean the / or . are part of the set. defined(LIBXML_PATTERN_ENABLED) Check if the pattern is streamable i.e. xmlPatternGetStreamCtxt() should work. defined(LIBXML_PATTERN_ENABLED) Compile a pattern. Set and return the previous value for enabling pedantic warnings. xmlPopInput: the current input pointed by ctxt->input came to an end pop it and return the next char. Clear the top input callback from the input stack. this includes the compiled-in I/O. defined(LIBXML_TREE_ENABLED) Finds the first closest previous sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references. Prints the URI in the stream @stream. xmlPushInput: switch to a new input stream which is stacked on top of the previous one(s). xmlRMutexLock() is used to lock a libxml2 token_r. xmlRMutexUnlock() is used to unlock a libxml2 token_r. parse an XML in-memory document and build a tree. parse an XML from a file descriptor and build a tree. NOTE that the file descriptor will not be closed when the reader is closed or reset. parse an XML file from the filesystem or the network. parse an XML document from I/O functions and source and build a tree. parse an XML in-memory document and build a tree. defined(LIBXML_READER_ENABLED) Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. defined(LIBXML_READER_ENABLED) Create an xmltextReader for an XML from a file descriptor. The parsing flags @options are a combination of xmlParserOption. NOTE that the file descriptor will not be closed when the reader is closed or reset. defined(LIBXML_READER_ENABLED) parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption. defined(LIBXML_READER_ENABLED) Create an xmltextReader for an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption. defined(LIBXML_READER_ENABLED) Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. defined(LIBXML_READER_ENABLED) Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader. defined(LIBXML_READER_ENABLED) Setup an xmltextReader to parse an XML from a file descriptor. NOTE that the file descriptor will not be closed when the reader is closed or reset. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader. defined(LIBXML_READER_ENABLED) parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader. defined(LIBXML_READER_ENABLED) Setup an xmltextReader to parse an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader. defined(LIBXML_READER_ENABLED) Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader. defined(LIBXML_READER_ENABLED) Setup an xmltextReader to parse a preparsed XML document. This reuses the existing @reader xmlTextReader. defined(LIBXML_READER_ENABLED) Create an xmltextReader for a preparsed document. Signature for a realloc() implementation. a realloc() equivalent, with logging of the allocation info. defined(LIBXML_TREE_ENABLED) This function checks that all the namespaces declared within the given tree are properly declared. This is needed for example after Copy or Cut and then paste operations. The subtree may still hold pointers to namespace declarations outside the subtree or invalid/masked. As much as possible the function try to reuse the existing namespaces found in the new environment. If not possible the new namespaces are redeclared on @tree at the top of the given subtree. defined(LIBXML_SAX1_ENABLED) parse an XML in-memory document and build a tree. In the case the document is not Well Formed, a attempt to build a tree is tried anyway defined(LIBXML_SAX1_ENABLED) parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. In the case the document is not Well Formed, it attempts to build a tree anyway defined(LIBXML_SAX1_ENABLED) parse an XML in-memory block and build a tree. In the case the document is not Well Formed, an attempt to build a tree is tried anyway defined(LIBXML_REGEXP_ENABLED) Callback function when doing a transition in the automata defined(LIBXML_REGEXP_ENABLED) Extract error informations from the regexp execution, the parameter @string will be updated with the value pushed and not accepted, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values defined(LIBXML_REGEXP_ENABLED) Extract informations from the regexp execution, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values defined(LIBXML_REGEXP_ENABLED) Push one input token in the execution context defined(LIBXML_REGEXP_ENABLED) Push one input token in the execution context defined(LIBXML_REGEXP_ENABLED) Free the structures associated to a regular expression evaulation context. defined(LIBXML_REGEXP_ENABLED) Free a regexp defined(LIBXML_REGEXP_ENABLED) Build a context used for progressive evaluation of a regexp. defined(LIBXML_REGEXP_ENABLED) Parses a regular expression conforming to XML Schemas Part 2 Datatype Appendix F and builds an automata suitable for testing strings against that regular expression defined(LIBXML_REGEXP_ENABLED) Check if the regular expression generates the value defined(LIBXML_REGEXP_ENABLED) Check if the regular expression is determinist defined(LIBXML_REGEXP_ENABLED) Print the content of the compiled regular expression Register the char encoding handler, surprising, isn't it ? Registers the default compiled-in I/O handlers. defined(LIBXML_OUTPUT_ENABLED) Registers the default compiled-in I/O handlers. defined(LIBXML_OUTPUT_ENABLED) && defined(LIBXML_HTTP_ENABLED) By default, libxml submits HTTP output requests using the "PUT" method. Calling this method changes the HTTP output method to use the "POST" method instead. Register a new set of I/O callback for handling parser input. Registers a callback for node creation Signature for the registration callback of a created node defined(LIBXML_OUTPUT_ENABLED) Register a new set of I/O callback for handling output. defined(LIBXML_SCHEMAS_ENABLED) Cleanup the default Schemas type library associated to RelaxNG defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump a RelaxNG structure back defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump the transformed RelaxNG tree. defined(LIBXML_SCHEMAS_ENABLED) Deallocate a RelaxNG structure. defined(LIBXML_SCHEMAS_ENABLED) Free the resources associated to the schema parser context defined(LIBXML_SCHEMAS_ENABLED) Free the resources associated to the schema validation context defined(LIBXML_SCHEMAS_ENABLED) Get the callback information used to handle errors for a validation context defined(LIBXML_SCHEMAS_ENABLED) Get the error and warning callback informations defined(LIBXML_SCHEMAS_ENABLED) Initilize the default type libraries. defined(LIBXML_SCHEMAS_ENABLED) Create an XML RelaxNGs parser context for that document. Note: since the process of compiling a RelaxNG schemas modifies the document, the @doc parameter is duplicated internally. defined(LIBXML_SCHEMAS_ENABLED) Create an XML RelaxNGs parse context for that memory buffer expected to contain an XML RelaxNGs file. defined(LIBXML_SCHEMAS_ENABLED) Create an XML RelaxNGs parse context for that file/resource expected to contain an XML RelaxNGs file. defined(LIBXML_SCHEMAS_ENABLED) Create an XML RelaxNGs validation context based on the given schema defined(LIBXML_SCHEMAS_ENABLED) parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances. defined(LIBXML_SCHEMAS_ENABLED) Set the callback functions used to handle errors for a validation context defined(LIBXML_SCHEMAS_ENABLED) Set the callback functions used to handle errors for a parsing context defined(LIBXML_SCHEMAS_ENABLED) Set the error and warning callback informations defined(LIBXML_SCHEMAS_ENABLED) Set the structured error callback defined(LIBXML_SCHEMAS_ENABLED) Validate a document tree in memory. defined(LIBXML_SCHEMAS_ENABLED) Validate a full subtree when xmlRelaxNGValidatePushElement() returned 0 and the content of the node has been expanded. defined(LIBXML_SCHEMAS_ENABLED) Pop the element end from the RelaxNG validation stack. defined(LIBXML_SCHEMAS_ENABLED) check the CData parsed for validation in the current stack defined(LIBXML_SCHEMAS_ENABLED) Push a new element start on the RelaxNG validation stack. defined(LIBXML_SCHEMAS_ENABLED) Signature of an error callback from a Relax-NG validation defined(LIBXML_SCHEMAS_ENABLED) Signature of a warning callback from a Relax-NG validation defined(LIBXML_SCHEMAS_ENABLED) Semi private function used to pass informations to a parser context which are a combination of xmlRelaxNGParserFlag . Remove the given attribute from the ID table maintained internally. Unlink and free one attribute, all the content is freed too Note this doesn't work for namespace definition attributes Remove the given attribute from the Ref table maintained internally. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) Unlink the old node from its current context, prune the new one at the same place. If @cur was already inserted in a document it is first unlinked from its existing context. Cleanup the error. Cleanup the last global error registered. For parsing error this does not change the well-formedness result. An attribute definition has been parsed called when a pcdata block has been parsed receiving some chars from the parser. A xmlSAX2Comment has been parsed. An element definition has been parsed called when the document end has been detected. defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) called when the end of an element has been detected. SAX2 callback when an element end has been detected by the parser. It provides the namespace informations for the element. An entity definition has been parsed Callback on external subset declaration. Provide the column number of the current parsing point. Get an entity by name Provide the line number of the current parsing point. Get a parameter entity by name Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd Does this document has an external subset Does this document has an internal subset receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use xmlSAX2Characters Initialize the default XML SAX2 handler defined(LIBXML_DOCB_ENABLED) Initialize the default DocBook SAX2 handler defined(LIBXML_HTML_ENABLED) Initialize the default HTML SAX2 handler Callback on internal subset declaration. Is this document tagged standalone ? What to do when a notation declaration has been parsed. A processing instruction has been parsed. called when an entity xmlSAX2Reference is detected. The entity loader, to control the loading of external entities, the application can either: - override this xmlSAX2ResolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine Receive the document locator at startup, actually xmlDefaultSAXLocator Everything is available on the context, so this is useless in our case. called when the document start being processed. defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) called when an opening tag has been processed. SAX2 callback when an element start has been detected by the parser. It provides the namespace informations for the element, as well as the new namespace declarations on the element. What to do when an unparsed entity declaration is parsed defined(LIBXML_SAX1_ENABLED) Set the default version of SAX used globally by the library. By default, during initialization the default is set to 2. Note that it is generally a better coding style to use xmlSAXVersion() to set up the version explicitly for a given parsing context. defined(LIBXML_VALID_ENABLED) Load and parse an external subset. defined(LIBXML_SAX1_ENABLED) parse an XML in-memory document and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. defined(LIBXML_SAX1_ENABLED) parse an XML external entity out of context and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk defined(LIBXML_SAX1_ENABLED) parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. defined(LIBXML_SAX1_ENABLED) parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml defined(LIBXML_SAX1_ENABLED) parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. defined(LIBXML_SAX1_ENABLED) parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml defined(LIBXML_SAX1_ENABLED) parse an XML file and call the given SAX handler routines. Automatic support for ZLIB/Compress compressed document is provided defined(LIBXML_SAX1_ENABLED) A better SAX parsing routine. parse an XML in-memory buffer and call the given SAX handler routines. Initialize the default XML SAX handler according to the version defined(LIBXML_OUTPUT_ENABLED) Close a document saving context, i.e. make sure that all bytes have been output and free the associated data. defined(LIBXML_OUTPUT_ENABLED) Save a full document to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead defined(LIBXML_OUTPUT_ENABLED) Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used. defined(LIBXML_OUTPUT_ENABLED) Dump an XML document, converting it to the given encoding defined(LIBXML_OUTPUT_ENABLED) Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call. defined(LIBXML_OUTPUT_ENABLED) Flush a document saving context, i.e. make sure that all bytes have been output. defined(LIBXML_OUTPUT_ENABLED) Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used. If @format is set then the document will be indented on output. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called defined(LIBXML_OUTPUT_ENABLED) Dump an XML document to a file or an URL. defined(LIBXML_OUTPUT_ENABLED) Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call. defined(LIBXML_OUTPUT_ENABLED) Set a custom escaping function to be used for text in attribute content defined(LIBXML_OUTPUT_ENABLED) Set a custom escaping function to be used for text in element content defined(LIBXML_OUTPUT_ENABLED) Create a document saving context serializing to a buffer with the encoding and the options given defined(LIBXML_OUTPUT_ENABLED) Create a document saving context serializing to a file descriptor with the encoding and the options given. defined(LIBXML_OUTPUT_ENABLED) Create a document saving context serializing to a filename or possibly to an URL (but this is less reliable) with the encoding and the options given. defined(LIBXML_OUTPUT_ENABLED) Create a document saving context serializing to a file descriptor with the encoding and the options given defined(LIBXML_OUTPUT_ENABLED) Save a subtree starting at the node parameter to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead Save the URI as an escaped string defined(LIBXML_LEGACY_ENABLED) Trickery: parse an XML name but without consuming the input flow Needed for rollback cases. Used only when parsing entities references. TODO: seems deprecated now, only used in the default part of xmlParserHandleReference [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (S Name)* defined(LIBXML_SCHEMAS_ENABLED) Checks and computes the values of facets. defined(LIBXML_SCHEMAS_ENABLED) Cleanup the default XML Schemas type library defined(LIBXML_SCHEMAS_ENABLED) Removes and normalize white spaces in the string defined(LIBXML_SCHEMAS_ENABLED) Compare 2 values defined(LIBXML_SCHEMAS_ENABLED) Compare 2 values defined(LIBXML_SCHEMAS_ENABLED) Copies the precomputed value. This duplicates any string within. defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Dump a Schema structure. defined(LIBXML_SCHEMAS_ENABLED) Deallocate a Schema structure. defined(LIBXML_SCHEMAS_ENABLED) Deallocate a Schema Facet structure. defined(LIBXML_SCHEMAS_ENABLED) Free the resources associated to the schema parser context defined(LIBXML_SCHEMAS_ENABLED) Deallocate a Schema Type structure. defined(LIBXML_SCHEMAS_ENABLED) Free the resources associated to the schema validation context defined(LIBXML_SCHEMAS_ENABLED) Cleanup the default XML Schemas type library defined(LIBXML_SCHEMAS_ENABLED) Deallocates a wildcard structure. defined(LIBXML_SCHEMAS_ENABLED) Lookup function defined(LIBXML_SCHEMAS_ENABLED) Gives you the type struct for a built-in type by its type id. defined(LIBXML_SCHEMAS_ENABLED) Get a the cononical lexical representation of the value. The caller has to FREE the returned retValue. WARNING: Some value types are not supported yet, resulting in a @retValue of "???". TODO: XML Schema 1.0 does not define canonical representations for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. defined(LIBXML_SCHEMAS_ENABLED) Get a the cononical representation of the value. The caller has to free the returned @retValue. defined(LIBXML_SCHEMAS_ENABLED) Extract the value of a facet defined(LIBXML_SCHEMAS_ENABLED) Get the callback information used to handle errors for a parser context defined(LIBXML_SCHEMAS_ENABLED) Lookup a type in the default XML Schemas type library defined(LIBXML_SCHEMAS_ENABLED) Accessor for the type of a value defined(LIBXML_SCHEMAS_ENABLED) Get the error and warning callback informations defined(LIBXML_SCHEMAS_ENABLED) Initialize the default XML Schemas type library defined(LIBXML_SCHEMAS_ENABLED) Evaluates if a specific facet can be used in conjunction with a type. defined(LIBXML_SCHEMAS_ENABLED) Check if any error was detected during validation. defined(LIBXML_SCHEMAS_ENABLED) Create an XML Schemas parse context for that document. NB. The document may be modified during the parsing process. defined(LIBXML_SCHEMAS_ENABLED) Allocate a new Facet structure. defined(LIBXML_SCHEMAS_ENABLED) Create an XML Schemas parse context for that memory buffer expected to contain an XML Schemas file. defined(LIBXML_SCHEMAS_ENABLED) Allocate a new NOTATION value. The given values are consumed and freed with the struct. defined(LIBXML_SCHEMAS_ENABLED) Create an XML Schemas parse context for that file/resource expected to contain an XML Schemas file. defined(LIBXML_SCHEMAS_ENABLED) Allocate a new QName value. The given values are consumed and freed with the struct. defined(LIBXML_SCHEMAS_ENABLED) Allocate a new simple type value. The type can be of XML_SCHEMAS_STRING. WARNING: This one is intended to be expanded for other string based types. We need this for anySimpleType as well. The given value is consumed and freed with the struct. defined(LIBXML_SCHEMAS_ENABLED) Create an XML Schemas validation context based on the given schema. defined(LIBXML_SCHEMAS_ENABLED) parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances. defined(LIBXML_SCHEMAS_ENABLED) Plug a SAX based validation layer in a SAX parsing event flow. The original @saxptr and @dataptr data are replaced by new pointers but the calls to the original will be maintained. defined(LIBXML_SCHEMAS_ENABLED) Unplug a SAX based validation layer in a SAX parsing event flow. The original pointers used in the call are restored. defined(LIBXML_SCHEMAS_ENABLED) Set the callback functions used to handle errors for a validation context defined(LIBXML_SCHEMAS_ENABLED) Set the structured error callback defined(LIBXML_SCHEMAS_ENABLED) Set the error and warning callback informations defined(LIBXML_SCHEMAS_ENABLED) Sets the options to be used during the validation. defined(LIBXML_SCHEMAS_ENABLED) Set the structured error callback defined(LIBXML_SCHEMAS_ENABLED) Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val. defined(LIBXML_SCHEMAS_ENABLED) Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val. This one does apply any normalization to the value. defined(LIBXML_SCHEMAS_ENABLED) Get the validation context options. defined(LIBXML_SCHEMAS_ENABLED) allow access to the parser context of the schema validation context defined(LIBXML_SCHEMAS_ENABLED) Validate a document tree in memory. defined(LIBXML_SCHEMAS_ENABLED) Check a value against a facet condition defined(LIBXML_SCHEMAS_ENABLED) Check a value against a facet condition. This takes value normalization according to the specified whitespace types into account. Note that @value needs to be the *normalized* value if the facet is of type "pattern". defined(LIBXML_SCHEMAS_ENABLED) Do a schemas validation of the given resource, it will use the SAX streamable validation internally. defined(LIBXML_SCHEMAS_ENABLED) Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value. defined(LIBXML_SCHEMAS_ENABLED) Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value. defined(LIBXML_SCHEMAS_ENABLED) Checks the value of a list simple type against a facet. defined(LIBXML_SCHEMAS_ENABLED) Validate a branch of a tree, starting with the given @elem. defined(LIBXML_SCHEMAS_ENABLED) Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val. defined(LIBXML_SCHEMAS_ENABLED) Workaround to provide file error reporting information when this is not provided by current APIs defined(LIBXML_SCHEMAS_ENABLED) Allows to set a locator function to the validation context, which will be used to provide file and line information since those are not provided as part of the SAX validation flow Setting @f to NULL disable the locator. defined(LIBXML_SCHEMAS_ENABLED) Validate an input based on a flow of SAX event from the parser and forward the events to the @sax handler with the provided @user_data the user provided @sax handler must be a SAX2 one. defined(LIBXML_SCHEMAS_ENABLED) Signature of an error callback from an XSD validation defined(LIBXML_SCHEMAS_ENABLED) A schemas validation locator, a callback called by the validator. This is used when file or node informations are not available to find out what file and line number are affected defined(LIBXML_SCHEMAS_ENABLED) Signature of a warning callback from an XSD validation defined(LIBXML_SCHEMAS_ENABLED) Appends a next sibling to a list of computed values. defined(LIBXML_SCHEMAS_ENABLED) Accessor for the boolean value of a computed value. defined(LIBXML_SCHEMAS_ENABLED) Accessor for the string value of a computed value. defined(LIBXML_SCHEMAS_ENABLED) Accessor for the next sibling of a list of computed values. defined(LIBXML_SCHEMAS_ENABLED) Replaces 0xd, 0x9 and 0xa with a space. defined(LIBXML_SCHEMATRON_ENABLED) Deallocate a Schematron structure. defined(LIBXML_SCHEMATRON_ENABLED) Free the resources associated to the schema parser context defined(LIBXML_SCHEMATRON_ENABLED) Free the resources associated to the schema validation context defined(LIBXML_SCHEMATRON_ENABLED) Create an XML Schematrons parse context for that document. NB. The document may be modified during the parsing process. defined(LIBXML_SCHEMATRON_ENABLED) Create an XML Schematrons parse context for that memory buffer expected to contain an XML Schematrons file. defined(LIBXML_SCHEMATRON_ENABLED) Create an XML Schematrons parse context for that file/resource expected to contain an XML Schematrons file. defined(LIBXML_SCHEMATRON_ENABLED) Create an XML Schematrons validation context based on the given schema. defined(LIBXML_SCHEMATRON_ENABLED) parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances. defined(LIBXML_SCHEMATRON_ENABLED) Set the structured error callback defined(LIBXML_SCHEMATRON_ENABLED) Validate a tree instance against the schematron defined(LIBXML_SCHEMATRON_ENABLED) Signature of an error callback from a Schematron validation defined(LIBXML_SCHEMATRON_ENABLED) Signature of a warning callback from a Schematron validation Search a Ns registered under a given name space for a document. recurse on the parents until it finds the defined namespace or return NULL otherwise. @nameSpace can be NULL, this is a search for the default namespace. We don't allow to cross entities boundaries. If you don't declare the namespace within those you will be in troubles !!! A warning is generated to cover this case. Search a Ns aliasing a given URI. Recurse on the parents until it finds the defined namespace or return NULL otherwise. Set the buffer allocation method. Types are XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, improves performance set the default compression mode used, ZLIB based Correct values: 0 (uncompressed) to 9 (max compression) set the compression ratio for a document, ZLIB based Correct values: 0 (uncompressed) to 9 (max compression) defined(LIBXML_LEGACY_ENABLED) Set the function to call call back when a xml reference has been made Changes the defaultexternal entity resolver function for the application defined(LIBXML_LEGACY_ENABLED) Change the current value of one feature of this parser instance Function to reset the handler and the error context for out of context error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler One can simply force messages to be emitted to another FILE * than stderr by setting @ctx to this file handle and @handler to NULL. For multi-threaded applications, this must be set separately for each thread. update all nodes in the list to point to the right document Associate a namespace to a node, a posteriori. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) Set (or reset) an attribute carried by a node. The ns structure must be in scope, this is not checked defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) Set (or reset) an attribute carried by a node. If @name has a prefix, then the corresponding namespace-binding will be used, if in scope; it is an error it there's no such ns-binding for the prefix in scope. Function to reset the handler and the error context for out of context structured error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler For multi-threaded applications, this must be set separately for each thread. update all nodes under the tree to point to the right document defined(LIBXML_SAX1_ENABLED) Setup the parser context to parse a new buffer; Clears any prior contents from the parser context. The buffer parameter must not be NULL, but the filename parameter can be defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Implements the XML shell This allow to load, validate, view, modify and save a document using a environment similar to a UNIX commandline. defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Implements the XML shell function "base" dumps the current XML base of the node defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Implements the XML shell function "cat" dumps the serialization node content (XML or HTML). defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) This is a generic signature for the XML shell functions. defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Implements the XML shell function "dir" dumps informations about the node (namespace, attributes, content). defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Implements the XML shell function "du" show the structure of the subtree under node @tree If @tree is null, the command works on the current node. defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Implements the XML shell function "ls" Does an Unix like listing of the given node (like a directory) defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Implements the XML shell function "load" loads a new document specified by the filename defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Print node to the output FILE defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Print the xpath error to libxml default error channel defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Prints result to the output FILE defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) Implements the XML shell function "pwd" Show the full path from the root to the node, if needed building thumblers when similar elements exists at a given ancestor level. The output is compatible with XPath commands. defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) This is a generic signature for the XML shell input function. defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Implements the XML shell function "save" Write the current document to the filename, or it's original name defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_VALID_ENABLED) Implements the XML shell function "validate" Validate the document, if a DTD path is provided, then the validation is done against the given DTD. defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) Implements the XML shell function "write" Write the current node to the filename, it saves the serialization of the subtree under the @node specified skip all blanks character found at that point in the input streams. It pops up finished entities in the process if allowable at that point. This will dump the content of the element content definition Intended just for the debug routine parse an UTF8 encoded XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName parse an XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName parse an XML qualified name string,i defined(LIBXML_OUTPUT_ENABLED) Deprecated, unsafe, use xmlSnprintfElementContent Blocks further parser processing Check if both strings are equal of have same content. Should be a bit more readable and faster than xmlStrcmp() Formats @msg and places result into @buf. Check if a QName is Equal to a given string Formats @msg and places result into @buf. a strcasecmp for xmlChar's a case-ignoring strstr for xmlChar's a strcat for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'. a strchr for xmlChar's a strcmp for xmlChar's a strdup for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'. Signature for an strdup() implementation. defined(LIBXML_PATTERN_ENABLED) push one level from the stream. defined(LIBXML_PATTERN_ENABLED) Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an element-node. defined(LIBXML_PATTERN_ENABLED) Push new attribute data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an attribute-node. defined(LIBXML_PATTERN_ENABLED) Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Different from xmlStreamPush() this function can be fed with nodes of type: element-, attribute-, text-, cdata-section-, comment- and processing-instruction-node. defined(LIBXML_PATTERN_ENABLED) Query if the streaming pattern additionally needs to be fed with text-, cdata-section-, comment- and processing-instruction-nodes. If the result is 0 then only element-nodes and attribute-nodes need to be pushed. The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer. Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';' Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs. Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';' Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs. length of a xmlChar's string a strncasecmp for xmlChar's a strncat for array of xmlChar's, it will extend @cur with the len first bytes of @add. Note that if @len < 0 then this is an API error and NULL will be returned. same as xmlStrncat, but creates a new string. The original two strings are not freed. If @len is < 0 then the length will be calculated automatically. a strncmp for xmlChar's a strndup for array of xmlChar's a strstr for xmlChar's Extract a substring of a given string Signature of the function to use when there is an error and the module handles the new error reporting mechanism. Set and return the previous value for default entity support. Initially the parser always keep entity references instead of substituting entity values in the output. This function has to be used to change the default parser behavior SAX::substituteEntities() has to be used for changing that on a file by file basis. change the input functions when discovering the character encoding of a given entity. change the input functions when discovering the character encoding of a given entity. change the input functions when discovering the character encoding of a given entity. Concat the given string at the end of the existing node content Merge two text nodes into one defined(LIBXML_READER_ENABLED) Provides the number of attributes of the current node defined(LIBXML_READER_ENABLED) The base URI of the node. defined(LIBXML_READER_ENABLED) This function provides the current index of the parser used by the reader, relative to the start of the current entity. This function actually just wraps a call to xmlBytesConsumed() for the parser context associated with the reader. See xmlBytesConsumed() for more information. defined(LIBXML_READER_ENABLED) This method releases any resources allocated by the current instance changes the state to Closed and close any underlying input. defined(LIBXML_READER_ENABLED) The base URI of the node. defined(LIBXML_READER_ENABLED) Determine the encoding of the document being read. defined(LIBXML_READER_ENABLED) The local name of the node. defined(LIBXML_READER_ENABLED) The qualified name of the node, equal to Prefix :LocalName. defined(LIBXML_READER_ENABLED) The URI defining the namespace associated with the node. defined(LIBXML_READER_ENABLED) A shorthand reference to the namespace associated with the node. defined(LIBXML_READER_ENABLED) Get an interned string from the reader, allows for example to speedup string name comparisons defined(LIBXML_READER_ENABLED) Provides the text value of the node if present defined(LIBXML_READER_ENABLED) The xml:lang scope within which the node resides. defined(LIBXML_READER_ENABLED) Determine the XML version of the document being read. defined(LIBXML_READER_ENABLED) Hacking interface allowing to get the xmlDocPtr correponding to the current document being accessed by the xmlTextReader. NOTE: as a result of this call, the reader will not destroy the associated XML document and calling xmlFreeDoc() on the result is needed once the reader parsing has finished. defined(LIBXML_READER_ENABLED) Hacking interface allowing to get the xmlNodePtr correponding to the current node being accessed by the xmlTextReader. This is dangerous because the underlying node may be destroyed on the next Reads. defined(LIBXML_READER_ENABLED) The depth of the node in the tree. defined(LIBXML_READER_ENABLED) Signature of an error callback from a reader parser defined(LIBXML_READER_ENABLED) Reads the contents of the current node and the full subtree. It then makes the subtree available until the next xmlTextReaderRead() call defined(LIBXML_READER_ENABLED) Provides the value of the attribute with the specified qualified name. defined(LIBXML_READER_ENABLED) Provides the value of the attribute with the specified index relative to the containing element. defined(LIBXML_READER_ENABLED) Provides the value of the specified attribute defined(LIBXML_READER_ENABLED) Retrieve the error callback function and user argument. defined(LIBXML_READER_ENABLED) Provide the column number of the current parsing point. defined(LIBXML_READER_ENABLED) Provide the line number of the current parsing point. defined(LIBXML_READER_ENABLED) Read the parser internal property. defined(LIBXML_READER_ENABLED) Method to get the remainder of the buffered XML. this method stops the parser, set its state to End Of File and return the input stream with what is left that the parser did not use. The implementation is not good, the parser certainly procgressed past what's left in reader->input, and there is an allocation problem. Best would be to rewrite it differently. defined(LIBXML_READER_ENABLED) Whether the node has attributes. defined(LIBXML_READER_ENABLED) Whether the node can have a text value. defined(LIBXML_READER_ENABLED) Whether an Attribute node was generated from the default value defined in the DTD or schema. defined(LIBXML_READER_ENABLED) Check if the current node is empty defined(LIBXML_READER_ENABLED) Determine whether the current node is a namespace declaration rather than a regular attribute. defined(LIBXML_READER_ENABLED) Retrieve the validity status from the parser context defined(LIBXML_READER_ENABLED) The local name of the node. defined(LIBXML_READER_ENABLED) Obtain the base URI for the given locator. defined(LIBXML_READER_ENABLED) Obtain the line number for the given locator. defined(LIBXML_READER_ENABLED) Resolves a namespace prefix in the scope of the current element. defined(LIBXML_READER_ENABLED) Moves the position of the current instance to the attribute with the specified qualified name. defined(LIBXML_READER_ENABLED) Moves the position of the current instance to the attribute with the specified index relative to the containing element. defined(LIBXML_READER_ENABLED) Moves the position of the current instance to the attribute with the specified local name and namespace URI. defined(LIBXML_READER_ENABLED) Moves the position of the current instance to the node that contains the current Attribute node. defined(LIBXML_READER_ENABLED) Moves the position of the current instance to the first attribute associated with the current node. defined(LIBXML_READER_ENABLED) Moves the position of the current instance to the next attribute associated with the current node. defined(LIBXML_READER_ENABLED) The qualified name of the node, equal to Prefix :LocalName. defined(LIBXML_READER_ENABLED) The URI defining the namespace associated with the node. defined(LIBXML_READER_ENABLED) Skip to the node following the current one in document order while avoiding the subtree if any. defined(LIBXML_READER_ENABLED) Skip to the node following the current one in document order while avoiding the subtree if any. Currently implemented only for Readers built on a document defined(LIBXML_READER_ENABLED) Get the node type of the current node Reference: http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html defined(LIBXML_READER_ENABLED) The value indicating whether to normalize white space and attribute values. Since attribute value and end of line normalizations are a MUST in the XML specification only the value true is accepted. The broken bahaviour of accepting out of range character entities like &#0; is of course not supported either. defined(LIBXML_READER_ENABLED) A shorthand reference to the namespace associated with the node. defined(LIBXML_READER_ENABLED) This tells the XML Reader to preserve the current node. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) This tells the XML Reader to preserve all nodes matched by the pattern. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished defined(LIBXML_READER_ENABLED) The quotation mark character used to enclose the value of an attribute. defined(LIBXML_READER_ENABLED) Moves the position of the current instance to the next node in the stream, exposing its properties. defined(LIBXML_READER_ENABLED) Parses an attribute value into one or more Text and EntityReference nodes. defined(LIBXML_READER_ENABLED) && defined(LIBXML_WRITER_ENABLED) Reads the contents of the current node, including child nodes and markup. defined(LIBXML_READER_ENABLED) && defined(LIBXML_WRITER_ENABLED) Reads the contents of the current node, including child nodes and markup. defined(LIBXML_READER_ENABLED) Gets the read state of the reader. defined(LIBXML_READER_ENABLED) Reads the contents of an element or a text node as a string. defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) Use RelaxNG to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then RelaxNG validation is desactivated. @ The @schema should not be freed until the reader is deallocated or its use has been deactivated. defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) Use RelaxNG schema to validate the document as it is processed. Activation is only possible before the first Read(). If @rng is NULL, then RelaxNG schema validation is deactivated. defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) Use RelaxNG schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then RelaxNG schema validation is deactivated. defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) Use W3C XSD schema to validate the document as it is processed. Activation is only possible before the first Read(). If @xsd is NULL, then XML Schema validation is deactivated. defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) Use W3C XSD schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then XML Schema validation is deactivated. defined(LIBXML_READER_ENABLED) Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored. defined(LIBXML_READER_ENABLED) Change the parser processing behaviour by changing some of its internal properties. Note that some properties can only be changed before any read has been done. defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) Use XSD Schema to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then Schema validation is desactivated. @ The @schema should not be freed until the reader is deallocated or its use has been deactivated. defined(LIBXML_READER_ENABLED) Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored. defined(LIBXML_READER_ENABLED) Setup an XML reader with new options defined(LIBXML_READER_ENABLED) Determine the standalone status of the document being read. defined(LIBXML_READER_ENABLED) Provides the text value of the node if present defined(LIBXML_READER_ENABLED) The xml:lang scope within which the node resides. defined(LIBXML_WRITER_ENABLED) End the current xml element. defined(LIBXML_WRITER_ENABLED) End an xml CDATA section. defined(LIBXML_WRITER_ENABLED) End the current xml coment. defined(LIBXML_WRITER_ENABLED) End an xml DTD. defined(LIBXML_WRITER_ENABLED) End an xml DTD attribute list. defined(LIBXML_WRITER_ENABLED) End an xml DTD element. defined(LIBXML_WRITER_ENABLED) End an xml DTD entity. defined(LIBXML_WRITER_ENABLED) End an xml document. All open elements are closed, and the content is flushed to the output. defined(LIBXML_WRITER_ENABLED) End the current xml element. defined(LIBXML_WRITER_ENABLED) End the current xml PI. defined(LIBXML_WRITER_ENABLED) Flush the output buffer. defined(LIBXML_WRITER_ENABLED) End the current xml element. Writes an end tag even if the element is empty defined(LIBXML_WRITER_ENABLED) Set indentation output. indent = 0 do not indentation. indent > 0 do indentation. defined(LIBXML_WRITER_ENABLED) Set string indentation. defined(LIBXML_WRITER_ENABLED) Set the character used for quoting attributes. defined(LIBXML_WRITER_ENABLED) Start an xml attribute. defined(LIBXML_WRITER_ENABLED) Start an xml attribute with namespace support. defined(LIBXML_WRITER_ENABLED) Start an xml CDATA section. defined(LIBXML_WRITER_ENABLED) Start an xml comment. defined(LIBXML_WRITER_ENABLED) Start an xml DTD. defined(LIBXML_WRITER_ENABLED) Start an xml DTD ATTLIST. defined(LIBXML_WRITER_ENABLED) Start an xml DTD element. defined(LIBXML_WRITER_ENABLED) Start an xml DTD ATTLIST. defined(LIBXML_WRITER_ENABLED) Start a new xml document defined(LIBXML_WRITER_ENABLED) Start an xml element. defined(LIBXML_WRITER_ENABLED) Start an xml element with namespace support. defined(LIBXML_WRITER_ENABLED) Start an xml PI. defined(LIBXML_WRITER_ENABLED) Write an xml attribute. defined(LIBXML_WRITER_ENABLED) Write an xml attribute. defined(LIBXML_WRITER_ENABLED) Write an base64 encoded xml text. defined(LIBXML_WRITER_ENABLED) Write a BinHex encoded xml text. defined(LIBXML_WRITER_ENABLED) Write an xml CDATA. defined(LIBXML_WRITER_ENABLED) Write an xml comment. defined(LIBXML_WRITER_ENABLED) Write a DTD. defined(LIBXML_WRITER_ENABLED) Write a DTD ATTLIST. defined(LIBXML_WRITER_ENABLED) Write a DTD element. defined(LIBXML_WRITER_ENABLED) Write a DTD entity. defined(LIBXML_WRITER_ENABLED) Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity defined(LIBXML_WRITER_ENABLED) Write the contents of a DTD external entity. defined(LIBXML_WRITER_ENABLED) Write a DTD internal entity. defined(LIBXML_WRITER_ENABLED) Write a DTD entity. defined(LIBXML_WRITER_ENABLED) Write an xml element. defined(LIBXML_WRITER_ENABLED) Write an xml element with namespace support. defined(LIBXML_WRITER_ENABLED) Write a formatted xml attribute. defined(LIBXML_WRITER_ENABLED) Write a formatted xml attribute.with namespace support defined(LIBXML_WRITER_ENABLED) Write a formatted xml CDATA. defined(LIBXML_WRITER_ENABLED) Write an xml comment. defined(LIBXML_WRITER_ENABLED) Write a DTD with a formatted markup declarations part. defined(LIBXML_WRITER_ENABLED) Write a formatted DTD ATTLIST. defined(LIBXML_WRITER_ENABLED) Write a formatted DTD element. defined(LIBXML_WRITER_ENABLED) Write a formatted DTD internal entity. defined(LIBXML_WRITER_ENABLED) Write a formatted xml element. defined(LIBXML_WRITER_ENABLED) Write a formatted xml element with namespace support. defined(LIBXML_WRITER_ENABLED) Write a formatted PI. defined(LIBXML_WRITER_ENABLED) Write a formatted raw xml text. defined(LIBXML_WRITER_ENABLED) Write a formatted xml text. defined(LIBXML_WRITER_ENABLED) Write an xml PI. defined(LIBXML_WRITER_ENABLED) Write a raw xml text. defined(LIBXML_WRITER_ENABLED) Write an xml text. TODO: what about entities and special chars?? defined(LIBXML_WRITER_ENABLED) Write an xml text. defined(LIBXML_WRITER_ENABLED) Write a formatted xml attribute. defined(LIBXML_WRITER_ENABLED) Write a formatted xml attribute.with namespace support defined(LIBXML_WRITER_ENABLED) Write a formatted xml CDATA. defined(LIBXML_WRITER_ENABLED) Write an xml comment. defined(LIBXML_WRITER_ENABLED) Write a DTD with a formatted markup declarations part. defined(LIBXML_WRITER_ENABLED) Write a formatted DTD ATTLIST. defined(LIBXML_WRITER_ENABLED) Write a formatted DTD element. defined(LIBXML_WRITER_ENABLED) Write a formatted DTD internal entity. defined(LIBXML_WRITER_ENABLED) Write a formatted xml element. defined(LIBXML_WRITER_ENABLED) Write a formatted xml element with namespace support. defined(LIBXML_WRITER_ENABLED) Write a formatted xml PI. defined(LIBXML_WRITER_ENABLED) Write a formatted raw xml text. defined(LIBXML_WRITER_ENABLED) Write a formatted xml text. defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of AegeanNumbers UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of AlphabeticPresentationForms UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Arabic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of ArabicPresentationForms-A UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of ArabicPresentationForms-B UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Armenian UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Arrows UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of BasicLatin UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Bengali UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of the UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of BlockElements UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Bopomofo UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of BopomofoExtended UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of BoxDrawing UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of BraillePatterns UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Buhid UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of ByzantineMusicalSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKCompatibility UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKCompatibilityForms UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKCompatibilityIdeographs UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKCompatibilityIdeographsSupplement UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKRadicalsSupplement UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKSymbolsandPunctuation UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKUnifiedIdeographs UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKUnifiedIdeographsExtensionA UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CJKUnifiedIdeographsExtensionB UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of the UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of C UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Cc UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Cf UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Co UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Cs UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of L UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Ll UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Lm UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Lo UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Lt UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Lu UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of M UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Mc UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Me UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Mn UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of N UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Nd UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Nl UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of No UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of P UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Pc UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Pd UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Pe UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Pf UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Pi UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Po UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Ps UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of S UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Sc UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Sk UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Sm UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of So UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Z UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Zl UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Zp UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Zs UCS Category defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Cherokee UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CombiningDiacriticalMarks UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CombiningDiacriticalMarksforSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CombiningHalfMarks UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CombiningMarksforSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of ControlPictures UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CurrencySymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CypriotSyllabary UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Cyrillic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of CyrillicSupplement UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Deseret UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Devanagari UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Dingbats UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of EnclosedAlphanumerics UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of EnclosedCJKLettersandMonths UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Ethiopic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of GeneralPunctuation UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of GeometricShapes UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Georgian UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Gothic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Greek UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of GreekExtended UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of GreekandCoptic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Gujarati UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Gurmukhi UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of HalfwidthandFullwidthForms UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of HangulCompatibilityJamo UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of HangulJamo UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of HangulSyllables UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Hanunoo UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Hebrew UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of HighPrivateUseSurrogates UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of HighSurrogates UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Hiragana UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of IPAExtensions UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of IdeographicDescriptionCharacters UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Kanbun UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of KangxiRadicals UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Kannada UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Katakana UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of KatakanaPhoneticExtensions UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Khmer UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of KhmerSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Lao UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Latin-1Supplement UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of LatinExtended-A UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of LatinExtendedAdditional UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of LatinExtended-B UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of LetterlikeSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Limbu UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of LinearBIdeograms UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of LinearBSyllabary UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of LowSurrogates UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Malayalam UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MathematicalAlphanumericSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MathematicalOperators UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MiscellaneousMathematicalSymbols-A UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MiscellaneousMathematicalSymbols-B UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MiscellaneousSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MiscellaneousSymbolsandArrows UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MiscellaneousTechnical UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Mongolian UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of MusicalSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Myanmar UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of NumberForms UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Ogham UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of OldItalic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of OpticalCharacterRecognition UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Oriya UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Osmanya UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of PhoneticExtensions UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of PrivateUse UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of PrivateUseArea UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Runic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Shavian UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Sinhala UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SmallFormVariants UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SpacingModifierLetters UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Specials UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SuperscriptsandSubscripts UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SupplementalArrows-A UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SupplementalArrows-B UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SupplementalMathematicalOperators UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SupplementaryPrivateUseArea-A UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of SupplementaryPrivateUseArea-B UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Syriac UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Tagalog UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Tagbanwa UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Tags UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of TaiLe UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of TaiXuanJingSymbols UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Tamil UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Telugu UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Thaana UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Thai UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Tibetan UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of Ugaritic UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of UnifiedCanadianAboriginalSyllabics UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of VariationSelectors UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of VariationSelectorsSupplement UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of YiRadicals UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of YiSyllables UCS Block defined(LIBXML_UNICODE_ENABLED) Check whether the character is part of YijingHexagramSymbols UCS Block Escaping routine, does not do validity checks ! It will try to escape the chars needing this, but this is heuristic based it's impossible to be sure. This routine escapes a string to hex, ignoring reserved characters (a-z) and the characters in the exception list. Unescaping routine, but does not check that the string is an URI. The output is a direct unsigned char translation of %XX values (no encoding) Note that the length of the result can only be smaller or same size as the input string. compares the two UCS4 values calculates the internal size of a UTF8 character compute the length of an UTF8 string, it doesn't do a full UTF8 checking of the content of the string. a function to provide the relative location of a UTF8 char a strndup for array of UTF8's a function to provide the equivalent of fetching a character from a string array storage size of an UTF8 string the behaviour is not garanteed if the input string is not UTF-8 Create a substring from a given UTF-8 string Note: positions are given in units of UTF-8 chars Unlink a node from it's current context, the node is not freed If one need to free the node, use xmlFreeNode() routine after the unlink to discard it. Note that namespace nodes can't be unlinked as they do not have pointer to their parent. xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 library. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Remove an attribute carried by a node. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Remove an attribute carried by a node. This handles only attributes in no namespace. defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) (Re)Build the automata associated to the content model of this element defined(LIBXML_VALID_ENABLED) Does the validation related extra step of the normalization of attribute values: If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by single space (#x20) character. Also check VC: Standalone Document Declaration in P32, and update ctxt->valid accordingly defined(LIBXML_VALID_ENABLED) Build/extend a list of potential children allowed by the content tree defined(LIBXML_VALID_ENABLED) This function returns the list of authorized children to insert within an existing tree while respecting the validity constraints forced by the Dtd. The insertion point is defined using @prev and @next in the following ways: to insert before 'node': xmlValidGetValidElements(node->prev, node, ... to insert next 'node': xmlValidGetValidElements(node, node->next, ... to replace 'node': xmlValidGetValidElements(node->prev, node->next, ... to prepend a child to 'node': xmlValidGetValidElements(NULL, node->childs, to append a child to 'node': xmlValidGetValidElements(node->last, NULL, ... pointers to the element names are inserted at the beginning of the array and do not need to be freed. defined(LIBXML_VALID_ENABLED) Does the validation related extra step of the normalization of attribute values: If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by single space (#x20) character. defined(LIBXML_VALID_ENABLED) Try to validate a single attribute definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Default Legal ] - [ VC: Enumeration ] - [ VC: ID Attribute Default ] The ID/IDREF uniqueness and matching are done separately defined(LIBXML_VALID_ENABLED) Validate that the given attribute value match the proper production [ VC: ID ] Values of type ID must match the Name production.... [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names ... [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names ... [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens. defined(LIBXML_VALID_ENABLED) Try to validate the document instance basically it does the all the checks described by the XML Rec i.e. validates the internal and external subset (if present) and validate the document tree. defined(LIBXML_VALID_ENABLED) Does the final step for the document validation once all the incremental validation steps have been completed basically it does the following checks described by the XML Rec Check all the IDREF/IDREFS attributes definition for validity defined(LIBXML_VALID_ENABLED) Try to validate the document against the dtd instance Basically it does check all the definitions in the DtD. Note the the internal subset (if present) is de-coupled (i.e. not used), which could give problems if ID or IDREF is present. defined(LIBXML_VALID_ENABLED) Does the final step for the dtds validation once all the subsets have been parsed basically it does the following checks described by the XML Rec - check that ENTITY and ENTITIES type attributes default or possible values matches one of the defined entities. - check that NOTATION type attributes default or possible values matches one of the defined notations. defined(LIBXML_VALID_ENABLED) Try to validate the subtree under an element defined(LIBXML_VALID_ENABLED) Try to validate a single element definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: One ID per Element Type ] - [ VC: No Duplicate Types ] - [ VC: Unique Element Type Declaration ] defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) Check that a value conforms to the lexical space of NCName defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Check that a value conforms to the lexical space of NMToken defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Check that a value conforms to the lexical space of Name defined(LIBXML_VALID_ENABLED) Validate that the given value match Name production defined(LIBXML_VALID_ENABLED) Validate that the given value match Names production defined(LIBXML_VALID_ENABLED) Validate that the given value match Nmtoken production [ VC: Name Token ] defined(LIBXML_VALID_ENABLED) Validate that the given value match Nmtokens production [ VC: Name Token ] defined(LIBXML_VALID_ENABLED) Try to validate a single notation definition basically it does the following checks as described by the XML-1.0 recommendation: - it seems that no validity constraint exists on notation declarations But this function get called anyway ... defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Validate that the given name match a notation declaration. - [ VC: Notation Declared ] defined(LIBXML_VALID_ENABLED) Try to validate a single attribute for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately defined(LIBXML_VALID_ENABLED) Try to validate a single element and it's attributes, basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Element Valid ] - [ VC: Required Attribute ] Then call xmlValidateOneAttribute() for each attribute present. The ID/IDREF checkings are done separately defined(LIBXML_VALID_ENABLED) Try to validate a single namespace declaration for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) Pop the element end from the validation stack. defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) check the CData parsed for validation in the current stack defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) Push a new element start on the validation stack. defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Check that a value conforms to the lexical space of QName defined(LIBXML_VALID_ENABLED) Try to validate a the root element basically it does the following check as described by the XML-1.0 recommendation: - [ VC: Root Element Type ] it doesn't try to recurse or apply other check to the element Callback called when a validity error is found. This is a message oriented function similar to an *printf function. Callback called when a validity warning is found. This is a message oriented function similar to an *printf function. defined(LIBXML_XINCLUDE_ENABLED) Free an XInclude context defined(LIBXML_XINCLUDE_ENABLED) Creates a new XInclude context defined(LIBXML_XINCLUDE_ENABLED) Implement the XInclude substitution on the XML document @doc defined(LIBXML_XINCLUDE_ENABLED) Implement the XInclude substitution on the XML document @doc defined(LIBXML_XINCLUDE_ENABLED) Implement the XInclude substitution on the XML document @doc defined(LIBXML_XINCLUDE_ENABLED) Implement the XInclude substitution for the given subtree reusing the informations and data coming from the given context. defined(LIBXML_XINCLUDE_ENABLED) Implement the XInclude substitution for the given subtree defined(LIBXML_XINCLUDE_ENABLED) Implement the XInclude substitution for the given subtree defined(LIBXML_XINCLUDE_ENABLED) Implement the XInclude substitution on the XML node @tree defined(LIBXML_XINCLUDE_ENABLED) Set the flags used for further processing of XML resources. defined(LIBXML_XPATH_ENABLED) Implement the add operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function. defined(LIBXML_XPATH_ENABLED) An axis traversal function. To traverse an axis, the engine calls the first time with cur == NULL and repeat until the function returns NULL indicating the end of the axis traversal. defined(LIBXML_XPATH_ENABLED) Implement the boolean() XPath function boolean boolean(object) The boolean function converts its argument to a boolean as follows: - a number is true if and only if it is neither positive or negative zero nor NaN - a node-set is true if and only if it is non-empty - a string is true if and only if its length is non-zero defined(LIBXML_XPATH_ENABLED) Converts a boolean to its number value defined(LIBXML_XPATH_ENABLED) Converts a boolean to its string value. defined(LIBXML_XPATH_ENABLED) Converts a node-set to its boolean value defined(LIBXML_XPATH_ENABLED) Converts a node-set to its number value defined(LIBXML_XPATH_ENABLED) Converts a node-set to its string value. defined(LIBXML_XPATH_ENABLED) Converts a node to its number value defined(LIBXML_XPATH_ENABLED) Converts a node to its string value. defined(LIBXML_XPATH_ENABLED) Converts a number to its boolean value defined(LIBXML_XPATH_ENABLED) Converts a number to its string value. defined(LIBXML_XPATH_ENABLED) Converts a string to its boolean value defined(LIBXML_XPATH_ENABLED) Converts a string to its number value defined(LIBXML_XPATH_ENABLED) Converts an XPath object to its boolean value defined(LIBXML_XPATH_ENABLED) Converts an XPath object to its number value defined(LIBXML_XPATH_ENABLED) Converts an existing object to its string() equivalent defined(LIBXML_XPATH_ENABLED) Implement the ceiling() XPath function number ceiling(number) The ceiling function returns the smallest (closest to negative infinity) number that is not less than the argument and that is an integer. defined(LIBXML_XPATH_ENABLED) Compare two nodes w.r.t document order defined(LIBXML_XPATH_ENABLED) Implement the compare operation on XPath objects: @arg1 < @arg2 (1, 1, ... @arg1 <= @arg2 (1, 0, ... @arg1 > @arg2 (0, 1, ... @arg1 >= @arg2 (0, 0, ... When neither object to be compared is a node-set and the operator is <=, <, >=, >, then the objects are compared by converted both objects to numbers and comparing the numbers according to IEEE 754. The < comparison will be true if and only if the first number is less than the second number. The <= comparison will be true if and only if the first number is less than or equal to the second number. The > comparison will be true if and only if the first number is greater than the second number. The >= comparison will be true if and only if the first number is greater than or equal to the second number. defined(LIBXML_XPATH_ENABLED) Compile an XPath expression defined(LIBXML_XPATH_ENABLED) Evaluate the Precompiled XPath expression in the given context. defined(LIBXML_XPATH_ENABLED) Applies the XPath boolean() function on the result of the given compiled expression. defined(LIBXML_XPATH_ENABLED) Implement the concat() XPath function string concat(string, string, string*) The concat function returns the concatenation of its arguments. defined(LIBXML_XPATH_ENABLED) Implement the contains() XPath function boolean contains(string, string) The contains function returns true if the first argument string contains the second argument string, and otherwise returns false. defined(LIBXML_XPATH_ENABLED) Creates/frees an object cache on the XPath context. If activates XPath objects (xmlXPathObject) will be cached internally to be reused. @options: 0: This will set the XPath object caching: @value: This will set the maximum number of XPath objects to be cached per slot There are 5 slots for: node-set, string, number, boolean, and misc objects. Use <0 for the default number (100). Other values for @options have currently no effect. defined(LIBXML_XPATH_ENABLED) Converts an existing object to its boolean() equivalent defined(LIBXML_XPATH_ENABLED) A conversion function is associated to a type and used to cast the new type to primitive values. defined(LIBXML_XPATH_ENABLED) Converts an existing object to its number() equivalent defined(LIBXML_XPATH_ENABLED) Converts an existing object to its string() equivalent defined(LIBXML_XPATH_ENABLED) Implement the count() XPath function number count(node-set) defined(LIBXML_XPATH_ENABLED) Compile an XPath expression defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) Dumps the tree of the compiled XPath expression. defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) Dump the content of the object for debugging purposes defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets difference() function: node-set set:difference (node-set, node-set) defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set) @nodes is sorted by document order, then #exslSetsDistinctSorted is called with the sorted node-set defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set) defined(LIBXML_XPATH_ENABLED) Implement the div operation on XPath objects @arg1 / @arg2: The numeric operators convert their operands to numbers as if by calling the number function. defined(LIBXML_XPATH_ENABLED) Implement the equal operation on XPath objects content: @arg1 == @arg2 defined(LIBXML_XPATH_ENABLED) Handle an XPath error defined(LIBXML_XPATH_ENABLED) Evaluate the XPath Location Path in the given context. defined(LIBXML_XPATH_ENABLED) Parse and evaluate an XPath expression in the given context, then push the result on the context stack defined(LIBXML_XPATH_ENABLED) Evaluate the XPath expression in the given context. defined(LIBXML_XPATH_ENABLED) An XPath evaluation function, the parameters are on the XPath context stack. defined(LIBXML_XPATH_ENABLED) Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function. defined(LIBXML_XPATH_ENABLED) Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function. defined(LIBXML_XPATH_ENABLED) Implement the false() XPath function boolean false() defined(LIBXML_XPATH_ENABLED) Implement the floor() XPath function number floor(number) The floor function returns the largest (closest to positive infinity) number that is not greater than the argument and that is an integer. defined(LIBXML_XPATH_ENABLED) Free up the memory allocated by @comp defined(LIBXML_XPATH_ENABLED) Free up an xmlXPathContext defined(LIBXML_XPATH_ENABLED) Free the NodeSet compound (not the actual nodes !). defined(LIBXML_XPATH_ENABLED) Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in the list contrary to xmlXPathFreeObject(). defined(LIBXML_XPATH_ENABLED) Free up an xmlXPathObjectPtr object. defined(LIBXML_XPATH_ENABLED) Free up an xmlXPathParserContext defined(LIBXML_XPATH_ENABLED) Prototype for callbacks used to plug function lookup in the XPath engine. defined(LIBXML_XPATH_ENABLED) An XPath function. The arguments (if any) are popped out from the context stack and the result is pushed on the stack. defined(LIBXML_XPATH_ENABLED) Search in the Function array of the context for the given function. defined(LIBXML_XPATH_ENABLED) Search in the Function array of the context for the given function. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets has-same-nodes function: boolean set:has-same-node(node-set, node-set) defined(LIBXML_XPATH_ENABLED) Implement the id() XPath function node-set id(object) The id function selects elements by their unique ID (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, then the result is the union of the result of applying id to the string value of each of the nodes in the argument node-set. When the argument to id is of any other type, the argument is converted to a string as if by a call to the string function; the string is split into a whitespace-separated list of tokens (whitespace is any sequence of characters matching the production S); the result is a node-set containing the elements in the same document as the context node that have a unique ID equal to any of the tokens in the list. defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Initialize the XPath environment defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets intersection() function: node-set set:intersection (node-set, node-set) defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Provides a portable isinf() function to detect whether a double is a +Infinite or -Infinite. Based on trio code http://sourceforge.net/projects/ctrio/ defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) Provides a portable isnan() function to detect whether a double is a NotaNumber. Based on trio code http://sourceforge.net/projects/ctrio/ defined(LIBXML_XPATH_ENABLED) Is the name given a NodeType one. [38] NodeType ::= 'comment' | 'text' | 'processing-instruction' | 'node' defined(LIBXML_XPATH_ENABLED) Implement the lang() XPath function boolean lang(string) The lang function returns true or false depending on whether the language of the context node as specified by xml:lang attributes is the same as or is a sublanguage of the language specified by the argument string. The language of the context node is determined by the value of the xml:lang attribute on the context node, or, if the context node has no xml:lang attribute, by the value of the xml:lang attribute on the nearest ancestor of the context node that has an xml:lang attribute. If there is no such attribute, then lang defined(LIBXML_XPATH_ENABLED) Implement the last() XPath function number last() The last function returns the number of nodes in the context node list. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #exslSetsLeadingSorted is called. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) defined(LIBXML_XPATH_ENABLED) Implement the local-name() XPath function string local-name(node-set?) The local-name function returns a string containing the local part of the name of the node in the argument node-set that is first in document order. If the node-set is empty or the first node has no name, an empty string is returned. If the argument is omitted it defaults to the context node. defined(LIBXML_XPATH_ENABLED) Implement the mod operation on XPath objects: @arg1 / @arg2 The numeric operators convert their operands to numbers as if by calling the number function. defined(LIBXML_XPATH_ENABLED) Implement the multiply operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function. defined(LIBXML_XPATH_ENABLED) Implement the namespace-uri() XPath function string namespace-uri(node-set?) The namespace-uri function returns a string containing the namespace URI of the expanded name of the node in the argument node-set that is first in document order. If the node-set is empty, the first node has no name, or the expanded name has no namespace URI, an empty string is returned. If the argument is omitted it defaults to the context node. defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathObjectPtr of type boolean and of value @val defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathObjectPtr of type string and of value @val defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathContext defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathObjectPtr of type double and of value @val defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathObjectPtr of type NodeSet and initialize it with the single Node @val defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathObjectPtr of type NodeSet and initialize it with the Nodeset @val defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathParserContext defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathObjectPtr of type string and of value @val defined(LIBXML_XPATH_ENABLED) Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize it with the tree root @val defined(LIBXML_XPATH_ENABLED) Traversal function for the "ancestor" direction the ancestor axis contains the ancestors of the context node; the ancestors of the context node consist of the parent of context node and the parent's parent and so on; the nodes are ordered in reverse document order; thus the parent is the first node on the axis, and the parent's parent is the second node on the axis defined(LIBXML_XPATH_ENABLED) Traversal function for the "ancestor-or-self" direction he ancestor-or-self axis contains the context node and ancestors of the context node in reverse document order; thus the context node is the first node on the axis, and the context node's parent the second; parent here is defined the same as with the parent axis. defined(LIBXML_XPATH_ENABLED) Traversal function for the "attribute" direction TODO: support DTD inherited default attributes defined(LIBXML_XPATH_ENABLED) Traversal function for the "child" direction The child axis contains the children of the context node in document order. defined(LIBXML_XPATH_ENABLED) Traversal function for the "descendant" direction the descendant axis contains the descendants of the context node in document order; a descendant is a child or a child of a child and so on. defined(LIBXML_XPATH_ENABLED) Traversal function for the "descendant-or-self" direction the descendant-or-self axis contains the context node and the descendants of the context node in document order; thus the context node is the first node on the axis, and the first child of the context node is the second node on the axis defined(LIBXML_XPATH_ENABLED) Traversal function for the "following" direction The following axis contains all nodes in the same document as the context node that are after the context node in document order, excluding any descendants and excluding attribute nodes and namespace nodes; the nodes are ordered in document order defined(LIBXML_XPATH_ENABLED) Traversal function for the "following-sibling" direction The following-sibling axis contains the following siblings of the context node in document order. defined(LIBXML_XPATH_ENABLED) Traversal function for the "namespace" direction the namespace axis contains the namespace nodes of the context node; the order of nodes on this axis is implementation-defined; the axis will be empty unless the context node is an element We keep the XML namespace node at the end of the list. defined(LIBXML_XPATH_ENABLED) Traversal function for the "parent" direction The parent axis contains the parent of the context node, if there is one. defined(LIBXML_XPATH_ENABLED) Traversal function for the "preceding" direction the preceding axis contains all nodes in the same document as the context node that are before the context node in document order, excluding any ancestors and excluding attribute nodes and namespace nodes; the nodes are ordered in reverse document order defined(LIBXML_XPATH_ENABLED) Traversal function for the "preceding-sibling" direction The preceding-sibling axis contains the preceding siblings of the context node in reverse document order; the first preceding sibling is first on the axis; the sibling preceding that node is the second on the axis and so on. defined(LIBXML_XPATH_ENABLED) Traversal function for the "self" direction The self axis contains just the context node itself defined(LIBXML_XPATH_ENABLED) Evaluate the XPath Location Path in the given context. The node 'node' is set as the context node. The context node is not restored. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes is sorted by document order, then #exslSetsNodeLeadingSorted is called. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) defined(LIBXML_XPATH_ENABLED) add a new xmlNodePtr to an existing NodeSet defined(LIBXML_XPATH_ENABLED) add a new namespace node to an existing NodeSet defined(LIBXML_XPATH_ENABLED) add a new xmlNodePtr to an existing NodeSet, optimized version when we are sure the node is not already in the set. defined(LIBXML_XPATH_ENABLED) checks whether @cur contains @val defined(LIBXML_XPATH_ENABLED) Create a new xmlNodeSetPtr of type double and of value @val defined(LIBXML_XPATH_ENABLED) Removes an xmlNodePtr from an existing NodeSet defined(LIBXML_XPATH_ENABLED) Namespace nodes in libxml don't match the XPath semantic. In a node set the namespace nodes are duplicated and the next pointer is set to the parent node in the XPath semantic. Check if such a node needs to be freed defined(LIBXML_XPATH_ENABLED) Merges two nodesets, all nodes from @val2 are added to @val1 if @val1 is NULL, a new set is created and copied from @val2 defined(LIBXML_XPATH_ENABLED) Removes an entry from an existing NodeSet list. defined(LIBXML_XPATH_ENABLED) Sort the node set in document order defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted is called. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) defined(LIBXML_XPATH_ENABLED) Implement the normalize-space() XPath function string normalize-space(string?) The normalize-space function returns the argument string with white space normalized by stripping leading and trailing whitespace and replacing sequences of whitespace characters by a single space. Whitespace characters are the same allowed by the S production in XML. If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node. defined(LIBXML_XPATH_ENABLED) Implement the equal operation on XPath objects content: @arg1 == @arg2 defined(LIBXML_XPATH_ENABLED) Implement the not() XPath function boolean not(boolean) The not function returns true if its argument is false, and false otherwise. defined(LIBXML_XPATH_ENABLED) Search in the namespace declaration array of the context for the given namespace name associated to the given prefix defined(LIBXML_XPATH_ENABLED) Implement the number() XPath function number number(object?) defined(LIBXML_XPATH_ENABLED) allocate a new copy of a given object defined(LIBXML_XPATH_ENABLED) Call this routine to speed up XPath computation on static documents. This stamps all the element nodes with the document order Like for line information, the order is kept in the element->content field, the value stored is actually - the node number (starting at -1) to be able to differentiate from line numbers. defined(LIBXML_XPATH_ENABLED) parse an XML namespace non qualified name. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender defined(LIBXML_XPATH_ENABLED) parse an XML name [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* defined(LIBXML_XPATH_ENABLED) Pops a boolean from the stack, handling conversion if needed. Check error with #xmlXPathCheckError. defined(LIBXML_XPATH_ENABLED) Pops an external object from the stack, handling conversion if needed. Check error with #xmlXPathCheckError. defined(LIBXML_XPATH_ENABLED) Pops a node-set from the stack, handling conversion if needed. Check error with #xmlXPathCheckError. defined(LIBXML_XPATH_ENABLED) Pops a number from the stack, handling conversion if needed. Check error with #xmlXPathCheckError. defined(LIBXML_XPATH_ENABLED) Pops a string from the stack, handling conversion if needed. Check error with #xmlXPathCheckError. defined(LIBXML_XPATH_ENABLED) Implement the position() XPath function number position() The position function returns the position of the context node in the context node list. The first position is 1, and so the last position will be equal to last(). defined(LIBXML_XPATH_ENABLED) Registers all default XPath functions in this context defined(LIBXML_XPATH_ENABLED) Register a new function. If @f is NULL it unregisters the function defined(LIBXML_XPATH_ENABLED) Registers an external mechanism to do function lookup. defined(LIBXML_XPATH_ENABLED) Register a new function. If @f is NULL it unregisters the function defined(LIBXML_XPATH_ENABLED) Register a new namespace. If @ns_uri is NULL it unregisters the namespace defined(LIBXML_XPATH_ENABLED) Register a new variable value. If @value is NULL it unregisters the variable defined(LIBXML_XPATH_ENABLED) register an external mechanism to do variable lookup defined(LIBXML_XPATH_ENABLED) Register a new variable value. If @value is NULL it unregisters the variable defined(LIBXML_XPATH_ENABLED) Cleanup the XPath context data associated to registered functions defined(LIBXML_XPATH_ENABLED) Cleanup the XPath context data associated to registered variables defined(LIBXML_XPATH_ENABLED) Cleanup the XPath context data associated to registered variables defined(LIBXML_XPATH_ENABLED) Initialize the context to the root of the document defined(LIBXML_XPATH_ENABLED) Implement the round() XPath function number round(number) The round function returns the number that is closest to the argument and that is an integer. If there are two such numbers, then the one that is even is returned. defined(LIBXML_XPATH_ENABLED) Sets 'node' as the context node. The node must be in the same document as that associated with the context. defined(LIBXML_XPATH_ENABLED) Implement the starts-with() XPath function boolean starts-with(string, string) The starts-with function returns true if the first argument string starts with the second argument string, and otherwise returns false. defined(LIBXML_XPATH_ENABLED) [30a] Float ::= Number ('e' Digits?)? [30] Number ::= Digits ('.' Digits?)? | '.' Digits [31] Digits ::= [0-9]+ Compile a Number in the string In complement of the Number expression, this function also handles negative values : '-' Number. defined(LIBXML_XPATH_ENABLED) Implement the string() XPath function string string(object?) The string function converts an object to a string as follows: - A node-set is converted to a string by returning the value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned. - A number is converted to a string as follows + NaN is converted to the string NaN + positive zero is converted to the string 0 + negative zero is converted to the string 0 + positive infinity is converted to the string Infinity + negative infinity is converted to the string -Infinity + if the number is an integer, the number is represented in decimal form as a Number with no decimal point and no leading zeros, preceded by a minus sign (-) if the number is negative + otherwise, the number is represented in decimal form as a Number including a decimal point with at least one digit before the decimal point and at least one digit after the decimal point, preceded by a minus sign (-) if the number is negative; there must be no leading zeros before the decimal point apart possibly from the one required digit immediately before the decimal point; beyond the one required digit after the decimal point there must be as many, but only as many, more digits as are needed to uniquely distinguish the number from all other IEEE 754 numeric values. - The boolean false value is converted to the string false. The boolean true value is converted to the string true. If the argument is omitted, it defaults to a node-set with the context node as its only member. defined(LIBXML_XPATH_ENABLED) Implement the string-length() XPath function number string-length(string?) The string-length returns the number of characters in the string (see [3.6 Strings]). If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node. defined(LIBXML_XPATH_ENABLED) Implement the subtraction operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function. defined(LIBXML_XPATH_ENABLED) Implement the substring-after() XPath function string substring-after(string, string) The substring-after function returns the substring of the first argument string that follows the first occurrence of the second argument string in the first argument string, or the empty stringi if the first argument string does not contain the second argument string. For example, substring-after("1999/04/01","/") returns 04/01, and substring-after("1999/04/01","19") returns 99/04/01. defined(LIBXML_XPATH_ENABLED) Implement the substring-before() XPath function string substring-before(string, string) The substring-before function returns the substring of the first argument string that precedes the first occurrence of the second argument string in the first argument string, or the empty string if the first argument string does not contain the second argument string. For example, substring-before("1999/04/01","/") returns 1999. defined(LIBXML_XPATH_ENABLED) Implement the substring() XPath function string substring(string, number, number?) The substring function returns the substring of the first argument starting at the position specified in the second argument with length specified in the third argument. For example, substring("12345",2,3) returns "234". If the third argument is not specified, it returns the substring starting at the position specified in the second argument and continuing to the end of the string. For example, substring("12345",2) returns "2345". More precisely, each character in the string (see [3.6 Strings]) is considered to have a numeric position: the position of the first character is 1, the position of the second character is 2 and so on. The returned substring contains those characters for which the position of the character is greater than or equal to the second argument and, if the third argument is specified, less than the sum of the second and third arguments; the comparisons and addition used for the above follow the standard IEEE 754 rules. Thus: - substring("12345", 1.5, 2.6) returns "234" - substring("12345", 0, 3) returns "12" - substring("12345", 0 div 0, 3) returns "" - substring("12345", 1, 0 div 0) returns "" - substring("12345", -42, 1 div 0) returns "12345" - substring("12345", -1 div 0, 1 div 0) returns "" defined(LIBXML_XPATH_ENABLED) Implement the sum() XPath function number sum(node-set) The sum function returns the sum of the values of the nodes in the argument node-set. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #xmlXPathTrailingSorted is called. defined(LIBXML_XPATH_ENABLED) Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) defined(LIBXML_XPATH_ENABLED) Implement the translate() XPath function string translate(string, string, string) The translate function returns the first argument string with occurrences of characters in the second argument string replaced by the character at the corresponding position in the third argument string. For example, translate("bar","abc","ABC") returns the string BAr. If there is a character in the second argument string with no character at a corresponding position in the third argument string (because the second argument string is longer than the third argument string), then occurrences of that character in the first argument string are removed. For example, translate("--aaa--","abc-","ABC") defined(LIBXML_XPATH_ENABLED) Implement the true() XPath function boolean true() defined(LIBXML_XPATH_ENABLED) Implement the unary - operation on an XPath object The numeric operators convert their operands to numbers as if by calling the number function. defined(LIBXML_XPATH_ENABLED) Search in the Variable array of the context for the given variable value. defined(LIBXML_XPATH_ENABLED) Prototype for callbacks used to plug variable lookup in the XPath engine. defined(LIBXML_XPATH_ENABLED) Search in the Variable array of the context for the given variable value. defined(LIBXML_XPATH_ENABLED) Wraps a string into an XPath object. defined(LIBXML_XPATH_ENABLED) Wraps the @val data into an XPath object. defined(LIBXML_XPATH_ENABLED) Wrap the Nodeset @val in a new xmlXPathObjectPtr defined(LIBXML_XPATH_ENABLED) Wraps the @val string into an XPath object. defined(LIBXML_XPATH_ENABLED) Formats an error message. defined(LIBXML_XPTR_ENABLED) Build a node list tree copy of the XPointer result. This will drop Attributes and Namespace declarations. defined(LIBXML_XPTR_ENABLED) Evaluate the XPath Location Path in the given context. defined(LIBXML_XPTR_ENABLED) [8] Predicate ::= '[' PredicateExpr ']' [9] PredicateExpr ::= Expr Evaluate a predicate as in xmlXPathEvalPredicate() but for a Location Set instead of a node set defined(LIBXML_XPTR_ENABLED) Free the LocationSet compound (not the actual ranges !). defined(LIBXML_XPTR_ENABLED) add a new xmlXPathObjectPtr to an existing LocationSet If the location already exist in the set @val is freed. defined(LIBXML_XPTR_ENABLED) Create a new xmlLocationSetPtr of type double and of value @val defined(LIBXML_XPTR_ENABLED) Removes an xmlXPathObjectPtr from an existing LocationSet defined(LIBXML_XPTR_ENABLED) Merges two rangesets, all ranges from @val2 are added to @val1 defined(LIBXML_XPTR_ENABLED) Removes an entry from an existing LocationSet list. defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type range using a single nodes defined(LIBXML_XPTR_ENABLED) Create a new XPointer context defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type LocationSet and initialize it with all the nodes from @set defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type LocationSet and initialize it with the single range made of the two nodes @start and @end defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type range defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type range from a not to an object defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type range from a node to a point defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type range using 2 nodes defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type range from a point to a node defined(LIBXML_XPTR_ENABLED) Create a new xmlXPathObjectPtr of type range using 2 Points defined(LIBXML_XPTR_ENABLED) Implement the range-to() XPointer function defined(LIBXML_XPTR_ENABLED) Wrap the LocationSet @val in a new xmlXPathObjectPtr libxml2-2.9.1+dfsg1/doc/APIchunk5.html0000644000175000017500000007205412134171042015741 0ustar aronaron API Alphabetic Index O-P for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index O-P for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter O:

    OBSOLETE:
    xmlHandleEntity
    ONCE
    _xmlElementContent
    OPT
    _xmlElementContent
    OUT
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlRegExecErrInfo
    xmlRegExecNextValues
    OUT:
    htmlDocDumpMemory
    htmlDocDumpMemoryFormat
    xmlDocDumpFormatMemory
    xmlDocDumpMemory
    Obsolete
    XML_SCHEMAS_ANYATTR_LAX
    XML_SCHEMAS_ANYATTR_SKIP
    XML_SCHEMAS_ANYATTR_STRICT
    XML_SCHEMAS_ELEM_NSDEFAULT
    _xmlSchema
    _xmlSchemaElement
    _xmlSchemaFacet
    _xmlSchemaType
    Obtain
    xmlTextReaderLocatorBaseURI
    xmlTextReaderLocatorLineNumber
    Ogham
    xmlUCSIsOgham
    OldItalic
    xmlUCSIsOldItalic
    One
    INPUT_CHUNK
    xmlCleanupParser
    xmlParseAttributeType
    xmlSetGenericErrorFunc
    xmlValidateElementDecl
    Open
    xmlIOHTTPOpenW
    Opens
    xmlModuleOpen
    OpticalCharacterRecognition
    xmlUCSIsOpticalCharacterRecognition
    Optional
    _htmlElemDesc
    Oriya
    xmlUCSIsOriya
    Osmanya
    xmlUCSIsOsmanya
    Other
    xmlXPathContextSetCache
    Otherwise
    xmlStreamPush
    xmlStreamPushAttr
    Output
    xmlOutputCloseCallback
    xmlOutputMatchCallback
    xmlOutputOpenCallback
    xmlOutputWriteCallback
    OutputBufferCreateFilenameFunc
    xmlOutputBufferCreateFilenameDefault
    Override
    xmlGcMemSetup
    xmlMemSetup

    Letter P:

    P32
    xmlValidCtxtNormalizeAttributeValue
    PCDATA
    _htmlElemDesc
    _xmlElementContent
    xmlParseElementMixedContentDecl
    PEDecl
    xmlParseEntityDecl
    PEDef
    xmlParseEntityDecl
    PEReference
    xmlDecodeEntities
    xmlParseDocTypeDecl
    xmlParseEntityValue
    xmlParseExternalSubset
    xmlParsePEReference
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    PEs
    xmlParseMarkupDecl
    PITarget
    xmlParsePI
    xmlParsePITarget
    PIs
    xmlDocGetRootElement
    xmlDocSetRootElement
    PLUS
    _xmlElementContent
    POST
    xmlIOHTTPOpenW
    xmlRegisterHTTPPostCallbacks
    PSVI
    _xmlAttr
    _xmlDoc
    _xmlNode
    PUBLIC
    _xmlDtd
    _xmlEntity
    xmlCreateEntityParserCtxt
    xmlCreateIntSubset
    xmlParseExternalID
    xmlParseNotationDecl
    PUT
    xmlRegisterHTTPPostCallbacks
    Parameter
    xmlParserHandlePEReference
    Parameter-entity
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    xmlParsePEReference
    xmlParserHandlePEReference
    Parse
    docbParseChunk
    htmlParseChunk
    htmlSAXParseDoc
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCDSect
    xmlParseChunk
    xmlParseContent
    xmlParseCtxtExternalEntity
    xmlParseDefaultDecl
    xmlParseExternalEntity
    xmlParseExternalID
    xmlParseInNodeContext
    xmlParseQuotedString
    xmlParseURI
    xmlParseURIRaw
    xmlParseURIReference
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    xmlXPathEvalExpr
    Parsed
    xmlParseEntityRef
    xmlParserHandleReference
    ParserInputBufferCreateFilenameFunc
    xmlParserInputBufferCreateFilenameDefault
    Parses
    xmlRegexpCompile
    xmlTextReaderReadAttributeValue
    Parsing
    _xmlParserCtxt
    Part
    xmlRegexpCompile
    xmlSchemaGetBuiltInListSimpleTypeItemType
    Path
    xmlGetNodePath
    xmlXPathEval
    xmlXPathNodeEval
    xmlXPtrEval
    People
    xmlEncodeEntities
    PhoneticExtensions
    xmlUCSIsPhoneticExtensions
    Please
    xmlNormalizeWindowsPath
    Plug
    xmlSchemaSAXPlug
    Pointer
    xmlCheckUTF8
    Points
    xmlXPtrNewRangePoints
    Pop
    _xmlXPathParserContext
    xmlRelaxNGValidatePopElement
    xmlValidatePopElement
    Pops
    inputPop
    namePop
    nodePop
    valuePop
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    Position
    _xmlParserNodeInfo
    Possibility
    _xmlXPathContext
    Precompiled
    xmlXPathCompiledEval
    Predicate
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPtrEvalRangePredicate
    PredicateExpr
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPtrEvalRangePredicate
    Prefix
    xmlNamespaceParseQName
    xmlSplitQName
    xmlSplitQName2
    xmlTextReaderConstName
    xmlTextReaderName
    PrefixDef
    xmlNamespaceParseNSDef
    Print
    xmlRegexpPrint
    xmlShellPrintNode
    xmlShellPrintXPathError
    Prints
    xmlPrintURI
    xmlShellPrintXPathResult
    PrivateUse
    xmlUCSIsPrivateUse
    PrivateUseArea
    xmlUCSIsPrivateUseArea
    Processing
    XML_CATALOG_PI
    xmlParsePI
    Productions
    xmlParseExternalID
    Proper
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlParseMarkupDecl
    Prototype
    xmlXPathFuncLookupFunc
    xmlXPathVariableLookupFunc
    Provide
    getColumnNumber
    getLineNumber
    xmlSAX2GetColumnNumber
    xmlSAX2GetLineNumber
    xmlTextReaderGetParserColumnNumber
    xmlTextReaderGetParserLineNumber
    Provides
    getPublicId
    getSystemId
    xmlGcMemGet
    xmlMemBlocks
    xmlMemGet
    xmlMemUsed
    xmlNanoHTTPContentLength
    xmlNanoHTTPEncoding
    xmlNanoHTTPMimeType
    xmlNanoHTTPRedir
    xmlSAX2GetPublicId
    xmlSAX2GetSystemId
    xmlTextReaderAttributeCount
    xmlTextReaderConstValue
    xmlTextReaderGetAttribute
    xmlTextReaderGetAttributeNo
    xmlTextReaderGetAttributeNs
    xmlTextReaderValue
    xmlXPathIsInf
    xmlXPathIsNaN
    Proxy
    xmlNanoFTPScanProxy
    xmlNanoHTTPScanProxy
    Proxy-Authenticate
    xmlNanoHTTPAuthHeader
    PubidChar
    IS_PUBIDCHAR
    xmlParsePubidLiteral
    PubidLiteral
    xmlParseExternalID
    xmlParseNotationDecl
    xmlParsePubidLiteral
    Public
    _xmlNotation
    xmlExternalEntityLoader
    xmlLoadExternalEntity
    xmlParseExternalID
    PublicID
    xmlParseExternalID
    xmlParseNotationDecl
    Push
    xmlParserInputBufferPush
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRelaxNGValidatePushElement
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlValidatePushElement
    Pushes
    inputPush
    namePush
    nodePush
    valuePush
    xmlXPathReturnBoolean
    xmlXPathReturnEmptyNodeSet
    xmlXPathReturnEmptyString
    xmlXPathReturnExternal
    xmlXPathReturnFalse
    xmlXPathReturnNodeSet
    xmlXPathReturnNumber
    xmlXPathReturnString
    xmlXPathReturnTrue

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/libxml.gif0000644000175000017500000001701411234335462015305 0ustar aronaronGIF87a‘¢÷€Ìøøüø@.g:if'?Òý@Çð”@¼(óÛÒ@|ÈÙâÿ¿´=¡@Öf\ï@@:P(üØÒáÿ¿\O”((lÒҴǃ¡ð€@@´X¡Ùàì=äâÿÿ¿¿hÈ;×ï@Pض\p œ¬`^ äóâÿÿ¿@¿$@ J›,¨àÈ@0äÿ¿( œÒ@ÈÇ×ð¬@PL$ØÙâ\¥ãŽÿ¿p`œþÔÚn=°, €@Ô”J=ç,,ÿ@@¿+‚ ´TP¡ãåÿÿ@¿¿(FÏÒ½„ lfãÿ¿„€ä+ÿ¿Ÿ”x+çÿ ¿”½ç ÿ¿€H+âÿ¿ låã$ äïuÿ@¿@®Ôø=¶,I€Å+¦€@l $´åä¡ÿÿ¿¿@óx â ÿ@¿´läãa’(¸«Ò \ äuÿ@¿€+€­û¢€+€€O+ver€w+ritŸe+ ÿe¿x iö+st i¤€n+g fi+l Ú'Ã/u/EveilardXMLocÉÒ/ýli@b,‘¢þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×ÈžM»¶íÛ¸sëÞp·ïßÀƒó†M3€È“+_μ¹óçПè­tzñë”Gßν;wëÁþ½|cíÞÓ«ïNž`{¢ïÍË7Œ~½ýûÊã ДÿüÿՇ߀êéçßO¨`^èàvV·à„ ˜[´-7[r¢—!sºiHÝ@´4Û~²!t"Š)ª˜"x-B” …4ÂÕ lùi·aŽêXŽÍ)¤…#’£@1®èÞ‘Gšh]’3ºWã” ‚haf™AöÈ¡ˆ*¤$“M²¸¤‹RZ%•lšucƒ\‰œœVBçœEž‰¢“d’‰æFk¶)hXoF‡£…tr ]¢ùåyf{Ó1¹§‘.BÚg™$ªi[…~©!£twb訑ïE £ªz†§$’þOƪP ›ÖŠÕ›µyç‡^Zj„šhæž~ööj‹IÎjë²eu:§• ÎIg´£‚^¥ÂФ¶”.4¦¬ÛžÊì¸[9«k¨‹ÊIm¯AŠûb¶Ä‚Ë­·È‚‹i¦äæË•¹ ²{®´vJçn·ø;é¼ôÎ[¢²ú6|k[,­‡Ÿúûlµ†é$ªi\¬”äÕ[°·—\•¹C~ꣿ‰¶ü«£MŽÙñÁ4ÇK0”¯ŠiòÎQ!z[¨Óvôb¹kž Ãú.Œ¨ÆŠÛ~,®ZomólõR¥>¨uÆ×ær|´^-öMYo½5°8Å\õØl U¶Ù¢Mv²k·mwOoÃM þÜsç,ìÝ€ó”·Þøñ]TØ'nÒà„Ûg8|ŠG^ã(îPˆK®yG”WîÝã˜o.zK{þÝån®zJ¥›n(êý­.{IÂÕn{pÆÞ®ûîÀÍîûïÀ/üðÄoüñÈûÅûòÌ×¾dóÐG?œÒÒWo[òžµî:Üâi¿}ãݯuæØ#æ½ø†þúí’Èþ€ä—Oßûë«Oÿûöߟ^üòv¾þûsÙ—¿B¨šùŸè¾~¯€tÿX¡‚O€43È5 VF´Ö~BX¹ ’p‚T φÁr¯….ÄS ?ÃôÁ°†6l Q8ý€Ð…þ&Ä¡ãnÄfGˆ…#"‡¨ÃòЈxù•¨&64^Ið‡ŸS¢®\–¥ãtN!Ò[U¦#ŒI h*;#“µ)¢ëŒn¬úƘFE¥Ìb½ºã ›xÅuq‹Ü×X—²‰*hftÜø´xE-C‰t$$ÅÈÈGJÌŠXò£†ØCHȼM\×ç~HGˆ!²¾Ò`%߸I²’s(äþÎ É<;rÏP¼ä*'ÑÆN”w&e¨$ÙÊ`V®˜†|²(ǘÊaN³þWÇœåpõØÌvù²šç¬V,¯ÖÍSé²kôì9ÓùϦ²sµÛm¸,¬*Õþtˆu¦'äÑâÒç|B·%Oõm¿ôE•M+­›Æ|ÑY•V‹÷% HôüG)›T„l3æWFÓW;ÍÓBl^åQÌÀz~CMÔ„jÕ‹OG=ÎV?ÖAmq&ÝH<­ÕdÐiíÆû —ŽtÓdµÖÝX1-Ó]âtW}KY]±î¤UÔêD¾Â®~ù,x]ÖRåNÆ××ù&ЋâÑb™Õh]S†]•"-ÑuIZuR|E²±™Á^ýÍ8%Ö`„Ù‹­Ù°ÄÙˆåÙâÒQ<ÐZrJÝÎSm×—-ד­L]m²)ýÙé Ö1WU{}Ûv”Mn%Y¿ý9¬Ò‘× }o³Y3ÕUyþÛAÝz‚uÜ=Tf$MÒ-ÜTåQÝl-QóÜm؃MÙuí[‰§&E~ÔÞv…ز9×®æÓâý¯’ÙÛ‘Íz¸Tß³Ô½ÖË-ßM]ÏÍÞÄ$›$ë—¹Y~~mÔä”ÝÊ-ÚßlÒ±}Ö¾ØH¦ÝÖjMßç7âæw•]|ÃyH¹X‡M;;Ö„Ϥ˜.€˜Ò½â6LàèMTo…Ï”^BÏ:þâëjß[™àhä9ˆ¿ÜËJnâë½iO‡LÝý…H.å¼}ßK4åq#Z[.wÝŒ‚2„¼]æ\®x^.Õ'ŽÎx ÎæìÌnþæ'ÎrîæaÞÒÒüþyn£åŒ±YŽÎ}.Z¬,jsÞÚí8è#Ùæ‚þç¨åNÄëÌç‡Éuçc~èŠî[…•Nç‰Þé~÷é›]¢Ž¤îè ÑZQꦪêÉêYáêÅ ë)ëSé´n^§‘®üëÀì®b\ìÆ~ìÈžìʾìÌžmÃþìÐÎbÀí·G—Ÿ.ˆAkÌþxíz˜íƒ¸íÜ´)»èÙî➺{Xîæ^Ðã^“à¾îfÞîÚðîŽòþíô^ï9èí]þîú.å÷Þïùþïîöèï?²¿êENFfªÑXš· ¯îë¥þÓ»NîÒ¹ïëHÑ¿ñî¾þðMøñ·Ž2cã žÃ$Uϯ*?Ó„Íàªkò“ަJ±ëŠÑ’Kñ…ã³a9œâƒë1U¬<ß2bõòøôAßÛ|ÖºÕðßQèÖ4µNµÙÍM8Fo>;¯×‰MsR‹ó4*ÓR1_õñ-ò?ñ¿•7¢öÞ ö(ªÎÒ¯¯õs6uOU,M–mòÏܪIËõB¼æXhí¯P5.ÐL/ð[ï8ÏÜ_OITŸðU<î]Oâ›dïùÿ÷ã“ù¥=úGÞù¦Ÿh¿Ñ~÷œ_ø¯os±u=Üõ“÷·å¹ßÔ‡ŸÔ÷®ÿûÀù°oûÈÌÊþûÌßüpð)yüÒo‘Á_òÑýŸýó¾ýÜòÞßô¥þHý„QâDŠÀ˜QãFŽ=~RäÈ‘*žD™RåJ–-]¾„SæLš5mÞ¤x‘äNž=}þÔhçP¢EEšTéR¦M!êUêTžB^ÅšUëV®]½f…JUìØ±V¿žE›¶(¶mݾ…Wî\ºuíÞÅ›Wï^¾}ýþÜ–`X²… WU›Xñb—„?†YòdÊ>Í:®œyªYÆ=þNˆYóhÒ¥M—¾|ZõNΠ]¿^,zõlÚµmsL}[wkؽ}s•­[øpâs_Íû÷ræJƒ#‡]:ÈË­_Ç·ùvîHŸO¹òîåÍŸwú=²Û„Ù{lKš-ƹôëÛ|ûó÷çÿ/®þÞÒO$ÿÈ"=dp&õÖs ª÷ƒïÁ²ÂšÐ? u:°Ã íkOBG‘BOä>’&¤*Á_„1ƈ,4Î=CìˆEÉXäQÅñË(CüqH’HY£1$e„2J)›4¬G"¯ÄBÄLÈ ƒ´1Çàt<Ū¨üèI)×dSA4t/Ë2‹äþï½:(Ì¿ÓC ÁÜ2P1ÔGÖl3QE|ó nÄmÏ7 jRuÄCB]òÊ>©ëI2A-kQSOå®Q±>”3SKûÑËpÖBC|ÏÐ Œ”ÔHsMòÌRQ%¶X×TmQÓV%}ÔÈášóÑ^¿œ–Vj= ÕWku]Ù Ê.\qé2¶Üc“U4Wc’Òjß•SZx• s^y·UÛÍÀ¯05Íx+o¥êÐÚOMÉ{çÍ÷Ö…¯ÅvS‰†˜ÉaCëÑ€7Vkਠ~8Z„!ýLMó]W_йå1Û4].°§†S¨I; ž²9æÙ9t±þô’PhŽÏ݉EÆ—YŠ®ðè ŽWf~»mv3¥î9kUcO6`q½±ÓfŸõlP[¶ÒdÑV×Ö¯ë…:ا6Péë6mg­÷¾éêÍ*˹$¿á» ÍÀW¤›Ë»›V5¾gjðwt2É'·ìjÕk8W^MØÆ;åf rÓ½Ëø§¯qN]³Ã¯Yð—é,TlwoÏÓðÓw'êòálM¶uÊ^‡c¼·R¨çYCÕy‡Þ&ß…§¾zŸK…a}Ðæ‰o/zñešÞzóϧ{Æ››ÂNeUüoǧ¿¥òÑÇ_øÍ©:]ÚËÜÚžW?¦ä~ùC xþö';³¡ÈY”W„¢–¦V°"L`£³@Áµ‹W%Ðÿ<4:ùáÇ‚'œ‘U¸Bø¨O{~¢SØr7B?A«„&Da2.öЇ?b¯ãBáÔ‹`:Db£‡A«ÅìcJ„b÷ÆDœýinRÄbËEÅ*Þ7ZcÅÅ݈ьgŒ ‡F6¶ÑÅò}ò£%<õ™Cy SaŸçÚ°¶O‚¢±Ÿÿ`4Ùi2wÔ¡Z<¨Õ™°î!L—AyhF!Ê:Nm¯h3LQ8‰—O–ržÔÀ‘©yâ§IeŠÂTæm¦7=aM‡SžÖO§òéiPÅ÷ÓÑT¨Gã!¿ˆT¦ò¨®kjT³öÔÌUªWeP$µZ¬vÕ«_kXÅ:V²–Õ¬gEkZÕºV¶¶Õ­o…k\å:WºÖÕ®wÅk^õº W¾öÕ¯l`Ã;libxml2-2.9.1+dfsg1/doc/xmlmem.html0000644000175000017500000003412412124524425015513 0ustar aronaron Memory Management
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Memory Management

    Developer Menu
    API Indexes
    Related links

    Table of Content:

    1. General overview
    2. Setting libxml2 set of memory routines
    3. Cleaning up after using the library
    4. Debugging routines
    5. General memory requirements
    6. Returning memory to the kernel

    General overview

    The module xmlmemory.h provides the interfaces to the libxml2 memory system:

    • libxml2 does not use the libc memory allocator directly but xmlFree(), xmlMalloc() and xmlRealloc()
    • those routines can be reallocated to a specific set of routine, by default the libc ones i.e. free(), malloc() and realloc()
    • the xmlmemory.c module includes a set of debugging routine

    Setting libxml2 set of memory routines

    It is sometimes useful to not use the default memory allocator, either for debugging, analysis or to implement a specific behaviour on memory management (like on embedded systems). Two function calls are available to do so:

    • xmlMemGet () which return the current set of functions in use by the parser
    • xmlMemSetup() which allow to set up a new set of memory allocation functions

    Of course a call to xmlMemSetup() should probably be done before calling any other libxml2 routines (unless you are sure your allocations routines are compatibles).

    Cleaning up after using the library

    Libxml2 is not stateless, there is a few set of memory structures needing allocation before the parser is fully functional (some encoding structures for example). This also mean that once parsing is finished there is a tiny amount of memory (a few hundred bytes) which can be recollected if you don't reuse the library or any document built with it:

    • xmlCleanupParser () is a centralized routine to free the library state and data. Note that it won't deallocate any produced tree if any (use the xmlFreeDoc() and related routines for this). This should be called only when the library is not used anymore.
    • xmlInitParser () is the dual routine allowing to preallocate the parsing state which can be useful for example to avoid initialization reentrancy problems when using libxml2 in multithreaded applications

    Generally xmlCleanupParser() is safe assuming no parsing is ongoing and no document is still being used, if needed the state will be rebuild at the next invocation of parser routines (or by xmlInitParser()), but be careful of the consequences in multithreaded applications.

    Debugging routines

    When configured using --with-mem-debug flag (off by default), libxml2 uses a set of memory allocation debugging routines keeping track of all allocated blocks and the location in the code where the routine was called. A couple of other debugging routines allow to dump the memory allocated infos to a file or call a specific routine when a given block number is allocated:

    When developing libxml2 memory debug is enabled, the tests programs call xmlMemoryDump () and the "make test" regression tests will check for any memory leak during the full regression test sequence, this helps a lot ensuring that libxml2 does not leak memory and bullet proof memory allocations use (some libc implementations are known to be far too permissive resulting in major portability problems!).

    If the .memdump reports a leak, it displays the allocation function and also tries to give some information about the content and structure of the allocated blocks left. This is sufficient in most cases to find the culprit, but not always. Assuming the allocation problem is reproducible, it is possible to find more easily:

    1. write down the block number xxxx not allocated
    2. export the environment variable XML_MEM_BREAKPOINT=xxxx , the easiest when using GDB is to simply give the command

      set environment XML_MEM_BREAKPOINT xxxx

      before running the program.

    3. run the program under a debugger and set a breakpoint on xmlMallocBreakpoint() a specific function called when this precise block is allocated
    4. when the breakpoint is reached you can then do a fine analysis of the allocation an step to see the condition resulting in the missing deallocation.

    I used to use a commercial tool to debug libxml2 memory problems but after noticing that it was not detecting memory leaks that simple mechanism was used and proved extremely efficient until now. Lately I have also used valgrind with quite some success, it is tied to the i386 architecture since it works by emulating the processor and instruction set, it is slow but extremely efficient, i.e. it spot memory usage errors in a very precise way.

    General memory requirements

    How much libxml2 memory require ? It's hard to tell in average it depends of a number of things:

    • the parser itself should work in a fixed amount of memory, except for information maintained about the stacks of names and entities locations. The I/O and encoding handlers will probably account for a few KBytes. This is true for both the XML and HTML parser (though the HTML parser need more state).
    • If you are generating the DOM tree then memory requirements will grow nearly linear with the size of the data. In general for a balanced textual document the internal memory requirement is about 4 times the size of the UTF8 serialization of this document (example the XML-1.0 recommendation is a bit more of 150KBytes and takes 650KBytes of main memory when parsed). Validation will add a amount of memory required for maintaining the external Dtd state which should be linear with the complexity of the content model defined by the Dtd
    • If you need to work with fixed memory requirements or don't need the full DOM tree then using the xmlReader interface is probably the best way to proceed, it still allows to validate or operate on subset of the tree if needed.
    • If you don't care about the advanced features of libxml2 like validation, DOM, XPath or XPointer, don't use entities, need to work with fixed memory requirements, and try to get the fastest parsing possible then the SAX interface should be used, but it has known restrictions.

    Returning memory to the kernel

    You may encounter that your process using libxml2 does not have a reduced memory usage although you freed the trees. This is because libxml2 allocates memory in a number of small chunks. When freeing one of those chunks, the OS may decide that giving this little memory back to the kernel will cause too much overhead and delay the operation. As all chunks are this small, they get actually freed but not returned to the kernel. On systems using glibc, there is a function call "malloc_trim" from malloc.h which does this missing operation (note that it is allowed to fail). Thus, after freeing your tree you may simply try "malloc_trim(0);" to really get the memory back. If your OS does not provide malloc_trim, try searching for a similar function.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/structure.gif0000644000175000017500000001266711234335462016067 0ustar aronaronGIF89aôaðÿÿÿ!ù,ôaþŒ©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇòL×öçúÎ÷þ ‡Ä¢ñˆL*—̦ó J§ÔªõŠÍj·Ü®÷ ‹ÇdàŒN«×ì¶û ·ËôºýŽo°û¼ÿ(ˆÒgU8ˆ˜¨¸¨xHåÈ)9I™)uY©¹ÉÙé“ ê9JZj:"ê”zÊÚêúаÊ$ [k{I«¤‹Ûëû[Æ‹$ \l|lFœ¡\ÄŒü qÈ⺶¢@ýÙd_ÛeV šÞ YfeA¢©¡`b¸Ñ’æI6dTe²‘Wš’åˆJ" Ý€ÛQ4B½é_—r¾¸¦i°ÕI ]röYäƒÓ ©(…?êRªŸ0f¥†ÙÅÙÔj‡v’(š)¦£¾zÚE2ê(£j)(h¦‘'þ¨qš8'©2 ,®yʺ$²Ëþù©’±¦j謣Ôʦ²ªZ*ª…½¥v$ Ãkj¥=Ên¸îº sA:[n¶Ëº{/SkåŸ@ž*±ÜRëm%ñá›ï»Ò)à¦éÊ\ŽûÊ ð‘9І"¯•`Â[duä¢[Os™²¤.ß„m‡Œ‘Lå­'<‰t‡¡ö&ÈÝíꦑ‚½ý•@ÅUÁÎ ¯žh%êªX¶ŠVpÉCb#[A°ž¢§…Õc^1[ ¼vÖ£ãeA«nžÖ19lEi?“VÔ¶PÄ` coñZ@V¶8ɳhÙÀÖê%·Ÿˆ-o‹þf5 íÌ·Êê™sof±Ð÷³Çµ†®n5(†6—a‹b-8A\l¬¶º„À‹w`V“R©wG=®t1^òÒo$çÝÓR×ç°qTÛ î â+_¹\·¾S/^5Ù^F#¼‰p€³iK/l» Ó˜"Ãâ_N0XÆ}°¿*•þl¡ 5ÚÀxØ ‡¢Ãîír2L Sb·-Æeü­³¸ÆÍ˜ÊŽÛóø£… Šáöã![Ò½&42Ž•< Jù‚ÔãÔ¯lAbyËÄùD9½ødÊÑŽº=ò÷Ù?qž‘›Œ‹}’ûˆÒ-‚ͺ•¦7‘r^É•¦q6G"V8þ?“¹ÐúT9³B#BÑy£ãE½ËJ7+x†üo¥! Í+>ºYk¢Ÿ°é^ZF™Öô¨Ýihò|ÚDu«ãhg0Ÿº'Ƭ5M7j¥Î[µb®1ã¤7×+Ñ»¶l±‘ËÇ_[úÕU=¶ãJýDe BÚx ö³{}Dk7›Ùðq6åbmjn?–0â¶(¹ñ¬IO×QÛˆ}”·»€CvsµWâ3ÝE¹Œï|ë{ƒ÷Þ·¿ÿ=elO à_5ñ¬ߠ©p7ÉEšÀ]R²‡:]®éîp‰H|ŠÅ»üp¯QâÐvž½§ubL¬¯˜ò|b…r\ˆN8ZÄ‘óþ~Ujæøª¹ÍÄs‘ë ,¸®½ÚsÒ/ÁÕæB·ƒÑ·õ…†Êç.ŸvÌwŽš1èIU'µ™¡¡æåmýèÁ64Òï«]ð´uìP÷'Ç¢¾ÒýüÜêl?±ÛSÍrŨ릭žÁú¨ glQ×­ÿ<4N1¼îð:ðB,øž=ë1ü¤¿]rá!m_ë_8ÿ"H¹ùñsî+…M¿¥§wô‡ov‹›'oSH†oˆ=´…Xèg~Ä")l$†8‰„„†?uˆ Ñ( µþgWˆV˜‰á–…Š^Ö‰dU€Ÿˆˆ¥èDȇ¬Xg§ÈpH‹Ðg(J)ÈhzpVäæX¸huÀˆI‹Èˆ¦Èj¶¶UÄØz-xÂèH—˜† ‘hoõO(i±ØŒÆ8Œr˜‡lacöÑ2{(Eª‡:Tf£äŠî—„Y6œ³Ž¤eïrΔ‚¾àS3( åx€£øý¦\ðͶñ…SêÈÓ~åƒüÇ“ŽyAeÖ3‘T‘Yù˜‘És‘Vñ©aÉ!‰ZòHe2±‘)’+v޳@’‡b’‘Egð’Ù’¼èŒÅu“/1“е‹eÖ“”“:þY‰5” T””‹Sô“¥ð”‚¥Š#—”W•v5•Öu•X´”Ly”T‰:[ 7]é•;ùJç+~#–^••b¶‘k‰DdY–thTª «´KׂzÄü#—‰ó‡ƒTsœ¨*zöƒ„Ù V‹Ýó—€Ù”]…ŠÒP‚Fti‰Lp9—éQ(Xd{Õ‹¦ …’–¸tMU¹ ˜É–Ö&±°Ô`3K§šŠ‰H–yM¦™õäVêÑr§'L§M‘™.“P£‰Œï”¨™šªÙ½Y0Âäq@A䔘|æ+Åt#ɘ¹©›Ù„œÐ±|&¨\ySášž‚5ÿRv¦9cܹ þ†^Ѥ_•Å„‚D;ʹœ&Cò)wö©…îùž-(™SÑ)pTŸô$=Ú£Ñ.ÒR3…vfcŞ݀Ÿj…Qq—x35{t¡?Ä  j–Fô¡RÕ–T¢&šˆ#¢"J—­Ø¢.*¢£›ù•U£Ã°¢ú“¢ù9¢-Ô£>ú¢>¤*Ú”T¤Fz£%”¤Gu¢Ô¤Nº£ð¥;õ¤,š£º¤T¥V:¥æÓ¥Rú£¦^:¦\š¥FÉŒ$š¦ö’lÚ¦†’F˜mqzƒU¦"™§Ji§§}ê§ê´§zzOƒÚ‘†ê“€z§Ï„¨Ù¨ý¨¨‹ LZ‘”º‘ þ‚ôˆ©*K–Z©šº©™Ú©¡*ªèHª¥š‹§º†±ä©Ž:ªª Š© «í“¤³8µºQŠ«wëؽjH¿ =Á*¬âÕª ¦«ÇÊ“´¬Ìª–H¬ÐZIΚ¬„ê¬Ôª­ÛZOsJ§§ã­A¸ âˆdáZq+f®ÑÉHéZ…ºÇÓ†f<ø¦Ê.énz¯[¸˜Ë­Õú¯-8“5阋‰[­a”s¸¦ç4°[:£Cš€gê?eº°‚(±Šª «£ë?kŽ”u¤þ™±…–WªF‹@*\ýJÀÙ5ã)b3 g{ñŠ,Ka€²Eó¥4²¤X¯þ{/Í)a¼i}A{›ËZ!¹³×ö³'ˆ³'إÂU»zñ wS·+û´ª´ªQk‹];®#ë k©´wâR%çå(7+¶ÓZŒkMK bKJe¼y,’d#9¶`kNa;±€[7d[·%‹±H»Šêá!´¡Æâ·d¸[ËH Џr+BI7CV[šè4ZÔ³àT¥ëb3Ž;ŽÑå² ú¶©›† k¸¶- ¥%µ¡ݧ¸ôI¸:µXW2Ö¸ 9TSÀSã>·Êµ—QßzçÂujK_6l!»ŒJ Rꆷ¼g1»š«Y6ïzc‘Ëkßë»×溹«ŽŸ¦(i›&þX;.åA¹ uSo?¼ÃJp·ëY¸N[¾¤Å®R61‘—¾ü5Žà—„ø[^H¸¿8´v‹½[ rž[5ê*¡ÌO†Åˆü~¹DÁ‡ [³˜VË4œò»xâR¨3œËšoq®ž©• ã½ÄV¿d«5ˆa»G[»¼0*V¼ i9œ/°g‚>Ëf'³·Öˆº\Ã*·2S_Þ©•Ås²¬;½›¸! ½×œÝrŬÓÃ>ì³@¼¼YëÄO!£Ãgº|KÀV,¹³‹t] Ç xc´tKijÅpBšCÃ^¼9üƶT~ûBÈô:· Ç5´µ½:Ó½nŒÈ‡œ*’†þ]ª{fv|Ç¡K‹Û²\)gÉLA®+ÆÊ» ü¸ˆl£üÉGgÊìÂÿ9ÊH1ÃæK²§|51"I¸+űì–û»>SœçPXx¬ËŠÇ5ý9¾»|°U<˪\˧Ë0¤ûÊRÜÃýkÌAìÊÊœÊÈËlŒÍ¹<Í[Å™üº¤ Íäg_¨ ÊalÍ%|´$Îð\¸G Qž|Ä+çÇ\IãLδ¬ÏßÁ¡5ËȵU½˜ÆËžx|ÌBvx9hÐÀèб Ð0«pó)Ñå…ÉÍÌÍt¼Ñá¾¼ÊÌø¿w„\Îþy²=¿¢Ù®ÇûI¬ø¾ú*ÊtØÒMÓÍј{³ÌÜÀ‹þ1€¬Î;¹ -|¾°Ï µ ÷À½a¬Á|šÜãl Å\É·|ÌB ÎL½Ö }SÝÍÎì´>Í]:ÕÎ[=@üœÂ |&fÌÖ‰‹ÓZÅþÂ|¬Ä̯'³—yÕƒ Öb–Ñ™«¿Ì¡‚Ý…CÈ†à °‘F„PÍ×bm_yUÖqØ)пÈgû}ïSÓñlÖ´V¼”WÏŒí¶=ØÅ£­ÓËÓ|\ËVa‹ÄÚ9ÝÙ³éu/öÒþŒy—­Å™}Ú‰ÝѤ(Õ= "÷œÏ²ýÕ¿M›ÙؘÈZ»ÅýÆÚE­³‚Bn³jÛÛý¶a|С<Ïͽ%Ï ÔI-Ýþ³üÜÏ}ÇèmÝ“mÔ’†Ø¹#ìÛ¨íÞýF=Ý.ßÌß̽ÍýÝÛò}ëÜœmà:ºÜc!£ÿÝ•DýÝ{}Ûì]¸ >×è$Úï}×%BávýÅ~ŒnÓ~Üø½à9æážâáîâ3Þ²âáϼâˆ"̸ýÏ2j“s±(.ÜçM⸅´AãEj4Žä<>ÓO.à nR á>®“•C°Zšã kå\IáòL1@¯Äöå{5æzpæh5¯PTæ•ý¿@7ÒM²4¾ÔìÚŽq.çfŽçpKf`·6×jˆï¡ŒöøçT*YtŒ è è—m~½Šnþè Þl@‘e‹žÛ`êªdéJ†é°»>Ÿ®–…þR›îß8>á¥þ©/Žê1ÖéCöšÙ‰«Tž|^°š¾êýDš†ùN3Õª¢þµž>L¶¹gÂi¼§ùê<†¾´-T¢yV®•ì5¶ìŸÉgèÕ­ê—®LÄnkF,T^ê¦þ ß9/•¶®e¡ñD:ñ9SñÉyñ•ñ`´ñ&ÔñLúñò™%ïnSòn‘â¾XÑÞb'·ƒÈ­1_H{¾çVFó#Ý 7£çSµ€†@‰¶ –.ß±.V?¯F =_ôJôLŸôD†ŒnäN¿ TOæPOé’J‚HocVí^¯:AŸ?Ø>õX_õfõRô\ï:bo<œºö`Ÿ:nïórO8h¿:t¿ôxàv?:zõZŸõp¿õ~ë‚â|?÷l Œß÷Š?X:ÿæv$ùéšó•où2¯ù›ÏùïùŸú¡/ú£\;libxml2-2.9.1+dfsg1/doc/APIchunk3.html0000644000175000017500000010654112134171042015736 0ustar aronaron API Alphabetic Index F-I for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index F-I for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter F:

    FALSE
    xmlTextWriterStartDTDEntity
    xmlTextWriterWriteDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTDInternalEntity
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteVFormatDTDInternalEntity
    FFFE
    IS_CHAR
    FFFF
    IS_CHAR
    FIXED
    xmlGetNoNsProp
    xmlGetNsProp
    xmlGetProp
    xmlHasNsProp
    xmlHasProp
    xmlParseDefaultDecl
    FREE
    xmlSchemaGetCanonValue
    Facet
    xmlSchemaFreeFacet
    xmlSchemaNewFacet
    False
    xmlBoolToText
    Fetch
    xmlNanoFTPGet
    File
    xmlTextReaderGetRemainder
    Fills
    xmlBufGetNodeContent
    xmlNodeBufGetContent
    Find
    xmlExpGetLanguage
    xmlExpGetStart
    xmlGetRefs
    xmlHashLookup
    xmlHashLookup2
    xmlHashLookup3
    xmlHashQLookup
    xmlHashQLookup2
    xmlHashQLookup3
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlParserFindNodeInfo
    xmlParserFindNodeInfoIndex
    Finds
    xmlChildElementCount
    xmlExpIsNillable
    xmlFirstElementChild
    xmlLastElementChild
    xmlNextElementSibling
    xmlPreviousElementSibling
    First
    XML_SCHEMAS_TYPE_FIXUP_1
    _xmlEntity
    Fixed
    xmlParseDefaultDecl
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    Float
    xmlXPathStringEvalNumber
    Flush
    xmlSaveFlush
    xmlTextWriterFlush
    For
    _xmlParserCtxt
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCtxtResetLastError
    xmlParseComment
    xmlParseElementChildrenContentDecl
    xmlResetLastError
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    xmlXPathSubstringFunction
    xmlXPathTranslateFunction
    Form
    xmlBuildURI
    Formating
    htmlDocContentDumpOutput
    Formats
    xmlStrPrintf
    xmlStrVPrintf
    xmlXPatherror
    Formed
    xmlRecoverDoc
    xmlRecoverFile
    xmlRecoverMemory
    xmlSAXParseDoc
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    Fragment
    xmlNewDocFragment
    Frameset
    _htmlElemDesc
    Frees
    xmlBufferFree
    xmlDOMWrapFreeCtxt
    xmlNanoFTPFreeCtxt
    Front-end
    xmlCharEncFirstLine
    Function
    xmlBufContent
    xmlBufEnd
    xmlBufUse
    xmlBufferContent
    xmlBufferLength
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS

    Letter G:

    GCC
    ATTRIBUTE_UNUSED
    LIBXML_ATTR_ALLOC_SIZE
    LIBXML_ATTR_FORMAT
    GEDecl
    xmlParseEntityDecl
    GET
    xmlNanoHTTPFetch
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    GeneralPunctuation
    xmlUCSIsGeneralPunctuation
    Generic
    xmlCharEncCloseFunc
    xmlCharEncInFunc
    xmlCharEncOutFunc
    GeometricShapes
    xmlUCSIsGeometricShapes
    Georgian
    xmlUCSIsGeorgian
    Gets
    xmlTextReaderReadState
    Gives
    xmlOutputBufferGetContent
    xmlOutputBufferGetSize
    xmlSchemaGetBuiltInType
    Global
    _xmlDoc
    Gothic
    xmlUCSIsGothic
    Greek
    xmlUCSIsGreek
    GreekExtended
    xmlUCSIsGreekExtended
    GreekandCoptic
    xmlUCSIsGreekandCoptic
    Group
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    Grow
    xmlBufferGrow
    xmlParserInputBufferGrow
    Guess
    xmlDetectCharEncoding
    Gujarati
    xmlUCSIsGujarati
    Gurmukhi
    xmlUCSIsGurmukhi

    Letter H:

    HTML_DEPRECATED
    htmlAttrAllowed
    htmlElementStatusHere
    HTML_INVALID
    htmlAttrAllowed
    htmlElementStatusHere
    HTML_NA
    htmlNodeStatus
    HTML_REQUIRED
    htmlAttrAllowed
    HTML_VALID
    htmlAttrAllowed
    htmlElementStatusHere
    Hacking
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    HalfwidthandFullwidthForms
    xmlUCSIsHalfwidthandFullwidthForms
    Handle
    attribute
    attributeSAXFunc
    xmlErrMemory
    xmlXPathErr
    Handling
    xmlCurrentChar
    HangulCompatibilityJamo
    xmlUCSIsHangulCompatibilityJamo
    HangulJamo
    xmlUCSIsHangulJamo
    HangulSyllables
    xmlUCSIsHangulSyllables
    Hanunoo
    xmlUCSIsHanunoo
    Has
    htmlAttrAllowed
    Hash
    _xmlDoc
    _xmlDtd
    _xmlXPathContext
    Hebrew
    xmlUCSIsHebrew
    Hence
    xmlParseNotationDecl
    HighPrivateUseSurrogates
    xmlUCSIsHighPrivateUseSurrogates
    HighSurrogates
    xmlUCSIsHighSurrogates
    Hiragana
    xmlUCSIsHiragana
    Hmm
    xmlSchemaValueGetAsBoolean
    Holds
    _xmlSchemaType
    How
    _xmlParserInput
    However
    docbFreeParserCtxt
    htmlFreeParserCtxt
    xmlFreeParserCtxt
    xmlNodeGetBase

    Letter I:

    I18N
    _xmlOutputBuffer
    _xmlParserInputBuffer
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlParserInputBufferGrow
    xmlParserInputBufferPush
    xmlParserInputBufferRead
    IANA
    xmlCheckLanguageID
    IDREF
    xmlParseAttributeType
    xmlValidateAttributeDecl
    xmlValidateAttributeValue
    xmlValidateDocumentFinal
    xmlValidateDtd
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    IDREFS
    xmlParseAttributeType
    xmlValidateAttributeValue
    xmlValidateDocumentFinal
    IDREFs
    _xmlDoc
    IDs
    xmlXPathIdFunction
    IEEE
    xmlXPathCompareValues
    xmlXPathStringFunction
    xmlXPathSubstringFunction
    IMPLIED
    xmlParseAttributeType
    xmlParseDefaultDecl
    IPAExtensions
    xmlUCSIsIPAExtensions
    ISO
    UTF8Toisolat1
    XML_CAST_FPTR
    isolat1ToUTF8
    xmlCheckLanguageID
    ISO-8859-
    LIBXML_ISO8859X_ENABLED
    ISO-Latin
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    ISO639Code
    xmlCheckLanguageID
    ISOLatin
    _xmlOutputBuffer
    IS_BLANK
    IS_BLANK_CH
    IS_CHAR
    IS_CHAR_CH
    IS_DIGIT
    IS_DIGIT_CH
    IS_EXTENDER
    IS_EXTENDER_CH
    IS_LETTER
    IS_LETTER_CH
    IS_PUBIDCHAR
    IS_PUBIDCHAR_CH
    IanaCode
    xmlCheckLanguageID
    Identifier
    xmlACatalogResolve
    xmlCatalogLocalResolve
    xmlCatalogResolve
    Identifiers
    XML_MAX_NAMELEN
    Ideographic
    IS_IDEOGRAPHIC
    IS_LETTER
    xmlIsLetter
    IdeographicDescriptionCharacters
    xmlUCSIsIdeographicDescriptionCharacters
    Ignore
    XML_SCHEMAS_ANYATTR_LAX
    Ignored
    xmlCopyChar
    Implements
    xmlShell
    xmlShellBase
    xmlShellCat
    xmlShellDir
    xmlShellDu
    xmlShellList
    xmlShellLoad
    xmlShellPwd
    xmlShellSave
    xmlShellValidate
    xmlShellWrite
    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathHasSameNodes
    xmlXPathIntersection
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeSetItem
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathTrailing
    xmlXPathTrailingSorted
    Included
    xmlParserHandlePEReference
    Increase
    xmlExpRef
    Increment
    xmlDictReference
    Indicate
    xmlExpMaxToken
    Indicates
    _xmlSchemaWildcard
    Infinity
    xmlXPathStringFunction
    Initial
    xmlAutomataGetInitState
    Initialization
    xmlInitParser
    Initialize
    docbDefaultSAXHandlerInit
    htmlDefaultSAXHandlerInit
    htmlInitAutoClose
    initdocbDefaultSAXHandler
    inithtmlDefaultSAXHandler
    initxmlDefaultSAXHandler
    xmlDefaultSAXHandlerInit
    xmlInitCharEncodingHandlers
    xmlInitMemory
    xmlInitNodeInfoSeq
    xmlInitParserCtxt
    xmlNanoFTPInit
    xmlNanoFTPScanProxy
    xmlNanoHTTPInit
    xmlNanoHTTPScanProxy
    xmlSAX2InitDefaultSAXHandler
    xmlSAX2InitDocbDefaultSAXHandler
    xmlSAX2InitHtmlDefaultSAXHandler
    xmlSAXVersion
    xmlSchemaInitTypes
    xmlXPathInit
    xmlXPathRoot
    Initially
    xmlSubstituteEntitiesDefault
    Initiate
    xmlNanoFTPGetSocket
    Initilize
    xmlRelaxNGInitTypes
    Input
    _xmlParserCtxt
    xmlIOParseDTD
    xmlInputCloseCallback
    xmlInputMatchCallback
    xmlInputOpenCallback
    xmlInputReadCallback
    xmlNewIOInputStream
    Insert
    xmlListAppend
    xmlListInsert
    xmlParserAddNodeInfo
    Instruction
    xmlParsePI
    Instuction
    XML_CATALOG_PI
    Intended
    xmlSnprintfElementContent
    Internal
    _xmlDOMWrapCtxt
    xmlParseMarkupDecl
    Introduced
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_LOOKUP_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    Irregular
    xmlCheckLanguageID

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/Libxml2-Logo-180x168.gif0000644000175000017500000002000311234335462017152 0ustar aronaronGIF89a´D÷ÿÿÿÿþþþüüüéê餥¡ 14/ûûûrrl--)½½½bb\”•‘452:;8’“ŽÝÝÝ‹Œ‰KLJšš•÷÷÷‰Š†áááôôôÕÕÔÒÒÑæææÐÐÎ$&#ÉÉÅÅÅÀäääÍÍÉKRRµ¶±óóóùùøijfÙÙÙCDA›œ™ýýýððשּׁ©òòò ¹¹²ÙÙÕ‚€ÁÁ½ÕÕÑ896­­¤ÊÊÈqrp,0+òõñ±°©îîî¾¾¹¶¶­lnjDKL€~äåâ;EFopmúúútur°±­Åż')$deb„…‚ÉÉÁèèæºº¬¡¢ž"¹¹µjliefdÜÜÚææäRRMUXVÍÍÆììëÍÍÌxyv°°¥½½µ|}zIJFààÞab`öøõz|yÂÂÀ}~|©ª¥ïñîuwtÁÁ¸íîì­­¡ZZQÆÆÃy{xghf\]Y}}rXYVÀÀ´wxu¡¡™‚ƒîðî~€}ikh\^\684óõòZZY_`]æéêbcastp@B>Z\ZUUQõöô (*'¦¦šVVTZ]]WZZëëé÷úöæèæóóòëìê–˜”…‡„½½° ÐÐÊzúüøÄĹFHD€€t©©¢ŽŒPTS]]TõõõÈȾ¤¤ž‡ˆ…QRPNPL®¯¬QWUúù÷èìíñññìîëAGI  ]a`¾¿½ÇÈÅnnl¦§¥ÔÔÎ=?<º»¹††|-66v IOP!$äæäµµ©ˆˆ„„y%*(©©ŸÛÛØÍÒÔžŸœÖÙÚìîîãäá  %#¼¼¸ŸŸ•üûø ûüùûûú†[[R££œáæéñóð××Õ··´SWWxxqßãæàâßøû÷ÓÓÓÓÖÔØÜÝÌÌÊóöö³´®³³«ÛßàÌÌÃbeeÄľíðñoroˆ‡ƒÄÄÃýþüxxm0::¦¦¡¤£›öúú€€€!ùÿ,´Dÿÿ Häй(\Ȱ¡Ã‡#JœH±¢Å‹3>Ì¥cÂ!"C Ts@£É“(Sª\‰ò€‘¯h K®/+èÜɳ§ÏŸ@ƒ J´¨Ñ£H“ö\ñ—ª„š®ˆ¤É ¥X³jÝʵ+ÖLˆC!Ž ^Óª]˶íÎ eàøGT€-@X1ß¿€ LØï€+¸]Ìxë– ˆ ƒÏ½HLTÀPÂ…çÏ C‹MºSL n̺õPÒ™`ÏL``á…!‚ N¼¸qã¿ ôp‘z€b×УSà!®¥H*°Ø@$Åœ.àËÿO¾¼ù.êT)Ãá ÕÏ£ËgŒ+€‡Pð€Ä”f»°€ú` 9$¨ ‚ ±L” Ú|‹ pˆÅ§“…}a¨¡R(€_°ìdaoÌ@ñ vÄ#!„"£‰à¡ã#Ѝ¢Ê*«L@Æ')¤€"¼ðò@ ¢ƒ €Œ€nÈ\ryX–ö4€ ¦À sÎí4‹¸À, ‘SV°0ÄÓ &À’ÆŠ»|b+Ó€‚¶|ðÁ;†Ú"‡ ñÌàÆ4½TA;J°Ò. 3*PpI`‚Ì¢æ\ÐC\6æn=¼ÿñF,”Ps†ÙæŒb!¼QÁœ¼2cÅ!xaJ«ZÙ©¦)!”´‹!ùü`‰+Õ`ÓÉ5Üv{Ͷ×L"î$gœ±È"¦"È:û˜{† }ôÐǯ¤0’ƒ$xÃA XîŠj ¡ÇÁ˜Ô.˜«®:­ÀÁ-fip,Ì PøÕ Ko˜°•³ðç‚ â!Ê gØóm50WÓÉÌåÔ\θ“\Sιê r%õTJ9Ýô`tò¼ÂŠˆPÀ_”уÃKUðE 1YD(‚ è%¶Rbƒ©×®gó4@%Y(t‚-ÞH‚DÄ‹@ñ@<¡h5ÿ»ÐNxö°EÐ8Á ö¸‚3¹åš{î"êžÑ‡7Xì È;œáÍ(c 1†RÈË+…ð %2¨b*/¶`!ɰ»Ö}wÙ,VJì-a¦ f™U€nï¨U`¼ &ß{s‡eÇ{jH¯™ï®Ye(ÔÄ@1wɦdq·nprjÈ<òH¤ùÉ+T ‰T€B ”û8Ï=« ¹ u£d†3tc ‡dÀ>ÈÀ pF!&8ÁWØÂ SÈÁ0Òà (`€Y&’BŒ‘‡+(ä P†rZÐ (Ç3=~Ã(@Gc z°€Øp9•€Åÿ€‚*@Á ,p[€åTBx.¨Å7b À@YÉQ„» 0PA €Ã7HBð­`ñö„d0à&ˆÂïêŸ-·6@î ß ƒ èPÌc"eà‡Pâ$7¸!54ÂS¨ÅÞ>è“EˆO!LjB´ è!zP@ P†"XA!/˜]’pµÐ¡¸È€êð‚$”á Cx€Ÿ&`á¶àÅ Úð‚:t€’P/p…OT7Èâ[> ÚˆˆX,!0ÚHÀ 1ÀÔ‘lH—{†96T¶8(°ÿÀ1€ ‚èÉ'¡ÎpG3–qŽtˆƒt¸ä ;ø¤veÈ ;¸!0DH  x#XkÄN 1pAˆ+D."`ƈ€µlâX£À&@jÊqT›Ã5³©ET€w²ŸlB5Ñ;D ‚CD X&Pçßt2vº“ J`úÁÖ¶¶5sµ8Ø%ØÐ‡KŒt`Å`Wò f0ƒTà„1€! t.j!`ræø—E{‚ÑÙ•¤ö‰B2'¼£ÈÀ;6A±8Ânó„$ ‹GàíÔÀO ¸`…ÿ$`”xÂrŠ(„å"€BÀpŠS,U›:yª3‘m€ò  À1–`xmjbUˆšJÀ:2=èØÀVò’w­‚(Ôàr,¢륃-'8Ð s†@:èáG°ÂÌ`ˆ+Ðq¢‘-ÁdyRY…|‚ : „ ò…dçЂB’q ¥@ŨŽ21ˆÑVõ(>À žÐ…ø¢ÙÃ)R `ºµ°'–pܦ*7ˆBŽ¡=7,?È"n€ÀbÁo+À]ï²ã tíÃx·l9uÁW |ÀÂ"¼!ƒ6À=ˆ€qF(Äÿp ‹ƒ×ÁM80d%{ÑŒJ<€A>€Y ¸á˜5Æ¡il¿ap ØD£P LCh±tm@‚xl⦠4.ýÌJÀÈ=~ Tœ 7@àšnXE‚±<È¡‰œ|Ÿ”©ÜÝ:²CG;Ú¼!–Ù hpBèÚ~£¯ð†¬b1à¢2˜sêl…:4ÁÀM0”“ëçc„¡ ¶Ð€7Ô`[7<³Ôø-è¡d£Æ ˆ4Ö@ÌàÐ\ÌŽ4˜#ŠP5¢ðƒè¢¥†«X… ש«þâ4Äc á=@€4Õ'$ÿ㵕%ñ†XÄBVo`9F1L<ƒ ìH,Áó¾A3Cc§@ˆàB˜3íüm=‹»“YÈjBaƒø+½PHòpŠW‚‚3Á&ðãbè2*FèïÈ €/Hpƒ\€°Á!h÷­{¢Š$°E*ðœ§fUã, F>¦ñM`-@H0””WÙ×Pˆ…%ÀsKLŽhC-a‰o| œgDÐQ¬k( ¤  $=ÛKïvÓÃÍçý„Oêœ`ÇBP‰”b/hG<ÂBoÀ-„ŠÁ€ØÝ ~‚q„Q‚1€ÿBÂQ…/,L •¾qˆ€ ª 0a>aÁ>¹ȪÄà HŸõ@1@1¼@rð0Q¦]:¡r¾F `C.Äy|¥föž'/lPRp€5ð"|À —£€tJ·mLnÖ{&b ÞG° ^âêi žÁžÓã;ò¹ÙÑç‰!¹a a©+ûÆÃìI™3㈧8ÆéïñÐÊÀ’  ° €pIrI>°_˜à¸wXG'pxæt.H6csBQ6F1£&b£5Z6Š¡1ÊÐj uHyB¡P6`<@½ðµà(3` * "*—»àfÀ IsÖš8`àùt3¦`=p(P’5¨€^;ဠk`aÐì€ÓP µð“Q¥qé4¤Ð £€|zÜÉ—ÞF`0˜kÿÁ!ÕCœ®Á†‘oŠ’¿! ŒÚ‡õØ]9À{€ sÊvJØè¤Öä§Õ‰xÐv™ rFm{Ù¢MX:P‘â‰{Ñ!ÍC&°°C̱”Ña!ذ;„™ 4&ôÉrBÆ™ ¨s¢ÊÛÈŽå§,Ò À `wY¨ `,zM@´p«€)ž¸¡ê£>퓞”Y ; •P|( ÐÏ ,lÚ¯ò P`r|Q¬%p¬¶â>•·©­ ú¢¤ÖÚ$Ð Ô B®µçªÙz*èf@fÀ®á¹+” ^3ÿ›oÐ0Ì2˜¬0ƒ` «  uÈ]Ù€$À S° ‹ S™^°¸Ï–:[¤ ­—À ̰ ¨ªIJ§@àZÔI»@P—0 '8®D`X^º¢-j-»®¸º&ð´Jò€5 `%¥1_°° 7D«=¦ø=®Q¦`#` Êà.г ‘8ÿ ;šú•*­ @*À { @­k°9¢VêIÛ Уp¢©À¥þ%«Gà†P#€³bú,’  $5,€%+€»µ 4 aEݹ­Á,ð Rÿ']?@E ½¤¥¥Z° V£ë¦LÉ©—p ©¶ú€ ck£0 T—»àAŸÂ_xP [ðW‡e®´Ú² Æ£ã)?ÛÀVd ðd°6õA…¢ º€½ Q íðçà価PPÀ ° \€Y qzèI«Ï: £»—€º`«ºÛp±k—9PÀNÐS,²°zÝ™¨5’‰0Á™Z¦’pÁ Q <P­²•ð ð pì` #üÅ@ !p%ísvü¢+À}Á%ÒÇÈk¾  ØDÿð”Oé ±4 7ïû¦U¦A¸[¿C¬œ¬RÐÕ‘] —À€þ{>  «ó`L€ƒ 9Ю>]Ìq`õ°‡=º†1ðb0j‡Ç\€ds• –y4°`A”Dç©<%б2+•€..+Ëq+á#Kˆü/ °(ð…[¨ÀûõÊÁ[.Ú²½­ÿÐ ËÑ qØL5ž&@‹7¥¤ ɬspÀP¹\•Ë §  `K70“¤­ ° AP¹LàAÐÎ ÊÀÏ Kw |X›pÂ6, ö'ÏÂMÏ~àN€ Åmf}Ö#~‚  Žæ!zNóc0 y-‘± 9¤Þ‚MÁ\Ø(Ø\j°Þ"€ÌQw5ænÑ5BÔ•rp¬€œ žðÞaåQP¹65eáì ‡‰‰<, ’M JÐÀ½<ñ¬S0TPž !.®vž ü ªÀÐÀŒàDp Øm Á~Ý #ÿ@ ámÑjÃãåíãqR°:ж@Xpž€ A ‡ÖÎàÂKXÊjSW npo ¡Å cíÌ ñæ(Ì*p=³ µ°Á= Ïš`à~0@ äáÌ~¢Ì^PÀc€I2 À ’¡5݆®-+Ëè#0-ÞNÞ`ÞÚ?Pr¯n   X® 6Ðp8œ ðj 1 ÀxMZ½wÐ3 i p OÐÎÀ0 4€`Þ’Ð*k³Th ùð 4辺Fº•œm€h j0@Õ@(¿H\Ê⊠ ¶¢}ÿ‰®xëíÞM # # 9ž©;nîè.2ñC“ÞîïŽå`,Â(óÅ0 \0m_pJdÈO äï" êwÃ1¾.ñˆ"DëúÀiz ÓñÁ]ºž rï9$¯ÈÎ@2@Dàv¯ý¥Û–×2ÿ± ‘à×8/ ŠÏóäNØ@ÏѬÂ&»lôðþÅíp1ÀîåÍ7  @À'hh  ÛEäKðaðîbÇ,öìÐ^à• LˆÀiÓ 3À[ëöb=±pI6-÷t ò~€uðhÐÇ_gtp„ðm0ðæ¢[à#‰ÿ`øˆŸóŠ/ ŒÏèŽoØ`šEðî^ù%Ìê  ëqpùÃÌsP rP¦‹ <Pð * P„® vˆÑ ‰ ^TøòÂÌ©¶:¨ ðÌ‹ $T®T¹0ÀÊ%8È‘!È<‡’$i£  Õh³j&^)ô8xÐHU„ŽðÂñ)C ^„"áÙÒjÄa† ‰–cÊsJ `©r@.µñ¸Á«’eö,T`ãá¡…¥Ú©S&Åå=v_°ð ä’o=* ”ˆPaÁ†-˜XQ"FI‹Xð:´é1’ÐPFR…¶+]Â”é æÿ‰ GŽÌéŒ;$H@à/2dðH!ÄÍDW©Aôͼ&[¶úvˆ,²fѪeÛömÜ…sE„d'€·—ú¥¸ `Xœ, ¦¯Ê†2`‡ þÂP'„² È Ëør¢Ê(ÚìŒèa 2táâMÞ±ÏBÀ ¶–‚ ƒ™rå +¬"7Ýæ B‡QôøÄy OjbŒ+t”)R'ˆU®ÚpHáÎ;Y¢,무֊mÐ+H 6¹€†àB ”£¾ÀºTfµ‚â€# Úxd8\Rd8(bÁB#!3!,(”ÿ”Ù,6xÿf — †"pDfs (Ù…BN¨ã„?þpñEpH‚—U>9„VyÀŽ1ìhÄŠOR˜UT©Ž#¶ëN¬(0b*†Y@òbÃÆ T\Š£˜b°Ï“'p0ž H5 †‚vla”„wN™À¥=nÀ"‚Caà¢LÌÚdB„<†MDÓÑ…l˜A™II´€L! ˆv™ Ž&®¸¢ŽOÿb‚)xF•O¬pb˜OÌ`â!V&8ă-æÐÁ©'•EX| ÉŒ¼áƒÚÀØÄ,™S´-(“%ŒY”0fØÄŒ…tâ xƒ1ƆÚiÿ$€w>x—˜aoèý^†ÂˆgÞ…pW—« º†w>á×¥dfÀ¢J^¡/ÍA&š0ÄÀ¾âGP•`‹1Æä„6y~VIÂ:æù¤^H–°\Öd¨àzP À”œYÚ[‡¹]‚¡Ž} åY‚x±#L2ô±™r`š2ht‚6Ú¶½z”_è“xŠçÏè= …ؽ]CŽ2LÉÛD•vf¡ ¦wi„äÁwÿ=ü˜çŠ Æî$À¸‚x ©#Zh”^&,dX#sP "à… ¬À<XÃâ8$Ã$ø ,@ÿ|c üp l`'à GhÁ`&Ôì¨B~plàUàÇ fЀ Ú€œ°@ Ð1ð DPÂP„A¤P5ÈCb;öÀ ~ 0àA2qFGèC¢øÆ8‘@‚Lê1‹øÀÊ„‘;2ƒ$!9ˆApMRD®À"–ïDé€FøÅvaºÔb!` `ž H"C-j‘†¨ã ¶¨GDbŽUÎ $@24ÐäR¹¼Á¼Q†gDÀP°Ìà”è€9:ð4¤A€2ÓPÿ˜P¤ù ói8å 6àL[¤áÓ`ç4z±€zlà°(Ol\ ˜T ehÌƈ9T %(A…pP„"´ Œ`hCga*ä ·è…º€|Òu&p.`L¬+@AI#ðŒ\€¤(8)À<£ e)ÊÀI°€’àÀ.àR(„  %U†M/@S,¬ë§jR˦~T©!HiŒiÔ”–¤%-©M9 H06°(H˜P°:b€X`Æ 0*ÄU®s¥k]í×]äU¯»<0†^ØÂf+K0˜Â°`ìbaÁ‚ô€ÿ°(A ËXÊšÂP,,zð¸ &@‚ *`Y`@³–e¬N'ÛÚÆb¬mle/ \öµ.¨,jsûÛl…m ð…°ðÂ: nu­{]ìfW»:˜&Hu AÈ(¥p^¢uë]/zÑË^ø@¾XAzÝëÞò `ô­ï}ýËÞûØ¿”"p[pœk†E,,Pot€•ä4e…-|a gÃ3p¥:4ô H nM|b§XÅ+f±J€ !ÒàƒMP‚7ô”¤Þð†|üc YÈC²7BzSIÀbÄ%ànq“üd(˜ÒÀˆŠlAgØH Xà@¦c&s™Í|æ3C’è La‚¤7Ês¦sS¼…€‚ÿÀAApG´rÙ´¦m¡ }hD'ZѪ-è+g;GZÒu®@Ÿ€ƒdúÅ` bsÞõÎWÔ£&u©M-êþNZÕ«Žò ˜PAdZÖWÐDr¡ \|ɬæu¯}â|ªÈE4qY'[ è^³ýlhG[ÚÓ¦vµ­½¨!ÙÛ&Â!& ƒb_[Üã&w¹ÍMí\p÷{Nv@;libxml2-2.9.1+dfsg1/doc/docs.html0000644000175000017500000001670212124524424015145 0ustar aronaron Developer Menu
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Developer Menu

    Developer Menu
    API Indexes
    Related links

    There are several on-line resources related to using libxml:

    1. Use the search engine to look up information.
    2. Check the FAQ.
    3. Check the extensive documentation automatically extracted from code comments.
    4. Look at the documentation about libxml internationalization support.
    5. This page provides a global overview and some examples on how to use libxml.
    6. Code examples
    7. John Fleck's libxml2 tutorial: html or pdf.
    8. If you need to parse large files, check the xmlReader API tutorial
    9. James Henstridge wrote some nice documentation explaining how to use the libxml SAX interface.
    10. George Lebl wrote an article for IBM developerWorks about using libxml.
    11. Check the TODO file.
    12. Read the 1.x to 2.x upgrade path description. If you are starting a new project using libxml you should really use the 2.x version.
    13. And don't forget to look at the mailing-list archive.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk13.html0000644000175000017500000017457512134171042016033 0ustar aronaron API Alphabetic Index d-d for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index d-d for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter d:

    dangerous
    xmlTextReaderCurrentNode
    data-type
    xmlSchemaCopyValue
    datatype
    xmlSchemaGetBuiltInListSimpleTypeItemType
    day
    ftpListCallback
    day:minute
    ftpListCallback
    de-coupled
    xmlValidateDtd
    deactivated
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    deallocate
    _xmlParserInput
    xmlCleanupParser
    xmlDecodeEntities
    xmlListDeallocator
    xmlParserInputDeallocate
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlXPathFreeNodeSetList
    deallocated
    xmlDictFree
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlGetFeaturesList
    xmlHashFree
    xmlNewTextWriter
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlSaveUri
    xmlTextReaderConstBaseUri
    xmlTextReaderConstEncoding
    xmlTextReaderConstLocalName
    xmlTextReaderConstName
    xmlTextReaderConstNamespaceUri
    xmlTextReaderConstPrefix
    xmlTextReaderConstString
    xmlTextReaderConstValue
    xmlTextReaderConstXmlVersion
    xmlTextReaderGetAttribute
    xmlTextReaderGetAttributeNo
    xmlTextReaderGetAttributeNs
    xmlTextReaderLookupNamespace
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlTextReaderReadString
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderSetSchema
    xmlTextReaderValue
    deallocation
    xmlListRemoveAll
    xmlListRemoveFirst
    xmlListRemoveLast
    deallocator
    xmlHashFree
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlListCreate
    debug
    DEBUG_MEMORY
    xmlCatalogSetDebug
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpDTD
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpEntities
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlRegexpPrint
    xmlSnprintfElementContent
    debugging
    DEBUG_MEMORY
    DEBUG_MEMORY_LOCATION
    LIBXML_DEBUG_RUNTIME
    xmlCatalogSetDebug
    xmlXPathDebugDumpObject
    decimal
    xmlXPathStringFunction
    decl
    XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    xmlAddAttributeDecl
    xmlNewDocElementContent
    xmlNewElementContent
    declarations
    _xmlXPathContext
    htmlParseCharRef
    startElementNsSAX2Func
    xmlParseCharRef
    xmlParseEntityDecl
    xmlParseEntityRef
    xmlParseEntityValue
    xmlParseExternalSubset
    xmlParseMarkupDecl
    xmlParsePEReference
    xmlParseSDDecl
    xmlReconciliateNs
    xmlSAX2StartElementNs
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteVFormatDTD
    xmlValidateNotationDecl
    xmlXPtrBuildNodeList
    declare
    xmlParseEntityRef
    xmlParserHandleReference
    xmlSearchNs
    declared
    _xmlElement
    _xmlParserCtxt
    xmlParseAttValue
    xmlParseAttribute
    xmlParseAttributeType
    xmlParseDefaultDecl
    xmlParseElementDecl
    xmlParseEntityDecl
    xmlParseEntityRef
    xmlParseNamespace
    xmlParseNotationType
    xmlReconciliateNs
    xmlTextReaderStandalone
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    declaring
    xmlGetID
    decode
    xmlDecodeEntities
    def
    xmlParseAttributeListDecl
    xmlParseAttributeType
    defaulted
    XML_COMPLETE_ATTRS
    _xmlParserCtxt
    startElementNsSAX2Func
    xmlSAX2StartElementNs
    xmlTextReaderIsDefault
    defaultexternal
    xmlSetExternalEntityLoader
    defaults
    xmlShell
    xmlXPathLocalNameFunction
    xmlXPathNamespaceURIFunction
    xmlXPathNormalizeFunction
    xmlXPathStringFunction
    xmlXPathStringLengthFunction
    define
    DEBUG_MEMORY
    XML_CAST_FPTR
    xmlHandleEntity
    xmlSchemaGetCanonValue
    defined
    WITHOUT_TRIO
    WITH_TRIO
    _xmlXPathContext
    xmlGetNsList
    xmlHandleEntity
    xmlNewEntity
    xmlNewNs
    xmlNodeGetBase
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseElementContentDecl
    xmlParseInNodeContext
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSearchNs
    xmlSearchNsByHref
    xmlTextReaderIsDefault
    xmlValidGetValidElements
    xmlValidateDtdFinal
    xmlXPathNextAncestorOrSelf
    defining
    XINCLUDE_FALLBACK
    XINCLUDE_HREF
    XINCLUDE_NODE
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    XINCLUDE_PARSE
    XINCLUDE_PARSE_ENCODING
    XINCLUDE_PARSE_TEXT
    XINCLUDE_PARSE_XML
    XINCLUDE_PARSE_XPOINTER
    xmlGetID
    xmlReconciliateNs
    xmlShellDu
    xmlTextReaderConstNamespaceUri
    xmlTextReaderNamespaceUri
    definitions
    _xmlNode
    startElementNsSAX2Func
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlPatterncompile
    xmlSAX2StartElementNs
    xmlTextReaderPreservePattern
    xmlValidateDtd
    defs
    _xmlSchema
    _xmlSchemaElement
    delayed
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    delegation
    xmlCatalogSetDefaultPrefer
    delete
    xmlNanoFTPDele
    deletion
    xmlCatalogSetDefaultPrefer
    dependant
    xmlXPathContextSetCache
    depending
    xmlIsID
    xmlIsRef
    xmlListDataCompare
    xmlParseReference
    xmlXPathEqualValues
    xmlXPathLangFunction
    xmlXPathNotEqualValues
    deprecated
    LIBXML_LEGACY_ENABLED
    _htmlElemDesc
    _xmlURI
    htmlAttrAllowed
    htmlElementAllowedHere
    htmlElementStatusHere
    htmlNodeStatus
    xmlCheckLanguageID
    xmlCreateEntitiesTable
    xmlDecodeEntities
    xmlInitializeDict
    xmlNodeDump
    xmlParserHandleReference
    xmlParserInputRead
    xmlScanName
    depth
    _xmlParserCtxt
    _xmlValidCtxt
    xmlPatternMaxDepth
    xmlPatternMinDepth
    xmlTextReaderDepth
    deregistration
    xmlDeregisterNodeDefault
    xmlDeregisterNodeFunc
    derivation
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
    xmlExpExpDerive
    xmlExpStringDerive
    des
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderSetSchema
    desactivated
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderSetSchema
    descend
    xmlDOMWrapCloneNode
    descendant
    xmlXPathNextDescendant
    descendant-or-self
    xmlXPathNextDescendantOrSelf
    descendants
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    described
    xmlStreamWantsAnyNode
    xmlValidateAttributeDecl
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidateRoot
    describing
    docbParseDoc
    docbParseFile
    docbSAXParseDoc
    docbSAXParseFile
    htmlCreateFileParserCtxt
    htmlParseDoc
    htmlParseFile
    htmlSAXParseDoc
    htmlSAXParseFile
    xmlFindCharEncodingHandler
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    description
    _htmlElemDesc
    _htmlEntityDesc
    htmlElementAllowedHereDesc
    xmlCopyDocElementContent
    xmlCopyElementContent
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlIsMixedElement
    xmlNodeSetLang
    descriptor
    htmlCtxtReadFd
    htmlReadFd
    xmlCtxtReadFd
    xmlMemDisplay
    xmlMemDisplayLast
    xmlMemShow
    xmlOutputBufferCreateFd
    xmlParserInputBufferCreateFd
    xmlReadFd
    xmlReaderForFd
    xmlReaderNewFd
    xmlSaveToFd
    xmlSaveToIO
    designed
    xmlCharEncodingOutputFunc
    desired
    xmlBufferResize
    xmlIOHTTPOpenW
    xmlUTF8Strloc
    xmlUTF8Strpos
    destination
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlIOHTTPOpenW
    xmlURIUnescapeString
    destroy
    xmlTextReaderCurrentDoc
    destroyed
    xmlAddChild
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlTextReaderCurrentNode
    xmlTextReaderSetup
    destruction
    xmlDeregisterNodeDefault
    details
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    detect
    xlinkIsLink
    xmlCreatePushParserCtxt
    xmlInputMatchCallback
    xmlKeepBlanksDefault
    xmlOutputMatchCallback
    xmlXPathIsInf
    xmlXPathIsNaN
    detected
    CHECK_ERROR
    CHECK_ERROR0
    endDocument
    endDocumentSAXFunc
    endElement
    endElementNsSAX2Func
    endElementSAXFunc
    reference
    referenceSAXFunc
    startElementNsSAX2Func
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkIsLink
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlSAX2EndDocument
    xmlSAX2EndElement
    xmlSAX2EndElementNs
    xmlSAX2Reference
    xmlSAX2StartElementNs
    xmlSchemaIsValid
    detection
    docbCreatePushParserCtxt
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkGetDefaultDetect
    xlinkNodeDetectFunc
    xlinkSetDefaultDetect
    xlinkSimpleLinkFunk
    xmlCreatePushParserCtxt
    xmlIsID
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    determine
    xmlC14NExecute
    xmlCharInRange
    determined
    xmlXPathLangFunction
    determinist
    xmlAutomataIsDeterminist
    xmlRegexpIsDeterminist
    dict
    _xmlDoc
    dictionaries
    XML_MAX_NAME_LENGTH
    dictionary
    XML_MAX_DICTIONARY_LIMIT
    _xmlParserCtxt
    _xmlXPathContext
    xmlDictCleanup
    xmlDictCreate
    xmlDictCreateSub
    xmlDictGetUsage
    xmlDictReference
    xmlDictSetLimit
    xmlHashCreateDict
    xmlInitializeDict
    xmlPatterncompile
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    dictionnary
    _xmlParserCtxt
    xmlDictCreate
    xmlDictCreateSub
    xmlDictExists
    xmlDictFree
    xmlDictGetUsage
    xmlDictLookup
    xmlDictOwns
    xmlDictQLookup
    xmlDictReference
    xmlDictSetLimit
    xmlDictSize
    xmlExpNewCtxt
    did
    XML_SCHEMAS_TYPE_BLOCK_DEFAULT
    xmlTextReaderGetRemainder
    xmlTextReaderStandalone
    difference
    xmlXPathDifference
    different
    _xmlBuffer
    xmlACatalogAdd
    xmlBuildQName
    xmlCatalogAdd
    xmlChildElementCount
    xmlFirstElementChild
    xmlLastElementChild
    xmlNextElementSibling
    xmlNodeGetBase
    xmlPreviousElementSibling
    xmlStrEqual
    xmlStrQEqual
    differentiate
    xmlXPathOrderDocElems
    differently
    xmlTextReaderGetRemainder
    differs
    xmlBufShrink
    xmlNewEntity
    digit
    xmlXPathStringFunction
    digits
    xmlXPathStringFunction
    dir
    xmlShellDir
    direct
    htmlElementAllowedHere
    htmlElementAllowedHereDesc
    htmlElementStatusHere
    xmlExpExpDerive
    xmlParseAttribute
    xmlURIUnescapeString
    direction
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextAttribute
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    directly
    xmlBufGetNodeContent
    xmlNodeBufGetContent
    xmlNodeGetContent
    xmlNormalizeURIPath
    xmlParseAttribute
    xmlParseElementContentDecl
    xmlParsePEReference
    xmlParseSDDecl
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlParserInputBufferGrow
    xmlXPathConvertBoolean
    xmlXPathConvertNumber
    xmlXPathConvertString
    xmlXPtrNewContext
    directories
    xmlLoadCatalogs
    directory
    _xmlParserCtxt
    _xmlParserInput
    xmlCheckFilename
    xmlNanoFTPCwd
    xmlNanoFTPDele
    xmlParserGetDirectory
    xmlShellList
    disable
    xmlCatalogSetDebug
    xmlSchemaValidateSetLocator
    disabled
    XML_CAST_FPTR
    _xmlParserCtxt
    xmlParseURIRaw
    disables
    xmlXPathContextSetCache
    disabling
    xmlNoNetExternalEntityLoader
    disallowed
    XML_SCHEMAS_ELEM_BLOCK_EXTENSION
    XML_SCHEMAS_ELEM_BLOCK_RESTRICTION
    XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION
    discard
    xmlUnlinkNode
    discarded
    xmlDeregisterNodeFunc
    discarding
    xmlParseAttValue
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    disconnected
    xmlAutomataNewState
    discovering
    xmlSwitchEncoding
    xmlSwitchInputEncoding
    xmlSwitchToEncoding
    disctionary
    xmlDictOwns
    display
    errorSAXFunc
    fatalErrorSAXFunc
    warningSAXFunc
    xmlMemShow
    xmlParserError
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserWarning
    distinct
    xmlXPathDistinct
    xmlXPathDistinctSorted
    distinguish
    xmlXPathStringFunction
    div
    xmlXPathDivValues
    xmlXPathSubstringFunction
    doc
    htmlNodeDumpFileFormat
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapRemoveNode
    xmlNewTextWriterDoc
    doc-
    xmlDOMWrapRemoveNode
    xmlDocGetRootElement
    xmlDocSetRootElement
    xmlNewTextWriterTree
    xmlNodeGetBase
    docs
    xmlBuildRelativeURI
    doctypedecl
    xmlParseDocTypeDecl
    xmlParseDocument
    documents
    xmlCleanupParser
    xmlIsID
    xmlParseEntityRef
    xmlParserHandleReference
    xmlSAXParseDoc
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlXPathOrderDocElems
    doesn
    _htmlElemDesc
    htmlElementAllowedHere
    xmlBufferDetach
    xmlCheckLanguageID
    xmlCleanupParser
    xmlCreateEntitiesTable
    xmlFreeNode
    xmlGetThreadId
    xmlInitCharEncodingHandlers
    xmlKeepBlanksDefault
    xmlNodeListGetRawString
    xmlPatternMatch
    xmlRemoveProp
    xmlUTF8Strlen
    xmlValidateRoot
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathTrailing
    xmlXPathTrailingSorted
    doing
    xmlOutputBufferCreateFilenameFunc
    xmlParserInputBufferCreateFilenameFunc
    xmlRegExecCallbacks
    don
    XML_SCHEMAS_ANY_LAX
    xlinkIsLink
    xmlChildElementCount
    xmlCreatePushParserCtxt
    xmlDOMWrapCloneNode
    xmlFirstElementChild
    xmlLastElementChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNextElementSibling
    xmlParseStartTag
    xmlPreviousElementSibling
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlSearchNs
    xmlXPathFreeNodeSetList
    xmlXPathNodeSetFreeNs
    dotgnu
    xmlTextReaderNodeType
    double
    val
    xmlBufferWriteQuotedString
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    xmlXPathIsInf
    xmlXPathIsNaN
    xmlXPathNewFloat
    xmlXPathNodeSetCreate
    xmlXPathReturnNumber
    xmlXPathStringEvalNumber
    xmlXPtrLocationSetCreate
    double-hyphen
    xmlParseComment
    double-quotes
    xmlBufferWriteQuotedString
    doubleit
    xmlGetBufferAllocationScheme
    doublequotes
    xmlParseQuotedString
    doubt
    xmlCleanupParser
    xmlCleanupThreads
    down
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    draft
    XINCLUDE_OLD_NS
    drop
    xmlFileRead
    xmlIOFTPRead
    xmlIOHTTPRead
    xmlParseNamespace
    xmlParseQuotedString
    xmlXPtrBuildNodeList
    dtd
    getSystemId
    htmlNewDoc
    htmlNewDocNoDtD
    xmlCopyDtd
    xmlSAX2GetSystemId
    xmlValidateDtd
    dtds
    getSystemId
    xmlSAX2GetSystemId
    xmlValidateDtdFinal
    due
    xmlBufShrink
    xmlModuleOpen
    xmlModuleSymbol
    dump
    xmlBufShrink
    xmlBufferAdd
    xmlBufferCCat
    xmlBufferDump
    xmlBufferShrink
    xmlDumpAttributeDecl
    xmlDumpAttributeTable
    xmlDumpElementDecl
    xmlDumpElementTable
    xmlDumpEntitiesTable
    xmlDumpEntityDecl
    xmlDumpNotationDecl
    xmlDumpNotationTable
    xmlLsOneNode
    xmlMemDisplayLast
    xmlMemShow
    xmlSnprintfElementContent
    xmlXPathDebugDumpObject
    dumping
    xmlMemDisplayLast
    dumps
    xmlShellBase
    xmlShellCat
    xmlShellDir
    duplicate
    xmlCanonicPath
    xmlPathToURI
    duplicated
    xmlRelaxNGNewDocParserCtxt
    xmlXPathNodeSetFreeNs
    duplicates
    xmlSchemaCopyValue
    duration
    xmlSchemaGetCanonValue
    during
    xmlSAXDefaultVersion
    xmlSchemaIsValid
    xmlSchemaNewDocParserCtxt
    xmlSchemaSetValidOptions
    xmlSchematronNewDocParserCtxt
    dynamic
    LIBXML_MODULE_EXTENSION

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/tree.html0000644000175000017500000001734712124524425015163 0ustar aronaron The tree output
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    The tree output

    Developer Menu
    API Indexes
    Related links

    The parser returns a tree built during the document analysis. The value returned is an xmlDocPtr (i.e., a pointer to an xmlDoc structure). This structure contains information such as the file name, the document type, and a children pointer which is the root of the document (or more exactly the first child under the root which is the document). The tree is made of xmlNodes, chained in double-linked lists of siblings and with a children<->parent relationship. An xmlNode can also carry properties (a chain of xmlAttr structures). An attribute may have a value which is a list of TEXT or ENTITY_REF nodes.

    Here is an example (erroneous with respect to the XML spec since there should be only one ELEMENT under the root):

     structure.gif

    In the source package there is a small program (not installed by default) called xmllint which parses XML files given as argument and prints them back as parsed. This is useful for detecting errors both in XML code and in the XML parser itself. It has an option --debug which prints the actual in-memory structure of the document; here is the result with the example given before:

    DOCUMENT
    version=1.0
    standalone=true
      ELEMENT EXAMPLE
        ATTRIBUTE prop1
          TEXT
          content=gnome is great
        ATTRIBUTE prop2
          ENTITY_REF
          TEXT
          content= linux too 
        ELEMENT head
          ELEMENT title
            TEXT
            content=Welcome to Gnome
        ELEMENT chapter
          ELEMENT title
            TEXT
            content=The Linux adventure
          ELEMENT p
            TEXT
            content=bla bla bla ...
          ELEMENT image
            ATTRIBUTE href
              TEXT
              content=linus.gif
          ELEMENT p
            TEXT
            content=...

    This should be useful for learning the internal representation model.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/XMLinfo.html0000644000175000017500000001521512124524424015527 0ustar aronaron XML
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    XML

    Main Menu
    Related links

    XML is a standard for markup-based structured documents. Here is an example XML document:

    <?xml version="1.0"?>
    <EXAMPLE prop1="gnome is great" prop2="&amp; linux too">
      <head>
       <title>Welcome to Gnome</title>
      </head>
      <chapter>
       <title>The Linux adventure</title>
       <p>bla bla bla ...</p>
       <image href="linus.gif"/>
       <p>...</p>
      </chapter>
    </EXAMPLE>

    The first line specifies that it is an XML document and gives useful information about its encoding. Then the rest of the document is a text format whose structure is specified by tags between brackets. Each tag opened has to be closed. XML is pedantic about this. However, if a tag is empty (no content), a single tag can serve as both the opening and closing tag if it ends with /> rather than with >. Note that, for example, the image tag has no content (just an attribute) and is closed by ending the tag with />.

    XML can be applied successfully to a wide range of tasks, ranging from long term structured document maintenance (where it follows the steps of SGML) to simple data encoding mechanisms like configuration file formatting (glade), spreadsheets (gnumeric), or even shorter lived documents such as WebDAV where it is used to encode remote calls between a client and a server.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/entities.html0000644000175000017500000002234312124524424016037 0ustar aronaron Entities or no entities
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Entities or no entities

    Developer Menu
    API Indexes
    Related links

    Entities in principle are similar to simple C macros. An entity defines an abbreviation for a given string that you can reuse many times throughout the content of your document. Entities are especially useful when a given string may occur frequently within a document, or to confine the change needed to a document to a restricted area in the internal subset of the document (at the beginning). Example:

    1 <?xml version="1.0"?>
    2 <!DOCTYPE EXAMPLE SYSTEM "example.dtd" [
    3 <!ENTITY xml "Extensible Markup Language">
    4 ]>
    5 <EXAMPLE>
    6    &xml;
    7 </EXAMPLE>

    Line 3 declares the xml entity. Line 6 uses the xml entity, by prefixing its name with '&' and following it by ';' without any spaces added. There are 5 predefined entities in libxml2 allowing you to escape characters with predefined meaning in some parts of the xml document content: &lt; for the character '<', &gt; for the character '>', &apos; for the character ''', &quot; for the character '"', and &amp; for the character '&'.

    One of the problems related to entities is that you may want the parser to substitute an entity's content so that you can see the replacement text in your application. Or you may prefer to keep entity references as such in the content to be able to save the document back without losing this usually precious information (if the user went through the pain of explicitly defining entities, he may have a a rather negative attitude if you blindly substitute them as saving time). The xmlSubstituteEntitiesDefault() function allows you to check and change the behaviour, which is to not substitute entities by default.

    Here is the DOM tree built by libxml2 for the previous document in the default case:

    /gnome/src/gnome-xml -> ./xmllint --debug test/ent1
    DOCUMENT
    version=1.0
       ELEMENT EXAMPLE
         TEXT
         content=
         ENTITY_REF
           INTERNAL_GENERAL_ENTITY xml
           content=Extensible Markup Language
         TEXT
         content=

    And here is the result when substituting entities:

    /gnome/src/gnome-xml -> ./tester --debug --noent test/ent1
    DOCUMENT
    version=1.0
       ELEMENT EXAMPLE
         TEXT
         content=     Extensible Markup Language

    So, entities or no entities? Basically, it depends on your use case. I suggest that you keep the non-substituting default behaviour and avoid using entities in your XML document or data if you are not willing to handle the entity references elements in the DOM tree.

    Note that at save time libxml2 enforces the conversion of the predefined entities where necessary to prevent well-formedness problems, and will also transparently replace those with chars (i.e. it will not generate entity reference elements in the DOM tree or call the reference() SAX callback when finding them in the input).

    WARNING: handling entities on top of the libxml2 SAX interface is difficult!!! If you plan to use non-predefined entities in your documents, then the learning curve to handle then using the SAX API may be long. If you plan to use complex documents, I strongly suggest you consider using the DOM interface instead and let libxml deal with the complexity rather than trying to do it yourself.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xsa.xsl0000644000175000017500000000315111234335462014647 0ustar aronaron Daniel Veillard daniel@veillard.com http://veillard.com/ libxml2 http://xmlsoft.org/ - at libxml2-2.9.1+dfsg1/doc/apibuild.py0000755000175000017500000023740112125573772015511 0ustar aronaron#!/usr/bin/python -u # # This is the API builder, it parses the C sources and build the # API formal description in XML. # # See Copyright for the status of this software. # # daniel@veillard.com # import os, sys import string import glob debug=0 #debugsym='ignorableWhitespaceSAXFunc' debugsym=None # # C parser analysis code # ignored_files = { "trio": "too many non standard macros", "trio.c": "too many non standard macros", "trionan.c": "too many non standard macros", "triostr.c": "too many non standard macros", "acconfig.h": "generated portability layer", "config.h": "generated portability layer", "libxml.h": "internal only", "testOOM.c": "out of memory tester", "testOOMlib.h": "out of memory tester", "testOOMlib.c": "out of memory tester", "rngparser.c": "not yet integrated", "rngparser.h": "not yet integrated", "elfgcchack.h": "not a normal header", "testHTML.c": "test tool", "testReader.c": "test tool", "testSchemas.c": "test tool", "testXPath.c": "test tool", "testAutomata.c": "test tool", "testModule.c": "test tool", "testRegexp.c": "test tool", "testThreads.c": "test tool", "testC14N.c": "test tool", "testRelax.c": "test tool", "testThreadsWin32.c": "test tool", "testSAX.c": "test tool", "testURI.c": "test tool", "testapi.c": "generated regression tests", "runtest.c": "regression tests program", "runsuite.c": "regression tests program", "tst.c": "not part of the library", "test.c": "not part of the library", "testdso.c": "test for dynamid shared libraries", "testrecurse.c": "test for entities recursions", "xzlib.h": "Internal API only 2.8.0", "buf.h": "Internal API only 2.9.0", "enc.h": "Internal API only 2.9.0", "/save.h": "Internal API only 2.9.0", "timsort.h": "Internal header only for xpath.c 2.9.0", } ignored_words = { "WINAPI": (0, "Windows keyword"), "LIBXML_DLL_IMPORT": (0, "Special macro to flag external keywords"), "XMLPUBVAR": (0, "Special macro for extern vars for win32"), "XSLTPUBVAR": (0, "Special macro for extern vars for win32"), "EXSLTPUBVAR": (0, "Special macro for extern vars for win32"), "XMLPUBFUN": (0, "Special macro for extern funcs for win32"), "XSLTPUBFUN": (0, "Special macro for extern funcs for win32"), "EXSLTPUBFUN": (0, "Special macro for extern funcs for win32"), "XMLCALL": (0, "Special macro for win32 calls"), "XSLTCALL": (0, "Special macro for win32 calls"), "XMLCDECL": (0, "Special macro for win32 calls"), "EXSLTCALL": (0, "Special macro for win32 calls"), "__declspec": (3, "Windows keyword"), "__stdcall": (0, "Windows keyword"), "ATTRIBUTE_UNUSED": (0, "macro keyword"), "LIBEXSLT_PUBLIC": (0, "macro keyword"), "X_IN_Y": (5, "macro function builder"), "ATTRIBUTE_ALLOC_SIZE": (3, "macro for gcc checking extension"), "ATTRIBUTE_PRINTF": (5, "macro for gcc printf args checking extension"), "LIBXML_ATTR_FORMAT": (5, "macro for gcc printf args checking extension"), "LIBXML_ATTR_ALLOC_SIZE": (3, "macro for gcc checking extension"), } def escape(raw): raw = raw.replace('&', '&') raw = raw.replace('<', '<') raw = raw.replace('>', '>') raw = raw.replace("'", ''') raw = raw.replace('"', '"') return raw def uniq(items): d = {} for item in items: d[item]=1 return list(d.keys()) class identifier: def __init__(self, name, header=None, module=None, type=None, lineno = 0, info=None, extra=None, conditionals = None): self.name = name self.header = header self.module = module self.type = type self.info = info self.extra = extra self.lineno = lineno self.static = 0 if conditionals == None or len(conditionals) == 0: self.conditionals = None else: self.conditionals = conditionals[:] if self.name == debugsym: print("=> define %s : %s" % (debugsym, (module, type, info, extra, conditionals))) def __repr__(self): r = "%s %s:" % (self.type, self.name) if self.static: r = r + " static" if self.module != None: r = r + " from %s" % (self.module) if self.info != None: r = r + " " + repr(self.info) if self.extra != None: r = r + " " + repr(self.extra) if self.conditionals != None: r = r + " " + repr(self.conditionals) return r def set_header(self, header): self.header = header def set_module(self, module): self.module = module def set_type(self, type): self.type = type def set_info(self, info): self.info = info def set_extra(self, extra): self.extra = extra def set_lineno(self, lineno): self.lineno = lineno def set_static(self, static): self.static = static def set_conditionals(self, conditionals): if conditionals == None or len(conditionals) == 0: self.conditionals = None else: self.conditionals = conditionals[:] def get_name(self): return self.name def get_header(self): return self.module def get_module(self): return self.module def get_type(self): return self.type def get_info(self): return self.info def get_lineno(self): return self.lineno def get_extra(self): return self.extra def get_static(self): return self.static def get_conditionals(self): return self.conditionals def update(self, header, module, type = None, info = None, extra=None, conditionals=None): if self.name == debugsym: print("=> update %s : %s" % (debugsym, (module, type, info, extra, conditionals))) if header != None and self.header == None: self.set_header(module) if module != None and (self.module == None or self.header == self.module): self.set_module(module) if type != None and self.type == None: self.set_type(type) if info != None: self.set_info(info) if extra != None: self.set_extra(extra) if conditionals != None: self.set_conditionals(conditionals) class index: def __init__(self, name = "noname"): self.name = name self.identifiers = {} self.functions = {} self.variables = {} self.includes = {} self.structs = {} self.enums = {} self.typedefs = {} self.macros = {} self.references = {} self.info = {} def add_ref(self, name, header, module, static, type, lineno, info=None, extra=None, conditionals = None): if name[0:2] == '__': return None d = None try: d = self.identifiers[name] d.update(header, module, type, lineno, info, extra, conditionals) except: d = identifier(name, header, module, type, lineno, info, extra, conditionals) self.identifiers[name] = d if d != None and static == 1: d.set_static(1) if d != None and name != None and type != None: self.references[name] = d if name == debugsym: print("New ref: %s" % (d)) return d def add(self, name, header, module, static, type, lineno, info=None, extra=None, conditionals = None): if name[0:2] == '__': return None d = None try: d = self.identifiers[name] d.update(header, module, type, lineno, info, extra, conditionals) except: d = identifier(name, header, module, type, lineno, info, extra, conditionals) self.identifiers[name] = d if d != None and static == 1: d.set_static(1) if d != None and name != None and type != None: if type == "function": self.functions[name] = d elif type == "functype": self.functions[name] = d elif type == "variable": self.variables[name] = d elif type == "include": self.includes[name] = d elif type == "struct": self.structs[name] = d elif type == "enum": self.enums[name] = d elif type == "typedef": self.typedefs[name] = d elif type == "macro": self.macros[name] = d else: print("Unable to register type ", type) if name == debugsym: print("New symbol: %s" % (d)) return d def merge(self, idx): for id in list(idx.functions.keys()): # # macro might be used to override functions or variables # definitions # if id in self.macros: del self.macros[id] if id in self.functions: print("function %s from %s redeclared in %s" % ( id, self.functions[id].header, idx.functions[id].header)) else: self.functions[id] = idx.functions[id] self.identifiers[id] = idx.functions[id] for id in list(idx.variables.keys()): # # macro might be used to override functions or variables # definitions # if id in self.macros: del self.macros[id] if id in self.variables: print("variable %s from %s redeclared in %s" % ( id, self.variables[id].header, idx.variables[id].header)) else: self.variables[id] = idx.variables[id] self.identifiers[id] = idx.variables[id] for id in list(idx.structs.keys()): if id in self.structs: print("struct %s from %s redeclared in %s" % ( id, self.structs[id].header, idx.structs[id].header)) else: self.structs[id] = idx.structs[id] self.identifiers[id] = idx.structs[id] for id in list(idx.typedefs.keys()): if id in self.typedefs: print("typedef %s from %s redeclared in %s" % ( id, self.typedefs[id].header, idx.typedefs[id].header)) else: self.typedefs[id] = idx.typedefs[id] self.identifiers[id] = idx.typedefs[id] for id in list(idx.macros.keys()): # # macro might be used to override functions or variables # definitions # if id in self.variables: continue if id in self.functions: continue if id in self.enums: continue if id in self.macros: print("macro %s from %s redeclared in %s" % ( id, self.macros[id].header, idx.macros[id].header)) else: self.macros[id] = idx.macros[id] self.identifiers[id] = idx.macros[id] for id in list(idx.enums.keys()): if id in self.enums: print("enum %s from %s redeclared in %s" % ( id, self.enums[id].header, idx.enums[id].header)) else: self.enums[id] = idx.enums[id] self.identifiers[id] = idx.enums[id] def merge_public(self, idx): for id in list(idx.functions.keys()): if id in self.functions: # check that function condition agrees with header if idx.functions[id].conditionals != \ self.functions[id].conditionals: print("Header condition differs from Function for %s:" \ % id) print(" H: %s" % self.functions[id].conditionals) print(" C: %s" % idx.functions[id].conditionals) up = idx.functions[id] self.functions[id].update(None, up.module, up.type, up.info, up.extra) # else: # print "Function %s from %s is not declared in headers" % ( # id, idx.functions[id].module) # TODO: do the same for variables. def analyze_dict(self, type, dict): count = 0 public = 0 for name in list(dict.keys()): id = dict[name] count = count + 1 if id.static == 0: public = public + 1 if count != public: print(" %d %s , %d public" % (count, type, public)) elif count != 0: print(" %d public %s" % (count, type)) def analyze(self): self.analyze_dict("functions", self.functions) self.analyze_dict("variables", self.variables) self.analyze_dict("structs", self.structs) self.analyze_dict("typedefs", self.typedefs) self.analyze_dict("macros", self.macros) class CLexer: """A lexer for the C language, tokenize the input by reading and analyzing it line by line""" def __init__(self, input): self.input = input self.tokens = [] self.line = "" self.lineno = 0 def getline(self): line = '' while line == '': line = self.input.readline() if not line: return None self.lineno = self.lineno + 1 line = line.lstrip() line = line.rstrip() if line == '': continue while line[-1] == '\\': line = line[:-1] n = self.input.readline() self.lineno = self.lineno + 1 n = n.lstrip() n = n.rstrip() if not n: break else: line = line + n return line def getlineno(self): return self.lineno def push(self, token): self.tokens.insert(0, token); def debug(self): print("Last token: ", self.last) print("Token queue: ", self.tokens) print("Line %d end: " % (self.lineno), self.line) def token(self): while self.tokens == []: if self.line == "": line = self.getline() else: line = self.line self.line = "" if line == None: return None if line[0] == '#': self.tokens = list(map((lambda x: ('preproc', x)), line.split())) break; l = len(line) if line[0] == '"' or line[0] == "'": end = line[0] line = line[1:] found = 0 tok = "" while found == 0: i = 0 l = len(line) while i < l: if line[i] == end: self.line = line[i+1:] line = line[:i] l = i found = 1 break if line[i] == '\\': i = i + 1 i = i + 1 tok = tok + line if found == 0: line = self.getline() if line == None: return None self.last = ('string', tok) return self.last if l >= 2 and line[0] == '/' and line[1] == '*': line = line[2:] found = 0 tok = "" while found == 0: i = 0 l = len(line) while i < l: if line[i] == '*' and i+1 < l and line[i+1] == '/': self.line = line[i+2:] line = line[:i-1] l = i found = 1 break i = i + 1 if tok != "": tok = tok + "\n" tok = tok + line if found == 0: line = self.getline() if line == None: return None self.last = ('comment', tok) return self.last if l >= 2 and line[0] == '/' and line[1] == '/': line = line[2:] self.last = ('comment', line) return self.last i = 0 while i < l: if line[i] == '/' and i+1 < l and line[i+1] == '/': self.line = line[i:] line = line[:i] break if line[i] == '/' and i+1 < l and line[i+1] == '*': self.line = line[i:] line = line[:i] break if line[i] == '"' or line[i] == "'": self.line = line[i:] line = line[:i] break i = i + 1 l = len(line) i = 0 while i < l: if line[i] == ' ' or line[i] == '\t': i = i + 1 continue o = ord(line[i]) if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ (o >= 48 and o <= 57): s = i while i < l: o = ord(line[i]) if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ (o >= 48 and o <= 57) or \ (" \t(){}:;,+-*/%&!|[]=><".find(line[i])) == -1: i = i + 1 else: break self.tokens.append(('name', line[s:i])) continue if "(){}:;,[]".find(line[i]) != -1: # if line[i] == '(' or line[i] == ')' or line[i] == '{' or \ # line[i] == '}' or line[i] == ':' or line[i] == ';' or \ # line[i] == ',' or line[i] == '[' or line[i] == ']': self.tokens.append(('sep', line[i])) i = i + 1 continue if "+-*><=/%&!|.".find(line[i]) != -1: # if line[i] == '+' or line[i] == '-' or line[i] == '*' or \ # line[i] == '>' or line[i] == '<' or line[i] == '=' or \ # line[i] == '/' or line[i] == '%' or line[i] == '&' or \ # line[i] == '!' or line[i] == '|' or line[i] == '.': if line[i] == '.' and i + 2 < l and \ line[i+1] == '.' and line[i+2] == '.': self.tokens.append(('name', '...')) i = i + 3 continue j = i + 1 if j < l and ( "+-*><=/%&!|".find(line[j]) != -1): # line[j] == '+' or line[j] == '-' or line[j] == '*' or \ # line[j] == '>' or line[j] == '<' or line[j] == '=' or \ # line[j] == '/' or line[j] == '%' or line[j] == '&' or \ # line[j] == '!' or line[j] == '|'): self.tokens.append(('op', line[i:j+1])) i = j + 1 else: self.tokens.append(('op', line[i])) i = i + 1 continue s = i while i < l: o = ord(line[i]) if (o >= 97 and o <= 122) or (o >= 65 and o <= 90) or \ (o >= 48 and o <= 57) or ( " \t(){}:;,+-*/%&!|[]=><".find(line[i]) == -1): # line[i] != ' ' and line[i] != '\t' and # line[i] != '(' and line[i] != ')' and # line[i] != '{' and line[i] != '}' and # line[i] != ':' and line[i] != ';' and # line[i] != ',' and line[i] != '+' and # line[i] != '-' and line[i] != '*' and # line[i] != '/' and line[i] != '%' and # line[i] != '&' and line[i] != '!' and # line[i] != '|' and line[i] != '[' and # line[i] != ']' and line[i] != '=' and # line[i] != '*' and line[i] != '>' and # line[i] != '<'): i = i + 1 else: break self.tokens.append(('name', line[s:i])) tok = self.tokens[0] self.tokens = self.tokens[1:] self.last = tok return tok class CParser: """The C module parser""" def __init__(self, filename, idx = None): self.filename = filename if len(filename) > 2 and filename[-2:] == '.h': self.is_header = 1 else: self.is_header = 0 self.input = open(filename) self.lexer = CLexer(self.input) if idx == None: self.index = index() else: self.index = idx self.top_comment = "" self.last_comment = "" self.comment = None self.collect_ref = 0 self.no_error = 0 self.conditionals = [] self.defines = [] def collect_references(self): self.collect_ref = 1 def stop_error(self): self.no_error = 1 def start_error(self): self.no_error = 0 def lineno(self): return self.lexer.getlineno() def index_add(self, name, module, static, type, info=None, extra = None): if self.is_header == 1: self.index.add(name, module, module, static, type, self.lineno(), info, extra, self.conditionals) else: self.index.add(name, None, module, static, type, self.lineno(), info, extra, self.conditionals) def index_add_ref(self, name, module, static, type, info=None, extra = None): if self.is_header == 1: self.index.add_ref(name, module, module, static, type, self.lineno(), info, extra, self.conditionals) else: self.index.add_ref(name, None, module, static, type, self.lineno(), info, extra, self.conditionals) def warning(self, msg): if self.no_error: return print(msg) def error(self, msg, token=-1): if self.no_error: return print("Parse Error: " + msg) if token != -1: print("Got token ", token) self.lexer.debug() sys.exit(1) def debug(self, msg, token=-1): print("Debug: " + msg) if token != -1: print("Got token ", token) self.lexer.debug() def parseTopComment(self, comment): res = {} lines = comment.split("\n") item = None for line in lines: while line != "" and (line[0] == ' ' or line[0] == '\t'): line = line[1:] while line != "" and line[0] == '*': line = line[1:] while line != "" and (line[0] == ' ' or line[0] == '\t'): line = line[1:] try: (it, line) = line.split(":", 1) item = it while line != "" and (line[0] == ' ' or line[0] == '\t'): line = line[1:] if item in res: res[item] = res[item] + " " + line else: res[item] = line except: if item != None: if item in res: res[item] = res[item] + " " + line else: res[item] = line self.index.info = res def parseComment(self, token): if self.top_comment == "": self.top_comment = token[1] if self.comment == None or token[1][0] == '*': self.comment = token[1]; else: self.comment = self.comment + token[1] token = self.lexer.token() if self.comment.find("DOC_DISABLE") != -1: self.stop_error() if self.comment.find("DOC_ENABLE") != -1: self.start_error() return token # # Parse a comment block associate to a typedef # def parseTypeComment(self, name, quiet = 0): if name[0:2] == '__': quiet = 1 args = [] desc = "" if self.comment == None: if not quiet: self.warning("Missing comment for type %s" % (name)) return((args, desc)) if self.comment[0] != '*': if not quiet: self.warning("Missing * in type comment for %s" % (name)) return((args, desc)) lines = self.comment.split('\n') if lines[0] == '*': del lines[0] if lines[0] != "* %s:" % (name): if not quiet: self.warning("Misformatted type comment for %s" % (name)) self.warning(" Expecting '* %s:' got '%s'" % (name, lines[0])) return((args, desc)) del lines[0] while len(lines) > 0 and lines[0] == '*': del lines[0] desc = "" while len(lines) > 0: l = lines[0] while len(l) > 0 and l[0] == '*': l = l[1:] l = l.strip() desc = desc + " " + l del lines[0] desc = desc.strip() if quiet == 0: if desc == "": self.warning("Type comment for %s lack description of the macro" % (name)) return(desc) # # Parse a comment block associate to a macro # def parseMacroComment(self, name, quiet = 0): if name[0:2] == '__': quiet = 1 args = [] desc = "" if self.comment == None: if not quiet: self.warning("Missing comment for macro %s" % (name)) return((args, desc)) if self.comment[0] != '*': if not quiet: self.warning("Missing * in macro comment for %s" % (name)) return((args, desc)) lines = self.comment.split('\n') if lines[0] == '*': del lines[0] if lines[0] != "* %s:" % (name): if not quiet: self.warning("Misformatted macro comment for %s" % (name)) self.warning(" Expecting '* %s:' got '%s'" % (name, lines[0])) return((args, desc)) del lines[0] while lines[0] == '*': del lines[0] while len(lines) > 0 and lines[0][0:3] == '* @': l = lines[0][3:] try: (arg, desc) = l.split(':', 1) desc=desc.strip() arg=arg.strip() except: if not quiet: self.warning("Misformatted macro comment for %s" % (name)) self.warning(" problem with '%s'" % (lines[0])) del lines[0] continue del lines[0] l = lines[0].strip() while len(l) > 2 and l[0:3] != '* @': while l[0] == '*': l = l[1:] desc = desc + ' ' + l.strip() del lines[0] if len(lines) == 0: break l = lines[0] args.append((arg, desc)) while len(lines) > 0 and lines[0] == '*': del lines[0] desc = "" while len(lines) > 0: l = lines[0] while len(l) > 0 and l[0] == '*': l = l[1:] l = l.strip() desc = desc + " " + l del lines[0] desc = desc.strip() if quiet == 0: if desc == "": self.warning("Macro comment for %s lack description of the macro" % (name)) return((args, desc)) # # Parse a comment block and merge the informations found in the # parameters descriptions, finally returns a block as complete # as possible # def mergeFunctionComment(self, name, description, quiet = 0): if name == 'main': quiet = 1 if name[0:2] == '__': quiet = 1 (ret, args) = description desc = "" retdesc = "" if self.comment == None: if not quiet: self.warning("Missing comment for function %s" % (name)) return(((ret[0], retdesc), args, desc)) if self.comment[0] != '*': if not quiet: self.warning("Missing * in function comment for %s" % (name)) return(((ret[0], retdesc), args, desc)) lines = self.comment.split('\n') if lines[0] == '*': del lines[0] if lines[0] != "* %s:" % (name): if not quiet: self.warning("Misformatted function comment for %s" % (name)) self.warning(" Expecting '* %s:' got '%s'" % (name, lines[0])) return(((ret[0], retdesc), args, desc)) del lines[0] while lines[0] == '*': del lines[0] nbargs = len(args) while len(lines) > 0 and lines[0][0:3] == '* @': l = lines[0][3:] try: (arg, desc) = l.split(':', 1) desc=desc.strip() arg=arg.strip() except: if not quiet: self.warning("Misformatted function comment for %s" % (name)) self.warning(" problem with '%s'" % (lines[0])) del lines[0] continue del lines[0] l = lines[0].strip() while len(l) > 2 and l[0:3] != '* @': while l[0] == '*': l = l[1:] desc = desc + ' ' + l.strip() del lines[0] if len(lines) == 0: break l = lines[0] i = 0 while i < nbargs: if args[i][1] == arg: args[i] = (args[i][0], arg, desc) break; i = i + 1 if i >= nbargs: if not quiet: self.warning("Unable to find arg %s from function comment for %s" % ( arg, name)) while len(lines) > 0 and lines[0] == '*': del lines[0] desc = "" while len(lines) > 0: l = lines[0] while len(l) > 0 and l[0] == '*': l = l[1:] l = l.strip() if len(l) >= 6 and l[0:6] == "return" or l[0:6] == "Return": try: l = l.split(' ', 1)[1] except: l = "" retdesc = l.strip() del lines[0] while len(lines) > 0: l = lines[0] while len(l) > 0 and l[0] == '*': l = l[1:] l = l.strip() retdesc = retdesc + " " + l del lines[0] else: desc = desc + " " + l del lines[0] retdesc = retdesc.strip() desc = desc.strip() if quiet == 0: # # report missing comments # i = 0 while i < nbargs: if args[i][2] == None and args[i][0] != "void" and \ ((args[i][1] != None) or (args[i][1] == '')): self.warning("Function comment for %s lacks description of arg %s" % (name, args[i][1])) i = i + 1 if retdesc == "" and ret[0] != "void": self.warning("Function comment for %s lacks description of return value" % (name)) if desc == "": self.warning("Function comment for %s lacks description of the function" % (name)) return(((ret[0], retdesc), args, desc)) def parsePreproc(self, token): if debug: print("=> preproc ", token, self.lexer.tokens) name = token[1] if name == "#include": token = self.lexer.token() if token == None: return None if token[0] == 'preproc': self.index_add(token[1], self.filename, not self.is_header, "include") return self.lexer.token() return token if name == "#define": token = self.lexer.token() if token == None: return None if token[0] == 'preproc': # TODO macros with arguments name = token[1] lst = [] token = self.lexer.token() while token != None and token[0] == 'preproc' and \ token[1][0] != '#': lst.append(token[1]) token = self.lexer.token() try: name = name.split('(') [0] except: pass info = self.parseMacroComment(name, not self.is_header) self.index_add(name, self.filename, not self.is_header, "macro", info) return token # # Processing of conditionals modified by Bill 1/1/05 # # We process conditionals (i.e. tokens from #ifdef, #ifndef, # #if, #else and #endif) for headers and mainline code, # store the ones from the header in libxml2-api.xml, and later # (in the routine merge_public) verify that the two (header and # mainline code) agree. # # There is a small problem with processing the headers. Some of # the variables are not concerned with enabling / disabling of # library functions (e.g. '__XML_PARSER_H__'), and we don't want # them to be included in libxml2-api.xml, or involved in # the check between the header and the mainline code. To # accomplish this, we ignore any conditional which doesn't include # the string 'ENABLED' # if name == "#ifdef": apstr = self.lexer.tokens[0][1] try: self.defines.append(apstr) if apstr.find('ENABLED') != -1: self.conditionals.append("defined(%s)" % apstr) except: pass elif name == "#ifndef": apstr = self.lexer.tokens[0][1] try: self.defines.append(apstr) if apstr.find('ENABLED') != -1: self.conditionals.append("!defined(%s)" % apstr) except: pass elif name == "#if": apstr = "" for tok in self.lexer.tokens: if apstr != "": apstr = apstr + " " apstr = apstr + tok[1] try: self.defines.append(apstr) if apstr.find('ENABLED') != -1: self.conditionals.append(apstr) except: pass elif name == "#else": if self.conditionals != [] and \ self.defines[-1].find('ENABLED') != -1: self.conditionals[-1] = "!(%s)" % self.conditionals[-1] elif name == "#endif": if self.conditionals != [] and \ self.defines[-1].find('ENABLED') != -1: self.conditionals = self.conditionals[:-1] self.defines = self.defines[:-1] token = self.lexer.token() while token != None and token[0] == 'preproc' and \ token[1][0] != '#': token = self.lexer.token() return token # # token acquisition on top of the lexer, it handle internally # preprocessor and comments since they are logically not part of # the program structure. # def token(self): global ignored_words token = self.lexer.token() while token != None: if token[0] == 'comment': token = self.parseComment(token) continue elif token[0] == 'preproc': token = self.parsePreproc(token) continue elif token[0] == "name" and token[1] == "__const": token = ("name", "const") return token elif token[0] == "name" and token[1] == "__attribute": token = self.lexer.token() while token != None and token[1] != ";": token = self.lexer.token() return token elif token[0] == "name" and token[1] in ignored_words: (n, info) = ignored_words[token[1]] i = 0 while i < n: token = self.lexer.token() i = i + 1 token = self.lexer.token() continue else: if debug: print("=> ", token) return token return None # # Parse a typedef, it records the type and its name. # def parseTypedef(self, token): if token == None: return None token = self.parseType(token) if token == None: self.error("parsing typedef") return None base_type = self.type type = base_type #self.debug("end typedef type", token) while token != None: if token[0] == "name": name = token[1] signature = self.signature if signature != None: type = type.split('(')[0] d = self.mergeFunctionComment(name, ((type, None), signature), 1) self.index_add(name, self.filename, not self.is_header, "functype", d) else: if base_type == "struct": self.index_add(name, self.filename, not self.is_header, "struct", type) base_type = "struct " + name else: # TODO report missing or misformatted comments info = self.parseTypeComment(name, 1) self.index_add(name, self.filename, not self.is_header, "typedef", type, info) token = self.token() else: self.error("parsing typedef: expecting a name") return token #self.debug("end typedef", token) if token != None and token[0] == 'sep' and token[1] == ',': type = base_type token = self.token() while token != None and token[0] == "op": type = type + token[1] token = self.token() elif token != None and token[0] == 'sep' and token[1] == ';': break; elif token != None and token[0] == 'name': type = base_type continue; else: self.error("parsing typedef: expecting ';'", token) return token token = self.token() return token # # Parse a C code block, used for functions it parse till # the balancing } included # def parseBlock(self, token): while token != None: if token[0] == "sep" and token[1] == "{": token = self.token() token = self.parseBlock(token) elif token[0] == "sep" and token[1] == "}": self.comment = None token = self.token() return token else: if self.collect_ref == 1: oldtok = token token = self.token() if oldtok[0] == "name" and oldtok[1][0:3] == "xml": if token[0] == "sep" and token[1] == "(": self.index_add_ref(oldtok[1], self.filename, 0, "function") token = self.token() elif token[0] == "name": token = self.token() if token[0] == "sep" and (token[1] == ";" or token[1] == "," or token[1] == "="): self.index_add_ref(oldtok[1], self.filename, 0, "type") elif oldtok[0] == "name" and oldtok[1][0:4] == "XML_": self.index_add_ref(oldtok[1], self.filename, 0, "typedef") elif oldtok[0] == "name" and oldtok[1][0:7] == "LIBXML_": self.index_add_ref(oldtok[1], self.filename, 0, "typedef") else: token = self.token() return token # # Parse a C struct definition till the balancing } # def parseStruct(self, token): fields = [] #self.debug("start parseStruct", token) while token != None: if token[0] == "sep" and token[1] == "{": token = self.token() token = self.parseTypeBlock(token) elif token[0] == "sep" and token[1] == "}": self.struct_fields = fields #self.debug("end parseStruct", token) #print fields token = self.token() return token else: base_type = self.type #self.debug("before parseType", token) token = self.parseType(token) #self.debug("after parseType", token) if token != None and token[0] == "name": fname = token[1] token = self.token() if token[0] == "sep" and token[1] == ";": self.comment = None token = self.token() fields.append((self.type, fname, self.comment)) self.comment = None else: self.error("parseStruct: expecting ;", token) elif token != None and token[0] == "sep" and token[1] == "{": token = self.token() token = self.parseTypeBlock(token) if token != None and token[0] == "name": token = self.token() if token != None and token[0] == "sep" and token[1] == ";": token = self.token() else: self.error("parseStruct: expecting ;", token) else: self.error("parseStruct: name", token) token = self.token() self.type = base_type; self.struct_fields = fields #self.debug("end parseStruct", token) #print fields return token # # Parse a C enum block, parse till the balancing } # def parseEnumBlock(self, token): self.enums = [] name = None self.comment = None comment = "" value = "0" while token != None: if token[0] == "sep" and token[1] == "{": token = self.token() token = self.parseTypeBlock(token) elif token[0] == "sep" and token[1] == "}": if name != None: if self.comment != None: comment = self.comment self.comment = None self.enums.append((name, value, comment)) token = self.token() return token elif token[0] == "name": if name != None: if self.comment != None: comment = self.comment.strip() self.comment = None self.enums.append((name, value, comment)) name = token[1] comment = "" token = self.token() if token[0] == "op" and token[1][0] == "=": value = "" if len(token[1]) > 1: value = token[1][1:] token = self.token() while token[0] != "sep" or (token[1] != ',' and token[1] != '}'): value = value + token[1] token = self.token() else: try: value = "%d" % (int(value) + 1) except: self.warning("Failed to compute value of enum %s" % (name)) value="" if token[0] == "sep" and token[1] == ",": token = self.token() else: token = self.token() return token # # Parse a C definition block, used for structs it parse till # the balancing } # def parseTypeBlock(self, token): while token != None: if token[0] == "sep" and token[1] == "{": token = self.token() token = self.parseTypeBlock(token) elif token[0] == "sep" and token[1] == "}": token = self.token() return token else: token = self.token() return token # # Parse a type: the fact that the type name can either occur after # the definition or within the definition makes it a little harder # if inside, the name token is pushed back before returning # def parseType(self, token): self.type = "" self.struct_fields = [] self.signature = None if token == None: return token while token[0] == "name" and ( token[1] == "const" or \ token[1] == "unsigned" or \ token[1] == "signed"): if self.type == "": self.type = token[1] else: self.type = self.type + " " + token[1] token = self.token() if token[0] == "name" and (token[1] == "long" or token[1] == "short"): if self.type == "": self.type = token[1] else: self.type = self.type + " " + token[1] if token[0] == "name" and token[1] == "int": if self.type == "": self.type = tmp[1] else: self.type = self.type + " " + tmp[1] elif token[0] == "name" and token[1] == "struct": if self.type == "": self.type = token[1] else: self.type = self.type + " " + token[1] token = self.token() nametok = None if token[0] == "name": nametok = token token = self.token() if token != None and token[0] == "sep" and token[1] == "{": token = self.token() token = self.parseStruct(token) elif token != None and token[0] == "op" and token[1] == "*": self.type = self.type + " " + nametok[1] + " *" token = self.token() while token != None and token[0] == "op" and token[1] == "*": self.type = self.type + " *" token = self.token() if token[0] == "name": nametok = token token = self.token() else: self.error("struct : expecting name", token) return token elif token != None and token[0] == "name" and nametok != None: self.type = self.type + " " + nametok[1] return token if nametok != None: self.lexer.push(token) token = nametok return token elif token[0] == "name" and token[1] == "enum": if self.type == "": self.type = token[1] else: self.type = self.type + " " + token[1] self.enums = [] token = self.token() if token != None and token[0] == "sep" and token[1] == "{": token = self.token() token = self.parseEnumBlock(token) else: self.error("parsing enum: expecting '{'", token) enum_type = None if token != None and token[0] != "name": self.lexer.push(token) token = ("name", "enum") else: enum_type = token[1] for enum in self.enums: self.index_add(enum[0], self.filename, not self.is_header, "enum", (enum[1], enum[2], enum_type)) return token elif token[0] == "name": if self.type == "": self.type = token[1] else: self.type = self.type + " " + token[1] else: self.error("parsing type %s: expecting a name" % (self.type), token) return token token = self.token() while token != None and (token[0] == "op" or token[0] == "name" and token[1] == "const"): self.type = self.type + " " + token[1] token = self.token() # # if there is a parenthesis here, this means a function type # if token != None and token[0] == "sep" and token[1] == '(': self.type = self.type + token[1] token = self.token() while token != None and token[0] == "op" and token[1] == '*': self.type = self.type + token[1] token = self.token() if token == None or token[0] != "name" : self.error("parsing function type, name expected", token); return token self.type = self.type + token[1] nametok = token token = self.token() if token != None and token[0] == "sep" and token[1] == ')': self.type = self.type + token[1] token = self.token() if token != None and token[0] == "sep" and token[1] == '(': token = self.token() type = self.type; token = self.parseSignature(token); self.type = type; else: self.error("parsing function type, '(' expected", token); return token else: self.error("parsing function type, ')' expected", token); return token self.lexer.push(token) token = nametok return token # # do some lookahead for arrays # if token != None and token[0] == "name": nametok = token token = self.token() if token != None and token[0] == "sep" and token[1] == '[': self.type = self.type + nametok[1] while token != None and token[0] == "sep" and token[1] == '[': self.type = self.type + token[1] token = self.token() while token != None and token[0] != 'sep' and \ token[1] != ']' and token[1] != ';': self.type = self.type + token[1] token = self.token() if token != None and token[0] == 'sep' and token[1] == ']': self.type = self.type + token[1] token = self.token() else: self.error("parsing array type, ']' expected", token); return token elif token != None and token[0] == "sep" and token[1] == ':': # remove :12 in case it's a limited int size token = self.token() token = self.token() self.lexer.push(token) token = nametok return token # # Parse a signature: '(' has been parsed and we scan the type definition # up to the ')' included def parseSignature(self, token): signature = [] if token != None and token[0] == "sep" and token[1] == ')': self.signature = [] token = self.token() return token while token != None: token = self.parseType(token) if token != None and token[0] == "name": signature.append((self.type, token[1], None)) token = self.token() elif token != None and token[0] == "sep" and token[1] == ',': token = self.token() continue elif token != None and token[0] == "sep" and token[1] == ')': # only the type was provided if self.type == "...": signature.append((self.type, "...", None)) else: signature.append((self.type, None, None)) if token != None and token[0] == "sep": if token[1] == ',': token = self.token() continue elif token[1] == ')': token = self.token() break self.signature = signature return token # # Parse a global definition, be it a type, variable or function # the extern "C" blocks are a bit nasty and require it to recurse. # def parseGlobal(self, token): static = 0 if token[1] == 'extern': token = self.token() if token == None: return token if token[0] == 'string': if token[1] == 'C': token = self.token() if token == None: return token if token[0] == 'sep' and token[1] == "{": token = self.token() # print 'Entering extern "C line ', self.lineno() while token != None and (token[0] != 'sep' or token[1] != "}"): if token[0] == 'name': token = self.parseGlobal(token) else: self.error( "token %s %s unexpected at the top level" % ( token[0], token[1])) token = self.parseGlobal(token) # print 'Exiting extern "C" line', self.lineno() token = self.token() return token else: return token elif token[1] == 'static': static = 1 token = self.token() if token == None or token[0] != 'name': return token if token[1] == 'typedef': token = self.token() return self.parseTypedef(token) else: token = self.parseType(token) type_orig = self.type if token == None or token[0] != "name": return token type = type_orig self.name = token[1] token = self.token() while token != None and (token[0] == "sep" or token[0] == "op"): if token[0] == "sep": if token[1] == "[": type = type + token[1] token = self.token() while token != None and (token[0] != "sep" or \ token[1] != ";"): type = type + token[1] token = self.token() if token != None and token[0] == "op" and token[1] == "=": # # Skip the initialization of the variable # token = self.token() if token[0] == 'sep' and token[1] == '{': token = self.token() token = self.parseBlock(token) else: self.comment = None while token != None and (token[0] != "sep" or \ (token[1] != ';' and token[1] != ',')): token = self.token() self.comment = None if token == None or token[0] != "sep" or (token[1] != ';' and token[1] != ','): self.error("missing ';' or ',' after value") if token != None and token[0] == "sep": if token[1] == ";": self.comment = None token = self.token() if type == "struct": self.index_add(self.name, self.filename, not self.is_header, "struct", self.struct_fields) else: self.index_add(self.name, self.filename, not self.is_header, "variable", type) break elif token[1] == "(": token = self.token() token = self.parseSignature(token) if token == None: return None if token[0] == "sep" and token[1] == ";": d = self.mergeFunctionComment(self.name, ((type, None), self.signature), 1) self.index_add(self.name, self.filename, static, "function", d) token = self.token() elif token[0] == "sep" and token[1] == "{": d = self.mergeFunctionComment(self.name, ((type, None), self.signature), static) self.index_add(self.name, self.filename, static, "function", d) token = self.token() token = self.parseBlock(token); elif token[1] == ',': self.comment = None self.index_add(self.name, self.filename, static, "variable", type) type = type_orig token = self.token() while token != None and token[0] == "sep": type = type + token[1] token = self.token() if token != None and token[0] == "name": self.name = token[1] token = self.token() else: break return token def parse(self): self.warning("Parsing %s" % (self.filename)) token = self.token() while token != None: if token[0] == 'name': token = self.parseGlobal(token) else: self.error("token %s %s unexpected at the top level" % ( token[0], token[1])) token = self.parseGlobal(token) return self.parseTopComment(self.top_comment) return self.index class docBuilder: """A documentation builder""" def __init__(self, name, directories=['.'], excludes=[]): self.name = name self.directories = directories self.excludes = excludes + list(ignored_files.keys()) self.modules = {} self.headers = {} self.idx = index() self.xref = {} self.index = {} if name == 'libxml2': self.basename = 'libxml' else: self.basename = name def indexString(self, id, str): if str == None: return str = str.replace("'", ' ') str = str.replace('"', ' ') str = str.replace("/", ' ') str = str.replace('*', ' ') str = str.replace("[", ' ') str = str.replace("]", ' ') str = str.replace("(", ' ') str = str.replace(")", ' ') str = str.replace("<", ' ') str = str.replace('>', ' ') str = str.replace("&", ' ') str = str.replace('#', ' ') str = str.replace(",", ' ') str = str.replace('.', ' ') str = str.replace(';', ' ') tokens = str.split() for token in tokens: try: c = token[0] if string.ascii_letters.find(c) < 0: pass elif len(token) < 3: pass else: lower = token.lower() # TODO: generalize this a bit if lower == 'and' or lower == 'the': pass elif token in self.xref: self.xref[token].append(id) else: self.xref[token] = [id] except: pass def analyze(self): print("Project %s : %d headers, %d modules" % (self.name, len(list(self.headers.keys())), len(list(self.modules.keys())))) self.idx.analyze() def scanHeaders(self): for header in list(self.headers.keys()): parser = CParser(header) idx = parser.parse() self.headers[header] = idx; self.idx.merge(idx) def scanModules(self): for module in list(self.modules.keys()): parser = CParser(module) idx = parser.parse() # idx.analyze() self.modules[module] = idx self.idx.merge_public(idx) def scan(self): for directory in self.directories: files = glob.glob(directory + "/*.c") for file in files: skip = 0 for excl in self.excludes: if file.find(excl) != -1: print("Skipping %s" % file) skip = 1 break if skip == 0: self.modules[file] = None; files = glob.glob(directory + "/*.h") for file in files: skip = 0 for excl in self.excludes: if file.find(excl) != -1: print("Skipping %s" % file) skip = 1 break if skip == 0: self.headers[file] = None; self.scanHeaders() self.scanModules() def modulename_file(self, file): module = os.path.basename(file) if module[-2:] == '.h': module = module[:-2] elif module[-2:] == '.c': module = module[:-2] return module def serialize_enum(self, output, name): id = self.idx.enums[name] output.write(" \n") def serialize_macro(self, output, name): id = self.idx.macros[name] output.write(" \n" % (name, self.modulename_file(id.header))) if id.info != None: try: (args, desc) = id.info if desc != None and desc != "": output.write(" %s\n" % (escape(desc))) self.indexString(name, desc) for arg in args: (name, desc) = arg if desc != None and desc != "": output.write(" \n" % ( name, escape(desc))) self.indexString(name, desc) else: output.write(" \n" % (name)) except: pass output.write(" \n") def serialize_typedef(self, output, name): id = self.idx.typedefs[name] if id.info[0:7] == 'struct ': output.write(" \n"); try: for field in self.idx.structs[name].info: desc = field[2] self.indexString(name, desc) if desc == None: desc = '' else: desc = escape(desc) output.write(" \n" % (field[1] , field[0], desc)) except: print("Failed to serialize struct %s" % (name)) output.write(" \n") else: output.write("/>\n"); else : output.write(" \n %s\n" % (escape(desc))) output.write(" \n") else: output.write("/>\n") except: output.write("/>\n") def serialize_variable(self, output, name): id = self.idx.variables[name] if id.info != None: output.write(" \n" % ( name, self.modulename_file(id.header), id.info)) else: output.write(" \n" % ( name, self.modulename_file(id.header))) def serialize_function(self, output, name): id = self.idx.functions[name] if name == debugsym: print("=>", id) output.write(" <%s name='%s' file='%s' module='%s'>\n" % (id.type, name, self.modulename_file(id.header), self.modulename_file(id.module))) # # Processing of conditionals modified by Bill 1/1/05 # if id.conditionals != None: apstr = "" for cond in id.conditionals: if apstr != "": apstr = apstr + " && " apstr = apstr + cond output.write(" %s\n"% (apstr)); try: (ret, params, desc) = id.info if (desc == None or desc == '') and \ name[0:9] != "xmlThrDef" and name != "xmlDllMain": print("%s %s from %s has no description" % (id.type, name, self.modulename_file(id.module))) output.write(" %s\n" % (escape(desc))) self.indexString(name, desc) if ret[0] != None: if ret[0] == "void": output.write(" \n") else: output.write(" \n" % ( ret[0], escape(ret[1]))) self.indexString(name, ret[1]) for param in params: if param[0] == 'void': continue if param[2] == None: output.write(" \n" % (param[1], param[0])) else: output.write(" \n" % (param[1], param[0], escape(param[2]))) self.indexString(name, param[2]) except: print("Failed to save function %s info: " % name, repr(id.info)) output.write(" \n" % (id.type)) def serialize_exports(self, output, file): module = self.modulename_file(file) output.write(" \n" % (module)) dict = self.headers[file] if dict.info != None: for data in ('Summary', 'Description', 'Author'): try: output.write(" <%s>%s\n" % ( data.lower(), escape(dict.info[data]), data.lower())) except: print("Header %s lacks a %s description" % (module, data)) if 'Description' in dict.info: desc = dict.info['Description'] if desc.find("DEPRECATED") != -1: output.write(" \n") ids = list(dict.macros.keys()) ids.sort() for id in uniq(ids): # Macros are sometime used to masquerade other types. if id in dict.functions: continue if id in dict.variables: continue if id in dict.typedefs: continue if id in dict.structs: continue if id in dict.enums: continue output.write(" \n" % (id)) ids = list(dict.enums.keys()) ids.sort() for id in uniq(ids): output.write(" \n" % (id)) ids = list(dict.typedefs.keys()) ids.sort() for id in uniq(ids): output.write(" \n" % (id)) ids = list(dict.structs.keys()) ids.sort() for id in uniq(ids): output.write(" \n" % (id)) ids = list(dict.variables.keys()) ids.sort() for id in uniq(ids): output.write(" \n" % (id)) ids = list(dict.functions.keys()) ids.sort() for id in uniq(ids): output.write(" \n" % (id)) output.write(" \n") def serialize_xrefs_files(self, output): headers = list(self.headers.keys()) headers.sort() for file in headers: module = self.modulename_file(file) output.write(" \n" % (module)) dict = self.headers[file] ids = uniq(list(dict.functions.keys()) + list(dict.variables.keys()) + \ list(dict.macros.keys()) + list(dict.typedefs.keys()) + \ list(dict.structs.keys()) + list(dict.enums.keys())) ids.sort() for id in ids: output.write(" \n" % (id)) output.write(" \n") pass def serialize_xrefs_functions(self, output): funcs = {} for name in list(self.idx.functions.keys()): id = self.idx.functions[name] try: (ret, params, desc) = id.info for param in params: if param[0] == 'void': continue if param[0] in funcs: funcs[param[0]].append(name) else: funcs[param[0]] = [name] except: pass typ = list(funcs.keys()) typ.sort() for type in typ: if type == '' or type == 'void' or type == "int" or \ type == "char *" or type == "const char *" : continue output.write(" \n" % (type)) ids = funcs[type] ids.sort() pid = '' # not sure why we have dups, but get rid of them! for id in ids: if id != pid: output.write(" \n" % (id)) pid = id output.write(" \n") def serialize_xrefs_constructors(self, output): funcs = {} for name in list(self.idx.functions.keys()): id = self.idx.functions[name] try: (ret, params, desc) = id.info if ret[0] == "void": continue if ret[0] in funcs: funcs[ret[0]].append(name) else: funcs[ret[0]] = [name] except: pass typ = list(funcs.keys()) typ.sort() for type in typ: if type == '' or type == 'void' or type == "int" or \ type == "char *" or type == "const char *" : continue output.write(" \n" % (type)) ids = funcs[type] ids.sort() for id in ids: output.write(" \n" % (id)) output.write(" \n") def serialize_xrefs_alpha(self, output): letter = None ids = list(self.idx.identifiers.keys()) ids.sort() for id in ids: if id[0] != letter: if letter != None: output.write(" \n") letter = id[0] output.write(" \n" % (letter)) output.write(" \n" % (id)) if letter != None: output.write(" \n") def serialize_xrefs_references(self, output): typ = list(self.idx.identifiers.keys()) typ.sort() for id in typ: idf = self.idx.identifiers[id] module = idf.header output.write(" \n" % (id, 'html/' + self.basename + '-' + self.modulename_file(module) + '.html#' + id)) def serialize_xrefs_index(self, output): index = self.xref typ = list(index.keys()) typ.sort() letter = None count = 0 chunk = 0 chunks = [] for id in typ: if len(index[id]) > 30: continue if id[0] != letter: if letter == None or count > 200: if letter != None: output.write(" \n") output.write(" \n") count = 0 chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) output.write(" \n" % (chunk)) first_letter = id[0] chunk = chunk + 1 elif letter != None: output.write(" \n") letter = id[0] output.write(" \n" % (letter)) output.write(" \n" % (id)) tokens = index[id]; tokens.sort() tok = None for token in tokens: if tok == token: continue tok = token output.write(" \n" % (token)) count = count + 1 output.write(" \n") if letter != None: output.write(" \n") output.write(" \n") if count != 0: chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) output.write(" \n") for ch in chunks: output.write(" \n" % ( ch[0], ch[1], ch[2])) output.write(" \n") def serialize_xrefs(self, output): output.write(" \n") self.serialize_xrefs_references(output) output.write(" \n") output.write(" \n") self.serialize_xrefs_alpha(output) output.write(" \n") output.write(" \n") self.serialize_xrefs_constructors(output) output.write(" \n") output.write(" \n") self.serialize_xrefs_functions(output) output.write(" \n") output.write(" \n") self.serialize_xrefs_files(output) output.write(" \n") output.write(" \n") self.serialize_xrefs_index(output) output.write(" \n") def serialize(self): filename = "%s-api.xml" % self.name print("Saving XML description %s" % (filename)) output = open(filename, "w") output.write('\n') output.write("\n" % self.name) output.write(" \n") headers = list(self.headers.keys()) headers.sort() for file in headers: self.serialize_exports(output, file) output.write(" \n") output.write(" \n") macros = list(self.idx.macros.keys()) macros.sort() for macro in macros: self.serialize_macro(output, macro) enums = list(self.idx.enums.keys()) enums.sort() for enum in enums: self.serialize_enum(output, enum) typedefs = list(self.idx.typedefs.keys()) typedefs.sort() for typedef in typedefs: self.serialize_typedef(output, typedef) variables = list(self.idx.variables.keys()) variables.sort() for variable in variables: self.serialize_variable(output, variable) functions = list(self.idx.functions.keys()) functions.sort() for function in functions: self.serialize_function(output, function) output.write(" \n") output.write("\n") output.close() filename = "%s-refs.xml" % self.name print("Saving XML Cross References %s" % (filename)) output = open(filename, "w") output.write('\n') output.write("\n" % self.name) self.serialize_xrefs(output) output.write("\n") output.close() def rebuild(): builder = None if glob.glob("parser.c") != [] : print("Rebuilding API description for libxml2") builder = docBuilder("libxml2", [".", "."], ["xmlwin32version.h", "tst.c"]) elif glob.glob("../parser.c") != [] : print("Rebuilding API description for libxml2") builder = docBuilder("libxml2", ["..", "../include/libxml"], ["xmlwin32version.h", "tst.c"]) elif glob.glob("../libxslt/transform.c") != [] : print("Rebuilding API description for libxslt") builder = docBuilder("libxslt", ["../libxslt"], ["win32config.h", "libxslt.h", "tst.c"]) else: print("rebuild() failed, unable to guess the module") return None builder.scan() builder.analyze() builder.serialize() if glob.glob("../libexslt/exslt.c") != [] : extra = docBuilder("libexslt", ["../libexslt"], ["libexslt.h"]) extra.scan() extra.analyze() extra.serialize() return builder # # for debugging the parser # def parse(filename): parser = CParser(filename) idx = parser.parse() return idx if __name__ == "__main__": if len(sys.argv) > 1: debug = 1 parse(sys.argv[1]) else: rebuild() libxml2-2.9.1+dfsg1/doc/site.xsl0000644000175000017500000006445512113312342015023 0ustar aronaron Main Menu intro.html docs.html bugs.html help.html help.html downloads.html news.html contribs.html xsltproc2.html XSLT.html XMLinfo.html xmldtd.html namespaces.html catalog.html encoding.html FAQ.html unknown.html xsltproc2.html API.html XSLT.html tree.html library.html interface.html example.html entities.html architecture.html namespaces.html DOM.html upgrade.html xmlio.html xmlmem.html threads.html python.html unknown.html intro.html docs.html bugs.html help.html help.html downloads.html news.html contribs.html xsltproc2.html API.html XSLT.html XMLinfo.html xmldtd.html tree.html library.html interface.html example.html entities.html architecture.html namespaces.html DOM.html catalog.html upgrade.html encoding.html xmlio.html xmlmem.html threads.html FAQ.html python.html unknown.html
    Related links
    Developer Menu
    API Indexes
    Related links
    <xsl:apply-templates/>
    Action against software patents Gnome2 Logo W3C Logo Red Hat Logo
    Made with Libxml2 Logo

    Daniel Veillard

    Daniel Veillard

    Generating the Web pages
    libxml2-2.9.1+dfsg1/doc/APIchunk0.html0000644000175000017500000007261112134171042015733 0ustar aronaron API Alphabetic Index A-B for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index A-B for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter A:

    A-Z
    xmlCheckLanguageID
    A-Za-z
    xmlParseEncName
    A-Za-z0-9
    xmlParseEncName
    ABC
    xmlXPathTranslateFunction
    ABI
    _xmlError
    ALL
    xmlAutomataNewAllTrans
    ANY
    xmlIsMixedElement
    xmlParseElementContentDecl
    APIs
    LIBXML_LEGACY_ENABLED
    xmlSchemaValidateSetFilename
    ARRAY
    xmlStrlen
    xmlUTF8Strsize
    ASCII
    UTF8ToHtml
    docbEncodeEntities
    htmlEncodeEntities
    xmlAddEncodingAlias
    xmlDelEncodingAlias
    xmlEncodeEntitiesReentrant
    xmlGetEncodingAlias
    xmlModuleOpen
    xmlModuleSymbol
    xmlNewCharEncodingHandler
    xmlParseCharEncoding
    ATTLIST
    xmlTextWriterStartDTDAttlist
    xmlTextWriterStartDTDEntity
    xmlTextWriterWriteDTDAttlist
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteVFormatDTDAttlist
    ATTRIBUTE
    xmlAddChild
    xmlAddNextSibling
    xmlAddPrevSibling
    Absolute
    xmlBuildURI
    Accessor
    xmlSchemaGetValType
    xmlSchemaValueGetAsBoolean
    xmlSchemaValueGetAsString
    xmlSchemaValueGetNext
    Activation
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    Actually
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    Add
    xmlACatalogAdd
    xmlAddChild
    xmlAddChildList
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlAddSibling
    xmlBufferAdd
    xmlBufferAddHead
    xmlCatalogAdd
    xmlCatalogAddLocal
    xmlDictLookup
    xmlDictQLookup
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    Added
    xmlDictGetUsage
    xmlDictSetLimit
    Additional
    _htmlElemDesc
    xmlCleanupGlobals
    xmlInitGlobals
    AegeanNumbers
    xmlUCSIsAegeanNumbers
    All
    _xmlSchema
    _xmlSchemaType
    xmlNanoFTPGet
    xmlNanoFTPList
    xmlParseAttValue
    xmlTextWriterEndDocument
    Allocate
    htmlNewParserCtxt
    xmlNanoFTPNewCtxt
    xmlNewDocElementContent
    xmlNewElementContent
    xmlNewParserCtxt
    xmlNewValidCtxt
    xmlSchemaNewFacet
    xmlSchemaNewNOTATIONValue
    xmlSchemaNewQNameValue
    xmlSchemaNewStringValue
    Allocates
    xmlDOMWrapNewCtxt
    Allows
    xmlCatalogSetDefaultPrefer
    xmlSchemaValidateSetLocator
    AlphabeticPresentationForms
    xmlUCSIsAlphabeticPresentationForms
    Also
    xmlCheckUTF8
    xmlParseAttribute
    xmlValidCtxtNormalizeAttributeValue
    Always
    IS_COMBINING_CH
    Append
    xmlBufferCCat
    xmlBufferCat
    xmlNodeAddContent
    xmlNodeAddContentLen
    Appendix
    xmlRegexpCompile
    Appends
    xmlSchemaValueAppend
    Applies
    htmlCtxtUseOptions
    xmlCtxtUseOptions
    xmlNormalizeURIPath
    xmlXPathCompiledEvalToBoolean
    Apply
    XML_SCHEMAS_ANYATTR_STRICT
    XML_SCHEMAS_ANY_STRICT
    Arabic
    xmlUCSIsArabic
    ArabicPresentationForms-A
    xmlUCSIsArabicPresentationFormsA
    ArabicPresentationForms-B
    xmlUCSIsArabicPresentationFormsB
    Armenian
    xmlUCSIsArmenian
    Array
    _xmlXPathContext
    Arrows
    xmlUCSIsArrows
    Associate
    xmlSetNs
    Att
    xmlParseStartTag
    AttDef
    xmlParseAttributeListDecl
    AttType
    xmlParseAttributeListDecl
    xmlParseAttributeType
    AttValue
    htmlParseElement
    xmlParseAttValue
    xmlParseAttribute
    xmlParseDefaultDecl
    AttlistDecl
    xmlParseAttributeListDecl
    xmlParseMarkupDecl
    Attribute
    _xmlAttribute
    htmlNodeStatus
    htmlParseElement
    xmlParseAttribute
    xmlParseAttributeListDecl
    xmlParseAttributeType
    xmlParseDefaultDecl
    xmlParseStartTag
    xmlTextReaderIsDefault
    xmlTextReaderMoveToElement
    xmlValidateAttributeDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    Attribute-Value
    xmlParseAttValue
    Attributes
    _htmlElemDesc
    xmlParseNotationType
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    xmlXPtrBuildNodeList
    Automatic
    docbCreateFileParserCtxt
    docbParseFile
    docbSAXParseFile
    htmlCreateFileParserCtxt
    htmlParseFile
    htmlSAXParseFile
    xmlCreateEntityParserCtxt
    xmlCreateFileParserCtxt
    xmlCreateURLParserCtxt
    xmlOutputBufferCreateFilename
    xmlParseFile
    xmlParserInputBufferCreateFilename
    xmlRecoverFile
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXUserParseFile
    Automatically
    xmlIsBaseCharQ
    xmlIsBaseChar_ch
    xmlIsBlankQ
    xmlIsBlank_ch
    xmlIsCharQ
    xmlIsChar_ch
    xmlIsCombiningQ
    xmlIsDigitQ
    xmlIsDigit_ch
    xmlIsExtenderQ
    xmlIsExtender_ch
    xmlIsIdeographicQ
    xmlIsPubidCharQ
    xmlIsPubidChar_ch

    Letter B:

    BASE
    xmlNodeGetBase
    BAr
    xmlXPathTranslateFunction
    BOM
    xmlCharEncOutFunc
    Balanced
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseEntity
    xmlParseInNodeContext
    xmlSAXParseEntity
    Base
    _xmlParserInput
    _xmlSchemaType
    xmlNodeGetBase
    BaseChar
    IS_BASECHAR
    IS_LETTER
    xmlIsLetter
    Based
    xmlExpExpDerive
    xmlXPathIsInf
    xmlXPathIsNaN
    BasicLatin
    xmlUCSIsBasicLatin
    Basically
    xmlValidateDtd
    Before
    xmlParseAttValue
    Behaves
    IS_CHAR_CH
    IS_DIGIT_CH
    IS_EXTENDER_CH
    Behaviour
    IS_BLANK_CH
    Bengali
    xmlUCSIsBengali
    Best
    xmlTextReaderGetRemainder
    BinHex
    xmlTextWriterWriteBinHex
    Bit
    XML_COMPLETE_ATTRS
    XML_DETECT_IDS
    XML_SKIP_IDS
    BlockElements
    xmlUCSIsBlockElements
    Blocks
    xmlStopParser
    Bopomofo
    xmlUCSIsBopomofo
    BopomofoExtended
    xmlUCSIsBopomofoExtended
    Both
    XML_SUBSTITUTE_BOTH
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    BoxDrawing
    xmlUCSIsBoxDrawing
    BraillePatterns
    xmlUCSIsBraillePatterns
    Brzozowski
    xmlExpExpDerive
    xmlExpStringDerive
    Buffer
    xmlIOParseDTD
    Bugs:
    _htmlElemDesc
    Buhid
    xmlUCSIsBuhid
    Build
    xmlCopyAttributeTable
    xmlCopyDocElementContent
    xmlCopyElementContent
    xmlCopyElementTable
    xmlCopyEntitiesTable
    xmlCopyNotationTable
    xmlGetNodePath
    xmlNodeListGetString
    xmlRegNewExecCtxt
    xmlValidBuildContentModel
    xmlValidGetPotentialChildren
    xmlXPtrBuildNodeList
    Builds
    xmlBuildQName
    xmlNodeListGetRawString
    But
    xmlValidateNotationDecl
    ByzantineMusicalSymbols
    xmlUCSIsByzantineMusicalSymbols

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIfunctions.html0000644000175000017500000064767612134171042016576 0ustar aronaron List of function manipulating types in libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    List of function manipulating types in libxml2

    Developer Menu
    API Indexes
    Related links

    Type ...:

    errorSAXFunc
    fatalErrorSAXFunc
    warningSAXFunc
    xmlGenericErrorFunc
    xmlParserError
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserWarning
    xmlRelaxNGValidityErrorFunc
    xmlRelaxNGValidityWarningFunc
    xmlSchemaValidityErrorFunc
    xmlSchemaValidityWarningFunc
    xmlSchematronValidityErrorFunc
    xmlSchematronValidityWarningFunc
    xmlStrPrintf
    xmlTextWriterWriteFormatAttribute
    xmlTextWriterWriteFormatAttributeNS
    xmlTextWriterWriteFormatCDATA
    xmlTextWriterWriteFormatComment
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteFormatDTDElement
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteFormatElement
    xmlTextWriterWriteFormatElementNS
    xmlTextWriterWriteFormatPI
    xmlTextWriterWriteFormatRaw
    xmlTextWriterWriteFormatString
    xmlValidityErrorFunc
    xmlValidityWarningFunc

    Type FILE *:

    htmlDocDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    xmlACatalogDump
    xmlBufferDump
    xmlCatalogDump
    xmlDebugCheckDocument
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpDTD
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpEntities
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlDebugDumpString
    xmlDocDump
    xmlDocFormatDump
    xmlElemDump
    xmlLsOneNode
    xmlMemDisplay
    xmlMemDisplayLast
    xmlMemShow
    xmlOutputBufferCreateFile
    xmlParserInputBufferCreateFile
    xmlPrintURI
    xmlRegexpPrint
    xmlRelaxNGDump
    xmlRelaxNGDumpTree
    xmlSchemaDump
    xmlShell
    xmlXPathDebugDumpCompExpr
    xmlXPathDebugDumpObject

    Type char **:

    xmlNanoHTTPFetch
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir

    Type char const *:

    xmlInputMatchCallback
    xmlInputOpenCallback
    xmlOutputMatchCallback
    xmlOutputOpenCallback

    Type const char **:

    xmlGetFeaturesList
    xmlSchemaValidityLocatorFunc

    Type const htmlElemDesc *:

    htmlAttrAllowed
    htmlElementAllowedHere
    htmlElementStatusHere

    Type const htmlNodePtr:

    htmlNodeStatus

    Type const unsigned char *:

    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlCheckUTF8
    xmlDetectCharEncoding
    xmlGetUTF8Char

    Type const void *:

    xmlListDataCompare
    xmlListReverseWalk
    xmlListWalk
    xmlListWalker

    Type const xlinkHRef:

    xlinkSimpleLinkFunk

    Type const xlinkHRef *:

    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk

    Type const xlinkRole:

    xlinkSimpleLinkFunk

    Type const xlinkRole *:

    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk

    Type const xlinkTitle:

    xlinkSimpleLinkFunk

    Type const xlinkTitle *:

    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk

    Type const xmlBufPtr:

    xmlBufContent
    xmlBufEnd
    xmlBufUse

    Type const xmlBufferPtr:

    xmlBufferContent
    xmlBufferLength

    Type const xmlChRangeGroup *:

    xmlCharInRange

    Type const xmlChar *:

    attribute
    attributeDecl
    attributeDeclSAXFunc
    attributeSAXFunc
    cdataBlock
    cdataBlockSAXFunc
    characters
    charactersSAXFunc
    comment
    commentSAXFunc
    elementDecl
    elementDeclSAXFunc
    endElement
    endElementNsSAX2Func
    endElementSAXFunc
    entityDecl
    entityDeclSAXFunc
    externalSubset
    externalSubsetSAXFunc
    getEntity
    getEntitySAXFunc
    getParameterEntity
    getParameterEntitySAXFunc
    globalNamespace
    htmlAttrAllowed
    htmlAutoCloseTag
    htmlCtxtReadDoc
    htmlElementAllowedHere
    htmlEntityLookup
    htmlIsBooleanAttr
    htmlIsScriptAttribute
    htmlNewDoc
    htmlNewDocNoDtD
    htmlReadDoc
    htmlSetMetaEncoding
    htmlTagLookup
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    internalSubset
    internalSubsetSAXFunc
    namePush
    namespaceDecl
    notationDecl
    notationDeclSAXFunc
    processingInstruction
    processingInstructionSAXFunc
    reference
    referenceSAXFunc
    resolveEntity
    resolveEntitySAXFunc
    setNamespace
    startElement
    startElementNsSAX2Func
    startElementSAXFunc
    unparsedEntityDecl
    unparsedEntityDeclSAXFunc
    xmlACatalogAdd
    xmlACatalogRemove
    xmlACatalogResolve
    xmlACatalogResolvePublic
    xmlACatalogResolveSystem
    xmlACatalogResolveURI
    xmlAddAttributeDecl
    xmlAddDocEntity
    xmlAddDtdEntity
    xmlAddElementDecl
    xmlAddID
    xmlAddNotationDecl
    xmlAddRef
    xmlAttrSerializeTxtContent
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlBufferAdd
    xmlBufferAddHead
    xmlBufferCat
    xmlBufferWriteCHAR
    xmlBufferWriteQuotedString
    xmlBuildQName
    xmlBuildRelativeURI
    xmlBuildURI
    xmlCanonicPath
    xmlCatalogAdd
    xmlCatalogAddLocal
    xmlCatalogGetPublic
    xmlCatalogGetSystem
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCatalogRemove
    xmlCatalogResolve
    xmlCatalogResolvePublic
    xmlCatalogResolveSystem
    xmlCatalogResolveURI
    xmlCheckLanguageID
    xmlCreateDocParserCtxt
    xmlCreateEntityParserCtxt
    xmlCreateEnumeration
    xmlCreateIntSubset
    xmlCtxtReadDoc
    xmlDOMWrapAcquireNsFunction
    xmlDebugDumpString
    xmlDictExists
    xmlDictLookup
    xmlDictOwns
    xmlDictQLookup
    xmlEncodeEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlExpNewAtom
    xmlExpStringDerive
    xmlGetDocEntity
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdEntity
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlGetID
    xmlGetNoNsProp
    xmlGetNsProp
    xmlGetParameterEntity
    xmlGetPredefinedEntity
    xmlGetProp
    xmlGetRefs
    xmlHasNsProp
    xmlHasProp
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashLookup
    xmlHashLookup2
    xmlHashLookup3
    xmlHashQLookup
    xmlHashQLookup2
    xmlHashQLookup3
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashScan3
    xmlHashScanFull3
    xmlHashScannerFull
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlIsMixedElement
    xmlIsXHTML
    xmlNewCDataBlock
    xmlNewCharRef
    xmlNewChild
    xmlNewComment
    xmlNewDoc
    xmlNewDocComment
    xmlNewDocElementContent
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocPI
    xmlNewDocProp
    xmlNewDocRawNode
    xmlNewDocText
    xmlNewDocTextLen
    xmlNewDtd
    xmlNewElementContent
    xmlNewEntity
    xmlNewGlobalNs
    xmlNewNode
    xmlNewNs
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewPI
    xmlNewProp
    xmlNewReference
    xmlNewStringInputStream
    xmlNewText
    xmlNewTextChild
    xmlNewTextLen
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeSetBase
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlNodeSetLang
    xmlNodeSetName
    xmlNormalizeWindowsPath
    xmlOutputBufferWriteEscape
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCtxtExternalEntity
    xmlParseDTD
    xmlParseDoc
    xmlParseElementContentDecl
    xmlParseExternalEntity
    xmlParseExternalSubset
    xmlPathToURI
    xmlPatterncompile
    xmlReadDoc
    xmlReaderForDoc
    xmlReaderNewDoc
    xmlRecoverDoc
    xmlRegExecCallbacks
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRegexpCompile
    xmlRegexpExec
    xmlRelaxNGValidatePushCData
    xmlSAX2AttributeDecl
    xmlSAX2CDataBlock
    xmlSAX2Characters
    xmlSAX2Comment
    xmlSAX2ElementDecl
    xmlSAX2EndElement
    xmlSAX2EndElementNs
    xmlSAX2EntityDecl
    xmlSAX2ExternalSubset
    xmlSAX2GetEntity
    xmlSAX2GetParameterEntity
    xmlSAX2IgnorableWhitespace
    xmlSAX2InternalSubset
    xmlSAX2NotationDecl
    xmlSAX2ProcessingInstruction
    xmlSAX2Reference
    xmlSAX2ResolveEntity
    xmlSAX2StartElement
    xmlSAX2StartElementNs
    xmlSAX2UnparsedEntityDecl
    xmlSAXParseDTD
    xmlSAXParseDoc
    xmlSchemaCheckFacet
    xmlSchemaCollapseString
    xmlSchemaGetPredefinedType
    xmlSchemaNewNOTATIONValue
    xmlSchemaNewQNameValue
    xmlSchemaNewStringValue
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    xmlSchemaValidatePredefinedType
    xmlSchemaWhiteSpaceReplace
    xmlSearchNs
    xmlSearchNsByHref
    xmlSetNsProp
    xmlSetProp
    xmlSetupParserForBuffer
    xmlSplitQName
    xmlSplitQName2
    xmlSplitQName3
    xmlStrEqual
    xmlStrPrintf
    xmlStrQEqual
    xmlStrVPrintf
    xmlStrcasecmp
    xmlStrcasestr
    xmlStrcat
    xmlStrchr
    xmlStrcmp
    xmlStrdup
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlStringCurrentChar
    xmlStringDecodeEntities
    xmlStringGetNodeList
    xmlStringLenDecodeEntities
    xmlStringLenGetNodeList
    xmlStrlen
    xmlStrncasecmp
    xmlStrncat
    xmlStrncatNew
    xmlStrncmp
    xmlStrndup
    xmlStrstr
    xmlStrsub
    xmlTextConcat
    xmlTextReaderConstString
    xmlTextReaderGetAttribute
    xmlTextReaderGetAttributeNs
    xmlTextReaderLookupNamespace
    xmlTextReaderMoveToAttribute
    xmlTextReaderMoveToAttributeNs
    xmlTextReaderPreservePattern
    xmlTextWriterSetIndentString
    xmlTextWriterStartAttribute
    xmlTextWriterStartAttributeNS
    xmlTextWriterStartDTD
    xmlTextWriterStartDTDAttlist
    xmlTextWriterStartDTDElement
    xmlTextWriterStartDTDEntity
    xmlTextWriterStartElement
    xmlTextWriterStartElementNS
    xmlTextWriterStartPI
    xmlTextWriterWriteAttribute
    xmlTextWriterWriteAttributeNS
    xmlTextWriterWriteCDATA
    xmlTextWriterWriteComment
    xmlTextWriterWriteDTD
    xmlTextWriterWriteDTDAttlist
    xmlTextWriterWriteDTDElement
    xmlTextWriterWriteDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTDExternalEntityContents
    xmlTextWriterWriteDTDInternalEntity
    xmlTextWriterWriteDTDNotation
    xmlTextWriterWriteElement
    xmlTextWriterWriteElementNS
    xmlTextWriterWriteFormatAttribute
    xmlTextWriterWriteFormatAttributeNS
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteFormatDTDElement
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteFormatElement
    xmlTextWriterWriteFormatElementNS
    xmlTextWriterWriteFormatPI
    xmlTextWriterWritePI
    xmlTextWriterWriteRaw
    xmlTextWriterWriteRawLen
    xmlTextWriterWriteString
    xmlTextWriterWriteVFormatAttribute
    xmlTextWriterWriteVFormatAttributeNS
    xmlTextWriterWriteVFormatDTD
    xmlTextWriterWriteVFormatDTDAttlist
    xmlTextWriterWriteVFormatDTDElement
    xmlTextWriterWriteVFormatDTDInternalEntity
    xmlTextWriterWriteVFormatElement
    xmlTextWriterWriteVFormatElementNS
    xmlTextWriterWriteVFormatPI
    xmlURIEscape
    xmlURIEscapeStr
    xmlUTF8Charcmp
    xmlUTF8Size
    xmlUTF8Strlen
    xmlUTF8Strloc
    xmlUTF8Strndup
    xmlUTF8Strpos
    xmlUTF8Strsize
    xmlUTF8Strsub
    xmlUnsetNsProp
    xmlUnsetProp
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlValidateAttributeValue
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateNameValue
    xmlValidateNamesValue
    xmlValidateNmtokenValue
    xmlValidateNmtokensValue
    xmlValidateNotationUse
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    xmlValidatePopElement
    xmlValidatePushCData
    xmlValidatePushElement
    xmlValidateQName
    xmlXPathCastStringToBoolean
    xmlXPathCastStringToNumber
    xmlXPathCompile
    xmlXPathCtxtCompile
    xmlXPathEval
    xmlXPathEvalExpression
    xmlXPathFuncLookupFunc
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS
    xmlXPathIsNodeType
    xmlXPathNewParserContext
    xmlXPathNewString
    xmlXPathNodeEval
    xmlXPathNsLookup
    xmlXPathRegisterFunc
    xmlXPathRegisterFuncNS
    xmlXPathRegisterNs
    xmlXPathRegisterVariable
    xmlXPathRegisterVariableNS
    xmlXPathStringEvalNumber
    xmlXPathVariableLookup
    xmlXPathVariableLookupFunc
    xmlXPathVariableLookupNS
    xmlXPtrEval

    Type const xmlChar **:

    htmlParseEntityRef
    startElement
    startElementNsSAX2Func
    startElementSAXFunc
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xmlExpGetLanguage
    xmlExpGetStart
    xmlPatterncompile
    xmlRegExecErrInfo
    xmlSAX2StartElement
    xmlSAX2StartElementNs
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlTextReaderPreservePattern
    xmlValidGetPotentialChildren
    xmlValidGetValidElements

    Type const xmlListPtr:

    xmlListCopy
    xmlListDup

    Type const xmlNodePtr:

    xmlCopyNode
    xmlCopyNodeList
    xmlDocCopyNode
    xmlDocCopyNodeList
    xmlParserFindNodeInfo
    xmlParserFindNodeInfoIndex

    Type const xmlParserCtxtPtr:

    xmlParserFindNodeInfo

    Type const xmlParserNodeInfoPtr:

    xmlParserAddNodeInfo

    Type const xmlParserNodeInfoSeqPtr:

    xmlParserFindNodeInfoIndex

    Type docbParserCtxtPtr:

    docbFreeParserCtxt
    docbParseChunk
    docbParseDocument

    Type docbSAXHandlerPtr:

    docbCreatePushParserCtxt
    docbSAXParseDoc
    docbSAXParseFile

    Type double:

    xmlXPathCastNumberToBoolean
    xmlXPathCastNumberToString
    xmlXPathIsInf
    xmlXPathIsNaN
    xmlXPathNewFloat

    Type ftpDataCallback:

    xmlNanoFTPGet

    Type ftpListCallback:

    xmlNanoFTPList

    Type htmlDocPtr:

    htmlAutoCloseTag
    htmlGetMetaEncoding
    htmlIsAutoClosed
    htmlSetMetaEncoding

    Type htmlNodePtr:

    htmlAutoCloseTag
    htmlIsAutoClosed

    Type htmlParserCtxtPtr:

    htmlCtxtReadDoc
    htmlCtxtReadFd
    htmlCtxtReadFile
    htmlCtxtReadIO
    htmlCtxtReadMemory
    htmlCtxtReset
    htmlCtxtUseOptions
    htmlFreeParserCtxt
    htmlParseCharRef
    htmlParseChunk
    htmlParseDocument
    htmlParseElement
    htmlParseEntityRef

    Type htmlSAXHandlerPtr:

    htmlCreatePushParserCtxt
    htmlSAXParseDoc
    htmlSAXParseFile

    Type int *:

    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlDocDumpMemory
    htmlDocDumpMemoryFormat
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlCurrentChar
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemory
    xmlDocDumpMemoryEnc
    xmlGetFeaturesList
    xmlGetUTF8Char
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlSplitQName3
    xmlStringCurrentChar
    xmlValidGetPotentialChildren

    Type long:

    xmlMemDisplayLast

    Type size_t:

    xmlBufShrink
    xmlBufferCreateSize
    xmlBufferCreateStatic
    xmlDictSetLimit
    xmlMallocAtomicLoc
    xmlMallocFunc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlReallocFunc
    xmlReallocLoc

    Type unsigned char *:

    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc

    Type unsigned int:

    htmlEntityValueLookup
    xmlBufferGrow
    xmlBufferResize
    xmlBufferShrink
    xmlCharInRange
    xmlIsBaseChar
    xmlIsBlank
    xmlIsChar
    xmlIsCombining
    xmlIsDigit
    xmlIsExtender
    xmlIsIdeographic
    xmlIsPubidChar

    Type unsigned long:

    ftpListCallback
    xmlDllMain
    xmlSchemaValidateListSimpleTypeFacet

    Type unsigned long *:

    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    xmlSchemaValidityLocatorFunc

    Type va_list:

    xmlStrVPrintf
    xmlTextWriterWriteVFormatAttribute
    xmlTextWriterWriteVFormatAttributeNS
    xmlTextWriterWriteVFormatCDATA
    xmlTextWriterWriteVFormatComment
    xmlTextWriterWriteVFormatDTD
    xmlTextWriterWriteVFormatDTDAttlist
    xmlTextWriterWriteVFormatDTDElement
    xmlTextWriterWriteVFormatDTDInternalEntity
    xmlTextWriterWriteVFormatElement
    xmlTextWriterWriteVFormatElementNS
    xmlTextWriterWriteVFormatPI
    xmlTextWriterWriteVFormatRaw
    xmlTextWriterWriteVFormatString

    Type void *:

    attribute
    attributeDecl
    attributeDeclSAXFunc
    attributeSAXFunc
    cdataBlock
    cdataBlockSAXFunc
    characters
    charactersSAXFunc
    checkNamespace
    comment
    commentSAXFunc
    docbCreatePushParserCtxt
    docbSAXParseDoc
    docbSAXParseFile
    elementDecl
    elementDeclSAXFunc
    endDocument
    endDocumentSAXFunc
    endElement
    endElementNsSAX2Func
    endElementSAXFunc
    entityDecl
    entityDeclSAXFunc
    errorSAXFunc
    externalSubset
    externalSubsetSAXFunc
    fatalErrorSAXFunc
    ftpDataCallback
    ftpListCallback
    getColumnNumber
    getEntity
    getEntitySAXFunc
    getLineNumber
    getNamespace
    getParameterEntity
    getParameterEntitySAXFunc
    getPublicId
    getSystemId
    globalNamespace
    hasExternalSubset
    hasExternalSubsetSAXFunc
    hasInternalSubset
    hasInternalSubsetSAXFunc
    htmlCreatePushParserCtxt
    htmlCtxtReadIO
    htmlReadIO
    htmlSAXParseDoc
    htmlSAXParseFile
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    internalSubset
    internalSubsetSAXFunc
    isStandalone
    isStandaloneSAXFunc
    namespaceDecl
    notationDecl
    notationDeclSAXFunc
    processingInstruction
    processingInstructionSAXFunc
    reference
    referenceSAXFunc
    resolveEntity
    resolveEntitySAXFunc
    setDocumentLocator
    setDocumentLocatorSAXFunc
    setNamespace
    startDocument
    startDocumentSAXFunc
    startElement
    startElementNsSAX2Func
    startElementSAXFunc
    unparsedEntityDecl
    unparsedEntityDeclSAXFunc
    warningSAXFunc
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkNodeDetectFunc
    xlinkSimpleLinkFunk
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlBufferCreateStatic
    xmlC14NExecute
    xmlC14NIsVisibleCallback
    xmlCatalogAddLocal
    xmlCatalogFreeLocal
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCreateIOParserCtxt
    xmlCreatePushParserCtxt
    xmlCtxtGetLastError
    xmlCtxtReadIO
    xmlCtxtResetLastError
    xmlDllMain
    xmlFileClose
    xmlFileRead
    xmlFreeFunc
    xmlGenericErrorFunc
    xmlGetFeature
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashCopier
    xmlHashDeallocator
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlHashScanner
    xmlHashScannerFull
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlIOFTPClose
    xmlIOFTPRead
    xmlIOHTTPClose
    xmlIOHTTPRead
    xmlInputCloseCallback
    xmlInputReadCallback
    xmlListAppend
    xmlListInsert
    xmlListPushBack
    xmlListPushFront
    xmlListRemoveAll
    xmlListRemoveFirst
    xmlListRemoveLast
    xmlListReverseSearch
    xmlListSearch
    xmlMemFree
    xmlMemRealloc
    xmlNanoFTPCheckResponse
    xmlNanoFTPClose
    xmlNanoFTPCloseConnection
    xmlNanoFTPConnect
    xmlNanoFTPCwd
    xmlNanoFTPDele
    xmlNanoFTPFreeCtxt
    xmlNanoFTPGet
    xmlNanoFTPGetConnection
    xmlNanoFTPGetResponse
    xmlNanoFTPGetSocket
    xmlNanoFTPList
    xmlNanoFTPQuit
    xmlNanoFTPRead
    xmlNanoFTPUpdateURL
    xmlNanoHTTPAuthHeader
    xmlNanoHTTPClose
    xmlNanoHTTPContentLength
    xmlNanoHTTPEncoding
    xmlNanoHTTPMimeType
    xmlNanoHTTPRead
    xmlNanoHTTPRedir
    xmlNanoHTTPReturnCode
    xmlNanoHTTPSave
    xmlOutputBufferCreateIO
    xmlOutputCloseCallback
    xmlOutputWriteCallback
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    xmlParserError
    xmlParserInputBufferCreateIO
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserWarning
    xmlReadIO
    xmlReaderForIO
    xmlReaderNewIO
    xmlReallocFunc
    xmlReallocLoc
    xmlRegExecCallbacks
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRegNewExecCtxt
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetParserStructuredErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxNGSetValidStructuredErrors
    xmlRelaxNGValidityErrorFunc
    xmlRelaxNGValidityWarningFunc
    xmlSAX2AttributeDecl
    xmlSAX2CDataBlock
    xmlSAX2Characters
    xmlSAX2Comment
    xmlSAX2ElementDecl
    xmlSAX2EndDocument
    xmlSAX2EndElement
    xmlSAX2EndElementNs
    xmlSAX2EntityDecl
    xmlSAX2ExternalSubset
    xmlSAX2GetColumnNumber
    xmlSAX2GetEntity
    xmlSAX2GetLineNumber
    xmlSAX2GetParameterEntity
    xmlSAX2GetPublicId
    xmlSAX2GetSystemId
    xmlSAX2HasExternalSubset
    xmlSAX2HasInternalSubset
    xmlSAX2IgnorableWhitespace
    xmlSAX2InternalSubset
    xmlSAX2IsStandalone
    xmlSAX2NotationDecl
    xmlSAX2ProcessingInstruction
    xmlSAX2Reference
    xmlSAX2ResolveEntity
    xmlSAX2SetDocumentLocator
    xmlSAX2StartDocument
    xmlSAX2StartElement
    xmlSAX2StartElementNs
    xmlSAX2UnparsedEntityDecl
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    xmlSAXUserParseFile
    xmlSAXUserParseMemory
    xmlSaveToIO
    xmlSchemaSetParserErrors
    xmlSchemaSetParserStructuredErrors
    xmlSchemaSetValidErrors
    xmlSchemaSetValidStructuredErrors
    xmlSchemaValidateSetLocator
    xmlSchemaValidateStream
    xmlSchemaValidityErrorFunc
    xmlSchemaValidityLocatorFunc
    xmlSchemaValidityWarningFunc
    xmlSchematronSetValidStructuredErrors
    xmlSchematronValidityErrorFunc
    xmlSchematronValidityWarningFunc
    xmlSetFeature
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlStructuredErrorFunc
    xmlTextReaderErrorFunc
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetStructuredErrorHandler
    xmlThrDefSetGenericErrorFunc
    xmlThrDefSetStructuredErrorFunc
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessTreeFlagsData
    xmlXPathFuncLookupFunc
    xmlXPathRegisterFuncLookup
    xmlXPathRegisterVariableLookup
    xmlXPathVariableLookupFunc
    xmlXPathWrapExternal

    Type void **:

    xmlModuleSymbol
    xmlRelaxNGGetParserErrors
    xmlRelaxNGGetValidErrors
    xmlSchemaGetParserErrors
    xmlSchemaGetValidErrors
    xmlSchemaSAXPlug
    xmlTextReaderGetErrorHandler

    Type xlinkActuate *:

    xlinkExtendedLinkFunk

    Type xlinkHandlerPtr:

    xlinkSetDefaultHandler

    Type xlinkNodeDetectFunc:

    xlinkSetDefaultDetect

    Type xlinkShow *:

    xlinkExtendedLinkFunk

    Type xmlAttrPtr:

    xmlAddID
    xmlAddRef
    xmlAttrSerializeTxtContent
    xmlCopyProp
    xmlCopyPropList
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlFreeProp
    xmlFreePropList
    xmlIsID
    xmlIsRef
    xmlRemoveID
    xmlRemoveProp
    xmlRemoveRef
    xmlValidateOneAttribute

    Type xmlAttributeDefault:

    xmlAddAttributeDecl

    Type xmlAttributePtr:

    xmlDumpAttributeDecl
    xmlValidateAttributeDecl

    Type xmlAttributeTablePtr:

    xmlCopyAttributeTable
    xmlDumpAttributeTable
    xmlFreeAttributeTable

    Type xmlAttributeType:

    xmlAddAttributeDecl
    xmlValidateAttributeValue

    Type xmlAutomataPtr:

    xmlAutomataCompile
    xmlAutomataGetInitState
    xmlAutomataIsDeterminist
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounter
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewState
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlAutomataSetFinalState
    xmlFreeAutomata

    Type xmlAutomataStatePtr:

    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlAutomataSetFinalState

    Type xmlBufPtr:

    xmlBufGetNodeContent
    xmlBufNodeDump
    xmlBufShrink

    Type xmlBufferAllocationScheme:

    xmlBufferSetAllocationScheme
    xmlSetBufferAllocationScheme
    xmlThrDefBufferAllocScheme

    Type xmlBufferPtr:

    htmlNodeDump
    xmlAttrSerializeTxtContent
    xmlBufferAdd
    xmlBufferAddHead
    xmlBufferCCat
    xmlBufferCat
    xmlBufferDetach
    xmlBufferDump
    xmlBufferEmpty
    xmlBufferFree
    xmlBufferGrow
    xmlBufferResize
    xmlBufferSetAllocationScheme
    xmlBufferShrink
    xmlBufferWriteCHAR
    xmlBufferWriteChar
    xmlBufferWriteQuotedString
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    xmlDumpAttributeDecl
    xmlDumpAttributeTable
    xmlDumpElementDecl
    xmlDumpElementTable
    xmlDumpEntitiesTable
    xmlDumpEntityDecl
    xmlDumpNotationDecl
    xmlDumpNotationTable
    xmlExpDump
    xmlNewTextWriterMemory
    xmlNodeBufGetContent
    xmlNodeDump
    xmlOutputBufferCreateBuffer
    xmlSaveToBuffer

    Type xmlC14NIsVisibleCallback:

    xmlC14NExecute

    Type xmlCatalogAllow:

    xmlCatalogSetDefaults

    Type xmlCatalogPrefer:

    xmlCatalogSetDefaultPrefer

    Type xmlCatalogPtr:

    xmlACatalogAdd
    xmlACatalogDump
    xmlACatalogRemove
    xmlACatalogResolve
    xmlACatalogResolvePublic
    xmlACatalogResolveSystem
    xmlACatalogResolveURI
    xmlCatalogIsEmpty
    xmlConvertSGMLCatalog
    xmlFreeCatalog

    Type xmlChar:

    xmlDecodeEntities
    xmlStrchr
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlTextWriterSetQuoteChar

    Type xmlChar *:

    checkNamespace
    docbParseDoc
    docbSAXParseDoc
    entityDecl
    entityDeclSAXFunc
    htmlParseDoc
    htmlSAXParseDoc
    xmlBuildQName
    xmlCopyChar
    xmlCopyCharMultiByte
    xmlHashCopier
    xmlHashDeallocator
    xmlHashScanner
    xmlNewDocNodeEatName
    xmlNewNodeEatName
    xmlNewNsPropEatName
    xmlParserInputDeallocate
    xmlSAX2EntityDecl
    xmlStrPrintf
    xmlStrVPrintf
    xmlStrcat
    xmlStrncat
    xmlXPathWrapString

    Type xmlChar **:

    htmlDocDumpMemory
    htmlDocDumpMemoryFormat
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemory
    xmlDocDumpMemoryEnc
    xmlNamespaceParseQName
    xmlParseAttribute
    xmlParseDefaultDecl
    xmlParseEntityValue
    xmlParseExternalID
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlSplitQName
    xmlSplitQName2

    Type xmlCharEncoding:

    docbCreatePushParserCtxt
    htmlCreatePushParserCtxt
    xmlAllocParserInputBuffer
    xmlCreateIOParserCtxt
    xmlGetCharEncodingHandler
    xmlGetCharEncodingName
    xmlIOParseDTD
    xmlNewIOInputStream
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateFilenameFunc
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    xmlSchemaValidateStream
    xmlSwitchEncoding

    Type xmlCharEncodingHandler *:

    xmlCharEncCloseFunc
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc

    Type xmlCharEncodingHandlerPtr:

    xmlAllocOutputBuffer
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferCreateIO
    xmlRegisterCharEncodingHandler
    xmlSwitchInputEncoding
    xmlSwitchToEncoding

    Type xmlCharEncodingInputFunc:

    xmlNewCharEncodingHandler

    Type xmlCharEncodingOutputFunc:

    xmlNewCharEncodingHandler
    xmlOutputBufferWriteEscape
    xmlSaveSetAttrEscape
    xmlSaveSetEscape

    Type xmlDOMWrapCtxtPtr:

    xmlDOMWrapAcquireNsFunction
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapFreeCtxt
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode

    Type xmlDeregisterNodeFunc:

    xmlDeregisterNodeDefault
    xmlThrDefDeregisterNodeDefault

    Type xmlDict *:

    xmlPatterncompile

    Type xmlDictPtr:

    xmlDictCreateSub
    xmlDictExists
    xmlDictFree
    xmlDictGetUsage
    xmlDictLookup
    xmlDictOwns
    xmlDictQLookup
    xmlDictReference
    xmlDictSetLimit
    xmlDictSize
    xmlExpNewCtxt
    xmlHashCreateDict

    Type xmlDocPtr:

    htmlDocContentDumpFormatOutput
    htmlDocContentDumpOutput
    htmlDocDump
    htmlDocDumpMemory
    htmlDocDumpMemoryFormat
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    htmlSaveFile
    htmlSaveFileEnc
    htmlSaveFileFormat
    xlinkIsLink
    xmlAddDocEntity
    xmlAddDtdEntity
    xmlAddID
    xmlAddRef
    xmlAttrSerializeTxtContent
    xmlBufNodeDump
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCopyDoc
    xmlCopyDocElementContent
    xmlCreateIntSubset
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapRemoveNode
    xmlDebugCheckDocument
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpEntities
    xmlDocCopyNode
    xmlDocCopyNodeList
    xmlDocDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemory
    xmlDocDumpMemoryEnc
    xmlDocFormatDump
    xmlDocGetRootElement
    xmlDocSetRootElement
    xmlElemDump
    xmlEncodeEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlFreeDoc
    xmlFreeDocElementContent
    xmlGetDocCompressMode
    xmlGetDocEntity
    xmlGetDtdEntity
    xmlGetID
    xmlGetIntSubset
    xmlGetNsList
    xmlGetParameterEntity
    xmlGetRefs
    xmlIsID
    xmlIsMixedElement
    xmlIsRef
    xmlNewCDataBlock
    xmlNewCharRef
    xmlNewDocComment
    xmlNewDocElementContent
    xmlNewDocFragment
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocPI
    xmlNewDocProp
    xmlNewDocRawNode
    xmlNewDocText
    xmlNewDocTextLen
    xmlNewDtd
    xmlNewEntity
    xmlNewGlobalNs
    xmlNewReference
    xmlNewTextWriterTree
    xmlNodeDump
    xmlNodeDumpOutput
    xmlNodeGetBase
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    xmlReaderNewWalker
    xmlReaderWalker
    xmlReconciliateNs
    xmlRelaxNGNewDocParserCtxt
    xmlRelaxNGValidateDoc
    xmlRelaxNGValidateFullElement
    xmlRelaxNGValidatePopElement
    xmlRelaxNGValidatePushElement
    xmlRemoveID
    xmlRemoveRef
    xmlSaveDoc
    xmlSaveFile
    xmlSaveFileEnc
    xmlSaveFileTo
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlSaveFormatFileTo
    xmlSchemaNewDocParserCtxt
    xmlSchemaValidateDoc
    xmlSchematronNewDocParserCtxt
    xmlSchematronValidateDoc
    xmlSearchNs
    xmlSearchNsByHref
    xmlSetDocCompressMode
    xmlSetListDoc
    xmlSetTreeDoc
    xmlShell
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlValidateAttributeDecl
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtd
    xmlValidateDtdFinal
    xmlValidateElement
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateNotationUse
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidatePopElement
    xmlValidatePushElement
    xmlValidateRoot
    xmlXIncludeNewContext
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXPathNewContext
    xmlXPathOrderDocElems
    xmlXPtrNewContext

    Type xmlDocPtr *:

    xmlNewTextWriterDoc

    Type xmlDtdPtr:

    xmlAddAttributeDecl
    xmlAddElementDecl
    xmlAddNotationDecl
    xmlCopyDtd
    xmlDebugDumpDTD
    xmlFreeDtd
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlValidateDtd

    Type xmlElementContent *:

    xmlValidGetPotentialChildren

    Type xmlElementContentPtr:

    elementDecl
    elementDeclSAXFunc
    xmlAddElementDecl
    xmlCopyDocElementContent
    xmlCopyElementContent
    xmlFreeDocElementContent
    xmlFreeElementContent
    xmlSAX2ElementDecl
    xmlSnprintfElementContent
    xmlSprintfElementContent

    Type xmlElementContentPtr *:

    xmlParseElementContentDecl

    Type xmlElementContentType:

    xmlNewDocElementContent
    xmlNewElementContent

    Type xmlElementPtr:

    xmlDumpElementDecl
    xmlValidBuildContentModel
    xmlValidateElementDecl

    Type xmlElementTablePtr:

    xmlCopyElementTable
    xmlDumpElementTable
    xmlFreeElementTable

    Type xmlElementTypeVal:

    xmlAddElementDecl

    Type xmlEntitiesTablePtr:

    xmlCopyEntitiesTable
    xmlDumpEntitiesTable
    xmlFreeEntitiesTable

    Type xmlEntityPtr:

    xmlDumpEntityDecl
    xmlEntityReferenceFunc
    xmlHandleEntity
    xmlNewEntityInputStream

    Type xmlEntityReferenceFunc:

    xmlSetEntityReferenceFunc

    Type xmlEnumerationPtr:

    attributeDecl
    attributeDeclSAXFunc
    xmlAddAttributeDecl
    xmlCopyEnumeration
    xmlFreeEnumeration
    xmlSAX2AttributeDecl

    Type xmlEnumerationPtr *:

    xmlParseAttributeType
    xmlParseEnumeratedType

    Type xmlErrorPtr:

    xmlCopyError
    xmlResetError
    xmlStructuredErrorFunc

    Type xmlExpCtxtPtr:

    xmlExpCtxtNbCons
    xmlExpCtxtNbNodes
    xmlExpExpDerive
    xmlExpFree
    xmlExpFreeCtxt
    xmlExpGetLanguage
    xmlExpGetStart
    xmlExpNewAtom
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlExpParse
    xmlExpStringDerive
    xmlExpSubsume

    Type xmlExpNodePtr:

    xmlExpDump
    xmlExpExpDerive
    xmlExpFree
    xmlExpGetLanguage
    xmlExpGetStart
    xmlExpIsNillable
    xmlExpMaxToken
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlExpRef
    xmlExpStringDerive
    xmlExpSubsume

    Type xmlExternalEntityLoader:

    xmlSetExternalEntityLoader

    Type xmlFeature:

    xmlHasFeature

    Type xmlFreeFunc:

    xmlGcMemSetup
    xmlMemSetup

    Type xmlFreeFunc *:

    xmlGcMemGet
    xmlMemGet

    Type xmlGenericErrorFunc:

    xmlSetGenericErrorFunc
    xmlThrDefSetGenericErrorFunc

    Type xmlGenericErrorFunc *:

    initGenericErrorDefaultFunc

    Type xmlGlobalStatePtr:

    xmlInitializeGlobalState

    Type xmlHashCopier:

    xmlHashCopy

    Type xmlHashDeallocator:

    xmlHashFree
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3

    Type xmlHashScanner:

    xmlHashScan
    xmlHashScan3

    Type xmlHashScannerFull:

    xmlHashScanFull
    xmlHashScanFull3

    Type xmlHashTablePtr:

    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashCopy
    xmlHashFree
    xmlHashLookup
    xmlHashLookup2
    xmlHashLookup3
    xmlHashQLookup
    xmlHashQLookup2
    xmlHashQLookup3
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlHashSize
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3

    Type xmlIDTablePtr:

    xmlFreeIDTable

    Type xmlInputCloseCallback:

    htmlCtxtReadIO
    htmlReadIO
    xmlCreateIOParserCtxt
    xmlCtxtReadIO
    xmlParserInputBufferCreateIO
    xmlReadIO
    xmlReaderForIO
    xmlReaderNewIO
    xmlRegisterInputCallbacks

    Type xmlInputMatchCallback:

    xmlRegisterInputCallbacks

    Type xmlInputOpenCallback:

    xmlRegisterInputCallbacks

    Type xmlInputReadCallback:

    htmlCtxtReadIO
    htmlReadIO
    xmlCreateIOParserCtxt
    xmlCtxtReadIO
    xmlParserInputBufferCreateIO
    xmlReadIO
    xmlReaderForIO
    xmlReaderNewIO
    xmlRegisterInputCallbacks

    Type xmlLinkPtr:

    xmlLinkGetData
    xmlListDeallocator

    Type xmlListDataCompare:

    xmlListCreate

    Type xmlListDeallocator:

    xmlListCreate

    Type xmlListPtr:

    xmlListAppend
    xmlListClear
    xmlListCopy
    xmlListDelete
    xmlListEmpty
    xmlListEnd
    xmlListFront
    xmlListInsert
    xmlListMerge
    xmlListPopBack
    xmlListPopFront
    xmlListPushBack
    xmlListPushFront
    xmlListRemoveAll
    xmlListRemoveFirst
    xmlListRemoveLast
    xmlListReverse
    xmlListReverseSearch
    xmlListReverseWalk
    xmlListSearch
    xmlListSize
    xmlListSort
    xmlListWalk

    Type xmlListWalker:

    xmlListReverseWalk
    xmlListWalk

    Type xmlLocationSetPtr:

    xmlXPtrFreeLocationSet
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetDel
    xmlXPtrLocationSetMerge
    xmlXPtrLocationSetRemove
    xmlXPtrWrapLocationSet

    Type xmlMallocFunc:

    xmlGcMemSetup
    xmlMemSetup

    Type xmlMallocFunc *:

    xmlGcMemGet
    xmlMemGet

    Type xmlModulePtr:

    xmlModuleClose
    xmlModuleFree
    xmlModuleSymbol

    Type xmlMutexPtr:

    xmlFreeMutex
    xmlMutexLock
    xmlMutexUnlock

    Type xmlNode *:

    xmlValidGetValidElements

    Type xmlNodePtr:

    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    nodePush
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkIsLink
    xlinkNodeDetectFunc
    xlinkSimpleLinkFunk
    xmlAddChild
    xmlAddChildList
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlAddSibling
    xmlBufGetNodeContent
    xmlBufNodeDump
    xmlC14NIsVisibleCallback
    xmlChildElementCount
    xmlCopyProp
    xmlCopyPropList
    xmlDOMWrapAcquireNsFunction
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlDeregisterNodeFunc
    xmlDocSetRootElement
    xmlElemDump
    xmlEntityReferenceFunc
    xmlFirstElementChild
    xmlFreeNode
    xmlFreeNodeList
    xmlGetLastChild
    xmlGetLineNo
    xmlGetNoNsProp
    xmlGetNodePath
    xmlGetNsList
    xmlGetNsProp
    xmlGetProp
    xmlHasNsProp
    xmlHasProp
    xmlIsBlankNode
    xmlIsID
    xmlIsRef
    xmlLastElementChild
    xmlLsCountNode
    xmlLsOneNode
    xmlNewChild
    xmlNewNs
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewProp
    xmlNewTextChild
    xmlNewTextWriterTree
    xmlNextElementSibling
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeBufGetContent
    xmlNodeDump
    xmlNodeDumpOutput
    xmlNodeGetBase
    xmlNodeGetContent
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    xmlNodeIsText
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlNodeSetBase
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlNodeSetLang
    xmlNodeSetName
    xmlNodeSetSpacePreserve
    xmlParseInNodeContext
    xmlPatternMatch
    xmlPreviousElementSibling
    xmlReconciliateNs
    xmlRegisterNodeFunc
    xmlRelaxNGValidateFullElement
    xmlRelaxNGValidatePopElement
    xmlRelaxNGValidatePushElement
    xmlReplaceNode
    xmlSaveTree
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidateOneElement
    xmlSearchNs
    xmlSearchNsByHref
    xmlSetListDoc
    xmlSetNs
    xmlSetNsProp
    xmlSetProp
    xmlSetTreeDoc
    xmlShellBase
    xmlShellCat
    xmlShellCmd
    xmlShellDir
    xmlShellDu
    xmlShellList
    xmlShellLoad
    xmlShellPrintNode
    xmlShellPwd
    xmlShellSave
    xmlShellValidate
    xmlShellWrite
    xmlTextConcat
    xmlTextMerge
    xmlUnlinkNode
    xmlUnsetNsProp
    xmlUnsetProp
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlValidateElement
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidatePopElement
    xmlValidatePushElement
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    xmlXPathCastNodeToNumber
    xmlXPathCastNodeToString
    xmlXPathCmpNodes
    xmlXPathNewNodeSet
    xmlXPathNewValueTree
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextAttribute
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    xmlXPathNodeEval
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetAddUnique
    xmlXPathNodeSetContains
    xmlXPathNodeSetCreate
    xmlXPathNodeSetDel
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathSetContextNode
    xmlXPtrNewCollapsedRange
    xmlXPtrNewContext
    xmlXPtrNewLocationSetNodes
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode

    Type xmlNodePtr *:

    xmlDOMWrapCloneNode
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCtxtExternalEntity
    xmlParseExternalEntity
    xmlParseInNodeContext

    Type xmlNodeSetPtr:

    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlXPathCastNodeSetToBoolean
    xmlXPathCastNodeSetToNumber
    xmlXPathCastNodeSetToString
    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathFreeNodeSet
    xmlXPathHasSameNodes
    xmlXPathIntersection
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNewNodeSetList
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetAddUnique
    xmlXPathNodeSetContains
    xmlXPathNodeSetDel
    xmlXPathNodeSetMerge
    xmlXPathNodeSetRemove
    xmlXPathNodeSetSort
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathTrailing
    xmlXPathTrailingSorted
    xmlXPathWrapNodeSet
    xmlXPtrNewLocationSetNodeSet

    Type xmlNotationPtr:

    xmlDumpNotationDecl
    xmlValidateNotationDecl

    Type xmlNotationTablePtr:

    xmlCopyNotationTable
    xmlDumpNotationTable
    xmlFreeNotationTable

    Type xmlNsPtr:

    xmlCopyNamespace
    xmlCopyNamespaceList
    xmlFreeNs
    xmlFreeNsList
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocRawNode
    xmlNewNode
    xmlNewNodeEatName
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewTextChild
    xmlSetNs
    xmlSetNsProp
    xmlUnsetNsProp
    xmlValidateOneNamespace
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetFreeNs

    Type xmlOutputBufferCreateFilenameFunc:

    xmlOutputBufferCreateFilenameDefault
    xmlThrDefOutputBufferCreateFilenameDefault

    Type xmlOutputBufferPtr:

    htmlDocContentDumpFormatOutput
    htmlDocContentDumpOutput
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlNewTextWriter
    xmlNodeDumpOutput
    xmlOutputBufferClose
    xmlOutputBufferFlush
    xmlOutputBufferGetContent
    xmlOutputBufferGetSize
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlSaveFileTo
    xmlSaveFormatFileTo

    Type xmlOutputCloseCallback:

    xmlOutputBufferCreateIO
    xmlRegisterOutputCallbacks
    xmlSaveToIO

    Type xmlOutputMatchCallback:

    xmlRegisterOutputCallbacks

    Type xmlOutputOpenCallback:

    xmlRegisterOutputCallbacks

    Type xmlOutputWriteCallback:

    xmlOutputBufferCreateIO
    xmlRegisterOutputCallbacks
    xmlSaveToIO

    Type xmlParserCtxtPtr:

    inputPop
    inputPush
    namePop
    namePush
    nodePop
    nodePush
    xmlByteConsumed
    xmlCheckHTTPInput
    xmlClearParserCtxt
    xmlCtxtReadDoc
    xmlCtxtReadFd
    xmlCtxtReadFile
    xmlCtxtReadIO
    xmlCtxtReadMemory
    xmlCtxtReset
    xmlCtxtResetPush
    xmlCtxtUseOptions
    xmlCurrentChar
    xmlDecodeEntities
    xmlErrMemory
    xmlExternalEntityLoader
    xmlFreeParserCtxt
    xmlGetFeature
    xmlHandleEntity
    xmlInitParserCtxt
    xmlLoadExternalEntity
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNewEntityInputStream
    xmlNewIOInputStream
    xmlNewInputFromFile
    xmlNewInputStream
    xmlNewStringInputStream
    xmlNewTextWriterPushParser
    xmlNextChar
    xmlNoNetExternalEntityLoader
    xmlParseAttValue
    xmlParseAttribute
    xmlParseAttributeListDecl
    xmlParseAttributeType
    xmlParseCDSect
    xmlParseCharData
    xmlParseCharRef
    xmlParseChunk
    xmlParseComment
    xmlParseContent
    xmlParseCtxtExternalEntity
    xmlParseDefaultDecl
    xmlParseDocTypeDecl
    xmlParseDocument
    xmlParseElement
    xmlParseElementChildrenContentDecl
    xmlParseElementContentDecl
    xmlParseElementDecl
    xmlParseElementMixedContentDecl
    xmlParseEncName
    xmlParseEncodingDecl
    xmlParseEndTag
    xmlParseEntityDecl
    xmlParseEntityRef
    xmlParseEntityValue
    xmlParseEnumeratedType
    xmlParseEnumerationType
    xmlParseExtParsedEnt
    xmlParseExternalID
    xmlParseExternalSubset
    xmlParseMarkupDecl
    xmlParseMisc
    xmlParseName
    xmlParseNamespace
    xmlParseNmtoken
    xmlParseNotationDecl
    xmlParseNotationType
    xmlParsePEReference
    xmlParsePI
    xmlParsePITarget
    xmlParsePubidLiteral
    xmlParseQuotedString
    xmlParseReference
    xmlParseSDDecl
    xmlParseStartTag
    xmlParseSystemLiteral
    xmlParseTextDecl
    xmlParseVersionInfo
    xmlParseVersionNum
    xmlParseXMLDecl
    xmlParserAddNodeInfo
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlPopInput
    xmlPushInput
    xmlScanName
    xmlSetFeature
    xmlSetupParserForBuffer
    xmlSkipBlankChars
    xmlSplitQName
    xmlStopParser
    xmlStringCurrentChar
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlSwitchEncoding
    xmlSwitchInputEncoding
    xmlSwitchToEncoding

    Type xmlParserInputBufferCreateFilenameFunc:

    xmlParserInputBufferCreateFilenameDefault
    xmlThrDefParserInputBufferCreateFilenameDefault

    Type xmlParserInputBufferPtr:

    xmlFreeParserInputBuffer
    xmlIOParseDTD
    xmlNewIOInputStream
    xmlNewTextReader
    xmlParserInputBufferGrow
    xmlParserInputBufferPush
    xmlParserInputBufferRead
    xmlSchemaValidateStream
    xmlTextReaderSetup

    Type xmlParserInputPtr:

    inputPush
    xmlCheckHTTPInput
    xmlFreeInputStream
    xmlParserInputGrow
    xmlParserInputRead
    xmlParserInputShrink
    xmlParserPrintFileContext
    xmlParserPrintFileInfo
    xmlPushInput
    xmlSwitchInputEncoding

    Type xmlParserNodeInfoSeqPtr:

    xmlClearNodeInfoSeq
    xmlInitNodeInfoSeq

    Type xmlParserSeverities:

    xmlTextReaderErrorFunc

    Type xmlPatternPtr:

    xmlFreePattern
    xmlFreePatternList
    xmlPatternFromRoot
    xmlPatternGetStreamCtxt
    xmlPatternMatch
    xmlPatternMaxDepth
    xmlPatternMinDepth
    xmlPatternStreamable

    Type xmlRMutexPtr:

    xmlFreeRMutex
    xmlRMutexLock
    xmlRMutexUnlock

    Type xmlReallocFunc:

    xmlGcMemSetup
    xmlMemSetup

    Type xmlReallocFunc *:

    xmlGcMemGet
    xmlMemGet

    Type xmlRefTablePtr:

    xmlFreeRefTable

    Type xmlRegExecCallbacks:

    xmlRegNewExecCtxt

    Type xmlRegExecCtxtPtr:

    xmlRegExecCallbacks
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRegFreeExecCtxt

    Type xmlRegexpPtr:

    xmlRegFreeRegexp
    xmlRegNewExecCtxt
    xmlRegexpExec
    xmlRegexpIsDeterminist
    xmlRegexpPrint

    Type xmlRegisterNodeFunc:

    xmlRegisterNodeDefault
    xmlThrDefRegisterNodeDefault

    Type xmlRelaxNGParserCtxtPtr:

    xmlRelaxNGFreeParserCtxt
    xmlRelaxNGGetParserErrors
    xmlRelaxNGParse
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetParserStructuredErrors
    xmlRelaxParserSetFlag

    Type xmlRelaxNGPtr:

    xmlRelaxNGDump
    xmlRelaxNGDumpTree
    xmlRelaxNGFree
    xmlRelaxNGNewValidCtxt
    xmlTextReaderRelaxNGSetSchema

    Type xmlRelaxNGValidCtxtPtr:

    xmlRelaxNGFreeValidCtxt
    xmlRelaxNGGetValidErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxNGSetValidStructuredErrors
    xmlRelaxNGValidateDoc
    xmlRelaxNGValidateFullElement
    xmlRelaxNGValidatePopElement
    xmlRelaxNGValidatePushCData
    xmlRelaxNGValidatePushElement
    xmlTextReaderRelaxNGValidateCtxt

    Type xmlRelaxNGValidityErrorFunc:

    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetValidErrors

    Type xmlRelaxNGValidityErrorFunc *:

    xmlRelaxNGGetParserErrors
    xmlRelaxNGGetValidErrors

    Type xmlRelaxNGValidityWarningFunc:

    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetValidErrors

    Type xmlRelaxNGValidityWarningFunc *:

    xmlRelaxNGGetParserErrors
    xmlRelaxNGGetValidErrors

    Type xmlSAXHandler *:

    xmlSAX2InitDefaultSAXHandler
    xmlSAX2InitDocbDefaultSAXHandler
    xmlSAX2InitHtmlDefaultSAXHandler
    xmlSAXVersion

    Type xmlSAXHandlerPtr:

    xmlCreateIOParserCtxt
    xmlCreatePushParserCtxt
    xmlIOParseDTD
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    xmlSAXParseDTD
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlSAXUserParseFile
    xmlSAXUserParseMemory
    xmlSchemaValidateStream

    Type xmlSAXHandlerPtr *:

    xmlSchemaSAXPlug

    Type xmlSAXHandlerV1 *:

    initdocbDefaultSAXHandler
    inithtmlDefaultSAXHandler
    initxmlDefaultSAXHandler

    Type xmlSAXLocatorPtr:

    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlSAX2SetDocumentLocator

    Type xmlSaveCtxtPtr:

    xmlSaveClose
    xmlSaveDoc
    xmlSaveFlush
    xmlSaveSetAttrEscape
    xmlSaveSetEscape
    xmlSaveTree

    Type xmlSchemaFacetPtr:

    xmlSchemaCheckFacet
    xmlSchemaFreeFacet
    xmlSchemaGetFacetValueAsULong
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet

    Type xmlSchemaParserCtxtPtr:

    xmlSchemaCheckFacet
    xmlSchemaFreeParserCtxt
    xmlSchemaGetParserErrors
    xmlSchemaParse
    xmlSchemaSetParserErrors
    xmlSchemaSetParserStructuredErrors

    Type xmlSchemaPtr:

    xmlSchemaDump
    xmlSchemaFree
    xmlSchemaNewValidCtxt
    xmlTextReaderSetSchema

    Type xmlSchemaSAXPlugPtr:

    xmlSchemaSAXUnplug

    Type xmlSchemaTypePtr:

    xmlSchemaCheckFacet
    xmlSchemaFreeType
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaIsBuiltInTypeFacet
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidateFacet
    xmlSchemaValidateLengthFacet
    xmlSchemaValidatePredefinedType

    Type xmlSchemaValPtr:

    xmlSchemaCompareValues
    xmlSchemaCompareValuesWhtsp
    xmlSchemaCopyValue
    xmlSchemaFreeValue
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlSchemaGetValType
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValueAppend
    xmlSchemaValueGetAsBoolean
    xmlSchemaValueGetAsString
    xmlSchemaValueGetNext

    Type xmlSchemaValPtr *:

    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidatePredefinedType

    Type xmlSchemaValType:

    xmlSchemaGetBuiltInType
    xmlSchemaNewStringValue
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacetWhtsp

    Type xmlSchemaValidCtxtPtr:

    xmlSchemaFreeValidCtxt
    xmlSchemaGetValidErrors
    xmlSchemaIsValid
    xmlSchemaSAXPlug
    xmlSchemaSetValidErrors
    xmlSchemaSetValidOptions
    xmlSchemaSetValidStructuredErrors
    xmlSchemaValidCtxtGetOptions
    xmlSchemaValidCtxtGetParserCtxt
    xmlSchemaValidateDoc
    xmlSchemaValidateFile
    xmlSchemaValidateOneElement
    xmlSchemaValidateSetFilename
    xmlSchemaValidateSetLocator
    xmlSchemaValidateStream
    xmlTextReaderSchemaValidateCtxt

    Type xmlSchemaValidityErrorFunc:

    xmlSchemaSetParserErrors
    xmlSchemaSetValidErrors

    Type xmlSchemaValidityErrorFunc *:

    xmlSchemaGetParserErrors
    xmlSchemaGetValidErrors

    Type xmlSchemaValidityLocatorFunc:

    xmlSchemaValidateSetLocator

    Type xmlSchemaValidityWarningFunc:

    xmlSchemaSetParserErrors
    xmlSchemaSetValidErrors

    Type xmlSchemaValidityWarningFunc *:

    xmlSchemaGetParserErrors
    xmlSchemaGetValidErrors

    Type xmlSchemaWhitespaceValueType:

    xmlSchemaCompareValuesWhtsp
    xmlSchemaGetCanonValueWhtsp
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacetWhtsp

    Type xmlSchemaWildcardPtr:

    xmlSchemaFreeWildcard

    Type xmlSchematronParserCtxtPtr:

    xmlSchematronFreeParserCtxt
    xmlSchematronParse

    Type xmlSchematronPtr:

    xmlSchematronFree
    xmlSchematronNewValidCtxt

    Type xmlSchematronValidCtxtPtr:

    xmlSchematronFreeValidCtxt
    xmlSchematronSetValidStructuredErrors
    xmlSchematronValidateDoc

    Type xmlShellCtxtPtr:

    xmlShellBase
    xmlShellCat
    xmlShellCmd
    xmlShellDir
    xmlShellDu
    xmlShellList
    xmlShellLoad
    xmlShellPwd
    xmlShellSave
    xmlShellValidate
    xmlShellWrite

    Type xmlShellReadlineFunc:

    xmlShell

    Type xmlStrdupFunc:

    xmlGcMemSetup
    xmlMemSetup

    Type xmlStrdupFunc *:

    xmlGcMemGet
    xmlMemGet

    Type xmlStreamCtxtPtr:

    xmlFreeStreamCtxt
    xmlStreamPop
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlStreamWantsAnyNode

    Type xmlStructuredErrorFunc:

    xmlRelaxNGSetParserStructuredErrors
    xmlRelaxNGSetValidStructuredErrors
    xmlSchemaSetParserStructuredErrors
    xmlSchemaSetValidStructuredErrors
    xmlSchematronSetValidStructuredErrors
    xmlSetStructuredErrorFunc
    xmlTextReaderSetStructuredErrorHandler
    xmlThrDefSetStructuredErrorFunc

    Type xmlTextReaderErrorFunc:

    xmlTextReaderSetErrorHandler

    Type xmlTextReaderErrorFunc *:

    xmlTextReaderGetErrorHandler

    Type xmlTextReaderLocatorPtr:

    xmlTextReaderErrorFunc
    xmlTextReaderLocatorBaseURI
    xmlTextReaderLocatorLineNumber

    Type xmlTextReaderPtr:

    xmlFreeTextReader
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewFile
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlReaderNewWalker
    xmlTextReaderAttributeCount
    xmlTextReaderBaseUri
    xmlTextReaderByteConsumed
    xmlTextReaderClose
    xmlTextReaderConstBaseUri
    xmlTextReaderConstEncoding
    xmlTextReaderConstLocalName
    xmlTextReaderConstName
    xmlTextReaderConstNamespaceUri
    xmlTextReaderConstPrefix
    xmlTextReaderConstString
    xmlTextReaderConstValue
    xmlTextReaderConstXmlLang
    xmlTextReaderConstXmlVersion
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    xmlTextReaderDepth
    xmlTextReaderExpand
    xmlTextReaderGetAttribute
    xmlTextReaderGetAttributeNo
    xmlTextReaderGetAttributeNs
    xmlTextReaderGetErrorHandler
    xmlTextReaderGetParserColumnNumber
    xmlTextReaderGetParserLineNumber
    xmlTextReaderGetParserProp
    xmlTextReaderGetRemainder
    xmlTextReaderHasAttributes
    xmlTextReaderHasValue
    xmlTextReaderIsDefault
    xmlTextReaderIsEmptyElement
    xmlTextReaderIsNamespaceDecl
    xmlTextReaderIsValid
    xmlTextReaderLocalName
    xmlTextReaderLookupNamespace
    xmlTextReaderMoveToAttribute
    xmlTextReaderMoveToAttributeNo
    xmlTextReaderMoveToAttributeNs
    xmlTextReaderMoveToElement
    xmlTextReaderMoveToFirstAttribute
    xmlTextReaderMoveToNextAttribute
    xmlTextReaderName
    xmlTextReaderNamespaceUri
    xmlTextReaderNext
    xmlTextReaderNextSibling
    xmlTextReaderNodeType
    xmlTextReaderNormalization
    xmlTextReaderPrefix
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    xmlTextReaderQuoteChar
    xmlTextReaderRead
    xmlTextReaderReadAttributeValue
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlTextReaderReadState
    xmlTextReaderReadString
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetParserProp
    xmlTextReaderSetSchema
    xmlTextReaderSetStructuredErrorHandler
    xmlTextReaderSetup
    xmlTextReaderStandalone
    xmlTextReaderValue
    xmlTextReaderXmlLang

    Type xmlTextWriterPtr:

    xmlFreeTextWriter
    xmlTextWriterEndAttribute
    xmlTextWriterEndCDATA
    xmlTextWriterEndComment
    xmlTextWriterEndDTD
    xmlTextWriterEndDTDAttlist
    xmlTextWriterEndDTDElement
    xmlTextWriterEndDTDEntity
    xmlTextWriterEndDocument
    xmlTextWriterEndElement
    xmlTextWriterEndPI
    xmlTextWriterFlush
    xmlTextWriterFullEndElement
    xmlTextWriterSetIndent
    xmlTextWriterSetIndentString
    xmlTextWriterSetQuoteChar
    xmlTextWriterStartAttribute
    xmlTextWriterStartAttributeNS
    xmlTextWriterStartCDATA
    xmlTextWriterStartComment
    xmlTextWriterStartDTD
    xmlTextWriterStartDTDAttlist
    xmlTextWriterStartDTDElement
    xmlTextWriterStartDTDEntity
    xmlTextWriterStartDocument
    xmlTextWriterStartElement
    xmlTextWriterStartElementNS
    xmlTextWriterStartPI
    xmlTextWriterWriteAttribute
    xmlTextWriterWriteAttributeNS
    xmlTextWriterWriteBase64
    xmlTextWriterWriteBinHex
    xmlTextWriterWriteCDATA
    xmlTextWriterWriteComment
    xmlTextWriterWriteDTD
    xmlTextWriterWriteDTDAttlist
    xmlTextWriterWriteDTDElement
    xmlTextWriterWriteDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTDExternalEntityContents
    xmlTextWriterWriteDTDInternalEntity
    xmlTextWriterWriteDTDNotation
    xmlTextWriterWriteElement
    xmlTextWriterWriteElementNS
    xmlTextWriterWriteFormatAttribute
    xmlTextWriterWriteFormatAttributeNS
    xmlTextWriterWriteFormatCDATA
    xmlTextWriterWriteFormatComment
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteFormatDTDElement
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteFormatElement
    xmlTextWriterWriteFormatElementNS
    xmlTextWriterWriteFormatPI
    xmlTextWriterWriteFormatRaw
    xmlTextWriterWriteFormatString
    xmlTextWriterWritePI
    xmlTextWriterWriteRaw
    xmlTextWriterWriteRawLen
    xmlTextWriterWriteString
    xmlTextWriterWriteVFormatAttribute
    xmlTextWriterWriteVFormatAttributeNS
    xmlTextWriterWriteVFormatCDATA
    xmlTextWriterWriteVFormatComment
    xmlTextWriterWriteVFormatDTD
    xmlTextWriterWriteVFormatDTDAttlist
    xmlTextWriterWriteVFormatDTDElement
    xmlTextWriterWriteVFormatDTDInternalEntity
    xmlTextWriterWriteVFormatElement
    xmlTextWriterWriteVFormatElementNS
    xmlTextWriterWriteVFormatPI
    xmlTextWriterWriteVFormatRaw
    xmlTextWriterWriteVFormatString

    Type xmlURIPtr:

    xmlFreeURI
    xmlParseURIReference
    xmlPrintURI
    xmlSaveUri

    Type xmlValidCtxtPtr:

    xmlAddAttributeDecl
    xmlAddElementDecl
    xmlAddID
    xmlAddNotationDecl
    xmlAddRef
    xmlFreeValidCtxt
    xmlValidBuildContentModel
    xmlValidCtxtNormalizeAttributeValue
    xmlValidateAttributeDecl
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtd
    xmlValidateDtdFinal
    xmlValidateElement
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateNotationUse
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidatePopElement
    xmlValidatePushCData
    xmlValidatePushElement
    xmlValidateRoot

    Type xmlXIncludeCtxtPtr:

    xmlXIncludeFreeContext
    xmlXIncludeProcessNode
    xmlXIncludeSetFlags

    Type xmlXPathCompExprPtr:

    xmlXPathCompiledEval
    xmlXPathCompiledEvalToBoolean
    xmlXPathDebugDumpCompExpr
    xmlXPathFreeCompExpr

    Type xmlXPathContextPtr:

    xmlXPathCompiledEval
    xmlXPathCompiledEvalToBoolean
    xmlXPathContextSetCache
    xmlXPathCtxtCompile
    xmlXPathEval
    xmlXPathEvalExpression
    xmlXPathEvalPredicate
    xmlXPathFreeContext
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS
    xmlXPathNewParserContext
    xmlXPathNodeEval
    xmlXPathNsLookup
    xmlXPathRegisterAllFunctions
    xmlXPathRegisterFunc
    xmlXPathRegisterFuncLookup
    xmlXPathRegisterFuncNS
    xmlXPathRegisterNs
    xmlXPathRegisterVariable
    xmlXPathRegisterVariableLookup
    xmlXPathRegisterVariableNS
    xmlXPathRegisteredFuncsCleanup
    xmlXPathRegisteredNsCleanup
    xmlXPathRegisteredVariablesCleanup
    xmlXPathSetContextNode
    xmlXPathVariableLookup
    xmlXPathVariableLookupNS
    xmlXPtrEval

    Type xmlXPathFuncLookupFunc:

    xmlXPathRegisterFuncLookup

    Type xmlXPathFunction:

    xmlXPathRegisterFunc
    xmlXPathRegisterFuncNS

    Type xmlXPathObjectPtr:

    valuePush
    xmlShellPrintXPathResult
    xmlXPathAxisFunc
    xmlXPathCastToBoolean
    xmlXPathCastToNumber
    xmlXPathCastToString
    xmlXPathConvertBoolean
    xmlXPathConvertFunc
    xmlXPathConvertNumber
    xmlXPathConvertString
    xmlXPathDebugDumpObject
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPathFreeNodeSetList
    xmlXPathFreeObject
    xmlXPathObjectCopy
    xmlXPathRegisterVariable
    xmlXPathRegisterVariableNS
    xmlXPtrBuildNodeList
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetCreate
    xmlXPtrLocationSetDel
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints

    Type xmlXPathParserContextPtr:

    valuePop
    valuePush
    xmlXPathAddValues
    xmlXPathAxisFunc
    xmlXPathBooleanFunction
    xmlXPathCeilingFunction
    xmlXPathCompareValues
    xmlXPathConcatFunction
    xmlXPathContainsFunction
    xmlXPathCountFunction
    xmlXPathDivValues
    xmlXPathEqualValues
    xmlXPathErr
    xmlXPathEvalExpr
    xmlXPathEvalFunc
    xmlXPathEvaluatePredicateResult
    xmlXPathFalseFunction
    xmlXPathFloorFunction
    xmlXPathFreeParserContext
    xmlXPathFunction
    xmlXPathIdFunction
    xmlXPathLangFunction
    xmlXPathLastFunction
    xmlXPathLocalNameFunction
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathNamespaceURIFunction
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextAttribute
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    xmlXPathNormalizeFunction
    xmlXPathNotEqualValues
    xmlXPathNotFunction
    xmlXPathNumberFunction
    xmlXPathParseNCName
    xmlXPathParseName
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    xmlXPathPositionFunction
    xmlXPathRoot
    xmlXPathRoundFunction
    xmlXPathStartsWithFunction
    xmlXPathStringFunction
    xmlXPathStringLengthFunction
    xmlXPathSubValues
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    xmlXPathSubstringFunction
    xmlXPathSumFunction
    xmlXPathTranslateFunction
    xmlXPathTrueFunction
    xmlXPathValueFlipSign
    xmlXPatherror
    xmlXPtrEvalRangePredicate
    xmlXPtrRangeToFunction

    Type xmlXPathVariableLookupFunc:

    xmlXPathRegisterVariableLookup

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xmlio.html0000644000175000017500000003075712124524425015354 0ustar aronaron I/O Interfaces
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    I/O Interfaces

    Developer Menu
    API Indexes
    Related links

    Table of Content:

    1. General overview
    2. The basic buffer type
    3. Input I/O handlers
    4. Output I/O handlers
    5. The entities loader
    6. Example of customized I/O

    General overview

    The module xmlIO.h provides the interfaces to the libxml2 I/O system. This consists of 4 main parts:

    • Entities loader, this is a routine which tries to fetch the entities (files) based on their PUBLIC and SYSTEM identifiers. The default loader don't look at the public identifier since libxml2 do not maintain a catalog. You can redefine you own entity loader by using xmlGetExternalEntityLoader() and xmlSetExternalEntityLoader(). Check the example.
    • Input I/O buffers which are a commodity structure used by the parser(s) input layer to handle fetching the information to feed the parser. This provides buffering and is also a placeholder where the encoding converters to UTF8 are piggy-backed.
    • Output I/O buffers are similar to the Input ones and fulfill similar task but when generating a serialization from a tree.
    • A mechanism to register sets of I/O callbacks and associate them with specific naming schemes like the protocol part of the URIs.

      This affect the default I/O operations and allows to use specific I/O handlers for certain names.

    The general mechanism used when loading http://rpmfind.net/xml.html for example in the HTML parser is the following:

    1. The default entity loader calls xmlNewInputFromFile() with the parsing context and the URI string.
    2. the URI string is checked against the existing registered handlers using their match() callback function, if the HTTP module was compiled in, it is registered and its match() function will succeeds
    3. the open() function of the handler is called and if successful will return an I/O Input buffer
    4. the parser will the start reading from this buffer and progressively fetch information from the resource, calling the read() function of the handler until the resource is exhausted
    5. if an encoding change is detected it will be installed on the input buffer, providing buffering and efficient use of the conversion routines
    6. once the parser has finished, the close() function of the handler is called once and the Input buffer and associated resources are deallocated.

    The user defined callbacks are checked first to allow overriding of the default libxml2 I/O routines.

    The basic buffer type

    All the buffer manipulation handling is done using the xmlBuffer type define in tree.h which is a resizable memory buffer. The buffer allocation strategy can be selected to be either best-fit or use an exponential doubling one (CPU vs. memory use trade-off). The values are XML_BUFFER_ALLOC_EXACT and XML_BUFFER_ALLOC_DOUBLEIT, and can be set individually or on a system wide basis using xmlBufferSetAllocationScheme(). A number of functions allows to manipulate buffers with names starting with the xmlBuffer... prefix.

    Input I/O handlers

    An Input I/O handler is a simple structure xmlParserInputBuffer containing a context associated to the resource (file descriptor, or pointer to a protocol handler), the read() and close() callbacks to use and an xmlBuffer. And extra xmlBuffer and a charset encoding handler are also present to support charset conversion when needed.

    Output I/O handlers

    An Output handler xmlOutputBuffer is completely similar to an Input one except the callbacks are write() and close().

    The entities loader

    The entity loader resolves requests for new entities and create inputs for the parser. Creating an input from a filename or an URI string is done through the xmlNewInputFromFile() routine. The default entity loader do not handle the PUBLIC identifier associated with an entity (if any). So it just calls xmlNewInputFromFile() with the SYSTEM identifier (which is mandatory in XML).

    If you want to hook up a catalog mechanism then you simply need to override the default entity loader, here is an example:

    #include <libxml/xmlIO.h>
    
    xmlExternalEntityLoader defaultLoader = NULL;
    
    xmlParserInputPtr
    xmlMyExternalEntityLoader(const char *URL, const char *ID,
                                   xmlParserCtxtPtr ctxt) {
        xmlParserInputPtr ret;
        const char *fileID = NULL;
        /* lookup for the fileID depending on ID */
    
        ret = xmlNewInputFromFile(ctxt, fileID);
        if (ret != NULL)
            return(ret);
        if (defaultLoader != NULL)
            ret = defaultLoader(URL, ID, ctxt);
        return(ret);
    }
    
    int main(..) {
        ...
    
        /*
         * Install our own entity loader
         */
        defaultLoader = xmlGetExternalEntityLoader();
        xmlSetExternalEntityLoader(xmlMyExternalEntityLoader);
    
        ...
    }

    Example of customized I/O

    This example come from a real use case, xmlDocDump() closes the FILE * passed by the application and this was a problem. The solution was to redefine a new output handler with the closing call deactivated:

    1. First define a new I/O output allocator where the output don't close the file:
      xmlOutputBufferPtr
      xmlOutputBufferCreateOwn(FILE *file, xmlCharEncodingHandlerPtr encoder) {
          xmlOutputBufferPtr ret;
          
          if (xmlOutputCallbackInitialized == 0)
              xmlRegisterDefaultOutputCallbacks();
      
          if (file == NULL) return(NULL);
          ret = xmlAllocOutputBuffer(encoder);
          if (ret != NULL) {
              ret->context = file;
              ret->writecallback = xmlFileWrite;
              ret->closecallback = NULL;  /* No close callback */
          }
          return(ret);
      } 
    2. And then use it to save the document:
      FILE *f;
      xmlOutputBufferPtr output;
      xmlDocPtr doc;
      int res;
      
      f = ...
      doc = ....
      
      output = xmlOutputBufferCreateOwn(f, NULL);
      res = xmlSaveFileTo(output, doc, NULL);
          

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk10.html0000644000175000017500000017550612134171042016023 0ustar aronaron API Alphabetic Index Y-a for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index Y-a for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter Y:

    YES
    htmlNodeStatus
    YiRadicals
    xmlUCSIsYiRadicals
    YiSyllables
    xmlUCSIsYiSyllables
    YijingHexagramSymbols
    xmlUCSIsYijingHexagramSymbols

    Letter Z:

    ZLIB
    docbCreateFileParserCtxt
    docbParseFile
    docbSAXParseFile
    htmlCreateFileParserCtxt
    htmlParseFile
    htmlSAXParseFile
    xmlCreateEntityParserCtxt
    xmlCreateFileParserCtxt
    xmlCreateURLParserCtxt
    xmlGetCompressMode
    xmlGetDocCompressMode
    xmlOutputBufferCreateFilename
    xmlParseFile
    xmlParserInputBufferCreateFilename
    xmlRecoverFile
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXUserParseFile
    xmlSetCompressMode
    xmlSetDocCompressMode
    Zlib
    LIBXML_ZLIB_ENABLED

    Letter a:

    a-z
    xmlCheckLanguageID
    xmlURIEscapeStr
    a-zA-Z
    IS_ASCII_LETTER
    a-zA-Z0-9
    IS_PUBIDCHAR
    a@b
    xmlNanoFTPProxy
    abc
    xmlXPathTranslateFunction
    abc-
    xmlXPathTranslateFunction
    able
    xmlEntityReferenceFunc
    xmlFindCharEncodingHandler
    xmlGetCharEncodingHandler
    xmlParserInputBufferGrow
    xmlXPathOrderDocElems
    about
    _xmlParserCtxt
    xmlDebugDumpString
    xmlShellDir
    xmlTextWriterWriteRawLen
    above
    xmlParseMarkupDecl
    xmlStreamWantsAnyNode
    xmlXPathSubstringFunction
    absent
    XML_SCHEMAS_ELEM_BLOCK_ABSENT
    XML_SCHEMAS_ELEM_BLOCK_EXTENSION
    XML_SCHEMAS_ELEM_FINAL_ABSENT
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    absoluteURI
    xmlParseURI
    abstain
    xmlCleanupParser
    xmlCleanupThreads
    abstract
    XML_SCHEMAS_ELEM_ABSTRACT
    XML_SCHEMAS_TYPE_ABSTRACT
    accept
    xmlExpMaxToken
    xmlGetNoNsProp
    xmlIsMixedElement
    acceptable
    xmlRegExecErrInfo
    xmlRegExecNextValues
    accepted
    IS_BYTE_CHAR
    xmlCatalogGetDefaults
    xmlCatalogSetDefaultPrefer
    xmlCatalogSetDefaults
    xmlExpGetStart
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlTextReaderNormalization
    accepting
    xmlTextReaderNormalization
    accepts
    xmlExpIsNillable
    xmlExpSubsume
    access
    xmlGcMemGet
    xmlGcMemSetup
    xmlMemGet
    xmlMemSetup
    xmlNewMutex
    xmlNewRMutex
    xmlSchemaValidCtxtGetParserCtxt
    accessed
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    accesses
    xmlCreateURLParserCtxt
    xmlNoNetExternalEntityLoader
    accexpted
    xmlExpSubsume
    accommodate
    xmlBufferResize
    according
    xmlBuildURI
    xmlDetectCharEncoding
    xmlSAXVersion
    xmlSchemaValidateFacetWhtsp
    xmlURIEscape
    xmlXPathCompareValues
    accordingly
    xmlParseCharEncoding
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlValidCtxtNormalizeAttributeValue
    account
    xmlSchemaValidateFacetWhtsp
    acquire
    _xmlDOMWrapCtxt
    xmlDOMWrapAcquireNsFunction
    act
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    action
    xmlDocSetRootElement
    activate
    xmlTextReaderSetParserProp
    activated
    DEBUG_MEMORY
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    activates
    xmlXPathContextSetCache
    acts
    xmlGetProp
    actual
    xmlGetUTF8Char
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlXPathFreeNodeSet
    xmlXPtrFreeLocationSet
    actually
    _xmlDoc
    _xmlParserCtxt
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlAddEncodingAlias
    xmlCurrentChar
    xmlDelEncodingAlias
    xmlGetEncodingAlias
    xmlNewCharEncodingHandler
    xmlParseCharEncoding
    xmlParseNotationDecl
    xmlSAX2SetDocumentLocator
    xmlStringCurrentChar
    xmlTextReaderByteConsumed
    xmlXPathOrderDocElems
    actuate
    xlinkExtendedLinkFunk
    add
    xmlACatalogAdd
    xmlBufferAdd
    xmlBufferAddHead
    xmlBufferCat
    xmlBufferWriteCHAR
    xmlBufferWriteChar
    xmlBufferWriteQuotedString
    xmlCatalogAdd
    xmlListPushBack
    xmlListPushFront
    xmlXPathAddValues
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetAddUnique
    xmlXPtrLocationSetAdd
    added
    attribute
    attributeSAXFunc
    htmlDocContentDumpFormatOutput
    htmlDocContentDumpOutput
    htmlDocDumpMemoryFormat
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    htmlSaveFileEnc
    htmlSaveFileFormat
    xmlAddChild
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlCheckLanguageID
    xmlDOMWrapCloneNode
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocFormatDump
    xmlNewChild
    xmlNewTextChild
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlSaveFormatFileTo
    xmlStrcat
    xmlStrncat
    xmlXPathNodeSetMerge
    xmlXPtrLocationSetMerge
    adding
    xmlLoadSGMLSuperCatalog
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    addition
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlXPathSubstringFunction
    additional
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    additionally
    xmlStreamWantsAnyNode
    address
    xmlModuleSymbol
    xmlNewTextWriterDoc
    adds
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlBufferWriteCHAR
    adequate
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    adjacent
    xmlAddChild
    xmlAddChildList
    xmlAddPrevSibling
    xmlAddSibling
    affect
    xmlKeepBlanksDefault
    affected
    xmlSchemaValidityLocatorFunc
    affiliation
    _xmlSchemaElement
    afraid
    xmlEncodeEntities
    after
    UTF8ToHtml
    UTF8Toisolat1
    _xmlParserCtxt
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlAutomataCompile
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlNanoFTPCheckResponse
    xmlNanoFTPFreeCtxt
    xmlNanoFTPGetResponse
    xmlReconciliateNs
    xmlSaveFileTo
    xmlSaveFormatFileTo
    xmlUnlinkNode
    xmlValidGetValidElements
    xmlXPathNextFollowing
    xmlXPathStringFunction
    again
    xmlCreatePushParserCtxt
    against
    LIBXML_TEST_VERSION
    XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    checkNamespace
    xmlCheckVersion
    xmlRegexpCompile
    xmlRegexpExec
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    xmlSchematronValidateDoc
    xmlShellValidate
    xmlValidateDtd
    aggregate
    xmlBufGetNodeContent
    xmlNodeBufGetContent
    xmlNodeGetContent
    ahead
    XML_MAX_LOOKUP_LIMIT
    algebraic
    xmlExpExpDerive
    alias
    xmlAddEncodingAlias
    xmlDelEncodingAlias
    xmlGetEncodingAlias
    aliases
    xmlCleanupCharEncodingHandlers
    xmlCleanupEncodingAliases
    aliasing
    XML_CAST_FPTR
    xmlSearchNsByHref
    allocate
    _xmlDoc
    xmlBufferGrow
    xmlBuildQName
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlNewMutex
    xmlNewRMutex
    xmlReallocLoc
    xmlXPathObjectCopy
    allocation
    LIBXML_THREAD_ALLOC_ENABLED
    htmlNewParserCtxt
    xmlBufferSetAllocationScheme
    xmlGetBufferAllocationScheme
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlMemStrdupLoc
    xmlMemoryStrdup
    xmlNormalizeURIPath
    xmlReallocLoc
    xmlSetBufferAllocationScheme
    xmlTextReaderGetRemainder
    allocations
    xmlGcMemGet
    xmlGcMemSetup
    xmlMemSetup
    xmlParserInputDeallocate
    allocator
    DEBUG_MEMORY
    LIBXML_ATTR_ALLOC_SIZE
    allocators
    xmlGcMemGet
    xmlGcMemSetup
    allow
    XML_SCHEMAS_ATTR_GLOBAL
    XML_SCHEMAS_ATTR_NSDEFAULT
    XML_SCHEMAS_ELEM_NSDEFAULT
    docbCreatePushParserCtxt
    htmlAttrAllowed
    htmlNodeStatus
    xmlAutomataNewAllTrans
    xmlCheckLanguageID
    xmlCheckUTF8
    xmlCreatePushParserCtxt
    xmlKeepBlanksDefault
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlParseVersionNum
    xmlSchemaValidCtxtGetParserCtxt
    xmlSearchNs
    xmlShell
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateQName
    allowable
    xmlSkipBlankChars
    allowed
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_LOOKUP_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    _htmlElemDesc
    _xmlElement
    _xmlSchemaWildcard
    htmlElementAllowedHere
    htmlElementAllowedHereDesc
    htmlNodeStatus
    xmlAutomataNewAllTrans
    xmlAutomataNewCounterTrans
    xmlBufNodeDump
    xmlIsLetter
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeDump
    xmlNodeDumpOutput
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseInNodeContext
    xmlValidGetPotentialChildren
    xmlXPathNormalizeFunction
    allowing
    xmlNoNetExternalEntityLoader
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    allows
    htmlAutoCloseTag
    htmlIsAutoClosed
    xmlCatalogAdd
    xmlNewChild
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlParseURIRaw
    xmlTextReaderConstString
    alphanumerics
    xmlCheckLanguageID
    already
    XML_SCHEMAS_ATTRGROUP_GLOBAL
    XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED
    _xmlParserInput
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlAddSibling
    xmlBuildRelativeURI
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlFreeFunc
    xmlGcMemSetup
    xmlInitializeDict
    xmlMemSetup
    xmlParseCharEncoding
    xmlParseNotationType
    xmlParserInputGrow
    xmlReallocFunc
    xmlReplaceNode
    xmlXPathNodeSetAddUnique
    xmlXPtrLocationSetAdd
    also
    _xmlEntity
    xmlCharEncodingOutputFunc
    xmlCheckHTTPInput
    xmlCleanupParser
    xmlHasProp
    xmlKeepBlanksDefault
    xmlNanoFTPProxy
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    xmlXPathStringEvalNumber
    alternative
    xmlTextWriterStartDTD
    xmlTextWriterWriteDTD
    xmlTextWriterWriteDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTDExternalEntityContents
    xmlTextWriterWriteDTDNotation
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteVFormatDTD
    always
    INPUT_CHUNK
    xmlDecodeEntities
    xmlSubstituteEntitiesDefault
    amd
    xmlCatalogIsEmpty
    amount
    INPUT_CHUNK
    _xmlParserInputBuffer
    xmlDictGetUsage
    xmlMemDisplayLast
    xmlMemUsed
    xmlParserInputBufferGrow
    xmlParserInputBufferRead
    xmlParserInputGrow
    amp
    xmlParseEntityRef
    xmlParseSDDecl
    xmlParserHandleReference
    ampersand
    xmlNewTextChild
    analysis
    _xmlParserCtxt
    _xmlValidCtxt
    analyze
    xmlParseURI
    xmlParseURIRaw
    xmlParseURIReference
    analyzed
    _xmlParserInput
    ancestor
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    xmlShellPwd
    xmlXPathLangFunction
    xmlXPathNextAncestor
    ancestor-or-self
    xmlXPathNextAncestorOrSelf
    ancestors
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextPreceding
    anchored
    xmlGetNsProp
    xmlHasNsProp
    angle
    xmlParseCharData
    annotation
    _xmlSchemaAnnot
    another
    xmlCharEncodingOutputFunc
    xmlCleanupParser
    xmlCleanupThreads
    xmlInputMatchCallback
    xmlOutputMatchCallback
    xmlSetGenericErrorFunc
    anySimpleType
    xmlSchemaNewStringValue
    anyURI
    xmlSchemaGetCanonValue
    anymore
    XML_SCHEMAS_ANYATTR_LAX
    XML_SCHEMAS_ANYATTR_SKIP
    XML_SCHEMAS_ANYATTR_STRICT
    XML_SCHEMAS_ELEM_NSDEFAULT
    xmlDictCleanup
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNewEntity
    anyway
    xmlCheckLanguageID
    xmlRecoverDoc
    xmlRecoverFile
    xmlRecoverMemory
    xmlValidateNotationDecl
    apart
    xmlXPathStringFunction
    apos
    xmlParseEntityRef
    xmlParseSDDecl
    xmlParserHandleReference
    appear
    xmlNewTextChild
    xmlParseAttributeType
    xmlParseElementMixedContentDecl
    xmlParsePEReference
    xmlParseSDDecl
    xmlParseStartTag
    xmlParserHandlePEReference
    appearing
    xmlValidatePopElement
    xmlValidatePushElement
    appears
    _xmlURI
    xmlExpGetStart
    xmlParseCharData
    xmlParseElementChildrenContentDecl
    xmlParseEntityRef
    xmlParseSDDecl
    append
    xmlCopyChar
    xmlCopyCharMultiByte
    xmlValidGetValidElements
    appended
    xmlParseAttValue
    xmlSchemaValueAppend
    appending
    xmlParseAttValue
    appendix
    xmlDetectCharEncoding
    applicable
    xmlCopyNode
    xmlDocCopyNode
    application
    _xmlAttr
    _xmlAttribute
    _xmlDoc
    _xmlDtd
    _xmlElement
    _xmlEntity
    _xmlNode
    _xmlNs
    resolveEntity
    resolveEntitySAXFunc
    xmlCheckVersion
    xmlCleanupParser
    xmlCleanupThreads
    xmlCurrentChar
    xmlGetExternalEntityLoader
    xmlLineNumbersDefault
    xmlParseAttValue
    xmlSAX2ResolveEntity
    xmlSetExternalEntityLoader
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessTreeFlagsData
    applications
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    applied
    xmlHashCopy
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    applies
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    apply
    xmlListReverseWalk
    xmlListWalk
    xmlParseMarkupDecl
    xmlParseSDDecl
    xmlSchemaValPredefTypeNodeNoNorm
    xmlValidateRoot
    applying
    xmlGetNsList
    xmlXPathIdFunction
    appropriate
    xlinkIsLink
    xmlCheckHTTPInput
    xmlParseURIReference
    arcs
    xlinkExtendedLinkFunk
    area
    xmlBufferCreateStatic
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    xmlReallocLoc
    areas
    xmlGcMemGet
    xmlGcMemSetup
    xmlMemBlocks
    xmlMemShow
    args
    CHECK_ARITY
    x
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCtxtExternalEntity
    xmlParseExternalEntity
    xmlXPtrRangeToFunction
    around
    xmlFileOpen
    arrays
    _xmlParserCtxt
    arry
    xmlParserInputBufferPush
    asked
    xmlParseReference
    assume
    xmlStrcat
    xmlStrdup
    assumed
    xmlCheckUTF8
    assumes
    xmlBuildRelativeURI
    assuming
    xmlParseBalancedChunkMemoryRecover
    xmlSaveFileTo
    xmlSaveFormatFileTo
    assure
    xmlGetUTF8Char
    atom
    xmlExpNewAtom
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    atomic
    xmlGcMemGet
    xmlGcMemSetup
    attached
    xmlTextReaderGetRemainder
    attempt
    xmlRecoverDoc
    xmlRecoverMemory
    attempts
    xmlRecoverFile
    attr
    XML_SCHEMAS_ATTRGROUP_HAS_REFS
    XML_SCHEMAS_ATTRGROUP_MARKED
    XML_SCHEMAS_ATTRGROUP_REDEFINED
    _xmlID
    _xmlRef
    attribute-
    xmlStreamPushNode
    attribute-list
    xmlParseDefaultDecl
    xmlParseEntityRef
    attribute-node
    xmlStreamPushAttr
    attribute-nodes
    xmlStreamWantsAnyNode
    attributeFormDefault
    XML_SCHEMAS_QUALIF_ATTR
    augmented
    docbParseDocument
    htmlParseDocument
    xmlParseDocument
    xmlParseExtParsedEnt
    xmlTextMerge
    autark
    xmlDOMWrapRemoveNode
    authentication
    xmlNanoHTTPAuthHeader
    author
    htmlNodeStatus
    authority
    _xmlURI
    authorized
    xmlValidGetValidElements
    auto
    htmlHandleOmittedElem
    auto-repair
    _htmlElemDesc
    autoclose
    htmlAutoCloseTag
    autoclosed
    htmlIsAutoClosed
    autogeneration
    xmlKeepBlanksDefault
    automatically
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    xmlCharEncOutFunc
    xmlNewTextChild
    xmlStrncatNew
    automaton
    _xmlSchemaType
    autoreference
    _xmlDoc
    avoid
    XML_MAX_LOOKUP_LIMIT
    xmlCleanupParser
    xmlCleanupThreads
    xmlGetBufferAllocationScheme
    avoiding
    xmlTextReaderNext
    xmlTextReaderNextSibling
    aware
    xmlGetProp

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/checkapisym.xsl0000644000175000017500000000322312113312340016337 0ustar aronaron Looking for functions in symbols.xml Found functions Looking for variables in symbols.xml Found variables Failed to find export in symbols.xml: libxml2-2.9.1+dfsg1/doc/xml.html0000644000175000017500000102151212123211752015005 0ustar aronaron The XML C parser and toolkit of Gnome

    The XML C parser and toolkit of Gnome

    Note: this is the flat content of the web site

    libxml, a.k.a. gnome-xml

    "Programming with libxml2 is like the thrilling embrace of an exotic stranger." Mark Pilgrim

    Libxml2 is the XML C parser and toolkit developed for the Gnome project (but usable outside of the Gnome platform), it is free software available under the MIT License. XML itself is a metalanguage to design markup languages, i.e. text language where semantic and structure are added to the content using extra "markup" information enclosed between angle brackets. HTML is the most well-known markup language. Though the library is written in C a variety of language bindings make it available in other environments.

    Libxml2 is known to be very portable, the library should build and work without serious troubles on a variety of systems (Linux, Unix, Windows, CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, VxWorks, ...)

    Libxml2 implements a number of existing standards related to markup languages:

    In most cases libxml2 tries to implement the specifications in a relatively strictly compliant way. As of release 2.4.16, libxml2 passed all 1800+ tests from the OASIS XML Tests Suite.

    To some extent libxml2 provides support for the following additional specifications but doesn't claim to implement them completely:

    • Document Object Model (DOM) http://www.w3.org/TR/DOM-Level-2-Core/ the document model, but it doesn't implement the API itself, gdome2 does this on top of libxml2
    • RFC 959 : libxml2 implements a basic FTP client code
    • RFC 1945 : HTTP/1.0, again a basic HTTP client code
    • SAX: a SAX2 like interface and a minimal SAX1 implementation compatible with early expat versions

    A partial implementation of XML Schemas Part 1: Structure is being worked on but it would be far too early to make any conformance statement about it at the moment.

    Separate documents:

    Hosting sponsored by Open Source CMS services from AOE media.

    Logo designed by Marc Liyanage.

    Introduction

    This document describes libxml, the XML C parser and toolkit developed for the Gnome project. XML is a standard for building tag-based structured documents/data.

    Here are some key points about libxml:

    • Libxml2 exports Push (progressive) and Pull (blocking) type parser interfaces for both XML and HTML.
    • Libxml2 can do DTD validation at parse time, using a parsed document instance, or with an arbitrary DTD.
    • Libxml2 includes complete XPath, XPointer and XInclude implementations.
    • It is written in plain C, making as few assumptions as possible, and sticking closely to ANSI C/POSIX for easy embedding. Works on Linux/Unix/Windows, ported to a number of other platforms.
    • Basic support for HTTP and FTP client allowing applications to fetch remote resources.
    • The design is modular, most of the extensions can be compiled out.
    • The internal document representation is as close as possible to the DOM interfaces.
    • Libxml2 also has a SAX like interface; the interface is designed to be compatible with Expat.
    • This library is released under the MIT License. See the Copyright file in the distribution for the precise wording.

    Warning: unless you are forced to because your application links with a Gnome-1.X library requiring it, Do Not Use libxml1, use libxml2

    FAQ

    Table of Contents:

    License(s)

    1. Licensing Terms for libxml

      libxml2 is released under the MIT License; see the file Copyright in the distribution for the precise wording

    2. Can I embed libxml2 in a proprietary application ?

      Yes. The MIT License allows you to keep proprietary the changes you made to libxml, but it would be graceful to send-back bug fixes and improvements as patches for possible incorporation in the main development tree.

    Installation

    1. Do Not Use libxml1, use libxml2
    2. Where can I get libxml ?

      The original distribution comes from xmlsoft.org or gnome.org

      Most Linux and BSD distributions include libxml, this is probably the safer way for end-users to use libxml.

      David Doolin provides precompiled Windows versions at http://www.ce.berkeley.edu/~doolin/code/libxmlwin32/

    3. I see libxml and libxml2 releases, which one should I install ?
      • If you are not constrained by backward compatibility issues with existing applications, install libxml2 only
      • If you are not doing development, you can safely install both. Usually the packages libxml and libxml2 are compatible (this is not the case for development packages).
      • If you are a developer and your system provides separate packaging for shared libraries and the development components, it is possible to install libxml and libxml2, and also libxml-devel and libxml2-devel too for libxml2 >= 2.3.0
      • If you are developing a new application, please develop against libxml2(-devel)
    4. I can't install the libxml package, it conflicts with libxml0

      You probably have an old libxml0 package used to provide the shared library for libxml.so.0, you can probably safely remove it. The libxml packages provided on xmlsoft.org provide libxml.so.0

    5. I can't install the libxml(2) RPM package due to failed dependencies

      The most generic solution is to re-fetch the latest src.rpm , and rebuild it locally with

      rpm --rebuild libxml(2)-xxx.src.rpm.

      If everything goes well it will generate two binary rpm packages (one providing the shared libs and xmllint, and the other one, the -devel package, providing includes, static libraries and scripts needed to build applications with libxml(2)) that you can install locally.

    Compilation

    1. What is the process to compile libxml2 ?

      As most UNIX libraries libxml2 follows the "standard":

      gunzip -c xxx.tar.gz | tar xvf -

      cd libxml-xxxx

      ./configure --help

      to see the options, then the compilation/installation proper

      ./configure [possible options]

      make

      make install

      At that point you may have to rerun ldconfig or a similar utility to update your list of installed shared libs.

    2. What other libraries are needed to compile/install libxml2 ?

      Libxml2 does not require any other library, the normal C ANSI API should be sufficient (please report any violation to this rule you may find).

      However if found at configuration time libxml2 will detect and use the following libs:

      • libz : a highly portable and available widely compression library.
      • iconv: a powerful character encoding conversion library. It is included by default in recent glibc libraries, so it doesn't need to be installed specifically on Linux. It now seems a part of the official UNIX specification. Here is one implementation of the library which source can be found here.
    3. Make check fails on some platforms

      Sometimes the regression tests' results don't completely match the value produced by the parser, and the makefile uses diff to print the delta. On some platforms the diff return breaks the compilation process; if the diff is small this is probably not a serious problem.

      Sometimes (especially on Solaris) make checks fail due to limitations in make. Try using GNU-make instead.

    4. I use the SVN version and there is no configure script

      The configure script (and other Makefiles) are generated. Use the autogen.sh script to regenerate the configure script and Makefiles, like:

      ./autogen.sh --prefix=/usr --disable-shared

    5. I have troubles when running make tests with gcc-3.0

      It seems the initial release of gcc-3.0 has a problem with the optimizer which miscompiles the URI module. Please use another compiler.

    Developer corner

    1. Troubles compiling or linking programs using libxml2

      Usually the problem comes from the fact that the compiler doesn't get the right compilation or linking flags. There is a small shell script xml2-config which is installed as part of libxml2 usual install process which provides those flags. Use

      xml2-config --cflags

      to get the compilation flags and

      xml2-config --libs

      to get the linker flags. Usually this is done directly from the Makefile as:

      CFLAGS=`xml2-config --cflags`

      LIBS=`xml2-config --libs`

    2. I want to install my own copy of libxml2 in my home directory and link my programs against it, but it doesn't work

      There are many different ways to accomplish this. Here is one way to do this under Linux. Suppose your home directory is /home/user. Then:

      • Create a subdirectory, let's call it myxml
      • unpack the libxml2 distribution into that subdirectory
      • chdir into the unpacked distribution (/home/user/myxml/libxml2 )
      • configure the library using the "--prefix" switch, specifying an installation subdirectory in /home/user/myxml, e.g.

        ./configure --prefix /home/user/myxml/xmlinst {other configuration options}

      • now run make followed by make install
      • At this point, the installation subdirectory contains the complete "private" include files, library files and binary program files (e.g. xmllint), located in

        /home/user/myxml/xmlinst/lib, /home/user/myxml/xmlinst/include and /home/user/myxml/xmlinst/bin

        respectively.
      • In order to use this "private" library, you should first add it to the beginning of your default PATH (so that your own private program files such as xmllint will be used instead of the normal system ones). To do this, the Bash command would be

        export PATH=/home/user/myxml/xmlinst/bin:$PATH

      • Now suppose you have a program test1.c that you would like to compile with your "private" library. Simply compile it using the command

        gcc `xml2-config --cflags --libs` -o test test.c

        Note that, because your PATH has been set with /home/user/myxml/xmlinst/bin at the beginning, the xml2-config program which you just installed will be used instead of the system default one, and this will automatically get the correct libraries linked with your program.
    3. xmlDocDump() generates output on one line.

      Libxml2 will not invent spaces in the content of a document since all spaces in the content of a document are significant. If you build a tree from the API and want indentation:

      1. the correct way is to generate those yourself too.
      2. the dangerous way is to ask libxml2 to add those blanks to your content modifying the content of your document in the process. The result may not be what you expect. There is NO way to guarantee that such a modification won't affect other parts of the content of your document. See xmlKeepBlanksDefault () and xmlSaveFormatFile ()
    4. Extra nodes in the document:

      For an XML file as below:

      <?xml version="1.0"?>
      <PLAN xmlns="http://www.argus.ca/autotest/1.0/">
      <NODE CommFlag="0"/>
      <NODE CommFlag="1"/>
      </PLAN>

      after parsing it with the function pxmlDoc=xmlParseFile(...);

      I want to the get the content of the first node (node with the CommFlag="0")

      so I did it as following;

      xmlNodePtr pnode;
      pnode=pxmlDoc->children->children;

      but it does not work. If I change it to

      pnode=pxmlDoc->children->children->next;

      then it works. Can someone explain it to me.

      In XML all characters in the content of the document are significant including blanks and formatting line breaks.

      The extra nodes you are wondering about are just that, text nodes with the formatting spaces which are part of the document but that people tend to forget. There is a function xmlKeepBlanksDefault () to remove those at parse time, but that's an heuristic, and its use should be limited to cases where you are certain there is no mixed-content in the document.

    5. I get compilation errors of existing code like when accessing root or child fields of nodes.

      You are compiling code developed for libxml version 1 and using a libxml2 development environment. Either switch back to libxml v1 devel or even better fix the code to compile with libxml2 (or both) by following the instructions.

    6. I get compilation errors about non existing xmlRootNode or xmlChildrenNode fields.

      The source code you are using has been upgraded to be able to compile with both libxml and libxml2, but you need to install a more recent version: libxml(-devel) >= 1.8.8 or libxml2(-devel) >= 2.1.0

    7. Random crashes in threaded applications

      Read and follow all advices on the thread safety page, and make 100% sure you never call xmlCleanupParser() while the library or an XML document might still be in use by another thread.

    8. The example provided in the web page does not compile.

      It's hard to maintain the documentation in sync with the code <grin/> ...

      Check the previous points 1/ and 2/ raised before, and please send patches.

    9. Where can I get more examples and information than provided on the web page?

      Ideally a libxml2 book would be nice. I have no such plan ... But you can:

      • check more deeply the existing generated doc
      • have a look at the set of examples.
      • look for examples of use for libxml2 function using the Gnome code or by asking on Google.
      • Browse the libxml2 source , I try to write code as clean and documented as possible, so looking at it may be helpful. In particular the code of xmllint.c and of the various testXXX.c test programs should provide good examples of how to do things with the library.
    10. What about C++ ?

      libxml2 is written in pure C in order to allow easy reuse on a number of platforms, including embedded systems. I don't intend to convert to C++.

      There is however a C++ wrapper which may fulfill your needs:

    11. How to validate a document a posteriori ?

      It is possible to validate documents which had not been validated at initial parsing time or documents which have been built from scratch using the API. Use the xmlValidateDtd() function. It is also possible to simply add a DTD to an existing document:

      xmlDocPtr doc; /* your existing document */
      xmlDtdPtr dtd = xmlParseDTD(NULL, filename_of_dtd); /* parse the DTD */
      
              dtd->name = xmlStrDup((xmlChar*)"root_name"); /* use the given root */
      
              doc->intSubset = dtd;
              if (doc->children == NULL) xmlAddChild((xmlNodePtr)doc, (xmlNodePtr)dtd);
              else xmlAddPrevSibling(doc->children, (xmlNodePtr)dtd);
                
    12. So what is this funky "xmlChar" used all the time?

      It is a null terminated sequence of utf-8 characters. And only utf-8! You need to convert strings encoded in different ways to utf-8 before passing them to the API. This can be accomplished with the iconv library for instance.

    13. etc ...

    Developer Menu

    There are several on-line resources related to using libxml:

    1. Use the search engine to look up information.
    2. Check the FAQ.
    3. Check the extensive documentation automatically extracted from code comments.
    4. Look at the documentation about libxml internationalization support.
    5. This page provides a global overview and some examples on how to use libxml.
    6. Code examples
    7. John Fleck's libxml2 tutorial: html or pdf.
    8. If you need to parse large files, check the xmlReader API tutorial
    9. James Henstridge wrote some nice documentation explaining how to use the libxml SAX interface.
    10. George Lebl wrote an article for IBM developerWorks about using libxml.
    11. Check the TODO file.
    12. Read the 1.x to 2.x upgrade path description. If you are starting a new project using libxml you should really use the 2.x version.
    13. And don't forget to look at the mailing-list archive.

    Reporting bugs and getting help

    Well, bugs or missing features are always possible, and I will make a point of fixing them in a timely fashion. The best way to report a bug is to use the Gnome bug tracking database (make sure to use the "libxml2" module name). I look at reports there regularly and it's good to have a reminder when a bug is still open. Be sure to specify that the bug is for the package libxml2.

    For small problems you can try to get help on IRC, the #xml channel on irc.gnome.org (port 6667) usually have a few person subscribed which may help (but there is no guarantee and if a real issue is raised it should go on the mailing-list for archival).

    There is also a mailing-list xml@gnome.org for libxml, with an on-line archive (old). To subscribe to this list, please visit the associated Web page and follow the instructions. Do not send code, I won't debug it (but patches are really appreciated!).

    Please note that with the current amount of virus and SPAM, sending mail to the list without being subscribed won't work. There is *far too many bounces* (in the order of a thousand a day !) I cannot approve them manually anymore. If your mail to the list bounced waiting for administrator approval, it is LOST ! Repost it and fix the problem triggering the error. Also please note that emails with a legal warning asking to not copy or redistribute freely the information they contain are NOT acceptable for the mailing-list, such mail will as much as possible be discarded automatically, and are less likely to be answered if they made it to the list, DO NOT post to the list from an email address where such legal requirements are automatically added, get private paying support if you can't share information.

    Check the following before posting:

    • Read the FAQ and use the search engine to get information related to your problem.
    • Make sure you are using a recent version, and that the problem still shows up in a recent version.
    • Check the list archives to see if the problem was reported already. In this case there is probably a fix available, similarly check the registered open bugs.
    • Make sure you can reproduce the bug with xmllint or one of the test programs found in source in the distribution.
    • Please send the command showing the error as well as the input (as an attachment)

    Then send the bug with associated information to reproduce it to the xml@gnome.org list; if it's really libxml related I will approve it. Please do not send mail to me directly, it makes things really hard to track and in some cases I am not the best person to answer a given question, ask on the list.

    To be really clear about support:

    • Support or help requests MUST be sent to the list or on bugzilla in case of problems, so that the Question and Answers can be shared publicly. Failing to do so carries the implicit message "I want free support but I don't want to share the benefits with others" and is not welcome. I will automatically Carbon-Copy the xml@gnome.org mailing list for any technical reply made about libxml2 or libxslt.
    • There is no guarantee of support. If your question remains unanswered after a week, repost it, making sure you gave all the detail needed and the information requested.
    • Failing to provide information as requested or double checking first for prior feedback also carries the implicit message "the time of the library maintainers is less valuable than my time" and might not be welcome.

    Of course, bugs reported with a suggested patch for fixing them will probably be processed faster than those without.

    If you're looking for help, a quick look at the list archive may actually provide the answer. I usually send source samples when answering libxml2 usage questions. The auto-generated documentation is not as polished as I would like (i need to learn more about DocBook), but it's a good starting point.

    How to help

    You can help the project in various ways, the best thing to do first is to subscribe to the mailing-list as explained before, check the archives and the Gnome bug database:

    1. Provide patches when you find problems.
    2. Provide the diffs when you port libxml2 to a new platform. They may not be integrated in all cases but help pinpointing portability problems and
    3. Provide documentation fixes (either as patches to the code comments or as HTML diffs).
    4. Provide new documentations pieces (translations, examples, etc ...).
    5. Check the TODO file and try to close one of the items.
    6. Take one of the points raised in the archive or the bug database and provide a fix. Get in touch with me before to avoid synchronization problems and check that the suggested fix will fit in nicely :-)

    Downloads

    The latest versions of libxml2 can be found on the xmlsoft.org server ( FTP and rsync are available), there are also mirrors (France and Antonin Sprinzl also provide a mirror in Austria). (NOTE that you need both the libxml(2) and libxml(2)-devel packages installed to compile applications using libxml if using RPMs.)

    You can find all the history of libxml(2) and libxslt releases in the old directory. The precompiled Windows binaries made by Igor Zlatovic are available in the win32 directory.

    Binary ports:

    If you know other supported binary ports, please contact me.

    Snapshot:

    Contributions:

    I do accept external contributions, especially if compiling on another platform, get in touch with the list to upload the package, wrappers for various languages have been provided, and can be found in the bindings section

    Libxml2 is also available from GIT:

    • See libxml2 Git web. To checkout a local tree use:

      git clone git://git.gnome.org/libxml2
    • The libxslt module is also present there.

    Releases

    The change log describes the recents commits to the GIT code base.

    Here is the list of public releases:

    2.9.0: Sep 11 2012

    • Features:
      A few new API entry points,
      More resilient push parser mode,
      A lot of portability improvement,
      Faster XPath evaluation
    • Documentation:
      xml2-config.1 markup error (Christian Weisgerber),
      libxml(3) manpage typo fix (John Bradshaw),
      More cleanups to the documentation part of libxml2 (Daniel Richard G)
    • Portability:
      Bug 676544 - fails to build with --without-sax1 (Akira TAGOH),
      fix builds not having stdint.h (Rob Richards),
      GetProcAddressA is available only on WinCE (Daniel Veillard),
      More updates and cleanups on autotools and Makefiles (Daniel Richard G),
      More changes for Win32 compilation (Eric Zurcher),
      Basic changes for Win32 builds of release 2.9.0: compile buf.c (Eric Zurcher),
      Bundles all generated files for python into the distribution (Daniel Richard G),
      Fix compiler warnings of wincecompat.c (Patrick Gansterer),
      Fix non __GNUC__ build (Patrick Gansterer),
      Fix windows unicode build (Patrick Gansterer),
      clean redefinition of {v}snprintf in C-source (Roumen Petrov),
      use xmlBuf... if DEBUG_INPUT is defined (Roumen Petrov),
      fix runtests to use pthreads support for various Unix platforms (Daniel Richard G),
      Various "make distcheck" and portability fixups 2nd part (Daniel Richard G),
      Various "make distcheck" and portability fixups (Daniel Richard G),
      Fix compilation on older Visual Studio (Daniel Veillard)
    • Bug Fixes:
      Change the XPath code to percolate allocation errors (Daniel Veillard),
      Fix reuse of xmlInitParser (Daniel Veillard),
      Fix potential crash on entities errors (Daniel Veillard),
      initialize var (Rob Richards),
      Fix the XPath arity check to also check the XPath stack limits (Daniel Veillard),
      Fix problem with specific and generic error handlers (Pietro Cerutti),
      Avoid a potential infinite recursion (Daniel Veillard),
      Fix an XSD error when generating internal automata (Daniel Veillard),
      Patch for xinclude of text using multibyte characters (Vitaly Ostanin),
      Fix a segfault on XSD validation on pattern error (Daniel Veillard),
      Fix missing xmlsave.h module which was ignored in recent builds (Daniel Veillard),
      Add a missing element check (Daniel Veillard),
      Adding various checks on node type though the API (Daniel Veillard),
      Namespace nodes can't be unlinked with xmlUnlinkNode (Daniel Veillard),
      Fix make dist to include new private header files (Daniel Veillard),
      More fixups on the push parser behaviour (Daniel Veillard),
      Strengthen behaviour of the push parser in problematic situations (Daniel Veillard),
      Enforce XML_PARSER_EOF state handling through the parser (Daniel Veillard),
      Fixup limits parser (Daniel Veillard),
      Do not fetch external parsed entities (Daniel Veillard),
      Fix an error in previous commit (Aron Xu),
      Fix entities local buffers size problems (Daniel Veillard),
      Fix parser local buffers size problems (Daniel Veillard),
      Fix a failure to report xmlreader parsing failures (Daniel Veillard)
    • Improvements:
      Keep libxml2.syms when running "make distclean" (Daniel Veillard),
      Allow to set the quoting character of an xmlWriter (Csaba Raduly),
      Keep non-significant blanks node in HTML parser (Daniel Veillard),
      Add a forbidden variable error number and message to XPath (Daniel Veillard),
      Support long path names on WNT (Michael Stahl),
      Improve HTML escaping of attribute on output (Daniel Veillard),
      Handle ICU_LIBS as LIBADD, not LDFLAGS to prevent linking errors (Arfrever Frehtes Taifersar Arahesis),
      Switching XPath node sorting to Timsort (Vojtech Fried),
      Optimizing '//' in XPath expressions (Nick Wellnhofer),
      Expose xmlBufShrink in the public tree API (Daniel Veillard),
      Visible HTML elements close the head tag (Conrad Irwin),
      Fix file and line report for XSD SAX and reader streaming validation (Daniel Veillard),
      Fix const qualifyer to definition of xmlBufferDetach (Daniel Veillard),
      minimize use of HAVE_CONFIG_H (Roumen Petrov),
      fixup regression in Various "make distcheck" and portability fixups (Roumen Petrov),
      Add support for big line numbers in error reporting (Daniel Veillard),
      Avoid using xmlBuffer for serialization (Daniel Veillard),
      Improve compatibility between xmlBuf and xmlBuffer (Daniel Veillard),
      Provide new accessors for xmlOutputBuffer (Daniel Veillard),
      Improvements for old buffer compatibility (Daniel Veillard),
      Expand the limit test program (Daniel Veillard),
      Improve error reporting on parser errors (Daniel Veillard),
      Implement some default limits in the XPath module (Daniel Veillard),
      Introduce some default parser limits (Daniel Veillard),
      Cleanups and new limit APIs for dictionaries (Daniel Veillard),
      Fixup for buf.c (Daniel Veillard),
      Cleanup URI module memory allocation code (Daniel Veillard),
      Extend testlimits (Daniel Veillard),
      More avoid quadratic behaviour (Daniel Veillard),
      Impose a reasonable limit on PI size (Daniel Veillard),
      first version of testlimits new test (Daniel Veillard),
      Avoid quadratic behaviour in some push parsing cases (Daniel Veillard),
      Impose a reasonable limit on comment size (Daniel Veillard),
      Impose a reasonable limit on attribute size (Daniel Veillard),
      Harden the buffer code and make it more compatible (Daniel Veillard),
      More cleanups for input/buffers code (Daniel Veillard),
      Cleanup function xmlBufResetInput(),
      to set input from Buffer (Daniel Veillard) Swicth the test program for characters to new input buffers (Daniel Veillard),
      Convert the HTML tree module to the new buffers (Daniel Veillard),
      Convert of the HTML parser to new input buffers (Daniel Veillard),
      Convert the writer to new output buffer and save APIs (Daniel Veillard),
      Convert XMLReader to the new input buffers (Daniel Veillard),
      New saving functions using xmlBuf and conversion (Daniel Veillard),
      Provide new xmlBuf based saving functions (Daniel Veillard),
      Convert XInclude to the new input buffers (Daniel Veillard),
      Convert catalog code to the new input buffers (Daniel Veillard),
      Convert C14N to the new Input buffer (Daniel Veillard),
      Convert xmlIO.c to the new input and output buffers (Daniel Veillard),
      Convert XML parser to the new input buffers (Daniel Veillard),
      Incompatible change to the Input and Output buffers (Daniel Veillard),
      Adding new encoding function to deal with the new structures (Daniel Veillard),
      Convert XPath to xmlBuf (Daniel Veillard),
      Adding a new buf module for buffers (Daniel Veillard),
      Memory error within SAX2 reuse common framework (Daniel Veillard),
      Fix xmllint --xpath node initialization (Daniel Veillard)
    • Cleanups:
      Various cleanups to avoid compiler warnings (Daniel Veillard),
      Big space and tab cleanup (Daniel Veillard),
      Followup to LibXML2 docs/examples cleanup patch (Daniel Veillard),
      Second round of cleanups for LibXML2 docs/examples (Daniel Richard),
      Remove all .cvsignore as they are not used anymore (Daniel Veillard),
      Fix a Timsort function helper comment (Daniel Veillard),
      Small cleanup for valgrind target (Daniel Veillard),
      Patch for portability of latin characters in C files (Daniel Veillard),
      Cleanup some of the parser code (Daniel Veillard),
      Fix a variable name in comment (Daniel Veillard),
      Regenerated testapi.c (Daniel Veillard),
      Regenerating docs and API files (Daniel Veillard),
      Small cleanup of unused variables in test (Daniel Veillard),
      Expand .gitignore with more files (Daniel Veillard)

    2.8.0: May 23 2012

    • Features: add lzma compression support (Anders F Bjorklund)
    • Documentation: xmlcatalog: Add uri and delegateURI to possible add types in man page. (Ville Skyttä), Update README.tests (Daniel Veillard), URI handling code is not OOM resilient (Daniel Veillard), Fix an error in comment (Daniel Veillard), Fixed bug #617016 (Daniel Mustieles), Fixed two typos in the README document (Daniel Neel), add generated html files (Anders F Bjorklund), Clarify the need to use xmlFreeNode after xmlUnlinkNode (Daniel Veillard), Improve documentation a bit (Daniel Veillard), Updated URL for lxml python bindings (Daniel Veillard)
    • Portability: Restore code for Windows compilation (Daniel Veillard), Remove git error message during configure (Christian Dywan), xmllint: Build fix for endTimer if !defined(HAVE_GETTIMEOFDAY) (Patrick R. Gansterer), remove a bashism in confgure.in (John Hein), undef ERROR if already defined (Patrick R. Gansterer), Fix library problems with mingw-w64 (Michael Cronenworth), fix windows build. ifdef addition from bug 666491 makes no sense (Rob Richards), prefer native threads on win32 (Sam Thursfield), Allow to compile with Visual Studio 2010 (Thomas Lemm), Fix mingw's snprintf configure check (Andoni Morales), fixed a 64bit big endian issue (Marcus Meissner), Fix portability failure if netdb.h lacks NO_ADDRESS (Daniel Veillard), Fix windows build from lzma addition (Rob Richards), autogen: Only check for libtoolize (Colin Walters), Fix the Windows build files (Patrick von Reth), 634846 Remove a linking option breaking Windows VC10 (Daniel Veillard), 599241 fix an initialization problem on Win64 (Andrew W. Nosenko), fix win build (Rob Richards)
    • Bug fixes: Part for rand_r checking missing (Daniel Veillard), Cleanup on randomization (Daniel Veillard), Fix undefined reference in python module (Pacho Ramos), Fix a race in xmlNewInputStream (Daniel Veillard), Fix weird streaming RelaxNG errors (Noam), Fix various bugs in new code raised by the API checking (Daniel Veillard), Fix various problems with "make dist" (Daniel Veillard), Fix a memory leak in the xzlib code (Daniel Veillard), HTML parser error with <noscript> in the <head> (Denis Pauk), XSD: optional element in complex type extension (Remi Gacogne), Fix html serialization error and htmlSetMetaEncoding() (Daniel Veillard), Fix a wrong return value in previous patch (Daniel Veillard), Fix an uninitialized variable use (Daniel Veillard), Fix a compilation problem with --minimum (Brandon Slack), Remove redundant and ungarded include of resolv.h (Daniel Veillard), xinclude with parse="text" does not use the entity loader (Shaun McCance), Allow to parse 1 byte HTML files (Denis Pauk), Patch that fixes the skipping of the HTML_PARSE_NOIMPLIED flag (Martin Schröder), Avoid memory leak if xmlParserInputBufferCreateIO fails (Lin Yi-Li), Prevent an infinite loop when dumping a node with encoding problems (Timothy Elliott), xmlParseNodeInContext problems with an empty document (Tim Elliott), HTML element position is not detected propperly (Pavel Andrejs), Fix an off by one pointer access (Jüri Aedla), Try to fix a problem with entities in SAX mode (Daniel Veillard), Fix a crash with xmllint --path on empty results (Daniel Veillard), Fixed bug #667946 (Daniel Mustieles), Fix a logic error in Schemas Component Constraints (Ryan Sleevi), Fix a wrong enum type use in Schemas Types (Nico Weber), Fix SAX2 builder in case of undefined attributes namespace (Daniel Veillard), Fix SAX2 builder in case of undefined element namespaces (Daniel Veillard), fix reference to STDOUT_FILENO on MSVC (Tay Ray Chuan), fix a pair of possible out of array char references (Daniel Veillard), Fix an allocation error when copying entities (Daniel Veillard), Make sure the parser returns when getting a Stop order (Chris Evans), Fix some potential problems on reallocation failures(parser.c) (Xia Xinfeng), Fix a schema type duration comparison overflow (Daniel Veillard), Fix an unimplemented part in RNG value validation (Daniel Veillard), Fix missing error status in XPath evaluation (Daniel Veillard), Hardening of XPath evaluation (Daniel Veillard), Fix an off by one error in encoding (Daniel Veillard), Fix RELAX NG include bug #655288 (Shaun McCance), Fix XSD validation bug #630130 (Toyoda Eizi), Fix some potential problems on reallocation failures (Chris Evans), __xmlRaiseError: fix use of the structured callback channel (Dmitry V. Levin), __xmlRaiseError: fix the structured callback channel's data initialization (Dmitry V. Levin), Fix memory corruption when xmlParseBalancedChunkMemoryInternal is called from xmlParseBalancedChunk (Rob Richards), Small fix for previous commit (Daniel Veillard), Fix a potential freeing error in XPath (Daniel Veillard), Fix a potential memory access error (Daniel Veillard), Reactivate the shared library versionning script (Daniel Veillard)
    • Improvements: use mingw C99 compatible functions {v}snprintf instead those from MSVC runtime (Roumen Petrov), New symbols added for the next release (Daniel Veillard), xmlTextReader bails too quickly on error (Andy Lutomirski), Use a hybrid allocation scheme in xmlNodeSetContent (Conrad Irwin), Use buffers when constructing string node lists. (Conrad Irwin), Add HTML parser support for HTML5 meta charset encoding declaration (Denis Pauk), wrong message for double hyphen in comment XML error (Bryan Henderson), Fix "make tst" to grab lzma lib too (Daniel Veillard), Add "whereis" command to xmllint shell (Ryan), Improve xmllint shell (Ryan), add function xmlTextReaderRelaxNGValidateCtxt() (Noam Postavsky), Add --system support to autogen.sh (Daniel Veillard), Add hash randomization to hash and dict structures (Daniel Veillard), included xzlib in dist (Anders F Bjorklund), move xz/lzma helpers to separate included files (Anders F Bjorklund), add generated devhelp files (Anders F Bjorklund), add XML_WITH_LZMA to api (Anders F Bjorklund), autogen.sh: Honor NOCONFIGURE environment variable (Colin Walters), Improve the error report on undefined REFs (Daniel Veillard), Add exception for new W3C PI xml-model (Daniel Veillard), Add options to ignore the internal encoding (Daniel Veillard), testapi: use the right type for the check (Stefan Kost), various: handle return values of write calls (Stefan Kost), testWriter: xmlTextWriterWriteFormatElement wants an int instead of a long int (Stefan Kost), runxmlconf: update to latest testsuite version (Stefan Kost), configure: add -Wno-long-long to CFLAGS (Stefan Kost), configure: support silent automake rules if possible (Stefan Kost), xmlmemory: add a cast as size_t has no portable printf modifier (Stefan Kost), __xmlRaiseError: remove redundant schannel initialization (Dmitry V. Levin), __xmlRaiseError: do cheap code check early (Dmitry V. Levin)
    • Cleanups: Cleanups before 2.8.0-rc2 (Daniel Veillard), Avoid an extra operation (Daniel Veillard), Remove vestigial de-ANSI-fication support. (Javier Jardón), autogen.sh: Fix typo (Javier Jardón), Do not use unsigned but unsigned int (Daniel Veillard), Remove two references to u_short (Daniel Veillard), Fix -Wempty-body warning from clang (Nico Weber), Cleanups of lzma support (Daniel Veillard), Augment the list of ignored files (Daniel Veillard), python: remove unused variable (Stefan Kost), python: flag two unused args (Stefan Kost), configure: acconfig.h is deprecated since autoconf-2.50 (Stefan Kost), xpath: remove unused variable (Stefan Kost)

    2.7.8: Nov 4 2010

    • Features: 480323 add code to plug in ICU converters by default (Giuseppe Iuculano), Add xmlSaveOption XML_SAVE_WSNONSIG (Adam Spragg)
    • Documentation: Fix devhelp documentation installation (Mike Hommey), Fix web site encoding problems (Daniel Veillard), Fix a couple of typo in HTML parser error messages (Michael Day), Forgot to update the news page for 0.7.7 (Daniel Veillard)
    • Portability: 607273 Fix python detection on MSys/Windows (LRN), 614087 Fix Socket API usage to allow Windows64 compilation (Ozkan Sezer), Fix compilation with Clang (Koop Mast), Fix Win32 build (Rob Richards)
    • Bug Fixes: 595789 fix a remaining potential Solaris problem (Daniel Veillard), 617468 fix progressive HTML parsing with style using "'" (Denis Pauk), 616478 Fix xmllint shell write command (Gwenn Kahz), 614005 Possible erroneous HTML parsing on unterminated script (Pierre Belzile), 627987 Fix XSD IDC errors in imported schemas (Jim Panetta), 629325 XPath rounding errors first cleanup (Phil Shafer), 630140 fix iso995x encoding error (Daniel Veillard), make sure htmlCtxtReset do reset the disableSAX field (Daniel Veillard), Fix a change of semantic on XPath preceding and following axis (Daniel Veillard), Fix a potential segfault due to weak symbols on pthreads (Mike Hommey), Fix a leak in XPath compilation (Daniel Veillard), Fix the semantic of XPath axis for namespace/attribute context nodes (Daniel Veillard), Avoid a descriptor leak in catalog loading code (Carlo Bramini), Fix a small bug in XPath evaluation code (Marius Wachtler), Fix handling of XML-1.0 XML namespace declaration (Daniel Veillard), Fix errors in XSD double validation check (Csaba Raduly), Fix handling of apos in URIs (Daniel Veillard), xmlTextReaderReadOuterXml should handle DTD (Rob Richards), Autogen.sh needs to create m4 directory (Rob Richards)
    • Improvements: 606592 update language ID parser to RFC 5646 (Daniel Veillard), Sort python generated stubs (Mike Hommey), Add an HTML parser option to avoid a default doctype (Daniel Veillard)
    • Cleanups: 618831 don't ship generated files in git (Adrian Bunk), Switch from the obsolete mkinstalldirs to AC_PROG_MKDIR_P (Adrian Bunk), Various cleanups on encoding handling (Daniel Veillard), Fix xmllint to use format=1 for default formatting (Adam Spragg), Force _xmlSaveCtxt.format to be 0 or 1 (Adam Spragg), Cleanup encoding pointer comparison (Nikolay Sivov), Small code cleanup on previous patch (Daniel Veillard)

    2.7.7: Mar 15 2010

    • Improvements: Adding a --xpath option to xmllint (Daniel Veillard), Make HTML parser non-recursive (Eugene Pimenov)
    • Portability: relaxng.c: cast to allow compilation with sun studio 11 (Ben Walton), Fix build failure on Sparc solaris (Roumen Petrov), use autoreconf in autogen.sh (Daniel Veillard), Fix build with mingw (Roumen Petrov), Upgrade some of the configure and autogen (Daniel Veillard), Fix relaxNG tests in runtest for Windows runtest.c: initialize ret (Rob Richards), Fix a const warning in xmlNodeSetBase (Martin Trappel), Fix python generator to not use deprecated xmllib (Daniel Veillard), Update some automake files (Daniel Veillard), 598785 Fix nanohttp on Windows (spadix)
    • Bug Fixes: libxml violates the zlib interface and crashes (Mark Adler), Fix broken escape behaviour in regexp ranges (Daniel Veillard), Fix missing win32 libraries in libxml-2.0.pc (Volker Grabsch), Fix detection of python linker flags (Daniel Macks), fix build error in libxml2/python (Paul Smith), ChunkParser: Incorrect decoding of small xml files (Raul Hudea), htmlCheckEncoding doesn't update input-end after shrink (Eugene Pimenov), Fix a missing #ifdef (Daniel Veillard), Fix encoding selection for xmlParseInNodeContext (Daniel Veillard), xmlPreviousElementSibling mistake (François Delyon), 608773 add a missing check in xmlGROW (Daniel Veillard), Fix xmlParseInNodeContext for HTML content (Daniel Veillard), Fix lost namespace when copying node * tree.c: reconcile namespace if not found (Rob Richards), Fix some missing commas in HTML element lists (Eugene Pimenov), Correct variable type to unsigned (Nikolay Sivov), Recognize ID attribute in HTML without DOCTYPE (Daniel Veillard), Fix memory leak in xmlXPathEvalExpression() (Martin), Fix an init bug in global.c (Kai Henning), Fix xmlNodeSetBase() comment (Daniel Veillard), Fix broken escape behaviour in regexp ranges (Daniel Veillard), Don't give default HTML boolean attribute values in parser (Daniel Veillard), xmlCtxtResetLastError should reset ctxt-errNo (Daniel Veillard)
    • Cleanups: Cleanup a couple of weirdness in HTML parser (Eugene Pimenov)

    2.7.6: Oct 6 2009

    • Bug Fixes: Restore thread support in default configuration (Andrew W. Nosenko), URI with no path parsing problem (Daniel Veillard), Minor patch for conditional defines in threads.c (Eric Zurcher)

    2.7.5: Sep 24 2009

    • Bug Fixes: Restore behavior of --with-threads without argument (Andrew W. Nosenko), Fix memory leak when doc is NULL (Rob Richards), 595792 fixing a RelaxNG bug introduced in 2.7.4 (Daniel Veillard), Fix a Relaxng bug raised by libvirt test suite (Daniel Veillard), Fix a parsing problem with little data at startup (Daniel Veillard), link python module with python library (Frederic Crozat), 594874 Forgot an fclose in xmllint (Daniel Veillard)
    • Cleanup: Adding symbols.xml to EXTRA_DIST (Daniel Veillard)

    2.7.4: Sep 10 2009

    • Improvements: Switch to GIT (GNOME), Add symbol versioning to libxml2 shared libs (Daniel Veillard)
    • Portability: 593857 try to work around thread pbm MinGW 4.4 (Daniel Veillard), 594250 rename ATTRIBUTE_ALLOC_SIZE to avoid clashes (Daniel Veillard), Fix Windows build * relaxng.c: fix windows build (Rob Richards), Fix the globals.h to use XMLPUBFUN (Paul Smith), Problem with extern extern in header (Daniel Veillard), Add -lnetwork for compiling on Haiku (Scott McCreary), Runtest portability patch for Solaris (Tim Rice), Small patch to accomodate the Haiku OS (Scott McCreary), 584605 package VxWorks folder in the distribution (Daniel Veillard), 574017 Realloc too expensive on most platform (Daniel Veillard), Fix windows build (Rob Richards), 545579 doesn't compile without schema support (Daniel Veillard), xmllint use xmlGetNodePath when not compiled in (Daniel Veillard), Try to avoid __imp__xmlFree link trouble on msys (Daniel Veillard), Allow to select the threading system on Windows (LRN), Fix Solaris binary links, cleanups (Daniel Veillard), Bug 571059 – MSVC doesn't work with the bakefile (Intron), fix ATTRIBUTE_PRINTF header clash (Belgabor and Mike Hommey), fixes for Borland/CodeGear/Embarcadero compilers (Eric Zurcher)
    • Documentation: 544910 typo: "renciliateNs" (Leonid Evdokimov), Add VxWorks to list of OSes (Daniel Veillard), Regenerate the documentation and update for git (Daniel Veillard), 560524 ¿ xmlTextReaderLocalName description (Daniel Veillard), Added sponsoring by AOE media for the server (Daniel Veillard), updated URLs for GNOME (Vincent Lefevre), more warnings about xmlCleanupThreads and xmlCleanupParser (Daniel Veillard)
    • Bug fixes: 594514 memory leaks - duplicate initialization (MOD), Wrong block opening in htmlNodeDumpOutputInternal (Daniel Veillard), 492317 Fix Relax-NG validation problems (Daniel Veillard), 558452 fight with reg test and error report (Daniel Veillard), 558452 RNG compilation of optional multiple child (Daniel Veillard), 579746 XSD validation not correct / nilable groups (Daniel Veillard), 502960 provide namespace stack when parsing entity (Daniel Veillard), 566012 part 2 fix regresion tests and push mode (Daniel Veillard), 566012 autodetected encoding and encoding conflict (Daniel Veillard), 584220 xpointer(/) and xinclude problems (Daniel Veillard), 587663 Incorrect Attribute-Value Normalization (Daniel Veillard), 444994 HTML chunked failure for attribute with <> (Daniel Veillard), Fix end of buffer char being split in XML parser (Daniel Veillard), Non ASCII character may be split at buffer end (Adiel Mittmann), 440226 Add xmlXIncludeProcessTreeFlagsData API (Stefan Behnel), 572129 speed up parsing of large HTML text nodes (Markus Kull), Fix HTML parsing with 0 character in CDATA (Daniel Veillard), Fix SetGenericErrorFunc and SetStructured clash (Wang Lam), 566012 Incomplete EBCDIC parsing support (Martin Kogler), 541335 HTML avoid creating 2 head or 2 body element (Daniel Veillard), 541237 error correcting missing end tags in HTML (Daniel Veillard), 583439 missing line numbers in push mode (Daniel Veillard), 587867 xmllint --html --xmlout serializing as HTML (Daniel Veillard), 559501 avoid select and use poll for nanohttp (Raphael Prevost), 559410 - Regexp bug on (...)? constructs (Daniel Veillard), Fix a small problem on previous HTML parser patch (Daniel Veillard), 592430 - HTML parser runs into endless loop (Daniel Veillard), 447899 potential double free in xmlFreeTextReader (Daniel Veillard), 446613 small validation bug mixed content with NS (Daniel Veillard), Fix the problem of revalidating a doc with RNG (Daniel Veillard), Fix xmlKeepBlanksDefault to not break indent (Nick Wellnhofer), 512131 refs from externalRef part need to be added (Daniel Veillard), 512131 crash in xmlRelaxNGValidateFullElement (Daniel Veillard), 588441 allow '.' in HTML Names even if invalid (Daniel Veillard), 582913 Fix htmlSetMetaEncoding() to be nicer (Daniel Veillard), 579317 Try to find the HTML encoding information (Daniel Veillard), 575875 don't output charset=html (Daniel Veillard), 571271 fix semantic of xsd:all with minOccurs=0 (Daniel Veillard), 570702 fix a bug in regexp determinism checking (Daniel Veillard), 567619 xmlValidateNotationUse missing param test (Daniel Veillard), 574393 ¿ utf-8 filename magic for compressed files (Hans Breuer), Fix a couple of problems in the parser (Daniel Veillard), 585505 ¿ Document ids and refs populated by XSD (Wayne Jensen), 582906 XSD validating multiple imports of the same schema (Jason Childs), Bug 582887 ¿ problems validating complex schemas (Jason Childs), Bug 579729 ¿ fix XSD schemas parsing crash (Miroslav Bajtos), 576368 ¿ htmlChunkParser with special attributes (Jiri Netolicky), Bug 565747 ¿ relax anyURI data character checking (Vincent Lefevre), Preserve attributes of include start on tree copy (Petr Pajas), Skip silently unrecognized XPointer schemes (Jakub Wilk), Fix leak on SAX1, xmllint --sax1 option and debug (Daniel Veillard), potential NULL dereference on non-glibc (Jim Meyering), Fix an XSD validation crash (Daniel Veillard), Fix a regression in streaming entities support (Daniel Veillard), Fix a couple of ABI issues with C14N 1.1 (Aleksey Sanin), Aleksey Sanin support for c14n 1.1 (Aleksey Sanin), reader bug fix with entities (Daniel Veillard), use options from current parser ctxt for external entities (Rob Richards), 581612 use %s to printf strings (Christian Persch), 584605 change the threading initialization sequence (Igor Novoseltsev), 580705 keep line numbers in HTML parser (Aaron Patterson), 581803 broken HTML table attributes init (Roland Steiner), do not set error code in xmlNsWarn (Rob Richards), 564217 fix structured error handling problems, reuse options from current parser for entities (Rob Richards), xmlXPathRegisterNs should not allow enpty prefixes (Daniel Veillard), add a missing check in xmlAddSibling (Kris Breuker), avoid leaks on errors (Jinmei Tatuya)
    • Cleanup: Chasing dead assignments reported by clang-scan (Daniel Veillard), A few more safety cleanup raised by scan (Daniel Veillard), Fixing assorted potential problems raised by scan (Daniel Veillard), Potential uninitialized arguments raised by scan (Daniel Veillard), Fix a bunch of scan 'dead increments' and cleanup (Daniel Veillard), Remove a pedantic warning (Daniel Veillard), 555833 always use rm -f in uninstall-local (Daniel Veillard), 542394 xmlRegisterOutputCallbacks MAX_INPUT_CALLBACK (Daniel Veillard), Autoregenerate libxml2.syms automated checkings (Daniel Veillard), Make xmlRecoverDoc const (Martin Trappel) (Daniel Veillard), Both args of xmlStrcasestr are const (Daniel Veillard), hide the nbParse* variables used for debugging (Mike Hommey), 570806 changed include of config.h (William M. Brack), cleanups and error reports when xmlTextWriterVSprintf fails (Jinmei Tatuya)

    2.7.3: Jan 18 2009

    • Build fix: fix build when HTML support is not included.
    • Bug fixes: avoid memory overflow in gigantic text nodes, indentation problem on the writed (Rob Richards), xmlAddChildList pointer problem (Rob Richards and Kevin Milburn), xmlAddChild problem with attribute (Rob Richards and Kris Breuker), avoid a memory leak in an edge case (Daniel Zimmermann), deallocate some pthread data (Alex Ott).
    • Improvements: configure option to avoid rebuilding docs (Adrian Bunk), limit text nodes to 10MB max by default, add element traversal APIs, add a parser option to enable pre 2.7 SAX behavior (Rob Richards), add gcc malloc checking (Marcus Meissner), add gcc printf like functions parameters checking (Marcus Meissner).

    2.7.2: Oct 3 2008

    • Portability fix: fix solaris compilation problem, fix compilation if XPath is not configured in
    • Bug fixes: nasty entity bug introduced in 2.7.0, restore old behaviour when saving an HTML doc with an xml dump function, HTML UTF-8 parsing bug, fix reader custom error handlers (Riccardo Scussat)
    • Improvement: xmlSave options for more flexibility to save as XML/HTML/XHTML, handle leading BOM in HTML documents

    2.7.1: Sep 1 2008

    • Portability fix: Borland C fix (Moritz Both)
    • Bug fixes: python serialization wrappers, XPath QName corner case handking and leaks (Martin)
    • Improvement: extend the xmlSave to handle HTML documents and trees
    • Cleanup: python serialization wrappers

    2.7.0: Aug 30 2008

    • Documentation: switch ChangeLog to UTF-8, improve mutithreads and xmlParserCleanup docs
    • Portability fixes: Older Win32 platforms (Rob Richards), MSVC porting fix (Rob Richards), Mac OS X regression tests (Sven Herzberg), non GNUCC builds (Rob Richards), compilation on Haiku (Andreas Färber)
    • Bug fixes: various realloc problems (Ashwin), potential double-free (Ashwin), regexp crash, icrash with invalid whitespace facets (Rob Richards), pattern fix when streaming (William Brack), various XML parsing and validation fixes based on the W3C regression tests, reader tree skipping function fix (Ashwin), Schemas regexps escaping fix (Volker Grabsch), handling of entity push errors (Ashwin), fix a slowdown when encoder cant serialize characters on output
    • Code cleanup: compilation fix without the reader, without the output (Robert Schwebel), python whitespace (Martin), many space/tabs cleanups, serious cleanup of the entity handling code
    • Improvement: switch parser to XML-1.0 5th edition, add parsing flags for old versions, switch URI parsing to RFC 3986, add xmlSchemaValidCtxtGetParserCtxt (Holger Kaelberer), new hashing functions for dictionnaries (based on Stefan Behnel work), improve handling of misplaced html/head/body in HTML parser, better regression test tools and code coverage display, better algorithms to detect various versions of the billion laughts attacks, make arbitrary parser limits avoidable as a parser option

    2.6.32: Apr 8 2008

    • Documentation: returning heap memory to kernel (Wolfram Sang), trying to clarify xmlCleanupParser() use, xmlXPathContext improvement (Jack Jansen), improve the *Recover* functions documentation, XmlNodeType doc link fix (Martijn Arts)
    • Bug fixes: internal subset memory leak (Ashwin), avoid problem with paths starting with // (Petr Sumbera), streaming XSD validation callback patches (Ashwin), fix redirection on port other than 80 (William Brack), SAX2 leak (Ashwin), XInclude fragment of own document (Chris Ryan), regexp bug with '.' (Andrew Tosh), flush the writer at the end of the document (Alfred Mickautsch), output I/O bug fix (William Brack), writer CDATA output after a text node (Alex Khesin), UTF-16 encoding detection (William Brack), fix handling of empty CDATA nodes for Safari team, python binding problem with namespace nodes, improve HTML parsing (Arnold Hendriks), regexp automata build bug, memory leak fix (Vasily Chekalkin), XSD test crash, weird system parameter entity parsing problem, allow save to file:///X:/ windows paths, various attribute normalisation problems, externalSubsetSplit fix (Ashwin), attribute redefinition in the DTD (Ashwin), fix in char ref parsing check (Alex Khesin), many out of memory handling fixes (Ashwin), XPath out of memory handling fixes (Alvaro Herrera), various realloc problems (Ashwin), UCS4 encoding conversion buffer size (Christian Fruth), problems with EatName functions on memory errors, BOM handling in external parsed entities (Mark Rowe)
    • Code cleanup: fix build under VS 2008 (David Wimsey), remove useless mutex in xmlDict (Florent Guilian), Mingw32 compilation fix (Carlo Bramini), Win and MacOS EOL cleanups (Florent Guiliani), iconv need a const detection (Roumen Petrov), simplify xmlSetProp (Julien Charbon), cross compilation fixes for Mingw (Roumen Petrov), SCO Openserver build fix (Florent Guiliani), iconv uses const on Win32 (Rob Richards), duplicate code removal (Ashwin), missing malloc test and error reports (Ashwin), VMS makefile fix (Tycho Hilhorst)
    • improvements: better plug of schematron in the normal error handling (Tobias Minich)

    2.6.31: Jan 11 2008

    • Security fix: missing of checks in UTF-8 parsing
    • Bug fixes: regexp bug, dump attribute from XHTML document, fix xmlFree(NULL) to not crash in debug mode, Schematron parsing crash (Rob Richards), global lock free on Windows (Marc-Antoine Ruel), XSD crash due to double free (Rob Richards), indentation fix in xmlTextWriterFullEndElement (Felipe Pena), error in attribute type parsing if attribute redeclared, avoid crash in hash list scanner if deleting elements, column counter bug fix (Christian Schmidt), HTML embed element saving fix (Stefan Behnel), avoid -L/usr/lib output from xml2-config (Fred Crozat), avoid an xmllint crash (Stefan Kost), don't stop HTML parsing on out of range chars.
    • Code cleanup: fix open() call third argument, regexp cut'n paste copy error, unused variable in __xmlGlobalInitMutexLock (Hannes Eder), some make distcheck realted fixes (John Carr)
    • Improvements: HTTP Header: includes port number (William Brack), testURI --debug option,

    2.6.30: Aug 23 2007

    • Portability: Solaris crash on error handling, windows path fixes (Roland Schwarz and Rob Richards), mingw build (Roland Schwarz)
    • Bugfixes: xmlXPathNodeSetSort problem (William Brack), leak when reusing a writer for a new document (Dodji Seketeli), Schemas xsi:nil handling patch (Frank Gross), relative URI build problem (Patrik Fimml), crash in xmlDocFormatDump, invalid char in comment detection bug, fix disparity with xmlSAXUserParseMemory, automata generation for complex regexp counts problems, Schemas IDC import problems (Frank Gross), xpath predicate evailation error handling (William Brack)

    2.6.29: Jun 12 2007

    • Portability: patches from Andreas Stricke for WinCEi, fix compilation warnings (William Brack), avoid warnings on Apple OS/X (Wendy Doyle and Mark Rowe), Windows compilation and threading improvements (Rob Richards), compilation against old Python versions, new GNU tar changes (Ryan Hill)
    • Documentation: xmlURIUnescapeString comment,
    • Bugfixes: xmlBufferAdd problem (Richard Jones), 'make valgrind' flag fix (Richard Jones), regexp interpretation of \, htmlCreateDocParserCtxt (Jean-Daniel Dupas), configure.in typo (Bjorn Reese), entity content failure, xmlListAppend() fix (Georges-André Silber), XPath number serialization (William Brack), nanohttp gzipped stream fix (William Brack and Alex Cornejo), xmlCharEncFirstLine typo (Mark Rowe), uri bug (François Delyon), XPath string value of PI nodes (William Brack), XPath node set sorting bugs (William Brack), avoid outputting namespace decl dups in the writer (Rob Richards), xmlCtxtReset bug, UTF-8 encoding error handling, recustion on next in catalogs, fix a Relax-NG crash, workaround wrong file: URIs, htmlNodeDumpFormatOutput on attributes, invalid character in attribute detection bug, big comments before internal subset streaming bug, HTML parsing of attributes with : in the name, IDness of name in HTML (Dagfinn I. MannsÃ¥ker)
    • Improvement: keep URI query parts in raw form (Richard Jones), embed tag support in HTML (Michael Day)

    2.6.28: Apr 17 2007

    • Documentation: comment fixes (Markus Keim), xpath comments fixes too (James Dennett)
    • Bug fixes: XPath bug (William Brack), HTML parser autoclose stack usage (Usamah Malik), various regexp bug fixes (DV and William), path conversion on Windows (Igor Zlatkovic), htmlCtxtReset fix (Michael Day), XPath principal node of axis bug, HTML serialization of some codepoint (Steven Rainwater), user data propagation in XInclude (Michael Day), standalone and XML decl detection (Michael Day), Python id ouptut for some id, fix the big python string memory leak, URI parsing fixes (Stéphane Bidoul and William), long comments parsing bug (William), concurrent threads initialization (Ted Phelps), invalid char in text XInclude (William), XPath memory leak (William), tab in python problems (Andreas Hanke), XPath node comparison error (Oleg Paraschenko), cleanup patch for reader (Julien Reichel), XML Schemas attribute group (William), HTML parsing problem (William), fix char 0x2d in regexps (William), regexp quantifier range with min occurs of 0 (William), HTML script/style parsing (Mike Day)
    • Improvement: make xmlTextReaderSetup() public
    • Compilation and postability: fix a missing include problem (William), __ss_familly on AIX again (Björn Wiberg), compilation without zlib (Michael Day), catalog patch for Win32 (Christian Ehrlicher), Windows CE fixes (Andreas Stricke)
    • Various CVS to SVN infrastructure changes

    2.6.27: Oct 25 2006

    • Portability fixes: file names on windows (Roland Schwingel, Emelyanov Alexey), windows compile fixup (Rob Richards), AIX iconv() is apparently case sensitive
    • improvements: Python XPath types mapping (Nic Ferrier), XPath optimization (Kasimier), add xmlXPathCompiledEvalToBoolean (Kasimier), Python node equality and comparison (Andreas Pakulat), xmlXPathCollectAndTest improvememt (Kasimier), expose if library was compiled with zlib support (Andrew Nosenko), cache for xmlSchemaIDCMatcher structs (Kasimier), xmlTextConcat should work with comments and PIs (Rob Richards), export htmlNewParserCtxt needed by Michael Day, refactoring of catalog entity loaders (Michael Day), add XPointer support to python bindings (Ross Reedstrom, Brian West and Stefan Anca), try to sort out most file path to URI conversions and xmlPathToUri, add --html --memory case to xmllint
    • building fix: fix --with-minimum (Felipe Contreras), VMS fix, const'ification of HTML parser structures (Matthias Clasen), portability fix (Emelyanov Alexey), wget autodetection (Peter Breitenlohner), remove the build path recorded in the python shared module, separate library flags for shared and static builds (Mikhail Zabaluev), fix --with-minimum --with-sax1 builds, fix --with-minimum --with-schemas builds
    • bug fix: xmlGetNodePath fix (Kasimier), xmlDOMWrapAdoptNode and attribute (Kasimier), crash when using the recover mode, xmlXPathEvalExpr problem (Kasimier), xmlXPathCompExprAdd bug (Kasimier), missing destry in xmlFreeRMutex (Andrew Nosenko), XML Schemas fixes (Kasimier), warning on entities processing, XHTML script and style serialization (Kasimier), python generator for long types, bug in xmlSchemaClearValidCtxt (Bertrand Fritsch), xmlSchemaXPathEvaluate allocation bug (Marton Illes), error message end of line (Rob Richards), fix attribute serialization in writer (Rob Richards), PHP4 DTD validation crasher, parser safety patch (Ben Darnell), _private context propagation when parsing entities (with Michael Day), fix entities behaviour when using SAX, URI to file path fix (Mikhail Zabaluev), disapearing validity context, arg error in SAX callback (Mike Hommey), fix mixed-content autodetect when using --noblanks, fix xmlIOParseDTD error handling, fix bug in xmlSplitQName on special Names, fix Relax-NG element content validation bug, fix xmlReconciliateNs bug, fix potential attribute XML parsing bug, fix line/column accounting in XML parser, chunking bug in the HTML parser on script, try to detect obviously buggy HTML meta encoding indications, bugs with encoding BOM and xmlSaveDoc, HTML entities in attributes parsing, HTML minimized attribute values, htmlReadDoc and htmlReadIO were broken, error handling bug in xmlXPathEvalExpression (Olaf Walkowiak), fix a problem in htmlCtxtUseOptions, xmlNewInputFromFile could leak (Marius Konitzer), bug on misformed SSD regexps (Christopher Boumenot)
    • documentation: warning about XML_PARSE_COMPACT (Kasimier Buchcik), fix xmlXPathCastToString documentation, improve man pages for xmllitn and xmlcatalog (Daniel Leidert), fixed comments of a few functions

    2.6.26: Jun 6 2006

    • portability fixes: Python detection (Joseph Sacco), compilation error(William Brack and Graham Bennett), LynxOS patch (Olli Savia)
    • bug fixes: encoding buffer problem, mix of code and data in xmlIO.c(Kjartan Maraas), entities in XSD validation (Kasimier Buchcik), variousXSD validation fixes (Kasimier), memory leak in pattern (Rob Richards andKasimier), attribute with colon in name (Rob Richards), XPath leak inerror reporting (Aleksey Sanin), XInclude text include of selfdocument.
    • improvements: Xpath optimizations (Kasimier), XPath object cache(Kasimier)

    2.6.25: Jun 6 2006:

    Do not use or package 2.6.25

    2.6.24: Apr 28 2006

    • Portability fixes: configure on Windows, testapi compile on windows (Kasimier Buchcik, venkat naidu), Borland C++ 6 compile (Eric Zurcher), HP-UX compiler workaround (Rick Jones), xml2-config bugfix, gcc-4.1 cleanups, Python detection scheme (Joseph Sacco), UTF-8 file paths on Windows (Roland Schwingel).
    • Improvements: xmlDOMWrapReconcileNamespaces xmlDOMWrapCloneNode (Kasimier Buchcik), XML catalog debugging (Rick Jones), update to Unicode 4.01.
    • Bug fixes: xmlParseChunk() problem in 2.6.23, xmlParseInNodeContext() on HTML docs, URI behaviour on Windows (Rob Richards), comment streaming bug, xmlParseComment (with William Brack), regexp bug fixes (DV & Youri Golovanov), xmlGetNodePath on text/CDATA (Kasimier), one Relax-NG interleave bug, xmllint --path and --valid, XSD bugfixes (Kasimier), remove debug left in Python bindings (Nic Ferrier), xmlCatalogAdd bug (Martin Cole), xmlSetProp fixes (Rob Richards), HTML IDness (Rob Richards), a large number of cleanups and small fixes based on Coverity reports, bug in character ranges, Unicode tables const (Aivars Kalvans), schemas fix (Stefan Kost), xmlRelaxNGParse error deallocation, xmlSchemaAddSchemaDoc error deallocation, error handling on unallowed code point, ixmllint --nonet to never reach the net (Gary Coady), line break in writer after end PI (Jason Viers).
    • Documentation: man pages updates and cleanups (Daniel Leidert).
    • New features: Relax NG structure error handlers.

    2.6.23: Jan 5 2006

    • portability fixes: Windows (Rob Richards), getaddrinfo on Windows (Kolja Nowak, Rob Richards), icc warnings (Kjartan Maraas), --with-minimum compilation fixes (William Brack), error case handling fix on Solaris (Albert Chin), don't use 'list' as parameter name reported by Samuel Diaz Garcia, more old Unices portability fixes (Albert Chin), MinGW compilation (Mark Junker), HP-UX compiler warnings (Rick Jones),
    • code cleanup: xmlReportError (Adrian Mouat), remove xmlBufferClose (Geert Jansen), unreachable code (Oleksandr Kononenko), refactoring parsing code (Bjorn Reese)
    • bug fixes: xmlBuildRelativeURI and empty path (William Brack), combinatory explosion and performances in regexp code, leak in xmlTextReaderReadString(), xmlStringLenDecodeEntities problem (Massimo Morara), Identity Constraints bugs and a segfault (Kasimier Buchcik), XPath pattern based evaluation bugs (DV & Kasimier), xmlSchemaContentModelDump() memory leak (Kasimier), potential leak in xmlSchemaCheckCSelectorXPath(), xmlTextWriterVSprintf() misuse of vsnprintf (William Brack), XHTML serialization fix (Rob Richards), CRLF split problem (William), issues with non-namespaced attributes in xmlAddChild() xmlAddNextSibling() and xmlAddPrevSibling() (Rob Richards), HTML parsing of script, Python must not output to stdout (Nic Ferrier), exclusive C14N namespace visibility (Aleksey Sanin), XSD dataype totalDigits bug (Kasimier Buchcik), error handling when writing to an xmlBuffer (Rob Richards), runtest schemas error not reported (Hisashi Fujinaka), signed/unsigned problem in date/time code (Albert Chin), fix XSI driven XSD validation (Kasimier), parsing of xs:decimal (Kasimier), fix DTD writer output (Rob Richards), leak in xmlTextReaderReadInnerXml (Gary Coady), regexp bug affecting schemas (Kasimier), configuration of runtime debugging (Kasimier), xmlNodeBufGetContent bug on entity refs (Oleksandr Kononenko), xmlRegExecPushString2 bug (Sreeni Nair), compilation and build fixes (Michael Day), removed dependancies on xmlSchemaValidError (Kasimier), bug with <xml:foo/>, more XPath pattern based evaluation fixes (Kasimier)
    • improvements: XSD Schemas redefinitions/restrictions (Kasimier Buchcik), node copy checks and fix for attribute (Rob Richards), counted transition bug in regexps, ctxt->standalone = -2 to indicate no standalone attribute was found, add xmlSchemaSetParserStructuredErrors() (Kasimier Buchcik), add xmlTextReaderSchemaValidateCtxt() to API (Kasimier), handle gzipped HTTP resources (Gary Coady), add htmlDocDumpMemoryFormat. (Rob Richards),
    • documentation: typo (Michael Day), libxml man page (Albert Chin), save function to XML buffer (Geert Jansen), small doc fix (Aron Stansvik),

    2.6.22: Sep 12 2005

    • build fixes: compile without schematron (Stéphane Bidoul)
    • bug fixes: xmlDebugDumpNode on namespace node (Oleg Paraschenko)i, CDATA push parser bug, xmlElemDump problem with XHTML1 doc, XML_FEATURE_xxx clash with expat headers renamed XML_WITH_xxx, fix some output formatting for meta element (Rob Richards), script and style XHTML1 serialization (David Madore), Attribute derivation fixups in XSD (Kasimier Buchcik), better IDC error reports (Kasimier Buchcik)
    • improvements: add XML_SAVE_NO_EMPTY xmlSaveOption (Rob Richards), add XML_SAVE_NO_XHTML xmlSaveOption, XML Schemas improvements preparing for derive (Kasimier Buchcik).
    • documentation: generation of gtk-doc like docs, integration with devhelp.

    2.6.21: Sep 4 2005

    • build fixes: Cygwin portability fixes (Gerrit P. Haase), calling convention problems on Windows (Marcus Boerger), cleanups based on Linus' sparse tool, update of win32/configure.js (Rob Richards), remove warnings on Windows(Marcus Boerger), compilation without SAX1, detection of the Python binary, use $GCC inestad of $CC = 'gcc' (Andrew W. Nosenko), compilation/link with threads and old gcc, compile problem by C370 on Z/OS,
    • bug fixes: http_proxy environments (Peter Breitenlohner), HTML UTF-8 bug (Jiri Netolicky), XPath NaN compare bug (William Brack), htmlParseScript potential bug, Schemas regexp handling of spaces, Base64 Schemas comparisons NIST passes, automata build error xsd:all, xmlGetNodePath for namespaced attributes (Alexander Pohoyda), xmlSchemas foreign namespaces handling, XML Schemas facet comparison (Kupriyanov Anatolij), xmlSchemaPSimpleTypeErr error report (Kasimier Buchcik), xml: namespace ahndling in Schemas (Kasimier), empty model group in Schemas (Kasimier), wilcard in Schemas (Kasimier), URI composition (William), xs:anyType in Schemas (Kasimier), Python resolver emmitting error messages directly, Python xmlAttr.parent (Jakub Piotr Clapa), trying to fix the file path/URI conversion, xmlTextReaderGetAttribute fix (Rob Richards), xmlSchemaFreeAnnot memleak (Kasimier), HTML UTF-8 serialization, streaming XPath, Schemas determinism detection problem, XInclude bug, Schemas context type (Dean Hill), validation fix (Derek Poon), xmlTextReaderGetAttribute[Ns] namespaces (Rob Richards), Schemas type fix (Kuba Nowakowski), UTF-8 parser bug, error in encoding handling, xmlGetLineNo fixes, bug on entities handling, entity name extraction in error handling with XInclude, text nodes in HTML body tags (Gary Coady), xml:id and IDness at the treee level fixes, XPath streaming patterns bugs.
    • improvements: structured interfaces for schemas and RNG error reports (Marcus Boerger), optimization of the char data inner loop parsing (thanks to Behdad Esfahbod for the idea), schematron validation though not finished yet, xmlSaveOption to omit XML declaration, keyref match error reports (Kasimier), formal expression handling code not plugged yet, more lax mode for the HTML parser, parser XML_PARSE_COMPACT option for text nodes allocation.
    • documentation: xmllint man page had --nonet duplicated

    2.6.20: Jul 10 2005

    • build fixes: Windows build (Rob Richards), Mingw compilation (Igor Zlatkovic), Windows Makefile (Igor), gcc warnings (Kasimier and andriy@google.com), use gcc weak references to pthread to avoid the pthread dependancy on Linux, compilation problem (Steve Nairn), compiling of subset (Morten Welinder), IPv6/ss_family compilation (William Brack), compilation when disabling parts of the library, standalone test distribution.
    • bug fixes: bug in lang(), memory cleanup on errors (William Brack), HTTP query strings (Aron Stansvik), memory leak in DTD (William), integer overflow in XPath (William), nanoftp buffer size, pattern "." apth fixup (Kasimier), leak in tree reported by Malcolm Rowe, replaceNode patch (Brent Hendricks), CDATA with NULL content (Mark Vakoc), xml:base fixup on XInclude (William), pattern fixes (William), attribute bug in exclusive c14n (Aleksey Sanin), xml:space and xml:lang with SAX2 (Rob Richards), namespace trouble in complex parsing (Malcolm Rowe), XSD type QNames fixes (Kasimier), XPath streaming fixups (William), RelaxNG bug (Rob Richards), Schemas for Schemas fixes (Kasimier), removal of ID (Rob Richards), a small RelaxNG leak, HTML parsing in push mode bug (James Bursa), failure to detect UTF-8 parsing bugs in CDATA sections, areBlanks() heuristic failure, duplicate attributes in DTD bug (William).
    • improvements: lot of work on Schemas by Kasimier Buchcik both on conformance and streaming, Schemas validation messages (Kasimier Buchcik, Matthew Burgess), namespace removal at the python level (Brent Hendricks), Update to new Schemas regression tests from W3C/Nist (Kasimier), xmlSchemaValidateFile() (Kasimier), implementation of xmlTextReaderReadInnerXml and xmlTextReaderReadOuterXml (James Wert), standalone test framework and programs, new DOM import APIs xmlDOMWrapReconcileNamespaces() xmlDOMWrapAdoptNode() and xmlDOMWrapRemoveNode(), extension of xmllint capabilities for SAX and Schemas regression tests, xmlStopParser() available in pull mode too, ienhancement to xmllint --shell namespaces support, Windows port of the standalone testing tools (Kasimier and William), xmlSchemaValidateStream() xmlSchemaSAXPlug() and xmlSchemaSAXUnplug() SAX Schemas APIs, Schemas xmlReader support.

    2.6.19: Apr 02 2005

    • build fixes: drop .la from RPMs, --with-minimum build fix (William Brack), use XML_SOCKLEN_T instead of SOCKLEN_T because it breaks with AIX 5.3 compiler, fixed elfgcchack.h generation and PLT reduction code on Linux/ELF/gcc4
    • bug fixes: schemas type decimal fixups (William Brack), xmmlint return code (Gerry Murphy), small schemas fixes (Matthew Burgess and GUY Fabrice), workaround "DAV:" namespace brokeness in c14n (Aleksey Sanin), segfault in Schemas (Kasimier Buchcik), Schemas attribute validation (Kasimier), Prop related functions and xmlNewNodeEatName (Rob Richards), HTML serialization of name attribute on a elements, Python error handlers leaks and improvement (Brent Hendricks), uninitialized variable in encoding code, Relax-NG validation bug, potential crash if gnorableWhitespace is NULL, xmlSAXParseDoc and xmlParseDoc signatures, switched back to assuming UTF-8 in case no encoding is given at serialization time
    • improvements: lot of work on Schemas by Kasimier Buchcik on facets checking and also mixed handling.

    2.6.18: Mar 13 2005

    • build fixes: warnings (Peter Breitenlohner), testapi.c generation, Bakefile support (Francesco Montorsi), Windows compilation (Joel Reed), some gcc4 fixes, HP-UX portability fixes (Rick Jones).
    • bug fixes: xmlSchemaElementDump namespace (Kasimier Buchcik), push and xmlreader stopping on non-fatal errors, thread support for dictionnaries reference counting (Gary Coady), internal subset and push problem, URL saved in xmlCopyDoc, various schemas bug fixes (Kasimier), Python paths fixup (Stephane Bidoul), xmlGetNodePath and namespaces, xmlSetNsProp fix (Mike Hommey), warning should not count as error (William Brack), xmlCreatePushParser empty chunk, XInclude parser flags (William), cleanup FTP and HTTP code to reuse the uri parsing and IPv6 (William), xmlTextWriterStartAttributeNS fix (Rob Richards), XMLLINT_INDENT being empty (William), xmlWriter bugs (Rob Richards), multithreading on Windows (Rich Salz), xmlSearchNsByHref fix (Kasimier), Python binding leak (Brent Hendricks), aliasing bug exposed by gcc4 on s390, xmlTextReaderNext bug (Rob Richards), Schemas decimal type fixes (William Brack), xmlByteConsumed static buffer (Ben Maurer).
    • improvement: speedup parsing comments and DTDs, dictionnary support for hash tables, Schemas Identity constraints (Kasimier), streaming XPath subset, xmlTextReaderReadString added (Bjorn Reese), Schemas canonical values handling (Kasimier), add xmlTextReaderByteConsumed (Aron Stansvik),
    • Documentation: Wiki support (Joel Reed)

    2.6.17: Jan 16 2005

    • build fixes: Windows, warnings removal (William Brack), maintainer-clean dependency(William), build in a different directory (William), fixing --with-minimum configure build (William), BeOS build (Marcin Konicki), Python-2.4 detection (William), compilation on AIX (Dan McNichol)
    • bug fixes: xmlTextReaderHasAttributes (Rob Richards), xmlCtxtReadFile() to use the catalog(s), loop on output (William Brack), XPath memory leak, ID deallocation problem (Steve Shepard), debugDumpNode crash (William), warning not using error callback (William), xmlStopParser bug (William), UTF-16 with BOM on DTDs (William), namespace bug on empty elements in push mode (Rob Richards), line and col computations fixups (Aleksey Sanin), xmlURIEscape fix (William), xmlXPathErr on bad range (William), patterns with too many steps, bug in RNG choice optimization, line number sometimes missing.
    • improvements: XSD Schemas (Kasimier Buchcik), python generator (William), xmlUTF8Strpos speedup (William), unicode Python strings (William), XSD error reports (Kasimier Buchcik), Python __str__ call serialize().
    • new APIs: added xmlDictExists(), GetLineNumber and GetColumnNumber for the xmlReader (Aleksey Sanin), Dynamic Shared Libraries APIs (mostly Joel Reed), error extraction API from regexps, new XMLSave option for format (Phil Shafer)
    • documentation: site improvement (John Fleck), FAQ entries (William).

    2.6.16: Nov 10 2004

    • general hardening and bug fixing crossing all the API based on new automated regression testing
    • build fix: IPv6 build and test on AIX (Dodji Seketeli)
    • bug fixes: problem with XML::Libxml reported by Petr Pajas, encoding conversion functions return values, UTF-8 bug affecting XPath reported by Markus Bertheau, catalog problem with NULL entries (William Brack)
    • documentation: fix to xmllint man page, some API function descritpion were updated.
    • improvements: DTD validation APIs provided at the Python level (Brent Hendricks)

    2.6.15: Oct 27 2004

    • security fixes on the nanoftp and nanohttp modules
    • build fixes: xmllint detection bug in configure, building outside the source tree (Thomas Fitzsimmons)
    • bug fixes: HTML parser on broken ASCII chars in names (William), Python paths (Malcolm Tredinnick), xmlHasNsProp and default namespace (William), saving to python file objects (Malcolm Tredinnick), DTD lookup fix (Malcolm), save back <group> in catalogs (William), tree build fixes (DV and Rob Richards), Schemas memory bug, structured error handler on Python 64bits, thread local memory deallocation, memory leak reported by Volker Roth, xmlValidateDtd in the presence of an internal subset, entities and _private problem (William), xmlBuildRelativeURI error (William).
    • improvements: better XInclude error reports (William), tree debugging module and tests, convenience functions at the Reader API (Graham Bennett), add support for PI in the HTML parser.

    2.6.14: Sep 29 2004

    • build fixes: configure paths for xmllint and xsltproc, compilation without HTML parser, compilation warning cleanups (William Brack & Malcolm Tredinnick), VMS makefile update (Craig Berry),
    • bug fixes: xmlGetUTF8Char (William Brack), QName properties (Kasimier Buchcik), XInclude testing, Notation serialization, UTF8ToISO8859x transcoding (Mark Itzcovitz), lots of XML Schemas cleanup and fixes (Kasimier), ChangeLog cleanup (Stepan Kasal), memory fixes (Mark Vakoc), handling of failed realloc(), out of bound array adressing in Schemas date handling, Python space/tabs cleanups (Malcolm Tredinnick), NMTOKENS E20 validation fix (Malcolm),
    • improvements: added W3C XML Schemas testsuite (Kasimier Buchcik), add xmlSchemaValidateOneElement (Kasimier), Python exception hierearchy (Malcolm Tredinnick), Python libxml2 driver improvement (Malcolm Tredinnick), Schemas support for xsi:schemaLocation, xsi:noNamespaceSchemaLocation, xsi:type (Kasimier Buchcik)

    2.6.13: Aug 31 2004

    • build fixes: Windows and zlib (Igor Zlatkovic), -O flag with gcc, Solaris compiler warning, fixing RPM BuildRequires,
    • fixes: DTD loading on Windows (Igor), Schemas error reports APIs (Kasimier Buchcik), Schemas validation crash, xmlCheckUTF8 (William Brack and Julius Mittenzwei), Schemas facet check (Kasimier), default namespace problem (William), Schemas hexbinary empty values, encoding error could genrate a serialization loop.
    • Improvements: Schemas validity improvements (Kasimier), added --path and --load-trace options to xmllint
    • documentation: tutorial update (John Fleck)

    2.6.12: Aug 22 2004

    • build fixes: fix --with-minimum, elfgcchack.h fixes (Peter Breitenlohner), perl path lookup (William), diff on Solaris (Albert Chin), some 64bits cleanups.
    • Python: avoid a warning with 2.3 (William Brack), tab and space mixes (William), wrapper generator fixes (William), Cygwin support (Gerrit P. Haase), node wrapper fix (Marc-Antoine Parent), XML Schemas support (Torkel Lyng)
    • Schemas: a lot of bug fixes and improvements from Kasimier Buchcik
    • fixes: RVT fixes (William), XPath context resets bug (William), memory debug (Steve Hay), catalog white space handling (Peter Breitenlohner), xmlReader state after attribute reading (William), structured error handler (William), XInclude generated xml:base fixup (William), Windows memory reallocation problem (Steve Hay), Out of Memory conditions handling (William and Olivier Andrieu), htmlNewDoc() charset bug, htmlReadMemory init (William), a posteriori validation DTD base (William), notations serialization missing, xmlGetNodePath (Dodji), xmlCheckUTF8 (Diego Tartara), missing line numbers on entity (William)
    • improvements: DocBook catalog build scrip (William), xmlcatalog tool (Albert Chin), xmllint --c14n option, no_proxy environment (Mike Hommey), xmlParseInNodeContext() addition, extend xmllint --shell, allow XInclude to not generate start/end nodes, extend xmllint --version to include CVS tag (William)
    • documentation: web pages fixes, validity API docs fixes (William) schemas API fix (Eric Haszlakiewicz), xmllint man page (John Fleck)

    2.6.11: July 5 2004

    • Schemas: a lot of changes and improvements by Kasimier Buchcik for attributes, namespaces and simple types.
    • build fixes: --with-minimum (William Brack), some gcc cleanup (William), --with-thread-alloc (William)
    • portability: Windows binary package change (Igor Zlatkovic), Catalog path on Windows
    • documentation: update to the tutorial (John Fleck), xmllint return code (John Fleck), man pages (Ville Skytta),
    • bug fixes: C14N bug serializing namespaces (Aleksey Sanin), testSAX properly initialize the library (William), empty node set in XPath (William), xmlSchemas errors (William), invalid charref problem pointed by Morus Walter, XInclude xml:base generation (William), Relax-NG bug with div processing (William), XPointer and xml:base problem(William), Reader and entities, xmllint return code for schemas (William), reader streaming problem (Steve Ball), DTD serialization problem (William), libxml.m4 fixes (Mike Hommey), do not provide destructors as methods on Python classes, xmlReader buffer bug, Python bindings memory interfaces improvement (with Stéphane Bidoul), Fixed the push parser to be back to synchronous behaviour.
    • improvement: custom per-thread I/O enhancement (Rob Richards), register namespace in debug shell (Stefano Debenedetti), Python based regression test for non-Unix users (William), dynamically increase the number of XPath extension functions in Python and fix a memory leak (Marc-Antoine Parent and William)
    • performance: hack done with Arjan van de Ven to reduce ELF footprint and generated code on Linux, plus use gcc runtime profiling to optimize the code generated in the RPM packages.

    2.6.10: May 17 2004

    • Web page generated for ChangeLog
    • build fixes: --without-html problems, make check without make all
    • portability: problem with xpath.c on Windows (MSC and Borland), memcmp vs. strncmp on Solaris, XPath tests on Windows (Mark Vakoc), C++ do not use "list" as parameter name, make tests work with Python 1.5 (Ed Davis),
    • improvements: made xmlTextReaderMode public, small buffers resizing (Morten Welinder), add --maxmem option to xmllint, add xmlPopInputCallback() for Matt Sergeant, refactoring of serialization escaping, added escaping customization
    • bugfixes: xsd:extension (Taihei Goi), assorted regexp bugs (William Brack), xmlReader end of stream problem, node deregistration with reader, URI escaping and filemanes, XHTML1 formatting (Nick Wellnhofer), regexp transition reduction (William), various XSD Schemas fixes (Kasimier Buchcik), XInclude fallback problem (William), weird problems with DTD (William), structured error handler callback context (William), reverse xmlEncodeSpecialChars() behaviour back to escaping '"'

    2.6.9: Apr 18 2004

    • implement xml:id Working Draft, relaxed XPath id() checking
    • bugfixes: xmlCtxtReset (Brent Hendricks), line number and CDATA (Dave Beckett), Relax-NG compilation (William Brack), Regexp patches (with William), xmlUriEscape (Mark Vakoc), a Relax-NG notAllowed problem (with William), Relax-NG name classes compares (William), XInclude duplicate fallback (William), external DTD encoding detection (William), a DTD validation bug (William), xmlReader Close() fix, recusive extention schemas
    • improvements: use xmlRead* APIs in test tools (Mark Vakoc), indenting save optimization, better handle IIS broken HTTP redirect behaviour (Ian Hummel), HTML parser frameset (James Bursa), libxml2-python RPM dependancy, XML Schemas union support (Kasimier Buchcik), warning removal clanup (William), keep ChangeLog compressed when installing from RPMs
    • documentation: examples and xmlDocDumpMemory docs (John Fleck), new example (load, xpath, modify, save), xmlCatalogDump() comments,
    • Windows: Borland C++ builder (Eric Zurcher), work around Microsoft compiler NaN handling bug (Mark Vakoc)

    2.6.8: Mar 23 2004

    • First step of the cleanup of the serialization code and APIs
    • XML Schemas: mixed content (Adam Dickmeiss), QName handling fixes (Adam Dickmeiss), anyURI for "" (John Belmonte)
    • Python: Canonicalization C14N support added (Anthony Carrico)
    • xmlDocCopyNode() extension (William)
    • Relax-NG: fix when processing XInclude results (William), external reference in interleave (William), missing error on <choice> failure (William), memory leak in schemas datatype facets.
    • xmlWriter: patch for better DTD support (Alfred Mickautsch)
    • bug fixes: xmlXPathLangFunction memory leak (Mike Hommey and William Brack), no ID errors if using HTML_PARSE_NOERROR, xmlcatalog fallbacks to URI on SYSTEM lookup failure, XInclude parse flags inheritance (William), XInclude and XPointer fixes for entities (William), XML parser bug reported by Holger Rauch, nanohttp fd leak (William), regexps char groups '-' handling (William), dictionnary reference counting problems, do not close stderr.
    • performance patches from Petr Pajas
    • Documentation fixes: XML_CATALOG_FILES in man pages (Mike Hommey)
    • compilation and portability fixes: --without-valid, catalog cleanups (Peter Breitenlohner), MingW patch (Roland Schwingel), cross-compilation to Windows (Christophe de Vienne), --with-html-dir fixup (Julio Merino Vidal), Windows build (Eric Zurcher)

    2.6.7: Feb 23 2004

    • documentation: tutorial updates (John Fleck), benchmark results
    • xmlWriter: updates and fixes (Alfred Mickautsch, Lucas Brasilino)
    • XPath optimization (Petr Pajas)
    • DTD ID handling optimization
    • bugfixes: xpath number with > 19 fractional (William Brack), push mode with unescaped '>' characters, fix xmllint --stream --timing, fix xmllint --memory --stream memory usage, xmlAttrSerializeTxtContent handling NULL, trying to fix Relax-NG/Perl interface.
    • python: 2.3 compatibility, whitespace fixes (Malcolm Tredinnick)
    • Added relaxng option to xmllint --shell

    2.6.6: Feb 12 2004

    • nanohttp and nanoftp: buffer overflow error on URI parsing (Igor and William) reported by Yuuichi Teranishi
    • bugfixes: make test and path issues, xmlWriter attribute serialization (William Brack), xmlWriter indentation (William), schemas validation (Eric Haszlakiewicz), XInclude dictionnaries issues (William and Oleg Paraschenko), XInclude empty fallback (William), HTML warnings (William), XPointer in XInclude (William), Python namespace serialization, isolat1ToUTF8 bound error (Alfred Mickautsch), output of parameter entities in internal subset (William), internal subset bug in push mode, <xs:all> fix (Alexey Sarytchev)
    • Build: fix for automake-1.8 (Alexander Winston), warnings removal (Philip Ludlam), SOCKLEN_T detection fixes (Daniel Richard), fix --with-minimum configuration.
    • XInclude: allow the 2001 namespace without warning.
    • Documentation: missing example/index.html (John Fleck), version dependancies (John Fleck)
    • reader API: structured error reporting (Steve Ball)
    • Windows compilation: mingw, msys (Mikhail Grushinskiy), function prototype (Cameron Johnson), MSVC6 compiler warnings, _WINSOCKAPI_ patch
    • Parsers: added xmlByteConsumed(ctxt) API to get the byte offest in input.

    2.6.5: Jan 25 2004

    • Bugfixes: dictionnaries for schemas (William Brack), regexp segfault (William), xs:all problem (William), a number of XPointer bugfixes (William), xmllint error go to stderr, DTD validation problem with namespace, memory leak (William), SAX1 cleanup and minimal options fixes (Mark Vadoc), parser context reset on error (Shaun McCance), XPath union evaluation problem (William) , xmlReallocLoc with NULL (Aleksey Sanin), XML Schemas double free (Steve Ball), XInclude with no href, argument callbacks order for XPath callbacks (Frederic Peters)
    • Documentation: python scripts (William Brack), xslt stylesheets (John Fleck), doc (Sven Zimmerman), I/O example.
    • Python bindings: fixes (William), enum support (Stéphane Bidoul), structured error reporting (Stéphane Bidoul)
    • XInclude: various fixes for conformance, problem related to dictionnary references (William & me), recursion (William)
    • xmlWriter: indentation (Lucas Brasilino), memory leaks (Alfred Mickautsch),
    • xmlSchemas: normalizedString datatype (John Belmonte)
    • code cleanup for strings functions (William)
    • Windows: compiler patches (Mark Vakoc)
    • Parser optimizations, a few new XPath and dictionnary APIs for future XSLT optimizations.

    2.6.4: Dec 24 2003

    • Windows build fixes (Igor Zlatkovic)
    • Some serious XInclude problems reported by Oleg Paraschenko and
    • Unix and Makefile packaging fixes (me, William Brack,
    • Documentation improvements (John Fleck, William Brack), example fix (Lucas Brasilino)
    • bugfixes: xmlTextReaderExpand() with xmlReaderWalker, XPath handling of NULL strings (William Brack) , API building reader or parser from filedescriptor should not close it, changed XPath sorting to be stable again (William Brack), xmlGetNodePath() generating '(null)' (William Brack), DTD validation and namespace bug (William Brack), XML Schemas double inclusion behaviour

    2.6.3: Dec 10 2003

    • documentation updates and cleanup (DV, William Brack, John Fleck)
    • added a repository of examples, examples from Aleksey Sanin, Dodji Seketeli, Alfred Mickautsch
    • Windows updates: Mark Vakoc, Igor Zlatkovic, Eric Zurcher, Mingw (Kenneth Haley)
    • Unicode range checking (William Brack)
    • code cleanup (William Brack)
    • Python bindings: doc (John Fleck), bug fixes
    • UTF-16 cleanup and BOM issues (William Brack)
    • bug fixes: ID and xmlReader validation, XPath (William Brack), xmlWriter (Alfred Mickautsch), hash.h inclusion problem, HTML parser (James Bursa), attribute defaulting and validation, some serialization cleanups, XML_GET_LINE macro, memory debug when using threads (William Brack), serialization of attributes and entities content, xmlWriter (Daniel Schulman)
    • XInclude bugfix, new APIs and update to the last version including the namespace change.
    • XML Schemas improvements: include (Robert Stepanek), import and namespace handling, fixed the regression tests troubles, added examples based on Eric van der Vlist book, regexp fixes
    • preliminary pattern support for streaming (needed for schemas constraints), added xmlTextReaderPreservePattern() to collect subdocument when streaming.
    • various fixes in the structured error handling

    2.6.2: Nov 4 2003

    • XPath context unregistration fixes
    • text node coalescing fixes (Mark Lilback)
    • API to screate a W3C Schemas from an existing document (Steve Ball)
    • BeOS patches (Marcin 'Shard' Konicki)
    • xmlStrVPrintf function added (Aleksey Sanin)
    • compilation fixes (Mark Vakoc)
    • stdin parsing fix (William Brack)
    • a posteriori DTD validation fixes
    • xmlReader bug fixes: Walker fixes, python bindings
    • fixed xmlStopParser() to really stop the parser and errors
    • always generate line numbers when using the new xmlReadxxx functions
    • added XInclude support to the xmlReader interface
    • implemented XML_PARSE_NONET parser option
    • DocBook XSLT processing bug fixed
    • HTML serialization for <p> elements (William Brack and me)
    • XPointer failure in XInclude are now handled as resource errors
    • fixed xmllint --html to use the HTML serializer on output (added --xmlout to implement the previous behaviour of saving it using the XML serializer)

    2.6.1: Oct 28 2003

    • Mostly bugfixes after the big 2.6.0 changes
    • Unix compilation patches: libxml.m4 (Patrick Welche), warnings cleanup (William Brack)
    • Windows compilation patches (Joachim Bauch, Stephane Bidoul, Igor Zlatkovic)
    • xmlWriter bugfix (Alfred Mickautsch)
    • chvalid.[ch]: couple of fixes from Stephane Bidoul
    • context reset: error state reset, push parser reset (Graham Bennett)
    • context reuse: generate errors if file is not readable
    • defaulted attributes for element coming from internal entities (Stephane Bidoul)
    • Python: tab and spaces mix (William Brack)
    • Error handler could crash in DTD validation in 2.6.0
    • xmlReader: do not use the document or element _private field
    • testSAX.c: avoid a problem with some PIs (Massimo Morara)
    • general bug fixes: mandatory encoding in text decl, serializing Document Fragment nodes, xmlSearchNs 2.6.0 problem (Kasimier Buchcik), XPath errors not reported, slow HTML parsing of large documents.

    2.6.0: Oct 20 2003

    • Major revision release: should be API and ABI compatible but got a lot of change
    • Increased the library modularity, far more options can be stripped out, a --with-minimum configuration will weight around 160KBytes
    • Use per parser and per document dictionnary, allocate names and small text nodes from the dictionnary
    • Switch to a SAX2 like parser rewrote most of the XML parser core, provides namespace resolution and defaulted attributes, minimize memory allocations and copies, namespace checking and specific error handling, immutable buffers, make predefined entities static structures, etc...
    • rewrote all the error handling in the library, all errors can be intercepted at a structured level, with precise information available.
    • New simpler and more generic XML and HTML parser APIs, allowing to easilly modify the parsing options and reuse parser context for multiple consecutive documents.
    • Similar new APIs for the xmlReader, for options and reuse, provided new functions to access content as const strings, use them for Python bindings
    • a lot of other smaller API improvements: xmlStrPrintf (Aleksey Sanin), Walker i.e. reader on a document tree based on Alfred Mickautsch code, make room in nodes for line numbers, reference counting and future PSVI extensions, generation of character ranges to be checked with faster algorithm (William), xmlParserMaxDepth (Crutcher Dunnavant), buffer access
    • New xmlWriter API provided by Alfred Mickautsch
    • Schemas: base64 support by Anthony Carrico
    • Parser<->HTTP integration fix, proper processing of the Mime-Type and charset information if available.
    • Relax-NG: bug fixes including the one reported by Martijn Faassen and zeroOrMore, better error reporting.
    • Python bindings (Stéphane Bidoul), never use stdout for errors output
    • Portability: all the headers have macros for export and calling convention definitions (Igor Zlatkovic), VMS update (Craig A. Berry), Windows: threads (Jesse Pelton), Borland compiler (Eric Zurcher, Igor), Mingw (Igor), typos (Mark Vakoc), beta version (Stephane Bidoul), warning cleanups on AIX and MIPS compilers (William Brack), BeOS (Marcin 'Shard' Konicki)
    • Documentation fixes and README (William Brack), search fix (William), tutorial updates (John Fleck), namespace docs (Stefan Kost)
    • Bug fixes: xmlCleanupParser (Dave Beckett), threading uninitialized mutexes, HTML doctype lowercase, SAX/IO (William), compression detection and restore (William), attribute declaration in DTDs (William), namespace on attribute in HTML output (William), input filename (Rob Richards), namespace DTD validation, xmlReplaceNode (Chris Ryland), I/O callbacks (Markus Keim), CDATA serialization (Shaun McCance), xmlReader (Peter Derr), high codepoint charref like &#x10FFFF;, buffer access in push mode (Justin Fletcher), TLS threads on Windows (Jesse Pelton), XPath bug (William), xmlCleanupParser (Marc Liyanage), CDATA output (William), HTTP error handling.
    • xmllint options: --dtdvalidfpi for Tobias Reif, --sax1 for compat testing, --nodict for building without tree dictionnary, --nocdata to replace CDATA by text, --nsclean to remove surperfluous namespace declarations
    • added xml2-config --libtool-libs option from Kevin P. Fleming
    • a lot of profiling and tuning of the code, speedup patch for xmlSearchNs() by Luca Padovani. The xmlReader should do far less allocation and it speed should get closer to SAX. Chris Anderson worked on speeding and cleaning up repetitive checking code.
    • cleanup of "make tests"
    • libxml-2.0-uninstalled.pc from Malcolm Tredinnick
    • deactivated the broken docBook SGML parser code and plugged the XML parser instead.

    2.5.11: Sep 9 2003

    A bugfix only release:

    • risk of crash in Relax-NG
    • risk of crash when using multithreaded programs

    2.5.10: Aug 15 2003

    A bugfixes only release

    • Windows Makefiles (William Brack)
    • UTF-16 support fixes (Mark Itzcovitz)
    • Makefile and portability (William Brack) automake, Linux alpha, Mingw on Windows (Mikhail Grushinskiy)
    • HTML parser (Oliver Stoeneberg)
    • XInclude performance problem reported by Kevin Ruscoe
    • XML parser performance problem reported by Grant Goodale
    • xmlSAXParseDTD() bug fix from Malcolm Tredinnick
    • and a couple other cleanup

    2.5.9: Aug 9 2003

    • bugfixes: IPv6 portability, xmlHasNsProp (Markus Keim), Windows build (Wiliam Brake, Jesse Pelton, Igor), Schemas (Peter Sobisch), threading (Rob Richards), hexBinary type (), UTF-16 BOM (Dodji Seketeli), xmlReader, Relax-NG schemas compilation, namespace handling, EXSLT (Sean Griffin), HTML parsing problem (William Brack), DTD validation for mixed content + namespaces, HTML serialization, library initialization, progressive HTML parser
    • better interfaces for Relax-NG error handling (Joachim Bauch, )
    • adding xmlXIncludeProcessTree() for XInclud'ing in a subtree
    • doc fixes and improvements (John Fleck)
    • configure flag for -with-fexceptions when embedding in C++
    • couple of new UTF-8 helper functions (William Brack)
    • general encoding cleanup + ISO-8859-x without iconv (Peter Jacobi)
    • xmlTextReader cleanup + enum for node types (Bjorn Reese)
    • general compilation/warning cleanup Solaris/HP-UX/... (William Brack)

    2.5.8: Jul 6 2003

    • bugfixes: XPath, XInclude, file/URI mapping, UTF-16 save (Mark Itzcovitz), UTF-8 checking, URI saving, error printing (William Brack), PI related memleak, compilation without schemas or without xpath (Joerg Schmitz-Linneweber/Garry Pennington), xmlUnlinkNode problem with DTDs, rpm problem on , i86_64, removed a few compilation problems from 2.5.7, xmlIOParseDTD, and xmlSAXParseDTD (Malcolm Tredinnick)
    • portability: DJGPP (MsDos) , OpenVMS (Craig A. Berry)
    • William Brack fixed multithreading lock problems
    • IPv6 patch for FTP and HTTP accesses (Archana Shah/Wipro)
    • Windows fixes (Igor Zlatkovic, Eric Zurcher), threading (Stéphane Bidoul)
    • A few W3C Schemas Structure improvements
    • W3C Schemas Datatype improvements (Charlie Bozeman)
    • Python bindings for thread globals (Stéphane Bidoul), and method/class generator
    • added --nonet option to xmllint
    • documentation improvements (John Fleck)

    2.5.7: Apr 25 2003

    • Relax-NG: Compiling to regexp and streaming validation on top of the xmlReader interface, added to xmllint --stream
    • xmlReader: Expand(), Next() and DOM access glue, bug fixes
    • Support for large files: RGN validated a 4.5GB instance
    • Thread support is now configured in by default
    • Fixes: update of the Trio code (Bjorn), WXS Date and Duration fixes (Charles Bozeman), DTD and namespaces (Brent Hendricks), HTML push parser and zero bytes handling, some missing Windows file path conversions, behaviour of the parser and validator in the presence of "out of memory" error conditions
    • extended the API to be able to plug a garbage collecting memory allocator, added xmlMallocAtomic() and modified the allocations accordingly.
    • Performances: removed excessive malloc() calls, speedup of the push and xmlReader interfaces, removed excessive thread locking
    • Documentation: man page (John Fleck), xmlReader documentation
    • Python: adding binding for xmlCatalogAddLocal (Brent M Hendricks)

    2.5.6: Apr 1 2003

    • Fixed W3C XML Schemas datatype, should be compliant now except for binHex and base64 which are not supported yet.
    • bug fixes: non-ASCII IDs, HTML output, XInclude on large docs and XInclude entities handling, encoding detection on external subsets, XML Schemas bugs and memory leaks, HTML parser (James Bursa)
    • portability: python/trio (Albert Chin), Sun compiler warnings
    • documentation: added --relaxng option to xmllint man page (John)
    • improved error reporting: xml:space, start/end tag mismatches, Relax NG errors

    2.5.5: Mar 24 2003

    • Lot of fixes on the Relax NG implementation. More testing including DocBook and TEI examples.
    • Increased the support for W3C XML Schemas datatype
    • Several bug fixes in the URI handling layer
    • Bug fixes: HTML parser, xmlReader, DTD validation, XPath, encoding conversion, line counting in the parser.
    • Added support for $XMLLINT_INDENT environment variable, FTP delete
    • Fixed the RPM spec file name

    2.5.4: Feb 20 2003

    • Conformance testing and lot of fixes on Relax NG and XInclude implementation
    • Implementation of XPointer element() scheme
    • Bug fixes: XML parser, XInclude entities merge, validity checking on namespaces,

      2 serialization bugs, node info generation problems, a DTD regexp generation problem.

    • Portability: windows updates and path canonicalization (Igor)
    • A few typo fixes (Kjartan Maraas)
    • Python bindings generator fixes (Stephane Bidoul)

    2.5.3: Feb 10 2003

    • RelaxNG and XML Schemas datatypes improvements, and added a first version of RelaxNG Python bindings
    • Fixes: XLink (Sean Chittenden), XInclude (Sean Chittenden), API fix for serializing namespace nodes, encoding conversion bug, XHTML1 serialization
    • Portability fixes: Windows (Igor), AMD 64bits RPM spec file

    2.5.2: Feb 5 2003

    • First implementation of RelaxNG, added --relaxng flag to xmllint
    • Schemas support now compiled in by default.
    • Bug fixes: DTD validation, namespace checking, XInclude and entities, delegateURI in XML Catalogs, HTML parser, XML reader (Stéphane Bidoul), XPath parser and evaluation, UTF8ToUTF8 serialization, XML reader memory consumption, HTML parser, HTML serialization in the presence of namespaces
    • added an HTML API to check elements and attributes.
    • Documentation improvement, PDF for the tutorial (John Fleck), doc patches (Stefan Kost)
    • Portability fixes: NetBSD (Julio Merino), Windows (Igor Zlatkovic)
    • Added python bindings for XPointer, contextual error reporting (Stéphane Bidoul)
    • URI/file escaping problems (Stefano Zacchiroli)

    2.5.1: Jan 8 2003

    • Fixes a memory leak and configuration/compilation problems in 2.5.0
    • documentation updates (John)
    • a couple of XmlTextReader fixes

    2.5.0: Jan 6 2003

    • New XmltextReader interface based on C# API (with help of Stéphane Bidoul)
    • Windows: more exports, including the new API (Igor)
    • XInclude fallback fix
    • Python: bindings for the new API, packaging (Stéphane Bidoul), drv_libxml2.py Python xml.sax driver (Stéphane Bidoul), fixes, speedup and iterators for Python-2.2 (Hannu Krosing)
    • Tutorial fixes (john Fleck and Niraj Tolia) xmllint man update (John)
    • Fix an XML parser bug raised by Vyacheslav Pindyura
    • Fix for VMS serialization (Nigel Hall) and config (Craig A. Berry)
    • Entities handling fixes
    • new API to optionally track node creation and deletion (Lukas Schroeder)
    • Added documentation for the XmltextReader interface and some XML guidelines

    2.4.30: Dec 12 2002

    • 2.4.29 broke the python bindings, rereleasing
    • Improvement/fixes of the XML API generator, and couple of minor code fixes.

    2.4.29: Dec 11 2002

    • Windows fixes (Igor): Windows CE port, pthread linking, python bindings (Stéphane Bidoul), Mingw (Magnus Henoch), and export list updates
    • Fix for prev in python bindings (ERDI Gergo)
    • Fix for entities handling (Marcus Clarke)
    • Refactored the XML and HTML dumps to a single code path, fixed XHTML1 dump
    • Fix for URI parsing when handling URNs with fragment identifiers
    • Fix for HTTP URL escaping problem
    • added an TextXmlReader (C#) like API (work in progress)
    • Rewrote the API in XML generation script, includes a C parser and saves more information needed for C# bindings

    2.4.28: Nov 22 2002

    • a couple of python binding fixes
    • 2 bug fixes in the XML push parser
    • potential memory leak removed (Martin Stoilov)
    • fix to the configure script for Unix (Dimitri Papadopoulos)
    • added encoding support for XInclude parse="text"
    • autodetection of XHTML1 and specific serialization rules added
    • nasty threading bug fixed (William Brack)

    2.4.27: Nov 17 2002

    • fixes for the Python bindings
    • a number of bug fixes: SGML catalogs, xmlParseBalancedChunkMemory(), HTML parser, Schemas (Charles Bozeman), document fragment support (Christian Glahn), xmlReconciliateNs (Brian Stafford), XPointer, xmlFreeNode(), xmlSAXParseMemory (Peter Jones), xmlGetNodePath (Petr Pajas), entities processing
    • added grep to xmllint --shell
    • VMS update patch from Craig A. Berry
    • cleanup of the Windows build with support for more compilers (Igor), better thread support on Windows
    • cleanup of Unix Makefiles and spec file
    • Improvements to the documentation (John Fleck)

    2.4.26: Oct 18 2002

    • Patches for Windows CE port, improvements on Windows paths handling
    • Fixes to the validation code (DTD and Schemas), xmlNodeGetPath() , HTML serialization, Namespace compliance, and a number of small problems

    2.4.25: Sep 26 2002

    • A number of bug fixes: XPath, validation, Python bindings, DOM and tree, xmlI/O, Html
    • Serious rewrite of XInclude
    • Made XML Schemas regexp part of the default build and APIs, small fix and improvement of the regexp core
    • Changed the validation code to reuse XML Schemas regexp APIs
    • Better handling of Windows file paths, improvement of Makefiles (Igor, Daniel Gehriger, Mark Vakoc)
    • Improved the python I/O bindings, the tests, added resolver and regexp APIs
    • New logos from Marc Liyanage
    • Tutorial improvements: John Fleck, Christopher Harris
    • Makefile: Fixes for AMD x86_64 (Mandrake), DESTDIR (Christophe Merlet)
    • removal of all stderr/perror use for error reporting
    • Better error reporting: XPath and DTD validation
    • update of the trio portability layer (Bjorn Reese)

    2.4.24: Aug 22 2002

    • XPath fixes (William), xf:escape-uri() (Wesley Terpstra)
    • Python binding fixes: makefiles (William), generator, rpm build, x86-64 (fcrozat)
    • HTML <style> and boolean attributes serializer fixes
    • C14N improvements by Aleksey
    • doc cleanups: Rick Jones
    • Windows compiler makefile updates: Igor and Elizabeth Barham
    • XInclude: implementation of fallback and xml:base fixup added

    2.4.23: July 6 2002

    • performances patches: Peter Jacobi
    • c14n fixes, testsuite and performances: Aleksey Sanin
    • added xmlDocFormatDump: Chema Celorio
    • new tutorial: John Fleck
    • new hash functions and performances: Sander Vesik, portability fix from Peter Jacobi
    • a number of bug fixes: XPath (William Brack, Richard Jinks), XML and HTML parsers, ID lookup function
    • removal of all remaining sprintf: Aleksey Sanin

    2.4.22: May 27 2002

    • a number of bug fixes: configure scripts, base handling, parser, memory usage, HTML parser, XPath, documentation (Christian Cornelssen), indentation, URI parsing
    • Optimizations for XMLSec, fixing and making public some of the network protocol handlers (Aleksey)
    • performance patch from Gary Pennington
    • Charles Bozeman provided date and time support for XML Schemas datatypes

    2.4.21: Apr 29 2002

    This release is both a bug fix release and also contains the early XML Schemas structures and datatypes code, beware, all interfaces are likely to change, there is huge holes, it is clearly a work in progress and don't even think of putting this code in a production system, it's actually not compiled in by default. The real fixes are:

    • a couple of bugs or limitations introduced in 2.4.20
    • patches for Borland C++ and MSC by Igor
    • some fixes on XPath strings and conformance patches by Richard Jinks
    • patch from Aleksey for the ExcC14N specification
    • OSF/1 bug fix by Bjorn

    2.4.20: Apr 15 2002

    • bug fixes: file descriptor leak, XPath, HTML output, DTD validation
    • XPath conformance testing by Richard Jinks
    • Portability fixes: Solaris, MPE/iX, Windows, OSF/1, python bindings, libxml.m4

    2.4.19: Mar 25 2002

    • bug fixes: half a dozen XPath bugs, Validation, ISO-Latin to UTF8 encoder
    • portability fixes in the HTTP code
    • memory allocation checks using valgrind, and profiling tests
    • revamp of the Windows build and Makefiles

    2.4.18: Mar 18 2002

    • bug fixes: tree, SAX, canonicalization, validation, portability, XPath
    • removed the --with-buffer option it was becoming unmaintainable
    • serious cleanup of the Python makefiles
    • speedup patch to XPath very effective for DocBook stylesheets
    • Fixes for Windows build, cleanup of the documentation

    2.4.17: Mar 8 2002

    • a lot of bug fixes, including "namespace nodes have no parents in XPath"
    • fixed/improved the Python wrappers, added more examples and more regression tests, XPath extension functions can now return node-sets
    • added the XML Canonicalization support from Aleksey Sanin

    2.4.16: Feb 20 2002

    • a lot of bug fixes, most of them were triggered by the XML Testsuite from OASIS and W3C. Compliance has been significantly improved.
    • a couple of portability fixes too.

    2.4.15: Feb 11 2002

    • Fixed the Makefiles, especially the python module ones
    • A few bug fixes and cleanup
    • Includes cleanup

    2.4.14: Feb 8 2002

    • Change of License to the MIT License basically for integration in XFree86 codebase, and removing confusion around the previous dual-licensing
    • added Python bindings, beta software but should already be quite complete
    • a large number of fixes and cleanups, especially for all tree manipulations
    • cleanup of the headers, generation of a reference API definition in XML

    2.4.13: Jan 14 2002

    • update of the documentation: John Fleck and Charlie Bozeman
    • cleanup of timing code from Justin Fletcher
    • fixes for Windows and initial thread support on Win32: Igor and Serguei Narojnyi
    • Cygwin patch from Robert Collins
    • added xmlSetEntityReferenceFunc() for Keith Isdale work on xsldbg

    2.4.12: Dec 7 2001

    • a few bug fixes: thread (Gary Pennington), xmllint (Geert Kloosterman), XML parser (Robin Berjon), XPointer (Danny Jamshy), I/O cleanups (robert)
    • Eric Lavigne contributed project files for MacOS
    • some makefiles cleanups

    2.4.11: Nov 26 2001

    • fixed a couple of errors in the includes, fixed a few bugs, some code cleanups
    • xmllint man pages improvement by Heiko Rupp
    • updated VMS build instructions from John A Fotheringham
    • Windows Makefiles updates from Igor

    2.4.10: Nov 10 2001

    • URI escaping fix (Joel Young)
    • added xmlGetNodePath() (for paths or XPointers generation)
    • Fixes namespace handling problems when using DTD and validation
    • improvements on xmllint: Morus Walter patches for --format and --encode, Stefan Kost and Heiko Rupp improvements on the --shell
    • fixes for xmlcatalog linking pointed by Weiqi Gao
    • fixes to the HTML parser

    2.4.9: Nov 6 2001

    • fixes more catalog bugs
    • avoid a compilation problem, improve xmlGetLineNo()

    2.4.8: Nov 4 2001

    • fixed SGML catalogs broken in previous release, updated xmlcatalog tool
    • fixed a compile errors and some includes troubles.

    2.4.7: Oct 30 2001

    • exported some debugging interfaces
    • serious rewrite of the catalog code
    • integrated Gary Pennington thread safety patch, added configure option and regression tests
    • removed an HTML parser bug
    • fixed a couple of potentially serious validation bugs
    • integrated the SGML DocBook support in xmllint
    • changed the nanoftp anonymous login passwd
    • some I/O cleanup and a couple of interfaces for Perl wrapper
    • general bug fixes
    • updated xmllint man page by John Fleck
    • some VMS and Windows updates

    2.4.6: Oct 10 2001

    • added an updated man pages by John Fleck
    • portability and configure fixes
    • an infinite loop on the HTML parser was removed (William)
    • Windows makefile patches from Igor
    • fixed half a dozen bugs reported for libxml or libxslt
    • updated xmlcatalog to be able to modify SGML super catalogs

    2.4.5: Sep 14 2001

    • Remove a few annoying bugs in 2.4.4
    • forces the HTML serializer to output decimal charrefs since some version of Netscape can't handle hexadecimal ones

    1.8.16: Sep 14 2001

    • maintenance release of the old libxml1 branch, couple of bug and portability fixes

    2.4.4: Sep 12 2001

    • added --convert to xmlcatalog, bug fixes and cleanups of XML Catalog
    • a few bug fixes and some portability changes
    • some documentation cleanups

    2.4.3: Aug 23 2001

    • XML Catalog support see the doc
    • New NaN/Infinity floating point code
    • A few bug fixes

    2.4.2: Aug 15 2001

    • adds xmlLineNumbersDefault() to control line number generation
    • lot of bug fixes
    • the Microsoft MSC projects files should now be up to date
    • inheritance of namespaces from DTD defaulted attributes
    • fixes a serious potential security bug
    • added a --format option to xmllint

    2.4.1: July 24 2001

    • possibility to keep line numbers in the tree
    • some computation NaN fixes
    • extension of the XPath API
    • cleanup for alpha and ia64 targets
    • patch to allow saving through HTTP PUT or POST

    2.4.0: July 10 2001

    • Fixed a few bugs in XPath, validation, and tree handling.
    • Fixed XML Base implementation, added a couple of examples to the regression tests
    • A bit of cleanup

    2.3.14: July 5 2001

    • fixed some entities problems and reduce memory requirement when substituting them
    • lots of improvements in the XPath queries interpreter can be substantially faster
    • Makefiles and configure cleanups
    • Fixes to XPath variable eval, and compare on empty node set
    • HTML tag closing bug fixed
    • Fixed an URI reference computation problem when validating

    2.3.13: June 28 2001

    • 2.3.12 configure.in was broken as well as the push mode XML parser
    • a few more fixes for compilation on Windows MSC by Yon Derek

    1.8.14: June 28 2001

    • Zbigniew Chyla gave a patch to use the old XML parser in push mode
    • Small Makefile fix

    2.3.12: June 26 2001

    • lots of cleanup
    • a couple of validation fix
    • fixed line number counting
    • fixed serious problems in the XInclude processing
    • added support for UTF8 BOM at beginning of entities
    • fixed a strange gcc optimizer bugs in xpath handling of float, gcc-3.0 miscompile uri.c (William), Thomas Leitner provided a fix for the optimizer on Tru64
    • incorporated Yon Derek and Igor Zlatkovic fixes and improvements for compilation on Windows MSC
    • update of libxml-doc.el (Felix Natter)
    • fixed 2 bugs in URI normalization code

    2.3.11: June 17 2001

    • updates to trio, Makefiles and configure should fix some portability problems (alpha)
    • fixed some HTML serialization problems (pre, script, and block/inline handling), added encoding aware APIs, cleanup of this code
    • added xmlHasNsProp()
    • implemented a specific PI for encoding support in the DocBook SGML parser
    • some XPath fixes (-Infinity, / as a function parameter and namespaces node selection)
    • fixed a performance problem and an error in the validation code
    • fixed XInclude routine to implement the recursive behaviour
    • fixed xmlFreeNode problem when libxml is included statically twice
    • added --version to xmllint for bug reports

    2.3.10: June 1 2001

    • fixed the SGML catalog support
    • a number of reported bugs got fixed, in XPath, iconv detection, XInclude processing
    • XPath string function should now handle unicode correctly

    2.3.9: May 19 2001

    Lots of bugfixes, and added a basic SGML catalog support:

    • HTML push bugfix #54891 and another patch from Jonas Borgström
    • some serious speed optimization again
    • some documentation cleanups
    • trying to get better linking on Solaris (-R)
    • XPath API cleanup from Thomas Broyer
    • Validation bug fixed #54631, added a patch from Gary Pennington, fixed xmlValidGetValidElements()
    • Added an INSTALL file
    • Attribute removal added to API: #54433
    • added a basic support for SGML catalogs
    • fixed xmlKeepBlanksDefault(0) API
    • bugfix in xmlNodeGetLang()
    • fixed a small configure portability problem
    • fixed an inversion of SYSTEM and PUBLIC identifier in HTML document

    1.8.13: May 14 2001

    • bugfixes release of the old libxml1 branch used by Gnome

    2.3.8: May 3 2001

    • Integrated an SGML DocBook parser for the Gnome project
    • Fixed a few things in the HTML parser
    • Fixed some XPath bugs raised by XSLT use, tried to fix the floating point portability issue
    • Speed improvement (8M/s for SAX, 3M/s for DOM, 1.5M/s for DOM+validation using the XML REC as input and a 700MHz celeron).
    • incorporated more Windows cleanup
    • added xmlSaveFormatFile()
    • fixed problems in copying nodes with entities references (gdome)
    • removed some troubles surrounding the new validation module

    2.3.7: April 22 2001

    • lots of small bug fixes, corrected XPointer
    • Non deterministic content model validation support
    • added xmlDocCopyNode for gdome2
    • revamped the way the HTML parser handles end of tags
    • XPath: corrections of namespaces support and number formatting
    • Windows: Igor Zlatkovic patches for MSC compilation
    • HTML output fixes from P C Chow and William M. Brack
    • Improved validation speed sensible for DocBook
    • fixed a big bug with ID declared in external parsed entities
    • portability fixes, update of Trio from Bjorn Reese

    2.3.6: April 8 2001

    • Code cleanup using extreme gcc compiler warning options, found and cleared half a dozen potential problem
    • the Eazel team found an XML parser bug
    • cleaned up the user of some of the string formatting function. used the trio library code to provide the one needed when the platform is missing them
    • xpath: removed a memory leak and fixed the predicate evaluation problem, extended the testsuite and cleaned up the result. XPointer seems broken ...

    2.3.5: Mar 23 2001

    • Biggest change is separate parsing and evaluation of XPath expressions, there is some new APIs for this too
    • included a number of bug fixes(XML push parser, 51876, notations, 52299)
    • Fixed some portability issues

    2.3.4: Mar 10 2001

    • Fixed bugs #51860 and #51861
    • Added a global variable xmlDefaultBufferSize to allow default buffer size to be application tunable.
    • Some cleanup in the validation code, still a bug left and this part should probably be rewritten to support ambiguous content model :-\
    • Fix a couple of serious bugs introduced or raised by changes in 2.3.3 parser
    • Fixed another bug in xmlNodeGetContent()
    • Bjorn fixed XPath node collection and Number formatting
    • Fixed a loop reported in the HTML parsing
    • blank space are reported even if the Dtd content model proves that they are formatting spaces, this is for XML conformance

    2.3.3: Mar 1 2001

    • small change in XPath for XSLT
    • documentation cleanups
    • fix in validation by Gary Pennington
    • serious parsing performances improvements

    2.3.2: Feb 24 2001

    • chasing XPath bugs, found a bunch, completed some TODO
    • fixed a Dtd parsing bug
    • fixed a bug in xmlNodeGetContent
    • ID/IDREF support partly rewritten by Gary Pennington

    2.3.1: Feb 15 2001

    • some XPath and HTML bug fixes for XSLT
    • small extension of the hash table interfaces for DOM gdome2 implementation
    • A few bug fixes

    2.3.0: Feb 8 2001 (2.2.12 was on 25 Jan but I didn't kept track)

    • Lots of XPath bug fixes
    • Add a mode with Dtd lookup but without validation error reporting for XSLT
    • Add support for text node without escaping (XSLT)
    • bug fixes for xmlCheckFilename
    • validation code bug fixes from Gary Pennington
    • Patch from Paul D. Smith correcting URI path normalization
    • Patch to allow simultaneous install of libxml-devel and libxml2-devel
    • the example Makefile is now fixed
    • added HTML to the RPM packages
    • tree copying bugfixes
    • updates to Windows makefiles
    • optimization patch from Bjorn Reese

    2.2.11: Jan 4 2001

    • bunch of bug fixes (memory I/O, xpath, ftp/http, ...)
    • added htmlHandleOmittedElem()
    • Applied Bjorn Reese's IPV6 first patch
    • Applied Paul D. Smith patches for validation of XInclude results
    • added XPointer xmlns() new scheme support

    2.2.10: Nov 25 2000

    • Fix the Windows problems of 2.2.8
    • integrate OpenVMS patches
    • better handling of some nasty HTML input
    • Improved the XPointer implementation
    • integrate a number of provided patches

    2.2.9: Nov 25 2000

    • erroneous release :-(

    2.2.8: Nov 13 2000

    • First version of XInclude support
    • Patch in conditional section handling
    • updated MS compiler project
    • fixed some XPath problems
    • added an URI escaping function
    • some other bug fixes

    2.2.7: Oct 31 2000

    • added message redirection
    • XPath improvements (thanks TOM !)
    • xmlIOParseDTD() added
    • various small fixes in the HTML, URI, HTTP and XPointer support
    • some cleanup of the Makefile, autoconf and the distribution content

    2.2.6: Oct 25 2000:

    • Added an hash table module, migrated a number of internal structure to those
    • Fixed a posteriori validation problems
    • HTTP module cleanups
    • HTML parser improvements (tag errors, script/style handling, attribute normalization)
    • coalescing of adjacent text nodes
    • couple of XPath bug fixes, exported the internal API

    2.2.5: Oct 15 2000:

    • XPointer implementation and testsuite
    • Lot of XPath fixes, added variable and functions registration, more tests
    • Portability fixes, lots of enhancements toward an easy Windows build and release
    • Late validation fixes
    • Integrated a lot of contributed patches
    • added memory management docs
    • a performance problem when using large buffer seems fixed

    2.2.4: Oct 1 2000:

    • main XPath problem fixed
    • Integrated portability patches for Windows
    • Serious bug fixes on the URI and HTML code

    2.2.3: Sep 17 2000

    • bug fixes
    • cleanup of entity handling code
    • overall review of all loops in the parsers, all sprintf usage has been checked too
    • Far better handling of larges Dtd. Validating against DocBook XML Dtd works smoothly now.

    1.8.10: Sep 6 2000

    • bug fix release for some Gnome projects

    2.2.2: August 12 2000

    • mostly bug fixes
    • started adding routines to access xml parser context options

    2.2.1: July 21 2000

    • a purely bug fixes release
    • fixed an encoding support problem when parsing from a memory block
    • fixed a DOCTYPE parsing problem
    • removed a bug in the function allowing to override the memory allocation routines

    2.2.0: July 14 2000

    • applied a lot of portability fixes
    • better encoding support/cleanup and saving (content is now always encoded in UTF-8)
    • the HTML parser now correctly handles encodings
    • added xmlHasProp()
    • fixed a serious problem with &#38;
    • propagated the fix to FTP client
    • cleanup, bugfixes, etc ...
    • Added a page about libxml Internationalization support

    1.8.9: July 9 2000

    • fixed the spec the RPMs should be better
    • fixed a serious bug in the FTP implementation, released 1.8.9 to solve rpmfind users problem

    2.1.1: July 1 2000

    • fixes a couple of bugs in the 2.1.0 packaging
    • improvements on the HTML parser

    2.1.0 and 1.8.8: June 29 2000

    • 1.8.8 is mostly a commodity package for upgrading to libxml2 according to new instructions. It fixes a nasty problem about &#38; charref parsing
    • 2.1.0 also ease the upgrade from libxml v1 to the recent version. it also contains numerous fixes and enhancements:
      • added xmlStopParser() to stop parsing
      • improved a lot parsing speed when there is large CDATA blocs
      • includes XPath patches provided by Picdar Technology
      • tried to fix as much as possible DTD validation and namespace related problems
      • output to a given encoding has been added/tested
      • lot of various fixes

    2.0.0: Apr 12 2000

    • First public release of libxml2. If you are using libxml, it's a good idea to check the 1.x to 2.x upgrade instructions. NOTE: while initially scheduled for Apr 3 the release occurred only on Apr 12 due to massive workload.
    • The include are now located under $prefix/include/libxml (instead of $prefix/include/gnome-xml), they also are referenced by
      #include <libxml/xxx.h>

      instead of

      #include "xxx.h"
    • a new URI module for parsing URIs and following strictly RFC 2396
    • the memory allocation routines used by libxml can now be overloaded dynamically by using xmlMemSetup()
    • The previously CVS only tool tester has been renamed xmllint and is now installed as part of the libxml2 package
    • The I/O interface has been revamped. There is now ways to plug in specific I/O modules, either at the URI scheme detection level using xmlRegisterInputCallbacks() or by passing I/O functions when creating a parser context using xmlCreateIOParserCtxt()
    • there is a C preprocessor macro LIBXML_VERSION providing the version number of the libxml module in use
    • a number of optional features of libxml can now be excluded at configure time (FTP/HTTP/HTML/XPath/Debug)

    2.0.0beta: Mar 14 2000

    • This is a first Beta release of libxml version 2
    • It's available only fromxmlsoft.org FTP, it's packaged as libxml2-2.0.0beta and available as tar and RPMs
    • This version is now the head in the Gnome CVS base, the old one is available under the tag LIB_XML_1_X
    • This includes a very large set of changes. From a programmatic point of view applications should not have to be modified too much, check the upgrade page
    • Some interfaces may changes (especially a bit about encoding).
    • the updates includes:
      • fix I18N support. ISO-Latin-x/UTF-8/UTF-16 (nearly) seems correctly handled now
      • Better handling of entities, especially well-formedness checking and proper PEref extensions in external subsets
      • DTD conditional sections
      • Validation now correctly handle entities content
      • change structures to accommodate DOM
    • Serious progress were made toward compliance, here are the result of the test against the OASIS testsuite (except the Japanese tests since I don't support that encoding yet). This URL is rebuilt every couple of hours using the CVS head version.

    1.8.7: Mar 6 2000

    • This is a bug fix release:
    • It is possible to disable the ignorable blanks heuristic used by libxml-1.x, a new function xmlKeepBlanksDefault(0) will allow this. Note that for adherence to XML spec, this behaviour will be disabled by default in 2.x . The same function will allow to keep compatibility for old code.
    • Blanks in <a> </a> constructs are not ignored anymore, avoiding heuristic is really the Right Way :-\
    • The unchecked use of snprintf which was breaking libxml-1.8.6 compilation on some platforms has been fixed
    • nanoftp.c nanohttp.c: Fixed '#' and '?' stripping when processing URIs

    1.8.6: Jan 31 2000

    • added a nanoFTP transport module, debugged until the new version of rpmfind can use it without troubles

    1.8.5: Jan 21 2000

    • adding APIs to parse a well balanced chunk of XML (production [43] content of the XML spec)
    • fixed a hideous bug in xmlGetProp pointed by Rune.Djurhuus@fast.no
    • Jody Goldberg <jgoldberg@home.com> provided another patch trying to solve the zlib checks problems
    • The current state in gnome CVS base is expected to ship as 1.8.5 with gnumeric soon

    1.8.4: Jan 13 2000

    • bug fixes, reintroduced xmlNewGlobalNs(), fixed xmlNewNs()
    • all exit() call should have been removed from libxml
    • fixed a problem with INCLUDE_WINSOCK on WIN32 platform
    • added newDocFragment()

    1.8.3: Jan 5 2000

    • a Push interface for the XML and HTML parsers
    • a shell-like interface to the document tree (try tester --shell :-)
    • lots of bug fixes and improvement added over XMas holidays
    • fixed the DTD parsing code to work with the xhtml DTD
    • added xmlRemoveProp(), xmlRemoveID() and xmlRemoveRef()
    • Fixed bugs in xmlNewNs()
    • External entity loading code has been revamped, now it uses xmlLoadExternalEntity(), some fix on entities processing were added
    • cleaned up WIN32 includes of socket stuff

    1.8.2: Dec 21 1999

    • I got another problem with includes and C++, I hope this issue is fixed for good this time
    • Added a few tree modification functions: xmlReplaceNode, xmlAddPrevSibling, xmlAddNextSibling, xmlNodeSetName and xmlDocSetRootElement
    • Tried to improve the HTML output with help from Chris Lahey

    1.8.1: Dec 18 1999

    • various patches to avoid troubles when using libxml with C++ compilers the "namespace" keyword and C escaping in include files
    • a problem in one of the core macros IS_CHAR was corrected
    • fixed a bug introduced in 1.8.0 breaking default namespace processing, and more specifically the Dia application
    • fixed a posteriori validation (validation after parsing, or by using a Dtd not specified in the original document)
    • fixed a bug in

    1.8.0: Dec 12 1999

    • cleanup, especially memory wise
    • the parser should be more reliable, especially the HTML one, it should not crash, whatever the input !
    • Integrated various patches, especially a speedup improvement for large dataset from Carl Nygard, configure with --with-buffers to enable them.
    • attribute normalization, oops should have been added long ago !
    • attributes defaulted from DTDs should be available, xmlSetProp() now does entities escaping by default.

    1.7.4: Oct 25 1999

    • Lots of HTML improvement
    • Fixed some errors when saving both XML and HTML
    • More examples, the regression tests should now look clean
    • Fixed a bug with contiguous charref

    1.7.3: Sep 29 1999

    • portability problems fixed
    • snprintf was used unconditionally, leading to link problems on system were it's not available, fixed

    1.7.1: Sep 24 1999

    • The basic type for strings manipulated by libxml has been renamed in 1.7.1 from CHAR to xmlChar. The reason is that CHAR was conflicting with a predefined type on Windows. However on non WIN32 environment, compatibility is provided by the way of a #define .
    • Changed another error : the use of a structure field called errno, and leading to troubles on platforms where it's a macro

    1.7.0: Sep 23 1999

    • Added the ability to fetch remote DTD or parsed entities, see the nanohttp module.
    • Added an errno to report errors by another mean than a simple printf like callback
    • Finished ID/IDREF support and checking when validation
    • Serious memory leaks fixed (there is now a memory wrapper module)
    • Improvement of XPath implementation
    • Added an HTML parser front-end

    XML

    XML is a standard for markup-based structured documents. Here is an example XML document:

    <?xml version="1.0"?>
    <EXAMPLE prop1="gnome is great" prop2="&amp; linux too">
      <head>
       <title>Welcome to Gnome</title>
      </head>
      <chapter>
       <title>The Linux adventure</title>
       <p>bla bla bla ...</p>
       <image href="linus.gif"/>
       <p>...</p>
      </chapter>
    </EXAMPLE>

    The first line specifies that it is an XML document and gives useful information about its encoding. Then the rest of the document is a text format whose structure is specified by tags between brackets. Each tag opened has to be closed. XML is pedantic about this. However, if a tag is empty (no content), a single tag can serve as both the opening and closing tag if it ends with /> rather than with >. Note that, for example, the image tag has no content (just an attribute) and is closed by ending the tag with />.

    XML can be applied successfully to a wide range of tasks, ranging from long term structured document maintenance (where it follows the steps of SGML) to simple data encoding mechanisms like configuration file formatting (glade), spreadsheets (gnumeric), or even shorter lived documents such as WebDAV where it is used to encode remote calls between a client and a server.

    XSLT

    Check the separate libxslt page

    XSL Transformations, is a language for transforming XML documents into other XML documents (or HTML/textual output).

    A separate library called libxslt is available implementing XSLT-1.0 for libxml2. This module "libxslt" too can be found in the Gnome SVN base.

    You can check the progresses on the libxslt Changelog.

    Python and bindings

    There are a number of language bindings and wrappers available for libxml2, the list below is not exhaustive. Please contact the xml-bindings@gnome.org (archives) in order to get updates to this list or to discuss the specific topic of libxml2 or libxslt wrappers or bindings:

    • Libxml++ seems the most up-to-date C++ bindings for libxml2, check the documentation and the examples.
    • There is another C++ wrapper based on the gdome2 bindings maintained by Tobias Peters.
    • and a third C++ wrapper by Peter Jones <pjones@pmade.org>

      Website: http://pmade.org/pjones/software/xmlwrapp/

    • XML::LibXML Perl bindings are available on CPAN, as well as XML::LibXSLT Perl libxslt bindings.
    • If you're interested into scripting XML processing, have a look at XSH an XML editing shell based on Libxml2 Perl bindings.
    • Dave Kuhlman provides an earlier version of the libxml/libxslt wrappers for Python.
    • Gopal.V and Peter Minten develop libxml#, a set of C# libxml2 bindings.
    • Petr Kozelka provides Pascal units to glue libxml2 with Kylix, Delphi and other Pascal compilers.
    • Uwe Fechner also provides idom2, a DOM2 implementation for Kylix2/D5/D6 from Borland.
    • There is bindings for Ruby and libxml2 bindings are also available in Ruby through the libgdome-ruby module maintained by Tobias Peters.
    • Steve Ball and contributors maintains libxml2 and libxslt bindings for Tcl.
    • libxml2 and libxslt are the default XML libraries for PHP5.
    • LibxmlJ is an effort to create a 100% JAXP-compatible Java wrapper for libxml2 and libxslt as part of GNU ClasspathX project.
    • Patrick McPhee provides Rexx bindings fof libxml2 and libxslt, look for RexxXML.
    • Satimage provides XMLLib osax. This is an osax for Mac OS X with a set of commands to implement in AppleScript the XML DOM, XPATH and XSLT. Also includes commands for Property-lists (Apple's fast lookup table XML format.)
    • Francesco Montorsi developped wxXml2 wrappers that interface libxml2, allowing wxWidgets applications to load/save/edit XML instances.

    The distribution includes a set of Python bindings, which are guaranteed to be maintained as part of the library in the future, though the Python interface have not yet reached the completeness of the C API.

    Note that some of the Python purist dislike the default set of Python bindings, rather than complaining I suggest they have a look at lxml the more pythonic bindings for libxml2 and libxslt and check the mailing-list.

    Stéphane Bidoul maintains a Windows port of the Python bindings.

    Note to people interested in building bindings, the API is formalized as an XML API description file which allows to automate a large part of the Python bindings, this includes function descriptions, enums, structures, typedefs, etc... The Python script used to build the bindings is python/generator.py in the source distribution.

    To install the Python bindings there are 2 options:

    • If you use an RPM based distribution, simply install the libxml2-python RPM (and if needed the libxslt-python RPM).
    • Otherwise use the libxml2-python module distribution corresponding to your installed version of libxml2 and libxslt. Note that to install it you will need both libxml2 and libxslt installed and run "python setup.py build install" in the module tree.

    The distribution includes a set of examples and regression tests for the python bindings in the python/tests directory. Here are some excerpts from those tests:

    tst.py:

    This is a basic test of the file interface and DOM navigation:

    import libxml2, sys
    
    doc = libxml2.parseFile("tst.xml")
    if doc.name != "tst.xml":
        print "doc.name failed"
        sys.exit(1)
    root = doc.children
    if root.name != "doc":
        print "root.name failed"
        sys.exit(1)
    child = root.children
    if child.name != "foo":
        print "child.name failed"
        sys.exit(1)
    doc.freeDoc()

    The Python module is called libxml2; parseFile is the equivalent of xmlParseFile (most of the bindings are automatically generated, and the xml prefix is removed and the casing convention are kept). All node seen at the binding level share the same subset of accessors:

    • name : returns the node name
    • type : returns a string indicating the node type
    • content : returns the content of the node, it is based on xmlNodeGetContent() and hence is recursive.
    • parent , children, last, next, prev, doc, properties: pointing to the associated element in the tree, those may return None in case no such link exists.

    Also note the need to explicitly deallocate documents with freeDoc() . Reference counting for libxml2 trees would need quite a lot of work to function properly, and rather than risk memory leaks if not implemented correctly it sounds safer to have an explicit function to free a tree. The wrapper python objects like doc, root or child are them automatically garbage collected.

    validate.py:

    This test check the validation interfaces and redirection of error messages:

    import libxml2
    
    #deactivate error messages from the validation
    def noerr(ctx, str):
        pass
    
    libxml2.registerErrorHandler(noerr, None)
    
    ctxt = libxml2.createFileParserCtxt("invalid.xml")
    ctxt.validate(1)
    ctxt.parseDocument()
    doc = ctxt.doc()
    valid = ctxt.isValid()
    doc.freeDoc()
    if valid != 0:
        print "validity check failed"

    The first thing to notice is the call to registerErrorHandler(), it defines a new error handler global to the library. It is used to avoid seeing the error messages when trying to validate the invalid document.

    The main interest of that test is the creation of a parser context with createFileParserCtxt() and how the behaviour can be changed before calling parseDocument() . Similarly the information resulting from the parsing phase is also available using context methods.

    Contexts like nodes are defined as class and the libxml2 wrappers maps the C function interfaces in terms of objects method as much as possible. The best to get a complete view of what methods are supported is to look at the libxml2.py module containing all the wrappers.

    push.py:

    This test show how to activate the push parser interface:

    import libxml2
    
    ctxt = libxml2.createPushParser(None, "<foo", 4, "test.xml")
    ctxt.parseChunk("/>", 2, 1)
    doc = ctxt.doc()
    
    doc.freeDoc()

    The context is created with a special call based on the xmlCreatePushParser() from the C library. The first argument is an optional SAX callback object, then the initial set of data, the length and the name of the resource in case URI-References need to be computed by the parser.

    Then the data are pushed using the parseChunk() method, the last call setting the third argument terminate to 1.

    pushSAX.py:

    this test show the use of the event based parsing interfaces. In this case the parser does not build a document, but provides callback information as the parser makes progresses analyzing the data being provided:

    import libxml2
    log = ""
    
    class callback:
        def startDocument(self):
            global log
            log = log + "startDocument:"
    
        def endDocument(self):
            global log
            log = log + "endDocument:"
    
        def startElement(self, tag, attrs):
            global log
            log = log + "startElement %s %s:" % (tag, attrs)
    
        def endElement(self, tag):
            global log
            log = log + "endElement %s:" % (tag)
    
        def characters(self, data):
            global log
            log = log + "characters: %s:" % (data)
    
        def warning(self, msg):
            global log
            log = log + "warning: %s:" % (msg)
    
        def error(self, msg):
            global log
            log = log + "error: %s:" % (msg)
    
        def fatalError(self, msg):
            global log
            log = log + "fatalError: %s:" % (msg)
    
    handler = callback()
    
    ctxt = libxml2.createPushParser(handler, "<foo", 4, "test.xml")
    chunk = " url='tst'>b"
    ctxt.parseChunk(chunk, len(chunk), 0)
    chunk = "ar</foo>"
    ctxt.parseChunk(chunk, len(chunk), 1)
    
    reference = "startDocument:startElement foo {'url': 'tst'}:" + \ 
                "characters: bar:endElement foo:endDocument:"
    if log != reference:
        print "Error got: %s" % log
        print "Expected: %s" % reference

    The key object in that test is the handler, it provides a number of entry points which can be called by the parser as it makes progresses to indicate the information set obtained. The full set of callback is larger than what the callback class in that specific example implements (see the SAX definition for a complete list). The wrapper will only call those supplied by the object when activated. The startElement receives the names of the element and a dictionary containing the attributes carried by this element.

    Also note that the reference string generated from the callback shows a single character call even though the string "bar" is passed to the parser from 2 different call to parseChunk()

    xpath.py:

    This is a basic test of XPath wrappers support

    import libxml2
    
    doc = libxml2.parseFile("tst.xml")
    ctxt = doc.xpathNewContext()
    res = ctxt.xpathEval("//*")
    if len(res) != 2:
        print "xpath query: wrong node set size"
        sys.exit(1)
    if res[0].name != "doc" or res[1].name != "foo":
        print "xpath query: wrong node set value"
        sys.exit(1)
    doc.freeDoc()
    ctxt.xpathFreeContext()

    This test parses a file, then create an XPath context to evaluate XPath expression on it. The xpathEval() method execute an XPath query and returns the result mapped in a Python way. String and numbers are natively converted, and node sets are returned as a tuple of libxml2 Python nodes wrappers. Like the document, the XPath context need to be freed explicitly, also not that the result of the XPath query may point back to the document tree and hence the document must be freed after the result of the query is used.

    xpathext.py:

    This test shows how to extend the XPath engine with functions written in python:

    import libxml2
    
    def foo(ctx, x):
        return x + 1
    
    doc = libxml2.parseFile("tst.xml")
    ctxt = doc.xpathNewContext()
    libxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
    res = ctxt.xpathEval("foo(1)")
    if res != 2:
        print "xpath extension failure"
    doc.freeDoc()
    ctxt.xpathFreeContext()

    Note how the extension function is registered with the context (but that part is not yet finalized, this may change slightly in the future).

    tstxpath.py:

    This test is similar to the previous one but shows how the extension function can access the XPath evaluation context:

    def foo(ctx, x):
        global called
    
        #
        # test that access to the XPath evaluation contexts
        #
        pctxt = libxml2.xpathParserContext(_obj=ctx)
        ctxt = pctxt.context()
        called = ctxt.function()
        return x + 1

    All the interfaces around the XPath parser(or rather evaluation) context are not finalized, but it should be sufficient to do contextual work at the evaluation point.

    Memory debugging:

    last but not least, all tests starts with the following prologue:

    #memory debug specific
    libxml2.debugMemory(1)

    and ends with the following epilogue:

    #memory debug specific
    libxml2.cleanupParser()
    if libxml2.debugMemory(1) == 0:
        print "OK"
    else:
        print "Memory leak %d bytes" % (libxml2.debugMemory(1))
        libxml2.dumpMemory()

    Those activate the memory debugging interface of libxml2 where all allocated block in the library are tracked. The prologue then cleans up the library state and checks that all allocated memory has been freed. If not it calls dumpMemory() which saves that list in a .memdump file.

    libxml2 architecture

    Libxml2 is made of multiple components; some of them are optional, and most of the block interfaces are public. The main components are:

    • an Input/Output layer
    • FTP and HTTP client layers (optional)
    • an Internationalization layer managing the encodings support
    • a URI module
    • the XML parser and its basic SAX interface
    • an HTML parser using the same SAX interface (optional)
    • a SAX tree module to build an in-memory DOM representation
    • a tree module to manipulate the DOM representation
    • a validation module using the DOM representation (optional)
    • an XPath module for global lookup in a DOM representation (optional)
    • a debug module (optional)

    Graphically this gives the following:

    a graphical view of the various

    The tree output

    The parser returns a tree built during the document analysis. The value returned is an xmlDocPtr (i.e., a pointer to an xmlDoc structure). This structure contains information such as the file name, the document type, and a children pointer which is the root of the document (or more exactly the first child under the root which is the document). The tree is made of xmlNodes, chained in double-linked lists of siblings and with a children<->parent relationship. An xmlNode can also carry properties (a chain of xmlAttr structures). An attribute may have a value which is a list of TEXT or ENTITY_REF nodes.

    Here is an example (erroneous with respect to the XML spec since there should be only one ELEMENT under the root):

     structure.gif

    In the source package there is a small program (not installed by default) called xmllint which parses XML files given as argument and prints them back as parsed. This is useful for detecting errors both in XML code and in the XML parser itself. It has an option --debug which prints the actual in-memory structure of the document; here is the result with the example given before:

    DOCUMENT
    version=1.0
    standalone=true
      ELEMENT EXAMPLE
        ATTRIBUTE prop1
          TEXT
          content=gnome is great
        ATTRIBUTE prop2
          ENTITY_REF
          TEXT
          content= linux too 
        ELEMENT head
          ELEMENT title
            TEXT
            content=Welcome to Gnome
        ELEMENT chapter
          ELEMENT title
            TEXT
            content=The Linux adventure
          ELEMENT p
            TEXT
            content=bla bla bla ...
          ELEMENT image
            ATTRIBUTE href
              TEXT
              content=linus.gif
          ELEMENT p
            TEXT
            content=...

    This should be useful for learning the internal representation model.

    The SAX interface

    Sometimes the DOM tree output is just too large to fit reasonably into memory. In that case (and if you don't expect to save back the XML document loaded using libxml), it's better to use the SAX interface of libxml. SAX is a callback-based interface to the parser. Before parsing, the application layer registers a customized set of callbacks which are called by the library as it progresses through the XML input.

    To get more detailed step-by-step guidance on using the SAX interface of libxml, see the nice documentation.written by James Henstridge.

    You can debug the SAX behaviour by using the testSAX program located in the gnome-xml module (it's usually not shipped in the binary packages of libxml, but you can find it in the tar source distribution). Here is the sequence of callbacks that would be reported by testSAX when parsing the example XML document shown earlier:

    SAX.setDocumentLocator()
    SAX.startDocument()
    SAX.getEntity(amp)
    SAX.startElement(EXAMPLE, prop1='gnome is great', prop2='&amp; linux too')
    SAX.characters(   , 3)
    SAX.startElement(head)
    SAX.characters(    , 4)
    SAX.startElement(title)
    SAX.characters(Welcome to Gnome, 16)
    SAX.endElement(title)
    SAX.characters(   , 3)
    SAX.endElement(head)
    SAX.characters(   , 3)
    SAX.startElement(chapter)
    SAX.characters(    , 4)
    SAX.startElement(title)
    SAX.characters(The Linux adventure, 19)
    SAX.endElement(title)
    SAX.characters(    , 4)
    SAX.startElement(p)
    SAX.characters(bla bla bla ..., 15)
    SAX.endElement(p)
    SAX.characters(    , 4)
    SAX.startElement(image, href='linus.gif')
    SAX.endElement(image)
    SAX.characters(    , 4)
    SAX.startElement(p)
    SAX.characters(..., 3)
    SAX.endElement(p)
    SAX.characters(   , 3)
    SAX.endElement(chapter)
    SAX.characters( , 1)
    SAX.endElement(EXAMPLE)
    SAX.endDocument()

    Most of the other interfaces of libxml2 are based on the DOM tree-building facility, so nearly everything up to the end of this document presupposes the use of the standard DOM tree build. Note that the DOM tree itself is built by a set of registered default callbacks, without internal specific interface.

    Validation & DTDs

    Table of Content:

    1. General overview
    2. The definition
    3. Simple rules
      1. How to reference a DTD from a document
      2. Declaring elements
      3. Declaring attributes
    4. Some examples
    5. How to validate
    6. Other resources

    General overview

    Well what is validation and what is a DTD ?

    DTD is the acronym for Document Type Definition. This is a description of the content for a family of XML files. This is part of the XML 1.0 specification, and allows one to describe and verify that a given document instance conforms to the set of rules detailing its structure and content.

    Validation is the process of checking a document against a DTD (more generally against a set of construction rules).

    The validation process and building DTDs are the two most difficult parts of the XML life cycle. Briefly a DTD defines all the possible elements to be found within your document, what is the formal shape of your document tree (by defining the allowed content of an element; either text, a regular expression for the allowed list of children, or mixed content i.e. both text and children). The DTD also defines the valid attributes for all elements and the types of those attributes.

    The definition

    The W3C XML Recommendation (Tim Bray's annotated version of Rev1):

    (unfortunately) all this is inherited from the SGML world, the syntax is ancient...

    Simple rules

    Writing DTDs can be done in many ways. The rules to build them if you need something permanent or something which can evolve over time can be radically different. Really complex DTDs like DocBook ones are flexible but quite harder to design. I will just focus on DTDs for a formats with a fixed simple structure. It is just a set of basic rules, and definitely not exhaustive nor usable for complex DTD design.

    How to reference a DTD from a document:

    Assuming the top element of the document is spec and the dtd is placed in the file mydtd in the subdirectory dtds of the directory from where the document were loaded:

    <!DOCTYPE spec SYSTEM "dtds/mydtd">

    Notes:

    • The system string is actually an URI-Reference (as defined in RFC 2396) so you can use a full URL string indicating the location of your DTD on the Web. This is a really good thing to do if you want others to validate your document.
    • It is also possible to associate a PUBLIC identifier (a magic string) so that the DTD is looked up in catalogs on the client side without having to locate it on the web.
    • A DTD contains a set of element and attribute declarations, but they don't define what the root of the document should be. This is explicitly told to the parser/validator as the first element of the DOCTYPE declaration.

    Declaring elements:

    The following declares an element spec:

    <!ELEMENT spec (front, body, back?)>

    It also expresses that the spec element contains one front, one body and one optional back children elements in this order. The declaration of one element of the structure and its content are done in a single declaration. Similarly the following declares div1 elements:

    <!ELEMENT div1 (head, (p | list | note)*, div2?)>

    which means div1 contains one head then a series of optional p, lists and notes and then an optional div2. And last but not least an element can contain text:

    <!ELEMENT b (#PCDATA)>

    b contains text or being of mixed content (text and elements in no particular order):

    <!ELEMENT p (#PCDATA|a|ul|b|i|em)*>

    p can contain text or a, ul, b, i or em elements in no particular order.

    Declaring attributes:

    Again the attributes declaration includes their content definition:

    <!ATTLIST termdef name CDATA #IMPLIED>

    means that the element termdef can have a name attribute containing text (CDATA) and which is optional (#IMPLIED). The attribute value can also be defined within a set:

    <!ATTLIST list type (bullets|ordered|glossary) "ordered">

    means list element have a type attribute with 3 allowed values "bullets", "ordered" or "glossary" and which default to "ordered" if the attribute is not explicitly specified.

    The content type of an attribute can be text (CDATA), anchor/reference/references (ID/IDREF/IDREFS), entity(ies) (ENTITY/ENTITIES) or name(s) (NMTOKEN/NMTOKENS). The following defines that a chapter element can have an optional id attribute of type ID, usable for reference from attribute of type IDREF:

    <!ATTLIST chapter id ID #IMPLIED>

    The last value of an attribute definition can be #REQUIRED meaning that the attribute has to be given, #IMPLIED meaning that it is optional, or the default value (possibly prefixed by #FIXED if it is the only allowed).

    Notes:

    • Usually the attributes pertaining to a given element are declared in a single expression, but it is just a convention adopted by a lot of DTD writers:
      <!ATTLIST termdef
                id      ID      #REQUIRED
                name    CDATA   #IMPLIED>

      The previous construct defines both id and name attributes for the element termdef.

    Some examples

    The directory test/valid/dtds/ in the libxml2 distribution contains some complex DTD examples. The example in the file test/valid/dia.xml shows an XML file where the simple DTD is directly included within the document.

    How to validate

    The simplest way is to use the xmllint program included with libxml. The --valid option turns-on validation of the files given as input. For example the following validates a copy of the first revision of the XML 1.0 specification:

    xmllint --valid --noout test/valid/REC-xml-19980210.xml

    the -- noout is used to disable output of the resulting tree.

    The --dtdvalid dtd allows validation of the document(s) against a given DTD.

    Libxml2 exports an API to handle DTDs and validation, check the associated description.

    Other resources

    DTDs are as old as SGML. So there may be a number of examples on-line, I will just list one for now, others pointers welcome:

    I suggest looking at the examples found under test/valid/dtd and any of the large number of books available on XML. The dia example in test/valid should be both simple and complete enough to allow you to build your own.

    Memory Management

    Table of Content:

    1. General overview
    2. Setting libxml2 set of memory routines
    3. Cleaning up after using the library
    4. Debugging routines
    5. General memory requirements
    6. Returning memory to the kernel

    General overview

    The module xmlmemory.h provides the interfaces to the libxml2 memory system:

    • libxml2 does not use the libc memory allocator directly but xmlFree(), xmlMalloc() and xmlRealloc()
    • those routines can be reallocated to a specific set of routine, by default the libc ones i.e. free(), malloc() and realloc()
    • the xmlmemory.c module includes a set of debugging routine

    Setting libxml2 set of memory routines

    It is sometimes useful to not use the default memory allocator, either for debugging, analysis or to implement a specific behaviour on memory management (like on embedded systems). Two function calls are available to do so:

    • xmlMemGet () which return the current set of functions in use by the parser
    • xmlMemSetup() which allow to set up a new set of memory allocation functions

    Of course a call to xmlMemSetup() should probably be done before calling any other libxml2 routines (unless you are sure your allocations routines are compatibles).

    Cleaning up after using the library

    Libxml2 is not stateless, there is a few set of memory structures needing allocation before the parser is fully functional (some encoding structures for example). This also mean that once parsing is finished there is a tiny amount of memory (a few hundred bytes) which can be recollected if you don't reuse the library or any document built with it:

    • xmlCleanupParser () is a centralized routine to free the library state and data. Note that it won't deallocate any produced tree if any (use the xmlFreeDoc() and related routines for this). This should be called only when the library is not used anymore.
    • xmlInitParser () is the dual routine allowing to preallocate the parsing state which can be useful for example to avoid initialization reentrancy problems when using libxml2 in multithreaded applications

    Generally xmlCleanupParser() is safe assuming no parsing is ongoing and no document is still being used, if needed the state will be rebuild at the next invocation of parser routines (or by xmlInitParser()), but be careful of the consequences in multithreaded applications.

    Debugging routines

    When configured using --with-mem-debug flag (off by default), libxml2 uses a set of memory allocation debugging routines keeping track of all allocated blocks and the location in the code where the routine was called. A couple of other debugging routines allow to dump the memory allocated infos to a file or call a specific routine when a given block number is allocated:

    When developing libxml2 memory debug is enabled, the tests programs call xmlMemoryDump () and the "make test" regression tests will check for any memory leak during the full regression test sequence, this helps a lot ensuring that libxml2 does not leak memory and bullet proof memory allocations use (some libc implementations are known to be far too permissive resulting in major portability problems!).

    If the .memdump reports a leak, it displays the allocation function and also tries to give some information about the content and structure of the allocated blocks left. This is sufficient in most cases to find the culprit, but not always. Assuming the allocation problem is reproducible, it is possible to find more easily:

    1. write down the block number xxxx not allocated
    2. export the environment variable XML_MEM_BREAKPOINT=xxxx , the easiest when using GDB is to simply give the command

      set environment XML_MEM_BREAKPOINT xxxx

      before running the program.

    3. run the program under a debugger and set a breakpoint on xmlMallocBreakpoint() a specific function called when this precise block is allocated
    4. when the breakpoint is reached you can then do a fine analysis of the allocation an step to see the condition resulting in the missing deallocation.

    I used to use a commercial tool to debug libxml2 memory problems but after noticing that it was not detecting memory leaks that simple mechanism was used and proved extremely efficient until now. Lately I have also used valgrind with quite some success, it is tied to the i386 architecture since it works by emulating the processor and instruction set, it is slow but extremely efficient, i.e. it spot memory usage errors in a very precise way.

    General memory requirements

    How much libxml2 memory require ? It's hard to tell in average it depends of a number of things:

    • the parser itself should work in a fixed amount of memory, except for information maintained about the stacks of names and entities locations. The I/O and encoding handlers will probably account for a few KBytes. This is true for both the XML and HTML parser (though the HTML parser need more state).
    • If you are generating the DOM tree then memory requirements will grow nearly linear with the size of the data. In general for a balanced textual document the internal memory requirement is about 4 times the size of the UTF8 serialization of this document (example the XML-1.0 recommendation is a bit more of 150KBytes and takes 650KBytes of main memory when parsed). Validation will add a amount of memory required for maintaining the external Dtd state which should be linear with the complexity of the content model defined by the Dtd
    • If you need to work with fixed memory requirements or don't need the full DOM tree then using the xmlReader interface is probably the best way to proceed, it still allows to validate or operate on subset of the tree if needed.
    • If you don't care about the advanced features of libxml2 like validation, DOM, XPath or XPointer, don't use entities, need to work with fixed memory requirements, and try to get the fastest parsing possible then the SAX interface should be used, but it has known restrictions.

    Returning memory to the kernel

    You may encounter that your process using libxml2 does not have a reduced memory usage although you freed the trees. This is because libxml2 allocates memory in a number of small chunks. When freeing one of those chunks, the OS may decide that giving this little memory back to the kernel will cause too much overhead and delay the operation. As all chunks are this small, they get actually freed but not returned to the kernel. On systems using glibc, there is a function call "malloc_trim" from malloc.h which does this missing operation (note that it is allowed to fail). Thus, after freeing your tree you may simply try "malloc_trim(0);" to really get the memory back. If your OS does not provide malloc_trim, try searching for a similar function.

    Encodings support

    If you are not really familiar with Internationalization (usual shortcut is I18N) , Unicode, characters and glyphs, I suggest you read a presentation by Tim Bray on Unicode and why you should care about it.

    If you don't understand why it does not make sense to have a string without knowing what encoding it uses, then as Joel Spolsky said please do not write another line of code until you finish reading that article.. It is a prerequisite to understand this page, and avoid a lot of problems with libxml2, XML or text processing in general.

    Table of Content:

    1. What does internationalization support mean ?
    2. The internal encoding, how and why
    3. How is it implemented ?
    4. Default supported encodings
    5. How to extend the existing support

    What does internationalization support mean ?

    XML was designed from the start to allow the support of any character set by using Unicode. Any conformant XML parser has to support the UTF-8 and UTF-16 default encodings which can both express the full unicode ranges. UTF8 is a variable length encoding whose greatest points are to reuse the same encoding for ASCII and to save space for Western encodings, but it is a bit more complex to handle in practice. UTF-16 use 2 bytes per character (and sometimes combines two pairs), it makes implementation easier, but looks a bit overkill for Western languages encoding. Moreover the XML specification allows the document to be encoded in other encodings at the condition that they are clearly labeled as such. For example the following is a wellformed XML document encoded in ISO-8859-1 and using accentuated letters that we French like for both markup and content:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <très>là </très>

    Having internationalization support in libxml2 means the following:

    • the document is properly parsed
    • information about it's encoding is saved
    • it can be modified
    • it can be saved in its original encoding
    • it can also be saved in another encoding supported by libxml2 (for example straight UTF8 or even an ASCII form)

    Another very important point is that the whole libxml2 API, with the exception of a few routines to read with a specific encoding or save to a specific encoding, is completely agnostic about the original encoding of the document.

    It should be noted too that the HTML parser embedded in libxml2 now obey the same rules too, the following document will be (as of 2.2.2) handled in an internationalized fashion by libxml2 too:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
                          "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html lang="fr">
    <head>
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
    </head>
    <body>
    <p>W3C crée des standards pour le Web.</body>
    </html>

    The internal encoding, how and why

    One of the core decisions was to force all documents to be converted to a default internal encoding, and that encoding to be UTF-8, here are the rationales for those choices:

    • keeping the native encoding in the internal form would force the libxml users (or the code associated) to be fully aware of the encoding of the original document, for examples when adding a text node to a document, the content would have to be provided in the document encoding, i.e. the client code would have to check it before hand, make sure it's conformant to the encoding, etc ... Very hard in practice, though in some specific cases this may make sense.
    • the second decision was which encoding. From the XML spec only UTF8 and UTF16 really makes sense as being the two only encodings for which there is mandatory support. UCS-4 (32 bits fixed size encoding) could be considered an intelligent choice too since it's a direct Unicode mapping support. I selected UTF-8 on the basis of efficiency and compatibility with surrounding software:
      • UTF-8 while a bit more complex to convert from/to (i.e. slightly more costly to import and export CPU wise) is also far more compact than UTF-16 (and UCS-4) for a majority of the documents I see it used for right now (RPM RDF catalogs, advogato data, various configuration file formats, etc.) and the key point for today's computer architecture is efficient uses of caches. If one nearly double the memory requirement to store the same amount of data, this will trash caches (main memory/external caches/internal caches) and my take is that this harms the system far more than the CPU requirements needed for the conversion to UTF-8
      • Most of libxml2 version 1 users were using it with straight ASCII most of the time, doing the conversion with an internal encoding requiring all their code to be rewritten was a serious show-stopper for using UTF-16 or UCS-4.
      • UTF-8 is being used as the de-facto internal encoding standard for related code like the pango upcoming Gnome text widget, and a lot of Unix code (yet another place where Unix programmer base takes a different approach from Microsoft - they are using UTF-16)

    What does this mean in practice for the libxml2 user:

    • xmlChar, the libxml2 data type is a byte, those bytes must be assembled as UTF-8 valid strings. The proper way to terminate an xmlChar * string is simply to append 0 byte, as usual.
    • One just need to make sure that when using chars outside the ASCII set, the values has been properly converted to UTF-8

    How is it implemented ?

    Let's describe how all this works within libxml, basically the I18N (internationalization) support get triggered only during I/O operation, i.e. when reading a document or saving one. Let's look first at the reading sequence:

    1. when a document is processed, we usually don't know the encoding, a simple heuristic allows to detect UTF-16 and UCS-4 from encodings where the ASCII range (0-0x7F) maps with ASCII
    2. the xml declaration if available is parsed, including the encoding declaration. At that point, if the autodetected encoding is different from the one declared a call to xmlSwitchEncoding() is issued.
    3. If there is no encoding declaration, then the input has to be in either UTF-8 or UTF-16, if it is not then at some point when processing the input, the converter/checker of UTF-8 form will raise an encoding error. You may end-up with a garbled document, or no document at all ! Example:
      ~/XML -> ./xmllint err.xml 
      err.xml:1: error: Input is not proper UTF-8, indicate encoding !
      <très>là </très>
         ^
      err.xml:1: error: Bytes: 0xE8 0x73 0x3E 0x6C
      <très>là </très>
         ^
    4. xmlSwitchEncoding() does an encoding name lookup, canonicalize it, and then search the default registered encoding converters for that encoding. If it's not within the default set and iconv() support has been compiled it, it will ask iconv for such an encoder. If this fails then the parser will report an error and stops processing:
      ~/XML -> ./xmllint err2.xml 
      err2.xml:1: error: Unsupported encoding UnsupportedEnc
      <?xml version="1.0" encoding="UnsupportedEnc"?>
                                                   ^
    5. From that point the encoder processes progressively the input (it is plugged as a front-end to the I/O module) for that entity. It captures and converts on-the-fly the document to be parsed to UTF-8. The parser itself just does UTF-8 checking of this input and process it transparently. The only difference is that the encoding information has been added to the parsing context (more precisely to the input corresponding to this entity).
    6. The result (when using DOM) is an internal form completely in UTF-8 with just an encoding information on the document node.

    Ok then what happens when saving the document (assuming you collected/built an xmlDoc DOM like structure) ? It depends on the function called, xmlSaveFile() will just try to save in the original encoding, while xmlSaveFileTo() and xmlSaveFileEnc() can optionally save to a given encoding:

    1. if no encoding is given, libxml2 will look for an encoding value associated to the document and if it exists will try to save to that encoding,

      otherwise everything is written in the internal form, i.e. UTF-8

    2. so if an encoding was specified, either at the API level or on the document, libxml2 will again canonicalize the encoding name, lookup for a converter in the registered set or through iconv. If not found the function will return an error code
    3. the converter is placed before the I/O buffer layer, as another kind of buffer, then libxml2 will simply push the UTF-8 serialization to through that buffer, which will then progressively be converted and pushed onto the I/O layer.
    4. It is possible that the converter code fails on some input, for example trying to push an UTF-8 encoded Chinese character through the UTF-8 to ISO-8859-1 converter won't work. Since the encoders are progressive they will just report the error and the number of bytes converted, at that point libxml2 will decode the offending character, remove it from the buffer and replace it with the associated charRef encoding &#123; and resume the conversion. This guarantees that any document will be saved without losses (except for markup names where this is not legal, this is a problem in the current version, in practice avoid using non-ascii characters for tag or attribute names). A special "ascii" encoding name is used to save documents to a pure ascii form can be used when portability is really crucial

    Here are a few examples based on the same test document and assumin a terminal using ISO-8859-1 as the text encoding:

    ~/XML -> ./xmllint isolat1 
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <très>là</très>
    ~/XML -> ./xmllint --encode UTF-8 isolat1 
    <?xml version="1.0" encoding="UTF-8"?>
    <très>là  </très>
    ~/XML -> 

    The same processing is applied (and reuse most of the code) for HTML I18N processing. Looking up and modifying the content encoding is a bit more difficult since it is located in a <meta> tag under the <head>, so a couple of functions htmlGetMetaEncoding() and htmlSetMetaEncoding() have been provided. The parser also attempts to switch encoding on the fly when detecting such a tag on input. Except for that the processing is the same (and again reuses the same code).

    Default supported encodings

    libxml2 has a set of default converters for the following encodings (located in encoding.c):

    1. UTF-8 is supported by default (null handlers)
    2. UTF-16, both little and big endian
    3. ISO-Latin-1 (ISO-8859-1) covering most western languages
    4. ASCII, useful mostly for saving
    5. HTML, a specific handler for the conversion of UTF-8 to ASCII with HTML predefined entities like &copy; for the Copyright sign.

    More over when compiled on an Unix platform with iconv support the full set of encodings supported by iconv can be instantly be used by libxml. On a linux machine with glibc-2.1 the list of supported encodings and aliases fill 3 full pages, and include UCS-4, the full set of ISO-Latin encodings, and the various Japanese ones.

    To convert from the UTF-8 values returned from the API to another encoding then it is possible to use the function provided from the encoding module like UTF8Toisolat1, or use the POSIX iconv() API directly.

    Encoding aliases

    From 2.2.3, libxml2 has support to register encoding names aliases. The goal is to be able to parse document whose encoding is supported but where the name differs (for example from the default set of names accepted by iconv). The following functions allow to register and handle new aliases for existing encodings. Once registered libxml2 will automatically lookup the aliases when handling a document:

    • int xmlAddEncodingAlias(const char *name, const char *alias);
    • int xmlDelEncodingAlias(const char *alias);
    • const char * xmlGetEncodingAlias(const char *alias);
    • void xmlCleanupEncodingAliases(void);

    How to extend the existing support

    Well adding support for new encoding, or overriding one of the encoders (assuming it is buggy) should not be hard, just write input and output conversion routines to/from UTF-8, and register them using xmlNewCharEncodingHandler(name, xxxToUTF8, UTF8Toxxx), and they will be called automatically if the parser(s) encounter such an encoding name (register it uppercase, this will help). The description of the encoders, their arguments and expected return values are described in the encoding.h header.

    I/O Interfaces

    Table of Content:

    1. General overview
    2. The basic buffer type
    3. Input I/O handlers
    4. Output I/O handlers
    5. The entities loader
    6. Example of customized I/O

    General overview

    The module xmlIO.h provides the interfaces to the libxml2 I/O system. This consists of 4 main parts:

    • Entities loader, this is a routine which tries to fetch the entities (files) based on their PUBLIC and SYSTEM identifiers. The default loader don't look at the public identifier since libxml2 do not maintain a catalog. You can redefine you own entity loader by using xmlGetExternalEntityLoader() and xmlSetExternalEntityLoader(). Check the example.
    • Input I/O buffers which are a commodity structure used by the parser(s) input layer to handle fetching the information to feed the parser. This provides buffering and is also a placeholder where the encoding converters to UTF8 are piggy-backed.
    • Output I/O buffers are similar to the Input ones and fulfill similar task but when generating a serialization from a tree.
    • A mechanism to register sets of I/O callbacks and associate them with specific naming schemes like the protocol part of the URIs.

      This affect the default I/O operations and allows to use specific I/O handlers for certain names.

    The general mechanism used when loading http://rpmfind.net/xml.html for example in the HTML parser is the following:

    1. The default entity loader calls xmlNewInputFromFile() with the parsing context and the URI string.
    2. the URI string is checked against the existing registered handlers using their match() callback function, if the HTTP module was compiled in, it is registered and its match() function will succeeds
    3. the open() function of the handler is called and if successful will return an I/O Input buffer
    4. the parser will the start reading from this buffer and progressively fetch information from the resource, calling the read() function of the handler until the resource is exhausted
    5. if an encoding change is detected it will be installed on the input buffer, providing buffering and efficient use of the conversion routines
    6. once the parser has finished, the close() function of the handler is called once and the Input buffer and associated resources are deallocated.

    The user defined callbacks are checked first to allow overriding of the default libxml2 I/O routines.

    The basic buffer type

    All the buffer manipulation handling is done using the xmlBuffer type define in tree.h which is a resizable memory buffer. The buffer allocation strategy can be selected to be either best-fit or use an exponential doubling one (CPU vs. memory use trade-off). The values are XML_BUFFER_ALLOC_EXACT and XML_BUFFER_ALLOC_DOUBLEIT, and can be set individually or on a system wide basis using xmlBufferSetAllocationScheme(). A number of functions allows to manipulate buffers with names starting with the xmlBuffer... prefix.

    Input I/O handlers

    An Input I/O handler is a simple structure xmlParserInputBuffer containing a context associated to the resource (file descriptor, or pointer to a protocol handler), the read() and close() callbacks to use and an xmlBuffer. And extra xmlBuffer and a charset encoding handler are also present to support charset conversion when needed.

    Output I/O handlers

    An Output handler xmlOutputBuffer is completely similar to an Input one except the callbacks are write() and close().

    The entities loader

    The entity loader resolves requests for new entities and create inputs for the parser. Creating an input from a filename or an URI string is done through the xmlNewInputFromFile() routine. The default entity loader do not handle the PUBLIC identifier associated with an entity (if any). So it just calls xmlNewInputFromFile() with the SYSTEM identifier (which is mandatory in XML).

    If you want to hook up a catalog mechanism then you simply need to override the default entity loader, here is an example:

    #include <libxml/xmlIO.h>
    
    xmlExternalEntityLoader defaultLoader = NULL;
    
    xmlParserInputPtr
    xmlMyExternalEntityLoader(const char *URL, const char *ID,
                                   xmlParserCtxtPtr ctxt) {
        xmlParserInputPtr ret;
        const char *fileID = NULL;
        /* lookup for the fileID depending on ID */
    
        ret = xmlNewInputFromFile(ctxt, fileID);
        if (ret != NULL)
            return(ret);
        if (defaultLoader != NULL)
            ret = defaultLoader(URL, ID, ctxt);
        return(ret);
    }
    
    int main(..) {
        ...
    
        /*
         * Install our own entity loader
         */
        defaultLoader = xmlGetExternalEntityLoader();
        xmlSetExternalEntityLoader(xmlMyExternalEntityLoader);
    
        ...
    }

    Example of customized I/O

    This example come from a real use case, xmlDocDump() closes the FILE * passed by the application and this was a problem. The solution was to redefine a new output handler with the closing call deactivated:

    1. First define a new I/O output allocator where the output don't close the file:
      xmlOutputBufferPtr
      xmlOutputBufferCreateOwn(FILE *file, xmlCharEncodingHandlerPtr encoder) {
          xmlOutputBufferPtr ret;
          
          if (xmlOutputCallbackInitialized == 0)
              xmlRegisterDefaultOutputCallbacks();
      
          if (file == NULL) return(NULL);
          ret = xmlAllocOutputBuffer(encoder);
          if (ret != NULL) {
              ret->context = file;
              ret->writecallback = xmlFileWrite;
              ret->closecallback = NULL;  /* No close callback */
          }
          return(ret);
      } 
    2. And then use it to save the document:
      FILE *f;
      xmlOutputBufferPtr output;
      xmlDocPtr doc;
      int res;
      
      f = ...
      doc = ....
      
      output = xmlOutputBufferCreateOwn(f, NULL);
      res = xmlSaveFileTo(output, doc, NULL);
          

    Catalog support

    Table of Content:

    1. General overview
    2. The definition
    3. Using catalogs
    4. Some examples
    5. How to tune catalog usage
    6. How to debug catalog processing
    7. How to create and maintain catalogs
    8. The implementor corner quick review of the API
    9. Other resources

    General overview

    What is a catalog? Basically it's a lookup mechanism used when an entity (a file or a remote resource) references another entity. The catalog lookup is inserted between the moment the reference is recognized by the software (XML parser, stylesheet processing, or even images referenced for inclusion in a rendering) and the time where loading that resource is actually started.

    It is basically used for 3 things:

    • mapping from "logical" names, the public identifiers and a more concrete name usable for download (and URI). For example it can associate the logical name

      "-//OASIS//DTD DocBook XML V4.1.2//EN"

      of the DocBook 4.1.2 XML DTD with the actual URL where it can be downloaded

      http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd

    • remapping from a given URL to another one, like an HTTP indirection saying that

      "http://www.oasis-open.org/committes/tr.xsl"

      should really be looked at

      "http://www.oasis-open.org/committes/entity/stylesheets/base/tr.xsl"

    • providing a local cache mechanism allowing to load the entities associated to public identifiers or remote resources, this is a really important feature for any significant deployment of XML or SGML since it allows to avoid the aleas and delays associated to fetching remote resources.

    The definitions

    Libxml, as of 2.4.3 implements 2 kind of catalogs:

    • the older SGML catalogs, the official spec is SGML Open Technical Resolution TR9401:1997, but is better understood by reading the SP Catalog page from James Clark. This is relatively old and not the preferred mode of operation of libxml.
    • XML Catalogs is far more flexible, more recent, uses an XML syntax and should scale quite better. This is the default option of libxml.

    Using catalog

    In a normal environment libxml2 will by default check the presence of a catalog in /etc/xml/catalog, and assuming it has been correctly populated, the processing is completely transparent to the document user. To take a concrete example, suppose you are authoring a DocBook document, this one starts with the following DOCTYPE definition:

    <?xml version='1.0'?>
    <!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V3.1.4//EN"
              "http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd">

    When validating the document with libxml, the catalog will be automatically consulted to lookup the public identifier "-//Norman Walsh//DTD DocBk XML V3.1.4//EN" and the system identifier "http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd", and if these entities have been installed on your system and the catalogs actually point to them, libxml will fetch them from the local disk.

    Note: Really don't use this DOCTYPE example it's a really old version, but is fine as an example.

    Libxml2 will check the catalog each time that it is requested to load an entity, this includes DTD, external parsed entities, stylesheets, etc ... If your system is correctly configured all the authoring phase and processing should use only local files, even if your document stays portable because it uses the canonical public and system ID, referencing the remote document.

    Some examples:

    Here is a couple of fragments from XML Catalogs used in libxml2 early regression tests in test/catalogs :

    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC 
       "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
       "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
      <public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN"
       uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/>
    ...

    This is the beginning of a catalog for DocBook 4.1.2, XML Catalogs are written in XML, there is a specific namespace for catalog elements "urn:oasis:names:tc:entity:xmlns:xml:catalog". The first entry in this catalog is a public mapping it allows to associate a Public Identifier with an URI.

    ...
        <rewriteSystem systemIdStartString="http://www.oasis-open.org/docbook/"
                       rewritePrefix="file:///usr/share/xml/docbook/"/>
    ...

    A rewriteSystem is a very powerful instruction, it says that any URI starting with a given prefix should be looked at another URI constructed by replacing the prefix with an new one. In effect this acts like a cache system for a full area of the Web. In practice it is extremely useful with a file prefix if you have installed a copy of those resources on your local system.

    ...
    <delegatePublic publicIdStartString="-//OASIS//DTD XML Catalog //"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegatePublic publicIdStartString="-//OASIS//ENTITIES DocBook XML"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegatePublic publicIdStartString="-//OASIS//DTD DocBook XML"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegateURI uriStartString="http://www.oasis-open.org/docbook/"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    ...

    Delegation is the core features which allows to build a tree of catalogs, easier to maintain than a single catalog, based on Public Identifier, System Identifier or URI prefixes it instructs the catalog software to look up entries in another resource. This feature allow to build hierarchies of catalogs, the set of entries presented should be sufficient to redirect the resolution of all DocBook references to the specific catalog in /usr/share/xml/docbook.xml this one in turn could delegate all references for DocBook 4.2.1 to a specific catalog installed at the same time as the DocBook resources on the local machine.

    How to tune catalog usage:

    The user can change the default catalog behaviour by redirecting queries to its own set of catalogs, this can be done by setting the XML_CATALOG_FILES environment variable to a list of catalogs, an empty one should deactivate loading the default /etc/xml/catalog default catalog

    How to debug catalog processing:

    Setting up the XML_DEBUG_CATALOG environment variable will make libxml2 output debugging information for each catalog operations, for example:

    orchis:~/XML -> xmllint --memory --noout test/ent2
    warning: failed to load external entity "title.xml"
    orchis:~/XML -> export XML_DEBUG_CATALOG=
    orchis:~/XML -> xmllint --memory --noout test/ent2
    Failed to parse catalog /etc/xml/catalog
    Failed to parse catalog /etc/xml/catalog
    warning: failed to load external entity "title.xml"
    Catalogs cleanup
    orchis:~/XML -> 

    The test/ent2 references an entity, running the parser from memory makes the base URI unavailable and the the "title.xml" entity cannot be loaded. Setting up the debug environment variable allows to detect that an attempt is made to load the /etc/xml/catalog but since it's not present the resolution fails.

    But the most advanced way to debug XML catalog processing is to use the xmlcatalog command shipped with libxml2, it allows to load catalogs and make resolution queries to see what is going on. This is also used for the regression tests:

    orchis:~/XML -> ./xmlcatalog test/catalogs/docbook.xml \
                       "-//OASIS//DTD DocBook XML V4.1.2//EN"
    http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
    orchis:~/XML -> 

    For debugging what is going on, adding one -v flags increase the verbosity level to indicate the processing done (adding a second flag also indicate what elements are recognized at parsing):

    orchis:~/XML -> ./xmlcatalog -v test/catalogs/docbook.xml \
                       "-//OASIS//DTD DocBook XML V4.1.2//EN"
    Parsing catalog test/catalogs/docbook.xml's content
    Found public match -//OASIS//DTD DocBook XML V4.1.2//EN
    http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
    Catalogs cleanup
    orchis:~/XML -> 

    A shell interface is also available to debug and process multiple queries (and for regression tests):

    orchis:~/XML -> ./xmlcatalog -shell test/catalogs/docbook.xml \
                       "-//OASIS//DTD DocBook XML V4.1.2//EN"
    > help   
    Commands available:
    public PublicID: make a PUBLIC identifier lookup
    system SystemID: make a SYSTEM identifier lookup
    resolve PublicID SystemID: do a full resolver lookup
    add 'type' 'orig' 'replace' : add an entry
    del 'values' : remove values
    dump: print the current catalog state
    debug: increase the verbosity level
    quiet: decrease the verbosity level
    exit:  quit the shell
    > public "-//OASIS//DTD DocBook XML V4.1.2//EN"
    http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
    > quit
    orchis:~/XML -> 

    This should be sufficient for most debugging purpose, this was actually used heavily to debug the XML Catalog implementation itself.

    How to create and maintain catalogs:

    Basically XML Catalogs are XML files, you can either use XML tools to manage them or use xmlcatalog for this. The basic step is to create a catalog the -create option provide this facility:

    orchis:~/XML -> ./xmlcatalog --create tst.xml
    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
             "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/>
    orchis:~/XML -> 

    By default xmlcatalog does not overwrite the original catalog and save the result on the standard output, this can be overridden using the -noout option. The -add command allows to add entries in the catalog:

    orchis:~/XML -> ./xmlcatalog --noout --create --add "public" \
      "-//OASIS//DTD DocBook XML V4.1.2//EN" \
      http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd tst.xml
    orchis:~/XML -> cat tst.xml
    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" \
      "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN"
            uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/>
    </catalog>
    orchis:~/XML -> 

    The -add option will always take 3 parameters even if some of the XML Catalog constructs (like nextCatalog) will have only a single argument, just pass a third empty string, it will be ignored.

    Similarly the -del option remove matching entries from the catalog:

    orchis:~/XML -> ./xmlcatalog --del \
      "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" tst.xml
    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
        "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/>
    orchis:~/XML -> 

    The catalog is now empty. Note that the matching of -del is exact and would have worked in a similar fashion with the Public ID string.

    This is rudimentary but should be sufficient to manage a not too complex catalog tree of resources.

    The implementor corner quick review of the API:

    First, and like for every other module of libxml, there is an automatically generated API page for catalog support.

    The header for the catalog interfaces should be included as:

    #include <libxml/catalog.h>

    The API is voluntarily kept very simple. First it is not obvious that applications really need access to it since it is the default behaviour of libxml2 (Note: it is possible to completely override libxml2 default catalog by using xmlSetExternalEntityLoader to plug an application specific resolver).

    Basically libxml2 support 2 catalog lists:

    • the default one, global shared by all the application
    • a per-document catalog, this one is built if the document uses the oasis-xml-catalog PIs to specify its own catalog list, it is associated to the parser context and destroyed when the parsing context is destroyed.

    the document one will be used first if it exists.

    Initialization routines:

    xmlInitializeCatalog(), xmlLoadCatalog() and xmlLoadCatalogs() should be used at startup to initialize the catalog, if the catalog should be initialized with specific values xmlLoadCatalog() or xmlLoadCatalogs() should be called before xmlInitializeCatalog() which would otherwise do a default initialization first.

    The xmlCatalogAddLocal() call is used by the parser to grow the document own catalog list if needed.

    Preferences setup:

    The XML Catalog spec requires the possibility to select default preferences between public and system delegation, xmlCatalogSetDefaultPrefer() allows this, xmlCatalogSetDefaults() and xmlCatalogGetDefaults() allow to control if XML Catalogs resolution should be forbidden, allowed for global catalog, for document catalog or both, the default is to allow both.

    And of course xmlCatalogSetDebug() allows to generate debug messages (through the xmlGenericError() mechanism).

    Querying routines:

    xmlCatalogResolve(), xmlCatalogResolveSystem(), xmlCatalogResolvePublic() and xmlCatalogResolveURI() are relatively explicit if you read the XML Catalog specification they correspond to section 7 algorithms, they should also work if you have loaded an SGML catalog with a simplified semantic.

    xmlCatalogLocalResolve() and xmlCatalogLocalResolveURI() are the same but operate on the document catalog list

    Cleanup and Miscellaneous:

    xmlCatalogCleanup() free-up the global catalog, xmlCatalogFreeLocal() is the per-document equivalent.

    xmlCatalogAdd() and xmlCatalogRemove() are used to dynamically modify the first catalog in the global list, and xmlCatalogDump() allows to dump a catalog state, those routines are primarily designed for xmlcatalog, I'm not sure that exposing more complex interfaces (like navigation ones) would be really useful.

    The xmlParseCatalogFile() is a function used to load XML Catalog files, it's similar as xmlParseFile() except it bypass all catalog lookups, it's provided because this functionality may be useful for client tools.

    threaded environments:

    Since the catalog tree is built progressively, some care has been taken to try to avoid troubles in multithreaded environments. The code is now thread safe assuming that the libxml2 library has been compiled with threads support.

    Other resources

    The XML Catalog specification is relatively recent so there isn't much literature to point at:

    • You can find a good rant from Norm Walsh about the need for catalogs, it provides a lot of context information even if I don't agree with everything presented. Norm also wrote a more recent article XML entities and URI resolvers describing them.
    • An old XML catalog proposal from John Cowan
    • The Resource Directory Description Language (RDDL) another catalog system but more oriented toward providing metadata for XML namespaces.
    • the page from the OASIS Technical Committee on Entity Resolution who maintains XML Catalog, you will find pointers to the specification update, some background and pointers to others tools providing XML Catalog support
    • There is a shell script to generate XML Catalogs for DocBook 4.1.2 . If it can write to the /etc/xml/ directory, it will set-up /etc/xml/catalog and /etc/xml/docbook based on the resources found on the system. Otherwise it will just create ~/xmlcatalog and ~/dbkxmlcatalog and doing:

      export XML_CATALOG_FILES=$HOME/xmlcatalog

      should allow to process DocBook documentations without requiring network accesses for the DTD or stylesheets

    • I have uploaded a small tarball containing XML Catalogs for DocBook 4.1.2 which seems to work fine for me too
    • The xmlcatalog manual page

    If you have suggestions for corrections or additions, simply contact me:

    The parser interfaces

    This section is directly intended to help programmers getting bootstrapped using the XML tollkit from the C language. It is not intended to be extensive. I hope the automatically generated documents will provide the completeness required, but as a separate set of documents. The interfaces of the XML parser are by principle low level, Those interested in a higher level API should look at DOM.

    The parser interfaces for XML are separated from the HTML parser interfaces. Let's have a look at how the XML parser can be called:

    Invoking the parser : the pull method

    Usually, the first thing to do is to read an XML input. The parser accepts documents either from in-memory strings or from files. The functions are defined in "parser.h":

    xmlDocPtr xmlParseMemory(char *buffer, int size);

    Parse a null-terminated string containing the document.

    xmlDocPtr xmlParseFile(const char *filename);

    Parse an XML document contained in a (possibly compressed) file.

    The parser returns a pointer to the document structure (or NULL in case of failure).

    Invoking the parser: the push method

    In order for the application to keep the control when the document is being fetched (which is common for GUI based programs) libxml2 provides a push interface, too, as of version 1.8.3. Here are the interface functions:

    xmlParserCtxtPtr xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax,
                                             void *user_data,
                                             const char *chunk,
                                             int size,
                                             const char *filename);
    int              xmlParseChunk          (xmlParserCtxtPtr ctxt,
                                             const char *chunk,
                                             int size,
                                             int terminate);

    and here is a simple example showing how to use the interface:

                FILE *f;
    
                f = fopen(filename, "r");
                if (f != NULL) {
                    int res, size = 1024;
                    char chars[1024];
                    xmlParserCtxtPtr ctxt;
    
                    res = fread(chars, 1, 4, f);
                    if (res > 0) {
                        ctxt = xmlCreatePushParserCtxt(NULL, NULL,
                                    chars, res, filename);
                        while ((res = fread(chars, 1, size, f)) > 0) {
                            xmlParseChunk(ctxt, chars, res, 0);
                        }
                        xmlParseChunk(ctxt, chars, 0, 1);
                        doc = ctxt->myDoc;
                        xmlFreeParserCtxt(ctxt);
                    }
                }

    The HTML parser embedded into libxml2 also has a push interface; the functions are just prefixed by "html" rather than "xml".

    Invoking the parser: the SAX interface

    The tree-building interface makes the parser memory-hungry, first loading the document in memory and then building the tree itself. Reading a document without building the tree is possible using the SAX interfaces (see SAX.h and James Henstridge's documentation). Note also that the push interface can be limited to SAX: just use the two first arguments of xmlCreatePushParserCtxt().

    Building a tree from scratch

    The other way to get an XML tree in memory is by building it. Basically there is a set of functions dedicated to building new elements. (These are also described in <libxml/tree.h>.) For example, here is a piece of code that produces the XML document used in the previous examples:

        #include <libxml/tree.h>
        xmlDocPtr doc;
        xmlNodePtr tree, subtree;
    
        doc = xmlNewDoc("1.0");
        doc->children = xmlNewDocNode(doc, NULL, "EXAMPLE", NULL);
        xmlSetProp(doc->children, "prop1", "gnome is great");
        xmlSetProp(doc->children, "prop2", "& linux too");
        tree = xmlNewChild(doc->children, NULL, "head", NULL);
        subtree = xmlNewChild(tree, NULL, "title", "Welcome to Gnome");
        tree = xmlNewChild(doc->children, NULL, "chapter", NULL);
        subtree = xmlNewChild(tree, NULL, "title", "The Linux adventure");
        subtree = xmlNewChild(tree, NULL, "p", "bla bla bla ...");
        subtree = xmlNewChild(tree, NULL, "image", NULL);
        xmlSetProp(subtree, "href", "linus.gif");

    Not really rocket science ...

    Traversing the tree

    Basically by including "tree.h" your code has access to the internal structure of all the elements of the tree. The names should be somewhat simple like parent, children, next, prev, properties, etc... For example, still with the previous example:

    doc->children->children->children

    points to the title element,

    doc->children->children->next->children->children

    points to the text node containing the chapter title "The Linux adventure".

    NOTE: XML allows PIs and comments to be present before the document root, so doc->children may point to an element which is not the document Root Element; a function xmlDocGetRootElement() was added for this purpose.

    Modifying the tree

    Functions are provided for reading and writing the document content. Here is an excerpt from the tree API:

    xmlAttrPtr xmlSetProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value);

    This sets (or changes) an attribute carried by an ELEMENT node. The value can be NULL.

    const xmlChar *xmlGetProp(xmlNodePtr node, const xmlChar *name);

    This function returns a pointer to new copy of the property content. Note that the user must deallocate the result.

    Two functions are provided for reading and writing the text associated with elements:

    xmlNodePtr xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value);

    This function takes an "external" string and converts it to one text node or possibly to a list of entity and text nodes. All non-predefined entity references like &Gnome; will be stored internally as entity nodes, hence the result of the function may not be a single node.

    xmlChar *xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int inLine);

    This function is the inverse of xmlStringGetNodeList(). It generates a new string containing the content of the text and entity nodes. Note the extra argument inLine. If this argument is set to 1, the function will expand entity references. For example, instead of returning the &Gnome; XML encoding in the string, it will substitute it with its value (say, "GNU Network Object Model Environment").

    Saving a tree

    Basically 3 options are possible:

    void xmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size);

    Returns a buffer into which the document has been saved.

    extern void xmlDocDump(FILE *f, xmlDocPtr doc);

    Dumps a document to an open file descriptor.

    int xmlSaveFile(const char *filename, xmlDocPtr cur);

    Saves the document to a file. In this case, the compression interface is triggered if it has been turned on.

    Compression

    The library transparently handles compression when doing file-based accesses. The level of compression on saves can be turned on either globally or individually for one file:

    int xmlGetDocCompressMode (xmlDocPtr doc);

    Gets the document compression ratio (0-9).

    void xmlSetDocCompressMode (xmlDocPtr doc, int mode);

    Sets the document compression ratio.

    int xmlGetCompressMode(void);

    Gets the default compression ratio.

    void xmlSetCompressMode(int mode);

    Sets the default compression ratio.

    Entities or no entities

    Entities in principle are similar to simple C macros. An entity defines an abbreviation for a given string that you can reuse many times throughout the content of your document. Entities are especially useful when a given string may occur frequently within a document, or to confine the change needed to a document to a restricted area in the internal subset of the document (at the beginning). Example:

    1 <?xml version="1.0"?>
    2 <!DOCTYPE EXAMPLE SYSTEM "example.dtd" [
    3 <!ENTITY xml "Extensible Markup Language">
    4 ]>
    5 <EXAMPLE>
    6    &xml;
    7 </EXAMPLE>

    Line 3 declares the xml entity. Line 6 uses the xml entity, by prefixing its name with '&' and following it by ';' without any spaces added. There are 5 predefined entities in libxml2 allowing you to escape characters with predefined meaning in some parts of the xml document content: &lt; for the character '<', &gt; for the character '>', &apos; for the character ''', &quot; for the character '"', and &amp; for the character '&'.

    One of the problems related to entities is that you may want the parser to substitute an entity's content so that you can see the replacement text in your application. Or you may prefer to keep entity references as such in the content to be able to save the document back without losing this usually precious information (if the user went through the pain of explicitly defining entities, he may have a a rather negative attitude if you blindly substitute them as saving time). The xmlSubstituteEntitiesDefault() function allows you to check and change the behaviour, which is to not substitute entities by default.

    Here is the DOM tree built by libxml2 for the previous document in the default case:

    /gnome/src/gnome-xml -> ./xmllint --debug test/ent1
    DOCUMENT
    version=1.0
       ELEMENT EXAMPLE
         TEXT
         content=
         ENTITY_REF
           INTERNAL_GENERAL_ENTITY xml
           content=Extensible Markup Language
         TEXT
         content=

    And here is the result when substituting entities:

    /gnome/src/gnome-xml -> ./tester --debug --noent test/ent1
    DOCUMENT
    version=1.0
       ELEMENT EXAMPLE
         TEXT
         content=     Extensible Markup Language

    So, entities or no entities? Basically, it depends on your use case. I suggest that you keep the non-substituting default behaviour and avoid using entities in your XML document or data if you are not willing to handle the entity references elements in the DOM tree.

    Note that at save time libxml2 enforces the conversion of the predefined entities where necessary to prevent well-formedness problems, and will also transparently replace those with chars (i.e. it will not generate entity reference elements in the DOM tree or call the reference() SAX callback when finding them in the input).

    WARNING: handling entities on top of the libxml2 SAX interface is difficult!!! If you plan to use non-predefined entities in your documents, then the learning curve to handle then using the SAX API may be long. If you plan to use complex documents, I strongly suggest you consider using the DOM interface instead and let libxml deal with the complexity rather than trying to do it yourself.

    Namespaces

    The libxml2 library implements XML namespaces support by recognizing namespace constructs in the input, and does namespace lookup automatically when building the DOM tree. A namespace declaration is associated with an in-memory structure and all elements or attributes within that namespace point to it. Hence testing the namespace is a simple and fast equality operation at the user level.

    I suggest that people using libxml2 use a namespace, and declare it in the root element of their document as the default namespace. Then they don't need to use the prefix in the content but we will have a basis for future semantic refinement and merging of data from different sources. This doesn't increase the size of the XML output significantly, but significantly increases its value in the long-term. Example:

    <mydoc xmlns="http://mydoc.example.org/schemas/">
       <elem1>...</elem1>
       <elem2>...</elem2>
    </mydoc>

    The namespace value has to be an absolute URL, but the URL doesn't have to point to any existing resource on the Web. It will bind all the element and attributes with that URL. I suggest to use an URL within a domain you control, and that the URL should contain some kind of version information if possible. For example, "http://www.gnome.org/gnumeric/1.0/" is a good namespace scheme.

    Then when you load a file, make sure that a namespace carrying the version-independent prefix is installed on the root element of your document, and if the version information don't match something you know, warn the user and be liberal in what you accept as the input. Also do *not* try to base namespace checking on the prefix value. <foo:text> may be exactly the same as <bar:text> in another document. What really matters is the URI associated with the element or the attribute, not the prefix string (which is just a shortcut for the full URI). In libxml, element and attributes have an ns field pointing to an xmlNs structure detailing the namespace prefix and its URI.

    @@Interfaces@@

    xmlNodePtr node;
    if(!strncmp(node->name,"mytag",5)
      && node->ns
      && !strcmp(node->ns->href,"http://www.mysite.com/myns/1.0")) {
      ...
    }

    Usually people object to using namespaces together with validity checking. I will try to make sure that using namespaces won't break validity checking, so even if you plan to use or currently are using validation I strongly suggest adding namespaces to your document. A default namespace scheme xmlns="http://...." should not break validity even on less flexible parsers. Using namespaces to mix and differentiate content coming from multiple DTDs will certainly break current validation schemes. To check such documents one needs to use schema-validation, which is supported in libxml2 as well. See relagx-ng and w3c-schema.

    Upgrading 1.x code

    Incompatible changes:

    Version 2 of libxml2 is the first version introducing serious backward incompatible changes. The main goals were:

    • a general cleanup. A number of mistakes inherited from the very early versions couldn't be changed due to compatibility constraints. Example the "childs" element in the nodes.
    • Uniformization of the various nodes, at least for their header and link parts (doc, parent, children, prev, next), the goal is a simpler programming model and simplifying the task of the DOM implementors.
    • better conformances to the XML specification, for example version 1.x had an heuristic to try to detect ignorable white spaces. As a result the SAX event generated were ignorableWhitespace() while the spec requires character() in that case. This also mean that a number of DOM node containing blank text may populate the DOM tree which were not present before.

    How to fix libxml-1.x code:

    So client code of libxml designed to run with version 1.x may have to be changed to compile against version 2.x of libxml. Here is a list of changes that I have collected, they may not be sufficient, so in case you find other change which are required, drop me a mail:

    1. The package name have changed from libxml to libxml2, the library name is now -lxml2 . There is a new xml2-config script which should be used to select the right parameters libxml2
    2. Node childs field has been renamed children so s/childs/children/g should be applied (probability of having "childs" anywhere else is close to 0+
    3. The document don't have anymore a root element it has been replaced by children and usually you will get a list of element here. For example a Dtd element for the internal subset and it's declaration may be found in that list, as well as processing instructions or comments found before or after the document root element. Use xmlDocGetRootElement(doc) to get the root element of a document. Alternatively if you are sure to not reference DTDs nor have PIs or comments before or after the root element s/->root/->children/g will probably do it.
    4. The white space issue, this one is more complex, unless special case of validating parsing, the line breaks and spaces usually used for indenting and formatting the document content becomes significant. So they are reported by SAX and if your using the DOM tree, corresponding nodes are generated. Too approach can be taken:
      1. lazy one, use the compatibility call xmlKeepBlanksDefault(0) but be aware that you are relying on a special (and possibly broken) set of heuristics of libxml to detect ignorable blanks. Don't complain if it breaks or make your application not 100% clean w.r.t. to it's input.
      2. the Right Way: change you code to accept possibly insignificant blanks characters, or have your tree populated with weird blank text nodes. You can spot them using the commodity function xmlIsBlankNode(node) returning 1 for such blank nodes.

      Note also that with the new default the output functions don't add any extra indentation when saving a tree in order to be able to round trip (read and save) without inflating the document with extra formatting chars.

    5. The include path has changed to $prefix/libxml/ and the includes themselves uses this new prefix in includes instructions... If you are using (as expected) the
      xml2-config --cflags

      output to generate you compile commands this will probably work out of the box

    6. xmlDetectCharEncoding takes an extra argument indicating the length in byte of the head of the document available for character detection.

    Ensuring both libxml-1.x and libxml-2.x compatibility

    Two new version of libxml (1.8.11) and libxml2 (2.3.4) have been released to allow smooth upgrade of existing libxml v1code while retaining compatibility. They offers the following:

    1. similar include naming, one should use #include<libxml/...> in both cases.
    2. similar identifiers defined via macros for the child and root fields: respectively xmlChildrenNode and xmlRootNode
    3. a new macro LIBXML_TEST_VERSION which should be inserted once in the client code

    So the roadmap to upgrade your existing libxml applications is the following:

    1. install the libxml-1.8.8 (and libxml-devel-1.8.8) packages
    2. find all occurrences where the xmlDoc root field is used and change it to xmlRootNode
    3. similarly find all occurrences where the xmlNode childs field is used and change it to xmlChildrenNode
    4. add a LIBXML_TEST_VERSION macro somewhere in your main() or in the library init entry point
    5. Recompile, check compatibility, it should still work
    6. Change your configure script to look first for xml2-config and fall back using xml-config . Use the --cflags and --libs output of the command as the Include and Linking parameters needed to use libxml.
    7. install libxml2-2.3.x and libxml2-devel-2.3.x (libxml-1.8.y and libxml-devel-1.8.y can be kept simultaneously)
    8. remove your config.cache, relaunch your configuration mechanism, and recompile, if steps 2 and 3 were done right it should compile as-is
    9. Test that your application is still running correctly, if not this may be due to extra empty nodes due to formating spaces being kept in libxml2 contrary to libxml1, in that case insert xmlKeepBlanksDefault(1) in your code before calling the parser (next to LIBXML_TEST_VERSION is a fine place).

    Following those steps should work. It worked for some of my own code.

    Let me put some emphasis on the fact that there is far more changes from libxml 1.x to 2.x than the ones you may have to patch for. The overall code has been considerably cleaned up and the conformance to the XML specification has been drastically improved too. Don't take those changes as an excuse to not upgrade, it may cost a lot on the long term ...

    Thread safety

    Starting with 2.4.7, libxml2 makes provisions to ensure that concurrent threads can safely work in parallel parsing different documents. There is however a couple of things to do to ensure it:

    • configure the library accordingly using the --with-threads options
    • call xmlInitParser() in the "main" thread before using any of the libxml2 API (except possibly selecting a different memory allocator)

    Note that the thread safety cannot be ensured for multiple threads sharing the same document, the locking must be done at the application level, libxml exports a basic mutex and reentrant mutexes API in <libxml/threads.h>. The parts of the library checked for thread safety are:

    • concurrent loading
    • file access resolution
    • catalog access
    • catalog building
    • entities lookup/accesses
    • validation
    • global variables per-thread override
    • memory handling

    XPath has been tested for threaded usage on non-modified document for example when using libxslt, but make 100% sure the documents are accessed read-only !

    DOM Principles

    DOM stands for the Document Object Model; this is an API for accessing XML or HTML structured documents. Native support for DOM in Gnome is on the way (module gnome-dom), and will be based on gnome-xml. This will be a far cleaner interface to manipulate XML files within Gnome since it won't expose the internal structure.

    The current DOM implementation on top of libxml2 is the gdome2 Gnome module, this is a full DOM interface, thanks to Paolo Casarini, check the Gdome2 homepage for more information.

    A real example

    Here is a real size example, where the actual content of the application data is not kept in the DOM tree but uses internal structures. It is based on a proposal to keep a database of jobs related to Gnome, with an XML based storage structure. Here is an XML encoded jobs base:

    <?xml version="1.0"?>
    <gjob:Helping xmlns:gjob="http://www.gnome.org/some-location">
      <gjob:Jobs>
    
        <gjob:Job>
          <gjob:Project ID="3"/>
          <gjob:Application>GBackup</gjob:Application>
          <gjob:Category>Development</gjob:Category>
    
          <gjob:Update>
            <gjob:Status>Open</gjob:Status>
            <gjob:Modified>Mon, 07 Jun 1999 20:27:45 -0400 MET DST</gjob:Modified>
            <gjob:Salary>USD 0.00</gjob:Salary>
          </gjob:Update>
    
          <gjob:Developers>
            <gjob:Developer>
            </gjob:Developer>
          </gjob:Developers>
    
          <gjob:Contact>
            <gjob:Person>Nathan Clemons</gjob:Person>
            <gjob:Email>nathan@windsofstorm.net</gjob:Email>
            <gjob:Company>
            </gjob:Company>
            <gjob:Organisation>
            </gjob:Organisation>
            <gjob:Webpage>
            </gjob:Webpage>
            <gjob:Snailmail>
            </gjob:Snailmail>
            <gjob:Phone>
            </gjob:Phone>
          </gjob:Contact>
    
          <gjob:Requirements>
          The program should be released as free software, under the GPL.
          </gjob:Requirements>
    
          <gjob:Skills>
          </gjob:Skills>
    
          <gjob:Details>
          A GNOME based system that will allow a superuser to configure 
          compressed and uncompressed files and/or file systems to be backed 
          up with a supported media in the system.  This should be able to 
          perform via find commands generating a list of files that are passed 
          to tar, dd, cpio, cp, gzip, etc., to be directed to the tape machine 
          or via operations performed on the filesystem itself. Email 
          notification and GUI status display very important.
          </gjob:Details>
    
        </gjob:Job>
    
      </gjob:Jobs>
    </gjob:Helping>

    While loading the XML file into an internal DOM tree is a matter of calling only a couple of functions, browsing the tree to gather the data and generate the internal structures is harder, and more error prone.

    The suggested principle is to be tolerant with respect to the input structure. For example, the ordering of the attributes is not significant, the XML specification is clear about it. It's also usually a good idea not to depend on the order of the children of a given node, unless it really makes things harder. Here is some code to parse the information for a person:

    /*
     * A person record
     */
    typedef struct person {
        char *name;
        char *email;
        char *company;
        char *organisation;
        char *smail;
        char *webPage;
        char *phone;
    } person, *personPtr;
    
    /*
     * And the code needed to parse it
     */
    personPtr parsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
        personPtr ret = NULL;
    
    DEBUG("parsePerson\n");
        /*
         * allocate the struct
         */
        ret = (personPtr) malloc(sizeof(person));
        if (ret == NULL) {
            fprintf(stderr,"out of memory\n");
            return(NULL);
        }
        memset(ret, 0, sizeof(person));
    
        /* We don't care what the top level element name is */
        cur = cur->xmlChildrenNode;
        while (cur != NULL) {
            if ((!strcmp(cur->name, "Person")) && (cur->ns == ns))
                ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
            if ((!strcmp(cur->name, "Email")) && (cur->ns == ns))
                ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
            cur = cur->next;
        }
    
        return(ret);
    }

    Here are a couple of things to notice:

    • Usually a recursive parsing style is the more convenient one: XML data is by nature subject to repetitive constructs and usually exhibits highly structured patterns.
    • The two arguments of type xmlDocPtr and xmlNsPtr, i.e. the pointer to the global XML document and the namespace reserved to the application. Document wide information are needed for example to decode entities and it's a good coding practice to define a namespace for your application set of data and test that the element and attributes you're analyzing actually pertains to your application space. This is done by a simple equality test (cur->ns == ns).
    • To retrieve text and attributes value, you can use the function xmlNodeListGetString to gather all the text and entity reference nodes generated by the DOM output and produce an single text string.

    Here is another piece of code used to parse another level of the structure:

    #include <libxml/tree.h>
    /*
     * a Description for a Job
     */
    typedef struct job {
        char *projectID;
        char *application;
        char *category;
        personPtr contact;
        int nbDevelopers;
        personPtr developers[100]; /* using dynamic alloc is left as an exercise */
    } job, *jobPtr;
    
    /*
     * And the code needed to parse it
     */
    jobPtr parseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
        jobPtr ret = NULL;
    
    DEBUG("parseJob\n");
        /*
         * allocate the struct
         */
        ret = (jobPtr) malloc(sizeof(job));
        if (ret == NULL) {
            fprintf(stderr,"out of memory\n");
            return(NULL);
        }
        memset(ret, 0, sizeof(job));
    
        /* We don't care what the top level element name is */
        cur = cur->xmlChildrenNode;
        while (cur != NULL) {
            
            if ((!strcmp(cur->name, "Project")) && (cur->ns == ns)) {
                ret->projectID = xmlGetProp(cur, "ID");
                if (ret->projectID == NULL) {
                    fprintf(stderr, "Project has no ID\n");
                }
            }
            if ((!strcmp(cur->name, "Application")) && (cur->ns == ns))
                ret->application = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
            if ((!strcmp(cur->name, "Category")) && (cur->ns == ns))
                ret->category = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
            if ((!strcmp(cur->name, "Contact")) && (cur->ns == ns))
                ret->contact = parsePerson(doc, ns, cur);
            cur = cur->next;
        }
    
        return(ret);
    }

    Once you are used to it, writing this kind of code is quite simple, but boring. Ultimately, it could be possible to write stubbers taking either C data structure definitions, a set of XML examples or an XML DTD and produce the code needed to import and export the content between C data and XML storage. This is left as an exercise to the reader :-)

    Feel free to use the code for the full C parsing example as a template, it is also available with Makefile in the Gnome SVN base under libxml2/example

    Contributions

    libxml2-2.9.1+dfsg1/doc/threads.html0000644000175000017500000001570312124524425015650 0ustar aronaron Thread safety
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Thread safety

    Developer Menu
    API Indexes
    Related links

    Starting with 2.4.7, libxml2 makes provisions to ensure that concurrent threads can safely work in parallel parsing different documents. There is however a couple of things to do to ensure it:

    • configure the library accordingly using the --with-threads options
    • call xmlInitParser() in the "main" thread before using any of the libxml2 API (except possibly selecting a different memory allocator)

    Note that the thread safety cannot be ensured for multiple threads sharing the same document, the locking must be done at the application level, libxml exports a basic mutex and reentrant mutexes API in <libxml/threads.h>. The parts of the library checked for thread safety are:

    • concurrent loading
    • file access resolution
    • catalog access
    • catalog building
    • entities lookup/accesses
    • validation
    • global variables per-thread override
    • memory handling

    XPath has been tested for threaded usage on non-modified document for example when using libxslt, but make 100% sure the documents are accessed read-only !

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/intro.html0000644000175000017500000001604412124524425015350 0ustar aronaron Introduction
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Introduction

    Main Menu
    Related links

    This document describes libxml, the XML C parser and toolkit developed for the Gnome project. XML is a standard for building tag-based structured documents/data.

    Here are some key points about libxml:

    • Libxml2 exports Push (progressive) and Pull (blocking) type parser interfaces for both XML and HTML.
    • Libxml2 can do DTD validation at parse time, using a parsed document instance, or with an arbitrary DTD.
    • Libxml2 includes complete XPath, XPointer and XInclude implementations.
    • It is written in plain C, making as few assumptions as possible, and sticking closely to ANSI C/POSIX for easy embedding. Works on Linux/Unix/Windows, ported to a number of other platforms.
    • Basic support for HTTP and FTP client allowing applications to fetch remote resources.
    • The design is modular, most of the extensions can be compiled out.
    • The internal document representation is as close as possible to the DOM interfaces.
    • Libxml2 also has a SAX like interface; the interface is designed to be compatible with Expat.
    • This library is released under the MIT License. See the Copyright file in the distribution for the precise wording.

    Warning: unless you are forced to because your application links with a Gnome-1.X library requiring it, Do Not Use libxml1, use libxml2

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk20.html0000644000175000017500000007775112134171042016027 0ustar aronaron API Alphabetic Index n-n for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index n-n for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter n:

    named
    xmlAddEncodingAlias
    names
    _xmlDoc
    _xmlParserCtxt
    _xmlSchema
    htmlInitAutoClose
    xmlGetFeaturesList
    xmlHashAddEntry
    xmlHashScan3
    xmlHashScanFull3
    xmlParseNotationType
    xmlValidGetPotentialChildren
    xmlValidGetValidElements
    namespace-binding
    xmlSetProp
    namespace-uri
    xmlXPathNamespaceURIFunction
    namespace:
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    xmlParseAttribute
    xmlParseStartTag
    namespaces
    XML_XPATH_CHECKNS
    _xmlParserCtxt
    _xmlSchemaWildcard
    _xmlXPathContext
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCopyDoc
    xmlCopyNode
    xmlDOMWrapAcquireNsFunction
    xmlDocCopyNode
    xmlFreeNsList
    xmlGetProp
    xmlParseInNodeContext
    xmlReconciliateNs
    naming
    xmlChildrenNode
    xmlRootNode
    nbBytes
    xmlMemDisplayLast
    nbval
    xmlRegExecErrInfo
    xmlRegExecNextValues
    ncname
    xmlBuildQName
    ndata
    _xmlEntity
    nearest
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    xmlXPathLangFunction
    nearly
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    necessary
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    _htmlElemDesc
    xmlCheckUTF8
    xmlDebugDumpString
    needed
    _xmlParserCtxt
    _xmlXPathContext
    htmlEntityLookup
    htmlEntityValueLookup
    xlinkIsLink
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlGetBufferAllocationScheme
    xmlLoadSGMLSuperCatalog
    xmlNewEntity
    xmlNewNodeEatName
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlReconciliateNs
    xmlSchemaSAXPlug
    xmlSetBufferAllocationScheme
    xmlShellPwd
    xmlStrncat
    xmlTextReaderCurrentDoc
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    xmlXPathStringFunction
    needing
    xmlCharEncOutFunc
    xmlURIEscape
    needle
    xmlStrcasestr
    xmlStrstr
    needs
    xmlEntityReferenceFunc
    xmlSchemaValidateFacetWhtsp
    xmlStreamWantsAnyNode
    xmlXPathNodeSetFreeNs
    negated
    _xmlSchemaWildcard
    negative
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRegexpExec
    xmlRegexpIsDeterminist
    xmlShellCmd
    xmlXPathBooleanFunction
    xmlXPathCeilingFunction
    xmlXPathStringEvalNumber
    xmlXPathStringFunction
    neither
    xmlHasNsProp
    xmlHasProp
    xmlParseElementChildrenContentDecl
    xmlTextReaderReadInnerXml
    xmlXPathBooleanFunction
    xmlXPathCompareValues
    nested
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    net
    xmlXPathIsInf
    xmlXPathIsNaN
    network
    htmlCtxtReadFile
    htmlReadFile
    xmlCtxtReadFile
    xmlNoNetExternalEntityLoader
    xmlReadFile
    xmlReaderForFile
    xmlReaderNewFile
    nice
    xmlBuildRelativeURI
    nillable
    XML_SCHEMAS_ELEM_NILLABLE
    xmlExpIsNillable
    nod
    xmlEntityReferenceFunc
    node-
    _xmlDOMWrapCtxt
    xmlDOMWrapRemoveNode
    xmlValidGetValidElements
    node-set?
    xmlXPathLocalNameFunction
    xmlXPathNamespaceURIFunction
    nodeInfos
    _xmlParserCtxt
    nodelist
    xmlParseBalancedChunkMemoryRecover
    nodes1
    xmlXPathDifference
    nodes2
    xmlXPathDifference
    nodeset
    xmlXPathNodeSetFreeNs
    nodesets
    xmlXPathNodeSetMerge
    non
    XML_SCHEMAS_ANYATTR_LAX
    xmlEncodeEntitiesReentrant
    xmlNewChild
    xmlNewTextChild
    xmlTextReaderBaseUri
    xmlTextReaderLocalName
    xmlTextReaderLocatorBaseURI
    xmlTextReaderName
    xmlTextReaderNamespaceUri
    xmlTextReaderPrefix
    xmlTextReaderXmlLang
    xmlXPathParseNCName
    non-CDATA
    _xmlParserCtxt
    non-NULL
    htmlParseEntityRef
    xmlCreatePushParserCtxt
    xmlParseEntityValue
    non-UTF-8
    xmlByteConsumed
    non-blank
    xmlParseElementChildrenContentDecl
    non-determinist
    _xmlValidCtxt
    non-empty
    xmlXPathBooleanFunction
    non-final
    xmlRegExecPushString
    xmlRegExecPushString2
    non-negative
    xmlC14NDocSaveTo
    xmlC14NExecute
    non-normative
    xmlDetectCharEncoding
    non-null
    xmlShellPrintNode
    non-recursive
    _xmlParserCtxt
    non-stateless
    xmlCharEncOutFunc
    non-validating
    xmlParseAttValue
    xmlParseEntityRef
    non-zero
    initxmlDefaultSAXHandler
    xmlHasFeature
    xmlIsLetter
    xmlSAX2InitDefaultSAXHandler
    xmlXPathBooleanFunction
    none
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    getNamespace
    xmlDecodeEntities
    xmlGetLastChild
    xmlOutputBufferCreateFilename
    xmlSchemaValueGetAsString
    xmlSchemaValueGetNext
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlTextReaderConstXmlLang
    xmlTextReaderXmlLang
    nor
    xmlBufferCreateStatic
    xmlBuildQName
    xmlParseElementChildrenContentDecl
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlTextReaderReadInnerXml
    xmlXPathBooleanFunction
    normal
    xmlGetBufferAllocationScheme
    xmlInitCharEncodingHandlers
    xmlParserInputBufferGrow
    normalization
    xmlNormalizeURIPath
    xmlParseSDDecl
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidateFacetWhtsp
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    normalization:
    xmlCurrentChar
    normalizations
    xmlTextReaderNormalization
    normalize
    xmlParseAttValue
    xmlSchemaCollapseString
    xmlTextReaderNormalization
    normalize-space
    xmlXPathNormalizeFunction
    normalized
    XML_SCHEMAS_TYPE_NORMVALUENEEDED
    xmlParseAttValue
    xmlSchemaValidateFacetWhtsp
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXPathNormalizeFunction
    normalizing
    xmlCurrentChar
    normally
    _xmlNs
    c
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    notations
    _xmlDtd
    xmlValidateDtdFinal
    note
    xmlCheckUTF8
    xmlLoadExternalEntity
    notice
    xmlCleanupParser
    xmlCleanupThreads
    now
    XML_CAST_FPTR
    _xmlSchema
    _xmlSchemaElement
    xmlDecodeEntities
    xmlParserHandleReference
    xmlScanName
    ns-binding
    xmlSetProp
    ns-decls
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    ns-references
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    nsDef
    _xmlDOMWrapCtxt
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapRemoveNode
    null
    xmlHashScan3
    xmlHashScanFull3
    xmlShellDu
    null-terminated
    xmlCheckUTF8
    number:
    LIBXML_VERSION
    number?
    xmlXPathSubstringFunction
    numbers
    xmlLineNumbersDefault
    xmlUTF8Size
    xmlXPathAddValues
    xmlXPathCompareValues
    xmlXPathDivValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathOrderDocElems
    xmlXPathRoundFunction
    xmlXPathSubValues
    xmlXPathValueFlipSign
    numeric
    xmlXPathAddValues
    xmlXPathDivValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathStringFunction
    xmlXPathSubValues
    xmlXPathSubstringFunction
    xmlXPathValueFlipSign

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/elfgcchack.xsl0000644000175000017500000001136012113312341016113 0ustar aronaron /* * elfgcchack.h: hack by Arjan van de Ven <arjanv@redhat.com> to speed * up the code when using gcc for call within the library. * * Based on the analysis http://people.redhat.com/drepper/dsohowto.pdf * from Ulrich drepper. Rewritten to be generated from the XML description * file for libxml2 API * autogenerated with xsltproc doc/elfgcchack.xsl doc/libxml2-api.xml */ #ifdef IN_LIBXML #ifdef __GNUC__ #ifdef PIC #ifdef linux #if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) #include "libxml/c14n.h" #include "libxml/catalog.h" #include "libxml/chvalid.h" #include "libxml/debugXML.h" #include "libxml/dict.h" #include "libxml/DOCBparser.h" #include "libxml/encoding.h" #include "libxml/entities.h" #include "libxml/globals.h" #include "libxml/hash.h" #include "libxml/HTMLparser.h" #include "libxml/HTMLtree.h" #include "libxml/list.h" #include "libxml/nanoftp.h" #include "libxml/nanohttp.h" #include "libxml/parser.h" #include "libxml/parserInternals.h" #include "libxml/pattern.h" #include "libxml/relaxng.h" #include "libxml/SAX2.h" #include "libxml/SAX.h" #include "libxml/schemasInternals.h" #include "libxml/schematron.h" #include "libxml/threads.h" #include "libxml/tree.h" #include "libxml/uri.h" #include "libxml/valid.h" #include "libxml/xinclude.h" #include "libxml/xlink.h" #include "libxml/xmlautomata.h" #include "libxml/xmlerror.h" #include "libxml/xmlexports.h" #include "libxml/xmlIO.h" #include "libxml/xmlmemory.h" #include "libxml/xmlreader.h" #include "libxml/xmlregexp.h" #include "libxml/xmlsave.h" #include "libxml/xmlschemas.h" #include "libxml/xmlschemastypes.h" #include "libxml/xmlstring.h" #include "libxml/xmlunicode.h" #include "libxml/xmlversion.h" #include "libxml/xmlwriter.h" #include "libxml/xpath.h" #include "libxml/xpathInternals.h" #include "libxml/xpointer.h" #include "libxml/xmlmodule.h" /* special hot spot not exported ones */ #ifdef bottom_globals #undef __xmlGenericError extern __typeof (__xmlGenericError) __xmlGenericError __attribute((alias("__xmlGenericError__internal_alias"))); #else #ifndef __xmlGenericError extern __typeof (__xmlGenericError) __xmlGenericError__internal_alias __attribute((visibility("hidden"))); #define __xmlGenericError __xmlGenericError__internal_alias #endif #endif #ifdef bottom_globals #undef __xmlGenericErrorContext extern __typeof (__xmlGenericErrorContext) __xmlGenericErrorContext __attribute((alias("__xmlGenericErrorContext__internal_alias"))); #else #ifndef __xmlGenericErrorContext extern __typeof (__xmlGenericErrorContext) __xmlGenericErrorContext__internal_alias __attribute((visibility("hidden"))); #define __xmlGenericErrorContext __xmlGenericErrorContext__internal_alias #endif #endif /* list generated from libxml2-api.xml */ #endif #endif #endif #endif #endif #ifdef bottom_ #undef extern __typeof ( ) __attribute((alias(" "))); #else #ifndef extern __typeof ( ) __attribute((visibility("hidden"))); #define #endif #endif #if #endif libxml2-2.9.1+dfsg1/doc/APIchunk14.html0000644000175000017500000013120712134171042016015 0ustar aronaron API Alphabetic Index e-e for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index e-e for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter e:

    each
    _xmlParserCtxt
    xmlHashCopy
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlParseAttributeType
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlValidateOneElement
    xmlXPathIdFunction
    xmlXPathSubstringFunction
    edition
    xmlCheckLanguageID
    effect
    xmlXPathContextSetCache
    effective
    xmlLoadCatalog
    xmlLoadCatalogs
    efficiency
    xmlBuildRelativeURI
    either
    xmlBoolToText
    xmlBufGetNodeContent
    xmlCurrentChar
    xmlLoadACatalog
    xmlNodeBufGetContent
    xmlNodeGetContent
    xmlParseElementChildrenContentDecl
    xmlParseElementContentDecl
    xmlParseMarkupDecl
    xmlParsePEReference
    xmlParseStartTag
    xmlParserHandlePEReference
    xmlTextReaderNormalization
    either:
    resolveEntity
    resolveEntitySAXFunc
    xmlSAX2ResolveEntity
    elem
    XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    elem-
    _xmlDOMWrapCtxt
    element-
    xmlStreamPushNode
    xmlXPathOrderDocElems
    element-node
    xmlDOMWrapReconcileNamespaces
    xmlStreamPush
    element-nodes
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlStreamWantsAnyNode
    elementFormDefault
    XML_SCHEMAS_QUALIF_ELEM
    elementdecl
    xmlParseElementDecl
    xmlParseMarkupDecl
    elements
    XML_CATALOGS_NAMESPACE
    XML_COMPLETE_ATTRS
    XML_SCHEMAS_ATTR_GLOBAL
    XML_SCHEMAS_ATTR_NSDEFAULT
    XML_SCHEMAS_ELEM_NSDEFAULT
    _xmlDtd
    htmlElementAllowedHere
    htmlNodeStatus
    xlinkIsLink
    xmlDictSize
    xmlFreePatternList
    xmlHashSize
    xmlLineNumbersDefault
    xmlListMerge
    xmlListReverse
    xmlListSize
    xmlListSort
    xmlParseAttributeType
    xmlParseDefaultDecl
    xmlParseSDDecl
    xmlShellPwd
    xmlTextWriterEndDocument
    xmlXPathIdFunction
    xmlXPathOrderDocElems
    else
    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    embedded
    XML_CTXT_FINISH_DTD_0
    XML_CTXT_FINISH_DTD_1
    emitted
    xmlSetGenericErrorFunc
    empty-element
    xmlParseStartTag
    enable
    xmlCatalogSetDebug
    enabled
    xmlSaveFile
    xmlSaveFormatFile
    enables
    xmlXPathContextSetCache
    enabling
    xmlLineNumbersDefault
    xmlPedanticParserDefault
    enc
    xmlParserInputBufferCreateFilename
    encapsulate
    xmlBufferFree
    encapsulating
    _htmlElemDesc
    xmlNewIOInputStream
    enclose
    xmlTextReaderQuoteChar
    encode
    xmlTextWriterWriteBase64
    xmlTextWriterWriteBinHex
    encoded
    _xmlOutputBuffer
    _xmlParserInput
    _xmlParserInputBuffer
    xmlCheckUTF8
    xmlGetUTF8Char
    xmlSplitQName
    xmlStrcat
    xmlStrdup
    xmlTextWriterWriteBase64
    xmlTextWriterWriteBinHex
    xmlUTF8Strlen
    xmlUTF8Strsize
    xmlUTF8Strsub
    encoder
    _xmlOutputBuffer
    _xmlParserInputBuffer
    xmlCharEncOutFunc
    xmlCharEncodingOutputFunc
    encoder==NULL
    xmlC14NDocSaveTo
    xmlC14NExecute
    enconding
    xmlCharEncCloseFunc
    xmlCharEncFirstLine
    xmlCharEncOutFunc
    encountered
    xmlEncodeEntities
    encountering
    XML_CAST_FPTR
    end-tag
    xmlParseElement
    end-up
    xmlParseReference
    ended
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCleanupThreads
    ending
    xmlXPtrNewCollapsedRange
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints
    ends
    _xmlParserNodeInfo
    xmlNanoHTTPClose
    enforced
    XML_MAX_LOOKUP_LIMIT
    engine
    xmlXPathAxisFunc
    xmlXPathFuncLookupFunc
    xmlXPathVariableLookupFunc
    englobing
    xmlExpExpDerive
    xmlExpSubsume
    xmlSnprintfElementContent
    xmlSprintfElementContent
    enhancements
    htmlNodeStatus
    enough
    xmlBuildQName
    ensure
    xmlCopyNodeList
    xmlNewTextChild
    ensures
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    ensuring
    xmlDOMWrapRemoveNode
    entire
    xmlCleanupInputCallbacks
    xmlCleanupOutputCallbacks
    entites
    _xmlEntity
    entities:
    xmlParseEntityRef
    xmlParserHandleReference
    entproc
    xmlParserHandlePEReference
    xmlParserHandleReference
    entries
    xmlACatalogAdd
    xmlACatalogRemove
    xmlCatalogAdd
    xmlCatalogConvert
    xmlCatalogRemove
    xmlConvertSGMLCatalog
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlHashAddEntry3
    xmlLoadACatalog
    xmlLoadCatalog
    xmlLoadSGMLSuperCatalog
    xmlMemShow
    entry
    xmlACatalogAdd
    xmlACatalogRemove
    xmlCatalogAdd
    xmlCatalogAddLocal
    xmlCatalogRemove
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlXPathNodeSetRemove
    xmlXPtrLocationSetRemove
    enumerated
    attributeDecl
    attributeDeclSAXFunc
    xmlSAX2AttributeDecl
    enumeration
    _xmlAttribute
    xmlAddAttributeDecl
    xmlCopyEnumeration
    xmlCreateEnumeration
    xmlFreeEnumeration
    xmlParseAttributeType
    xmlParseEnumeratedType
    xmlParseEnumerationType
    environment
    xmlNanoFTPProxy
    xmlReconciliateNs
    xmlShell
    xmlXPathInit
    epsilon
    xmlAutomataNewAllTrans
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    equal
    xmlAddChild
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlStrEqual
    xmlStrQEqual
    xmlTextReaderConstName
    xmlTextReaderName
    xmlXPathCompareValues
    xmlXPathEqualValues
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPathIdFunction
    xmlXPathNotEqualValues
    xmlXPathPositionFunction
    xmlXPathSubstringFunction
    equality
    _xmlParserInput
    xmlListDataCompare
    equivalent
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemFree
    xmlMemMalloc
    xmlMemRealloc
    xmlMemStrdupLoc
    xmlMemoryStrdup
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlReallocLoc
    xmlUTF8Strpos
    xmlXPathCastToString
    xmlXPathConvertBoolean
    xmlXPathConvertNumber
    xmlXPathConvertString
    errror
    xmlDOMWrapNewCtxt
    escape
    docbEncodeEntities
    htmlEncodeEntities
    xmlURIEscape
    xmlURIEscapeStr
    escaped
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewTextChild
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlParseCDSect
    xmlParseCharData
    xmlSaveUri
    xmlURIEscape
    xmlURIEscapeStr
    escapes
    xmlOutputBufferWriteEscape
    xmlURIEscapeStr
    escaping
    xmlOutputBufferWriteEscape
    xmlSaveSetAttrEscape
    xmlSaveSetEscape
    especially
    xmlExpParse
    established
    xmlNanoFTPUpdateURL
    etc
    _xmlSchemaFacet
    xmlDocGetRootElement
    xmlDocSetRootElement
    xmlParseInNodeContext
    evaluate
    xmlXPathEvalExpr
    evaluated
    xmlXPathCompiledEvalToBoolean
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPtrNewContext
    evaluating
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    evaluation
    _xmlXPathFunct
    _xmlXPathParserContext
    valuePop
    valuePush
    xmlRegNewExecCtxt
    xmlShellPrintXPathResult
    xmlXPathCompiledEval
    xmlXPathEval
    xmlXPathEvalExpression
    xmlXPathEvalFunc
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPathNodeEval
    xmlXPtrBuildNodeList
    xmlXPtrEval
    evaulation
    xmlRegFreeExecCtxt
    even
    _xmlParserInput
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlNodeGetBase
    xmlParseBalancedChunkMemoryRecover
    xmlTextWriterFullEndElement
    xmlXPathRoundFunction
    event
    xmlSchemaSAXPlug
    xmlSchemaSAXUnplug
    xmlSchemaValidateStream
    events
    htmlSAXParseDoc
    xmlSchemaValidateStream
    ever
    xmlExpCtxtNbCons
    everywhere
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    exact
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    examined
    xmlHasFeature
    example
    xmlParserInputBufferCreateStatic
    xmlReconciliateNs
    xmlTextReaderConstString
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    xmlXPathSubstringFunction
    xmlXPathTranslateFunction
    examples
    xmlBuildRelativeURI
    except
    xmlAutomataNewNegTrans
    xmlGetNoNsProp
    xmlParseAttValue
    xmlParseCatalogFile
    xmlParseEntityRef
    xmlParserHandleReference
    exception
    xmlURIEscapeStr
    excluding
    IS_CHAR
    xmlXPathNextFollowing
    xmlXPathNextPreceding
    exclusions
    XML_SCHEMAS_ELEM_FINAL_ABSENT
    exclusions:
    XML_SCHEMAS_ELEM_FINAL_EXTENSION
    XML_SCHEMAS_ELEM_FINAL_RESTRICTION
    exclusive
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    executed
    xmlAutomataCompile
    execution
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRegExecPushString
    xmlRegExecPushString2
    exist
    xmlHasFeature
    xmlXPtrLocationSetAdd
    existent
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    exists
    xmlDictExists
    xmlShellPwd
    xmlTextReaderConstXmlLang
    xmlTextReaderXmlLang
    xmlValidateNotationDecl
    exit
    xmlCleanupParser
    xmlCleanupThreads
    expand
    xmlLoadSGMLSuperCatalog
    expanded
    xmlRelaxNGValidateFullElement
    xmlSchemaNewStringValue
    xmlXPathNamespaceURIFunction
    expected
    x
    xmlBufferCreateStatic
    xmlParserInputBufferCreateStatic
    xmlRelaxNGNewMemParserCtxt
    xmlRelaxNGNewParserCtxt
    xmlSchemaNewMemParserCtxt
    xmlSchemaNewParserCtxt
    xmlSchemaValidateListSimpleTypeFacet
    xmlSchematronNewMemParserCtxt
    xmlSchematronNewParserCtxt
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    explicitly
    xmlSAXDefaultVersion
    explored
    xmlXPathAxisFunc
    exposing
    xmlTextReaderRead
    express
    LIBXML2_NEW_BUFFER
    expressing
    xmlPathToURI
    expressions
    LIBXML_EXPR_ENABLED
    LIBXML_REGEXP_ENABLED
    xmlExpExpDerive
    xmlExpNewCtxt
    xmlExpParse
    xmlExpSubsume
    exslSetsDistinctSorted
    xmlXPathDistinct
    exslSetsLeadingSorted
    xmlXPathLeading
    exslSetsNodeLeadingSorted
    xmlXPathNodeLeading
    ext
    _xmlParserCtxt
    extParsedEnt
    xmlParseCtxtExternalEntity
    xmlParseEntity
    xmlParseExtParsedEnt
    xmlParseExternalEntity
    xmlSAXParseEntity
    extSubset
    xmlParseExternalSubset
    extSubsetDecl
    xmlParseExternalSubset
    extend
    xmlStrncat
    xmlValidGetPotentialChildren
    extended
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xmlCheckLanguageID
    xmlXPathNodeSetMerge
    xmlXPtrLocationSetMerge
    extension
    XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION
    XML_SCHEMAS_ELEM_FINAL_EXTENSION
    XML_SCHEMAS_FINAL_DEFAULT_EXTENSION
    XML_SCHEMAS_TYPE_BLOCK_EXTENSION
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
    XML_SCHEMAS_TYPE_FINAL_EXTENSION
    xmlCheckLanguageID
    extensions
    _xmlSAXHandler
    extent
    xmlParseBalancedChunkMemoryRecover
    extlang
    xmlCheckLanguageID
    extract
    XML_GET_CONTENT
    XML_GET_LINE
    xmlBufContent
    xmlBufEnd
    xmlBufferContent

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk22.html0000644000175000017500000016114512134171042016020 0ustar aronaron API Alphabetic Index p-p for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index p-p for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter p:

    pairs
    startElement
    startElementNsSAX2Func
    startElementSAXFunc
    xmlSAX2StartElement
    xmlSAX2StartElementNs
    param
    _xmlDtd
    parameter-entity
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    parameters
    ATTRIBUTE_UNUSED
    errorSAXFunc
    fatalErrorSAXFunc
    warningSAXFunc
    xmlNewChild
    xmlNewTextChild
    xmlParserError
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserWarning
    xmlStrPrintf
    xmlStrVPrintf
    xmlTextWriterWriteFormatAttribute
    xmlTextWriterWriteFormatAttributeNS
    xmlTextWriterWriteFormatCDATA
    xmlTextWriterWriteFormatComment
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteFormatDTDElement
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteFormatElement
    xmlTextWriterWriteFormatElementNS
    xmlTextWriterWriteFormatPI
    xmlTextWriterWriteFormatRaw
    xmlTextWriterWriteFormatString
    xmlXPathEvalFunc
    parent-
    _xmlNode
    parentheses
    xmlParseElementChildrenContentDecl
    parenthesis
    xmlSnprintfElementContent
    xmlSprintfElementContent
    parenthesized
    xmlParseElementChildrenContentDecl
    parents
    xmlSearchNs
    xmlSearchNsByHref
    partial
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    particular
    _xmlNodeSet
    pass
    xmlCurrentChar
    xmlRelaxParserSetFlag
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetStructuredErrorHandler
    passed
    CHECK_ARITY
    xmlAutomataNewNegTrans
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlListReverseWalk
    xmlListWalk
    xmlNanoFTPGet
    xmlNanoFTPList
    xmlParseAttValue
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessTreeFlagsData
    xmlXPathEvalFunc
    xmlXPathIntersection
    passive
    xmlNanoFTPGetConnection
    password
    xmlNanoFTPProxy
    past
    attribute
    attributeSAXFunc
    xmlTextReaderGetRemainder
    paste
    xmlReconciliateNs
    path
    _xmlURI
    xmlCanonicPath
    xmlCheckFilename
    xmlGetNodePath
    xmlLoadACatalog
    xmlLoadCatalog
    xmlLoadSGMLSuperCatalog
    xmlModuleOpen
    xmlNanoFTPGetSocket
    xmlNanoFTPUpdateURL
    xmlNormalizeURIPath
    xmlNormalizeWindowsPath
    xmlParserGetDirectory
    xmlPathToURI
    xmlShellPwd
    xmlShellValidate
    xmlTextReaderRelaxNGValidate
    xmlTextReaderSchemaValidate
    pathological
    xmlGetBufferAllocationScheme
    pattern
    XML_SCHEMAS_TYPE_NORMVALUENEEDED
    xmlPatternFromRoot
    xmlPatternGetStreamCtxt
    xmlPatternMatch
    xmlPatternMaxDepth
    xmlPatternMinDepth
    xmlPatternStreamable
    xmlPatterncompile
    xmlSchemaValidateFacetWhtsp
    xmlStreamWantsAnyNode
    xmlTextReaderPreservePattern
    patterns
    _xmlSchemaFacet
    pcdata
    cdataBlock
    cdataBlockSAXFunc
    xmlSAX2CDataBlock
    pedantic
    _xmlParserCtxt
    xmlPedanticParserDefault
    per
    xmlGetLastError
    xmlParseAttributeType
    xmlValidateElementDecl
    xmlXPathContextSetCache
    per-thread
    LIBXML_THREAD_ALLOC_ENABLED
    performance
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    performed
    htmlNodeStatus
    permanently
    xmlCheckLanguageID
    pertain
    xmlNewDocTextLen
    pertains
    xmlNodeGetBase
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    phase
    xmlRegNewExecCtxt
    pic1
    xmlBuildRelativeURI
    piece
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNodeSetContent
    xmlNodeSetContentLen
    pieces
    xmlParseURIRaw
    place
    xmlCatalogAdd
    xmlCopyError
    xmlGcMemGet
    xmlMemGet
    xmlReplaceNode
    places
    xmlMemDisplayLast
    xmlStrPrintf
    xmlStrVPrintf
    platforms
    xmlGetThreadId
    plug
    xmlXPathFuncLookupFunc
    xmlXPathVariableLookupFunc
    plugin
    xmlCleanupParser
    xmlCleanupThreads
    plugins
    xmlCleanupParser
    xmlCleanupThreads
    plus
    UTF8ToHtml
    docbEncodeEntities
    htmlEncodeEntities
    pnetlib-doc
    xmlTextReaderNodeType
    pointed
    xmlPopInput
    pointers
    xmlParserInputGrow
    xmlReconciliateNs
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlSchemaSAXPlug
    xmlSchemaSAXUnplug
    xmlValidGetValidElements
    points
    _xmlChRangeGroup
    pop
    xmlPopInput
    popped
    xmlXPathFunction
    pops
    xmlSkipBlankChars
    port
    _xmlURI
    xmlNanoFTPConnectTo
    xmlNanoFTPProxy
    xmlNanoFTPScanProxy
    xmlNanoFTPUpdateURL
    xmlNanoHTTPScanProxy
    portability
    INVALID_SOCKET
    SOCKET
    xmlModuleOpen
    xmlModuleSymbol
    portable
    xmlXPathIsInf
    xmlXPathIsNaN
    pos
    xmlUTF8Strsub
    position:
    xmlXPathSubstringFunction
    positioned
    xmlTextReaderReadString
    positionned
    xmlTextReaderReadAttributeValue
    positions
    xmlUTF8Strsub
    possible
    xmlCopyNodeList
    xmlCreateEntityParserCtxt
    xmlParseDefaultDecl
    xmlParseExternalID
    xmlReconciliateNs
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    xmlValidateDtdFinal
    possibly
    xmlDocGetRootElement
    xmlDocSetRootElement
    xmlIsBlankNode
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    xmlSaveToFilename
    xmlXPathStringFunction
    posteriori
    xmlSetNs
    potential
    xmlDebugCheckDocument
    xmlValidGetPotentialChildren
    potentially
    _xmlURI
    practice
    xmlParseVersionNum
    pre-interned
    _xmlParserCtxt
    preallocated
    xmlBuildQName
    precede
    xmlParseEntityRef
    xmlParsePEReference
    xmlParserHandlePEReference
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    preceded
    xmlXPathStringFunction
    precedes
    xmlXPathSubstringBeforeFunction
    preceding
    _xmlXPathParserContext
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    preceding-sibling
    xmlXPathNextPrecedingSibling
    precisely
    xmlXPathSubstringFunction
    precompiled
    _xmlXPathParserContext
    xmlPatternFromRoot
    xmlPatternGetStreamCtxt
    xmlPatternMatch
    xmlPatternMaxDepth
    xmlPatternMinDepth
    xmlPatternStreamable
    xmlRegNewExecCtxt
    xmlRelaxNGNewValidCtxt
    xmlSchemaNewValidCtxt
    xmlSchematronNewValidCtxt
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderSetSchema
    xmlXPathDebugDumpCompExpr
    precomputed
    xmlSchemaCopyValue
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    predefined
    XML_XML_NAMESPACE
    xmlCleanupPredefinedEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlGetDocEntity
    xmlGetPredefinedEntity
    xmlInitializePredefinedEntities
    xmlParseReference
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidatePredefinedType
    predicate
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPtrEvalRangePredicate
    preferably
    xmlInitializeCatalog
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlNewPI
    preference
    xmlCatalogGetDefaults
    xmlCatalogSetDefaultPrefer
    xmlCatalogSetDefaults
    prefixes
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    preparing
    xmlCleanupParser
    preparsed
    xmlReaderNewWalker
    xmlReaderWalker
    xmlRelaxNGNewDocParserCtxt
    xmlSchemaNewDocParserCtxt
    xmlSchematronNewDocParserCtxt
    prepend
    xmlValidGetValidElements
    present
    xmlBufferCreateStatic
    xmlDictLookup
    xmlDictQLookup
    xmlGetUTF8Char
    xmlNewNs
    xmlTextReaderConstValue
    xmlTextReaderValue
    xmlValidateDocument
    xmlValidateDtd
    xmlValidateOneElement
    preserve
    XML_SCHEMAS_FACET_PRESERVE
    XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE
    _xmlParserCtxt
    xmlNodeGetSpacePreserve
    xmlNodeSetSpacePreserve
    xmlParserInputGrow
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    preserved
    HTML_PRESERVE_NODE
    xmlNewTextChild
    xmlParserInputBufferGrow
    preserving
    xmlNodeGetSpacePreserve
    xmlNodeSetSpacePreserve
    prev
    xmlValidGetValidElements
    prevent
    _xmlParserCtxt
    previous
    _xmlAttr
    _xmlAttribute
    _xmlDoc
    _xmlDtd
    _xmlElement
    _xmlEntity
    _xmlNode
    htmlHandleOmittedElem
    htmlParseElement
    xmlAddPrevSibling
    xmlBufferDetach
    xmlCatalogSetDebug
    xmlCatalogSetDefaultPrefer
    xmlDeregisterNodeDefault
    xmlDictSetLimit
    xmlKeepBlanksDefault
    xmlLineNumbersDefault
    xmlPedanticParserDefault
    xmlPreviousElementSibling
    xmlPushInput
    xmlSAXDefaultVersion
    xmlSubstituteEntitiesDefault
    xmlXPathAxisFunc
    primitive
    XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE
    xmlXPathConvertFunc
    print
    xmlShellPrintNode
    xmlSnprintfElementContent
    xmlSprintfElementContent
    printed
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    xmlBufNodeDump
    xmlElemDump
    xmlNodeDump
    xmlNodeDumpOutput
    prior
    xmlSetupParserForBuffer
    private
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCheckLanguageID
    xmlRelaxParserSetFlag
    privateuse
    xmlCheckLanguageID
    problem
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCtxtExternalEntity
    xmlParseExternalEntity
    xmlRelaxNGValidateFullElement
    xmlRelaxNGValidatePopElement
    xmlRelaxNGValidatePushCData
    xmlRelaxNGValidatePushElement
    xmlTextReaderGetRemainder
    xmlUTF8Strsub
    xmlValidatePopElement
    xmlValidatePushCData
    xmlValidatePushElement
    problems
    xmlBufferResize
    xmlDebugCheckDocument
    xmlLoadExternalEntity
    xmlValidateDtd
    procedure
    initxmlDefaultSAXHandler
    xmlSAX2InitDefaultSAXHandler
    process
    xmlCleanupParser
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlDecodeEntities
    xmlNewTextReaderFilename
    xmlParseAttValue
    xmlParseEntityRef
    xmlRelaxNGNewDocParserCtxt
    xmlSchemaNewDocParserCtxt
    xmlSchematronNewDocParserCtxt
    xmlSkipBlankChars
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    processed
    _xmlParserCtxt
    startDocument
    startDocumentSAXFunc
    startElement
    startElementSAXFunc
    xmlBuildURI
    xmlParseAttValue
    xmlSAX2StartDocument
    xmlSAX2StartElement
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    processing-instruction
    xmlXPathIsNodeType
    processing-instruction-node
    xmlStreamPushNode
    processing-instruction-nodes
    xmlStreamWantsAnyNode
    processor
    xmlCurrentChar
    xmlParseAttValue
    xmlParseEntityRef
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    procgressed
    xmlTextReaderGetRemainder
    produce
    xmlCharEncodingOutputFunc
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    produced
    xmlCharEncodingOutputFunc
    xmlCurrentChar
    producing
    xmlCheckUTF8
    production:
    xmlCheckLanguageID
    productions
    xmlCheckLanguageID
    program
    xmlXPtrNewContext
    programs
    htmlInitAutoClose
    xmlInitParser
    progresses
    xmlRegNewExecCtxt
    progressive
    _xmlParserCtxt
    xmlAllocParserInputBuffer
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    xmlOutputBufferCreateIO
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    xmlParserInputBufferPush
    xmlRegNewExecCtxt
    prohibited
    XML_SCHEMAS_ATTR_USE_PROHIBITED
    projects
    xmlXPathIsInf
    xmlXPathIsNaN
    prolog
    xmlParseDocument
    prompt
    xmlShellReadlineFunc
    proper
    xmlValidateAttributeValue
    properly
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    xmlReconciliateNs
    properties
    _xmlNode
    xmlAddChild
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlCopyNode
    xmlDocCopyNode
    xmlTextReaderRead
    xmlTextReaderSetParserProp
    property
    _xmlAttr
    _xmlDtd
    xmlAddChild
    xmlFreePropList
    xmlNewDocProp
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewProp
    xmlTextReaderGetParserProp
    protocol
    xmlNanoFTPCleanup
    xmlNanoFTPInit
    xmlNanoFTPScanProxy
    xmlNanoFTPUpdateURL
    xmlNanoHTTPCleanup
    xmlNanoHTTPInit
    xmlNanoHTTPScanProxy
    prototype
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkNodeDetectFunc
    xlinkSimpleLinkFunk
    provenance
    xmlEntityReferenceFunc
    provide
    INVALID_SOCKET
    SOCKET
    xmlBufNodeDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocFormatDump
    xmlInputMatchCallback
    xmlNodeDump
    xmlNodeDumpOutput
    xmlOutputMatchCallback
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlSchemaValidateSetFilename
    xmlSchemaValidateSetLocator
    xmlSchemaValidateStream
    xmlUTF8Strloc
    xmlUTF8Strpos
    provides
    endElementNsSAX2Func
    startElementNsSAX2Func
    xmlByteConsumed
    xmlExpCtxtNbCons
    xmlExpCtxtNbNodes
    xmlSAX2EndElementNs
    xmlSAX2StartElementNs
    xmlTextReaderByteConsumed
    providing
    INPUT_CHUNK
    provoked
    xmlCheckUTF8
    proximity
    _xmlXPathContext
    proxy
    xmlNanoFTPCleanup
    xmlNanoFTPInit
    xmlNanoFTPProxy
    xmlNanoFTPScanProxy
    xmlNanoHTTPInit
    xmlNanoHTTPScanProxy
    prune
    xmlReplaceNode
    pthread_t
    xmlGetThreadId
    pthreads
    xmlGetThreadId
    publicID
    xmlParseExternalID
    pull
    xmlParserInputBufferGrow
    pure
    xmlParseCDSect
    purposes
    xmlXPathDebugDumpObject
    push
    LIBXML_PUSH_ENABLED
    _xmlParserCtxt
    docbCreatePushParserCtxt
    htmlCreatePushParserCtxt
    xmlCreatePushParserCtxt
    xmlCtxtResetPush
    xmlParserInputBufferPush
    xmlStreamPop
    xmlXPathEvalExpr
    pushed
    xmlRegExecErrInfo
    xmlStreamPushNode
    xmlStreamWantsAnyNode
    xmlXPathFunction
    pushing
    xmlParsePEReference
    put
    xmlCatalogAdd
    putative
    xmlCheckUTF8
    pwd
    xmlShellPwd

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/help.html0000644000175000017500000001425612124524424015147 0ustar aronaron How to help
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    How to help

    Main Menu
    Related links

    You can help the project in various ways, the best thing to do first is to subscribe to the mailing-list as explained before, check the archives and the Gnome bug database:

    1. Provide patches when you find problems.
    2. Provide the diffs when you port libxml2 to a new platform. They may not be integrated in all cases but help pinpointing portability problems and
    3. Provide documentation fixes (either as patches to the code comments or as HTML diffs).
    4. Provide new documentations pieces (translations, examples, etc ...).
    5. Check the TODO file and try to close one of the items.
    6. Take one of the points raised in the archive or the bug database and provide a fix. Get in touch with me before to avoid synchronization problems and check that the suggested fix will fit in nicely :-)

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk16.html0000644000175000017500000010671312134171042016023 0ustar aronaron API Alphabetic Index g-h for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index g-h for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter g:

    gDay
    xmlSchemaGetCanonValue
    gMonth
    xmlSchemaGetCanonValue
    gMonthDay
    xmlSchemaGetCanonValue
    gYear
    xmlSchemaGetCanonValue
    gYearMonth
    xmlSchemaGetCanonValue
    garanteed
    xmlUTF8Strsize
    garbage
    xmlGcMemGet
    xmlGcMemSetup
    gcc
    XML_CAST_FPTR
    gcc4
    XML_CAST_FPTR
    genChRanges
    xmlIsBaseCharQ
    xmlIsBaseChar_ch
    xmlIsBlankQ
    xmlIsBlank_ch
    xmlIsCharQ
    xmlIsChar_ch
    xmlIsCombiningQ
    xmlIsDigitQ
    xmlIsDigit_ch
    xmlIsExtenderQ
    xmlIsExtender_ch
    xmlIsIdeographicQ
    xmlIsPubidCharQ
    xmlIsPubidChar_ch
    general
    XML_SUBSTITUTE_BOTH
    XML_SUBSTITUTE_REF
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    xmlParseCtxtExternalEntity
    xmlParseEntityRef
    xmlParseExtParsedEnt
    xmlParseExternalEntity
    generally
    xmlSAXDefaultVersion
    generate
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemoryEnc
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlLoadExternalEntity
    xmlParseExternalID
    generated
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemoryEnc
    xmlIsBaseCharQ
    xmlIsBaseChar_ch
    xmlIsBlankQ
    xmlIsBlank_ch
    xmlIsCharQ
    xmlIsChar_ch
    xmlIsCombiningQ
    xmlIsDigitQ
    xmlIsDigit_ch
    xmlIsExtenderQ
    xmlIsExtender_ch
    xmlIsIdeographicQ
    xmlIsPubidCharQ
    xmlIsPubidChar_ch
    xmlKeepBlanksDefault
    xmlSearchNs
    xmlShellPrintXPathResult
    xmlTextReaderIsDefault
    generates
    xmlRegexpExec
    generating
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemoryEnc
    xmlExpExpDerive
    xmlKeepBlanksDefault
    xmlRegExecErrInfo
    generic
    initGenericErrorDefaultFunc
    xmlShellCmd
    xmlShellReadlineFunc
    get
    _xmlSAXHandler
    _xmlSAXHandlerV1
    fatalErrorSAXFunc
    xmlBufUse
    xmlBufferLength
    xmlCatalogGetDefaults
    xmlGetCompressMode
    xmlGetDocCompressMode
    xmlGetNoNsProp
    xmlGetNsProp
    xmlGetProp
    xmlNamespaceParseQName
    xmlNanoFTPInit
    xmlNewPI
    xmlSplitQName
    xmlSplitQName2
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    xmlTextReaderGetParserProp
    xmlTextReaderGetRemainder
    xmlValidateNotationDecl
    gie
    xmlBufferDetach
    gif
    xmlBuildRelativeURI
    give
    _xmlParserInput
    _xmlSchema
    xmlValidateDtd
    gives
    xmlParserError
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserWarning
    giving
    xmlNewDoc
    xmlParseVersionNum
    global
    XML_SCHEMAS_ELEM_GLOBAL
    XML_SCHEMAS_TYPE_GLOBAL
    _xmlNs
    globalNamespace
    xmlCatalogDump
    xmlCleanupParser
    xmlCtxtResetLastError
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlGetGlobalState
    xmlGetLastError
    xmlInitializeGlobalState
    xmlResetLastError
    globally
    xmlSAXDefaultVersion
    gnu
    xmlTextReaderNodeType
    good
    xmlTextReaderGetRemainder
    grafted
    xmlCopyProp
    xmlCopyPropList
    grammar:
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseInNodeContext
    greater
    xmlXPathCompareValues
    xmlXPathFloorFunction
    xmlXPathSubstringFunction
    greater-than
    xmlNewTextChild
    group
    XML_SCHEMAS_ATTRGROUP_HAS_REFS
    XML_SCHEMAS_ATTRGROUP_MARKED
    XML_SCHEMAS_ATTRGROUP_REDEFINED
    XML_SCHEMAS_ELEM_FINAL_ABSENT
    XML_SCHEMAS_ELEM_FINAL_EXTENSION
    XML_SCHEMAS_ELEM_FINAL_RESTRICTION
    XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD
    _xmlSchemaAttributeGroup
    _xmlSchemaElement
    ftpListCallback
    groups
    xmlParseElementChildrenContentDecl
    grow
    xmlValidGetValidElements
    grows
    xmlBufferWriteCHAR
    xmlBufferWriteChar
    xmlBufferWriteQuotedString
    guarantee
    xmlModuleOpen
    xmlModuleSymbol
    guaranteed
    xmlModuleOpen
    xmlModuleSymbol
    guess
    xmlCleanupParser
    xmlCleanupThreads

    Letter h:

    had
    xmlNewGlobalNs
    hand
    xmlLoadACatalog
    handled
    xmlLoadACatalog
    xmlParseAttValue
    xmlParseAttribute
    xmlParseDefaultDecl
    xmlParseElementContentDecl
    xmlParsePEReference
    xmlParserHandlePEReference
    handlers
    xlinkSetDefaultHandler
    xmlCleanupCharEncodingHandlers
    xmlRegisterDefaultInputCallbacks
    xmlRegisterDefaultOutputCallbacks
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetStructuredErrorHandler
    handles
    xmlSaveFileTo
    xmlSaveFormatFileTo
    xmlStructuredErrorFunc
    xmlUnsetProp
    xmlXPathStringEvalNumber
    handling
    XML_SCHEMAS_FACET_UNKNOWN
    attribute
    attributeSAXFunc
    htmlHandleOmittedElem
    xmlChildElementCount
    xmlFirstElementChild
    xmlHandleEntity
    xmlLastElementChild
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNextElementSibling
    xmlNodeListGetRawString
    xmlOutputBufferCreateFilenameDefault
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlParserInputBufferCreateFilenameDefault
    xmlPreviousElementSibling
    xmlRegNewExecCtxt
    xmlRegisterInputCallbacks
    xmlRegisterOutputCallbacks
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    hard
    xmlCleanupParser
    xmlCleanupThreads
    has-same-nodes
    xmlXPathHasSameNodes
    haystack
    xmlStrcasestr
    xmlStrstr
    xmlStrsub
    head
    XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD
    _xmlParserCtxt
    header
    xmlNanoHTTPAuthHeader
    xmlNanoHTTPContentLength
    xmlNanoHTTPRedir
    xmlParseTextDecl
    xmlParseXMLDecl
    headers
    xmlNanoHTTPEncoding
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPMimeType
    heading
    xmlCharEncodingOutputFunc
    held
    xmlOutputBufferGetContent
    xmlOutputBufferGetSize
    helper
    XML_SCHEMAS_ELEM_CIRCULAR
    here
    _xmlXPathContext
    htmlNodeStatus
    xmlParseAttValue
    xmlParseElementContentDecl
    xmlParseNamespace
    xmlXPathNextAncestorOrSelf
    heuristic
    xmlKeepBlanksDefault
    xmlURIEscape
    heuristic:
    xmlIsRef
    hex
    xmlURIEscapeStr
    hierarchy
    xmlParseElementChildrenContentDecl
    xmlSchemaGetBuiltInListSimpleTypeItemType
    highly
    htmlParseElement
    xmlParseElement
    hold
    xmlDOMWrapReconcileNamespaces
    xmlNewTextWriterDoc
    xmlNewTextWriterPushParser
    xmlReconciliateNs
    holding
    _xmlAttribute
    _xmlID
    _xmlRef
    xmlAddID
    xmlAddRef
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewProp
    holds
    xmlBufferWriteQuotedString
    hooks
    LIBXML_THREAD_ALLOC_ENABLED
    host
    xmlNanoFTPProxy
    xmlNanoFTPScanProxy
    xmlNanoFTPUpdateURL
    xmlNanoHTTPScanProxy
    hosting
    xmlXPathFuncLookupFunc
    xmlXPathNodeSetAddNs
    xmlXPathVariableLookupFunc
    hostname
    xmlNanoFTPInit
    xmlNanoFTPUpdateURL
    hour
    ftpListCallback
    how
    _xmlError
    xmlDictGetUsage
    href
    XINCLUDE_HREF
    href==NULL
    xmlNewNs
    hrefs
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    html
    xmlBuildRelativeURI
    xmlTextReaderNodeType
    htmlAttrAllowed
    htmlNodeStatus
    htmlElemDescPtr
    htmlTagLookup
    htmlElementAllowedHere
    htmlNodeStatus
    htmlElementStatusHere
    htmlNodeStatus
    htmlEntityDescPtr
    htmlEntityLookup
    htmlEntityValueLookup
    htmlParseEntityRef
    htmlNodePtr
    htmlNodeStatus
    htmlParserCtxtPtr
    htmlNewParserCtxt
    htmlParserOption
    htmlCtxtReadDoc
    htmlCtxtReadFd
    htmlCtxtReadFile
    htmlCtxtReadIO
    htmlCtxtReadMemory
    htmlCtxtUseOptions
    htmlReadDoc
    htmlReadFd
    htmlReadFile
    htmlReadIO
    htmlReadMemory
    htmlStartClose
    htmlAutoCloseTag
    htmlIsAutoClosed
    htmlStartCloseIndex
    htmlInitAutoClose
    http:
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    getSystemId
    xmlBuildRelativeURI
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCheckLanguageID
    xmlGetCharEncodingName
    xmlNanoHTTPScanProxy
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlSAX2GetSystemId
    xmlSchemaGetPredefinedType
    xmlTextReaderNodeType
    xmlXPathIsInf
    xmlXPathIsNaN
    human-readable
    _xmlError

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xmlcatalog.10000644000175000017500000001700312113312477015540 0ustar aronaron'\" t .\" Title: xmlcatalog .\" Author: John Fleck .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: $Date$ .\" Manual: xmlcatalog Manual .\" Source: libxml2 .\" Language: English .\" .TH "XMLCATALOG" "1" "$Date$" "libxml2" "xmlcatalog Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" xmlcatalog \- Command line tool to parse and manipulate XML or SGML catalog files\&. .SH "SYNOPSIS" .HP \w'\fBxmlcatalog\fR\ 'u \fBxmlcatalog\fR [\fB\-\-sgml\fR | \fB\-\-shell\fR | \fB\-\-create\fR | \fB\-\-del\ \fR\fB\fIVALUE(S)\fR\fR | [\ \fB\-\-add\ \fR\fB\fITYPE\fR\fR\fB\ \fR\fB\fIORIG\fR\fR\fB\ \fR\fB\fIREPLACE\fR\fR\fB\ \fR\ |\ \fB\-\-add\ \fR\fB\fIFILENAME\fR\fR] | \fB\-\-noout\fR | \fB\-\-no\-super\-update\fR | [\fB\-v\fR\ |\ \fB\-\-verbose\fR]] {\fICATALOGFILE\fR} {\fIENTITIES\fR...} .SH "DESCRIPTION" .PP \fBxmlcatalog\fR is a command line application allowing users to monitor and manipulate XML and SGML catalogs\&. It is included in \fBlibxml\fR(3)\&. .PP Its functions can be invoked from a single command from the command line, or it can perform multiple functions in interactive mode\&. It can operate on both XML and SGML files\&. .SH "OPTIONS" .PP \fBxmlcatalog\fR accepts the following options (in alphabetical order): .PP \fB\-\-add \fR\fB\fITYPE\fR\fR\fB \fR\fB\fIORIG\fR\fR\fB \fR\fB\fIREPLACE\fR\fR\fB \fR .RS 4 Add an entry to CATALOGFILE\&. \fITYPE\fR indicates the type of entry\&. Possible types are: \fIpublic\fR, \fIsystem\fR, \fIuri\fR, \fIrewriteSystem\fR, \fIrewriteURI\fR, \fIdelegatePublic\fR, \fIdelegateSystem\fR, \fIdelegateURI\fR, \fInextCatalog\fR\&. \fIORIG\fR is the original reference to be replaced, and \fIREPLACE\fR is the URI of the replacement entity to be used\&. The \fB\-\-add\fR option will not overwrite CATALOGFILE, outputting to stdout, unless \fB\-\-noout\fR is used\&. The \fB\-\-add\fR will always take three parameters even if some of the XML catalog constructs will have only a single argument\&. .RE .PP \fB\-\-add \fR\fB\fIFILENAME\fR\fR .RS 4 If the \fB\-\-add\fR option is used following the \fB\-\-sgml\fR option, only a single argument, a \fIFILENAME\fR, is used\&. This is used to add the name of a catalog file to an SGML supercatalog, a file that contains references to other included SGML catalog files\&. .RE .PP \fB\-\-create\fR .RS 4 Create a new XML catalog\&. Outputs to stdout, ignoring \fIfilename\fR unless \fB\-\-noout\fR is used, in which case it creates a new catalog file \fIfilename\fR\&. .RE .PP \fB\-\-del \fR\fB\fIVALUE(S)\fR\fR .RS 4 Remove entries from \fICATALOGFILE\fR matching \fIVALUE(S)\fR\&. The \fB\-\-del\fR option will not overwrite \fICATALOGFILE\fR, outputting to stdout, unless \fB\-\-noout\fR is used\&. .RE .PP \fB\-\-noout\fR .RS 4 Save output to the named file rather than outputting to stdout\&. .RE .PP \fB\-\-no\-super\-update\fR .RS 4 Do not update the SGML super catalog\&. .RE .PP \fB\-\-shell\fR .RS 4 Run a shell allowing interactive queries on catalog file \fICATALOGFILE\fR\&. For the set of available commands see the section called \(lqSHELL COMMANDS\(rq\&. .RE .PP \fB\-\-sgml\fR .RS 4 Uses SGML super catalogs for \fB\-\-add\fR and \fB\-\-del\fR options\&. .RE .PP \fB\-v\fR, \fB\-\-verbose\fR .RS 4 Output debugging information\&. .RE .SH "SHELL COMMANDS" .PP Invoking \fBxmlcatalog\fR with the \fB\-\-shell \fR\fB\fICATALOGFILE\fR\fR option opens a command line shell allowing interactive access to the catalog file identified by \fICATALOGFILE\fR\&. Invoking the shell provides a command line prompt after which the following commands (described in alphabetical order) can be entered\&. .PP \fBadd \fR\fB\fITYPE\fR\fR\fB \fR\fB\fIORIG\fR\fR\fB \fR\fB\fIREPLACE\fR\fR\fB \fR .RS 4 Add an entry to the catalog file\&. \fITYPE\fR indicates the type of entry\&. Possible types are: \fIpublic\fR, \fIsystem\fR, \fIuri\fR, \fIrewriteSystem\fR, \fIrewriteURI\fR, \fIdelegatePublic\fR, \fIdelegateSystem\fR, \fIdelegateURI\fR, \fInextCatalog\fR\&. \fIORIG\fR is the original reference to be replaced, and \fIREPLACE\fR is the URI of the replacement entity to be used\&. The \fB\-\-add\fR option will not overwrite CATALOGFILE, outputting to stdout, unless \fB\-\-noout\fR is used\&. The \fB\-\-add\fR will always take three parameters even if some of the XML catalog constructs will have only a single argument\&. .RE .PP \fBdebug\fR .RS 4 Print debugging statements showing the steps \fBxmlcatalog\fR is executing\&. .RE .PP \fBdel \fR\fB\fIVALUE(S)\fR\fR .RS 4 Remove the catalog entry corresponding to \fIVALUE(S)\fR\&. .RE .PP \fBdump\fR .RS 4 Print the current catalog\&. .RE .PP \fBexit\fR .RS 4 Quit the shell\&. .RE .PP \fBpublic \fR\fB\fIPUBLIC\-ID\fR\fR .RS 4 Execute a Formal Public Identifier look\-up of the catalog entry for \fIPUBLIC\-ID\fR\&. The corresponding entry will be output to the command line\&. .RE .PP \fBquiet\fR .RS 4 Stop printing debugging statements\&. .RE .PP \fBsystem \fR\fB\fISYSTEM\-ID\fR\fR .RS 4 Execute a Formal Public Identifier look\-up of the catalog entry for \fISYSTEM\-ID\fR\&. The corresponding entry will be output to the command line\&. .RE .SH "ENVIRONMENT" .PP \fBXML_CATALOG_FILES\fR .RS 4 XML catalog behavior can be changed by redirecting queries to the user\*(Aqs own set of catalogs\&. This can be done by setting the \fBXML_CATALOG_FILES\fR environment variable to a list of catalogs\&. An empty one should deactivate loading the default /etc/xml/catalog catalog\&. .RE .SH "DIAGNOSTICS" .PP \fBxmlcatalog\fR return codes provide information that can be used when calling it from scripts\&. .PP \fB0\fR .RS 4 No error .RE .PP \fB1\fR .RS 4 Failed to remove an entry from the catalog .RE .PP \fB2\fR .RS 4 Failed to save to the catalog, check file permissions .RE .PP \fB3\fR .RS 4 Failed to add an entry to the catalog .RE .PP \fB4\fR .RS 4 Failed to look up an entry in the catalog .RE .SH "SEE ALSO" .PP \fBlibxml\fR(3) .PP More information can be found at .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBlibxml\fR(3) web page \m[blue]\fB\%http://www.xmlsoft.org/\fR\m[] .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fBlibxml\fR(3) catalog support web page at \m[blue]\fB\%http://www.xmlsoft.org/catalog.html\fR\m[] .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} James Clark\*(Aqs SGML catalog page \m[blue]\fB\%http://www.jclark.com/sp/catalog.htm\fR\m[] .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} OASIS XML catalog specification \m[blue]\fB\%http://www.oasis-open.org/committees/entity/spec.html\fR\m[] .RE .sp .SH "AUTHOR" .PP \fBJohn Fleck\fR <\&jfleck@inkstain\&.net\&> .RS 4 Author. .RE .SH "COPYRIGHT" .br Copyright \(co 2001, 2004 .br libxml2-2.9.1+dfsg1/doc/redhat.gif0000644000175000017500000000127111234335462015263 0ustar aronaronGIF89a,)ÕÌË ÿÿÿ™˜  f³3Y¿ÏÏÏs¦3 ïïï@Îßßß&¾Œ?f ¥ í¨¦¯¯¯¿¿¿Y õÒÑ€ML000pppòÃÂ&ŸŸŸÕ=7PPPüððè–“ßjeØLG²€€€|pp@@@r âyuµÅ† =00刄Ò.(!ù,,)ÿ@€pH,ȤrÉl:ŸÐ¨T¨Z¯Ø¬vk-rµ³‚¸`ùj½æ£¸ß›']Es!›·~ÿ˜›íY3{o ,zD[mn% B ze[€Vz“E%z\ yo –“¸{!ŸX&{ §n Fªzg¿V„ ¤F{ÌCXn˜ÇLÅoY€n DK{çÍjnE$n G *è¡·ÍJ0$J%(䯔 Å–]4H€wE¦%Š–d“X©(tI.%Ü,šX5))¬ìRo¤6xTkOfÈÖz߬0 Ç†K”ûY°Jˆ=4ˆR p¢BŒFH,|#‘fS{\|ø ‚ÑN¼9$AB{4rÅÂY¢ PÜðˆ (0`Pƒ‰¹°tØË¸ñ€„ºz¥{å‡ã½5<ˆ`@TŸ;˜R¾âãò]C€à‚3ZÚF_azoZÎæðõÕÊÚµ‰¢pM´C«zW~`ö¬ñ㽓Ã~öE FѱÈH¼Ã„4®´´€Áýî‹1¾Ó oFF :ˆáËÿ2¥¾ýûøóë¿;libxml2-2.9.1+dfsg1/doc/html/0000755000175000017500000000000012134171765014274 5ustar aronaronlibxml2-2.9.1+dfsg1/doc/html/libxml-DOCBparser.html0000644000175000017500000005021712134171042020364 0ustar aronaron Module DOCBparser from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module DOCBparser from libxml2

    API Menu
    API Indexes
    Related links

    This module is deprecated

    interface for a DocBook SGML non-verifying parser This code is DEPRECATED, and should not be used anymore.

    Table of Contents

    Typedef xmlParserInputPtr docbParserInputPtr
    
    Typedef xmlParserCtxt docbParserCtxt
    
    Typedef xmlParserCtxtPtr docbParserCtxtPtr
    
    Typedef xmlParserInput docbParserInput
    
    Typedef xmlDocPtr docbDocPtr
    
    Typedef xmlSAXHandler docbSAXHandler
    
    Typedef xmlSAXHandlerPtr docbSAXHandlerPtr
    
    void	docbFreeParserCtxt		(docbParserCtxtPtr ctxt)
    docbDocPtr	docbParseDoc		(xmlChar * cur, 
    const char * encoding)
    docbParserCtxtPtr	docbCreateFileParserCtxt	(const char * filename, 
    const char * encoding)
    docbDocPtr	docbSAXParseFile	(const char * filename, 
    const char * encoding,
    docbSAXHandlerPtr sax,
    void * userData)
    docbDocPtr	docbSAXParseDoc		(xmlChar * cur, 
    const char * encoding,
    docbSAXHandlerPtr sax,
    void * userData)
    docbParserCtxtPtr	docbCreatePushParserCtxt	(docbSAXHandlerPtr sax, 
    void * user_data,
    const char * chunk,
    int size,
    const char * filename,
    xmlCharEncoding enc)
    int	docbEncodeEntities		(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen,
    int quoteChar)
    docbDocPtr	docbParseFile		(const char * filename, 
    const char * encoding)
    int	docbParseDocument		(docbParserCtxtPtr ctxt)
    int	docbParseChunk			(docbParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    int terminate)

    Description

    Function: docbFreeParserCtxt

    void	docbFreeParserCtxt		(docbParserCtxtPtr ctxt)

    Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed.

    ctxt:an SGML parser context

    Function: docbParseDoc

    docbDocPtr	docbParseDoc		(xmlChar * cur, 
    const char * encoding)

    parse an SGML in-memory document and build a tree.

    cur:a pointer to an array of xmlChar
    encoding:a free form C string describing the SGML document encoding, or NULL
    Returns:the resulting document tree

    Function: docbCreateFileParserCtxt

    docbParserCtxtPtr	docbCreateFileParserCtxt	(const char * filename, 
    const char * encoding)

    Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

    filename:the filename
    encoding:the SGML document encoding, or NULL
    Returns:the new parser context or NULL

    Function: docbSAXParseFile

    docbDocPtr	docbSAXParseFile	(const char * filename, 
    const char * encoding,
    docbSAXHandlerPtr sax,
    void * userData)

    parse an SGML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

    filename:the filename
    encoding:a free form C string describing the SGML document encoding, or NULL
    sax:the SAX handler block
    userData:if using SAX, this pointer will be provided on callbacks.
    Returns:the resulting document tree

    Function: docbSAXParseDoc

    docbDocPtr	docbSAXParseDoc		(xmlChar * cur, 
    const char * encoding,
    docbSAXHandlerPtr sax,
    void * userData)

    parse an SGML in-memory document and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

    cur:a pointer to an array of xmlChar
    encoding:a free form C string describing the SGML document encoding, or NULL
    sax:the SAX handler block
    userData:if using SAX, this pointer will be provided on callbacks.
    Returns:the resulting document tree

    Function: docbCreatePushParserCtxt

    docbParserCtxtPtr	docbCreatePushParserCtxt	(docbSAXHandlerPtr sax, 
    void * user_data,
    const char * chunk,
    int size,
    const char * filename,
    xmlCharEncoding enc)

    Create a parser context for using the DocBook SGML parser in push mode To allow content encoding detection, @size should be >= 4 The value of @filename is used for fetching external entities and error/warning reports.

    sax:a SAX handler
    user_data:The user data returned on SAX callbacks
    chunk:a pointer to an array of chars
    size:number of chars in the array
    filename:an optional file name or URI
    enc:an optional encoding
    Returns:the new parser context or NULL

    Function: docbEncodeEntities

    int	docbEncodeEntities		(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen,
    int quoteChar)

    Take a block of UTF-8 chars in and try to convert it to an ASCII plus SGML entities block of chars out.

    out:a pointer to an array of bytes to store the result
    outlen:the length of @out
    in:a pointer to an array of UTF-8 chars
    inlen:the length of @in
    quoteChar:the quote character to escape (' or ") or zero.
    Returns:0 if success, -2 if the transcoding fails, or -1 otherwise The value of @inlen after return is the number of octets consumed as the return value is positive, else unpredictable. The value of @outlen after return is the number of octets consumed.

    Function: docbParseFile

    docbDocPtr	docbParseFile		(const char * filename, 
    const char * encoding)

    parse a Docbook SGML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

    filename:the filename
    encoding:a free form C string describing document encoding, or NULL
    Returns:the resulting document tree

    Function: docbParseDocument

    int	docbParseDocument		(docbParserCtxtPtr ctxt)

    parse an SGML document (and build a tree if using the standard SAX interface).

    ctxt:an SGML parser context
    Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

    Function: docbParseChunk

    int	docbParseChunk			(docbParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    int terminate)

    Parse a Chunk of memory

    ctxt:an XML parser context
    chunk:an char array
    size:the size in byte of the chunk
    terminate:last chunk indicator
    Returns:zero if no error, the xmlParserErrors otherwise.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlschemas.html0000644000175000017500000013523212134171043020606 0ustar aronaron Module xmlschemas from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlschemas from libxml2

    API Menu
    API Indexes
    Related links

    interface to the XML Schemas handling and schema validity checking, it is incomplete right now.

    Table of Contents

    Structure xmlSchema
    struct _xmlSchema
    Structure xmlSchemaParserCtxt
    struct _xmlSchemaParserCtxt The content of this structure is not made public by the API.
    Typedef xmlSchemaParserCtxt * xmlSchemaParserCtxtPtr
    
    Typedef xmlSchema * xmlSchemaPtr
    
    Typedef xmlSchemaSAXPlugStruct * xmlSchemaSAXPlugPtr
    
    Structure xmlSchemaSAXPlugStruct
    struct _xmlSchemaSAXPlug The content of this structure is not made public by the API.
    Structure xmlSchemaValidCtxt
    struct _xmlSchemaValidCtxt The content of this structure is not made public by the API.
    Typedef xmlSchemaValidCtxt * xmlSchemaValidCtxtPtr
    
    Enum xmlSchemaValidError
    
    Enum xmlSchemaValidOption
    
    void	xmlSchemaDump			(FILE * output, 
    xmlSchemaPtr schema)
    void	xmlSchemaFree			(xmlSchemaPtr schema)
    void	xmlSchemaFreeParserCtxt		(xmlSchemaParserCtxtPtr ctxt)
    void	xmlSchemaFreeValidCtxt		(xmlSchemaValidCtxtPtr ctxt)
    int	xmlSchemaGetParserErrors	(xmlSchemaParserCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc * err,
    xmlSchemaValidityWarningFunc * warn,
    void ** ctx)
    int	xmlSchemaGetValidErrors		(xmlSchemaValidCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc * err,
    xmlSchemaValidityWarningFunc * warn,
    void ** ctx)
    int	xmlSchemaIsValid		(xmlSchemaValidCtxtPtr ctxt)
    xmlSchemaParserCtxtPtr	xmlSchemaNewDocParserCtxt	(xmlDocPtr doc)
    xmlSchemaParserCtxtPtr	xmlSchemaNewMemParserCtxt	(const char * buffer, 
    int size)
    xmlSchemaParserCtxtPtr	xmlSchemaNewParserCtxt	(const char * URL)
    xmlSchemaValidCtxtPtr	xmlSchemaNewValidCtxt	(xmlSchemaPtr schema)
    xmlSchemaPtr	xmlSchemaParse		(xmlSchemaParserCtxtPtr ctxt)
    xmlSchemaSAXPlugPtr	xmlSchemaSAXPlug	(xmlSchemaValidCtxtPtr ctxt, 
    xmlSAXHandlerPtr * sax,
    void ** user_data)
    int	xmlSchemaSAXUnplug		(xmlSchemaSAXPlugPtr plug)
    void	xmlSchemaSetParserErrors	(xmlSchemaParserCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc err,
    xmlSchemaValidityWarningFunc warn,
    void * ctx)
    void	xmlSchemaSetParserStructuredErrors	(xmlSchemaParserCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)
    void	xmlSchemaSetValidErrors		(xmlSchemaValidCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc err,
    xmlSchemaValidityWarningFunc warn,
    void * ctx)
    int	xmlSchemaSetValidOptions	(xmlSchemaValidCtxtPtr ctxt, 
    int options)
    void	xmlSchemaSetValidStructuredErrors	(xmlSchemaValidCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)
    int	xmlSchemaValidCtxtGetOptions	(xmlSchemaValidCtxtPtr ctxt)
    xmlParserCtxtPtr	xmlSchemaValidCtxtGetParserCtxt	(xmlSchemaValidCtxtPtr ctxt)
    int	xmlSchemaValidateDoc		(xmlSchemaValidCtxtPtr ctxt, 
    xmlDocPtr doc)
    int	xmlSchemaValidateFile		(xmlSchemaValidCtxtPtr ctxt, 
    const char * filename,
    int options)
    int	xmlSchemaValidateOneElement	(xmlSchemaValidCtxtPtr ctxt, 
    xmlNodePtr elem)
    void	xmlSchemaValidateSetFilename	(xmlSchemaValidCtxtPtr vctxt, 
    const char * filename)
    void	xmlSchemaValidateSetLocator	(xmlSchemaValidCtxtPtr vctxt, 
    xmlSchemaValidityLocatorFunc f,
    void * ctxt)
    int	xmlSchemaValidateStream		(xmlSchemaValidCtxtPtr ctxt, 
    xmlParserInputBufferPtr input,
    xmlCharEncoding enc,
    xmlSAXHandlerPtr sax,
    void * user_data)
    Function type: xmlSchemaValidityErrorFunc
    void	xmlSchemaValidityErrorFunc	(void * ctx, 
    const char * msg,
    ... ...)
    Function type: xmlSchemaValidityLocatorFunc
    int	xmlSchemaValidityLocatorFunc	(void * ctx, 
    const char ** file,
    unsigned long * line)
    Function type: xmlSchemaValidityWarningFunc
    void	xmlSchemaValidityWarningFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Description

    Structure xmlSchema

    Structure xmlSchema
    struct _xmlSchema { const xmlChar * name : schema name const xmlChar * targetNamespace : the target namespace const xmlChar * version const xmlChar * id : Obsolete xmlDocPtr doc xmlSchemaAnnotPtr annot int flags xmlHashTablePtr typeDecl xmlHashTablePtr attrDecl xmlHashTablePtr attrgrpDecl xmlHashTablePtr elemDecl xmlHashTablePtr notaDecl xmlHashTablePtr schemasImports void * _private : unused by the library for users or bind xmlHashTablePtr groupDecl xmlDictPtr dict void * includes : the includes, this is opaque for now int preserve : whether to free the document int counter : used to give ononymous components uniqu xmlHashTablePtr idcDef : All identity-constraint defs. void * volatiles : Obsolete }

    Structure xmlSchemaParserCtxt

    Structure xmlSchemaParserCtxt
    struct _xmlSchemaParserCtxt { The content of this structure is not made public by the API. }

    Structure xmlSchemaSAXPlugStruct

    Structure xmlSchemaSAXPlugStruct
    struct _xmlSchemaSAXPlug { The content of this structure is not made public by the API. }

    Structure xmlSchemaValidCtxt

    Structure xmlSchemaValidCtxt
    struct _xmlSchemaValidCtxt { The content of this structure is not made public by the API. }

    Enum xmlSchemaValidError

    Enum xmlSchemaValidError {
        XML_SCHEMAS_ERR_OK = 0
        XML_SCHEMAS_ERR_NOROOT = 1
        XML_SCHEMAS_ERR_UNDECLAREDELEM = 2
        XML_SCHEMAS_ERR_NOTTOPLEVEL = 3
        XML_SCHEMAS_ERR_MISSING = 4
        XML_SCHEMAS_ERR_WRONGELEM = 5
        XML_SCHEMAS_ERR_NOTYPE = 6
        XML_SCHEMAS_ERR_NOROLLBACK = 7
        XML_SCHEMAS_ERR_ISABSTRACT = 8
        XML_SCHEMAS_ERR_NOTEMPTY = 9
        XML_SCHEMAS_ERR_ELEMCONT = 10
        XML_SCHEMAS_ERR_HAVEDEFAULT = 11
        XML_SCHEMAS_ERR_NOTNILLABLE = 12
        XML_SCHEMAS_ERR_EXTRACONTENT = 13
        XML_SCHEMAS_ERR_INVALIDATTR = 14
        XML_SCHEMAS_ERR_INVALIDELEM = 15
        XML_SCHEMAS_ERR_NOTDETERMINIST = 16
        XML_SCHEMAS_ERR_CONSTRUCT = 17
        XML_SCHEMAS_ERR_INTERNAL = 18
        XML_SCHEMAS_ERR_NOTSIMPLE = 19
        XML_SCHEMAS_ERR_ATTRUNKNOWN = 20
        XML_SCHEMAS_ERR_ATTRINVALID = 21
        XML_SCHEMAS_ERR_VALUE = 22
        XML_SCHEMAS_ERR_FACET = 23
        XML_SCHEMAS_ERR_ = 24
        XML_SCHEMAS_ERR_XXX = 25
    }
    

    Enum xmlSchemaValidOption

    Enum xmlSchemaValidOption {
        XML_SCHEMA_VAL_VC_I_CREATE = 1 : Default/fixed: create an attribute node * or an element's text node on the instance. *
    }
    

    Function: xmlSchemaDump

    void	xmlSchemaDump			(FILE * output, 
    xmlSchemaPtr schema)

    Dump a Schema structure.

    output:the file output
    schema:a schema structure

    Function: xmlSchemaFree

    void	xmlSchemaFree			(xmlSchemaPtr schema)

    Deallocate a Schema structure.

    schema:a schema structure

    Function: xmlSchemaFreeParserCtxt

    void	xmlSchemaFreeParserCtxt		(xmlSchemaParserCtxtPtr ctxt)

    Free the resources associated to the schema parser context

    ctxt:the schema parser context

    Function: xmlSchemaFreeValidCtxt

    void	xmlSchemaFreeValidCtxt		(xmlSchemaValidCtxtPtr ctxt)

    Free the resources associated to the schema validation context

    ctxt:the schema validation context

    Function: xmlSchemaGetParserErrors

    int	xmlSchemaGetParserErrors	(xmlSchemaParserCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc * err,
    xmlSchemaValidityWarningFunc * warn,
    void ** ctx)

    Get the callback information used to handle errors for a parser context

    ctxt:a XMl-Schema parser context
    err:the error callback result
    warn:the warning callback result
    ctx:contextual data for the callbacks result
    Returns:-1 in case of failure, 0 otherwise

    Function: xmlSchemaGetValidErrors

    int	xmlSchemaGetValidErrors		(xmlSchemaValidCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc * err,
    xmlSchemaValidityWarningFunc * warn,
    void ** ctx)

    Get the error and warning callback informations

    ctxt:a XML-Schema validation context
    err:the error function result
    warn:the warning function result
    ctx:the functions context result
    Returns:-1 in case of error and 0 otherwise

    Function: xmlSchemaIsValid

    int	xmlSchemaIsValid		(xmlSchemaValidCtxtPtr ctxt)

    Check if any error was detected during validation.

    ctxt:the schema validation context
    Returns:1 if valid so far, 0 if errors were detected, and -1 in case of internal error.

    Function: xmlSchemaNewDocParserCtxt

    xmlSchemaParserCtxtPtr	xmlSchemaNewDocParserCtxt	(xmlDocPtr doc)

    Create an XML Schemas parse context for that document. NB. The document may be modified during the parsing process.

    doc:a preparsed document tree
    Returns:the parser context or NULL in case of error

    Function: xmlSchemaNewMemParserCtxt

    xmlSchemaParserCtxtPtr	xmlSchemaNewMemParserCtxt	(const char * buffer, 
    int size)

    Create an XML Schemas parse context for that memory buffer expected to contain an XML Schemas file.

    buffer:a pointer to a char array containing the schemas
    size:the size of the array
    Returns:the parser context or NULL in case of error

    Function: xmlSchemaNewParserCtxt

    xmlSchemaParserCtxtPtr	xmlSchemaNewParserCtxt	(const char * URL)

    Create an XML Schemas parse context for that file/resource expected to contain an XML Schemas file.

    URL:the location of the schema
    Returns:the parser context or NULL in case of error

    Function: xmlSchemaNewValidCtxt

    xmlSchemaValidCtxtPtr	xmlSchemaNewValidCtxt	(xmlSchemaPtr schema)

    Create an XML Schemas validation context based on the given schema.

    schema:a precompiled XML Schemas
    Returns:the validation context or NULL in case of error

    Function: xmlSchemaParse

    xmlSchemaPtr	xmlSchemaParse		(xmlSchemaParserCtxtPtr ctxt)

    parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances.

    ctxt:a schema validation context
    Returns:the internal XML Schema structure built from the resource or NULL in case of error

    Function: xmlSchemaSAXPlug

    xmlSchemaSAXPlugPtr	xmlSchemaSAXPlug	(xmlSchemaValidCtxtPtr ctxt, 
    xmlSAXHandlerPtr * sax,
    void ** user_data)

    Plug a SAX based validation layer in a SAX parsing event flow. The original @saxptr and @dataptr data are replaced by new pointers but the calls to the original will be maintained.

    ctxt:a schema validation context
    sax:a pointer to the original xmlSAXHandlerPtr
    user_data:a pointer to the original SAX user data pointer
    Returns:a pointer to a data structure needed to unplug the validation layer or NULL in case of errors.

    Function: xmlSchemaSAXUnplug

    int	xmlSchemaSAXUnplug		(xmlSchemaSAXPlugPtr plug)

    Unplug a SAX based validation layer in a SAX parsing event flow. The original pointers used in the call are restored.

    plug:a data structure returned by xmlSchemaSAXPlug
    Returns:0 in case of success and -1 in case of failure.

    Function: xmlSchemaSetParserErrors

    void	xmlSchemaSetParserErrors	(xmlSchemaParserCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc err,
    xmlSchemaValidityWarningFunc warn,
    void * ctx)

    Set the callback functions used to handle errors for a validation context

    ctxt:a schema validation context
    err:the error callback
    warn:the warning callback
    ctx:contextual data for the callbacks

    Function: xmlSchemaSetParserStructuredErrors

    void	xmlSchemaSetParserStructuredErrors	(xmlSchemaParserCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)

    Set the structured error callback

    ctxt:a schema parser context
    serror:the structured error function
    ctx:the functions context

    Function: xmlSchemaSetValidErrors

    void	xmlSchemaSetValidErrors		(xmlSchemaValidCtxtPtr ctxt, 
    xmlSchemaValidityErrorFunc err,
    xmlSchemaValidityWarningFunc warn,
    void * ctx)

    Set the error and warning callback informations

    ctxt:a schema validation context
    err:the error function
    warn:the warning function
    ctx:the functions context

    Function: xmlSchemaSetValidOptions

    int	xmlSchemaSetValidOptions	(xmlSchemaValidCtxtPtr ctxt, 
    int options)

    Sets the options to be used during the validation.

    ctxt:a schema validation context
    options:a combination of xmlSchemaValidOption
    Returns:0 in case of success, -1 in case of an API error.

    Function: xmlSchemaSetValidStructuredErrors

    void	xmlSchemaSetValidStructuredErrors	(xmlSchemaValidCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)

    Set the structured error callback

    ctxt:a schema validation context
    serror:the structured error function
    ctx:the functions context

    Function: xmlSchemaValidCtxtGetOptions

    int	xmlSchemaValidCtxtGetOptions	(xmlSchemaValidCtxtPtr ctxt)

    Get the validation context options.

    ctxt:a schema validation context
    Returns:the option combination or -1 on error.

    Function: xmlSchemaValidCtxtGetParserCtxt

    xmlParserCtxtPtr	xmlSchemaValidCtxtGetParserCtxt	(xmlSchemaValidCtxtPtr ctxt)

    allow access to the parser context of the schema validation context

    ctxt:a schema validation context
    Returns:the parser context of the schema validation context or NULL in case of error.

    Function: xmlSchemaValidateDoc

    int	xmlSchemaValidateDoc		(xmlSchemaValidCtxtPtr ctxt, 
    xmlDocPtr doc)

    Validate a document tree in memory.

    ctxt:a schema validation context
    doc:a parsed document tree
    Returns:0 if the document is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlSchemaValidateFile

    int	xmlSchemaValidateFile		(xmlSchemaValidCtxtPtr ctxt, 
    const char * filename,
    int options)

    Do a schemas validation of the given resource, it will use the SAX streamable validation internally.

    ctxt:a schema validation context
    filename:the URI of the instance
    options:a future set of options, currently unused
    Returns:0 if the document is valid, a positive error code number otherwise and -1 in case of an internal or API error.

    Function: xmlSchemaValidateOneElement

    int	xmlSchemaValidateOneElement	(xmlSchemaValidCtxtPtr ctxt, 
    xmlNodePtr elem)

    Validate a branch of a tree, starting with the given @elem.

    ctxt:a schema validation context
    elem:an element node
    Returns:0 if the element and its subtree is valid, a positive error code number otherwise and -1 in case of an internal or API error.

    Function: xmlSchemaValidateSetFilename

    void	xmlSchemaValidateSetFilename	(xmlSchemaValidCtxtPtr vctxt, 
    const char * filename)

    Workaround to provide file error reporting information when this is not provided by current APIs

    vctxt:the schema validation context
    filename:the file name

    Function: xmlSchemaValidateSetLocator

    void	xmlSchemaValidateSetLocator	(xmlSchemaValidCtxtPtr vctxt, 
    xmlSchemaValidityLocatorFunc f,
    void * ctxt)

    Allows to set a locator function to the validation context, which will be used to provide file and line information since those are not provided as part of the SAX validation flow Setting @f to NULL disable the locator.

    vctxt:a schema validation context
    f:the locator function pointer
    ctxt:the locator context

    Function: xmlSchemaValidateStream

    int	xmlSchemaValidateStream		(xmlSchemaValidCtxtPtr ctxt, 
    xmlParserInputBufferPtr input,
    xmlCharEncoding enc,
    xmlSAXHandlerPtr sax,
    void * user_data)

    Validate an input based on a flow of SAX event from the parser and forward the events to the @sax handler with the provided @user_data the user provided @sax handler must be a SAX2 one.

    ctxt:a schema validation context
    input:the input to use for reading the data
    enc:an optional encoding information
    sax:a SAX handler for the resulting events
    user_data:the context to provide to the SAX handler.
    Returns:0 if the document is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

    Function type: xmlSchemaValidityErrorFunc

    Function type: xmlSchemaValidityErrorFunc
    void	xmlSchemaValidityErrorFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Signature of an error callback from an XSD validation

    ctx:the validation context
    msg:the message
    ...:extra arguments

    Function type: xmlSchemaValidityLocatorFunc

    Function type: xmlSchemaValidityLocatorFunc
    int	xmlSchemaValidityLocatorFunc	(void * ctx, 
    const char ** file,
    unsigned long * line)

    A schemas validation locator, a callback called by the validator. This is used when file or node informations are not available to find out what file and line number are affected

    ctx:user provided context
    file:returned file information
    line:returned line information
    Returns:0 in case of success and -1 in case of error

    Function type: xmlSchemaValidityWarningFunc

    Function type: xmlSchemaValidityWarningFunc
    void	xmlSchemaValidityWarningFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Signature of a warning callback from an XSD validation

    ctx:the validation context
    msg:the message
    ...:extra arguments

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-hash.html0000644000175000017500000013271112134171042017363 0ustar aronaron Module hash from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module hash from libxml2

    API Menu
    API Indexes
    Related links

    This module implements the hash table support used in various places in the library.

    Table of Contents

    #define XML_CAST_FPTR
    Structure xmlHashTable
    struct _xmlHashTable The content of this structure is not made public by the API.
    Typedef xmlHashTable * xmlHashTablePtr
    
    int	xmlHashAddEntry			(xmlHashTablePtr table, 
    const xmlChar * name,
    void * userdata)
    int	xmlHashAddEntry2		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    void * userdata)
    int	xmlHashAddEntry3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    void * userdata)
    Function type: xmlHashCopier
    void *	xmlHashCopier			(void * payload, 
    xmlChar * name)
    xmlHashTablePtr	xmlHashCopy		(xmlHashTablePtr table, 
    xmlHashCopier f)
    xmlHashTablePtr	xmlHashCreate		(int size)
    xmlHashTablePtr	xmlHashCreateDict	(int size, 
    xmlDictPtr dict)
    Function type: xmlHashDeallocator
    void	xmlHashDeallocator		(void * payload, 
    xmlChar * name)
    void	xmlHashFree			(xmlHashTablePtr table, 
    xmlHashDeallocator f)
    void *	xmlHashLookup			(xmlHashTablePtr table, 
    const xmlChar * name)
    void *	xmlHashLookup2			(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2)
    void *	xmlHashLookup3			(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3)
    void *	xmlHashQLookup			(xmlHashTablePtr table, 
    const xmlChar * prefix,
    const xmlChar * name)
    void *	xmlHashQLookup2			(xmlHashTablePtr table, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * prefix2,
    const xmlChar * name2)
    void *	xmlHashQLookup3			(xmlHashTablePtr table, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * prefix2,
    const xmlChar * name2,
    const xmlChar * prefix3,
    const xmlChar * name3)
    int	xmlHashRemoveEntry		(xmlHashTablePtr table, 
    const xmlChar * name,
    xmlHashDeallocator f)
    int	xmlHashRemoveEntry2		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    xmlHashDeallocator f)
    int	xmlHashRemoveEntry3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    xmlHashDeallocator f)
    void	xmlHashScan			(xmlHashTablePtr table, 
    xmlHashScanner f,
    void * data)
    void	xmlHashScan3			(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    xmlHashScanner f,
    void * data)
    void	xmlHashScanFull			(xmlHashTablePtr table, 
    xmlHashScannerFull f,
    void * data)
    void	xmlHashScanFull3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    xmlHashScannerFull f,
    void * data)
    Function type: xmlHashScanner
    void	xmlHashScanner			(void * payload, 
    void * data,
    xmlChar * name)
    Function type: xmlHashScannerFull
    void	xmlHashScannerFull		(void * payload, 
    void * data,
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3)
    int	xmlHashSize			(xmlHashTablePtr table)
    int	xmlHashUpdateEntry		(xmlHashTablePtr table, 
    const xmlChar * name,
    void * userdata,
    xmlHashDeallocator f)
    int	xmlHashUpdateEntry2		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    void * userdata,
    xmlHashDeallocator f)
    int	xmlHashUpdateEntry3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    void * userdata,
    xmlHashDeallocator f)

    Description

    Macro: XML_CAST_FPTR

    #define XML_CAST_FPTR

    Macro to do a casting from an object pointer to a function pointer without encountering a warning from gcc #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) This macro violated ISO C aliasing rules (gcc4 on s390 broke) so it is disabled now

    Structure xmlHashTable

    Structure xmlHashTable
    struct _xmlHashTable { The content of this structure is not made public by the API. }

    Function: xmlHashAddEntry

    int	xmlHashAddEntry			(xmlHashTablePtr table, 
    const xmlChar * name,
    void * userdata)

    Add the @userdata to the hash @table. This can later be retrieved by using the @name. Duplicate names generate errors.

    table:the hash table
    name:the name of the userdata
    userdata:a pointer to the userdata
    Returns:0 the addition succeeded and -1 in case of error.

    Function: xmlHashAddEntry2

    int	xmlHashAddEntry2		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    void * userdata)

    Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Duplicate tuples generate errors.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    userdata:a pointer to the userdata
    Returns:0 the addition succeeded and -1 in case of error.

    Function: xmlHashAddEntry3

    int	xmlHashAddEntry3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    void * userdata)

    Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Duplicate entries generate errors.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    name3:a third name of the userdata
    userdata:a pointer to the userdata
    Returns:0 the addition succeeded and -1 in case of error.

    Function type: xmlHashCopier

    Function type: xmlHashCopier
    void *	xmlHashCopier			(void * payload, 
    xmlChar * name)

    Callback to copy data from a hash.

    payload:the data in the hash
    name:the name associated
    Returns:a copy of the data or NULL in case of error.

    Function: xmlHashCopy

    xmlHashTablePtr	xmlHashCopy		(xmlHashTablePtr table, 
    xmlHashCopier f)

    Scan the hash @table and applied @f to each value.

    table:the hash table
    f:the copier function for items in the hash
    Returns:the new table or NULL in case of error.

    Function: xmlHashCreate

    xmlHashTablePtr	xmlHashCreate		(int size)

    Create a new xmlHashTablePtr.

    size:the size of the hash table
    Returns:the newly created object, or NULL if an error occured.

    Function: xmlHashCreateDict

    xmlHashTablePtr	xmlHashCreateDict	(int size, 
    xmlDictPtr dict)

    Create a new xmlHashTablePtr which will use @dict as the internal dictionary

    size:the size of the hash table
    dict:a dictionary to use for the hash
    Returns:the newly created object, or NULL if an error occured.

    Function type: xmlHashDeallocator

    Function type: xmlHashDeallocator
    void	xmlHashDeallocator		(void * payload, 
    xmlChar * name)

    Callback to free data from a hash.

    payload:the data in the hash
    name:the name associated

    Function: xmlHashFree

    void	xmlHashFree			(xmlHashTablePtr table, 
    xmlHashDeallocator f)

    Free the hash @table and its contents. The userdata is deallocated with @f if provided.

    table:the hash table
    f:the deallocator function for items in the hash

    Function: xmlHashLookup

    void *	xmlHashLookup			(xmlHashTablePtr table, 
    const xmlChar * name)

    Find the userdata specified by the @name.

    table:the hash table
    name:the name of the userdata
    Returns:the pointer to the userdata

    Function: xmlHashLookup2

    void *	xmlHashLookup2			(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2)

    Find the userdata specified by the (@name, @name2) tuple.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    Returns:the pointer to the userdata

    Function: xmlHashLookup3

    void *	xmlHashLookup3			(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3)

    Find the userdata specified by the (@name, @name2, @name3) tuple.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    name3:a third name of the userdata
    Returns:the a pointer to the userdata

    Function: xmlHashQLookup

    void *	xmlHashQLookup			(xmlHashTablePtr table, 
    const xmlChar * prefix,
    const xmlChar * name)

    Find the userdata specified by the QName @prefix:@name/@name.

    table:the hash table
    prefix:the prefix of the userdata
    name:the name of the userdata
    Returns:the pointer to the userdata

    Function: xmlHashQLookup2

    void *	xmlHashQLookup2			(xmlHashTablePtr table, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * prefix2,
    const xmlChar * name2)

    Find the userdata specified by the QNames tuple

    table:the hash table
    prefix:the prefix of the userdata
    name:the name of the userdata
    prefix2:the second prefix of the userdata
    name2:a second name of the userdata
    Returns:the pointer to the userdata

    Function: xmlHashQLookup3

    void *	xmlHashQLookup3			(xmlHashTablePtr table, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * prefix2,
    const xmlChar * name2,
    const xmlChar * prefix3,
    const xmlChar * name3)

    Find the userdata specified by the (@name, @name2, @name3) tuple.

    table:the hash table
    prefix:the prefix of the userdata
    name:the name of the userdata
    prefix2:the second prefix of the userdata
    name2:a second name of the userdata
    prefix3:the third prefix of the userdata
    name3:a third name of the userdata
    Returns:the a pointer to the userdata

    Function: xmlHashRemoveEntry

    int	xmlHashRemoveEntry		(xmlHashTablePtr table, 
    const xmlChar * name,
    xmlHashDeallocator f)

    Find the userdata specified by the @name and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.

    table:the hash table
    name:the name of the userdata
    f:the deallocator function for removed item (if any)
    Returns:0 if the removal succeeded and -1 in case of error or not found.

    Function: xmlHashRemoveEntry2

    int	xmlHashRemoveEntry2		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    xmlHashDeallocator f)

    Find the userdata specified by the (@name, @name2) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    f:the deallocator function for removed item (if any)
    Returns:0 if the removal succeeded and -1 in case of error or not found.

    Function: xmlHashRemoveEntry3

    int	xmlHashRemoveEntry3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    xmlHashDeallocator f)

    Find the userdata specified by the (@name, @name2, @name3) tuple and remove it from the hash @table. Existing userdata for this tuple will be removed and freed with @f.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    name3:a third name of the userdata
    f:the deallocator function for removed item (if any)
    Returns:0 if the removal succeeded and -1 in case of error or not found.

    Function: xmlHashScan

    void	xmlHashScan			(xmlHashTablePtr table, 
    xmlHashScanner f,
    void * data)

    Scan the hash @table and applied @f to each value.

    table:the hash table
    f:the scanner function for items in the hash
    data:extra data passed to f

    Function: xmlHashScan3

    void	xmlHashScan3			(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    xmlHashScanner f,
    void * data)

    Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match.

    table:the hash table
    name:the name of the userdata or NULL
    name2:a second name of the userdata or NULL
    name3:a third name of the userdata or NULL
    f:the scanner function for items in the hash
    data:extra data passed to f

    Function: xmlHashScanFull

    void	xmlHashScanFull			(xmlHashTablePtr table, 
    xmlHashScannerFull f,
    void * data)

    Scan the hash @table and applied @f to each value.

    table:the hash table
    f:the scanner function for items in the hash
    data:extra data passed to f

    Function: xmlHashScanFull3

    void	xmlHashScanFull3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    xmlHashScannerFull f,
    void * data)

    Scan the hash @table and applied @f to each value matching (@name, @name2, @name3) tuple. If one of the names is null, the comparison is considered to match.

    table:the hash table
    name:the name of the userdata or NULL
    name2:a second name of the userdata or NULL
    name3:a third name of the userdata or NULL
    f:the scanner function for items in the hash
    data:extra data passed to f

    Function type: xmlHashScanner

    Function type: xmlHashScanner
    void	xmlHashScanner			(void * payload, 
    void * data,
    xmlChar * name)

    Callback when scanning data in a hash with the simple scanner.

    payload:the data in the hash
    data:extra scannner data
    name:the name associated

    Function type: xmlHashScannerFull

    Function type: xmlHashScannerFull
    void	xmlHashScannerFull		(void * payload, 
    void * data,
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3)

    Callback when scanning data in a hash with the full scanner.

    payload:the data in the hash
    data:extra scannner data
    name:the name associated
    name2:the second name associated
    name3:the third name associated

    Function: xmlHashSize

    int	xmlHashSize			(xmlHashTablePtr table)

    Query the number of elements installed in the hash @table.

    table:the hash table
    Returns:the number of elements in the hash table or -1 in case of error

    Function: xmlHashUpdateEntry

    int	xmlHashUpdateEntry		(xmlHashTablePtr table, 
    const xmlChar * name,
    void * userdata,
    xmlHashDeallocator f)

    Add the @userdata to the hash @table. This can later be retrieved by using the @name. Existing entry for this @name will be removed and freed with @f if found.

    table:the hash table
    name:the name of the userdata
    userdata:a pointer to the userdata
    f:the deallocator function for replaced item (if any)
    Returns:0 the addition succeeded and -1 in case of error.

    Function: xmlHashUpdateEntry2

    int	xmlHashUpdateEntry2		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    void * userdata,
    xmlHashDeallocator f)

    Add the @userdata to the hash @table. This can later be retrieved by using the (@name, @name2) tuple. Existing entry for this tuple will be removed and freed with @f if found.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    userdata:a pointer to the userdata
    f:the deallocator function for replaced item (if any)
    Returns:0 the addition succeeded and -1 in case of error.

    Function: xmlHashUpdateEntry3

    int	xmlHashUpdateEntry3		(xmlHashTablePtr table, 
    const xmlChar * name,
    const xmlChar * name2,
    const xmlChar * name3,
    void * userdata,
    xmlHashDeallocator f)

    Add the @userdata to the hash @table. This can later be retrieved by using the tuple (@name, @name2, @name3). Existing entry for this tuple will be removed and freed with @f if found.

    table:the hash table
    name:the name of the userdata
    name2:a second name of the userdata
    name3:a third name of the userdata
    userdata:a pointer to the userdata
    f:the deallocator function for replaced item (if any)
    Returns:0 the addition succeeded and -1 in case of error.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/index.html0000644000175000017500000002264312134171042016264 0ustar aronaron Reference Manual for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Reference Manual for libxml2

    API Menu
    API Indexes
    Related links

    Table of Contents

    • DOCBparser: old DocBook SGML parser
    • HTMLparser: interface for an HTML 4.0 non-verifying parser
    • HTMLtree: specific APIs to process HTML tree, especially serialization
    • SAX: Old SAX version 1 handler, deprecated
    • SAX2: SAX2 parser interface used to build the DOM tree
    • c14n: Provide Canonical XML and Exclusive XML Canonicalization
    • catalog: interfaces to the Catalog handling system
    • chvalid: Unicode character range checking
    • debugXML: Tree debugging APIs
    • dict: string dictionnary
    • encoding: interface for the encoding conversion functions
    • entities: interface for the XML entities handling
    • globals: interface for all global variables of the library
    • hash: Chained hash tables
    • list: lists interfaces
    • nanoftp: minimal FTP implementation
    • nanohttp: minimal HTTP implementation
    • parser: the core parser module
    • parserInternals: internals routines and limits exported by the parser.
    • pattern: pattern expression handling
    • relaxng: implementation of the Relax-NG validation
    • schemasInternals: internal interfaces for XML Schemas
    • schematron: XML Schemastron implementation
    • threads: interfaces for thread handling
    • tree: interfaces for tree manipulation
    • uri: library of generic URI related routines
    • valid: The DTD validation
    • xinclude: implementation of XInclude
    • xlink: unfinished XLink detection module
    • xmlIO: interface for the I/O interfaces used by the parser
    • xmlautomata: API to build regexp automata
    • xmlerror: error handling
    • xmlexports: macros for marking symbols as exportable/importable.
    • xmlmemory: interface for the memory allocator
    • xmlmodule: dynamic module loading
    • xmlreader: the XMLReader implementation
    • xmlregexp: regular expressions handling
    • xmlsave: the XML document serializer
    • xmlschemas: incomplete XML Schemas structure implementation
    • xmlschemastypes: implementation of XML Schema Datatypes
    • xmlstring: set of routines to process strings
    • xmlunicode: Unicode character APIs
    • xmlversion: compile-time version informations
    • xmlwriter: text writing API for XML
    • xpath: XML Path Language implementation
    • xpathInternals: internal interfaces for XML Path Language implementation
    • xpointer: API to handle XML Pointers

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlwriter.html0000644000175000017500000034534512134171043020507 0ustar aronaron Module xmlwriter from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlwriter from libxml2

    API Menu
    API Indexes
    Related links

    text writing API for XML

    Table of Contents

    #define xmlTextWriterWriteDocType
    #define xmlTextWriterWriteProcessingInstruction
    Structure xmlTextWriter
    struct _xmlTextWriter The content of this structure is not made public by the API.
    Typedef xmlTextWriter * xmlTextWriterPtr
    
    void	xmlFreeTextWriter		(xmlTextWriterPtr writer)
    xmlTextWriterPtr	xmlNewTextWriter	(xmlOutputBufferPtr out)
    xmlTextWriterPtr	xmlNewTextWriterDoc	(xmlDocPtr * doc, 
    int compression)
    xmlTextWriterPtr	xmlNewTextWriterFilename	(const char * uri, 
    int compression)
    xmlTextWriterPtr	xmlNewTextWriterMemory	(xmlBufferPtr buf, 
    int compression)
    xmlTextWriterPtr	xmlNewTextWriterPushParser	(xmlParserCtxtPtr ctxt, 
    int compression)
    xmlTextWriterPtr	xmlNewTextWriterTree	(xmlDocPtr doc, 
    xmlNodePtr node,
    int compression)
    int	xmlTextWriterEndAttribute	(xmlTextWriterPtr writer)
    int	xmlTextWriterEndCDATA		(xmlTextWriterPtr writer)
    int	xmlTextWriterEndComment		(xmlTextWriterPtr writer)
    int	xmlTextWriterEndDTD		(xmlTextWriterPtr writer)
    int	xmlTextWriterEndDTDAttlist	(xmlTextWriterPtr writer)
    int	xmlTextWriterEndDTDElement	(xmlTextWriterPtr writer)
    int	xmlTextWriterEndDTDEntity	(xmlTextWriterPtr writer)
    int	xmlTextWriterEndDocument	(xmlTextWriterPtr writer)
    int	xmlTextWriterEndElement		(xmlTextWriterPtr writer)
    int	xmlTextWriterEndPI		(xmlTextWriterPtr writer)
    int	xmlTextWriterFlush		(xmlTextWriterPtr writer)
    int	xmlTextWriterFullEndElement	(xmlTextWriterPtr writer)
    int	xmlTextWriterSetIndent		(xmlTextWriterPtr writer, 
    int indent)
    int	xmlTextWriterSetIndentString	(xmlTextWriterPtr writer, 
    const xmlChar * str)
    int	xmlTextWriterSetQuoteChar	(xmlTextWriterPtr writer, 
    xmlChar quotechar)
    int	xmlTextWriterStartAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name)
    int	xmlTextWriterStartAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI)
    int	xmlTextWriterStartCDATA		(xmlTextWriterPtr writer)
    int	xmlTextWriterStartComment	(xmlTextWriterPtr writer)
    int	xmlTextWriterStartDTD		(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid)
    int	xmlTextWriterStartDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name)
    int	xmlTextWriterStartDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name)
    int	xmlTextWriterStartDTDEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name)
    int	xmlTextWriterStartDocument	(xmlTextWriterPtr writer, 
    const char * version,
    const char * encoding,
    const char * standalone)
    int	xmlTextWriterStartElement	(xmlTextWriterPtr writer, 
    const xmlChar * name)
    int	xmlTextWriterStartElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI)
    int	xmlTextWriterStartPI		(xmlTextWriterPtr writer, 
    const xmlChar * target)
    int	xmlTextWriterWriteAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)
    int	xmlTextWriterWriteAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const xmlChar * content)
    int	xmlTextWriterWriteBase64	(xmlTextWriterPtr writer, 
    const char * data,
    int start,
    int len)
    int	xmlTextWriterWriteBinHex	(xmlTextWriterPtr writer, 
    const char * data,
    int start,
    int len)
    int	xmlTextWriterWriteCDATA		(xmlTextWriterPtr writer, 
    const xmlChar * content)
    int	xmlTextWriterWriteComment	(xmlTextWriterPtr writer, 
    const xmlChar * content)
    int	xmlTextWriterWriteDTD		(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * subset)
    int	xmlTextWriterWriteDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)
    int	xmlTextWriterWriteDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)
    int	xmlTextWriterWriteDTDEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * ndataid,
    const xmlChar * content)
    int	xmlTextWriterWriteDTDExternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * ndataid)
    int	xmlTextWriterWriteDTDExternalEntityContents	(xmlTextWriterPtr writer, 
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * ndataid)
    int	xmlTextWriterWriteDTDInternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const xmlChar * content)
    int	xmlTextWriterWriteDTDNotation	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid)
    int	xmlTextWriterWriteElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)
    int	xmlTextWriterWriteElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const xmlChar * content)
    int	xmlTextWriterWriteFormatAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatCDATA	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatComment	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatDTD	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatDTDInternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatPI	(xmlTextWriterPtr writer, 
    const xmlChar * target,
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatRaw	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)
    int	xmlTextWriterWriteFormatString	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)
    int	xmlTextWriterWritePI		(xmlTextWriterPtr writer, 
    const xmlChar * target,
    const xmlChar * content)
    int	xmlTextWriterWriteRaw		(xmlTextWriterPtr writer, 
    const xmlChar * content)
    int	xmlTextWriterWriteRawLen	(xmlTextWriterPtr writer, 
    const xmlChar * content,
    int len)
    int	xmlTextWriterWriteString	(xmlTextWriterPtr writer, 
    const xmlChar * content)
    int	xmlTextWriterWriteVFormatAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatCDATA	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatComment	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatDTD	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatDTDInternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatPI	(xmlTextWriterPtr writer, 
    const xmlChar * target,
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatRaw	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)
    int	xmlTextWriterWriteVFormatString	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)

    Description

    Macro: xmlTextWriterWriteDocType

    #define xmlTextWriterWriteDocType

    this macro maps to xmlTextWriterWriteDTD

    Macro: xmlTextWriterWriteProcessingInstruction

    #define xmlTextWriterWriteProcessingInstruction

    This macro maps to xmlTextWriterWritePI

    Structure xmlTextWriter

    Structure xmlTextWriter
    struct _xmlTextWriter { The content of this structure is not made public by the API. }

    Function: xmlFreeTextWriter

    void	xmlFreeTextWriter		(xmlTextWriterPtr writer)

    Deallocate all the resources associated to the writer

    writer:the xmlTextWriterPtr

    Function: xmlNewTextWriter

    xmlTextWriterPtr	xmlNewTextWriter	(xmlOutputBufferPtr out)

    Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr NOTE: the @out parameter will be deallocated when the writer is closed (if the call succeed.)

    out:an xmlOutputBufferPtr
    Returns:the new xmlTextWriterPtr or NULL in case of error

    Function: xmlNewTextWriterDoc

    xmlTextWriterPtr	xmlNewTextWriterDoc	(xmlDocPtr * doc, 
    int compression)

    Create a new xmlNewTextWriter structure with @*doc as output

    doc:address of a xmlDocPtr to hold the new XML document tree
    compression:compress the output?
    Returns:the new xmlTextWriterPtr or NULL in case of error

    Function: xmlNewTextWriterFilename

    xmlTextWriterPtr	xmlNewTextWriterFilename	(const char * uri, 
    int compression)

    Create a new xmlNewTextWriter structure with @uri as output

    uri:the URI of the resource for the output
    compression:compress the output?
    Returns:the new xmlTextWriterPtr or NULL in case of error

    Function: xmlNewTextWriterMemory

    xmlTextWriterPtr	xmlNewTextWriterMemory	(xmlBufferPtr buf, 
    int compression)

    Create a new xmlNewTextWriter structure with @buf as output TODO: handle compression

    buf:xmlBufferPtr
    compression:compress the output?
    Returns:the new xmlTextWriterPtr or NULL in case of error

    Function: xmlNewTextWriterPushParser

    xmlTextWriterPtr	xmlNewTextWriterPushParser	(xmlParserCtxtPtr ctxt, 
    int compression)

    Create a new xmlNewTextWriter structure with @ctxt as output NOTE: the @ctxt context will be freed with the resulting writer (if the call succeeds). TODO: handle compression

    ctxt:xmlParserCtxtPtr to hold the new XML document tree
    compression:compress the output?
    Returns:the new xmlTextWriterPtr or NULL in case of error

    Function: xmlNewTextWriterTree

    xmlTextWriterPtr	xmlNewTextWriterTree	(xmlDocPtr doc, 
    xmlNodePtr node,
    int compression)

    Create a new xmlNewTextWriter structure with @doc as output starting at @node

    doc:xmlDocPtr
    node:xmlNodePtr or NULL for doc->children
    compression:compress the output?
    Returns:the new xmlTextWriterPtr or NULL in case of error

    Function: xmlTextWriterEndAttribute

    int	xmlTextWriterEndAttribute	(xmlTextWriterPtr writer)

    End the current xml element.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndCDATA

    int	xmlTextWriterEndCDATA		(xmlTextWriterPtr writer)

    End an xml CDATA section.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndComment

    int	xmlTextWriterEndComment		(xmlTextWriterPtr writer)

    End the current xml coment.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndDTD

    int	xmlTextWriterEndDTD		(xmlTextWriterPtr writer)

    End an xml DTD.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndDTDAttlist

    int	xmlTextWriterEndDTDAttlist	(xmlTextWriterPtr writer)

    End an xml DTD attribute list.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndDTDElement

    int	xmlTextWriterEndDTDElement	(xmlTextWriterPtr writer)

    End an xml DTD element.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndDTDEntity

    int	xmlTextWriterEndDTDEntity	(xmlTextWriterPtr writer)

    End an xml DTD entity.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndDocument

    int	xmlTextWriterEndDocument	(xmlTextWriterPtr writer)

    End an xml document. All open elements are closed, and the content is flushed to the output.

    writer:the xmlTextWriterPtr
    Returns:the bytes written or -1 in case of error

    Function: xmlTextWriterEndElement

    int	xmlTextWriterEndElement		(xmlTextWriterPtr writer)

    End the current xml element.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterEndPI

    int	xmlTextWriterEndPI		(xmlTextWriterPtr writer)

    End the current xml PI.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterFlush

    int	xmlTextWriterFlush		(xmlTextWriterPtr writer)

    Flush the output buffer.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterFullEndElement

    int	xmlTextWriterFullEndElement	(xmlTextWriterPtr writer)

    End the current xml element. Writes an end tag even if the element is empty

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterSetIndent

    int	xmlTextWriterSetIndent		(xmlTextWriterPtr writer, 
    int indent)

    Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.

    writer:the xmlTextWriterPtr
    indent:do indentation?
    Returns:-1 on error or 0 otherwise.

    Function: xmlTextWriterSetIndentString

    int	xmlTextWriterSetIndentString	(xmlTextWriterPtr writer, 
    const xmlChar * str)

    Set string indentation.

    writer:the xmlTextWriterPtr
    str:the xmlChar string
    Returns:-1 on error or 0 otherwise.

    Function: xmlTextWriterSetQuoteChar

    int	xmlTextWriterSetQuoteChar	(xmlTextWriterPtr writer, 
    xmlChar quotechar)

    Set the character used for quoting attributes.

    writer:the xmlTextWriterPtr
    quotechar:the quote character
    Returns:-1 on error or 0 otherwise.

    Function: xmlTextWriterStartAttribute

    int	xmlTextWriterStartAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name)

    Start an xml attribute.

    writer:the xmlTextWriterPtr
    name:element name
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartAttributeNS

    int	xmlTextWriterStartAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI)

    Start an xml attribute with namespace support.

    writer:the xmlTextWriterPtr
    prefix:namespace prefix or NULL
    name:element local name
    namespaceURI:namespace URI or NULL
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartCDATA

    int	xmlTextWriterStartCDATA		(xmlTextWriterPtr writer)

    Start an xml CDATA section.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartComment

    int	xmlTextWriterStartComment	(xmlTextWriterPtr writer)

    Start an xml comment.

    writer:the xmlTextWriterPtr
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartDTD

    int	xmlTextWriterStartDTD		(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid)

    Start an xml DTD.

    writer:the xmlTextWriterPtr
    name:the name of the DTD
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartDTDAttlist

    int	xmlTextWriterStartDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name)

    Start an xml DTD ATTLIST.

    writer:the xmlTextWriterPtr
    name:the name of the DTD ATTLIST
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartDTDElement

    int	xmlTextWriterStartDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name)

    Start an xml DTD element.

    writer:the xmlTextWriterPtr
    name:the name of the DTD element
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartDTDEntity

    int	xmlTextWriterStartDTDEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name)

    Start an xml DTD ATTLIST.

    writer:the xmlTextWriterPtr
    pe:TRUE if this is a parameter entity, FALSE if not
    name:the name of the DTD ATTLIST
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartDocument

    int	xmlTextWriterStartDocument	(xmlTextWriterPtr writer, 
    const char * version,
    const char * encoding,
    const char * standalone)

    Start a new xml document

    writer:the xmlTextWriterPtr
    version:the xml version ("1.0") or NULL for default ("1.0")
    encoding:the encoding or NULL for default
    standalone:"yes" or "no" or NULL for default
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartElement

    int	xmlTextWriterStartElement	(xmlTextWriterPtr writer, 
    const xmlChar * name)

    Start an xml element.

    writer:the xmlTextWriterPtr
    name:element name
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartElementNS

    int	xmlTextWriterStartElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI)

    Start an xml element with namespace support.

    writer:the xmlTextWriterPtr
    prefix:namespace prefix or NULL
    name:element local name
    namespaceURI:namespace URI or NULL
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterStartPI

    int	xmlTextWriterStartPI		(xmlTextWriterPtr writer, 
    const xmlChar * target)

    Start an xml PI.

    writer:the xmlTextWriterPtr
    target:PI target
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteAttribute

    int	xmlTextWriterWriteAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)

    Write an xml attribute.

    writer:the xmlTextWriterPtr
    name:attribute name
    content:attribute content
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteAttributeNS

    int	xmlTextWriterWriteAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const xmlChar * content)

    Write an xml attribute.

    writer:the xmlTextWriterPtr
    prefix:namespace prefix
    name:attribute local name
    namespaceURI:namespace URI
    content:attribute content
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteBase64

    int	xmlTextWriterWriteBase64	(xmlTextWriterPtr writer, 
    const char * data,
    int start,
    int len)

    Write an base64 encoded xml text.

    writer:the xmlTextWriterPtr
    data:binary data
    start:the position within the data of the first byte to encode
    len:the number of bytes to encode
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteBinHex

    int	xmlTextWriterWriteBinHex	(xmlTextWriterPtr writer, 
    const char * data,
    int start,
    int len)

    Write a BinHex encoded xml text.

    writer:the xmlTextWriterPtr
    data:binary data
    start:the position within the data of the first byte to encode
    len:the number of bytes to encode
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteCDATA

    int	xmlTextWriterWriteCDATA		(xmlTextWriterPtr writer, 
    const xmlChar * content)

    Write an xml CDATA.

    writer:the xmlTextWriterPtr
    content:CDATA content
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteComment

    int	xmlTextWriterWriteComment	(xmlTextWriterPtr writer, 
    const xmlChar * content)

    Write an xml comment.

    writer:the xmlTextWriterPtr
    content:comment string
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTD

    int	xmlTextWriterWriteDTD		(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * subset)

    Write a DTD.

    writer:the xmlTextWriterPtr
    name:the name of the DTD
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    subset:string content of the DTD
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTDAttlist

    int	xmlTextWriterWriteDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)

    Write a DTD ATTLIST.

    writer:the xmlTextWriterPtr
    name:the name of the DTD ATTLIST
    content:content of the ATTLIST
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTDElement

    int	xmlTextWriterWriteDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)

    Write a DTD element.

    writer:the xmlTextWriterPtr
    name:the name of the DTD element
    content:content of the element
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTDEntity

    int	xmlTextWriterWriteDTDEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * ndataid,
    const xmlChar * content)

    Write a DTD entity.

    writer:the xmlTextWriterPtr
    pe:TRUE if this is a parameter entity, FALSE if not
    name:the name of the DTD entity
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    ndataid:the xml notation name.
    content:content of the entity
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTDExternalEntity

    int	xmlTextWriterWriteDTDExternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * ndataid)

    Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity

    writer:the xmlTextWriterPtr
    pe:TRUE if this is a parameter entity, FALSE if not
    name:the name of the DTD entity
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    ndataid:the xml notation name.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTDExternalEntityContents

    int	xmlTextWriterWriteDTDExternalEntityContents	(xmlTextWriterPtr writer, 
    const xmlChar * pubid,
    const xmlChar * sysid,
    const xmlChar * ndataid)

    Write the contents of a DTD external entity.

    writer:the xmlTextWriterPtr
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    ndataid:the xml notation name.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTDInternalEntity

    int	xmlTextWriterWriteDTDInternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const xmlChar * content)

    Write a DTD internal entity.

    writer:the xmlTextWriterPtr
    pe:TRUE if this is a parameter entity, FALSE if not
    name:the name of the DTD entity
    content:content of the entity
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteDTDNotation

    int	xmlTextWriterWriteDTDNotation	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid)

    Write a DTD entity.

    writer:the xmlTextWriterPtr
    name:the name of the xml notation
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteElement

    int	xmlTextWriterWriteElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * content)

    Write an xml element.

    writer:the xmlTextWriterPtr
    name:element name
    content:element content
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteElementNS

    int	xmlTextWriterWriteElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const xmlChar * content)

    Write an xml element with namespace support.

    writer:the xmlTextWriterPtr
    prefix:namespace prefix
    name:element local name
    namespaceURI:namespace URI
    content:element content
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatAttribute

    int	xmlTextWriterWriteFormatAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)

    Write a formatted xml attribute.

    writer:the xmlTextWriterPtr
    name:attribute name
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatAttributeNS

    int	xmlTextWriterWriteFormatAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    ... ...)

    Write a formatted xml attribute.with namespace support

    writer:the xmlTextWriterPtr
    prefix:namespace prefix
    name:attribute local name
    namespaceURI:namespace URI
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatCDATA

    int	xmlTextWriterWriteFormatCDATA	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)

    Write a formatted xml CDATA.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatComment

    int	xmlTextWriterWriteFormatComment	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)

    Write an xml comment.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatDTD

    int	xmlTextWriterWriteFormatDTD	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const char * format,
    ... ...)

    Write a DTD with a formatted markup declarations part.

    writer:the xmlTextWriterPtr
    name:the name of the DTD
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatDTDAttlist

    int	xmlTextWriterWriteFormatDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)

    Write a formatted DTD ATTLIST.

    writer:the xmlTextWriterPtr
    name:the name of the DTD ATTLIST
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatDTDElement

    int	xmlTextWriterWriteFormatDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)

    Write a formatted DTD element.

    writer:the xmlTextWriterPtr
    name:the name of the DTD element
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatDTDInternalEntity

    int	xmlTextWriterWriteFormatDTDInternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const char * format,
    ... ...)

    Write a formatted DTD internal entity.

    writer:the xmlTextWriterPtr
    pe:TRUE if this is a parameter entity, FALSE if not
    name:the name of the DTD entity
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatElement

    int	xmlTextWriterWriteFormatElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    ... ...)

    Write a formatted xml element.

    writer:the xmlTextWriterPtr
    name:element name
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatElementNS

    int	xmlTextWriterWriteFormatElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    ... ...)

    Write a formatted xml element with namespace support.

    writer:the xmlTextWriterPtr
    prefix:namespace prefix
    name:element local name
    namespaceURI:namespace URI
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatPI

    int	xmlTextWriterWriteFormatPI	(xmlTextWriterPtr writer, 
    const xmlChar * target,
    const char * format,
    ... ...)

    Write a formatted PI.

    writer:the xmlTextWriterPtr
    target:PI target
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatRaw

    int	xmlTextWriterWriteFormatRaw	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)

    Write a formatted raw xml text.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteFormatString

    int	xmlTextWriterWriteFormatString	(xmlTextWriterPtr writer, 
    const char * format,
    ... ...)

    Write a formatted xml text.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    ...:extra parameters for the format
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWritePI

    int	xmlTextWriterWritePI		(xmlTextWriterPtr writer, 
    const xmlChar * target,
    const xmlChar * content)

    Write an xml PI.

    writer:the xmlTextWriterPtr
    target:PI target
    content:PI content
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteRaw

    int	xmlTextWriterWriteRaw		(xmlTextWriterPtr writer, 
    const xmlChar * content)

    Write a raw xml text.

    writer:the xmlTextWriterPtr
    content:text string
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteRawLen

    int	xmlTextWriterWriteRawLen	(xmlTextWriterPtr writer, 
    const xmlChar * content,
    int len)

    Write an xml text. TODO: what about entities and special chars??

    writer:the xmlTextWriterPtr
    content:text string
    len:length of the text string
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteString

    int	xmlTextWriterWriteString	(xmlTextWriterPtr writer, 
    const xmlChar * content)

    Write an xml text.

    writer:the xmlTextWriterPtr
    content:text string
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatAttribute

    int	xmlTextWriterWriteVFormatAttribute	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)

    Write a formatted xml attribute.

    writer:the xmlTextWriterPtr
    name:attribute name
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatAttributeNS

    int	xmlTextWriterWriteVFormatAttributeNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    va_list argptr)

    Write a formatted xml attribute.with namespace support

    writer:the xmlTextWriterPtr
    prefix:namespace prefix
    name:attribute local name
    namespaceURI:namespace URI
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatCDATA

    int	xmlTextWriterWriteVFormatCDATA	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)

    Write a formatted xml CDATA.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatComment

    int	xmlTextWriterWriteVFormatComment	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)

    Write an xml comment.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatDTD

    int	xmlTextWriterWriteVFormatDTD	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const xmlChar * pubid,
    const xmlChar * sysid,
    const char * format,
    va_list argptr)

    Write a DTD with a formatted markup declarations part.

    writer:the xmlTextWriterPtr
    name:the name of the DTD
    pubid:the public identifier, which is an alternative to the system identifier
    sysid:the system identifier, which is the URI of the DTD
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatDTDAttlist

    int	xmlTextWriterWriteVFormatDTDAttlist	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)

    Write a formatted DTD ATTLIST.

    writer:the xmlTextWriterPtr
    name:the name of the DTD ATTLIST
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatDTDElement

    int	xmlTextWriterWriteVFormatDTDElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)

    Write a formatted DTD element.

    writer:the xmlTextWriterPtr
    name:the name of the DTD element
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatDTDInternalEntity

    int	xmlTextWriterWriteVFormatDTDInternalEntity	(xmlTextWriterPtr writer, 
    int pe,
    const xmlChar * name,
    const char * format,
    va_list argptr)

    Write a formatted DTD internal entity.

    writer:the xmlTextWriterPtr
    pe:TRUE if this is a parameter entity, FALSE if not
    name:the name of the DTD entity
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatElement

    int	xmlTextWriterWriteVFormatElement	(xmlTextWriterPtr writer, 
    const xmlChar * name,
    const char * format,
    va_list argptr)

    Write a formatted xml element.

    writer:the xmlTextWriterPtr
    name:element name
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatElementNS

    int	xmlTextWriterWriteVFormatElementNS	(xmlTextWriterPtr writer, 
    const xmlChar * prefix,
    const xmlChar * name,
    const xmlChar * namespaceURI,
    const char * format,
    va_list argptr)

    Write a formatted xml element with namespace support.

    writer:the xmlTextWriterPtr
    prefix:namespace prefix
    name:element local name
    namespaceURI:namespace URI
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatPI

    int	xmlTextWriterWriteVFormatPI	(xmlTextWriterPtr writer, 
    const xmlChar * target,
    const char * format,
    va_list argptr)

    Write a formatted xml PI.

    writer:the xmlTextWriterPtr
    target:PI target
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatRaw

    int	xmlTextWriterWriteVFormatRaw	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)

    Write a formatted raw xml text.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Function: xmlTextWriterWriteVFormatString

    int	xmlTextWriterWriteVFormatString	(xmlTextWriterPtr writer, 
    const char * format,
    va_list argptr)

    Write a formatted xml text.

    writer:the xmlTextWriterPtr
    format:format string (see printf)
    argptr:pointer to the first member of the variable argument list.
    Returns:the bytes written (may be 0 because of buffering) or -1 in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlautomata.html0000644000175000017500000011521412134171042020773 0ustar aronaron Module xmlautomata from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlautomata from libxml2

    API Menu
    API Indexes
    Related links

    the API to build regexp automata

    Table of Contents

    Structure xmlAutomata
    struct _xmlAutomata The content of this structure is not made public by the API.
    Typedef xmlAutomata * xmlAutomataPtr
    
    Structure xmlAutomataState
    struct _xmlAutomataState The content of this structure is not made public by the API.
    Typedef xmlAutomataState * xmlAutomataStatePtr
    
    xmlRegexpPtr	xmlAutomataCompile	(xmlAutomataPtr am)
    xmlAutomataStatePtr	xmlAutomataGetInitState	(xmlAutomataPtr am)
    int	xmlAutomataIsDeterminist	(xmlAutomataPtr am)
    xmlAutomataStatePtr	xmlAutomataNewAllTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    int lax)
    xmlAutomataStatePtr	xmlAutomataNewCountTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    int min,
    int max,
    void * data)
    xmlAutomataStatePtr	xmlAutomataNewCountTrans2	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    int min,
    int max,
    void * data)
    xmlAutomataStatePtr	xmlAutomataNewCountedTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    int counter)
    int	xmlAutomataNewCounter		(xmlAutomataPtr am, 
    int min,
    int max)
    xmlAutomataStatePtr	xmlAutomataNewCounterTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    int counter)
    xmlAutomataStatePtr	xmlAutomataNewEpsilon	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to)
    xmlAutomataStatePtr	xmlAutomataNewNegTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    void * data)
    xmlAutomataStatePtr	xmlAutomataNewOnceTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    int min,
    int max,
    void * data)
    xmlAutomataStatePtr	xmlAutomataNewOnceTrans2	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    int min,
    int max,
    void * data)
    xmlAutomataStatePtr	xmlAutomataNewState	(xmlAutomataPtr am)
    xmlAutomataStatePtr	xmlAutomataNewTransition	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    void * data)
    xmlAutomataStatePtr	xmlAutomataNewTransition2	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    void * data)
    int	xmlAutomataSetFinalState	(xmlAutomataPtr am, 
    xmlAutomataStatePtr state)
    void	xmlFreeAutomata			(xmlAutomataPtr am)
    xmlAutomataPtr	xmlNewAutomata		(void)

    Description

    Structure xmlAutomata

    Structure xmlAutomata
    struct _xmlAutomata { The content of this structure is not made public by the API. }
    A libxml automata description, It can be compiled into a regexp

    Structure xmlAutomataState

    Structure xmlAutomataState
    struct _xmlAutomataState { The content of this structure is not made public by the API. }
    A state int the automata description,

    Function: xmlAutomataCompile

    xmlRegexpPtr	xmlAutomataCompile	(xmlAutomataPtr am)

    Compile the automata into a Reg Exp ready for being executed. The automata should be free after this point.

    am:an automata
    Returns:the compiled regexp or NULL in case of error

    Function: xmlAutomataGetInitState

    xmlAutomataStatePtr	xmlAutomataGetInitState	(xmlAutomataPtr am)

    Initial state lookup

    am:an automata
    Returns:the initial state of the automata

    Function: xmlAutomataIsDeterminist

    int	xmlAutomataIsDeterminist	(xmlAutomataPtr am)

    Checks if an automata is determinist.

    am:an automata
    Returns:1 if true, 0 if not, and -1 in case of error

    Function: xmlAutomataNewAllTrans

    xmlAutomataStatePtr	xmlAutomataNewAllTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    int lax)

    If @to is NULL, this creates first a new target state in the automata and then adds a an ALL transition from the @from state to the target state. That transition is an epsilon transition allowed only when all transitions from the @from node have been activated.

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    lax:allow to transition if not all all transitions have been activated
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewCountTrans

    xmlAutomataStatePtr	xmlAutomataNewCountTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    int min,
    int max,
    void * data)

    If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    token:the input string associated to that transition
    min:the minimum successive occurences of token
    max:the maximum successive occurences of token
    data:data associated to the transition
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewCountTrans2

    xmlAutomataStatePtr	xmlAutomataNewCountTrans2	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    int min,
    int max,
    void * data)

    If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    token:the input string associated to that transition
    token2:the second input string associated to that transition
    min:the minimum successive occurences of token
    max:the maximum successive occurences of token
    data:data associated to the transition
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewCountedTrans

    xmlAutomataStatePtr	xmlAutomataNewCountedTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    int counter)

    If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will increment the counter provided

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    counter:the counter associated to that transition
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewCounter

    int	xmlAutomataNewCounter		(xmlAutomataPtr am, 
    int min,
    int max)

    Create a new counter

    am:an automata
    min:the minimal value on the counter
    max:the maximal value on the counter
    Returns:the counter number or -1 in case of error

    Function: xmlAutomataNewCounterTrans

    xmlAutomataStatePtr	xmlAutomataNewCounterTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    int counter)

    If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state which will be allowed only if the counter is within the right range.

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    counter:the counter associated to that transition
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewEpsilon

    xmlAutomataStatePtr	xmlAutomataNewEpsilon	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to)

    If @to is NULL, this creates first a new target state in the automata and then adds an epsilon transition from the @from state to the target state

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewNegTrans

    xmlAutomataStatePtr	xmlAutomataNewNegTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    void * data)

    If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by any value except (@token,@token2) Note that if @token2 is not NULL, then (X, NULL) won't match to follow # the semantic of XSD ##other

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    token:the first input string associated to that transition
    token2:the second input string associated to that transition
    data:data passed to the callback function if the transition is activated
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewOnceTrans

    xmlAutomataStatePtr	xmlAutomataNewOnceTrans	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    int min,
    int max,
    void * data)

    If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and whose number is between @min and @max, moreover that transition can only be crossed once.

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    token:the input string associated to that transition
    min:the minimum successive occurences of token
    max:the maximum successive occurences of token
    data:data associated to the transition
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewOnceTrans2

    xmlAutomataStatePtr	xmlAutomataNewOnceTrans2	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    int min,
    int max,
    void * data)

    If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by a succession of input of value @token and @token2 and whose number is between @min and @max, moreover that transition can only be crossed once.

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    token:the input string associated to that transition
    token2:the second input string associated to that transition
    min:the minimum successive occurences of token
    max:the maximum successive occurences of token
    data:data associated to the transition
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewState

    xmlAutomataStatePtr	xmlAutomataNewState	(xmlAutomataPtr am)

    Create a new disconnected state in the automata

    am:an automata
    Returns:the new state or NULL in case of error

    Function: xmlAutomataNewTransition

    xmlAutomataStatePtr	xmlAutomataNewTransition	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    void * data)

    If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    token:the input string associated to that transition
    data:data passed to the callback function if the transition is activated
    Returns:the target state or NULL in case of error

    Function: xmlAutomataNewTransition2

    xmlAutomataStatePtr	xmlAutomataNewTransition2	(xmlAutomataPtr am, 
    xmlAutomataStatePtr from,
    xmlAutomataStatePtr to,
    const xmlChar * token,
    const xmlChar * token2,
    void * data)

    If @to is NULL, this creates first a new target state in the automata and then adds a transition from the @from state to the target state activated by the value of @token

    am:an automata
    from:the starting point of the transition
    to:the target point of the transition or NULL
    token:the first input string associated to that transition
    token2:the second input string associated to that transition
    data:data passed to the callback function if the transition is activated
    Returns:the target state or NULL in case of error

    Function: xmlAutomataSetFinalState

    int	xmlAutomataSetFinalState	(xmlAutomataPtr am, 
    xmlAutomataStatePtr state)

    Makes that state a final state

    am:an automata
    state:a state in this automata
    Returns:0 or -1 in case of error

    Function: xmlFreeAutomata

    void	xmlFreeAutomata			(xmlAutomataPtr am)

    Free an automata

    am:an automata

    Function: xmlNewAutomata

    xmlAutomataPtr	xmlNewAutomata		(void)

    Create a new automata

    Returns:the new object or NULL in case of failure

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-parserInternals.html0000644000175000017500000035745012134171042021625 0ustar aronaron Module parserInternals from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module parserInternals from libxml2

    API Menu
    API Indexes
    Related links

    this module exports a number of internal parsing routines they are not really all intended for applications but can prove useful doing low level processing.

    Table of Contents

    #define INPUT_CHUNK
    #define IS_ASCII_DIGIT
    #define IS_ASCII_LETTER
    #define IS_BASECHAR
    #define IS_BLANK
    #define IS_BLANK_CH
    #define IS_BYTE_CHAR
    #define IS_CHAR
    #define IS_CHAR_CH
    #define IS_COMBINING
    #define IS_COMBINING_CH
    #define IS_DIGIT
    #define IS_DIGIT_CH
    #define IS_EXTENDER
    #define IS_EXTENDER_CH
    #define IS_IDEOGRAPHIC
    #define IS_LETTER
    #define IS_LETTER_CH
    #define IS_PUBIDCHAR
    #define IS_PUBIDCHAR_CH
    #define MOVETO_ENDTAG
    #define MOVETO_STARTTAG
    #define SKIP_EOL
    #define XML_MAX_DICTIONARY_LIMIT
    #define XML_MAX_LOOKUP_LIMIT
    #define XML_MAX_NAMELEN
    #define XML_MAX_NAME_LENGTH
    #define XML_MAX_TEXT_LENGTH
    #define XML_SUBSTITUTE_BOTH
    #define XML_SUBSTITUTE_NONE
    #define XML_SUBSTITUTE_PEREF
    #define XML_SUBSTITUTE_REF
    htmlParserCtxtPtr	htmlCreateFileParserCtxt	(const char * filename, 
    const char * encoding)
    void	htmlInitAutoClose		(void)
    xmlParserInputPtr	inputPop	(xmlParserCtxtPtr ctxt)
    int	inputPush			(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr value)
    const xmlChar *	namePop			(xmlParserCtxtPtr ctxt)
    int	namePush			(xmlParserCtxtPtr ctxt, 
    const xmlChar * value)
    xmlNodePtr	nodePop			(xmlParserCtxtPtr ctxt)
    int	nodePush			(xmlParserCtxtPtr ctxt, 
    xmlNodePtr value)
    int	xmlCheckLanguageID		(const xmlChar * lang)
    int	xmlCopyChar			(int len, 
    xmlChar * out,
    int val)
    int	xmlCopyCharMultiByte		(xmlChar * out, 
    int val)
    xmlParserCtxtPtr	xmlCreateEntityParserCtxt	(const xmlChar * URL, 
    const xmlChar * ID,
    const xmlChar * base)
    xmlParserCtxtPtr	xmlCreateFileParserCtxt	(const char * filename)
    xmlParserCtxtPtr	xmlCreateMemoryParserCtxt	(const char * buffer, 
    int size)
    xmlParserCtxtPtr	xmlCreateURLParserCtxt	(const char * filename, 
    int options)
    int	xmlCurrentChar			(xmlParserCtxtPtr ctxt, 
    int * len)
    xmlChar *	xmlDecodeEntities	(xmlParserCtxtPtr ctxt, 
    int len,
    int what,
    xmlChar end,
    xmlChar end2,
    xmlChar end3)
    Function type: xmlEntityReferenceFunc
    void	xmlEntityReferenceFunc		(xmlEntityPtr ent, 
    xmlNodePtr firstNode,
    xmlNodePtr lastNode)
    void	xmlErrMemory			(xmlParserCtxtPtr ctxt, 
    const char * extra)
    void	xmlFreeInputStream		(xmlParserInputPtr input)
    void	xmlHandleEntity			(xmlParserCtxtPtr ctxt, 
    xmlEntityPtr entity)
    int	xmlIsLetter			(int c)
    xmlChar *	xmlNamespaceParseNCName	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlNamespaceParseNSDef	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlNamespaceParseQName	(xmlParserCtxtPtr ctxt, 
    xmlChar ** prefix)
    xmlParserInputPtr	xmlNewEntityInputStream	(xmlParserCtxtPtr ctxt, 
    xmlEntityPtr entity)
    xmlParserInputPtr	xmlNewInputFromFile	(xmlParserCtxtPtr ctxt, 
    const char * filename)
    xmlParserInputPtr	xmlNewInputStream	(xmlParserCtxtPtr ctxt)
    xmlParserInputPtr	xmlNewStringInputStream	(xmlParserCtxtPtr ctxt, 
    const xmlChar * buffer)
    void	xmlNextChar			(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseAttValue	(xmlParserCtxtPtr ctxt)
    const xmlChar *	xmlParseAttribute	(xmlParserCtxtPtr ctxt, 
    xmlChar ** value)
    void	xmlParseAttributeListDecl	(xmlParserCtxtPtr ctxt)
    int	xmlParseAttributeType		(xmlParserCtxtPtr ctxt, 
    xmlEnumerationPtr * tree)
    void	xmlParseCDSect			(xmlParserCtxtPtr ctxt)
    void	xmlParseCharData		(xmlParserCtxtPtr ctxt, 
    int cdata)
    int	xmlParseCharRef			(xmlParserCtxtPtr ctxt)
    void	xmlParseComment			(xmlParserCtxtPtr ctxt)
    void	xmlParseContent			(xmlParserCtxtPtr ctxt)
    int	xmlParseDefaultDecl		(xmlParserCtxtPtr ctxt, 
    xmlChar ** value)
    void	xmlParseDocTypeDecl		(xmlParserCtxtPtr ctxt)
    void	xmlParseElement			(xmlParserCtxtPtr ctxt)
    xmlElementContentPtr	xmlParseElementChildrenContentDecl	(xmlParserCtxtPtr ctxt, 
    int inputchk)
    int	xmlParseElementContentDecl	(xmlParserCtxtPtr ctxt, 
    const xmlChar * name,
    xmlElementContentPtr * result)
    int	xmlParseElementDecl		(xmlParserCtxtPtr ctxt)
    xmlElementContentPtr	xmlParseElementMixedContentDecl	(xmlParserCtxtPtr ctxt, 
    int inputchk)
    xmlChar *	xmlParseEncName		(xmlParserCtxtPtr ctxt)
    const xmlChar *	xmlParseEncodingDecl	(xmlParserCtxtPtr ctxt)
    void	xmlParseEndTag			(xmlParserCtxtPtr ctxt)
    void	xmlParseEntityDecl		(xmlParserCtxtPtr ctxt)
    xmlEntityPtr	xmlParseEntityRef	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseEntityValue	(xmlParserCtxtPtr ctxt, 
    xmlChar ** orig)
    int	xmlParseEnumeratedType		(xmlParserCtxtPtr ctxt, 
    xmlEnumerationPtr * tree)
    xmlEnumerationPtr	xmlParseEnumerationType	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseExternalID	(xmlParserCtxtPtr ctxt, 
    xmlChar ** publicID,
    int strict)
    void	xmlParseExternalSubset		(xmlParserCtxtPtr ctxt, 
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    void	xmlParseMarkupDecl		(xmlParserCtxtPtr ctxt)
    void	xmlParseMisc			(xmlParserCtxtPtr ctxt)
    const xmlChar *	xmlParseName		(xmlParserCtxtPtr ctxt)
    void	xmlParseNamespace		(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseNmtoken		(xmlParserCtxtPtr ctxt)
    void	xmlParseNotationDecl		(xmlParserCtxtPtr ctxt)
    xmlEnumerationPtr	xmlParseNotationType	(xmlParserCtxtPtr ctxt)
    void	xmlParsePEReference		(xmlParserCtxtPtr ctxt)
    void	xmlParsePI			(xmlParserCtxtPtr ctxt)
    const xmlChar *	xmlParsePITarget	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParsePubidLiteral	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseQuotedString	(xmlParserCtxtPtr ctxt)
    void	xmlParseReference		(xmlParserCtxtPtr ctxt)
    int	xmlParseSDDecl			(xmlParserCtxtPtr ctxt)
    const xmlChar *	xmlParseStartTag	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseSystemLiteral	(xmlParserCtxtPtr ctxt)
    void	xmlParseTextDecl		(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseVersionInfo	(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlParseVersionNum	(xmlParserCtxtPtr ctxt)
    void	xmlParseXMLDecl			(xmlParserCtxtPtr ctxt)
    void	xmlParserHandlePEReference	(xmlParserCtxtPtr ctxt)
    void	xmlParserHandleReference	(xmlParserCtxtPtr ctxt)
    void	xmlParserInputShrink		(xmlParserInputPtr in)
    xmlChar	xmlPopInput			(xmlParserCtxtPtr ctxt)
    int	xmlPushInput			(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr input)
    xmlChar *	xmlScanName		(xmlParserCtxtPtr ctxt)
    void	xmlSetEntityReferenceFunc	(xmlEntityReferenceFunc func)
    int	xmlSkipBlankChars		(xmlParserCtxtPtr ctxt)
    xmlChar *	xmlSplitQName		(xmlParserCtxtPtr ctxt, 
    const xmlChar * name,
    xmlChar ** prefix)
    int	xmlStringCurrentChar		(xmlParserCtxtPtr ctxt, 
    const xmlChar * cur,
    int * len)
    xmlChar *	xmlStringDecodeEntities	(xmlParserCtxtPtr ctxt, 
    const xmlChar * str,
    int what,
    xmlChar end,
    xmlChar end2,
    xmlChar end3)
    xmlChar *	xmlStringLenDecodeEntities	(xmlParserCtxtPtr ctxt, 
    const xmlChar * str,
    int len,
    int what,
    xmlChar end,
    xmlChar end2,
    xmlChar end3)
    int	xmlSwitchEncoding		(xmlParserCtxtPtr ctxt, 
    xmlCharEncoding enc)
    int	xmlSwitchInputEncoding		(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr input,
    xmlCharEncodingHandlerPtr handler)
    int	xmlSwitchToEncoding		(xmlParserCtxtPtr ctxt, 
    xmlCharEncodingHandlerPtr handler)

    Description

    Macro: INPUT_CHUNK

    #define INPUT_CHUNK

    The parser tries to always have that amount of input ready. One of the point is providing context when reporting errors.

    Macro: IS_ASCII_DIGIT

    #define IS_ASCII_DIGIT

    Macro to check [0-9]

    Macro: IS_ASCII_LETTER

    #define IS_ASCII_LETTER

    Macro to check [a-zA-Z]

    Macro: IS_BASECHAR

    #define IS_BASECHAR

    Macro to check the following production in the XML spec: [85] BaseChar ::= ... long list see REC ...

    Macro: IS_BLANK

    #define IS_BLANK

    Macro to check the following production in the XML spec: [3] S ::= (#x20 | #x9 | #xD | #xA)+

    Macro: IS_BLANK_CH

    #define IS_BLANK_CH

    Behaviour same as IS_BLANK

    Macro: IS_BYTE_CHAR

    #define IS_BYTE_CHAR

    Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20...] any byte character in the accepted range

    Macro: IS_CHAR

    #define IS_CHAR

    Macro to check the following production in the XML spec: [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.

    Macro: IS_CHAR_CH

    #define IS_CHAR_CH

    Behaves like IS_CHAR on single-byte value

    Macro: IS_COMBINING

    #define IS_COMBINING

    Macro to check the following production in the XML spec: [87] CombiningChar ::= ... long list see REC ...

    Macro: IS_COMBINING_CH

    #define IS_COMBINING_CH

    Always false (all combining chars > 0xff)

    Macro: IS_DIGIT

    #define IS_DIGIT

    Macro to check the following production in the XML spec: [88] Digit ::= ... long list see REC ...

    Macro: IS_DIGIT_CH

    #define IS_DIGIT_CH

    Behaves like IS_DIGIT but with a single byte argument

    Macro: IS_EXTENDER

    #define IS_EXTENDER

    Macro to check the following production in the XML spec: [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]

    Macro: IS_EXTENDER_CH

    #define IS_EXTENDER_CH

    Behaves like IS_EXTENDER but with a single-byte argument

    Macro: IS_IDEOGRAPHIC

    #define IS_IDEOGRAPHIC

    Macro to check the following production in the XML spec: [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]

    Macro: IS_LETTER

    #define IS_LETTER

    Macro to check the following production in the XML spec: [84] Letter ::= BaseChar | Ideographic

    Macro: IS_LETTER_CH

    #define IS_LETTER_CH

    Macro behaves like IS_LETTER, but only check base chars

    Macro: IS_PUBIDCHAR

    #define IS_PUBIDCHAR

    Macro to check the following production in the XML spec: [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

    Macro: IS_PUBIDCHAR_CH

    #define IS_PUBIDCHAR_CH

    Same as IS_PUBIDCHAR but for single-byte value

    Macro: MOVETO_ENDTAG

    #define MOVETO_ENDTAG

    Skips to the next '>' char.

    Macro: MOVETO_STARTTAG

    #define MOVETO_STARTTAG

    Skips to the next '<' char.

    Macro: SKIP_EOL

    #define SKIP_EOL

    Skips the end of line chars.

    Macro: XML_MAX_DICTIONARY_LIMIT

    #define XML_MAX_DICTIONARY_LIMIT

    Maximum size allowed by the parser for a dictionary by default This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Introduced in 2.9.0

    Macro: XML_MAX_LOOKUP_LIMIT

    #define XML_MAX_LOOKUP_LIMIT

    Maximum size allowed by the parser for ahead lookup This is an upper boundary enforced by the parser to avoid bad behaviour on "unfriendly' content Introduced in 2.9.0

    Macro: XML_MAX_NAMELEN

    #define XML_MAX_NAMELEN

    Identifiers can be longer, but this will be more costly at runtime.

    Macro: XML_MAX_NAME_LENGTH

    #define XML_MAX_NAME_LENGTH

    Maximum size allowed for a markup identitier This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Note that with the use of parsing dictionaries overriding the limit may result in more runtime memory usage in face of "unfriendly' content Introduced in 2.9.0

    Macro: XML_MAX_TEXT_LENGTH

    #define XML_MAX_TEXT_LENGTH

    Maximum size allowed for a single text node when building a tree. This is not a limitation of the parser but a safety boundary feature, use XML_PARSE_HUGE option to override it. Introduced in 2.9.0

    Macro: XML_SUBSTITUTE_BOTH

    #define XML_SUBSTITUTE_BOTH

    Both general and parameter entities need to be substituted.

    Macro: XML_SUBSTITUTE_NONE

    #define XML_SUBSTITUTE_NONE

    If no entities need to be substituted.

    Macro: XML_SUBSTITUTE_PEREF

    #define XML_SUBSTITUTE_PEREF

    Whether parameter entities need to be substituted.

    Macro: XML_SUBSTITUTE_REF

    #define XML_SUBSTITUTE_REF

    Whether general entities need to be substituted.

    Function: htmlCreateFileParserCtxt

    htmlParserCtxtPtr	htmlCreateFileParserCtxt	(const char * filename, 
    const char * encoding)

    Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

    filename:the filename
    encoding:a free form C string describing the HTML document encoding, or NULL
    Returns:the new parser context or NULL

    Function: htmlInitAutoClose

    void	htmlInitAutoClose		(void)

    Initialize the htmlStartCloseIndex for fast lookup of closing tags names. This is not reentrant. Call xmlInitParser() once before processing in case of use in multithreaded programs.

    Function: inputPop

    xmlParserInputPtr	inputPop	(xmlParserCtxtPtr ctxt)

    Pops the top parser input from the input stack

    ctxt:an XML parser context
    Returns:the input just removed

    Function: inputPush

    int	inputPush			(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr value)

    Pushes a new parser input on top of the input stack

    ctxt:an XML parser context
    value:the parser input
    Returns:-1 in case of error, the index in the stack otherwise

    Function: namePop

    const xmlChar *	namePop			(xmlParserCtxtPtr ctxt)

    Pops the top element name from the name stack

    ctxt:an XML parser context
    Returns:the name just removed

    Function: namePush

    int	namePush			(xmlParserCtxtPtr ctxt, 
    const xmlChar * value)

    Pushes a new element name on top of the name stack

    ctxt:an XML parser context
    value:the element name
    Returns:-1 in case of error, the index in the stack otherwise

    Function: nodePop

    xmlNodePtr	nodePop			(xmlParserCtxtPtr ctxt)

    Pops the top element node from the node stack

    ctxt:an XML parser context
    Returns:the node just removed

    Function: nodePush

    int	nodePush			(xmlParserCtxtPtr ctxt, 
    xmlNodePtr value)

    Pushes a new element node on top of the node stack

    ctxt:an XML parser context
    value:the element node
    Returns:-1 in case of error, the index in the stack otherwise

    Function: xmlCheckLanguageID

    int	xmlCheckLanguageID		(const xmlChar * lang)

    Checks that the value conforms to the LanguageID production: NOTE: this is somewhat deprecated, those productions were removed from the XML Second edition. [33] LanguageID ::= Langcode ('-' Subcode)* [34] Langcode ::= ISO639Code | IanaCode | UserCode [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ [38] Subcode ::= ([a-z] | [A-Z])+ The current REC reference the sucessors of RFC 1766, currently 5646 http://www.rfc-editor.org/rfc/rfc5646.txt langtag = language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse] language = 2*3ALPHA ; shortest ISO 639 code ["-" extlang] ; sometimes followed by ; extended language subtags / 4ALPHA ; or reserved for future use / 5*8ALPHA ; or registered language subtag extlang = 3ALPHA ; selected ISO 639 codes *2("-" 3ALPHA) ; permanently reserved script = 4ALPHA ; ISO 15924 code region = 2ALPHA ; ISO 3166-1 code / 3DIGIT ; UN M.49 code variant = 5*8alphanum ; registered variants / (DIGIT 3alphanum) extension = singleton 1*("-" (2*8alphanum)) ; Single alphanumerics ; "x" reserved for private use singleton = DIGIT ; 0 - 9 / %x41-57 ; A - W / %x59-5A ; Y - Z / %x61-77 ; a - w / %x79-7A ; y - z it sounds right to still allow Irregular i-xxx IANA and user codes too The parser below doesn't try to cope with extension or privateuse that could be added but that's not interoperable anyway

    lang:pointer to the string value
    Returns:1 if correct 0 otherwise

    Function: xmlCopyChar

    int	xmlCopyChar			(int len, 
    xmlChar * out,
    int val)

    append the char value in the array

    len:Ignored, compatibility
    out:pointer to an array of xmlChar
    val:the char value
    Returns:the number of xmlChar written

    Function: xmlCopyCharMultiByte

    int	xmlCopyCharMultiByte		(xmlChar * out, 
    int val)

    append the char value in the array

    out:pointer to an array of xmlChar
    val:the char value
    Returns:the number of xmlChar written

    Function: xmlCreateEntityParserCtxt

    xmlParserCtxtPtr	xmlCreateEntityParserCtxt	(const xmlChar * URL, 
    const xmlChar * ID,
    const xmlChar * base)

    Create a parser context for an external entity Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

    URL:the entity URL
    ID:the entity PUBLIC ID
    base:a possible base for the target URI
    Returns:the new parser context or NULL

    Function: xmlCreateFileParserCtxt

    xmlParserCtxtPtr	xmlCreateFileParserCtxt	(const char * filename)

    Create a parser context for a file content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

    filename:the filename
    Returns:the new parser context or NULL

    Function: xmlCreateMemoryParserCtxt

    xmlParserCtxtPtr	xmlCreateMemoryParserCtxt	(const char * buffer, 
    int size)

    Create a parser context for an XML in-memory document.

    buffer:a pointer to a char array
    size:the size of the array
    Returns:the new parser context or NULL

    Function: xmlCreateURLParserCtxt

    xmlParserCtxtPtr	xmlCreateURLParserCtxt	(const char * filename, 
    int options)

    Create a parser context for a file or URL content. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time and for file accesses

    filename:the filename or URL
    options:a combination of xmlParserOption
    Returns:the new parser context or NULL

    Function: xmlCurrentChar

    int	xmlCurrentChar			(xmlParserCtxtPtr ctxt, 
    int * len)

    The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer. Implement the end of line normalization: 2.11 End-of-Line Handling Wherever an external parsed entity or the literal entity value of an internal parsed entity contains either the literal two-character sequence "#xD#xA" or a standalone literal #xD, an XML processor must pass to the application the single character #xA. This behavior can conveniently be produced by normalizing all line breaks to #xA on input, before parsing.)

    ctxt:the XML parser context
    len:pointer to the length of the char read
    Returns:the current char value and its length

    Function: xmlDecodeEntities

    xmlChar *	xmlDecodeEntities	(xmlParserCtxtPtr ctxt, 
    int len,
    int what,
    xmlChar end,
    xmlChar end2,
    xmlChar end3)

    This function is deprecated, we now always process entities content through xmlStringDecodeEntities TODO: remove it in next major release. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'

    ctxt:the parser context
    len:the len to decode (in bytes !), -1 for no size limit
    what:combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF
    end:an end marker xmlChar, 0 if none
    end2:an end marker xmlChar, 0 if none
    end3:an end marker xmlChar, 0 if none
    Returns:A newly allocated string with the substitution done. The caller must deallocate it !

    Function type: xmlEntityReferenceFunc

    Function type: xmlEntityReferenceFunc
    void	xmlEntityReferenceFunc		(xmlEntityPtr ent, 
    xmlNodePtr firstNode,
    xmlNodePtr lastNode)

    Callback function used when one needs to be able to track back the provenance of a chunk of nodes inherited from an entity replacement.

    ent:the entity
    firstNode:the fist node in the chunk
    lastNode:the last nod in the chunk

    Function: xmlErrMemory

    void	xmlErrMemory			(xmlParserCtxtPtr ctxt, 
    const char * extra)

    Handle a redefinition of attribute error

    ctxt:an XML parser context
    extra:extra informations

    Function: xmlFreeInputStream

    void	xmlFreeInputStream		(xmlParserInputPtr input)

    Free up an input stream.

    Function: xmlHandleEntity

    void	xmlHandleEntity			(xmlParserCtxtPtr ctxt, 
    xmlEntityPtr entity)

    Default handling of defined entities, when should we define a new input stream ? When do we just handle that as a set of chars ? OBSOLETE: to be removed at some point.

    ctxt:an XML parser context
    entity:an XML entity pointer.

    Function: xmlIsLetter

    int	xmlIsLetter			(int c)

    Check whether the character is allowed by the production [84] Letter ::= BaseChar | Ideographic

    c:an unicode character (int)
    Returns:0 if not, non-zero otherwise

    Function: xmlNamespaceParseNCName

    xmlChar *	xmlNamespaceParseNCName	(xmlParserCtxtPtr ctxt)

    parse an XML namespace name. TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender

    ctxt:an XML parser context
    Returns:the namespace name or NULL

    Function: xmlNamespaceParseNSDef

    xmlChar *	xmlNamespaceParseNSDef	(xmlParserCtxtPtr ctxt)

    parse a namespace prefix declaration TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. [NS 1] NSDef ::= PrefixDef Eq SystemLiteral [NS 2] PrefixDef ::= 'xmlns' (':' NCName)?

    ctxt:an XML parser context
    Returns:the namespace name

    Function: xmlNamespaceParseQName

    xmlChar *	xmlNamespaceParseQName	(xmlParserCtxtPtr ctxt, 
    xmlChar ** prefix)

    TODO: this seems not in use anymore, the namespace handling is done on top of the SAX interfaces, i.e. not on raw input. parse an XML qualified name [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName

    ctxt:an XML parser context
    prefix:a xmlChar **
    Returns:the local part, and prefix is updated to get the Prefix if any.

    Function: xmlNewEntityInputStream

    xmlParserInputPtr	xmlNewEntityInputStream	(xmlParserCtxtPtr ctxt, 
    xmlEntityPtr entity)

    Create a new input stream based on an xmlEntityPtr

    ctxt:an XML parser context
    entity:an Entity pointer
    Returns:the new input stream or NULL

    Function: xmlNewInputFromFile

    xmlParserInputPtr	xmlNewInputFromFile	(xmlParserCtxtPtr ctxt, 
    const char * filename)

    Create a new input stream based on a file or an URL.

    ctxt:an XML parser context
    filename:the filename to use as entity
    Returns:the new input stream or NULL in case of error

    Function: xmlNewInputStream

    xmlParserInputPtr	xmlNewInputStream	(xmlParserCtxtPtr ctxt)

    Create a new input stream structure.

    ctxt:an XML parser context
    Returns:the new input stream or NULL

    Function: xmlNewStringInputStream

    xmlParserInputPtr	xmlNewStringInputStream	(xmlParserCtxtPtr ctxt, 
    const xmlChar * buffer)

    Create a new input stream based on a memory buffer.

    ctxt:an XML parser context
    buffer:an memory buffer
    Returns:the new input stream

    Function: xmlNextChar

    void	xmlNextChar			(xmlParserCtxtPtr ctxt)

    Skip to the next char input char.

    ctxt:the XML parser context

    Function: xmlParseAttValue

    xmlChar *	xmlParseAttValue	(xmlParserCtxtPtr ctxt)

    parse a value for an attribute Note: the parser won't do substitution of entities here, this will be handled later in xmlStringGetNodeList [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'" 3.3.3 Attribute-Value Normalization: Before the value of an attribute is passed to the application or checked for validity, the XML processor must normalize it as follows: - a character reference is processed by appending the referenced character to the attribute value - an entity reference is processed by recursively processing the replacement text of the entity - a whitespace character (#x20, #xD, #xA, #x9) is processed by appending #x20 to the normalized value, except that only a single #x20 is appended for a "#xD#xA" sequence that is part of an external parsed entity or the literal entity value of an internal parsed entity - other characters are processed by appending them to the normalized value If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by a single space (#x20) character. All attributes for which no declaration has been read should be treated by a non-validating parser as if declared CDATA.

    ctxt:an XML parser context
    Returns:the AttValue parsed or NULL. The value has to be freed by the caller.

    Function: xmlParseAttribute

    const xmlChar *	xmlParseAttribute	(xmlParserCtxtPtr ctxt, 
    xmlChar ** value)

    parse an attribute [41] Attribute ::= Name Eq AttValue [ WFC: No External Entity References ] Attribute values cannot contain direct or indirect entity references to external entities. [ WFC: No < in Attribute Values ] The replacement text of any entity referred to directly or indirectly in an attribute value (other than "&lt;") must not contain a <. [ VC: Attribute Value Type ] The attribute must have been declared; the value must be of the type declared for it. [25] Eq ::= S? '=' S? With namespace: [NS 11] Attribute ::= QName Eq AttValue Also the case QName == xmlns:??? is handled independently as a namespace definition.

    ctxt:an XML parser context
    value:a xmlChar ** used to store the value of the attribute
    Returns:the attribute name, and the value in *value.

    Function: xmlParseAttributeListDecl

    void	xmlParseAttributeListDecl	(xmlParserCtxtPtr ctxt)

    : parse the Attribute list def for an element [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' [53] AttDef ::= S Name S AttType S DefaultDecl

    ctxt:an XML parser context

    Function: xmlParseAttributeType

    int	xmlParseAttributeType		(xmlParserCtxtPtr ctxt, 
    xmlEnumerationPtr * tree)

    parse the Attribute list def for an element [54] AttType ::= StringType | TokenizedType | EnumeratedType [55] StringType ::= 'CDATA' [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' Validity constraints for attribute values syntax are checked in xmlValidateAttributeValue() [ VC: ID ] Values of type ID must match the Name production. A name must not appear more than once in an XML document as a value of this type; i.e., ID values must uniquely identify the elements which bear them. [ VC: One ID per Element Type ] No element type may have more than one ID attribute specified. [ VC: ID Attribute Default ] An ID attribute must have a declared default of #IMPLIED or #REQUIRED. [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names; each IDREF Name must match the value of an ID attribute on some element in the XML document; i.e. IDREF values must match the value of some ID attribute. [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names; each Entity Name must match the name of an unparsed entity declared in the DTD. [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens.

    ctxt:an XML parser context
    tree:the enumeration tree built while parsing
    Returns:the attribute type

    Function: xmlParseCDSect

    void	xmlParseCDSect			(xmlParserCtxtPtr ctxt)

    Parse escaped pure raw content. [18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '<![CDATA[' [20] Data ::= (Char* - (Char* ']]>' Char*)) [21] CDEnd ::= ']]>'

    ctxt:an XML parser context

    Function: xmlParseCharData

    void	xmlParseCharData		(xmlParserCtxtPtr ctxt, 
    int cdata)

    parse a CharData section. if we are within a CDATA section ']]>' marks an end of section. The right angle bracket (>) may be represented using the string "&gt;", and must, for compatibility, be escaped using "&gt;" or a character reference when it appears in the string "]]>" in content, when that string is not marking the end of a CDATA section. [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

    ctxt:an XML parser context
    cdata:int indicating whether we are within a CDATA section

    Function: xmlParseCharRef

    int	xmlParseCharRef			(xmlParserCtxtPtr ctxt)

    parse Reference declarations [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' [ WFC: Legal Character ] Characters referred to using character references must match the production for Char.

    ctxt:an XML parser context
    Returns:the value parsed (as an int), 0 in case of error

    Function: xmlParseComment

    void	xmlParseComment			(xmlParserCtxtPtr ctxt)

    Skip an XML (SGML) comment <!-- .... --> The spec says that "For compatibility, the string "--" (double-hyphen) must not occur within comments. " [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

    ctxt:an XML parser context

    Function: xmlParseContent

    void	xmlParseContent			(xmlParserCtxtPtr ctxt)

    Parse a content: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

    ctxt:an XML parser context

    Function: xmlParseDefaultDecl

    int	xmlParseDefaultDecl		(xmlParserCtxtPtr ctxt, 
    xmlChar ** value)

    Parse an attribute default declaration [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) [ VC: Required Attribute ] if the default declaration is the keyword #REQUIRED, then the attribute must be specified for all elements of the type in the attribute-list declaration. [ VC: Attribute Default Legal ] The declared default value must meet the lexical constraints of the declared attribute type c.f. xmlValidateAttributeDecl() [ VC: Fixed Attribute Default ] if an attribute has a default value declared with the #FIXED keyword, instances of that attribute must match the default value. [ WFC: No < in Attribute Values ] handled in xmlParseAttValue()

    ctxt:an XML parser context
    value:Receive a possible fixed default value for the attribute
    Returns:XML_ATTRIBUTE_NONE, XML_ATTRIBUTE_REQUIRED, XML_ATTRIBUTE_IMPLIED or XML_ATTRIBUTE_FIXED.

    Function: xmlParseDocTypeDecl

    void	xmlParseDocTypeDecl		(xmlParserCtxtPtr ctxt)

    parse a DOCTYPE declaration [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>' [ VC: Root Element Type ] The Name in the document type declaration must match the element type of the root element.

    ctxt:an XML parser context

    Function: xmlParseElement

    void	xmlParseElement			(xmlParserCtxtPtr ctxt)

    parse an XML element, this is highly recursive [39] element ::= EmptyElemTag | STag content ETag [ WFC: Element Type Match ] The Name in an element's end-tag must match the element type in the start-tag.

    ctxt:an XML parser context

    Function: xmlParseElementChildrenContentDecl

    xmlElementContentPtr	xmlParseElementChildrenContentDecl	(xmlParserCtxtPtr ctxt, 
    int inputchk)

    parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in xmlParseElementContentDecl [47] children ::= (choice | seq) ('?' | '*' | '+')? [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [ VC: Proper Group/PE Nesting ] applies to [49] and [50] TODO Parameter-entity replacement text must be properly nested with parenthesized groups. That is to say, if either of the opening or closing parentheses in a choice, seq, or Mixed construct is contained in the replacement text for a parameter entity, both must be contained in the same replacement text. For interoperability, if a parameter-entity reference appears in a choice, seq, or Mixed construct, its replacement text should not be empty, and neither the first nor last non-blank character of the replacement text should be a connector (| or ,).

    ctxt:an XML parser context
    inputchk:the input used for the current entity, needed for boundary checks
    Returns:the tree of xmlElementContentPtr describing the element hierarchy.

    Function: xmlParseElementContentDecl

    int	xmlParseElementContentDecl	(xmlParserCtxtPtr ctxt, 
    const xmlChar * name,
    xmlElementContentPtr * result)

    parse the declaration for an Element content either Mixed or Children, the cases EMPTY and ANY are handled directly in xmlParseElementDecl [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

    ctxt:an XML parser context
    name:the name of the element being defined.
    result:the Element Content pointer will be stored here if any
    Returns:the type of element content XML_ELEMENT_TYPE_xxx

    Function: xmlParseElementDecl

    int	xmlParseElementDecl		(xmlParserCtxtPtr ctxt)

    parse an Element declaration. [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [ VC: Unique Element Type Declaration ] No element type may be declared more than once

    ctxt:an XML parser context
    Returns:the type of the element, or -1 in case of error

    Function: xmlParseElementMixedContentDecl

    xmlElementContentPtr	xmlParseElementMixedContentDecl	(xmlParserCtxtPtr ctxt, 
    int inputchk)

    parse the declaration for a Mixed Element content The leading '(' and spaces have been skipped in xmlParseElementContentDecl [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49]) [ VC: No Duplicate Types ] The same name must not appear more than once in a single mixed-content declaration.

    ctxt:an XML parser context
    inputchk:the input used for the current entity, needed for boundary checks
    Returns:the list of the xmlElementContentPtr describing the element choices

    Function: xmlParseEncName

    xmlChar *	xmlParseEncName		(xmlParserCtxtPtr ctxt)

    parse the XML encoding name [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*

    ctxt:an XML parser context
    Returns:the encoding name value or NULL

    Function: xmlParseEncodingDecl

    const xmlChar *	xmlParseEncodingDecl	(xmlParserCtxtPtr ctxt)

    parse the XML encoding declaration [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") this setups the conversion filters.

    ctxt:an XML parser context
    Returns:the encoding value or NULL

    Function: xmlParseEndTag

    void	xmlParseEndTag			(xmlParserCtxtPtr ctxt)

    parse an end of tag [42] ETag ::= '</' Name S? '>' With namespace [NS 9] ETag ::= '</' QName S? '>'

    ctxt:an XML parser context

    Function: xmlParseEntityDecl

    void	xmlParseEntityDecl		(xmlParserCtxtPtr ctxt)

    parse <!ENTITY declarations [70] EntityDecl ::= GEDecl | PEDecl [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID [76] NDataDecl ::= S 'NDATA' S Name [ VC: Notation Declared ] The Name must match the declared name of a notation.

    ctxt:an XML parser context

    Function: xmlParseEntityRef

    xmlEntityPtr	xmlParseEntityRef	(xmlParserCtxtPtr ctxt)

    parse ENTITY references declarations [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", the Name given in the entity reference must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. The declaration of a parameter entity must precede any reference to it. Similarly, the declaration of a general entity must precede any reference to it which appears in a default value in an attribute-list declaration. Note that if entities are declared in the external subset or in external parameter entities, a non-validating processor is not obligated to read and process their declarations; for such documents, the rule that an entity must be declared is a well-formedness constraint only if standalone='yes'. [ WFC: Parsed Entity ] An entity reference must not contain the name of an unparsed entity

    ctxt:an XML parser context
    Returns:the xmlEntityPtr if found, or NULL otherwise.

    Function: xmlParseEntityValue

    xmlChar *	xmlParseEntityValue	(xmlParserCtxtPtr ctxt, 
    xmlChar ** orig)

    parse a value for ENTITY declarations [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | "'" ([^%&'] | PEReference | Reference)* "'"

    ctxt:an XML parser context
    orig:if non-NULL store a copy of the original entity value
    Returns:the EntityValue parsed with reference substituted or NULL

    Function: xmlParseEnumeratedType

    int	xmlParseEnumeratedType		(xmlParserCtxtPtr ctxt, 
    xmlEnumerationPtr * tree)

    parse an Enumerated attribute type. [57] EnumeratedType ::= NotationType | Enumeration [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'

    ctxt:an XML parser context
    tree:the enumeration tree built while parsing
    Returns:XML_ATTRIBUTE_ENUMERATION or XML_ATTRIBUTE_NOTATION

    Function: xmlParseEnumerationType

    xmlEnumerationPtr	xmlParseEnumerationType	(xmlParserCtxtPtr ctxt)

    parse an Enumeration attribute type. [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [ VC: Enumeration ] Values of this type must match one of the Nmtoken tokens in the declaration

    ctxt:an XML parser context
    Returns:the enumeration attribute tree built while parsing

    Function: xmlParseExternalID

    xmlChar *	xmlParseExternalID	(xmlParserCtxtPtr ctxt, 
    xmlChar ** publicID,
    int strict)

    Parse an External ID or a Public ID NOTE: Productions [75] and [83] interact badly since [75] can generate 'PUBLIC' S PubidLiteral S SystemLiteral [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral [83] PublicID ::= 'PUBLIC' S PubidLiteral

    ctxt:an XML parser context
    publicID:a xmlChar** receiving PubidLiteral
    strict:indicate whether we should restrict parsing to only production [75], see NOTE below
    Returns:the function returns SystemLiteral and in the second case publicID receives PubidLiteral, is strict is off it is possible to return NULL and have publicID set.

    Function: xmlParseExternalSubset

    void	xmlParseExternalSubset		(xmlParserCtxtPtr ctxt, 
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    parse Markup declarations from an external subset [30] extSubset ::= textDecl? extSubsetDecl [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) *

    ctxt:an XML parser context
    ExternalID:the external identifier
    SystemID:the system identifier (or URL)

    Function: xmlParseMarkupDecl

    void	xmlParseMarkupDecl		(xmlParserCtxtPtr ctxt)

    parse Markup declarations [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ VC: Proper Declaration/PE Nesting ] Parameter-entity replacement text must be properly nested with markup declarations. That is to say, if either the first character or the last character of a markup declaration (markupdecl above) is contained in the replacement text for a parameter-entity reference, both must be contained in the same replacement text. [ WFC: PEs in Internal Subset ] In the internal DTD subset, parameter-entity references can occur only where markup declarations can occur, not within markup declarations. (This does not apply to references that occur in external parameter entities or to the external subset.)

    ctxt:an XML parser context

    Function: xmlParseMisc

    void	xmlParseMisc			(xmlParserCtxtPtr ctxt)

    parse an XML Misc* optional field. [27] Misc ::= Comment | PI | S

    ctxt:an XML parser context

    Function: xmlParseName

    const xmlChar *	xmlParseName		(xmlParserCtxtPtr ctxt)

    parse an XML name. [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (#x20 Name)*

    ctxt:an XML parser context
    Returns:the Name parsed or NULL

    Function: xmlParseNamespace

    void	xmlParseNamespace		(xmlParserCtxtPtr ctxt)

    xmlParseNamespace: parse specific PI '<?namespace ...' constructs. This is what the older xml-name Working Draft specified, a bunch of other stuff may still rely on it, so support is still here as if it was declared on the root of the Tree:-( TODO: remove from library To be removed at next drop of binary compatibility

    ctxt:an XML parser context

    Function: xmlParseNmtoken

    xmlChar *	xmlParseNmtoken		(xmlParserCtxtPtr ctxt)

    parse an XML Nmtoken. [7] Nmtoken ::= (NameChar)+ [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*

    ctxt:an XML parser context
    Returns:the Nmtoken parsed or NULL

    Function: xmlParseNotationDecl

    void	xmlParseNotationDecl		(xmlParserCtxtPtr ctxt)

    parse a notation declaration [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' Hence there is actually 3 choices: 'PUBLIC' S PubidLiteral 'PUBLIC' S PubidLiteral S SystemLiteral and 'SYSTEM' S SystemLiteral See the NOTE on xmlParseExternalID().

    ctxt:an XML parser context

    Function: xmlParseNotationType

    xmlEnumerationPtr	xmlParseNotationType	(xmlParserCtxtPtr ctxt)

    parse an Notation attribute type. Note: the leading 'NOTATION' S part has already being parsed... [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [ VC: Notation Attributes ] Values of this type must match one of the notation names included in the declaration; all notation names in the declaration must be declared.

    ctxt:an XML parser context
    Returns:the notation attribute tree built while parsing

    Function: xmlParsePEReference

    void	xmlParsePEReference		(xmlParserCtxtPtr ctxt)

    parse PEReference declarations The entity content is handled directly by pushing it's content as a new input stream. [69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive reference to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any reference to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any reference to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled.

    ctxt:an XML parser context

    Function: xmlParsePI

    void	xmlParsePI			(xmlParserCtxtPtr ctxt)

    parse an XML Processing Instruction. [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' The processing is transfered to SAX once parsed.

    ctxt:an XML parser context

    Function: xmlParsePITarget

    const xmlChar *	xmlParsePITarget	(xmlParserCtxtPtr ctxt)

    parse the name of a PI [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

    ctxt:an XML parser context
    Returns:the PITarget name or NULL

    Function: xmlParsePubidLiteral

    xmlChar *	xmlParsePubidLiteral	(xmlParserCtxtPtr ctxt)

    parse an XML public literal [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"

    ctxt:an XML parser context
    Returns:the PubidLiteral parsed or NULL.

    Function: xmlParseQuotedString

    xmlChar *	xmlParseQuotedString	(xmlParserCtxtPtr ctxt)

    Parse and return a string between quotes or doublequotes TODO: Deprecated, to be removed at next drop of binary compatibility

    ctxt:an XML parser context
    Returns:the string parser or NULL.

    Function: xmlParseReference

    void	xmlParseReference		(xmlParserCtxtPtr ctxt)

    parse and handle entity references in content, depending on the SAX interface, this may end-up in a call to character() if this is a CharRef, a predefined entity, if there is no reference() callback. or if the parser was asked to switch to that mode. [67] Reference ::= EntityRef | CharRef

    ctxt:an XML parser context

    Function: xmlParseSDDecl

    int	xmlParseSDDecl			(xmlParserCtxtPtr ctxt)

    parse the XML standalone declaration [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no')'"')) [ VC: Standalone Document Declaration ] TODO The standalone document declaration must have the value "no" if any external markup declarations contain declarations of: - attributes with default values, if elements to which these attributes apply appear in the document without specifications of values for these attributes, or - entities (other than amp, lt, gt, apos, quot), if references to those entities appear in the document, or - attributes with values subject to normalization, where the attribute appears in the document with a value which will change as a result of normalization, or - element types with element content, if white space occurs directly within any instance of those types.

    ctxt:an XML parser context
    Returns:1 if standalone="yes" 0 if standalone="no" -2 if standalone attribute is missing or invalid (A standalone value of -2 means that the XML declaration was found, but no value was specified for the standalone attribute).

    Function: xmlParseStartTag

    const xmlChar *	xmlParseStartTag	(xmlParserCtxtPtr ctxt)

    parse a start of tag either for rule element or EmptyElement. In both case we don't parse the tag closing chars. [40] STag ::= '<' Name (S Attribute)* S? '>' [ WFC: Unique Att Spec ] No attribute name may appear more than once in the same start-tag or empty-element tag. [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [ WFC: Unique Att Spec ] No attribute name may appear more than once in the same start-tag or empty-element tag. With namespace: [NS 8] STag ::= '<' QName (S Attribute)* S? '>' [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>'

    ctxt:an XML parser context
    Returns:the element name parsed

    Function: xmlParseSystemLiteral

    xmlChar *	xmlParseSystemLiteral	(xmlParserCtxtPtr ctxt)

    parse an XML Literal [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")

    ctxt:an XML parser context
    Returns:the SystemLiteral parsed or NULL

    Function: xmlParseTextDecl

    void	xmlParseTextDecl		(xmlParserCtxtPtr ctxt)

    parse an XML declaration header for external entities [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'

    ctxt:an XML parser context

    Function: xmlParseVersionInfo

    xmlChar *	xmlParseVersionInfo	(xmlParserCtxtPtr ctxt)

    parse the XML version. [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ") [25] Eq ::= S? '=' S?

    ctxt:an XML parser context
    Returns:the version string, e.g. "1.0"

    Function: xmlParseVersionNum

    xmlChar *	xmlParseVersionNum	(xmlParserCtxtPtr ctxt)

    parse the XML version value. [26] VersionNum ::= '1.' [0-9]+ In practice allow [0-9].[0-9]+ at that level

    ctxt:an XML parser context
    Returns:the string giving the XML version number, or NULL

    Function: xmlParseXMLDecl

    void	xmlParseXMLDecl			(xmlParserCtxtPtr ctxt)

    parse an XML declaration header [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'

    ctxt:an XML parser context

    Function: xmlParserHandlePEReference

    void	xmlParserHandlePEReference	(xmlParserCtxtPtr ctxt)

    [69] PEReference ::= '%' Name ';' [ WFC: No Recursion ] A parsed entity must not contain a recursive reference to itself, either directly or indirectly. [ WFC: Entity Declared ] In a document without any DTD, a document with only an internal DTD subset which contains no parameter entity references, or a document with "standalone='yes'", ... ... The declaration of a parameter entity must precede any reference to it... [ VC: Entity Declared ] In a document with an external subset or external parameter entities with "standalone='no'", ... ... The declaration of a parameter entity must precede any reference to it... [ WFC: In DTD ] Parameter-entity references may only appear in the DTD. NOTE: misleading but this is handled. A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc i.e. - Included in literal in entity values - Included as Parameter Entity reference within DTDs

    ctxt:the parser context

    Function: xmlParserHandleReference

    void	xmlParserHandleReference	(xmlParserCtxtPtr ctxt)

    TODO: Remove, now deprecated ... the test is done directly in the content parsing routines. [67] Reference ::= EntityRef | CharRef [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] the Name given in the entity reference must match that in an entity declaration, except that well-formed documents need not declare any of the following entities: amp, lt, gt, apos, quot. [ WFC: Parsed Entity ] An entity reference must not contain the name of an unparsed entity [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' A PEReference may have been detected in the current input stream the handling is done accordingly to http://www.w3.org/TR/REC-xml#entproc

    ctxt:the parser context

    Function: xmlParserInputShrink

    void	xmlParserInputShrink		(xmlParserInputPtr in)

    This function removes used input for the parser.

    in:an XML parser input

    Function: xmlPopInput

    xmlChar	xmlPopInput			(xmlParserCtxtPtr ctxt)

    xmlPopInput: the current input pointed by ctxt->input came to an end pop it and return the next char.

    ctxt:an XML parser context
    Returns:the current xmlChar in the parser context

    Function: xmlPushInput

    int	xmlPushInput			(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr input)

    xmlPushInput: switch to a new input stream which is stacked on top of the previous one(s).

    ctxt:an XML parser context
    input:an XML parser input fragment (entity, XML fragment ...).
    Returns:-1 in case of error or the index in the input stack

    Function: xmlScanName

    xmlChar *	xmlScanName		(xmlParserCtxtPtr ctxt)

    Trickery: parse an XML name but without consuming the input flow Needed for rollback cases. Used only when parsing entities references. TODO: seems deprecated now, only used in the default part of xmlParserHandleReference [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (S Name)*

    ctxt:an XML parser context
    Returns:the Name parsed or NULL

    Function: xmlSetEntityReferenceFunc

    void	xmlSetEntityReferenceFunc	(xmlEntityReferenceFunc func)

    Set the function to call call back when a xml reference has been made

    func:A valid function

    Function: xmlSkipBlankChars

    int	xmlSkipBlankChars		(xmlParserCtxtPtr ctxt)

    skip all blanks character found at that point in the input streams. It pops up finished entities in the process if allowable at that point.

    ctxt:the XML parser context
    Returns:the number of space chars skipped

    Function: xmlSplitQName

    xmlChar *	xmlSplitQName		(xmlParserCtxtPtr ctxt, 
    const xmlChar * name,
    xmlChar ** prefix)

    parse an UTF8 encoded XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName

    ctxt:an XML parser context
    name:an XML parser context
    prefix:a xmlChar **
    Returns:the local part, and prefix is updated to get the Prefix if any.

    Function: xmlStringCurrentChar

    int	xmlStringCurrentChar		(xmlParserCtxtPtr ctxt, 
    const xmlChar * cur,
    int * len)

    The current char value, if using UTF-8 this may actually span multiple bytes in the input buffer.

    ctxt:the XML parser context
    cur:pointer to the beginning of the char
    len:pointer to the length of the char read
    Returns:the current char value and its length

    Function: xmlStringDecodeEntities

    xmlChar *	xmlStringDecodeEntities	(xmlParserCtxtPtr ctxt, 
    const xmlChar * str,
    int what,
    xmlChar end,
    xmlChar end2,
    xmlChar end3)

    Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'

    ctxt:the parser context
    str:the input string
    what:combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF
    end:an end marker xmlChar, 0 if none
    end2:an end marker xmlChar, 0 if none
    end3:an end marker xmlChar, 0 if none
    Returns:A newly allocated string with the substitution done. The caller must deallocate it !

    Function: xmlStringLenDecodeEntities

    xmlChar *	xmlStringLenDecodeEntities	(xmlParserCtxtPtr ctxt, 
    const xmlChar * str,
    int len,
    int what,
    xmlChar end,
    xmlChar end2,
    xmlChar end3)

    Takes a entity string content and process to do the adequate substitutions. [67] Reference ::= EntityRef | CharRef [69] PEReference ::= '%' Name ';'

    ctxt:the parser context
    str:the input string
    len:the string length
    what:combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF
    end:an end marker xmlChar, 0 if none
    end2:an end marker xmlChar, 0 if none
    end3:an end marker xmlChar, 0 if none
    Returns:A newly allocated string with the substitution done. The caller must deallocate it !

    Function: xmlSwitchEncoding

    int	xmlSwitchEncoding		(xmlParserCtxtPtr ctxt, 
    xmlCharEncoding enc)

    change the input functions when discovering the character encoding of a given entity.

    ctxt:the parser context
    enc:the encoding value (number)
    Returns:0 in case of success, -1 otherwise

    Function: xmlSwitchInputEncoding

    int	xmlSwitchInputEncoding		(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr input,
    xmlCharEncodingHandlerPtr handler)

    change the input functions when discovering the character encoding of a given entity.

    ctxt:the parser context
    input:the input stream
    handler:the encoding handler
    Returns:0 in case of success, -1 otherwise

    Function: xmlSwitchToEncoding

    int	xmlSwitchToEncoding		(xmlParserCtxtPtr ctxt, 
    xmlCharEncodingHandlerPtr handler)

    change the input functions when discovering the character encoding of a given entity.

    ctxt:the parser context
    handler:the encoding handler
    Returns:0 in case of success, -1 otherwise

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-schematron.html0000644000175000017500000005233712134171042020610 0ustar aronaron Module schematron from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module schematron from libxml2

    API Menu
    API Indexes
    Related links

    interface to the XML Schematron validity checking.

    Table of Contents

    Structure xmlSchematron
    struct _xmlSchematron The content of this structure is not made public by the API.
    Structure xmlSchematronParserCtxt
    struct _xmlSchematronParserCtxt The content of this structure is not made public by the API.
    Typedef xmlSchematronParserCtxt * xmlSchematronParserCtxtPtr
    
    Typedef xmlSchematron * xmlSchematronPtr
    
    Structure xmlSchematronValidCtxt
    struct _xmlSchematronValidCtxt The content of this structure is not made public by the API.
    Typedef xmlSchematronValidCtxt * xmlSchematronValidCtxtPtr
    
    Enum xmlSchematronValidOptions
    
    void	xmlSchematronFree		(xmlSchematronPtr schema)
    void	xmlSchematronFreeParserCtxt	(xmlSchematronParserCtxtPtr ctxt)
    void	xmlSchematronFreeValidCtxt	(xmlSchematronValidCtxtPtr ctxt)
    xmlSchematronParserCtxtPtr	xmlSchematronNewDocParserCtxt	(xmlDocPtr doc)
    xmlSchematronParserCtxtPtr	xmlSchematronNewMemParserCtxt	(const char * buffer, 
    int size)
    xmlSchematronParserCtxtPtr	xmlSchematronNewParserCtxt	(const char * URL)
    xmlSchematronValidCtxtPtr	xmlSchematronNewValidCtxt	(xmlSchematronPtr schema, 
    int options)
    xmlSchematronPtr	xmlSchematronParse	(xmlSchematronParserCtxtPtr ctxt)
    void	xmlSchematronSetValidStructuredErrors	(xmlSchematronValidCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)
    int	xmlSchematronValidateDoc	(xmlSchematronValidCtxtPtr ctxt, 
    xmlDocPtr instance)
    Function type: xmlSchematronValidityErrorFunc
    void	xmlSchematronValidityErrorFunc	(void * ctx, 
    const char * msg,
    ... ...)
    Function type: xmlSchematronValidityWarningFunc
    void	xmlSchematronValidityWarningFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Description

    Structure xmlSchematron

    Structure xmlSchematron
    struct _xmlSchematron { The content of this structure is not made public by the API. }

    Structure xmlSchematronParserCtxt

    Structure xmlSchematronParserCtxt
    struct _xmlSchematronParserCtxt { The content of this structure is not made public by the API. }

    Structure xmlSchematronValidCtxt

    Structure xmlSchematronValidCtxt
    struct _xmlSchematronValidCtxt { The content of this structure is not made public by the API. }

    Enum xmlSchematronValidOptions

    Enum xmlSchematronValidOptions {
        XML_SCHEMATRON_OUT_QUIET = 1 : quiet no report
        XML_SCHEMATRON_OUT_TEXT = 2 : build a textual report
        XML_SCHEMATRON_OUT_XML = 4 : output SVRL
        XML_SCHEMATRON_OUT_ERROR = 8 : output via xmlStructuredErrorFunc
        XML_SCHEMATRON_OUT_FILE = 256 : output to a file descriptor
        XML_SCHEMATRON_OUT_BUFFER = 512 : output to a buffer
        XML_SCHEMATRON_OUT_IO = 1024 : output to I/O mechanism
    }
    

    Function: xmlSchematronFree

    void	xmlSchematronFree		(xmlSchematronPtr schema)

    Deallocate a Schematron structure.

    schema:a schema structure

    Function: xmlSchematronFreeParserCtxt

    void	xmlSchematronFreeParserCtxt	(xmlSchematronParserCtxtPtr ctxt)

    Free the resources associated to the schema parser context

    ctxt:the schema parser context

    Function: xmlSchematronFreeValidCtxt

    void	xmlSchematronFreeValidCtxt	(xmlSchematronValidCtxtPtr ctxt)

    Free the resources associated to the schema validation context

    ctxt:the schema validation context

    Function: xmlSchematronNewDocParserCtxt

    xmlSchematronParserCtxtPtr	xmlSchematronNewDocParserCtxt	(xmlDocPtr doc)

    Create an XML Schematrons parse context for that document. NB. The document may be modified during the parsing process.

    doc:a preparsed document tree
    Returns:the parser context or NULL in case of error

    Function: xmlSchematronNewMemParserCtxt

    xmlSchematronParserCtxtPtr	xmlSchematronNewMemParserCtxt	(const char * buffer, 
    int size)

    Create an XML Schematrons parse context for that memory buffer expected to contain an XML Schematrons file.

    buffer:a pointer to a char array containing the schemas
    size:the size of the array
    Returns:the parser context or NULL in case of error

    Function: xmlSchematronNewParserCtxt

    xmlSchematronParserCtxtPtr	xmlSchematronNewParserCtxt	(const char * URL)

    Create an XML Schematrons parse context for that file/resource expected to contain an XML Schematrons file.

    URL:the location of the schema
    Returns:the parser context or NULL in case of error

    Function: xmlSchematronNewValidCtxt

    xmlSchematronValidCtxtPtr	xmlSchematronNewValidCtxt	(xmlSchematronPtr schema, 
    int options)

    Create an XML Schematrons validation context based on the given schema.

    schema:a precompiled XML Schematrons
    options:a set of xmlSchematronValidOptions
    Returns:the validation context or NULL in case of error

    Function: xmlSchematronParse

    xmlSchematronPtr	xmlSchematronParse	(xmlSchematronParserCtxtPtr ctxt)

    parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances.

    ctxt:a schema validation context
    Returns:the internal XML Schematron structure built from the resource or NULL in case of error

    Function: xmlSchematronSetValidStructuredErrors

    void	xmlSchematronSetValidStructuredErrors	(xmlSchematronValidCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)

    Set the structured error callback

    ctxt:a Schematron validation context
    serror:the structured error function
    ctx:the functions context

    Function: xmlSchematronValidateDoc

    int	xmlSchematronValidateDoc	(xmlSchematronValidCtxtPtr ctxt, 
    xmlDocPtr instance)

    Validate a tree instance against the schematron

    ctxt:the schema validation context
    instance:the document instace tree
    Returns:0 in case of success, -1 in case of internal error and an error count otherwise.

    Function type: xmlSchematronValidityErrorFunc

    Function type: xmlSchematronValidityErrorFunc
    void	xmlSchematronValidityErrorFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Signature of an error callback from a Schematron validation

    ctx:the validation context
    msg:the message
    ...:extra arguments

    Function type: xmlSchematronValidityWarningFunc

    Function type: xmlSchematronValidityWarningFunc
    void	xmlSchematronValidityWarningFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Signature of a warning callback from a Schematron validation

    ctx:the validation context
    msg:the message
    ...:extra arguments

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-debugXML.html0000644000175000017500000011202612134171042020104 0ustar aronaron Module debugXML from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module debugXML from libxml2

    API Menu
    API Indexes
    Related links

    Interfaces to a set of routines used for debugging the tree produced by the XML parser.

    Table of Contents

    Structure xmlShellCtxt
    struct _xmlShellCtxt
    Typedef xmlShellCtxt * xmlShellCtxtPtr
    
    const char *	xmlBoolToText		(int boolval)
    int	xmlDebugCheckDocument		(FILE * output, 
    xmlDocPtr doc)
    void	xmlDebugDumpAttr		(FILE * output, 
    xmlAttrPtr attr,
    int depth)
    void	xmlDebugDumpAttrList		(FILE * output, 
    xmlAttrPtr attr,
    int depth)
    void	xmlDebugDumpDTD			(FILE * output, 
    xmlDtdPtr dtd)
    void	xmlDebugDumpDocument		(FILE * output, 
    xmlDocPtr doc)
    void	xmlDebugDumpDocumentHead	(FILE * output, 
    xmlDocPtr doc)
    void	xmlDebugDumpEntities		(FILE * output, 
    xmlDocPtr doc)
    void	xmlDebugDumpNode		(FILE * output, 
    xmlNodePtr node,
    int depth)
    void	xmlDebugDumpNodeList		(FILE * output, 
    xmlNodePtr node,
    int depth)
    void	xmlDebugDumpOneNode		(FILE * output, 
    xmlNodePtr node,
    int depth)
    void	xmlDebugDumpString		(FILE * output, 
    const xmlChar * str)
    int	xmlLsCountNode			(xmlNodePtr node)
    void	xmlLsOneNode			(FILE * output, 
    xmlNodePtr node)
    void	xmlShell			(xmlDocPtr doc, 
    char * filename,
    xmlShellReadlineFunc input,
    FILE * output)
    int	xmlShellBase			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)
    int	xmlShellCat			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)
    Function type: xmlShellCmd
    int	xmlShellCmd			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)
    int	xmlShellDir			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)
    int	xmlShellDu			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr tree,
    xmlNodePtr node2)
    int	xmlShellList			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)
    int	xmlShellLoad			(xmlShellCtxtPtr ctxt, 
    char * filename,
    xmlNodePtr node,
    xmlNodePtr node2)
    void	xmlShellPrintNode		(xmlNodePtr node)
    void	xmlShellPrintXPathError		(int errorType, 
    const char * arg)
    void	xmlShellPrintXPathResult	(xmlXPathObjectPtr list)
    int	xmlShellPwd			(xmlShellCtxtPtr ctxt, 
    char * buffer,
    xmlNodePtr node,
    xmlNodePtr node2)
    Function type: xmlShellReadlineFunc
    char *	xmlShellReadlineFunc		(char * prompt)
    
    int	xmlShellSave			(xmlShellCtxtPtr ctxt, 
    char * filename,
    xmlNodePtr node,
    xmlNodePtr node2)
    int	xmlShellValidate		(xmlShellCtxtPtr ctxt, 
    char * dtd,
    xmlNodePtr node,
    xmlNodePtr node2)
    int	xmlShellWrite			(xmlShellCtxtPtr ctxt, 
    char * filename,
    xmlNodePtr node,
    xmlNodePtr node2)

    Description

    Structure xmlShellCtxt

    Structure xmlShellCtxt
    struct _xmlShellCtxt { char * filename xmlDocPtr doc xmlNodePtr node xmlXPathContextPtr pctxt int loaded FILE * output xmlShellReadlineFunc input }

    Function: xmlBoolToText

    const char *	xmlBoolToText		(int boolval)

    Convenient way to turn bool into text

    boolval:a bool to turn into text
    Returns:a pointer to either "True" or "False"

    Function: xmlDebugCheckDocument

    int	xmlDebugCheckDocument		(FILE * output, 
    xmlDocPtr doc)

    Check the document for potential content problems, and output the errors to @output

    output:the FILE * for the output
    doc:the document
    Returns:the number of errors found

    Function: xmlDebugDumpAttr

    void	xmlDebugDumpAttr		(FILE * output, 
    xmlAttrPtr attr,
    int depth)

    Dumps debug information for the attribute

    output:the FILE * for the output
    attr:the attribute
    depth:the indentation level.

    Function: xmlDebugDumpAttrList

    void	xmlDebugDumpAttrList		(FILE * output, 
    xmlAttrPtr attr,
    int depth)

    Dumps debug information for the attribute list

    output:the FILE * for the output
    attr:the attribute list
    depth:the indentation level.

    Function: xmlDebugDumpDTD

    void	xmlDebugDumpDTD			(FILE * output, 
    xmlDtdPtr dtd)

    Dumps debug information for the DTD

    output:the FILE * for the output
    dtd:the DTD

    Function: xmlDebugDumpDocument

    void	xmlDebugDumpDocument		(FILE * output, 
    xmlDocPtr doc)

    Dumps debug information for the document, it's recursive

    output:the FILE * for the output
    doc:the document

    Function: xmlDebugDumpDocumentHead

    void	xmlDebugDumpDocumentHead	(FILE * output, 
    xmlDocPtr doc)

    Dumps debug information cncerning the document, not recursive

    output:the FILE * for the output
    doc:the document

    Function: xmlDebugDumpEntities

    void	xmlDebugDumpEntities		(FILE * output, 
    xmlDocPtr doc)

    Dumps debug information for all the entities in use by the document

    output:the FILE * for the output
    doc:the document

    Function: xmlDebugDumpNode

    void	xmlDebugDumpNode		(FILE * output, 
    xmlNodePtr node,
    int depth)

    Dumps debug information for the element node, it is recursive

    output:the FILE * for the output
    node:the node
    depth:the indentation level.

    Function: xmlDebugDumpNodeList

    void	xmlDebugDumpNodeList		(FILE * output, 
    xmlNodePtr node,
    int depth)

    Dumps debug information for the list of element node, it is recursive

    output:the FILE * for the output
    node:the node list
    depth:the indentation level.

    Function: xmlDebugDumpOneNode

    void	xmlDebugDumpOneNode		(FILE * output, 
    xmlNodePtr node,
    int depth)

    Dumps debug information for the element node, it is not recursive

    output:the FILE * for the output
    node:the node
    depth:the indentation level.

    Function: xmlDebugDumpString

    void	xmlDebugDumpString		(FILE * output, 
    const xmlChar * str)

    Dumps informations about the string, shorten it if necessary

    output:the FILE * for the output
    str:the string

    Function: xmlLsCountNode

    int	xmlLsCountNode			(xmlNodePtr node)

    Count the children of @node.

    node:the node to count
    Returns:the number of children of @node.

    Function: xmlLsOneNode

    void	xmlLsOneNode			(FILE * output, 
    xmlNodePtr node)

    Dump to @output the type and name of @node.

    output:the FILE * for the output
    node:the node to dump

    Function: xmlShell

    void	xmlShell			(xmlDocPtr doc, 
    char * filename,
    xmlShellReadlineFunc input,
    FILE * output)

    Implements the XML shell This allow to load, validate, view, modify and save a document using a environment similar to a UNIX commandline.

    doc:the initial document
    filename:the output buffer
    input:the line reading function
    output:the output FILE*, defaults to stdout if NULL

    Function: xmlShellBase

    int	xmlShellBase			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "base" dumps the current XML base of the node

    ctxt:the shell context
    arg:unused
    node:a node
    node2:unused
    Returns:0

    Function: xmlShellCat

    int	xmlShellCat			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "cat" dumps the serialization node content (XML or HTML).

    ctxt:the shell context
    arg:unused
    node:a node
    node2:unused
    Returns:0

    Function type: xmlShellCmd

    Function type: xmlShellCmd
    int	xmlShellCmd			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)

    This is a generic signature for the XML shell functions.

    ctxt:a shell context
    arg:a string argument
    node:a first node
    node2:a second node
    Returns:an int, negative returns indicating errors.

    Function: xmlShellDir

    int	xmlShellDir			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "dir" dumps informations about the node (namespace, attributes, content).

    ctxt:the shell context
    arg:unused
    node:a node
    node2:unused
    Returns:0

    Function: xmlShellDu

    int	xmlShellDu			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr tree,
    xmlNodePtr node2)

    Implements the XML shell function "du" show the structure of the subtree under node @tree If @tree is null, the command works on the current node.

    ctxt:the shell context
    arg:unused
    tree:a node defining a subtree
    node2:unused
    Returns:0 or -1 in case of error

    Function: xmlShellList

    int	xmlShellList			(xmlShellCtxtPtr ctxt, 
    char * arg,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "ls" Does an Unix like listing of the given node (like a directory)

    ctxt:the shell context
    arg:unused
    node:a node
    node2:unused
    Returns:0

    Function: xmlShellLoad

    int	xmlShellLoad			(xmlShellCtxtPtr ctxt, 
    char * filename,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "load" loads a new document specified by the filename

    ctxt:the shell context
    filename:the file name
    node:unused
    node2:unused
    Returns:0 or -1 if loading failed

    Function: xmlShellPrintNode

    void	xmlShellPrintNode		(xmlNodePtr node)

    Print node to the output FILE

    node:a non-null node to print to the output FILE

    Function: xmlShellPrintXPathError

    void	xmlShellPrintXPathError		(int errorType, 
    const char * arg)

    Print the xpath error to libxml default error channel

    errorType:valid xpath error id
    arg:the argument that cause xpath to fail

    Function: xmlShellPrintXPathResult

    void	xmlShellPrintXPathResult	(xmlXPathObjectPtr list)

    Prints result to the output FILE

    list:a valid result generated by an xpath evaluation

    Function: xmlShellPwd

    int	xmlShellPwd			(xmlShellCtxtPtr ctxt, 
    char * buffer,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "pwd" Show the full path from the root to the node, if needed building thumblers when similar elements exists at a given ancestor level. The output is compatible with XPath commands.

    ctxt:the shell context
    buffer:the output buffer
    node:a node
    node2:unused
    Returns:0 or -1 in case of error

    Function type: xmlShellReadlineFunc

    Function type: xmlShellReadlineFunc
    char *	xmlShellReadlineFunc		(char * prompt)
    

    This is a generic signature for the XML shell input function.

    prompt:a string prompt
    Returns:a string which will be freed by the Shell.

    Function: xmlShellSave

    int	xmlShellSave			(xmlShellCtxtPtr ctxt, 
    char * filename,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "save" Write the current document to the filename, or it's original name

    ctxt:the shell context
    filename:the file name (optional)
    node:unused
    node2:unused
    Returns:0 or -1 in case of error

    Function: xmlShellValidate

    int	xmlShellValidate		(xmlShellCtxtPtr ctxt, 
    char * dtd,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "validate" Validate the document, if a DTD path is provided, then the validation is done against the given DTD.

    ctxt:the shell context
    dtd:the DTD URI (optional)
    node:unused
    node2:unused
    Returns:0 or -1 in case of error

    Function: xmlShellWrite

    int	xmlShellWrite			(xmlShellCtxtPtr ctxt, 
    char * filename,
    xmlNodePtr node,
    xmlNodePtr node2)

    Implements the XML shell function "write" Write the current node to the filename, it saves the serialization of the subtree under the @node specified

    ctxt:the shell context
    filename:the file name
    node:a node in the tree
    node2:unused
    Returns:0 or -1 in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/right.png0000644000175000017500000000073011234335462016113 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2 I%Á=eIDATxœ­”!oÂ@†Ÿ.'**M0$ÄÁ$¿?1~¢vIeEuLlÉ&–Ô4‚ä Í¶B»Ý›œ¹|÷>ï—ûî …$ݶ©oc<”´ÑA©¤×€X’ò Module uri from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module uri from libxml2

    API Menu
    API Indexes
    Related links

    library of generic URI related routines Implements RFC 2396

    Table of Contents

    Structure xmlURI
    struct _xmlURI
    Typedef xmlURI * xmlURIPtr
    
    xmlChar *	xmlBuildRelativeURI	(const xmlChar * URI, 
    const xmlChar * base)
    xmlChar *	xmlBuildURI		(const xmlChar * URI, 
    const xmlChar * base)
    xmlChar *	xmlCanonicPath		(const xmlChar * path)
    xmlURIPtr	xmlCreateURI		(void)
    void	xmlFreeURI			(xmlURIPtr uri)
    int	xmlNormalizeURIPath		(char * path)
    xmlURIPtr	xmlParseURI		(const char * str)
    xmlURIPtr	xmlParseURIRaw		(const char * str, 
    int raw)
    int	xmlParseURIReference		(xmlURIPtr uri, 
    const char * str)
    xmlChar *	xmlPathToURI		(const xmlChar * path)
    void	xmlPrintURI			(FILE * stream, 
    xmlURIPtr uri)
    xmlChar *	xmlSaveUri		(xmlURIPtr uri)
    xmlChar *	xmlURIEscape		(const xmlChar * str)
    xmlChar *	xmlURIEscapeStr		(const xmlChar * str, 
    const xmlChar * list)
    char *	xmlURIUnescapeString		(const char * str, 
    int len,
    char * target)

    Description

    Structure xmlURI

    Structure xmlURI
    struct _xmlURI { char * scheme : the URI scheme char * opaque : opaque part char * authority : the authority part char * server : the server part char * user : the user part int port : the port number char * path : the path string char * query : the query string (deprecated - use with char * fragment : the fragment identifier int cleanup : parsing potentially unclean URI char * query_raw : the query string (as it appears in the }

    Function: xmlBuildRelativeURI

    xmlChar *	xmlBuildRelativeURI	(const xmlChar * URI, 
    const xmlChar * base)

    Expresses the URI of the reference in terms relative to the base. Some examples of this operation include: base = "http://site1.com/docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif pic1.gif http://site2.com/docs/pic1.gif http://site2.com/docs/pic1.gif base = "docs/book1.html" URI input URI returned docs/pic1.gif pic1.gif docs/img/pic1.gif img/pic1.gif img/pic1.gif ../img/pic1.gif http://site1.com/docs/pic1.gif http://site1.com/docs/pic1.gif Note: if the URI reference is really wierd or complicated, it may be worthwhile to first convert it into a "nice" one by calling xmlBuildURI (using 'base') before calling this routine, since this routine (for reasonable efficiency) assumes URI has already been through some validation.

    URI:the URI reference under consideration
    base:the base value
    Returns:a new URI string (to be freed by the caller) or NULL in case error.

    Function: xmlBuildURI

    xmlChar *	xmlBuildURI		(const xmlChar * URI, 
    const xmlChar * base)

    Computes he final URI of the reference done by checking that the given URI is valid, and building the final URI using the base URI. This is processed according to section 5.2 of the RFC 2396 5.2. Resolving Relative References to Absolute Form

    URI:the URI instance found in the document
    base:the base value
    Returns:a new URI string (to be freed by the caller) or NULL in case of error.

    Function: xmlCanonicPath

    xmlChar *	xmlCanonicPath		(const xmlChar * path)

    Constructs a canonic path from the specified path.

    path:the resource locator in a filesystem notation
    Returns:a new canonic path, or a duplicate of the path parameter if the construction fails. The caller is responsible for freeing the memory occupied by the returned string. If there is insufficient memory available, or the argument is NULL, the function returns NULL.

    Function: xmlCreateURI

    xmlURIPtr	xmlCreateURI		(void)

    Simply creates an empty xmlURI

    Returns:the new structure or NULL in case of error

    Function: xmlFreeURI

    void	xmlFreeURI			(xmlURIPtr uri)

    Free up the xmlURI struct

    uri:pointer to an xmlURI

    Function: xmlNormalizeURIPath

    int	xmlNormalizeURIPath		(char * path)

    Applies the 5 normalization steps to a path string--that is, RFC 2396 Section 5.2, steps 6.c through 6.g. Normalization occurs directly on the string, no new allocation is done

    path:pointer to the path string
    Returns:0 or an error code

    Function: xmlParseURI

    xmlURIPtr	xmlParseURI		(const char * str)

    Parse an URI based on RFC 3986 URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

    str:the URI string to analyze
    Returns:a newly built xmlURIPtr or NULL in case of error

    Function: xmlParseURIRaw

    xmlURIPtr	xmlParseURIRaw		(const char * str, 
    int raw)

    Parse an URI but allows to keep intact the original fragments. URI-reference = URI / relative-ref

    str:the URI string to analyze
    raw:if 1 unescaping of URI pieces are disabled
    Returns:a newly built xmlURIPtr or NULL in case of error

    Function: xmlParseURIReference

    int	xmlParseURIReference		(xmlURIPtr uri, 
    const char * str)

    Parse an URI reference string based on RFC 3986 and fills in the appropriate fields of the @uri structure URI-reference = URI / relative-ref

    uri:pointer to an URI structure
    str:the string to analyze
    Returns:0 or the error code

    Function: xmlPathToURI

    xmlChar *	xmlPathToURI		(const xmlChar * path)

    Constructs an URI expressing the existing path

    path:the resource locator in a filesystem notation
    Returns:a new URI, or a duplicate of the path parameter if the construction fails. The caller is responsible for freeing the memory occupied by the returned string. If there is insufficient memory available, or the argument is NULL, the function returns NULL.

    Function: xmlPrintURI

    void	xmlPrintURI			(FILE * stream, 
    xmlURIPtr uri)

    Prints the URI in the stream @stream.

    stream:a FILE* for the output
    uri:pointer to an xmlURI

    Function: xmlSaveUri

    xmlChar *	xmlSaveUri		(xmlURIPtr uri)

    Save the URI as an escaped string

    uri:pointer to an xmlURI
    Returns:a new string (to be deallocated by caller)

    Function: xmlURIEscape

    xmlChar *	xmlURIEscape		(const xmlChar * str)

    Escaping routine, does not do validity checks ! It will try to escape the chars needing this, but this is heuristic based it's impossible to be sure.

    str:the string of the URI to escape
    Returns:an copy of the string, but escaped 25 May 2001 Uses xmlParseURI and xmlURIEscapeStr to try to escape correctly according to RFC2396. - Carl Douglas

    Function: xmlURIEscapeStr

    xmlChar *	xmlURIEscapeStr		(const xmlChar * str, 
    const xmlChar * list)

    This routine escapes a string to hex, ignoring reserved characters (a-z) and the characters in the exception list.

    str:string to escape
    list:exception list string of chars not to escape
    Returns:a new escaped string or NULL in case of error.

    Function: xmlURIUnescapeString

    char *	xmlURIUnescapeString		(const char * str, 
    int len,
    char * target)

    Unescaping routine, but does not check that the string is an URI. The output is a direct unsigned char translation of %XX values (no encoding) Note that the length of the result can only be smaller or same size as the input string.

    str:the string to unescape
    len:the length in bytes to unescape (or <= 0 to indicate full string)
    target:optional destination buffer
    Returns:a copy of the string, but unescaped, will return NULL only in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-threads.html0000644000175000017500000004140712134171042020073 0ustar aronaron Module threads from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module threads from libxml2

    API Menu
    API Indexes
    Related links

    set of generic threading related routines should work with pthreads, Windows native or TLS threads

    Table of Contents

    Structure xmlMutex
    struct _xmlMutex The content of this structure is not made public by the API.
    Typedef xmlMutex * xmlMutexPtr
    
    Structure xmlRMutex
    struct _xmlRMutex The content of this structure is not made public by the API.
    Typedef xmlRMutex * xmlRMutexPtr
    
    void	xmlCleanupThreads		(void)
    int	xmlDllMain			(void * hinstDLL, 
    unsigned long fdwReason,
    void * lpvReserved)
    void	xmlFreeMutex			(xmlMutexPtr tok)
    void	xmlFreeRMutex			(xmlRMutexPtr tok)
    xmlGlobalStatePtr	xmlGetGlobalState	(void)
    int	xmlGetThreadId			(void)
    void	xmlInitThreads			(void)
    int	xmlIsMainThread			(void)
    void	xmlLockLibrary			(void)
    void	xmlMutexLock			(xmlMutexPtr tok)
    void	xmlMutexUnlock			(xmlMutexPtr tok)
    xmlMutexPtr	xmlNewMutex		(void)
    xmlRMutexPtr	xmlNewRMutex		(void)
    void	xmlRMutexLock			(xmlRMutexPtr tok)
    void	xmlRMutexUnlock			(xmlRMutexPtr tok)
    void	xmlUnlockLibrary		(void)

    Description

    Structure xmlMutex

    Structure xmlMutex
    struct _xmlMutex { The content of this structure is not made public by the API. }

    Structure xmlRMutex

    Structure xmlRMutex
    struct _xmlRMutex { The content of this structure is not made public by the API. }

    Function: xmlCleanupThreads

    void	xmlCleanupThreads		(void)

    xmlCleanupThreads() is used to to cleanup all the thread related data of the libxml2 library once processing has ended. WARNING: if your application is multithreaded or has plugin support calling this may crash the application if another thread or a plugin is still using libxml2. It's sometimes very hard to guess if libxml2 is in use in the application, some libraries or plugins may use it without notice. In case of doubt abstain from calling this function or do it just before calling exit() to avoid leak reports from valgrind !

    Function: xmlDllMain

    int	xmlDllMain			(void * hinstDLL, 
    unsigned long fdwReason,
    void * lpvReserved)

    hinstDLL:
    fdwReason:
    lpvReserved:
    Returns:

    Function: xmlFreeMutex

    void	xmlFreeMutex			(xmlMutexPtr tok)

    xmlFreeMutex() is used to reclaim resources associated with a libxml2 token struct.

    tok:the simple mutex

    Function: xmlFreeRMutex

    void	xmlFreeRMutex			(xmlRMutexPtr tok)

    xmlRFreeMutex() is used to reclaim resources associated with a reentrant mutex.

    tok:the reentrant mutex

    Function: xmlGetGlobalState

    xmlGlobalStatePtr	xmlGetGlobalState	(void)

    xmlGetGlobalState() is called to retrieve the global state for a thread.

    Returns:the thread global state or NULL in case of error

    Function: xmlGetThreadId

    int	xmlGetThreadId			(void)

    xmlGetThreadId() find the current thread ID number Note that this is likely to be broken on some platforms using pthreads as the specification doesn't mandate pthread_t to be an integer type

    Returns:the current thread ID number

    Function: xmlInitThreads

    void	xmlInitThreads			(void)

    xmlInitThreads() is used to to initialize all the thread related data of the libxml2 library.

    Function: xmlIsMainThread

    int	xmlIsMainThread			(void)

    xmlIsMainThread() check whether the current thread is the main thread.

    Returns:1 if the current thread is the main thread, 0 otherwise

    Function: xmlLockLibrary

    void	xmlLockLibrary			(void)

    xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 library.

    Function: xmlMutexLock

    void	xmlMutexLock			(xmlMutexPtr tok)

    xmlMutexLock() is used to lock a libxml2 token.

    tok:the simple mutex

    Function: xmlMutexUnlock

    void	xmlMutexUnlock			(xmlMutexPtr tok)

    xmlMutexUnlock() is used to unlock a libxml2 token.

    tok:the simple mutex

    Function: xmlNewMutex

    xmlMutexPtr	xmlNewMutex		(void)

    xmlNewMutex() is used to allocate a libxml2 token struct for use in synchronizing access to data.

    Returns:a new simple mutex pointer or NULL in case of error

    Function: xmlNewRMutex

    xmlRMutexPtr	xmlNewRMutex		(void)

    xmlRNewMutex() is used to allocate a reentrant mutex for use in synchronizing access to data. token_r is a re-entrant lock and thus useful for synchronizing access to data structures that may be manipulated in a recursive fashion.

    Returns:the new reentrant mutex pointer or NULL in case of error

    Function: xmlRMutexLock

    void	xmlRMutexLock			(xmlRMutexPtr tok)

    xmlRMutexLock() is used to lock a libxml2 token_r.

    tok:the reentrant mutex

    Function: xmlRMutexUnlock

    void	xmlRMutexUnlock			(xmlRMutexPtr tok)

    xmlRMutexUnlock() is used to unlock a libxml2 token_r.

    tok:the reentrant mutex

    Function: xmlUnlockLibrary

    void	xmlUnlockLibrary		(void)

    xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 library.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/book1.html0000644000175000017500000002264312134171042016170 0ustar aronaron Reference Manual for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Reference Manual for libxml2

    API Menu
    API Indexes
    Related links

    Table of Contents

    • DOCBparser: old DocBook SGML parser
    • HTMLparser: interface for an HTML 4.0 non-verifying parser
    • HTMLtree: specific APIs to process HTML tree, especially serialization
    • SAX: Old SAX version 1 handler, deprecated
    • SAX2: SAX2 parser interface used to build the DOM tree
    • c14n: Provide Canonical XML and Exclusive XML Canonicalization
    • catalog: interfaces to the Catalog handling system
    • chvalid: Unicode character range checking
    • debugXML: Tree debugging APIs
    • dict: string dictionnary
    • encoding: interface for the encoding conversion functions
    • entities: interface for the XML entities handling
    • globals: interface for all global variables of the library
    • hash: Chained hash tables
    • list: lists interfaces
    • nanoftp: minimal FTP implementation
    • nanohttp: minimal HTTP implementation
    • parser: the core parser module
    • parserInternals: internals routines and limits exported by the parser.
    • pattern: pattern expression handling
    • relaxng: implementation of the Relax-NG validation
    • schemasInternals: internal interfaces for XML Schemas
    • schematron: XML Schemastron implementation
    • threads: interfaces for thread handling
    • tree: interfaces for tree manipulation
    • uri: library of generic URI related routines
    • valid: The DTD validation
    • xinclude: implementation of XInclude
    • xlink: unfinished XLink detection module
    • xmlIO: interface for the I/O interfaces used by the parser
    • xmlautomata: API to build regexp automata
    • xmlerror: error handling
    • xmlexports: macros for marking symbols as exportable/importable.
    • xmlmemory: interface for the memory allocator
    • xmlmodule: dynamic module loading
    • xmlreader: the XMLReader implementation
    • xmlregexp: regular expressions handling
    • xmlsave: the XML document serializer
    • xmlschemas: incomplete XML Schemas structure implementation
    • xmlschemastypes: implementation of XML Schema Datatypes
    • xmlstring: set of routines to process strings
    • xmlunicode: Unicode character APIs
    • xmlversion: compile-time version informations
    • xmlwriter: text writing API for XML
    • xpath: XML Path Language implementation
    • xpathInternals: internal interfaces for XML Path Language implementation
    • xpointer: API to handle XML Pointers

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-nanohttp.html0000644000175000017500000005134612134171042020277 0ustar aronaron Module nanohttp from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module nanohttp from libxml2

    API Menu
    API Indexes
    Related links

    minimal HTTP implementation allowing to fetch resources like external subset.

    Table of Contents

    const char *	xmlNanoHTTPAuthHeader	(void * ctx)
    void	xmlNanoHTTPCleanup		(void)
    void	xmlNanoHTTPClose		(void * ctx)
    int	xmlNanoHTTPContentLength	(void * ctx)
    const char *	xmlNanoHTTPEncoding	(void * ctx)
    int	xmlNanoHTTPFetch		(const char * URL, 
    const char * filename,
    char ** contentType)
    void	xmlNanoHTTPInit			(void)
    void *	xmlNanoHTTPMethod		(const char * URL, 
    const char * method,
    const char * input,
    char ** contentType,
    const char * headers,
    int ilen)
    void *	xmlNanoHTTPMethodRedir		(const char * URL, 
    const char * method,
    const char * input,
    char ** contentType,
    char ** redir,
    const char * headers,
    int ilen)
    const char *	xmlNanoHTTPMimeType	(void * ctx)
    void *	xmlNanoHTTPOpen			(const char * URL, 
    char ** contentType)
    void *	xmlNanoHTTPOpenRedir		(const char * URL, 
    char ** contentType,
    char ** redir)
    int	xmlNanoHTTPRead			(void * ctx, 
    void * dest,
    int len)
    const char *	xmlNanoHTTPRedir	(void * ctx)
    int	xmlNanoHTTPReturnCode		(void * ctx)
    int	xmlNanoHTTPSave			(void * ctxt, 
    const char * filename)
    void	xmlNanoHTTPScanProxy		(const char * URL)

    Description

    Function: xmlNanoHTTPAuthHeader

    const char *	xmlNanoHTTPAuthHeader	(void * ctx)

    Get the authentication header of an HTTP context

    ctx:the HTTP context
    Returns:the stashed value of the WWW-Authenticate or Proxy-Authenticate header.

    Function: xmlNanoHTTPCleanup

    void	xmlNanoHTTPCleanup		(void)

    Cleanup the HTTP protocol layer.

    Function: xmlNanoHTTPClose

    void	xmlNanoHTTPClose		(void * ctx)

    This function closes an HTTP context, it ends up the connection and free all data related to it.

    ctx:the HTTP context

    Function: xmlNanoHTTPContentLength

    int	xmlNanoHTTPContentLength	(void * ctx)

    Provides the specified content length from the HTTP header.

    ctx:the HTTP context
    Returns:the specified content length from the HTTP header. Note that a value of -1 indicates that the content length element was not included in the response header.

    Function: xmlNanoHTTPEncoding

    const char *	xmlNanoHTTPEncoding	(void * ctx)

    Provides the specified encoding if specified in the HTTP headers.

    ctx:the HTTP context
    Returns:the specified encoding or NULL if not available

    Function: xmlNanoHTTPFetch

    int	xmlNanoHTTPFetch		(const char * URL, 
    const char * filename,
    char ** contentType)

    This function try to fetch the indicated resource via HTTP GET and save it's content in the file.

    URL:The URL to load
    filename:the filename where the content should be saved
    contentType:if available the Content-Type information will be returned at that location
    Returns:-1 in case of failure, 0 incase of success. The contentType, if provided must be freed by the caller

    Function: xmlNanoHTTPInit

    void	xmlNanoHTTPInit			(void)

    Initialize the HTTP protocol layer. Currently it just checks for proxy informations

    Function: xmlNanoHTTPMethod

    void *	xmlNanoHTTPMethod		(const char * URL, 
    const char * method,
    const char * input,
    char ** contentType,
    const char * headers,
    int ilen)

    This function try to open a connection to the indicated resource via HTTP using the given @method, adding the given extra headers and the input buffer for the request content.

    URL:The URL to load
    method:the HTTP method to use
    input:the input string if any
    contentType:the Content-Type information IN and OUT
    headers:the extra headers
    ilen:input length
    Returns:NULL in case of failure, otherwise a request handler. The contentType, if provided must be freed by the caller

    Function: xmlNanoHTTPMethodRedir

    void *	xmlNanoHTTPMethodRedir		(const char * URL, 
    const char * method,
    const char * input,
    char ** contentType,
    char ** redir,
    const char * headers,
    int ilen)

    This function try to open a connection to the indicated resource via HTTP using the given @method, adding the given extra headers and the input buffer for the request content.

    URL:The URL to load
    method:the HTTP method to use
    input:the input string if any
    contentType:the Content-Type information IN and OUT
    redir:the redirected URL OUT
    headers:the extra headers
    ilen:input length
    Returns:NULL in case of failure, otherwise a request handler. The contentType, or redir, if provided must be freed by the caller

    Function: xmlNanoHTTPMimeType

    const char *	xmlNanoHTTPMimeType	(void * ctx)

    Provides the specified Mime-Type if specified in the HTTP headers.

    ctx:the HTTP context
    Returns:the specified Mime-Type or NULL if not available

    Function: xmlNanoHTTPOpen

    void *	xmlNanoHTTPOpen			(const char * URL, 
    char ** contentType)

    This function try to open a connection to the indicated resource via HTTP GET.

    URL:The URL to load
    contentType:if available the Content-Type information will be returned at that location
    Returns:NULL in case of failure, otherwise a request handler. The contentType, if provided must be freed by the caller

    Function: xmlNanoHTTPOpenRedir

    void *	xmlNanoHTTPOpenRedir		(const char * URL, 
    char ** contentType,
    char ** redir)

    This function try to open a connection to the indicated resource via HTTP GET.

    URL:The URL to load
    contentType:if available the Content-Type information will be returned at that location
    redir:if available the redirected URL will be returned
    Returns:NULL in case of failure, otherwise a request handler. The contentType, if provided must be freed by the caller

    Function: xmlNanoHTTPRead

    int	xmlNanoHTTPRead			(void * ctx, 
    void * dest,
    int len)

    This function tries to read @len bytes from the existing HTTP connection and saves them in @dest. This is a blocking call.

    ctx:the HTTP context
    dest:a buffer
    len:the buffer length
    Returns:the number of byte read. 0 is an indication of an end of connection. -1 indicates a parameter error.

    Function: xmlNanoHTTPRedir

    const char *	xmlNanoHTTPRedir	(void * ctx)

    Provides the specified redirection URL if available from the HTTP header.

    ctx:the HTTP context
    Returns:the specified redirection URL or NULL if not redirected.

    Function: xmlNanoHTTPReturnCode

    int	xmlNanoHTTPReturnCode		(void * ctx)

    Get the latest HTTP return code received

    ctx:the HTTP context
    Returns:the HTTP return code for the request.

    Function: xmlNanoHTTPSave

    int	xmlNanoHTTPSave			(void * ctxt, 
    const char * filename)

    This function saves the output of the HTTP transaction to a file It closes and free the context at the end

    ctxt:the HTTP context
    filename:the filename where the content should be saved
    Returns:-1 in case of failure, 0 incase of success.

    Function: xmlNanoHTTPScanProxy

    void	xmlNanoHTTPScanProxy		(const char * URL)

    (Re)Initialize the HTTP Proxy context by parsing the URL and finding the protocol host port it indicates. Should be like http://myproxy/ or http://myproxy:3128/ A NULL URL cleans up proxy informations.

    URL:The proxy URL used to initialize the proxy context

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-HTMLtree.html0000644000175000017500000006766712134171042020105 0ustar aronaron Module HTMLtree from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module HTMLtree from libxml2

    API Menu
    API Indexes
    Related links

    this module implements a few function needed to process tree in an HTML specific way.

    Table of Contents

    #define HTML_COMMENT_NODE
    #define HTML_ENTITY_REF_NODE
    #define HTML_PI_NODE
    #define HTML_PRESERVE_NODE
    #define HTML_TEXT_NODE
    void	htmlDocContentDumpFormatOutput	(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding,
    int format)
    void	htmlDocContentDumpOutput	(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding)
    int	htmlDocDump			(FILE * f, 
    xmlDocPtr cur)
    void	htmlDocDumpMemory		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size)
    void	htmlDocDumpMemoryFormat		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size,
    int format)
    const xmlChar *	htmlGetMetaEncoding	(htmlDocPtr doc)
    int	htmlIsBooleanAttr		(const xmlChar * name)
    htmlDocPtr	htmlNewDoc		(const xmlChar * URI, 
    const xmlChar * ExternalID)
    htmlDocPtr	htmlNewDocNoDtD		(const xmlChar * URI, 
    const xmlChar * ExternalID)
    int	htmlNodeDump			(xmlBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur)
    void	htmlNodeDumpFile		(FILE * out, 
    xmlDocPtr doc,
    xmlNodePtr cur)
    int	htmlNodeDumpFileFormat		(FILE * out, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    const char * encoding,
    int format)
    void	htmlNodeDumpFormatOutput	(xmlOutputBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    const char * encoding,
    int format)
    void	htmlNodeDumpOutput		(xmlOutputBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    const char * encoding)
    int	htmlSaveFile			(const char * filename, 
    xmlDocPtr cur)
    int	htmlSaveFileEnc			(const char * filename, 
    xmlDocPtr cur,
    const char * encoding)
    int	htmlSaveFileFormat		(const char * filename, 
    xmlDocPtr cur,
    const char * encoding,
    int format)
    int	htmlSetMetaEncoding		(htmlDocPtr doc, 
    const xmlChar * encoding)

    Description

    Macro: HTML_COMMENT_NODE

    #define HTML_COMMENT_NODE

    Macro. A comment in a HTML document is really implemented the same way as a comment in an XML document.

    Macro: HTML_ENTITY_REF_NODE

    #define HTML_ENTITY_REF_NODE

    Macro. An entity reference in a HTML document is really implemented the same way as an entity reference in an XML document.

    Macro: HTML_PI_NODE

    #define HTML_PI_NODE

    Macro. A processing instruction in a HTML document is really implemented the same way as a processing instruction in an XML document.

    Macro: HTML_PRESERVE_NODE

    #define HTML_PRESERVE_NODE

    Macro. A preserved node in a HTML document is really implemented the same way as a CDATA section in an XML document.

    Macro: HTML_TEXT_NODE

    #define HTML_TEXT_NODE

    Macro. A text node in a HTML document is really implemented the same way as a text node in an XML document.

    Function: htmlDocContentDumpFormatOutput

    void	htmlDocContentDumpFormatOutput	(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding,
    int format)

    Dump an HTML document.

    buf:the HTML buffer output
    cur:the document
    encoding:the encoding string
    format:should formatting spaces been added

    Function: htmlDocContentDumpOutput

    void	htmlDocContentDumpOutput	(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding)

    Dump an HTML document. Formating return/spaces are added.

    buf:the HTML buffer output
    cur:the document
    encoding:the encoding string

    Function: htmlDocDump

    int	htmlDocDump			(FILE * f, 
    xmlDocPtr cur)

    Dump an HTML document to an open FILE.

    f:the FILE*
    cur:the document
    Returns:the number of byte written or -1 in case of failure.

    Function: htmlDocDumpMemory

    void	htmlDocDumpMemory		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size)

    Dump an HTML document in memory and return the xmlChar * and it's size. It's up to the caller to free the memory.

    cur:the document
    mem:OUT: the memory pointer
    size:OUT: the memory length

    Function: htmlDocDumpMemoryFormat

    void	htmlDocDumpMemoryFormat		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size,
    int format)

    Dump an HTML document in memory and return the xmlChar * and it's size. It's up to the caller to free the memory.

    cur:the document
    mem:OUT: the memory pointer
    size:OUT: the memory length
    format:should formatting spaces been added

    Function: htmlGetMetaEncoding

    const xmlChar *	htmlGetMetaEncoding	(htmlDocPtr doc)

    Encoding definition lookup in the Meta tags

    doc:the document
    Returns:the current encoding as flagged in the HTML source

    Function: htmlIsBooleanAttr

    int	htmlIsBooleanAttr		(const xmlChar * name)

    Determine if a given attribute is a boolean attribute.

    name:the name of the attribute to check
    Returns:false if the attribute is not boolean, true otherwise.

    Function: htmlNewDoc

    htmlDocPtr	htmlNewDoc		(const xmlChar * URI, 
    const xmlChar * ExternalID)

    Creates a new HTML document

    URI:URI for the dtd, or NULL
    ExternalID:the external ID of the DTD, or NULL
    Returns:a new document

    Function: htmlNewDocNoDtD

    htmlDocPtr	htmlNewDocNoDtD		(const xmlChar * URI, 
    const xmlChar * ExternalID)

    Creates a new HTML document without a DTD node if @URI and @ExternalID are NULL

    URI:URI for the dtd, or NULL
    ExternalID:the external ID of the DTD, or NULL
    Returns:a new document, do not initialize the DTD if not provided

    Function: htmlNodeDump

    int	htmlNodeDump			(xmlBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur)

    Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added.

    buf:the HTML buffer output
    doc:the document
    cur:the current node
    Returns:the number of byte written or -1 in case of error

    Function: htmlNodeDumpFile

    void	htmlNodeDumpFile		(FILE * out, 
    xmlDocPtr doc,
    xmlNodePtr cur)

    Dump an HTML node, recursive behaviour,children are printed too, and formatting returns are added.

    out:the FILE pointer
    doc:the document
    cur:the current node

    Function: htmlNodeDumpFileFormat

    int	htmlNodeDumpFileFormat		(FILE * out, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    const char * encoding,
    int format)

    Dump an HTML node, recursive behaviour,children are printed too. TODO: if encoding == NULL try to save in the doc encoding

    out:the FILE pointer
    doc:the document
    cur:the current node
    encoding:the document encoding
    format:should formatting spaces been added
    Returns:the number of byte written or -1 in case of failure.

    Function: htmlNodeDumpFormatOutput

    void	htmlNodeDumpFormatOutput	(xmlOutputBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    const char * encoding,
    int format)

    Dump an HTML node, recursive behaviour,children are printed too.

    buf:the HTML buffer output
    doc:the document
    cur:the current node
    encoding:the encoding string
    format:should formatting spaces been added

    Function: htmlNodeDumpOutput

    void	htmlNodeDumpOutput		(xmlOutputBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    const char * encoding)

    Dump an HTML node, recursive behaviour,children are printed too, and formatting returns/spaces are added.

    buf:the HTML buffer output
    doc:the document
    cur:the current node
    encoding:the encoding string

    Function: htmlSaveFile

    int	htmlSaveFile			(const char * filename, 
    xmlDocPtr cur)

    Dump an HTML document to a file. If @filename is "-" the stdout file is used.

    filename:the filename (or URL)
    cur:the document
    Returns:the number of byte written or -1 in case of failure.

    Function: htmlSaveFileEnc

    int	htmlSaveFileEnc			(const char * filename, 
    xmlDocPtr cur,
    const char * encoding)

    Dump an HTML document to a file using a given encoding and formatting returns/spaces are added.

    filename:the filename
    cur:the document
    encoding:the document encoding
    Returns:the number of byte written or -1 in case of failure.

    Function: htmlSaveFileFormat

    int	htmlSaveFileFormat		(const char * filename, 
    xmlDocPtr cur,
    const char * encoding,
    int format)

    Dump an HTML document to a file using a given encoding.

    filename:the filename
    cur:the document
    encoding:the document encoding
    format:should formatting spaces been added
    Returns:the number of byte written or -1 in case of failure.

    Function: htmlSetMetaEncoding

    int	htmlSetMetaEncoding		(htmlDocPtr doc, 
    const xmlChar * encoding)

    Sets the current encoding in the Meta tags NOTE: this will not change the document content encoding, just the META flag associated.

    doc:the document
    encoding:the encoding string
    Returns:0 in case of success and -1 in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-relaxng.html0000644000175000017500000012005012134171042020071 0ustar aronaron Module relaxng from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module relaxng from libxml2

    API Menu
    API Indexes
    Related links

    implementation of the Relax-NG validation

    Table of Contents

    Structure xmlRelaxNG
    struct _xmlRelaxNG The content of this structure is not made public by the API.
    Structure xmlRelaxNGParserCtxt
    struct _xmlRelaxNGParserCtxt The content of this structure is not made public by the API.
    Typedef xmlRelaxNGParserCtxt * xmlRelaxNGParserCtxtPtr
    
    Enum xmlRelaxNGParserFlag
    
    Typedef xmlRelaxNG * xmlRelaxNGPtr
    
    Structure xmlRelaxNGValidCtxt
    struct _xmlRelaxNGValidCtxt The content of this structure is not made public by the API.
    Typedef xmlRelaxNGValidCtxt * xmlRelaxNGValidCtxtPtr
    
    Enum xmlRelaxNGValidErr
    
    void	xmlRelaxNGCleanupTypes		(void)
    void	xmlRelaxNGDump			(FILE * output, 
    xmlRelaxNGPtr schema)
    void	xmlRelaxNGDumpTree		(FILE * output, 
    xmlRelaxNGPtr schema)
    void	xmlRelaxNGFree			(xmlRelaxNGPtr schema)
    void	xmlRelaxNGFreeParserCtxt	(xmlRelaxNGParserCtxtPtr ctxt)
    void	xmlRelaxNGFreeValidCtxt		(xmlRelaxNGValidCtxtPtr ctxt)
    int	xmlRelaxNGGetParserErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc * err,
    xmlRelaxNGValidityWarningFunc * warn,
    void ** ctx)
    int	xmlRelaxNGGetValidErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc * err,
    xmlRelaxNGValidityWarningFunc * warn,
    void ** ctx)
    int	xmlRelaxNGInitTypes		(void)
    xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewDocParserCtxt	(xmlDocPtr doc)
    xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewMemParserCtxt	(const char * buffer, 
    int size)
    xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewParserCtxt	(const char * URL)
    xmlRelaxNGValidCtxtPtr	xmlRelaxNGNewValidCtxt	(xmlRelaxNGPtr schema)
    xmlRelaxNGPtr	xmlRelaxNGParse		(xmlRelaxNGParserCtxtPtr ctxt)
    void	xmlRelaxNGSetParserErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc err,
    xmlRelaxNGValidityWarningFunc warn,
    void * ctx)
    void	xmlRelaxNGSetParserStructuredErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)
    void	xmlRelaxNGSetValidErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc err,
    xmlRelaxNGValidityWarningFunc warn,
    void * ctx)
    void	xmlRelaxNGSetValidStructuredErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)
    int	xmlRelaxNGValidateDoc		(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc)
    int	xmlRelaxNGValidateFullElement	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)
    int	xmlRelaxNGValidatePopElement	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)
    int	xmlRelaxNGValidatePushCData	(xmlRelaxNGValidCtxtPtr ctxt, 
    const xmlChar * data,
    int len)
    int	xmlRelaxNGValidatePushElement	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)
    Function type: xmlRelaxNGValidityErrorFunc
    void	xmlRelaxNGValidityErrorFunc	(void * ctx, 
    const char * msg,
    ... ...)
    Function type: xmlRelaxNGValidityWarningFunc
    void	xmlRelaxNGValidityWarningFunc	(void * ctx, 
    const char * msg,
    ... ...)
    int	xmlRelaxParserSetFlag		(xmlRelaxNGParserCtxtPtr ctxt, 
    int flags)

    Description

    Structure xmlRelaxNG

    Structure xmlRelaxNG
    struct _xmlRelaxNG { The content of this structure is not made public by the API. }

    Structure xmlRelaxNGParserCtxt

    Structure xmlRelaxNGParserCtxt
    struct _xmlRelaxNGParserCtxt { The content of this structure is not made public by the API. }

    Enum xmlRelaxNGParserFlag

    Enum xmlRelaxNGParserFlag {
        XML_RELAXNGP_NONE = 0
        XML_RELAXNGP_FREE_DOC = 1
        XML_RELAXNGP_CRNG = 2
    }
    

    Structure xmlRelaxNGValidCtxt

    Structure xmlRelaxNGValidCtxt
    struct _xmlRelaxNGValidCtxt { The content of this structure is not made public by the API. }

    Enum xmlRelaxNGValidErr

    Enum xmlRelaxNGValidErr {
        XML_RELAXNG_OK = 0
        XML_RELAXNG_ERR_MEMORY = 1
        XML_RELAXNG_ERR_TYPE = 2
        XML_RELAXNG_ERR_TYPEVAL = 3
        XML_RELAXNG_ERR_DUPID = 4
        XML_RELAXNG_ERR_TYPECMP = 5
        XML_RELAXNG_ERR_NOSTATE = 6
        XML_RELAXNG_ERR_NODEFINE = 7
        XML_RELAXNG_ERR_LISTEXTRA = 8
        XML_RELAXNG_ERR_LISTEMPTY = 9
        XML_RELAXNG_ERR_INTERNODATA = 10
        XML_RELAXNG_ERR_INTERSEQ = 11
        XML_RELAXNG_ERR_INTEREXTRA = 12
        XML_RELAXNG_ERR_ELEMNAME = 13
        XML_RELAXNG_ERR_ATTRNAME = 14
        XML_RELAXNG_ERR_ELEMNONS = 15
        XML_RELAXNG_ERR_ATTRNONS = 16
        XML_RELAXNG_ERR_ELEMWRONGNS = 17
        XML_RELAXNG_ERR_ATTRWRONGNS = 18
        XML_RELAXNG_ERR_ELEMEXTRANS = 19
        XML_RELAXNG_ERR_ATTREXTRANS = 20
        XML_RELAXNG_ERR_ELEMNOTEMPTY = 21
        XML_RELAXNG_ERR_NOELEM = 22
        XML_RELAXNG_ERR_NOTELEM = 23
        XML_RELAXNG_ERR_ATTRVALID = 24
        XML_RELAXNG_ERR_CONTENTVALID = 25
        XML_RELAXNG_ERR_EXTRACONTENT = 26
        XML_RELAXNG_ERR_INVALIDATTR = 27
        XML_RELAXNG_ERR_DATAELEM = 28
        XML_RELAXNG_ERR_VALELEM = 29
        XML_RELAXNG_ERR_LISTELEM = 30
        XML_RELAXNG_ERR_DATATYPE = 31
        XML_RELAXNG_ERR_VALUE = 32
        XML_RELAXNG_ERR_LIST = 33
        XML_RELAXNG_ERR_NOGRAMMAR = 34
        XML_RELAXNG_ERR_EXTRADATA = 35
        XML_RELAXNG_ERR_LACKDATA = 36
        XML_RELAXNG_ERR_INTERNAL = 37
        XML_RELAXNG_ERR_ELEMWRONG = 38
        XML_RELAXNG_ERR_TEXTWRONG = 39
    }
    

    Function: xmlRelaxNGCleanupTypes

    void	xmlRelaxNGCleanupTypes		(void)

    Cleanup the default Schemas type library associated to RelaxNG

    Function: xmlRelaxNGDump

    void	xmlRelaxNGDump			(FILE * output, 
    xmlRelaxNGPtr schema)

    Dump a RelaxNG structure back

    output:the file output
    schema:a schema structure

    Function: xmlRelaxNGDumpTree

    void	xmlRelaxNGDumpTree		(FILE * output, 
    xmlRelaxNGPtr schema)

    Dump the transformed RelaxNG tree.

    output:the file output
    schema:a schema structure

    Function: xmlRelaxNGFree

    void	xmlRelaxNGFree			(xmlRelaxNGPtr schema)

    Deallocate a RelaxNG structure.

    schema:a schema structure

    Function: xmlRelaxNGFreeParserCtxt

    void	xmlRelaxNGFreeParserCtxt	(xmlRelaxNGParserCtxtPtr ctxt)

    Free the resources associated to the schema parser context

    ctxt:the schema parser context

    Function: xmlRelaxNGFreeValidCtxt

    void	xmlRelaxNGFreeValidCtxt		(xmlRelaxNGValidCtxtPtr ctxt)

    Free the resources associated to the schema validation context

    ctxt:the schema validation context

    Function: xmlRelaxNGGetParserErrors

    int	xmlRelaxNGGetParserErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc * err,
    xmlRelaxNGValidityWarningFunc * warn,
    void ** ctx)

    Get the callback information used to handle errors for a validation context

    ctxt:a Relax-NG validation context
    err:the error callback result
    warn:the warning callback result
    ctx:contextual data for the callbacks result
    Returns:-1 in case of failure, 0 otherwise.

    Function: xmlRelaxNGGetValidErrors

    int	xmlRelaxNGGetValidErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc * err,
    xmlRelaxNGValidityWarningFunc * warn,
    void ** ctx)

    Get the error and warning callback informations

    ctxt:a Relax-NG validation context
    err:the error function result
    warn:the warning function result
    ctx:the functions context result
    Returns:-1 in case of error and 0 otherwise

    Function: xmlRelaxNGInitTypes

    int	xmlRelaxNGInitTypes		(void)

    Initilize the default type libraries.

    Returns:0 in case of success and -1 in case of error.

    Function: xmlRelaxNGNewDocParserCtxt

    xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewDocParserCtxt	(xmlDocPtr doc)

    Create an XML RelaxNGs parser context for that document. Note: since the process of compiling a RelaxNG schemas modifies the document, the @doc parameter is duplicated internally.

    doc:a preparsed document tree
    Returns:the parser context or NULL in case of error

    Function: xmlRelaxNGNewMemParserCtxt

    xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewMemParserCtxt	(const char * buffer, 
    int size)

    Create an XML RelaxNGs parse context for that memory buffer expected to contain an XML RelaxNGs file.

    buffer:a pointer to a char array containing the schemas
    size:the size of the array
    Returns:the parser context or NULL in case of error

    Function: xmlRelaxNGNewParserCtxt

    xmlRelaxNGParserCtxtPtr	xmlRelaxNGNewParserCtxt	(const char * URL)

    Create an XML RelaxNGs parse context for that file/resource expected to contain an XML RelaxNGs file.

    URL:the location of the schema
    Returns:the parser context or NULL in case of error

    Function: xmlRelaxNGNewValidCtxt

    xmlRelaxNGValidCtxtPtr	xmlRelaxNGNewValidCtxt	(xmlRelaxNGPtr schema)

    Create an XML RelaxNGs validation context based on the given schema

    schema:a precompiled XML RelaxNGs
    Returns:the validation context or NULL in case of error

    Function: xmlRelaxNGParse

    xmlRelaxNGPtr	xmlRelaxNGParse		(xmlRelaxNGParserCtxtPtr ctxt)

    parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances.

    ctxt:a Relax-NG parser context
    Returns:the internal XML RelaxNG structure built from the resource or NULL in case of error

    Function: xmlRelaxNGSetParserErrors

    void	xmlRelaxNGSetParserErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc err,
    xmlRelaxNGValidityWarningFunc warn,
    void * ctx)

    Set the callback functions used to handle errors for a validation context

    ctxt:a Relax-NG validation context
    err:the error callback
    warn:the warning callback
    ctx:contextual data for the callbacks

    Function: xmlRelaxNGSetParserStructuredErrors

    void	xmlRelaxNGSetParserStructuredErrors	(xmlRelaxNGParserCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)

    Set the callback functions used to handle errors for a parsing context

    ctxt:a Relax-NG parser context
    serror:the error callback
    ctx:contextual data for the callbacks

    Function: xmlRelaxNGSetValidErrors

    void	xmlRelaxNGSetValidErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlRelaxNGValidityErrorFunc err,
    xmlRelaxNGValidityWarningFunc warn,
    void * ctx)

    Set the error and warning callback informations

    ctxt:a Relax-NG validation context
    err:the error function
    warn:the warning function
    ctx:the functions context

    Function: xmlRelaxNGSetValidStructuredErrors

    void	xmlRelaxNGSetValidStructuredErrors	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlStructuredErrorFunc serror,
    void * ctx)

    Set the structured error callback

    ctxt:a Relax-NG validation context
    serror:the structured error function
    ctx:the functions context

    Function: xmlRelaxNGValidateDoc

    int	xmlRelaxNGValidateDoc		(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc)

    Validate a document tree in memory.

    ctxt:a Relax-NG validation context
    doc:a parsed document tree
    Returns:0 if the document is valid, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlRelaxNGValidateFullElement

    int	xmlRelaxNGValidateFullElement	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)

    Validate a full subtree when xmlRelaxNGValidatePushElement() returned 0 and the content of the node has been expanded.

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    Returns:1 if no validation problem was found or -1 in case of error.

    Function: xmlRelaxNGValidatePopElement

    int	xmlRelaxNGValidatePopElement	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)

    Pop the element end from the RelaxNG validation stack.

    ctxt:the RelaxNG validation context
    doc:a document instance
    elem:an element instance
    Returns:1 if no validation problem was found or 0 otherwise

    Function: xmlRelaxNGValidatePushCData

    int	xmlRelaxNGValidatePushCData	(xmlRelaxNGValidCtxtPtr ctxt, 
    const xmlChar * data,
    int len)

    check the CData parsed for validation in the current stack

    ctxt:the RelaxNG validation context
    data:some character data read
    len:the length of the data
    Returns:1 if no validation problem was found or -1 otherwise

    Function: xmlRelaxNGValidatePushElement

    int	xmlRelaxNGValidatePushElement	(xmlRelaxNGValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)

    Push a new element start on the RelaxNG validation stack.

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    Returns:1 if no validation problem was found or 0 if validating the element requires a full node, and -1 in case of error.

    Function type: xmlRelaxNGValidityErrorFunc

    Function type: xmlRelaxNGValidityErrorFunc
    void	xmlRelaxNGValidityErrorFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Signature of an error callback from a Relax-NG validation

    ctx:the validation context
    msg:the message
    ...:extra arguments

    Function type: xmlRelaxNGValidityWarningFunc

    Function type: xmlRelaxNGValidityWarningFunc
    void	xmlRelaxNGValidityWarningFunc	(void * ctx, 
    const char * msg,
    ... ...)

    Signature of a warning callback from a Relax-NG validation

    ctx:the validation context
    msg:the message
    ...:extra arguments

    Function: xmlRelaxParserSetFlag

    int	xmlRelaxParserSetFlag		(xmlRelaxNGParserCtxtPtr ctxt, 
    int flags)

    Semi private function used to pass informations to a parser context which are a combination of xmlRelaxNGParserFlag .

    ctxt:a RelaxNG parser context
    flags:a set of flags values
    Returns:0 if success and -1 in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xpath.html0000644000175000017500000017703112134171043017571 0ustar aronaron Module xpath from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xpath from libxml2

    API Menu
    API Indexes
    Related links

    API for the XML Path Language implementation XML Path Language implementation XPath is a language for addressing parts of an XML document, designed to be used by both XSLT and XPointer

    Table of Contents

    #define XML_XPATH_CHECKNS
    #define XML_XPATH_NOVAR
    #define xmlXPathNodeSetGetLength
    #define xmlXPathNodeSetIsEmpty
    #define xmlXPathNodeSetItem
    Structure xmlNodeSet
    struct _xmlNodeSet
    Typedef xmlNodeSet * xmlNodeSetPtr
    
    Structure xmlXPathAxis
    struct _xmlXPathAxis
    Typedef xmlXPathAxis * xmlXPathAxisPtr
    
    Structure xmlXPathCompExpr
    struct _xmlXPathCompExpr The content of this structure is not made public by the API.
    Typedef xmlXPathCompExpr * xmlXPathCompExprPtr
    
    Structure xmlXPathContext
    struct _xmlXPathContext
    Typedef xmlXPathContext * xmlXPathContextPtr
    
    Enum xmlXPathError
    
    Typedef xmlXPathFunct * xmlXPathFuncPtr
    
    Structure xmlXPathFunct
    struct _xmlXPathFunct
    Structure xmlXPathObject
    struct _xmlXPathObject
    Typedef xmlXPathObject * xmlXPathObjectPtr
    
    Enum xmlXPathObjectType
    
    Structure xmlXPathParserContext
    struct _xmlXPathParserContext
    Typedef xmlXPathParserContext * xmlXPathParserContextPtr
    
    Structure xmlXPathType
    struct _xmlXPathType
    Typedef xmlXPathType * xmlXPathTypePtr
    
    Structure xmlXPathVariable
    struct _xmlXPathVariable
    Typedef xmlXPathVariable * xmlXPathVariablePtr
    
    Function type: xmlXPathAxisFunc
    xmlXPathObjectPtr	xmlXPathAxisFunc	(xmlXPathParserContextPtr ctxt, 
    xmlXPathObjectPtr cur)
    double	xmlXPathCastBooleanToNumber	(int val)
    xmlChar *	xmlXPathCastBooleanToString	(int val)
    int	xmlXPathCastNodeSetToBoolean	(xmlNodeSetPtr ns)
    double	xmlXPathCastNodeSetToNumber	(xmlNodeSetPtr ns)
    xmlChar *	xmlXPathCastNodeSetToString	(xmlNodeSetPtr ns)
    double	xmlXPathCastNodeToNumber	(xmlNodePtr node)
    xmlChar *	xmlXPathCastNodeToString	(xmlNodePtr node)
    int	xmlXPathCastNumberToBoolean	(double val)
    xmlChar *	xmlXPathCastNumberToString	(double val)
    int	xmlXPathCastStringToBoolean	(const xmlChar * val)
    double	xmlXPathCastStringToNumber	(const xmlChar * val)
    int	xmlXPathCastToBoolean		(xmlXPathObjectPtr val)
    double	xmlXPathCastToNumber		(xmlXPathObjectPtr val)
    xmlChar *	xmlXPathCastToString	(xmlXPathObjectPtr val)
    int	xmlXPathCmpNodes		(xmlNodePtr node1, 
    xmlNodePtr node2)
    xmlXPathCompExprPtr	xmlXPathCompile	(const xmlChar * str)
    xmlXPathObjectPtr	xmlXPathCompiledEval	(xmlXPathCompExprPtr comp, 
    xmlXPathContextPtr ctx)
    int	xmlXPathCompiledEvalToBoolean	(xmlXPathCompExprPtr comp, 
    xmlXPathContextPtr ctxt)
    int	xmlXPathContextSetCache		(xmlXPathContextPtr ctxt, 
    int active,
    int value,
    int options)
    xmlXPathObjectPtr	xmlXPathConvertBoolean	(xmlXPathObjectPtr val)
    Function type: xmlXPathConvertFunc
    int	xmlXPathConvertFunc		(xmlXPathObjectPtr obj, 
    int type)
    xmlXPathObjectPtr	xmlXPathConvertNumber	(xmlXPathObjectPtr val)
    xmlXPathObjectPtr	xmlXPathConvertString	(xmlXPathObjectPtr val)
    xmlXPathCompExprPtr	xmlXPathCtxtCompile	(xmlXPathContextPtr ctxt, 
    const xmlChar * str)
    xmlXPathObjectPtr	xmlXPathEval	(const xmlChar * str, 
    xmlXPathContextPtr ctx)
    xmlXPathObjectPtr	xmlXPathEvalExpression	(const xmlChar * str, 
    xmlXPathContextPtr ctxt)
    Function type: xmlXPathEvalFunc
    void	xmlXPathEvalFunc		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    int	xmlXPathEvalPredicate		(xmlXPathContextPtr ctxt, 
    xmlXPathObjectPtr res)
    void	xmlXPathFreeCompExpr		(xmlXPathCompExprPtr comp)
    void	xmlXPathFreeContext		(xmlXPathContextPtr ctxt)
    void	xmlXPathFreeNodeSet		(xmlNodeSetPtr obj)
    void	xmlXPathFreeNodeSetList		(xmlXPathObjectPtr obj)
    void	xmlXPathFreeObject		(xmlXPathObjectPtr obj)
    Function type: xmlXPathFuncLookupFunc
    xmlXPathFunction	xmlXPathFuncLookupFunc	(void * ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)
    Function type: xmlXPathFunction
    void	xmlXPathFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathInit			(void)
    int	xmlXPathIsInf			(double val)
    int	xmlXPathIsNaN			(double val)
    xmlXPathContextPtr	xmlXPathNewContext	(xmlDocPtr doc)
    xmlXPathObjectPtr	xmlXPathNodeEval	(xmlNodePtr node, 
    const xmlChar * str,
    xmlXPathContextPtr ctx)
    xmlNodeSetPtr	xmlXPathNodeSetCreate	(xmlNodePtr val)
    xmlXPathObjectPtr	xmlXPathObjectCopy	(xmlXPathObjectPtr val)
    long	xmlXPathOrderDocElems		(xmlDocPtr doc)
    int	xmlXPathSetContextNode		(xmlNodePtr node, 
    xmlXPathContextPtr ctx)
    Function type: xmlXPathVariableLookupFunc
    xmlXPathObjectPtr	xmlXPathVariableLookupFunc	(void * ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)

    Description

    Macro: XML_XPATH_CHECKNS

    #define XML_XPATH_CHECKNS

    check namespaces at compilation

    Macro: XML_XPATH_NOVAR

    #define XML_XPATH_NOVAR

    forbid variables in expression

    Macro: xmlXPathNodeSetGetLength

    #define xmlXPathNodeSetGetLength

    Implement a functionality similar to the DOM NodeList.length. Returns the number of nodes in the node-set.

    Macro: xmlXPathNodeSetIsEmpty

    #define xmlXPathNodeSetIsEmpty

    Checks whether @ns is empty or not. Returns %TRUE if @ns is an empty node-set.

    Macro: xmlXPathNodeSetItem

    #define xmlXPathNodeSetItem

    Implements a functionality similar to the DOM NodeList.item(). Returns the xmlNodePtr at the given @index in @ns or NULL if @index is out of range (0 to length-1)

    Structure xmlNodeSet

    Structure xmlNodeSet
    struct _xmlNodeSet { int nodeNr : number of nodes in the set int nodeMax : size of the array as allocated xmlNodePtr * nodeTab : array of nodes in no particular order @ }

    Structure xmlXPathAxis

    Structure xmlXPathAxis
    struct _xmlXPathAxis { const xmlChar * name : the axis name xmlXPathAxisFunc func : the search function }

    Structure xmlXPathCompExpr

    Structure xmlXPathCompExpr
    struct _xmlXPathCompExpr { The content of this structure is not made public by the API. }

    Structure xmlXPathContext

    Structure xmlXPathContext
    struct _xmlXPathContext { xmlDocPtr doc : The current document xmlNodePtr node : The current node int nb_variables_unused : unused (hash table) int max_variables_unused : unused (hash table) xmlHashTablePtr varHash : Hash table of defined variables int nb_types : number of defined types int max_types : max number of types xmlXPathTypePtr types : Array of defined types int nb_funcs_unused : unused (hash table) int max_funcs_unused : unused (hash table) xmlHashTablePtr funcHash : Hash table of defined funcs int nb_axis : number of defined axis int max_axis : max number of axis xmlXPathAxisPtr axis : Array of defined axis the namespace nod xmlNsPtr * namespaces : Array of namespaces int nsNr : number of namespace in scope void * user : function to free extra variables int contextSize : the context size int proximityPosition : the proximity position extra stuff for int xptr : is this an XPointer context? xmlNodePtr here : for here() xmlNodePtr origin : for origin() the set of namespace decla xmlHashTablePtr nsHash : The namespaces hash table xmlXPathVariableLookupFunc varLookupFunc : variable lookup func void * varLookupData : variable lookup data Possibility to lin void * extra : needed for XSLT The function name and U const xmlChar * function const xmlChar * functionURI : function lookup function and data xmlXPathFuncLookupFunc funcLookupFunc : function lookup func void * funcLookupData : function lookup data temporary namespac xmlNsPtr * tmpNsList : Array of namespaces int tmpNsNr : number of namespaces in scope error rep void * userData : user specific data block xmlStructuredErrorFunc error : the callback in case of errors xmlError lastError : the last error xmlNodePtr debugNode : the source node XSLT dictionary xmlDictPtr dict : dictionary if any int flags : flags to control compilation Cache for void * cache }

    Enum xmlXPathError

    Enum xmlXPathError {
        XPATH_EXPRESSION_OK = 0
        XPATH_NUMBER_ERROR = 1
        XPATH_UNFINISHED_LITERAL_ERROR = 2
        XPATH_START_LITERAL_ERROR = 3
        XPATH_VARIABLE_REF_ERROR = 4
        XPATH_UNDEF_VARIABLE_ERROR = 5
        XPATH_INVALID_PREDICATE_ERROR = 6
        XPATH_EXPR_ERROR = 7
        XPATH_UNCLOSED_ERROR = 8
        XPATH_UNKNOWN_FUNC_ERROR = 9
        XPATH_INVALID_OPERAND = 10
        XPATH_INVALID_TYPE = 11
        XPATH_INVALID_ARITY = 12
        XPATH_INVALID_CTXT_SIZE = 13
        XPATH_INVALID_CTXT_POSITION = 14
        XPATH_MEMORY_ERROR = 15
        XPTR_SYNTAX_ERROR = 16
        XPTR_RESOURCE_ERROR = 17
        XPTR_SUB_RESOURCE_ERROR = 18
        XPATH_UNDEF_PREFIX_ERROR = 19
        XPATH_ENCODING_ERROR = 20
        XPATH_INVALID_CHAR_ERROR = 21
        XPATH_INVALID_CTXT = 22
        XPATH_STACK_ERROR = 23
        XPATH_FORBID_VARIABLE_ERROR = 24
    }
    

    Structure xmlXPathFunct

    Structure xmlXPathFunct
    struct _xmlXPathFunct { const xmlChar * name : the function name xmlXPathEvalFunc func : the evaluation function }

    Structure xmlXPathObject

    Structure xmlXPathObject
    struct _xmlXPathObject { xmlXPathObjectType type xmlNodeSetPtr nodesetval int boolval double floatval xmlChar * stringval void * user int index void * user2 int index2 }

    Enum xmlXPathObjectType

    Enum xmlXPathObjectType {
        XPATH_UNDEFINED = 0
        XPATH_NODESET = 1
        XPATH_BOOLEAN = 2
        XPATH_NUMBER = 3
        XPATH_STRING = 4
        XPATH_POINT = 5
        XPATH_RANGE = 6
        XPATH_LOCATIONSET = 7
        XPATH_USERS = 8
        XPATH_XSLT_TREE = 9 : An XSLT value tree, non modifiable
    }
    

    Structure xmlXPathParserContext

    Structure xmlXPathParserContext
    struct _xmlXPathParserContext { const xmlChar * cur : the current char being parsed const xmlChar * base : the full expression int error : error code xmlXPathContextPtr context : the evaluation context xmlXPathObjectPtr value : the current value int valueNr : number of values stacked int valueMax : max number of values stacked xmlXPathObjectPtr * valueTab : stack of values xmlXPathCompExprPtr comp : the precompiled expression int xptr : it this an XPointer expression xmlNodePtr ancestor : used for walking preceding axis int valueFrame : used to limit Pop on the stack }

    Structure xmlXPathType

    Structure xmlXPathType
    struct _xmlXPathType { const xmlChar * name : the type name xmlXPathConvertFunc func : the conversion function }

    Structure xmlXPathVariable

    Structure xmlXPathVariable
    struct _xmlXPathVariable { const xmlChar * name : the variable name xmlXPathObjectPtr value : the value }

    Function type: xmlXPathAxisFunc

    Function type: xmlXPathAxisFunc
    xmlXPathObjectPtr	xmlXPathAxisFunc	(xmlXPathParserContextPtr ctxt, 
    xmlXPathObjectPtr cur)

    An axis traversal function. To traverse an axis, the engine calls the first time with cur == NULL and repeat until the function returns NULL indicating the end of the axis traversal.

    ctxt:the XPath interpreter context
    cur:the previous node being explored on that axis
    Returns:the next node in that axis or NULL if at the end of the axis.

    Function: xmlXPathCastBooleanToNumber

    double	xmlXPathCastBooleanToNumber	(int val)

    Converts a boolean to its number value

    val:a boolean
    Returns:the number value

    Function: xmlXPathCastBooleanToString

    xmlChar *	xmlXPathCastBooleanToString	(int val)

    Converts a boolean to its string value.

    val:a boolean
    Returns:a newly allocated string.

    Function: xmlXPathCastNodeSetToBoolean

    int	xmlXPathCastNodeSetToBoolean	(xmlNodeSetPtr ns)

    Converts a node-set to its boolean value

    ns:a node-set
    Returns:the boolean value

    Function: xmlXPathCastNodeSetToNumber

    double	xmlXPathCastNodeSetToNumber	(xmlNodeSetPtr ns)

    Converts a node-set to its number value

    ns:a node-set
    Returns:the number value

    Function: xmlXPathCastNodeSetToString

    xmlChar *	xmlXPathCastNodeSetToString	(xmlNodeSetPtr ns)

    Converts a node-set to its string value.

    ns:a node-set
    Returns:a newly allocated string.

    Function: xmlXPathCastNodeToNumber

    double	xmlXPathCastNodeToNumber	(xmlNodePtr node)

    Converts a node to its number value

    node:a node
    Returns:the number value

    Function: xmlXPathCastNodeToString

    xmlChar *	xmlXPathCastNodeToString	(xmlNodePtr node)

    Converts a node to its string value.

    node:a node
    Returns:a newly allocated string.

    Function: xmlXPathCastNumberToBoolean

    int	xmlXPathCastNumberToBoolean	(double val)

    Converts a number to its boolean value

    val:a number
    Returns:the boolean value

    Function: xmlXPathCastNumberToString

    xmlChar *	xmlXPathCastNumberToString	(double val)

    Converts a number to its string value.

    val:a number
    Returns:a newly allocated string.

    Function: xmlXPathCastStringToBoolean

    int	xmlXPathCastStringToBoolean	(const xmlChar * val)

    Converts a string to its boolean value

    val:a string
    Returns:the boolean value

    Function: xmlXPathCastStringToNumber

    double	xmlXPathCastStringToNumber	(const xmlChar * val)

    Converts a string to its number value

    val:a string
    Returns:the number value

    Function: xmlXPathCastToBoolean

    int	xmlXPathCastToBoolean		(xmlXPathObjectPtr val)

    Converts an XPath object to its boolean value

    val:an XPath object
    Returns:the boolean value

    Function: xmlXPathCastToNumber

    double	xmlXPathCastToNumber		(xmlXPathObjectPtr val)

    Converts an XPath object to its number value

    val:an XPath object
    Returns:the number value

    Function: xmlXPathCastToString

    xmlChar *	xmlXPathCastToString	(xmlXPathObjectPtr val)

    Converts an existing object to its string() equivalent

    val:an XPath object
    Returns:the allocated string value of the object, NULL in case of error. It's up to the caller to free the string memory with xmlFree().

    Function: xmlXPathCmpNodes

    int	xmlXPathCmpNodes		(xmlNodePtr node1, 
    xmlNodePtr node2)

    Compare two nodes w.r.t document order

    node1:the first node
    node2:the second node
    Returns:-2 in case of error 1 if first point < second point, 0 if it's the same node, -1 otherwise

    Function: xmlXPathCompile

    xmlXPathCompExprPtr	xmlXPathCompile	(const xmlChar * str)

    Compile an XPath expression

    str:the XPath expression
    Returns:the xmlXPathCompExprPtr resulting from the compilation or NULL. the caller has to free the object.

    Function: xmlXPathCompiledEval

    xmlXPathObjectPtr	xmlXPathCompiledEval	(xmlXPathCompExprPtr comp, 
    xmlXPathContextPtr ctx)

    Evaluate the Precompiled XPath expression in the given context.

    comp:the compiled XPath expression
    ctx:the XPath context
    Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

    Function: xmlXPathCompiledEvalToBoolean

    int	xmlXPathCompiledEvalToBoolean	(xmlXPathCompExprPtr comp, 
    xmlXPathContextPtr ctxt)

    Applies the XPath boolean() function on the result of the given compiled expression.

    comp:the compiled XPath expression
    ctxt:the XPath context
    Returns:1 if the expression evaluated to true, 0 if to false and -1 in API and internal errors.

    Function: xmlXPathContextSetCache

    int	xmlXPathContextSetCache		(xmlXPathContextPtr ctxt, 
    int active,
    int value,
    int options)

    Creates/frees an object cache on the XPath context. If activates XPath objects (xmlXPathObject) will be cached internally to be reused. @options: 0: This will set the XPath object caching: @value: This will set the maximum number of XPath objects to be cached per slot There are 5 slots for: node-set, string, number, boolean, and misc objects. Use <0 for the default number (100). Other values for @options have currently no effect.

    ctxt:the XPath context
    active:enables/disables (creates/frees) the cache
    value:a value with semantics dependant on @options
    options:options (currently only the value 0 is used)
    Returns:0 if the setting succeeded, and -1 on API or internal errors.

    Function: xmlXPathConvertBoolean

    xmlXPathObjectPtr	xmlXPathConvertBoolean	(xmlXPathObjectPtr val)

    Converts an existing object to its boolean() equivalent

    val:an XPath object
    Returns:the new object, the old one is freed (or the operation is done directly on @val)

    Function type: xmlXPathConvertFunc

    Function type: xmlXPathConvertFunc
    int	xmlXPathConvertFunc		(xmlXPathObjectPtr obj, 
    int type)

    A conversion function is associated to a type and used to cast the new type to primitive values.

    obj:an XPath object
    type:the number of the target type
    Returns:-1 in case of error, 0 otherwise

    Function: xmlXPathConvertNumber

    xmlXPathObjectPtr	xmlXPathConvertNumber	(xmlXPathObjectPtr val)

    Converts an existing object to its number() equivalent

    val:an XPath object
    Returns:the new object, the old one is freed (or the operation is done directly on @val)

    Function: xmlXPathConvertString

    xmlXPathObjectPtr	xmlXPathConvertString	(xmlXPathObjectPtr val)

    Converts an existing object to its string() equivalent

    val:an XPath object
    Returns:the new object, the old one is freed (or the operation is done directly on @val)

    Function: xmlXPathCtxtCompile

    xmlXPathCompExprPtr	xmlXPathCtxtCompile	(xmlXPathContextPtr ctxt, 
    const xmlChar * str)

    Compile an XPath expression

    ctxt:an XPath context
    str:the XPath expression
    Returns:the xmlXPathCompExprPtr resulting from the compilation or NULL. the caller has to free the object.

    Function: xmlXPathEval

    xmlXPathObjectPtr	xmlXPathEval	(const xmlChar * str, 
    xmlXPathContextPtr ctx)

    Evaluate the XPath Location Path in the given context.

    str:the XPath expression
    ctx:the XPath context
    Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

    Function: xmlXPathEvalExpression

    xmlXPathObjectPtr	xmlXPathEvalExpression	(const xmlChar * str, 
    xmlXPathContextPtr ctxt)

    Evaluate the XPath expression in the given context.

    str:the XPath expression
    ctxt:the XPath context
    Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

    Function type: xmlXPathEvalFunc

    Function type: xmlXPathEvalFunc
    void	xmlXPathEvalFunc		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    An XPath evaluation function, the parameters are on the XPath context stack.

    ctxt:an XPath parser context
    nargs:the number of arguments passed to the function

    Function: xmlXPathEvalPredicate

    int	xmlXPathEvalPredicate		(xmlXPathContextPtr ctxt, 
    xmlXPathObjectPtr res)

    Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function.

    ctxt:the XPath context
    res:the Predicate Expression evaluation result
    Returns:1 if predicate is true, 0 otherwise

    Function: xmlXPathFreeCompExpr

    void	xmlXPathFreeCompExpr		(xmlXPathCompExprPtr comp)

    Free up the memory allocated by @comp

    comp:an XPATH comp

    Function: xmlXPathFreeContext

    void	xmlXPathFreeContext		(xmlXPathContextPtr ctxt)

    Free up an xmlXPathContext

    ctxt:the context to free

    Function: xmlXPathFreeNodeSet

    void	xmlXPathFreeNodeSet		(xmlNodeSetPtr obj)

    Free the NodeSet compound (not the actual nodes !).

    obj:the xmlNodeSetPtr to free

    Function: xmlXPathFreeNodeSetList

    void	xmlXPathFreeNodeSetList		(xmlXPathObjectPtr obj)

    Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in the list contrary to xmlXPathFreeObject().

    obj:an existing NodeSetList object

    Function: xmlXPathFreeObject

    void	xmlXPathFreeObject		(xmlXPathObjectPtr obj)

    Free up an xmlXPathObjectPtr object.

    obj:the object to free

    Function type: xmlXPathFuncLookupFunc

    Function type: xmlXPathFuncLookupFunc
    xmlXPathFunction	xmlXPathFuncLookupFunc	(void * ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)

    Prototype for callbacks used to plug function lookup in the XPath engine.

    ctxt:an XPath context
    name:name of the function
    ns_uri:the namespace name hosting this function
    Returns:the XPath function or NULL if not found.

    Function type: xmlXPathFunction

    Function type: xmlXPathFunction
    void	xmlXPathFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    An XPath function. The arguments (if any) are popped out from the context stack and the result is pushed on the stack.

    ctxt:the XPath interprestation context
    nargs:the number of arguments

    Function: xmlXPathInit

    void	xmlXPathInit			(void)

    Initialize the XPath environment

    Function: xmlXPathIsInf

    int	xmlXPathIsInf			(double val)

    Provides a portable isinf() function to detect whether a double is a +Infinite or -Infinite. Based on trio code http://sourceforge.net/projects/ctrio/

    val:a double value
    Returns:1 vi the value is +Infinite, -1 if -Infinite, 0 otherwise

    Function: xmlXPathIsNaN

    int	xmlXPathIsNaN			(double val)

    Provides a portable isnan() function to detect whether a double is a NotaNumber. Based on trio code http://sourceforge.net/projects/ctrio/

    val:a double value
    Returns:1 if the value is a NaN, 0 otherwise

    Function: xmlXPathNewContext

    xmlXPathContextPtr	xmlXPathNewContext	(xmlDocPtr doc)

    Create a new xmlXPathContext

    doc:the XML document
    Returns:the xmlXPathContext just allocated. The caller will need to free it.

    Function: xmlXPathNodeEval

    xmlXPathObjectPtr	xmlXPathNodeEval	(xmlNodePtr node, 
    const xmlChar * str,
    xmlXPathContextPtr ctx)

    Evaluate the XPath Location Path in the given context. The node 'node' is set as the context node. The context node is not restored.

    node:the node to to use as the context node
    str:the XPath expression
    ctx:the XPath context
    Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

    Function: xmlXPathNodeSetCreate

    xmlNodeSetPtr	xmlXPathNodeSetCreate	(xmlNodePtr val)

    Create a new xmlNodeSetPtr of type double and of value @val

    val:an initial xmlNodePtr, or NULL
    Returns:the newly created object.

    Function: xmlXPathObjectCopy

    xmlXPathObjectPtr	xmlXPathObjectCopy	(xmlXPathObjectPtr val)

    allocate a new copy of a given object

    val:the original object
    Returns:the newly created object.

    Function: xmlXPathOrderDocElems

    long	xmlXPathOrderDocElems		(xmlDocPtr doc)

    Call this routine to speed up XPath computation on static documents. This stamps all the element nodes with the document order Like for line information, the order is kept in the element->content field, the value stored is actually - the node number (starting at -1) to be able to differentiate from line numbers.

    doc:an input document
    Returns:the number of elements found in the document or -1 in case of error.

    Function: xmlXPathSetContextNode

    int	xmlXPathSetContextNode		(xmlNodePtr node, 
    xmlXPathContextPtr ctx)

    Sets 'node' as the context node. The node must be in the same document as that associated with the context.

    node:the node to to use as the context node
    ctx:the XPath context
    Returns:-1 in case of error or 0 if successful

    Function type: xmlXPathVariableLookupFunc

    Function type: xmlXPathVariableLookupFunc
    xmlXPathObjectPtr	xmlXPathVariableLookupFunc	(void * ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)

    Prototype for callbacks used to plug variable lookup in the XPath engine.

    ctxt:an XPath context
    name:name of the variable
    ns_uri:the namespace name hosting this variable
    Returns:the XPath object value or NULL if not found.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlregexp.html0000644000175000017500000013133012134171043020450 0ustar aronaron Module xmlregexp from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlregexp from libxml2

    API Menu
    API Indexes
    Related links

    basic API for libxml regular expressions handling used for XML Schemas and validation.

    Table of Contents

    Structure xmlExpCtxt
    struct _xmlExpCtxt The content of this structure is not made public by the API.
    Typedef xmlExpCtxt * xmlExpCtxtPtr
    
    Structure xmlExpNode
    struct _xmlExpNode The content of this structure is not made public by the API.
    Typedef xmlExpNode * xmlExpNodePtr
    
    Enum xmlExpNodeType
    
    Structure xmlRegExecCtxt
    struct _xmlRegExecCtxt The content of this structure is not made public by the API.
    Typedef xmlRegExecCtxt * xmlRegExecCtxtPtr
    
    Structure xmlRegexp
    struct _xmlRegexp The content of this structure is not made public by the API.
    Typedef xmlRegexp * xmlRegexpPtr
    
    int	xmlExpCtxtNbCons		(xmlExpCtxtPtr ctxt)
    int	xmlExpCtxtNbNodes		(xmlExpCtxtPtr ctxt)
    void	xmlExpDump			(xmlBufferPtr buf, 
    xmlExpNodePtr expr)
    xmlExpNodePtr	xmlExpExpDerive		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    xmlExpNodePtr sub)
    void	xmlExpFree			(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp)
    void	xmlExpFreeCtxt			(xmlExpCtxtPtr ctxt)
    int	xmlExpGetLanguage		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    const xmlChar ** langList,
    int len)
    int	xmlExpGetStart			(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    const xmlChar ** tokList,
    int len)
    int	xmlExpIsNillable		(xmlExpNodePtr exp)
    int	xmlExpMaxToken			(xmlExpNodePtr expr)
    xmlExpNodePtr	xmlExpNewAtom		(xmlExpCtxtPtr ctxt, 
    const xmlChar * name,
    int len)
    xmlExpCtxtPtr	xmlExpNewCtxt		(int maxNodes, 
    xmlDictPtr dict)
    xmlExpNodePtr	xmlExpNewOr		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr left,
    xmlExpNodePtr right)
    xmlExpNodePtr	xmlExpNewRange		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr subset,
    int min,
    int max)
    xmlExpNodePtr	xmlExpNewSeq		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr left,
    xmlExpNodePtr right)
    xmlExpNodePtr	xmlExpParse		(xmlExpCtxtPtr ctxt, 
    const char * expr)
    void	xmlExpRef			(xmlExpNodePtr exp)
    xmlExpNodePtr	xmlExpStringDerive	(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    const xmlChar * str,
    int len)
    int	xmlExpSubsume			(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    xmlExpNodePtr sub)
    Function type: xmlRegExecCallbacks
    void	xmlRegExecCallbacks		(xmlRegExecCtxtPtr exec, 
    const xmlChar * token,
    void * transdata,
    void * inputdata)
    int	xmlRegExecErrInfo		(xmlRegExecCtxtPtr exec, 
    const xmlChar ** string,
    int * nbval,
    int * nbneg,
    xmlChar ** values,
    int * terminal)
    int	xmlRegExecNextValues		(xmlRegExecCtxtPtr exec, 
    int * nbval,
    int * nbneg,
    xmlChar ** values,
    int * terminal)
    int	xmlRegExecPushString		(xmlRegExecCtxtPtr exec, 
    const xmlChar * value,
    void * data)
    int	xmlRegExecPushString2		(xmlRegExecCtxtPtr exec, 
    const xmlChar * value,
    const xmlChar * value2,
    void * data)
    void	xmlRegFreeExecCtxt		(xmlRegExecCtxtPtr exec)
    void	xmlRegFreeRegexp		(xmlRegexpPtr regexp)
    xmlRegExecCtxtPtr	xmlRegNewExecCtxt	(xmlRegexpPtr comp, 
    xmlRegExecCallbacks callback,
    void * data)
    xmlRegexpPtr	xmlRegexpCompile	(const xmlChar * regexp)
    int	xmlRegexpExec			(xmlRegexpPtr comp, 
    const xmlChar * content)
    int	xmlRegexpIsDeterminist		(xmlRegexpPtr comp)
    void	xmlRegexpPrint			(FILE * output, 
    xmlRegexpPtr regexp)

    Description

    Structure xmlExpCtxt

    Structure xmlExpCtxt
    struct _xmlExpCtxt { The content of this structure is not made public by the API. }

    Structure xmlExpNode

    Structure xmlExpNode
    struct _xmlExpNode { The content of this structure is not made public by the API. }

    Enum xmlExpNodeType

    Enum xmlExpNodeType {
        XML_EXP_EMPTY = 0
        XML_EXP_FORBID = 1
        XML_EXP_ATOM = 2
        XML_EXP_SEQ = 3
        XML_EXP_OR = 4
        XML_EXP_COUNT = 5
    }
    

    Structure xmlRegExecCtxt

    Structure xmlRegExecCtxt
    struct _xmlRegExecCtxt { The content of this structure is not made public by the API. }
    A libxml progressive regular expression evaluation context

    Structure xmlRegexp

    Structure xmlRegexp
    struct _xmlRegexp { The content of this structure is not made public by the API. }
    A libxml regular expression, they can actually be far more complex thank the POSIX regex expressions.

    Function: xmlExpCtxtNbCons

    int	xmlExpCtxtNbCons		(xmlExpCtxtPtr ctxt)

    Debugging facility provides the number of allocated nodes over lifetime

    ctxt:an expression context
    Returns:the number of nodes ever allocated or -1 in case of error

    Function: xmlExpCtxtNbNodes

    int	xmlExpCtxtNbNodes		(xmlExpCtxtPtr ctxt)

    Debugging facility provides the number of allocated nodes at a that point

    ctxt:an expression context
    Returns:the number of nodes in use or -1 in case of error

    Function: xmlExpDump

    void	xmlExpDump			(xmlBufferPtr buf, 
    xmlExpNodePtr expr)

    Serialize the expression as compiled to the buffer

    buf:a buffer to receive the output
    expr:the compiled expression

    Function: xmlExpExpDerive

    xmlExpNodePtr	xmlExpExpDerive		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    xmlExpNodePtr sub)

    Evaluates the expression resulting from @exp consuming a sub expression @sub Based on algebraic derivation and sometimes direct Brzozowski derivation it usually tatkes less than linear time and can handle expressions generating infinite languages.

    ctxt:the expressions context
    exp:the englobing expression
    sub:the subexpression
    Returns:the resulting expression or NULL in case of internal error, the result must be freed

    Function: xmlExpFree

    void	xmlExpFree			(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp)

    Dereference the expression

    ctxt:the expression context
    exp:the expression

    Function: xmlExpFreeCtxt

    void	xmlExpFreeCtxt			(xmlExpCtxtPtr ctxt)

    Free an expression context

    ctxt:an expression context

    Function: xmlExpGetLanguage

    int	xmlExpGetLanguage		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    const xmlChar ** langList,
    int len)

    Find all the strings used in @exp and store them in @list

    ctxt:the expression context
    exp:the expression
    langList:where to store the tokens
    len:the allocated length of @list
    Returns:the number of unique strings found, -1 in case of errors and -2 if there is more than @len strings

    Function: xmlExpGetStart

    int	xmlExpGetStart			(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    const xmlChar ** tokList,
    int len)

    Find all the strings that appears at the start of the languages accepted by @exp and store them in @list. E.g. for (a, b) | c it will return the list [a, c]

    ctxt:the expression context
    exp:the expression
    tokList:where to store the tokens
    len:the allocated length of @list
    Returns:the number of unique strings found, -1 in case of errors and -2 if there is more than @len strings

    Function: xmlExpIsNillable

    int	xmlExpIsNillable		(xmlExpNodePtr exp)

    Finds if the expression is nillable, i.e. if it accepts the empty sequqnce

    exp:the expression
    Returns:1 if nillable, 0 if not and -1 in case of error

    Function: xmlExpMaxToken

    int	xmlExpMaxToken			(xmlExpNodePtr expr)

    Indicate the maximum number of input a expression can accept

    expr:a compiled expression
    Returns:the maximum length or -1 in case of error

    Function: xmlExpNewAtom

    xmlExpNodePtr	xmlExpNewAtom		(xmlExpCtxtPtr ctxt, 
    const xmlChar * name,
    int len)

    Get the atom associated to this name from that context

    ctxt:the expression context
    name:the atom name
    len:the atom name length in byte (or -1);
    Returns:the node or NULL in case of error

    Function: xmlExpNewCtxt

    xmlExpCtxtPtr	xmlExpNewCtxt		(int maxNodes, 
    xmlDictPtr dict)

    Creates a new context for manipulating expressions

    maxNodes:the maximum number of nodes
    dict:optional dictionnary to use internally
    Returns:the context or NULL in case of error

    Function: xmlExpNewOr

    xmlExpNodePtr	xmlExpNewOr		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr left,
    xmlExpNodePtr right)

    Get the atom associated to the choice @left | @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL).

    ctxt:the expression context
    left:left expression
    right:right expression
    Returns:the node or NULL in case of error

    Function: xmlExpNewRange

    xmlExpNodePtr	xmlExpNewRange		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr subset,
    int min,
    int max)

    Get the atom associated to the range (@subset){@min, @max} Note that @subset is consumed in the operation, to keep an handle on it use xmlExpRef() and use xmlExpFree() to release it, this is true even in case of failure (unless ctxt == NULL).

    ctxt:the expression context
    subset:the expression to be repeated
    min:the lower bound for the repetition
    max:the upper bound for the repetition, -1 means infinite
    Returns:the node or NULL in case of error

    Function: xmlExpNewSeq

    xmlExpNodePtr	xmlExpNewSeq		(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr left,
    xmlExpNodePtr right)

    Get the atom associated to the sequence @left , @right Note that @left and @right are consumed in the operation, to keep an handle on them use xmlExpRef() and use xmlExpFree() to release them, this is true even in case of failure (unless ctxt == NULL).

    ctxt:the expression context
    left:left expression
    right:right expression
    Returns:the node or NULL in case of error

    Function: xmlExpParse

    xmlExpNodePtr	xmlExpParse		(xmlExpCtxtPtr ctxt, 
    const char * expr)

    Minimal parser for regexps, it understand the following constructs - string terminals - choice operator | - sequence operator , - subexpressions (...) - usual cardinality operators + * and ? - finite sequences { min, max } - infinite sequences { min, * } There is minimal checkings made especially no checking on strings values

    ctxt:the expressions context
    expr:the 0 terminated string
    Returns:a new expression or NULL in case of failure

    Function: xmlExpRef

    void	xmlExpRef			(xmlExpNodePtr exp)

    Increase the reference count of the expression

    exp:the expression

    Function: xmlExpStringDerive

    xmlExpNodePtr	xmlExpStringDerive	(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    const xmlChar * str,
    int len)

    Do one step of Brzozowski derivation of the expression @exp with respect to the input string

    ctxt:the expression context
    exp:the expression
    str:the string
    len:the string len in bytes if available
    Returns:the resulting expression or NULL in case of internal error

    Function: xmlExpSubsume

    int	xmlExpSubsume			(xmlExpCtxtPtr ctxt, 
    xmlExpNodePtr exp,
    xmlExpNodePtr sub)

    Check whether @exp accepts all the languages accexpted by @sub the input being a subexpression.

    ctxt:the expressions context
    exp:the englobing expression
    sub:the subexpression
    Returns:1 if true 0 if false and -1 in case of failure.

    Function type: xmlRegExecCallbacks

    Function type: xmlRegExecCallbacks
    void	xmlRegExecCallbacks		(xmlRegExecCtxtPtr exec, 
    const xmlChar * token,
    void * transdata,
    void * inputdata)

    Callback function when doing a transition in the automata

    exec:the regular expression context
    token:the current token string
    transdata:transition data
    inputdata:input data

    Function: xmlRegExecErrInfo

    int	xmlRegExecErrInfo		(xmlRegExecCtxtPtr exec, 
    const xmlChar ** string,
    int * nbval,
    int * nbneg,
    xmlChar ** values,
    int * terminal)

    Extract error informations from the regexp execution, the parameter @string will be updated with the value pushed and not accepted, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values

    exec:a regexp execution context generating an error
    string:return value for the error string
    nbval:pointer to the number of accepted values IN/OUT
    nbneg:return number of negative transitions
    values:pointer to the array of acceptable values
    terminal:return value if this was a terminal state
    Returns:will be freed with the @exec context and don't need to be deallocated. Returns: 0 in case of success or -1 in case of error.

    Function: xmlRegExecNextValues

    int	xmlRegExecNextValues		(xmlRegExecCtxtPtr exec, 
    int * nbval,
    int * nbneg,
    xmlChar ** values,
    int * terminal)

    Extract informations from the regexp execution, the parameter @values must point to an array of @nbval string pointers on return nbval will contain the number of possible strings in that state and the @values array will be updated with them. The string values

    exec:a regexp execution context
    nbval:pointer to the number of accepted values IN/OUT
    nbneg:return number of negative transitions
    values:pointer to the array of acceptable values
    terminal:return value if this was a terminal state
    Returns:will be freed with the @exec context and don't need to be deallocated. Returns: 0 in case of success or -1 in case of error.

    Function: xmlRegExecPushString

    int	xmlRegExecPushString		(xmlRegExecCtxtPtr exec, 
    const xmlChar * value,
    void * data)

    Push one input token in the execution context

    exec:a regexp execution context or NULL to indicate the end
    value:a string token input
    data:data associated to the token to reuse in callbacks
    Returns:1 if the regexp reached a final state, 0 if non-final, and a negative value in case of error.

    Function: xmlRegExecPushString2

    int	xmlRegExecPushString2		(xmlRegExecCtxtPtr exec, 
    const xmlChar * value,
    const xmlChar * value2,
    void * data)

    Push one input token in the execution context

    exec:a regexp execution context or NULL to indicate the end
    value:the first string token input
    value2:the second string token input
    data:data associated to the token to reuse in callbacks
    Returns:1 if the regexp reached a final state, 0 if non-final, and a negative value in case of error.

    Function: xmlRegFreeExecCtxt

    void	xmlRegFreeExecCtxt		(xmlRegExecCtxtPtr exec)

    Free the structures associated to a regular expression evaulation context.

    exec:a regular expression evaulation context

    Function: xmlRegFreeRegexp

    void	xmlRegFreeRegexp		(xmlRegexpPtr regexp)

    Free a regexp

    regexp:the regexp

    Function: xmlRegNewExecCtxt

    xmlRegExecCtxtPtr	xmlRegNewExecCtxt	(xmlRegexpPtr comp, 
    xmlRegExecCallbacks callback,
    void * data)

    Build a context used for progressive evaluation of a regexp.

    comp:a precompiled regular expression
    callback:a callback function used for handling progresses in the automata matching phase
    data:the context data associated to the callback in this context
    Returns:the new context

    Function: xmlRegexpCompile

    xmlRegexpPtr	xmlRegexpCompile	(const xmlChar * regexp)

    Parses a regular expression conforming to XML Schemas Part 2 Datatype Appendix F and builds an automata suitable for testing strings against that regular expression

    regexp:a regular expression string
    Returns:the compiled expression or NULL in case of error

    Function: xmlRegexpExec

    int	xmlRegexpExec			(xmlRegexpPtr comp, 
    const xmlChar * content)

    Check if the regular expression generates the value

    comp:the compiled regular expression
    content:the value to check against the regular expression
    Returns:1 if it matches, 0 if not and a negative value in case of error

    Function: xmlRegexpIsDeterminist

    int	xmlRegexpIsDeterminist		(xmlRegexpPtr comp)

    Check if the regular expression is determinist

    comp:the compiled regular expression
    Returns:1 if it yes, 0 if not and a negative value in case of error

    Function: xmlRegexpPrint

    void	xmlRegexpPrint			(FILE * output, 
    xmlRegexpPtr regexp)

    Print the content of the compiled regular expression

    output:the file for the output debug
    regexp:the compiled regexp

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlmodule.html0000644000175000017500000002667512134171042020461 0ustar aronaron Module xmlmodule from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlmodule from libxml2

    API Menu
    API Indexes
    Related links

    basic API for dynamic module loading, used by libexslt added in 2.6.17

    Table of Contents

    Structure xmlModule
    struct _xmlModule The content of this structure is not made public by the API.
    Enum xmlModuleOption
    
    Typedef xmlModule * xmlModulePtr
    
    int	xmlModuleClose			(xmlModulePtr module)
    int	xmlModuleFree			(xmlModulePtr module)
    xmlModulePtr	xmlModuleOpen		(const char * name, 
    int options)
    int	xmlModuleSymbol			(xmlModulePtr module, 
    const char * name,
    void ** symbol)

    Description

    Structure xmlModule

    Structure xmlModule
    struct _xmlModule { The content of this structure is not made public by the API. }

    Enum xmlModuleOption

    Enum xmlModuleOption {
        XML_MODULE_LAZY = 1 : lazy binding
        XML_MODULE_LOCAL = 2 : local binding
    }
    
    A handle to a dynamically loaded module

    Function: xmlModuleClose

    int	xmlModuleClose			(xmlModulePtr module)

    The close operations unload the associated module and free the data associated to the module.

    module:the module handle
    Returns:0 in case of success, -1 in case of argument error and -2 if the module could not be closed/unloaded.

    Function: xmlModuleFree

    int	xmlModuleFree			(xmlModulePtr module)

    The free operations free the data associated to the module but does not unload the associated shared library which may still be in use.

    module:the module handle
    Returns:0 in case of success, -1 in case of argument error

    Function: xmlModuleOpen

    xmlModulePtr	xmlModuleOpen		(const char * name, 
    int options)

    Opens a module/shared library given its name or path NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We canot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const xmlChar * . TODO: options are not yet implemented.

    name:the module name
    options:a set of xmlModuleOption
    Returns:a handle for the module or NULL in case of error

    Function: xmlModuleSymbol

    int	xmlModuleSymbol			(xmlModulePtr module, 
    const char * name,
    void ** symbol)

    Lookup for a symbol address in the given module NOTE: that due to portability issues, behaviour can only be guaranteed with @name using ASCII. We canot guarantee that an UTF-8 string would work, which is why name is a const char * and not a const xmlChar * .

    module:the module
    name:the name of the symbol
    symbol:the resulting symbol address
    Returns:0 if the symbol was found, or -1 in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xinclude.html0000644000175000017500000004637012134171042020260 0ustar aronaron Module xinclude from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xinclude from libxml2

    API Menu
    API Indexes
    Related links

    API to handle XInclude processing, implements the World Wide Web Consortium Last Call Working Draft 10 November 2003

    Table of Contents

    #define XINCLUDE_FALLBACK
    #define XINCLUDE_HREF
    #define XINCLUDE_NODE
    #define XINCLUDE_NS
    #define XINCLUDE_OLD_NS
    #define XINCLUDE_PARSE
    #define XINCLUDE_PARSE_ENCODING
    #define XINCLUDE_PARSE_TEXT
    #define XINCLUDE_PARSE_XML
    #define XINCLUDE_PARSE_XPOINTER
    Structure xmlXIncludeCtxt
    struct _xmlXIncludeCtxt The content of this structure is not made public by the API.
    Typedef xmlXIncludeCtxt * xmlXIncludeCtxtPtr
    
    void	xmlXIncludeFreeContext		(xmlXIncludeCtxtPtr ctxt)
    xmlXIncludeCtxtPtr	xmlXIncludeNewContext	(xmlDocPtr doc)
    int	xmlXIncludeProcess		(xmlDocPtr doc)
    int	xmlXIncludeProcessFlags		(xmlDocPtr doc, 
    int flags)
    int	xmlXIncludeProcessFlagsData	(xmlDocPtr doc, 
    int flags,
    void * data)
    int	xmlXIncludeProcessNode		(xmlXIncludeCtxtPtr ctxt, 
    xmlNodePtr node)
    int	xmlXIncludeProcessTree		(xmlNodePtr tree)
    int	xmlXIncludeProcessTreeFlags	(xmlNodePtr tree, 
    int flags)
    int	xmlXIncludeProcessTreeFlagsData	(xmlNodePtr tree, 
    int flags,
    void * data)
    int	xmlXIncludeSetFlags		(xmlXIncludeCtxtPtr ctxt, 
    int flags)

    Description

    Macro: XINCLUDE_FALLBACK

    #define XINCLUDE_FALLBACK

    Macro defining "fallback"

    Macro: XINCLUDE_HREF

    #define XINCLUDE_HREF

    Macro defining "href"

    Macro: XINCLUDE_NODE

    #define XINCLUDE_NODE

    Macro defining "include"

    Macro: XINCLUDE_NS

    #define XINCLUDE_NS

    Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude

    Macro: XINCLUDE_OLD_NS

    #define XINCLUDE_OLD_NS

    Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude

    Macro: XINCLUDE_PARSE

    #define XINCLUDE_PARSE

    Macro defining "parse"

    Macro: XINCLUDE_PARSE_ENCODING

    #define XINCLUDE_PARSE_ENCODING

    Macro defining "encoding"

    Macro: XINCLUDE_PARSE_TEXT

    #define XINCLUDE_PARSE_TEXT

    Macro defining "text"

    Macro: XINCLUDE_PARSE_XML

    #define XINCLUDE_PARSE_XML

    Macro defining "xml"

    Macro: XINCLUDE_PARSE_XPOINTER

    #define XINCLUDE_PARSE_XPOINTER

    Macro defining "xpointer"

    Structure xmlXIncludeCtxt

    Structure xmlXIncludeCtxt
    struct _xmlXIncludeCtxt { The content of this structure is not made public by the API. }

    Function: xmlXIncludeFreeContext

    void	xmlXIncludeFreeContext		(xmlXIncludeCtxtPtr ctxt)

    Free an XInclude context

    ctxt:the XInclude context

    Function: xmlXIncludeNewContext

    xmlXIncludeCtxtPtr	xmlXIncludeNewContext	(xmlDocPtr doc)

    Creates a new XInclude context

    doc:an XML Document
    Returns:the new set

    Function: xmlXIncludeProcess

    int	xmlXIncludeProcess		(xmlDocPtr doc)

    Implement the XInclude substitution on the XML document @doc

    doc:an XML document
    Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

    Function: xmlXIncludeProcessFlags

    int	xmlXIncludeProcessFlags		(xmlDocPtr doc, 
    int flags)

    Implement the XInclude substitution on the XML document @doc

    doc:an XML document
    flags:a set of xmlParserOption used for parsing XML includes
    Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

    Function: xmlXIncludeProcessFlagsData

    int	xmlXIncludeProcessFlagsData	(xmlDocPtr doc, 
    int flags,
    void * data)

    Implement the XInclude substitution on the XML document @doc

    doc:an XML document
    flags:a set of xmlParserOption used for parsing XML includes
    data:application data that will be passed to the parser context in the _private field of the parser context(s)
    Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

    Function: xmlXIncludeProcessNode

    int	xmlXIncludeProcessNode		(xmlXIncludeCtxtPtr ctxt, 
    xmlNodePtr node)

    Implement the XInclude substitution for the given subtree reusing the informations and data coming from the given context.

    ctxt:an existing XInclude context
    node:a node in an XML document
    Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

    Function: xmlXIncludeProcessTree

    int	xmlXIncludeProcessTree		(xmlNodePtr tree)

    Implement the XInclude substitution for the given subtree

    tree:a node in an XML document
    Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

    Function: xmlXIncludeProcessTreeFlags

    int	xmlXIncludeProcessTreeFlags	(xmlNodePtr tree, 
    int flags)

    Implement the XInclude substitution for the given subtree

    tree:a node in an XML document
    flags:a set of xmlParserOption used for parsing XML includes
    Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

    Function: xmlXIncludeProcessTreeFlagsData

    int	xmlXIncludeProcessTreeFlagsData	(xmlNodePtr tree, 
    int flags,
    void * data)

    Implement the XInclude substitution on the XML node @tree

    tree:an XML node
    flags:a set of xmlParserOption used for parsing XML includes
    data:application data that will be passed to the parser context in the _private field of the parser context(s)
    Returns:0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

    Function: xmlXIncludeSetFlags

    int	xmlXIncludeSetFlags		(xmlXIncludeCtxtPtr ctxt, 
    int flags)

    Set the flags used for further processing of XML resources.

    ctxt:an XInclude processing context
    flags:a set of xmlParserOption used for parsing XML includes
    Returns:0 in case of success and -1 in case of error.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlexports.html0000644000175000017500000001664512134171042020674 0ustar aronaron Module xmlexports from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlexports from libxml2

    API Menu
    API Indexes
    Related links

    macros for marking symbols as exportable/importable.

    Table of Contents

    #define LIBXML_DLL_IMPORT
    #define XMLCALL
    #define XMLCDECL
    #define XMLPUBFUN
    #define XMLPUBVAR
    #define _REENTRANT

    Description

    Macro: LIBXML_DLL_IMPORT

    #define LIBXML_DLL_IMPORT

    Macro: XMLCALL

    #define XMLCALL

    Macro: XMLCDECL

    #define XMLCDECL

    Macro: XMLPUBFUN

    #define XMLPUBFUN

    Macro: XMLPUBVAR

    #define XMLPUBVAR

    Macro: _REENTRANT

    #define _REENTRANT

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/home.png0000644000175000017500000000121611234335462015726 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1õÚKvIDATxœÕ•±kqÅ?ßrC‡ßàpà ~C„np¼¡CAAJ .B-\'G‡]:Ü “‚ƒCÇ -(ˆ8´à Ô€!…fD°€…çÒ“klbRÛÁoyüxïûîËïwpðIJº<°of_®-@ÒððçRH•´ÏfÖŸtèÂü¤^¯×ÓÚÚš’$Q«ÕÒ|“ôpâ’¶€gív;X^^&Ïs¢(bww—Z­F£ÑÀ9Çææ&Þû3à¶™ Æ’^IRµZUE.0Z]]Uš¦ ÃPY–Mü8óHÒGIÚÙÙÑìììæeŸkqqñÒ€™!ó  $ÛÛÛ¬¯¯3Œn eýþ{-/seeeìÔÃŒãXóóóåO‡Í·$ý8==UÇS™—é½×ÑÑQòRR€¤'ã–9-sÚÛÛ+B^ éC·Û•sîŸÍËÂ+%À°<7³ŸWô˜¿ õâ:™2IEND®B`‚libxml2-2.9.1+dfsg1/doc/html/libxml-xmlversion.html0000644000175000017500000005012312134171043020643 0ustar aronaron Module xmlversion from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlversion from libxml2

    API Menu
    API Indexes
    Related links

    compile-time version informations for the XML library

    Table of Contents

    #define ATTRIBUTE_UNUSED
    #define DEBUG_MEMORY_LOCATION
    #define LIBXML_ATTR_ALLOC_SIZE
    #define LIBXML_ATTR_FORMAT
    #define LIBXML_AUTOMATA_ENABLED
    #define LIBXML_C14N_ENABLED
    #define LIBXML_CATALOG_ENABLED
    #define LIBXML_DEBUG_ENABLED
    #define LIBXML_DEBUG_RUNTIME
    #define LIBXML_DOCB_ENABLED
    #define LIBXML_DOTTED_VERSION
    #define LIBXML_EXPR_ENABLED
    #define LIBXML_FTP_ENABLED
    #define LIBXML_HTML_ENABLED
    #define LIBXML_HTTP_ENABLED
    #define LIBXML_ICONV_ENABLED
    #define LIBXML_ICU_ENABLED
    #define LIBXML_ISO8859X_ENABLED
    #define LIBXML_LEGACY_ENABLED
    #define LIBXML_LZMA_ENABLED
    #define LIBXML_MODULES_ENABLED
    #define LIBXML_MODULE_EXTENSION
    #define LIBXML_OUTPUT_ENABLED
    #define LIBXML_PATTERN_ENABLED
    #define LIBXML_PUSH_ENABLED
    #define LIBXML_READER_ENABLED
    #define LIBXML_REGEXP_ENABLED
    #define LIBXML_SAX1_ENABLED
    #define LIBXML_SCHEMAS_ENABLED
    #define LIBXML_SCHEMATRON_ENABLED
    #define LIBXML_TEST_VERSION
    #define LIBXML_THREAD_ALLOC_ENABLED
    #define LIBXML_THREAD_ENABLED
    #define LIBXML_TREE_ENABLED
    #define LIBXML_UNICODE_ENABLED
    #define LIBXML_VALID_ENABLED
    #define LIBXML_VERSION
    #define LIBXML_VERSION_EXTRA
    #define LIBXML_VERSION_STRING
    #define LIBXML_WRITER_ENABLED
    #define LIBXML_XINCLUDE_ENABLED
    #define LIBXML_XPATH_ENABLED
    #define LIBXML_XPTR_ENABLED
    #define LIBXML_ZLIB_ENABLED
    #define WITHOUT_TRIO
    #define WITH_TRIO
    void	xmlCheckVersion			(int version)

    Description

    Macro: ATTRIBUTE_UNUSED

    #define ATTRIBUTE_UNUSED

    Macro used to signal to GCC unused function parameters

    Macro: DEBUG_MEMORY_LOCATION

    #define DEBUG_MEMORY_LOCATION

    Whether the memory debugging is configured in

    Macro: LIBXML_ATTR_ALLOC_SIZE

    #define LIBXML_ATTR_ALLOC_SIZE

    Macro used to indicate to GCC this is an allocator function

    Macro: LIBXML_ATTR_FORMAT

    #define LIBXML_ATTR_FORMAT

    Macro used to indicate to GCC the parameter are printf like

    Macro: LIBXML_AUTOMATA_ENABLED

    #define LIBXML_AUTOMATA_ENABLED

    Whether the automata interfaces are compiled in

    Macro: LIBXML_C14N_ENABLED

    #define LIBXML_C14N_ENABLED

    Whether the Canonicalization support is configured in

    Macro: LIBXML_CATALOG_ENABLED

    #define LIBXML_CATALOG_ENABLED

    Whether the Catalog support is configured in

    Macro: LIBXML_DEBUG_ENABLED

    #define LIBXML_DEBUG_ENABLED

    Whether Debugging module is configured in

    Macro: LIBXML_DEBUG_RUNTIME

    #define LIBXML_DEBUG_RUNTIME

    Whether the runtime debugging is configured in

    Macro: LIBXML_DOCB_ENABLED

    #define LIBXML_DOCB_ENABLED

    Whether the SGML Docbook support is configured in

    Macro: LIBXML_DOTTED_VERSION

    #define LIBXML_DOTTED_VERSION

    the version string like "1.2.3"

    Macro: LIBXML_EXPR_ENABLED

    #define LIBXML_EXPR_ENABLED

    Whether the formal expressions interfaces are compiled in

    Macro: LIBXML_FTP_ENABLED

    #define LIBXML_FTP_ENABLED

    Whether the FTP support is configured in

    Macro: LIBXML_HTML_ENABLED

    #define LIBXML_HTML_ENABLED

    Whether the HTML support is configured in

    Macro: LIBXML_HTTP_ENABLED

    #define LIBXML_HTTP_ENABLED

    Whether the HTTP support is configured in

    Macro: LIBXML_ICONV_ENABLED

    #define LIBXML_ICONV_ENABLED

    Whether iconv support is available

    Macro: LIBXML_ICU_ENABLED

    #define LIBXML_ICU_ENABLED

    Whether icu support is available

    Macro: LIBXML_ISO8859X_ENABLED

    #define LIBXML_ISO8859X_ENABLED

    Whether ISO-8859-* support is made available in case iconv is not

    Macro: LIBXML_LEGACY_ENABLED

    #define LIBXML_LEGACY_ENABLED

    Whether the deprecated APIs are compiled in for compatibility

    Macro: LIBXML_LZMA_ENABLED

    #define LIBXML_LZMA_ENABLED

    Whether the Lzma support is compiled in

    Macro: LIBXML_MODULES_ENABLED

    #define LIBXML_MODULES_ENABLED

    Whether the module interfaces are compiled in

    Macro: LIBXML_MODULE_EXTENSION

    #define LIBXML_MODULE_EXTENSION

    the string suffix used by dynamic modules (usually shared libraries)

    Macro: LIBXML_OUTPUT_ENABLED

    #define LIBXML_OUTPUT_ENABLED

    Whether the serialization/saving support is configured in

    Macro: LIBXML_PATTERN_ENABLED

    #define LIBXML_PATTERN_ENABLED

    Whether the xmlPattern node selection interface is configured in

    Macro: LIBXML_PUSH_ENABLED

    #define LIBXML_PUSH_ENABLED

    Whether the push parsing interfaces are configured in

    Macro: LIBXML_READER_ENABLED

    #define LIBXML_READER_ENABLED

    Whether the xmlReader parsing interface is configured in

    Macro: LIBXML_REGEXP_ENABLED

    #define LIBXML_REGEXP_ENABLED

    Whether the regular expressions interfaces are compiled in

    Macro: LIBXML_SAX1_ENABLED

    #define LIBXML_SAX1_ENABLED

    Whether the older SAX1 interface is configured in

    Macro: LIBXML_SCHEMAS_ENABLED

    #define LIBXML_SCHEMAS_ENABLED

    Whether the Schemas validation interfaces are compiled in

    Macro: LIBXML_SCHEMATRON_ENABLED

    #define LIBXML_SCHEMATRON_ENABLED

    Whether the Schematron validation interfaces are compiled in

    Macro: LIBXML_TEST_VERSION

    #define LIBXML_TEST_VERSION

    Macro to check that the libxml version in use is compatible with the version the software has been compiled against

    Macro: LIBXML_THREAD_ALLOC_ENABLED

    #define LIBXML_THREAD_ALLOC_ENABLED

    Whether the allocation hooks are per-thread

    Macro: LIBXML_THREAD_ENABLED

    #define LIBXML_THREAD_ENABLED

    Whether the thread support is configured in

    Macro: LIBXML_TREE_ENABLED

    #define LIBXML_TREE_ENABLED

    Whether the DOM like tree manipulation API support is configured in

    Macro: LIBXML_UNICODE_ENABLED

    #define LIBXML_UNICODE_ENABLED

    Whether the Unicode related interfaces are compiled in

    Macro: LIBXML_VALID_ENABLED

    #define LIBXML_VALID_ENABLED

    Whether the DTD validation support is configured in

    Macro: LIBXML_VERSION

    #define LIBXML_VERSION

    the version number: 1.2.3 value is 10203

    Macro: LIBXML_VERSION_EXTRA

    #define LIBXML_VERSION_EXTRA

    extra version information, used to show a CVS compilation

    Macro: LIBXML_VERSION_STRING

    #define LIBXML_VERSION_STRING

    the version number string, 1.2.3 value is "10203"

    Macro: LIBXML_WRITER_ENABLED

    #define LIBXML_WRITER_ENABLED

    Whether the xmlWriter saving interface is configured in

    Macro: LIBXML_XINCLUDE_ENABLED

    #define LIBXML_XINCLUDE_ENABLED

    Whether XInclude is configured in

    Macro: LIBXML_XPATH_ENABLED

    #define LIBXML_XPATH_ENABLED

    Whether XPath is configured in

    Macro: LIBXML_XPTR_ENABLED

    #define LIBXML_XPTR_ENABLED

    Whether XPointer is configured in

    Macro: LIBXML_ZLIB_ENABLED

    #define LIBXML_ZLIB_ENABLED

    Whether the Zlib support is compiled in

    Macro: WITHOUT_TRIO

    #define WITHOUT_TRIO

    defined if the trio support should not be configured in

    Macro: WITH_TRIO

    #define WITH_TRIO

    defined if the trio support need to be configured in

    Function: xmlCheckVersion

    void	xmlCheckVersion			(int version)

    check the compiled lib version against the include one. This can warn or immediately kill the application

    version:the include version number

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-pattern.html0000644000175000017500000005616712134171042020127 0ustar aronaron Module pattern from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module pattern from libxml2

    API Menu
    API Indexes
    Related links

    allows to compile and test pattern expressions for nodes either in a tree or based on a parser state.

    Table of Contents

    Structure xmlPattern
    struct _xmlPattern The content of this structure is not made public by the API.
    Enum xmlPatternFlags
    
    Typedef xmlPattern * xmlPatternPtr
    
    Structure xmlStreamCtxt
    struct _xmlStreamCtxt The content of this structure is not made public by the API.
    Typedef xmlStreamCtxt * xmlStreamCtxtPtr
    
    void	xmlFreePattern			(xmlPatternPtr comp)
    void	xmlFreePatternList		(xmlPatternPtr comp)
    void	xmlFreeStreamCtxt		(xmlStreamCtxtPtr stream)
    int	xmlPatternFromRoot		(xmlPatternPtr comp)
    xmlStreamCtxtPtr	xmlPatternGetStreamCtxt	(xmlPatternPtr comp)
    int	xmlPatternMatch			(xmlPatternPtr comp, 
    xmlNodePtr node)
    int	xmlPatternMaxDepth		(xmlPatternPtr comp)
    int	xmlPatternMinDepth		(xmlPatternPtr comp)
    int	xmlPatternStreamable		(xmlPatternPtr comp)
    xmlPatternPtr	xmlPatterncompile	(const xmlChar * pattern, 
    xmlDict * dict,
    int flags,
    const xmlChar ** namespaces)
    int	xmlStreamPop			(xmlStreamCtxtPtr stream)
    int	xmlStreamPush			(xmlStreamCtxtPtr stream, 
    const xmlChar * name,
    const xmlChar * ns)
    int	xmlStreamPushAttr		(xmlStreamCtxtPtr stream, 
    const xmlChar * name,
    const xmlChar * ns)
    int	xmlStreamPushNode		(xmlStreamCtxtPtr stream, 
    const xmlChar * name,
    const xmlChar * ns,
    int nodeType)
    int	xmlStreamWantsAnyNode		(xmlStreamCtxtPtr streamCtxt)

    Description

    Structure xmlPattern

    Structure xmlPattern
    struct _xmlPattern { The content of this structure is not made public by the API. }

    Enum xmlPatternFlags

    Enum xmlPatternFlags {
        XML_PATTERN_DEFAULT = 0 : simple pattern match
        XML_PATTERN_XPATH = 1 : standard XPath pattern
        XML_PATTERN_XSSEL = 2 : XPath subset for schema selector
        XML_PATTERN_XSFIELD = 4 : XPath subset for schema field
    }
    

    Structure xmlStreamCtxt

    Structure xmlStreamCtxt
    struct _xmlStreamCtxt { The content of this structure is not made public by the API. }

    Function: xmlFreePattern

    void	xmlFreePattern			(xmlPatternPtr comp)

    Free up the memory allocated by @comp

    comp:an XSLT comp

    Function: xmlFreePatternList

    void	xmlFreePatternList		(xmlPatternPtr comp)

    Free up the memory allocated by all the elements of @comp

    comp:an XSLT comp list

    Function: xmlFreeStreamCtxt

    void	xmlFreeStreamCtxt		(xmlStreamCtxtPtr stream)

    Free the stream context

    stream:the stream context

    Function: xmlPatternFromRoot

    int	xmlPatternFromRoot		(xmlPatternPtr comp)

    Check if the pattern must be looked at from the root.

    comp:the precompiled pattern
    Returns:1 if true, 0 if false and -1 in case of error

    Function: xmlPatternGetStreamCtxt

    xmlStreamCtxtPtr	xmlPatternGetStreamCtxt	(xmlPatternPtr comp)

    Get a streaming context for that pattern Use xmlFreeStreamCtxt to free the context.

    comp:the precompiled pattern
    Returns:a pointer to the context or NULL in case of failure

    Function: xmlPatternMatch

    int	xmlPatternMatch			(xmlPatternPtr comp, 
    xmlNodePtr node)

    Test whether the node matches the pattern

    comp:the precompiled pattern
    node:a node
    Returns:1 if it matches, 0 if it doesn't and -1 in case of failure

    Function: xmlPatternMaxDepth

    int	xmlPatternMaxDepth		(xmlPatternPtr comp)

    Check the maximum depth reachable by a pattern

    comp:the precompiled pattern
    Returns:-2 if no limit (using //), otherwise the depth, and -1 in case of error

    Function: xmlPatternMinDepth

    int	xmlPatternMinDepth		(xmlPatternPtr comp)

    Check the minimum depth reachable by a pattern, 0 mean the / or . are part of the set.

    comp:the precompiled pattern
    Returns:-1 in case of error otherwise the depth,

    Function: xmlPatternStreamable

    int	xmlPatternStreamable		(xmlPatternPtr comp)

    Check if the pattern is streamable i.e. xmlPatternGetStreamCtxt() should work.

    comp:the precompiled pattern
    Returns:1 if streamable, 0 if not and -1 in case of error.

    Function: xmlPatterncompile

    xmlPatternPtr	xmlPatterncompile	(const xmlChar * pattern, 
    xmlDict * dict,
    int flags,
    const xmlChar ** namespaces)

    Compile a pattern.

    pattern:the pattern to compile
    dict:an optional dictionary for interned strings
    flags:compilation flags, see xmlPatternFlags
    namespaces:the prefix definitions, array of [URI, prefix] or NULL
    Returns:the compiled form of the pattern or NULL in case of error

    Function: xmlStreamPop

    int	xmlStreamPop			(xmlStreamCtxtPtr stream)

    push one level from the stream.

    stream:the stream context
    Returns:-1 in case of error, 0 otherwise.

    Function: xmlStreamPush

    int	xmlStreamPush			(xmlStreamCtxtPtr stream, 
    const xmlChar * name,
    const xmlChar * ns)

    Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an element-node.

    stream:the stream context
    name:the current name
    ns:the namespace name
    Returns:-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.

    Function: xmlStreamPushAttr

    int	xmlStreamPushAttr		(xmlStreamCtxtPtr stream, 
    const xmlChar * name,
    const xmlChar * ns)

    Push new attribute data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Otherwise the function will act as if it has been given an attribute-node.

    stream:the stream context
    name:the current name
    ns:the namespace name
    Returns:-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.

    Function: xmlStreamPushNode

    int	xmlStreamPushNode		(xmlStreamCtxtPtr stream, 
    const xmlChar * name,
    const xmlChar * ns,
    int nodeType)

    Push new data onto the stream. NOTE: if the call xmlPatterncompile() indicated a dictionary, then strings for name and ns will be expected to come from the dictionary. Both @name and @ns being NULL means the / i.e. the root of the document. This can also act as a reset. Different from xmlStreamPush() this function can be fed with nodes of type: element-, attribute-, text-, cdata-section-, comment- and processing-instruction-node.

    stream:the stream context
    name:the current name
    ns:the namespace name
    nodeType:the type of the node being pushed
    Returns:-1 in case of error, 1 if the current state in the stream is a match and 0 otherwise.

    Function: xmlStreamWantsAnyNode

    int	xmlStreamWantsAnyNode		(xmlStreamCtxtPtr streamCtxt)

    Query if the streaming pattern additionally needs to be fed with text-, cdata-section-, comment- and processing-instruction-nodes. If the result is 0 then only element-nodes and attribute-nodes need to be pushed.

    streamCtxt:the stream context
    Returns:1 in case of need of nodes of the above described types, 0 otherwise. -1 on API errors.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlstring.html0000644000175000017500000011457612134171043020501 0ustar aronaron Module xmlstring from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlstring from libxml2

    API Menu
    API Indexes
    Related links

    type and interfaces needed for the internal string handling of the library, especially UTF8 processing.

    Table of Contents

    #define BAD_CAST
    Typedef unsigned char xmlChar
    
    xmlChar *	xmlCharStrdup		(const char * cur)
    xmlChar *	xmlCharStrndup		(const char * cur, 
    int len)
    int	xmlCheckUTF8			(const unsigned char * utf)
    int	xmlGetUTF8Char			(const unsigned char * utf, 
    int * len)
    int	xmlStrEqual			(const xmlChar * str1, 
    const xmlChar * str2)
    int	xmlStrPrintf			(xmlChar * buf, 
    int len,
    const xmlChar * msg,
    ... ...)
    int	xmlStrQEqual			(const xmlChar * pref, 
    const xmlChar * name,
    const xmlChar * str)
    int	xmlStrVPrintf			(xmlChar * buf, 
    int len,
    const xmlChar * msg,
    va_list ap)
    int	xmlStrcasecmp			(const xmlChar * str1, 
    const xmlChar * str2)
    const xmlChar *	xmlStrcasestr		(const xmlChar * str, 
    const xmlChar * val)
    xmlChar *	xmlStrcat		(xmlChar * cur, 
    const xmlChar * add)
    const xmlChar *	xmlStrchr		(const xmlChar * str, 
    xmlChar val)
    int	xmlStrcmp			(const xmlChar * str1, 
    const xmlChar * str2)
    xmlChar *	xmlStrdup		(const xmlChar * cur)
    int	xmlStrlen			(const xmlChar * str)
    int	xmlStrncasecmp			(const xmlChar * str1, 
    const xmlChar * str2,
    int len)
    xmlChar *	xmlStrncat		(xmlChar * cur, 
    const xmlChar * add,
    int len)
    xmlChar *	xmlStrncatNew		(const xmlChar * str1, 
    const xmlChar * str2,
    int len)
    int	xmlStrncmp			(const xmlChar * str1, 
    const xmlChar * str2,
    int len)
    xmlChar *	xmlStrndup		(const xmlChar * cur, 
    int len)
    const xmlChar *	xmlStrstr		(const xmlChar * str, 
    const xmlChar * val)
    xmlChar *	xmlStrsub		(const xmlChar * str, 
    int start,
    int len)
    int	xmlUTF8Charcmp			(const xmlChar * utf1, 
    const xmlChar * utf2)
    int	xmlUTF8Size			(const xmlChar * utf)
    int	xmlUTF8Strlen			(const xmlChar * utf)
    int	xmlUTF8Strloc			(const xmlChar * utf, 
    const xmlChar * utfchar)
    xmlChar *	xmlUTF8Strndup		(const xmlChar * utf, 
    int len)
    const xmlChar *	xmlUTF8Strpos		(const xmlChar * utf, 
    int pos)
    int	xmlUTF8Strsize			(const xmlChar * utf, 
    int len)
    xmlChar *	xmlUTF8Strsub		(const xmlChar * utf, 
    int start,
    int len)

    Description

    Macro: BAD_CAST

    #define BAD_CAST

    Macro to cast a string to an xmlChar * when one know its safe.

    This is a basic byte in an UTF-8 encoded string. It's unsigned allowing to pinpoint case where char * are assigned to xmlChar * (possibly making serialization back impossible).

    Function: xmlCharStrdup

    xmlChar *	xmlCharStrdup		(const char * cur)

    a strdup for char's to xmlChar's

    cur:the input char *
    Returns:a new xmlChar * or NULL

    Function: xmlCharStrndup

    xmlChar *	xmlCharStrndup		(const char * cur, 
    int len)

    a strndup for char's to xmlChar's

    cur:the input char *
    len:the len of @cur
    Returns:a new xmlChar * or NULL

    Function: xmlCheckUTF8

    int	xmlCheckUTF8			(const unsigned char * utf)

    Checks @utf for being valid UTF-8. @utf is assumed to be null-terminated. This function is not super-strict, as it will allow longer UTF-8 sequences than necessary. Note that Java is capable of producing these sequences if provoked. Also note, this routine checks for the 4-byte maximum size, but does not check for 0x10ffff maximum value.

    utf:Pointer to putative UTF-8 encoded string.
    Returns:value: true if @utf is valid.

    Function: xmlGetUTF8Char

    int	xmlGetUTF8Char			(const unsigned char * utf, 
    int * len)

    Read the first UTF8 character from @utf

    utf:a sequence of UTF-8 encoded bytes
    len:a pointer to the minimum number of bytes present in the sequence. This is used to assure the next character is completely contained within the sequence.
    Returns:the char value or -1 in case of error, and sets *len to the actual number of bytes consumed (0 in case of error)

    Function: xmlStrEqual

    int	xmlStrEqual			(const xmlChar * str1, 
    const xmlChar * str2)

    Check if both strings are equal of have same content. Should be a bit more readable and faster than xmlStrcmp()

    str1:the first xmlChar *
    str2:the second xmlChar *
    Returns:1 if they are equal, 0 if they are different

    Function: xmlStrPrintf

    int	xmlStrPrintf			(xmlChar * buf, 
    int len,
    const xmlChar * msg,
    ... ...)

    Formats @msg and places result into @buf.

    buf:the result buffer.
    len:the result buffer length.
    msg:the message with printf formatting.
    ...:extra parameters for the message.
    Returns:the number of characters written to @buf or -1 if an error occurs.

    Function: xmlStrQEqual

    int	xmlStrQEqual			(const xmlChar * pref, 
    const xmlChar * name,
    const xmlChar * str)

    Check if a QName is Equal to a given string

    pref:the prefix of the QName
    name:the localname of the QName
    str:the second xmlChar *
    Returns:1 if they are equal, 0 if they are different

    Function: xmlStrVPrintf

    int	xmlStrVPrintf			(xmlChar * buf, 
    int len,
    const xmlChar * msg,
    va_list ap)

    Formats @msg and places result into @buf.

    buf:the result buffer.
    len:the result buffer length.
    msg:the message with printf formatting.
    ap:extra parameters for the message.
    Returns:the number of characters written to @buf or -1 if an error occurs.

    Function: xmlStrcasecmp

    int	xmlStrcasecmp			(const xmlChar * str1, 
    const xmlChar * str2)

    a strcasecmp for xmlChar's

    str1:the first xmlChar *
    str2:the second xmlChar *
    Returns:the integer result of the comparison

    Function: xmlStrcasestr

    const xmlChar *	xmlStrcasestr		(const xmlChar * str, 
    const xmlChar * val)

    a case-ignoring strstr for xmlChar's

    str:the xmlChar * array (haystack)
    val:the xmlChar to search (needle)
    Returns:the xmlChar * for the first occurrence or NULL.

    Function: xmlStrcat

    xmlChar *	xmlStrcat		(xmlChar * cur, 
    const xmlChar * add)

    a strcat for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'.

    cur:the original xmlChar * array
    add:the xmlChar * array added
    Returns:a new xmlChar * containing the concatenated string.

    Function: xmlStrchr

    const xmlChar *	xmlStrchr		(const xmlChar * str, 
    xmlChar val)

    a strchr for xmlChar's

    str:the xmlChar * array
    val:the xmlChar to search
    Returns:the xmlChar * for the first occurrence or NULL.

    Function: xmlStrcmp

    int	xmlStrcmp			(const xmlChar * str1, 
    const xmlChar * str2)

    a strcmp for xmlChar's

    str1:the first xmlChar *
    str2:the second xmlChar *
    Returns:the integer result of the comparison

    Function: xmlStrdup

    xmlChar *	xmlStrdup		(const xmlChar * cur)

    a strdup for array of xmlChar's. Since they are supposed to be encoded in UTF-8 or an encoding with 8bit based chars, we assume a termination mark of '0'.

    cur:the input xmlChar *
    Returns:a new xmlChar * or NULL

    Function: xmlStrlen

    int	xmlStrlen			(const xmlChar * str)

    length of a xmlChar's string

    str:the xmlChar * array
    Returns:the number of xmlChar contained in the ARRAY.

    Function: xmlStrncasecmp

    int	xmlStrncasecmp			(const xmlChar * str1, 
    const xmlChar * str2,
    int len)

    a strncasecmp for xmlChar's

    str1:the first xmlChar *
    str2:the second xmlChar *
    len:the max comparison length
    Returns:the integer result of the comparison

    Function: xmlStrncat

    xmlChar *	xmlStrncat		(xmlChar * cur, 
    const xmlChar * add,
    int len)

    a strncat for array of xmlChar's, it will extend @cur with the len first bytes of @add. Note that if @len < 0 then this is an API error and NULL will be returned.

    cur:the original xmlChar * array
    add:the xmlChar * array added
    len:the length of @add
    Returns:a new xmlChar *, the original @cur is reallocated if needed and should not be freed

    Function: xmlStrncatNew

    xmlChar *	xmlStrncatNew		(const xmlChar * str1, 
    const xmlChar * str2,
    int len)

    same as xmlStrncat, but creates a new string. The original two strings are not freed. If @len is < 0 then the length will be calculated automatically.

    str1:first xmlChar string
    str2:second xmlChar string
    len:the len of @str2 or < 0
    Returns:a new xmlChar * or NULL

    Function: xmlStrncmp

    int	xmlStrncmp			(const xmlChar * str1, 
    const xmlChar * str2,
    int len)

    a strncmp for xmlChar's

    str1:the first xmlChar *
    str2:the second xmlChar *
    len:the max comparison length
    Returns:the integer result of the comparison

    Function: xmlStrndup

    xmlChar *	xmlStrndup		(const xmlChar * cur, 
    int len)

    a strndup for array of xmlChar's

    cur:the input xmlChar *
    len:the len of @cur
    Returns:a new xmlChar * or NULL

    Function: xmlStrstr

    const xmlChar *	xmlStrstr		(const xmlChar * str, 
    const xmlChar * val)

    a strstr for xmlChar's

    str:the xmlChar * array (haystack)
    val:the xmlChar to search (needle)
    Returns:the xmlChar * for the first occurrence or NULL.

    Function: xmlStrsub

    xmlChar *	xmlStrsub		(const xmlChar * str, 
    int start,
    int len)

    Extract a substring of a given string

    str:the xmlChar * array (haystack)
    start:the index of the first char (zero based)
    len:the length of the substring
    Returns:the xmlChar * for the first occurrence or NULL.

    Function: xmlUTF8Charcmp

    int	xmlUTF8Charcmp			(const xmlChar * utf1, 
    const xmlChar * utf2)

    compares the two UCS4 values

    utf1:pointer to first UTF8 char
    utf2:pointer to second UTF8 char
    Returns:result of the compare as with xmlStrncmp

    Function: xmlUTF8Size

    int	xmlUTF8Size			(const xmlChar * utf)

    calculates the internal size of a UTF8 character

    utf:pointer to the UTF8 character
    Returns:the numbers of bytes in the character, -1 on format error

    Function: xmlUTF8Strlen

    int	xmlUTF8Strlen			(const xmlChar * utf)

    compute the length of an UTF8 string, it doesn't do a full UTF8 checking of the content of the string.

    utf:a sequence of UTF-8 encoded bytes
    Returns:the number of characters in the string or -1 in case of error

    Function: xmlUTF8Strloc

    int	xmlUTF8Strloc			(const xmlChar * utf, 
    const xmlChar * utfchar)

    a function to provide the relative location of a UTF8 char

    utf:the input UTF8 *
    utfchar:the UTF8 character to be found
    Returns:the relative character position of the desired char or -1 if not found

    Function: xmlUTF8Strndup

    xmlChar *	xmlUTF8Strndup		(const xmlChar * utf, 
    int len)

    a strndup for array of UTF8's

    utf:the input UTF8 *
    len:the len of @utf (in chars)
    Returns:a new UTF8 * or NULL

    Function: xmlUTF8Strpos

    const xmlChar *	xmlUTF8Strpos		(const xmlChar * utf, 
    int pos)

    a function to provide the equivalent of fetching a character from a string array

    utf:the input UTF8 *
    pos:the position of the desired UTF8 char (in chars)
    Returns:a pointer to the UTF8 character or NULL

    Function: xmlUTF8Strsize

    int	xmlUTF8Strsize			(const xmlChar * utf, 
    int len)

    storage size of an UTF8 string the behaviour is not garanteed if the input string is not UTF-8

    utf:a sequence of UTF-8 encoded bytes
    len:the number of characters in the array
    Returns:the storage size of the first 'len' characters of ARRAY

    Function: xmlUTF8Strsub

    xmlChar *	xmlUTF8Strsub		(const xmlChar * utf, 
    int start,
    int len)

    Create a substring from a given UTF-8 string Note: positions are given in units of UTF-8 chars

    utf:a sequence of UTF-8 encoded bytes
    start:relative pos of first char
    len:total number to copy
    Returns:a pointer to a newly created string or NULL if any problem

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-tree.html0000644000175000017500000071317112134171042017404 0ustar aronaron Module tree from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module tree from libxml2

    API Menu
    API Indexes
    Related links

    this module describes the structures found in an tree resulting from an XML or HTML parsing, as well as the API provided for various processing on that tree

    Table of Contents

    #define BASE_BUFFER_SIZE
    #define LIBXML2_NEW_BUFFER
    #define XML_GET_CONTENT
    #define XML_GET_LINE
    #define XML_LOCAL_NAMESPACE
    #define XML_XML_ID
    #define XML_XML_NAMESPACE
    #define xmlChildrenNode
    #define xmlRootNode
    Structure xmlAttr
    struct _xmlAttr
    Typedef xmlAttr * xmlAttrPtr
    
    Structure xmlAttribute
    struct _xmlAttribute
    Enum xmlAttributeDefault
    
    Typedef xmlAttribute * xmlAttributePtr
    
    Enum xmlAttributeType
    
    Structure xmlBuf
    struct _xmlBuf The content of this structure is not made public by the API.
    Typedef xmlBuf * xmlBufPtr
    
    Structure xmlBuffer
    struct _xmlBuffer
    Enum xmlBufferAllocationScheme
    
    Typedef xmlBuffer * xmlBufferPtr
    
    Structure xmlDOMWrapCtxt
    struct _xmlDOMWrapCtxt
    Typedef xmlDOMWrapCtxt * xmlDOMWrapCtxtPtr
    
    Structure xmlDoc
    struct _xmlDoc
    Enum xmlDocProperties
    
    Typedef xmlDoc * xmlDocPtr
    
    Structure xmlDtd
    struct _xmlDtd
    Typedef xmlDtd * xmlDtdPtr
    
    Structure xmlElement
    struct _xmlElement
    Structure xmlElementContent
    struct _xmlElementContent
    Enum xmlElementContentOccur
    
    Typedef xmlElementContent * xmlElementContentPtr
    
    Enum xmlElementContentType
    
    Typedef xmlElement * xmlElementPtr
    
    Enum xmlElementType
    
    Enum xmlElementTypeVal
    
    Structure xmlEntity
    struct _xmlEntity
    Typedef xmlEntity * xmlEntityPtr
    
    Structure xmlEnumeration
    struct _xmlEnumeration
    Typedef xmlEnumeration * xmlEnumerationPtr
    
    Structure xmlID
    struct _xmlID
    Typedef xmlID * xmlIDPtr
    
    Structure xmlNode
    struct _xmlNode
    Typedef xmlNode * xmlNodePtr
    
    Structure xmlNotation
    struct _xmlNotation
    Typedef xmlNotation * xmlNotationPtr
    
    Structure xmlNs
    struct _xmlNs
    Typedef xmlNs * xmlNsPtr
    
    Typedef xmlElementType xmlNsType
    
    Structure xmlOutputBuffer
    struct _xmlOutputBuffer
    Typedef xmlOutputBuffer * xmlOutputBufferPtr
    
    Structure xmlParserCtxt
    struct _xmlParserCtxt
    Typedef xmlParserCtxt * xmlParserCtxtPtr
    
    Structure xmlParserInput
    struct _xmlParserInput
    Structure xmlParserInputBuffer
    struct _xmlParserInputBuffer
    Typedef xmlParserInputBuffer * xmlParserInputBufferPtr
    
    Typedef xmlParserInput * xmlParserInputPtr
    
    Structure xmlRef
    struct _xmlRef
    Typedef xmlRef * xmlRefPtr
    
    Structure xmlSAXHandler
    struct _xmlSAXHandler
    Typedef xmlSAXHandler * xmlSAXHandlerPtr
    
    Structure xmlSAXLocator
    struct _xmlSAXLocator
    Typedef xmlSAXLocator * xmlSAXLocatorPtr
    
    xmlNodePtr	xmlAddChild		(xmlNodePtr parent, 
    xmlNodePtr cur)
    xmlNodePtr	xmlAddChildList		(xmlNodePtr parent, 
    xmlNodePtr cur)
    xmlNodePtr	xmlAddNextSibling	(xmlNodePtr cur, 
    xmlNodePtr elem)
    xmlNodePtr	xmlAddPrevSibling	(xmlNodePtr cur, 
    xmlNodePtr elem)
    xmlNodePtr	xmlAddSibling		(xmlNodePtr cur, 
    xmlNodePtr elem)
    void	xmlAttrSerializeTxtContent	(xmlBufferPtr buf, 
    xmlDocPtr doc,
    xmlAttrPtr attr,
    const xmlChar * string)
    xmlChar *	xmlBufContent		(const xmlBufPtr buf)
    xmlChar *	xmlBufEnd		(const xmlBufPtr buf)
    int	xmlBufGetNodeContent		(xmlBufPtr buf, 
    xmlNodePtr cur)
    size_t	xmlBufNodeDump			(xmlBufPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    int level,
    int format)
    size_t	xmlBufShrink			(xmlBufPtr buf, 
    size_t len)
    size_t	xmlBufUse			(const xmlBufPtr buf)
    int	xmlBufferAdd			(xmlBufferPtr buf, 
    const xmlChar * str,
    int len)
    int	xmlBufferAddHead		(xmlBufferPtr buf, 
    const xmlChar * str,
    int len)
    int	xmlBufferCCat			(xmlBufferPtr buf, 
    const char * str)
    int	xmlBufferCat			(xmlBufferPtr buf, 
    const xmlChar * str)
    const xmlChar *	xmlBufferContent	(const xmlBufferPtr buf)
    xmlBufferPtr	xmlBufferCreate		(void)
    xmlBufferPtr	xmlBufferCreateSize	(size_t size)
    xmlBufferPtr	xmlBufferCreateStatic	(void * mem, 
    size_t size)
    xmlChar *	xmlBufferDetach		(xmlBufferPtr buf)
    int	xmlBufferDump			(FILE * file, 
    xmlBufferPtr buf)
    void	xmlBufferEmpty			(xmlBufferPtr buf)
    void	xmlBufferFree			(xmlBufferPtr buf)
    int	xmlBufferGrow			(xmlBufferPtr buf, 
    unsigned int len)
    int	xmlBufferLength			(const xmlBufferPtr buf)
    int	xmlBufferResize			(xmlBufferPtr buf, 
    unsigned int size)
    void	xmlBufferSetAllocationScheme	(xmlBufferPtr buf, 
    xmlBufferAllocationScheme scheme)
    int	xmlBufferShrink			(xmlBufferPtr buf, 
    unsigned int len)
    void	xmlBufferWriteCHAR		(xmlBufferPtr buf, 
    const xmlChar * string)
    void	xmlBufferWriteChar		(xmlBufferPtr buf, 
    const char * string)
    void	xmlBufferWriteQuotedString	(xmlBufferPtr buf, 
    const xmlChar * string)
    xmlChar *	xmlBuildQName		(const xmlChar * ncname, 
    const xmlChar * prefix,
    xmlChar * memory,
    int len)
    unsigned long	xmlChildElementCount	(xmlNodePtr parent)
    xmlDocPtr	xmlCopyDoc		(xmlDocPtr doc, 
    int recursive)
    xmlDtdPtr	xmlCopyDtd		(xmlDtdPtr dtd)
    xmlNsPtr	xmlCopyNamespace	(xmlNsPtr cur)
    xmlNsPtr	xmlCopyNamespaceList	(xmlNsPtr cur)
    xmlNodePtr	xmlCopyNode		(const xmlNodePtr node, 
    int extended)
    xmlNodePtr	xmlCopyNodeList		(const xmlNodePtr node)
    xmlAttrPtr	xmlCopyProp		(xmlNodePtr target, 
    xmlAttrPtr cur)
    xmlAttrPtr	xmlCopyPropList		(xmlNodePtr target, 
    xmlAttrPtr cur)
    xmlDtdPtr	xmlCreateIntSubset	(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    Function type: xmlDOMWrapAcquireNsFunction
    xmlNsPtr	xmlDOMWrapAcquireNsFunction	(xmlDOMWrapCtxtPtr ctxt, 
    xmlNodePtr node,
    const xmlChar * nsName,
    const xmlChar * nsPrefix)
    int	xmlDOMWrapAdoptNode		(xmlDOMWrapCtxtPtr ctxt, 
    xmlDocPtr sourceDoc,
    xmlNodePtr node,
    xmlDocPtr destDoc,
    xmlNodePtr destParent,
    int options)
    int	xmlDOMWrapCloneNode		(xmlDOMWrapCtxtPtr ctxt, 
    xmlDocPtr sourceDoc,
    xmlNodePtr node,
    xmlNodePtr * resNode,
    xmlDocPtr destDoc,
    xmlNodePtr destParent,
    int deep,
    int options)
    void	xmlDOMWrapFreeCtxt		(xmlDOMWrapCtxtPtr ctxt)
    xmlDOMWrapCtxtPtr	xmlDOMWrapNewCtxt	(void)
    int	xmlDOMWrapReconcileNamespaces	(xmlDOMWrapCtxtPtr ctxt, 
    xmlNodePtr elem,
    int options)
    int	xmlDOMWrapRemoveNode		(xmlDOMWrapCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr node,
    int options)
    xmlNodePtr	xmlDocCopyNode		(const xmlNodePtr node, 
    xmlDocPtr doc,
    int extended)
    xmlNodePtr	xmlDocCopyNodeList	(xmlDocPtr doc, 
    const xmlNodePtr node)
    int	xmlDocDump			(FILE * f, 
    xmlDocPtr cur)
    void	xmlDocDumpFormatMemory		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size,
    int format)
    void	xmlDocDumpFormatMemoryEnc	(xmlDocPtr out_doc, 
    xmlChar ** doc_txt_ptr,
    int * doc_txt_len,
    const char * txt_encoding,
    int format)
    void	xmlDocDumpMemory		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size)
    void	xmlDocDumpMemoryEnc		(xmlDocPtr out_doc, 
    xmlChar ** doc_txt_ptr,
    int * doc_txt_len,
    const char * txt_encoding)
    int	xmlDocFormatDump		(FILE * f, 
    xmlDocPtr cur,
    int format)
    xmlNodePtr	xmlDocGetRootElement	(xmlDocPtr doc)
    xmlNodePtr	xmlDocSetRootElement	(xmlDocPtr doc, 
    xmlNodePtr root)
    void	xmlElemDump			(FILE * f, 
    xmlDocPtr doc,
    xmlNodePtr cur)
    xmlNodePtr	xmlFirstElementChild	(xmlNodePtr parent)
    void	xmlFreeDoc			(xmlDocPtr cur)
    void	xmlFreeDtd			(xmlDtdPtr cur)
    void	xmlFreeNode			(xmlNodePtr cur)
    void	xmlFreeNodeList			(xmlNodePtr cur)
    void	xmlFreeNs			(xmlNsPtr cur)
    void	xmlFreeNsList			(xmlNsPtr cur)
    void	xmlFreeProp			(xmlAttrPtr cur)
    void	xmlFreePropList			(xmlAttrPtr cur)
    xmlBufferAllocationScheme	xmlGetBufferAllocationScheme	(void)
    int	xmlGetCompressMode		(void)
    int	xmlGetDocCompressMode		(xmlDocPtr doc)
    xmlDtdPtr	xmlGetIntSubset		(xmlDocPtr doc)
    xmlNodePtr	xmlGetLastChild		(xmlNodePtr parent)
    long	xmlGetLineNo			(xmlNodePtr node)
    xmlChar *	xmlGetNoNsProp		(xmlNodePtr node, 
    const xmlChar * name)
    xmlChar *	xmlGetNodePath		(xmlNodePtr node)
    xmlNsPtr *	xmlGetNsList		(xmlDocPtr doc, 
    xmlNodePtr node)
    xmlChar *	xmlGetNsProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * nameSpace)
    xmlChar *	xmlGetProp		(xmlNodePtr node, 
    const xmlChar * name)
    xmlAttrPtr	xmlHasNsProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * nameSpace)
    xmlAttrPtr	xmlHasProp		(xmlNodePtr node, 
    const xmlChar * name)
    int	xmlIsBlankNode			(xmlNodePtr node)
    int	xmlIsXHTML			(const xmlChar * systemID, 
    const xmlChar * publicID)
    xmlNodePtr	xmlLastElementChild	(xmlNodePtr parent)
    xmlNodePtr	xmlNewCDataBlock	(xmlDocPtr doc, 
    const xmlChar * content,
    int len)
    xmlNodePtr	xmlNewCharRef		(xmlDocPtr doc, 
    const xmlChar * name)
    xmlNodePtr	xmlNewChild		(xmlNodePtr parent, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)
    xmlNodePtr	xmlNewComment		(const xmlChar * content)
    xmlDocPtr	xmlNewDoc		(const xmlChar * version)
    xmlNodePtr	xmlNewDocComment	(xmlDocPtr doc, 
    const xmlChar * content)
    xmlNodePtr	xmlNewDocFragment	(xmlDocPtr doc)
    xmlNodePtr	xmlNewDocNode		(xmlDocPtr doc, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)
    xmlNodePtr	xmlNewDocNodeEatName	(xmlDocPtr doc, 
    xmlNsPtr ns,
    xmlChar * name,
    const xmlChar * content)
    xmlNodePtr	xmlNewDocPI		(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * content)
    xmlAttrPtr	xmlNewDocProp		(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * value)
    xmlNodePtr	xmlNewDocRawNode	(xmlDocPtr doc, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)
    xmlNodePtr	xmlNewDocText		(xmlDocPtr doc, 
    const xmlChar * content)
    xmlNodePtr	xmlNewDocTextLen	(xmlDocPtr doc, 
    const xmlChar * content,
    int len)
    xmlDtdPtr	xmlNewDtd		(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    xmlNsPtr	xmlNewGlobalNs		(xmlDocPtr doc, 
    const xmlChar * href,
    const xmlChar * prefix)
    xmlNodePtr	xmlNewNode		(xmlNsPtr ns, 
    const xmlChar * name)
    xmlNodePtr	xmlNewNodeEatName	(xmlNsPtr ns, 
    xmlChar * name)
    xmlNsPtr	xmlNewNs		(xmlNodePtr node, 
    const xmlChar * href,
    const xmlChar * prefix)
    xmlAttrPtr	xmlNewNsProp		(xmlNodePtr node, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * value)
    xmlAttrPtr	xmlNewNsPropEatName	(xmlNodePtr node, 
    xmlNsPtr ns,
    xmlChar * name,
    const xmlChar * value)
    xmlNodePtr	xmlNewPI		(const xmlChar * name, 
    const xmlChar * content)
    xmlAttrPtr	xmlNewProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * value)
    xmlNodePtr	xmlNewReference		(xmlDocPtr doc, 
    const xmlChar * name)
    xmlNodePtr	xmlNewText		(const xmlChar * content)
    xmlNodePtr	xmlNewTextChild		(xmlNodePtr parent, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)
    xmlNodePtr	xmlNewTextLen		(const xmlChar * content, 
    int len)
    xmlNodePtr	xmlNextElementSibling	(xmlNodePtr node)
    void	xmlNodeAddContent		(xmlNodePtr cur, 
    const xmlChar * content)
    void	xmlNodeAddContentLen		(xmlNodePtr cur, 
    const xmlChar * content,
    int len)
    int	xmlNodeBufGetContent		(xmlBufferPtr buffer, 
    xmlNodePtr cur)
    int	xmlNodeDump			(xmlBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    int level,
    int format)
    void	xmlNodeDumpOutput		(xmlOutputBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    int level,
    int format,
    const char * encoding)
    xmlChar *	xmlNodeGetBase		(xmlDocPtr doc, 
    xmlNodePtr cur)
    xmlChar *	xmlNodeGetContent	(xmlNodePtr cur)
    xmlChar *	xmlNodeGetLang		(xmlNodePtr cur)
    int	xmlNodeGetSpacePreserve		(xmlNodePtr cur)
    int	xmlNodeIsText			(xmlNodePtr node)
    xmlChar *	xmlNodeListGetRawString	(xmlDocPtr doc, 
    xmlNodePtr list,
    int inLine)
    xmlChar *	xmlNodeListGetString	(xmlDocPtr doc, 
    xmlNodePtr list,
    int inLine)
    void	xmlNodeSetBase			(xmlNodePtr cur, 
    const xmlChar * uri)
    void	xmlNodeSetContent		(xmlNodePtr cur, 
    const xmlChar * content)
    void	xmlNodeSetContentLen		(xmlNodePtr cur, 
    const xmlChar * content,
    int len)
    void	xmlNodeSetLang			(xmlNodePtr cur, 
    const xmlChar * lang)
    void	xmlNodeSetName			(xmlNodePtr cur, 
    const xmlChar * name)
    void	xmlNodeSetSpacePreserve		(xmlNodePtr cur, 
    int val)
    xmlNodePtr	xmlPreviousElementSibling	(xmlNodePtr node)
    int	xmlReconciliateNs		(xmlDocPtr doc, 
    xmlNodePtr tree)
    int	xmlRemoveProp			(xmlAttrPtr cur)
    xmlNodePtr	xmlReplaceNode		(xmlNodePtr old, 
    xmlNodePtr cur)
    int	xmlSaveFile			(const char * filename, 
    xmlDocPtr cur)
    int	xmlSaveFileEnc			(const char * filename, 
    xmlDocPtr cur,
    const char * encoding)
    int	xmlSaveFileTo			(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding)
    int	xmlSaveFormatFile		(const char * filename, 
    xmlDocPtr cur,
    int format)
    int	xmlSaveFormatFileEnc		(const char * filename, 
    xmlDocPtr cur,
    const char * encoding,
    int format)
    int	xmlSaveFormatFileTo		(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding,
    int format)
    xmlNsPtr	xmlSearchNs		(xmlDocPtr doc, 
    xmlNodePtr node,
    const xmlChar * nameSpace)
    xmlNsPtr	xmlSearchNsByHref	(xmlDocPtr doc, 
    xmlNodePtr node,
    const xmlChar * href)
    void	xmlSetBufferAllocationScheme	(xmlBufferAllocationScheme scheme)
    void	xmlSetCompressMode		(int mode)
    void	xmlSetDocCompressMode		(xmlDocPtr doc, 
    int mode)
    void	xmlSetListDoc			(xmlNodePtr list, 
    xmlDocPtr doc)
    void	xmlSetNs			(xmlNodePtr node, 
    xmlNsPtr ns)
    xmlAttrPtr	xmlSetNsProp		(xmlNodePtr node, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * value)
    xmlAttrPtr	xmlSetProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * value)
    void	xmlSetTreeDoc			(xmlNodePtr tree, 
    xmlDocPtr doc)
    xmlChar *	xmlSplitQName2		(const xmlChar * name, 
    xmlChar ** prefix)
    const xmlChar *	xmlSplitQName3		(const xmlChar * name, 
    int * len)
    xmlNodePtr	xmlStringGetNodeList	(xmlDocPtr doc, 
    const xmlChar * value)
    xmlNodePtr	xmlStringLenGetNodeList	(xmlDocPtr doc, 
    const xmlChar * value,
    int len)
    int	xmlTextConcat			(xmlNodePtr node, 
    const xmlChar * content,
    int len)
    xmlNodePtr	xmlTextMerge		(xmlNodePtr first, 
    xmlNodePtr second)
    void	xmlUnlinkNode			(xmlNodePtr cur)
    int	xmlUnsetNsProp			(xmlNodePtr node, 
    xmlNsPtr ns,
    const xmlChar * name)
    int	xmlUnsetProp			(xmlNodePtr node, 
    const xmlChar * name)
    int	xmlValidateNCName		(const xmlChar * value, 
    int space)
    int	xmlValidateNMToken		(const xmlChar * value, 
    int space)
    int	xmlValidateName			(const xmlChar * value, 
    int space)
    int	xmlValidateQName		(const xmlChar * value, 
    int space)

    Description

    Macro: BASE_BUFFER_SIZE

    #define BASE_BUFFER_SIZE

    default buffer size 4000.

    Macro: LIBXML2_NEW_BUFFER

    #define LIBXML2_NEW_BUFFER

    Macro used to express that the API use the new buffers for xmlParserInputBuffer and xmlOutputBuffer. The change was introduced in 2.9.0.

    Macro: XML_GET_CONTENT

    #define XML_GET_CONTENT

    Macro to extract the content pointer of a node.

    Macro: XML_GET_LINE

    #define XML_GET_LINE

    Macro to extract the line number of an element node.

    Macro: XML_LOCAL_NAMESPACE

    #define XML_LOCAL_NAMESPACE

    A namespace declaration node.

    Macro: XML_XML_ID

    #define XML_XML_ID

    This is the name for the special xml:id attribute

    Macro: XML_XML_NAMESPACE

    #define XML_XML_NAMESPACE

    This is the namespace for the special xml: prefix predefined in the XML Namespace specification.

    Macro: xmlChildrenNode

    #define xmlChildrenNode

    Macro for compatibility naming layer with libxml1. Maps to "children."

    Macro: xmlRootNode

    #define xmlRootNode

    Macro for compatibility naming layer with libxml1. Maps to "children".

    Structure xmlAttr

    Structure xmlAttr
    struct _xmlAttr { void * _private : application data xmlElementType type : XML_ATTRIBUTE_NODE, must be second ! const xmlChar * name : the name of the property struct _xmlNode * children : the value of the property struct _xmlNode * last : NULL struct _xmlNode * parent : child->parent link struct _xmlAttr * next : next sibling link struct _xmlAttr * prev : previous sibling link struct _xmlDoc * doc : the containing document xmlNs * ns : pointer to the associated namespace xmlAttributeType atype : the attribute type if validating void * psvi : for type/PSVI informations }

    Structure xmlAttribute

    Structure xmlAttribute
    struct _xmlAttribute { void * _private : application data xmlElementType type : XML_ATTRIBUTE_DECL, must be second ! const xmlChar * name : Attribute name struct _xmlNode * children : NULL struct _xmlNode * last : NULL struct _xmlDtd * parent : -> DTD struct _xmlNode * next : next sibling link struct _xmlNode * prev : previous sibling link struct _xmlDoc * doc : the containing document struct _xmlAttribute * nexth : next in hash table xmlAttributeType atype : The attribute type xmlAttributeDefault def : the default const xmlChar * defaultValue : or the default value xmlEnumerationPtr tree : or the enumeration tree if any const xmlChar * prefix : the namespace prefix if any const xmlChar * elem : Element holding the attribute }

    Enum xmlAttributeDefault

    Enum xmlAttributeDefault {
        XML_ATTRIBUTE_NONE = 1
        XML_ATTRIBUTE_REQUIRED = 2
        XML_ATTRIBUTE_IMPLIED = 3
        XML_ATTRIBUTE_FIXED = 4
    }
    

    Enum xmlAttributeType

    Enum xmlAttributeType {
        XML_ATTRIBUTE_CDATA = 1
        XML_ATTRIBUTE_ID = 2
        XML_ATTRIBUTE_IDREF = 3
        XML_ATTRIBUTE_IDREFS = 4
        XML_ATTRIBUTE_ENTITY = 5
        XML_ATTRIBUTE_ENTITIES = 6
        XML_ATTRIBUTE_NMTOKEN = 7
        XML_ATTRIBUTE_NMTOKENS = 8
        XML_ATTRIBUTE_ENUMERATION = 9
        XML_ATTRIBUTE_NOTATION = 10
    }
    

    Structure xmlBuf

    Structure xmlBuf
    struct _xmlBuf { The content of this structure is not made public by the API. }
    A pointer to a buffer structure, the actual structure internals are not public

    Structure xmlBuffer

    Structure xmlBuffer
    struct _xmlBuffer { xmlChar * content : The buffer content UTF8 unsigned int use : The buffer size used unsigned int size : The buffer size xmlBufferAllocationScheme alloc : The realloc method xmlChar * contentIO : in IO mode we may have a different base }

    Enum xmlBufferAllocationScheme

    Enum xmlBufferAllocationScheme {
        XML_BUFFER_ALLOC_DOUBLEIT = 1 : double each time one need to grow
        XML_BUFFER_ALLOC_EXACT = 2 : grow only to the minimal size
        XML_BUFFER_ALLOC_IMMUTABLE = 3 : immutable buffer
        XML_BUFFER_ALLOC_IO = 4 : special allocation scheme used for I/O
        XML_BUFFER_ALLOC_HYBRID = 5 : exact up to a threshold, and doubleit thereafter
    }
    

    Structure xmlDOMWrapCtxt

    Structure xmlDOMWrapCtxt
    struct _xmlDOMWrapCtxt { void * _private : * The type of this context, just in case int type : * Internal namespace map used for variou void * namespaceMap : * Use this one to acquire an xmlNsPtr in xmlDOMWrapAcquireNsFunction getNsForNodeFunc }

    Structure xmlDoc

    Structure xmlDoc
    struct _xmlDoc { void * _private : application data xmlElementType type : XML_DOCUMENT_NODE, must be second ! char * name : name/filename/URI of the document struct _xmlNode * children : the document tree struct _xmlNode * last : last child link struct _xmlNode * parent : child->parent link struct _xmlNode * next : next sibling link struct _xmlNode * prev : previous sibling link struct _xmlDoc * doc : autoreference to itself End of common p int compression : level of zlib compression int standalone : standalone document (no external refs) struct _xmlDtd * intSubset : the document internal subset struct _xmlDtd * extSubset : the document external subset struct _xmlNs * oldNs : Global namespace, the old way const xmlChar * version : the XML version string const xmlChar * encoding : external initial encoding, if any void * ids : Hash table for ID attributes if any void * refs : Hash table for IDREFs attributes if any const xmlChar * URL : The URI for that document int charset : encoding of the in-memory content actua struct _xmlDict * dict : dict used to allocate names or NULL void * psvi : for type/PSVI informations int parseFlags : set of xmlParserOption used to parse th int properties : set of xmlDocProperties for this docume }

    Enum xmlDocProperties

    Enum xmlDocProperties {
        XML_DOC_WELLFORMED = 1 : document is XML well formed
        XML_DOC_NSVALID = 2 : document is Namespace valid
        XML_DOC_OLD10 = 4 : parsed with old XML-1.0 parser
        XML_DOC_DTDVALID = 8 : DTD validation was successful
        XML_DOC_XINCLUDE = 16 : XInclude substitution was done
        XML_DOC_USERBUILT = 32 : Document was built using the API and not by parsing an instance
        XML_DOC_INTERNAL = 64 : built for internal processing
        XML_DOC_HTML = 128 : parsed or built HTML document
    }
    

    Structure xmlDtd

    Structure xmlDtd
    struct _xmlDtd { void * _private : application data xmlElementType type : XML_DTD_NODE, must be second ! const xmlChar * name : Name of the DTD struct _xmlNode * children : the value of the property link struct _xmlNode * last : last child link struct _xmlDoc * parent : child->parent link struct _xmlNode * next : next sibling link struct _xmlNode * prev : previous sibling link struct _xmlDoc * doc : the containing document End of common p void * notations : Hash table for notations if any void * elements : Hash table for elements if any void * attributes : Hash table for attributes if any void * entities : Hash table for entities if any const xmlChar * ExternalID : External identifier for PUBLIC DTD const xmlChar * SystemID : URI for a SYSTEM or PUBLIC DTD void * pentities : Hash table for param entities if any }

    Structure xmlElement

    Structure xmlElement
    struct _xmlElement { void * _private : application data xmlElementType type : XML_ELEMENT_DECL, must be second ! const xmlChar * name : Element name struct _xmlNode * children : NULL struct _xmlNode * last : NULL struct _xmlDtd * parent : -> DTD struct _xmlNode * next : next sibling link struct _xmlNode * prev : previous sibling link struct _xmlDoc * doc : the containing document xmlElementTypeVal etype : The type xmlElementContentPtr content : the allowed element content xmlAttributePtr attributes : List of the declared attributes const xmlChar * prefix : the namespace prefix if any xmlRegexpPtr contModel : the validating regexp void * contModel }

    Structure xmlElementContent

    Structure xmlElementContent
    struct _xmlElementContent { xmlElementContentType type : PCDATA, ELEMENT, SEQ or OR xmlElementContentOccur ocur : ONCE, OPT, MULT or PLUS const xmlChar * name : Element name struct _xmlElementContent * c1 : first child struct _xmlElementContent * c2 : second child struct _xmlElementContent * parent : parent const xmlChar * prefix : Namespace prefix }

    Enum xmlElementContentOccur

    Enum xmlElementContentOccur {
        XML_ELEMENT_CONTENT_ONCE = 1
        XML_ELEMENT_CONTENT_OPT = 2
        XML_ELEMENT_CONTENT_MULT = 3
        XML_ELEMENT_CONTENT_PLUS = 4
    }
    

    Enum xmlElementContentType

    Enum xmlElementContentType {
        XML_ELEMENT_CONTENT_PCDATA = 1
        XML_ELEMENT_CONTENT_ELEMENT = 2
        XML_ELEMENT_CONTENT_SEQ = 3
        XML_ELEMENT_CONTENT_OR = 4
    }
    

    Enum xmlElementType

    Enum xmlElementType {
        XML_ELEMENT_NODE = 1
        XML_ATTRIBUTE_NODE = 2
        XML_TEXT_NODE = 3
        XML_CDATA_SECTION_NODE = 4
        XML_ENTITY_REF_NODE = 5
        XML_ENTITY_NODE = 6
        XML_PI_NODE = 7
        XML_COMMENT_NODE = 8
        XML_DOCUMENT_NODE = 9
        XML_DOCUMENT_TYPE_NODE = 10
        XML_DOCUMENT_FRAG_NODE = 11
        XML_NOTATION_NODE = 12
        XML_HTML_DOCUMENT_NODE = 13
        XML_DTD_NODE = 14
        XML_ELEMENT_DECL = 15
        XML_ATTRIBUTE_DECL = 16
        XML_ENTITY_DECL = 17
        XML_NAMESPACE_DECL = 18
        XML_XINCLUDE_START = 19
        XML_XINCLUDE_END = 20
        XML_DOCB_DOCUMENT_NODE = 21
    }
    

    Enum xmlElementTypeVal

    Enum xmlElementTypeVal {
        XML_ELEMENT_TYPE_UNDEFINED = 0
        XML_ELEMENT_TYPE_EMPTY = 1
        XML_ELEMENT_TYPE_ANY = 2
        XML_ELEMENT_TYPE_MIXED = 3
        XML_ELEMENT_TYPE_ELEMENT = 4
    }
    

    Structure xmlEntity

    Structure xmlEntity
    struct _xmlEntity { void * _private : application data xmlElementType type : XML_ENTITY_DECL, must be second ! const xmlChar * name : Entity name struct _xmlNode * children : First child link struct _xmlNode * last : Last child link struct _xmlDtd * parent : -> DTD struct _xmlNode * next : next sibling link struct _xmlNode * prev : previous sibling link struct _xmlDoc * doc : the containing document xmlChar * orig : content without ref substitution xmlChar * content : content or ndata if unparsed int length : the content length xmlEntityType etype : The entity type const xmlChar * ExternalID : External identifier for PUBLIC const xmlChar * SystemID : URI for a SYSTEM or PUBLIC Entity struct _xmlEntity * nexte : unused const xmlChar * URI : the full URI as computed int owner : does the entity own the childrens int checked : was the entity content checked this is }

    Structure xmlEnumeration

    Structure xmlEnumeration
    struct _xmlEnumeration { struct _xmlEnumeration * next : next one const xmlChar * name : Enumeration name }

    Structure xmlID

    Structure xmlID
    struct _xmlID { struct _xmlID * next : next ID const xmlChar * value : The ID name xmlAttrPtr attr : The attribute holding it const xmlChar * name : The attribute if attr is not available int lineno : The line number if attr is not availabl struct _xmlDoc * doc : The document holding the ID }

    Structure xmlNode

    Structure xmlNode
    struct _xmlNode { void * _private : application data xmlElementType type : type number, must be second ! const xmlChar * name : the name of the node, or the entity struct _xmlNode * children : parent->childs link struct _xmlNode * last : last child link struct _xmlNode * parent : child->parent link struct _xmlNode * next : next sibling link struct _xmlNode * prev : previous sibling link struct _xmlDoc * doc : the containing document End of common p xmlNs * ns : pointer to the associated namespace xmlChar * content : the content struct _xmlAttr * properties : properties list xmlNs * nsDef : namespace definitions on this node void * psvi : for type/PSVI informations unsigned short line : line number unsigned short extra : extra data for XPath/XSLT }

    Structure xmlNotation

    Structure xmlNotation
    struct _xmlNotation { const xmlChar * name : Notation name const xmlChar * PublicID : Public identifier, if any const xmlChar * SystemID : System identifier, if any }

    Structure xmlNs

    Structure xmlNs
    struct _xmlNs { struct _xmlNs * next : next Ns link for this node xmlNsType type : global or local const xmlChar * href : URL for the namespace const xmlChar * prefix : prefix for the namespace void * _private : application data struct _xmlDoc * context : normally an xmlDoc }

    Structure xmlOutputBuffer

    Structure xmlOutputBuffer
    struct _xmlOutputBuffer { void * context xmlOutputWriteCallback writecallback xmlOutputCloseCallback closecallback xmlCharEncodingHandlerPtr encoder : I18N conversions to UTF-8 xmlBufPtr buffer : Local buffer encoded in UTF-8 or ISOLat xmlBufPtr conv : if encoder != NULL buffer for output int written : total number of byte written int error }

    Structure xmlParserCtxt

    Structure xmlParserCtxt
    struct _xmlParserCtxt { struct _xmlSAXHandler * sax : The SAX handler void * userData : For SAX interface only, used by DOM bui xmlDocPtr myDoc : the document being built int wellFormed : is the document well formed int replaceEntities : shall we replace entities ? const xmlChar * version : the XML version string const xmlChar * encoding : the declared encoding, if any int standalone : standalone document int html : an HTML(1)/Docbook(2) document * 3 is H xmlParserInputPtr input : Current input stream int inputNr : Number of current input streams int inputMax : Max number of input streams xmlParserInputPtr * inputTab : stack of inputs Node analysis stack onl xmlNodePtr node : Current parsed Node int nodeNr : Depth of the parsing stack int nodeMax : Max depth of the parsing stack xmlNodePtr * nodeTab : array of nodes int record_info : Whether node info should be kept xmlParserNodeInfoSeq node_seq : info about each node parsed int errNo : error code int hasExternalSubset : reference and external subset int hasPErefs : the internal subset has PE refs int external : are we parsing an external entity int valid : is the document valid int validate : shall we try to validate ? xmlValidCtxt vctxt : The validity context xmlParserInputState instate : current type of input int token : next char look-ahead char * directory : the data directory Node name stack const xmlChar * name : Current parsed Node int nameNr : Depth of the parsing stack int nameMax : Max depth of the parsing stack const xmlChar * * nameTab : array of nodes long nbChars : number of xmlChar processed long checkIndex : used by progressive parsing lookup int keepBlanks : ugly but ... int disableSAX : SAX callbacks are disabled int inSubset : Parsing is in int 1/ext 2 subset const xmlChar * intSubName : name of subset xmlChar * extSubURI : URI of external subset xmlChar * extSubSystem : SYSTEM ID of external subset xml:space int * space : Should the parser preserve spaces int spaceNr : Depth of the parsing stack int spaceMax : Max depth of the parsing stack int * spaceTab : array of space infos int depth : to prevent entity substitution loops xmlParserInputPtr entity : used to check entities boundaries int charset : encoding of the in-memory content actua int nodelen : Those two fields are there to int nodemem : Speed up large node parsing int pedantic : signal pedantic warnings void * _private : For user data, libxml won't touch it int loadsubset : should the external subset be loaded int linenumbers : set line number in element content void * catalogs : document's own catalog int recovery : run in recovery mode int progressive : is this a progressive parsing xmlDictPtr dict : dictionnary for the parser const xmlChar * * atts : array for the attributes callbacks int maxatts : the size of the array int docdict : * pre-interned strings * const xmlChar * str_xml const xmlChar * str_xmlns const xmlChar * str_xml_ns : * Everything below is used only by the n int sax2 : operating in the new SAX mode int nsNr : the number of inherited namespaces int nsMax : the size of the arrays const xmlChar * * nsTab : the array of prefix/namespace name int * attallocs : which attribute were allocated void * * pushTab : array of data for push xmlHashTablePtr attsDefault : defaulted attributes if any xmlHashTablePtr attsSpecial : non-CDATA attributes if any int nsWellFormed : is the document XML Nanespace okay int options : * Those fields are needed only for tream int dictNames : Use dictionary names for the tree int freeElemsNr : number of freed element nodes xmlNodePtr freeElems : List of freed element nodes int freeAttrsNr : number of freed attributes nodes xmlAttrPtr freeAttrs : * the complete error informations for th xmlError lastError xmlParserMode parseMode : the parser mode unsigned long nbentities : number of entities references unsigned long sizeentities : size of parsed entities for use by HTML xmlParserNodeInfo * nodeInfo : Current NodeInfo int nodeInfoNr : Depth of the parsing stack int nodeInfoMax : Max depth of the parsing stack xmlParserNodeInfo * nodeInfoTab : array of nodeInfos int input_id : we need to label inputs unsigned long sizeentcopy : volume of entity copy }

    Structure xmlParserInput

    Structure xmlParserInput
    struct _xmlParserInput { xmlParserInputBufferPtr buf : UTF-8 encoded buffer const char * filename : The file analyzed, if any const char * directory : the directory/base of the file const xmlChar * base : Base of the array to parse const xmlChar * cur : Current char being parsed const xmlChar * end : end of the array to parse int length : length if known int line : Current line int col : * NOTE: consumed is only tested for equa unsigned long consumed : How many xmlChars already consumed xmlParserInputDeallocate free : function to deallocate the base const xmlChar * encoding : the encoding string for entity const xmlChar * version : the version string for entity int standalone : Was that entity marked standalone int id : an unique identifier for the entity }

    Structure xmlParserInputBuffer

    Structure xmlParserInputBuffer
    struct _xmlParserInputBuffer { void * context xmlInputReadCallback readcallback xmlInputCloseCallback closecallback xmlCharEncodingHandlerPtr encoder : I18N conversions to UTF-8 xmlBufPtr buffer : Local buffer encoded in UTF-8 xmlBufPtr raw : if encoder != NULL buffer for raw input int compressed : -1=unknown, 0=not compressed, 1=compres int error unsigned long rawconsumed : amount consumed from raw }

    Structure xmlRef

    Structure xmlRef
    struct _xmlRef { struct _xmlRef * next : next Ref const xmlChar * value : The Ref name xmlAttrPtr attr : The attribute holding it const xmlChar * name : The attribute if attr is not available int lineno : The line number if attr is not availabl }

    Structure xmlSAXHandler

    Structure xmlSAXHandler
    struct _xmlSAXHandler { internalSubsetSAXFunc internalSubset isStandaloneSAXFunc isStandalone hasInternalSubsetSAXFunc hasInternalSubset hasExternalSubsetSAXFunc hasExternalSubset resolveEntitySAXFunc resolveEntity getEntitySAXFunc getEntity entityDeclSAXFunc entityDecl notationDeclSAXFunc notationDecl attributeDeclSAXFunc attributeDecl elementDeclSAXFunc elementDecl unparsedEntityDeclSAXFunc unparsedEntityDecl setDocumentLocatorSAXFunc setDocumentLocator startDocumentSAXFunc startDocument endDocumentSAXFunc endDocument startElementSAXFunc startElement endElementSAXFunc endElement referenceSAXFunc reference charactersSAXFunc characters ignorableWhitespaceSAXFunc ignorableWhitespace processingInstructionSAXFunc processingInstruction commentSAXFunc comment warningSAXFunc warning errorSAXFunc error fatalErrorSAXFunc fatalError : unused error() get all the errors getParameterEntitySAXFunc getParameterEntity cdataBlockSAXFunc cdataBlock externalSubsetSAXFunc externalSubset unsigned int initialized : The following fields are extensions ava void * _private startElementNsSAX2Func startElementNs endElementNsSAX2Func endElementNs xmlStructuredErrorFunc serror }

    Structure xmlSAXLocator

    Structure xmlSAXLocator
    struct _xmlSAXLocator { const xmlChar *(*getPublicId) getPublicId const xmlChar *(*getSystemId) getSystemId int(*getLineNumber) getLineNumber int(*getColumnNumber) getColumnNumber }

    Function: xmlAddChild

    xmlNodePtr	xmlAddChild		(xmlNodePtr parent, 
    xmlNodePtr cur)

    Add a new node to @parent, at the end of the child (or property) list merging adjacent TEXT nodes (in which case @cur is freed) If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed.

    parent:the parent node
    cur:the child node
    Returns:the child or NULL in case of error.

    Function: xmlAddChildList

    xmlNodePtr	xmlAddChildList		(xmlNodePtr parent, 
    xmlNodePtr cur)

    Add a list of node at the end of the child list of the parent merging adjacent TEXT nodes (@cur may be freed)

    parent:the parent node
    cur:the first node in the list
    Returns:the last child or NULL in case of error.

    Function: xmlAddNextSibling

    xmlNodePtr	xmlAddNextSibling	(xmlNodePtr cur, 
    xmlNodePtr elem)

    Add a new node @elem as the next sibling of @cur If the new node was already inserted in a document it is first unlinked from its existing context. As a result of text merging @elem may be freed. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed.

    cur:the child node
    elem:the new node
    Returns:the new node or NULL in case of error.

    Function: xmlAddPrevSibling

    xmlNodePtr	xmlAddPrevSibling	(xmlNodePtr cur, 
    xmlNodePtr elem)

    Add a new node @elem as the previous sibling of @cur merging adjacent TEXT nodes (@elem may be freed) If the new node was already inserted in a document it is first unlinked from its existing context. If the new node is ATTRIBUTE, it is added into properties instead of children. If there is an attribute with equal name, it is first destroyed.

    cur:the child node
    elem:the new node
    Returns:the new node or NULL in case of error.

    Function: xmlAddSibling

    xmlNodePtr	xmlAddSibling		(xmlNodePtr cur, 
    xmlNodePtr elem)

    Add a new element @elem to the list of siblings of @cur merging adjacent TEXT nodes (@elem may be freed) If the new element was already inserted in a document it is first unlinked from its existing context.

    cur:the child node
    elem:the new node
    Returns:the new element or NULL in case of error.

    Function: xmlAttrSerializeTxtContent

    void	xmlAttrSerializeTxtContent	(xmlBufferPtr buf, 
    xmlDocPtr doc,
    xmlAttrPtr attr,
    const xmlChar * string)

    Serialize text attribute values to an xml simple buffer

    buf:the XML buffer output
    doc:the document
    attr:the attribute node
    string:the text content

    Function: xmlBufContent

    xmlChar *	xmlBufContent		(const xmlBufPtr buf)

    Function to extract the content of a buffer

    buf:the buffer
    Returns:the internal content

    Function: xmlBufEnd

    xmlChar *	xmlBufEnd		(const xmlBufPtr buf)

    Function to extract the end of the content of a buffer

    buf:the buffer
    Returns:the end of the internal content or NULL in case of error

    Function: xmlBufGetNodeContent

    int	xmlBufGetNodeContent		(xmlBufPtr buf, 
    xmlNodePtr cur)

    Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buffer with this value

    buf:a buffer xmlBufPtr
    cur:the node being read
    Returns:0 in case of success and -1 in case of error.

    Function: xmlBufNodeDump

    size_t	xmlBufNodeDump			(xmlBufPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    int level,
    int format)

    Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

    buf:the XML buffer output
    doc:the document
    cur:the current node
    level:the imbrication level for indenting
    format:is formatting allowed
    Returns:the number of bytes written to the buffer, in case of error 0 is returned or @buf stores the error

    Function: xmlBufShrink

    size_t	xmlBufShrink			(xmlBufPtr buf, 
    size_t len)

    Remove the beginning of an XML buffer. NOTE that this routine behaviour differs from xmlBufferShrink() as it will return 0 on error instead of -1 due to size_t being used as the return type.

    buf:the buffer to dump
    len:the number of xmlChar to remove
    Returns:the number of byte removed or 0 in case of failure

    Function: xmlBufUse

    size_t	xmlBufUse			(const xmlBufPtr buf)

    Function to get the length of a buffer

    buf:the buffer
    Returns:the length of data in the internal content

    Function: xmlBufferAdd

    int	xmlBufferAdd			(xmlBufferPtr buf, 
    const xmlChar * str,
    int len)

    Add a string range to an XML buffer. if len == -1, the length of str is recomputed.

    buf:the buffer to dump
    str:the #xmlChar string
    len:the number of #xmlChar to add
    Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlBufferAddHead

    int	xmlBufferAddHead		(xmlBufferPtr buf, 
    const xmlChar * str,
    int len)

    Add a string range to the beginning of an XML buffer. if len == -1, the length of @str is recomputed.

    buf:the buffer
    str:the #xmlChar string
    len:the number of #xmlChar to add
    Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlBufferCCat

    int	xmlBufferCCat			(xmlBufferPtr buf, 
    const char * str)

    Append a zero terminated C string to an XML buffer.

    buf:the buffer to dump
    str:the C char string
    Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlBufferCat

    int	xmlBufferCat			(xmlBufferPtr buf, 
    const xmlChar * str)

    Append a zero terminated string to an XML buffer.

    buf:the buffer to add to
    str:the #xmlChar string
    Returns:0 successful, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlBufferContent

    const xmlChar *	xmlBufferContent	(const xmlBufferPtr buf)

    Function to extract the content of a buffer

    buf:the buffer
    Returns:the internal content

    Function: xmlBufferCreate

    xmlBufferPtr	xmlBufferCreate		(void)

    routine to create an XML buffer.

    Returns:the new structure.

    Function: xmlBufferCreateSize

    xmlBufferPtr	xmlBufferCreateSize	(size_t size)

    routine to create an XML buffer.

    size:initial size of buffer
    Returns:the new structure.

    Function: xmlBufferCreateStatic

    xmlBufferPtr	xmlBufferCreateStatic	(void * mem, 
    size_t size)

    routine to create an XML buffer from an immutable memory area. The area won't be modified nor copied, and is expected to be present until the end of the buffer lifetime.

    mem:the memory area
    size:the size in byte
    Returns:the new structure.

    Function: xmlBufferDetach

    xmlChar *	xmlBufferDetach		(xmlBufferPtr buf)

    Remove the string contained in a buffer and gie it back to the caller. The buffer is reset to an empty content. This doesn't work with immutable buffers as they can't be reset.

    buf:the buffer
    Returns:the previous string contained by the buffer.

    Function: xmlBufferDump

    int	xmlBufferDump			(FILE * file, 
    xmlBufferPtr buf)

    Dumps an XML buffer to a FILE *.

    file:the file output
    buf:the buffer to dump
    Returns:the number of #xmlChar written

    Function: xmlBufferEmpty

    void	xmlBufferEmpty			(xmlBufferPtr buf)

    empty a buffer.

    buf:the buffer

    Function: xmlBufferFree

    void	xmlBufferFree			(xmlBufferPtr buf)

    Frees an XML buffer. It frees both the content and the structure which encapsulate it.

    buf:the buffer to free

    Function: xmlBufferGrow

    int	xmlBufferGrow			(xmlBufferPtr buf, 
    unsigned int len)

    Grow the available space of an XML buffer.

    buf:the buffer
    len:the minimum free size to allocate
    Returns:the new available space or -1 in case of error

    Function: xmlBufferLength

    int	xmlBufferLength			(const xmlBufferPtr buf)

    Function to get the length of a buffer

    buf:the buffer
    Returns:the length of data in the internal content

    Function: xmlBufferResize

    int	xmlBufferResize			(xmlBufferPtr buf, 
    unsigned int size)

    Resize a buffer to accommodate minimum size of @size.

    buf:the buffer to resize
    size:the desired size
    Returns:0 in case of problems, 1 otherwise

    Function: xmlBufferSetAllocationScheme

    void	xmlBufferSetAllocationScheme	(xmlBufferPtr buf, 
    xmlBufferAllocationScheme scheme)

    Sets the allocation scheme for this buffer

    buf:the buffer to tune
    scheme:allocation scheme to use

    Function: xmlBufferShrink

    int	xmlBufferShrink			(xmlBufferPtr buf, 
    unsigned int len)

    Remove the beginning of an XML buffer.

    buf:the buffer to dump
    len:the number of xmlChar to remove
    Returns:the number of #xmlChar removed, or -1 in case of failure.

    Function: xmlBufferWriteCHAR

    void	xmlBufferWriteCHAR		(xmlBufferPtr buf, 
    const xmlChar * string)

    routine which manages and grows an output buffer. This one adds xmlChars at the end of the buffer.

    buf:the XML buffer
    string:the string to add

    Function: xmlBufferWriteChar

    void	xmlBufferWriteChar		(xmlBufferPtr buf, 
    const char * string)

    routine which manage and grows an output buffer. This one add C chars at the end of the array.

    buf:the XML buffer output
    string:the string to add

    Function: xmlBufferWriteQuotedString

    void	xmlBufferWriteQuotedString	(xmlBufferPtr buf, 
    const xmlChar * string)

    routine which manage and grows an output buffer. This one writes a quoted or double quoted #xmlChar string, checking first if it holds quote or double-quotes internally

    buf:the XML buffer output
    string:the string to add

    Function: xmlBuildQName

    xmlChar *	xmlBuildQName		(const xmlChar * ncname, 
    const xmlChar * prefix,
    xmlChar * memory,
    int len)

    Builds the QName @prefix:@ncname in @memory if there is enough space and prefix is not NULL nor empty, otherwise allocate a new string. If prefix is NULL or empty it returns ncname.

    ncname:the Name
    prefix:the prefix
    memory:preallocated memory
    len:preallocated memory length
    Returns:the new string which must be freed by the caller if different from @memory and @ncname or NULL in case of error

    Function: xmlChildElementCount

    unsigned long	xmlChildElementCount	(xmlNodePtr parent)

    Finds the current number of child nodes of that element which are element nodes. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

    parent:the parent node
    Returns:the count of element child or 0 if not available

    Function: xmlCopyDoc

    xmlDocPtr	xmlCopyDoc		(xmlDocPtr doc, 
    int recursive)

    Do a copy of the document info. If recursive, the content tree will be copied too as well as DTD, namespaces and entities.

    doc:the document
    recursive:if not zero do a recursive copy.
    Returns:a new #xmlDocPtr, or NULL in case of error.

    Function: xmlCopyDtd

    xmlDtdPtr	xmlCopyDtd		(xmlDtdPtr dtd)

    Do a copy of the dtd.

    dtd:the dtd
    Returns:a new #xmlDtdPtr, or NULL in case of error.

    Function: xmlCopyNamespace

    xmlNsPtr	xmlCopyNamespace	(xmlNsPtr cur)

    Do a copy of the namespace.

    cur:the namespace
    Returns:a new #xmlNsPtr, or NULL in case of error.

    Function: xmlCopyNamespaceList

    xmlNsPtr	xmlCopyNamespaceList	(xmlNsPtr cur)

    Do a copy of an namespace list.

    cur:the first namespace
    Returns:a new #xmlNsPtr, or NULL in case of error.

    Function: xmlCopyNode

    xmlNodePtr	xmlCopyNode		(const xmlNodePtr node, 
    int extended)

    Do a copy of the node.

    node:the node
    extended:if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable)
    Returns:a new #xmlNodePtr, or NULL in case of error.

    Function: xmlCopyNodeList

    xmlNodePtr	xmlCopyNodeList		(const xmlNodePtr node)

    Do a recursive copy of the node list. Use xmlDocCopyNodeList() if possible to ensure string interning.

    node:the first node in the list.
    Returns:a new #xmlNodePtr, or NULL in case of error.

    Function: xmlCopyProp

    xmlAttrPtr	xmlCopyProp		(xmlNodePtr target, 
    xmlAttrPtr cur)

    Do a copy of the attribute.

    target:the element where the attribute will be grafted
    cur:the attribute
    Returns:a new #xmlAttrPtr, or NULL in case of error.

    Function: xmlCopyPropList

    xmlAttrPtr	xmlCopyPropList		(xmlNodePtr target, 
    xmlAttrPtr cur)

    Do a copy of an attribute list.

    target:the element where the attributes will be grafted
    cur:the first attribute
    Returns:a new #xmlAttrPtr, or NULL in case of error.

    Function: xmlCreateIntSubset

    xmlDtdPtr	xmlCreateIntSubset	(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Create the internal subset of a document

    doc:the document pointer
    name:the DTD name
    ExternalID:the external (PUBLIC) ID
    SystemID:the system ID
    Returns:a pointer to the new DTD structure

    Function type: xmlDOMWrapAcquireNsFunction

    Function type: xmlDOMWrapAcquireNsFunction
    xmlNsPtr	xmlDOMWrapAcquireNsFunction	(xmlDOMWrapCtxtPtr ctxt, 
    xmlNodePtr node,
    const xmlChar * nsName,
    const xmlChar * nsPrefix)

    A function called to acquire namespaces (xmlNs) from the wrapper.

    ctxt:a DOM wrapper context
    node:the context node (element or attribute)
    nsName:the requested namespace name
    nsPrefix:the requested namespace prefix
    Returns:an xmlNsPtr or NULL in case of an error.

    Function: xmlDOMWrapAdoptNode

    int	xmlDOMWrapAdoptNode		(xmlDOMWrapCtxtPtr ctxt, 
    xmlDocPtr sourceDoc,
    xmlNodePtr node,
    xmlDocPtr destDoc,
    xmlNodePtr destParent,
    int options)

    References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc->oldNs entries are used This is the case when you have an unliked node and just want to move it to the context of If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. NOTE: This function was not intensively tested.

    ctxt:the optional context for custom processing
    sourceDoc:the optional sourceDoc
    node:the node to start with
    destDoc:the destination doc
    destParent:the optional new parent of @node in @destDoc
    options:option flags
    Returns:0 if the operation succeeded, 1 if a node of unsupported type was given, 2 if a node of not yet supported type was given and -1 on API/internal errors.

    Function: xmlDOMWrapCloneNode

    int	xmlDOMWrapCloneNode		(xmlDOMWrapCtxtPtr ctxt, 
    xmlDocPtr sourceDoc,
    xmlNodePtr node,
    xmlNodePtr * resNode,
    xmlDocPtr destDoc,
    xmlNodePtr destParent,
    int deep,
    int options)

    References of out-of scope ns-decls are remapped to point to @destDoc: 1) If @destParent is given, then nsDef entries on element-nodes are used 2) If *no* @destParent is given, then @destDoc->oldNs entries are used. This is the case when you don't know already where the cloned branch will be added to. If @destParent is given, it ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. TODO: 1) What to do with XInclude? Currently this returns an error for XInclude.

    ctxt:the optional context for custom processing
    sourceDoc:the optional sourceDoc
    node:the node to start with
    resNode:the clone of the given @node
    destDoc:the destination doc
    destParent:the optional new parent of @node in @destDoc
    deep:descend into child if set
    options:option flags
    Returns:0 if the operation succeeded, 1 if a node of unsupported (or not yet supported) type was given, -1 on API/internal errors.

    Function: xmlDOMWrapFreeCtxt

    void	xmlDOMWrapFreeCtxt		(xmlDOMWrapCtxtPtr ctxt)

    Frees the DOM-wrapper context.

    ctxt:the DOM-wrapper context

    Function: xmlDOMWrapNewCtxt

    xmlDOMWrapCtxtPtr	xmlDOMWrapNewCtxt	(void)

    Allocates and initializes a new DOM-wrapper context.

    Returns:the xmlDOMWrapCtxtPtr or NULL in case of an internal errror.

    Function: xmlDOMWrapReconcileNamespaces

    int	xmlDOMWrapReconcileNamespaces	(xmlDOMWrapCtxtPtr ctxt, 
    xmlNodePtr elem,
    int options)

    Ensures that ns-references point to ns-decls hold on element-nodes. Ensures that the tree is namespace wellformed by creating additional ns-decls where needed. Note that, since prefixes of already existent ns-decls can be shadowed by this process, it could break QNames in attribute values or element content. NOTE: This function was not intensively tested.

    ctxt:DOM wrapper context, unused at the moment
    elem:the element-node
    options:option flags
    Returns:0 if succeeded, -1 otherwise and on API/internal errors.

    Function: xmlDOMWrapRemoveNode

    int	xmlDOMWrapRemoveNode		(xmlDOMWrapCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr node,
    int options)

    Unlinks the given node from its owner. This will substitute ns-references to node->nsDef for ns-references to doc->oldNs, thus ensuring the removed branch to be autark wrt ns-references. NOTE: This function was not intensively tested.

    ctxt:a DOM wrapper context
    doc:the doc
    node:the node to be removed.
    options:set of options, unused at the moment
    Returns:0 on success, 1 if the node is not supported, -1 on API and internal errors.

    Function: xmlDocCopyNode

    xmlNodePtr	xmlDocCopyNode		(const xmlNodePtr node, 
    xmlDocPtr doc,
    int extended)

    Do a copy of the node to a given document.

    node:the node
    doc:the document
    extended:if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable)
    Returns:a new #xmlNodePtr, or NULL in case of error.

    Function: xmlDocCopyNodeList

    xmlNodePtr	xmlDocCopyNodeList	(xmlDocPtr doc, 
    const xmlNodePtr node)

    Do a recursive copy of the node list.

    doc:the target document
    node:the first node in the list.
    Returns:a new #xmlNodePtr, or NULL in case of error.

    Function: xmlDocDump

    int	xmlDocDump			(FILE * f, 
    xmlDocPtr cur)

    Dump an XML document to an open FILE.

    f:the FILE*
    cur:the document
    Returns:the number of bytes written or -1 in case of failure.

    Function: xmlDocDumpFormatMemory

    void	xmlDocDumpFormatMemory		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size,
    int format)

    Dump an XML document in memory and return the #xmlChar * and it's size. It's up to the caller to free the memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

    cur:the document
    mem:OUT: the memory pointer
    size:OUT: the memory length
    format:should formatting spaces been added

    Function: xmlDocDumpFormatMemoryEnc

    void	xmlDocDumpFormatMemoryEnc	(xmlDocPtr out_doc, 
    xmlChar ** doc_txt_ptr,
    int * doc_txt_len,
    const char * txt_encoding,
    int format)

    Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

    out_doc:Document to generate XML text from
    doc_txt_ptr:Memory pointer for allocated XML text
    doc_txt_len:Length of the generated XML text
    txt_encoding:Character encoding to use when generating XML text
    format:should formatting spaces been added

    Function: xmlDocDumpMemory

    void	xmlDocDumpMemory		(xmlDocPtr cur, 
    xmlChar ** mem,
    int * size)

    Dump an XML document in memory and return the #xmlChar * and it's size in bytes. It's up to the caller to free the memory with xmlFree(). The resulting byte array is zero terminated, though the last 0 is not included in the returned size.

    cur:the document
    mem:OUT: the memory pointer
    size:OUT: the memory length

    Function: xmlDocDumpMemoryEnc

    void	xmlDocDumpMemoryEnc		(xmlDocPtr out_doc, 
    xmlChar ** doc_txt_ptr,
    int * doc_txt_len,
    const char * txt_encoding)

    Dump the current DOM tree into memory using the character encoding specified by the caller. Note it is up to the caller of this function to free the allocated memory with xmlFree().

    out_doc:Document to generate XML text from
    doc_txt_ptr:Memory pointer for allocated XML text
    doc_txt_len:Length of the generated XML text
    txt_encoding:Character encoding to use when generating XML text

    Function: xmlDocFormatDump

    int	xmlDocFormatDump		(FILE * f, 
    xmlDocPtr cur,
    int format)

    Dump an XML document to an open FILE.

    f:the FILE*
    cur:the document
    format:should formatting spaces been added
    Returns:the number of bytes written or -1 in case of failure. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

    Function: xmlDocGetRootElement

    xmlNodePtr	xmlDocGetRootElement	(xmlDocPtr doc)

    Get the root element of the document (doc->children is a list containing possibly comments, PIs, etc ...).

    doc:the document
    Returns:the #xmlNodePtr for the root or NULL

    Function: xmlDocSetRootElement

    xmlNodePtr	xmlDocSetRootElement	(xmlDocPtr doc, 
    xmlNodePtr root)

    Set the root element of the document (doc->children is a list containing possibly comments, PIs, etc ...).

    doc:the document
    root:the new document root element, if root is NULL no action is taken, to remove a node from a document use xmlUnlinkNode(root) instead.
    Returns:the old root element if any was found, NULL if root was NULL

    Function: xmlElemDump

    void	xmlElemDump			(FILE * f, 
    xmlDocPtr doc,
    xmlNodePtr cur)

    Dump an XML/HTML node, recursive behaviour, children are printed too.

    f:the FILE * for the output
    doc:the document
    cur:the current node

    Function: xmlFirstElementChild

    xmlNodePtr	xmlFirstElementChild	(xmlNodePtr parent)

    Finds the first child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

    parent:the parent node
    Returns:the first element child or NULL if not available

    Function: xmlFreeDoc

    void	xmlFreeDoc			(xmlDocPtr cur)

    Free up all the structures used by a document, tree included.

    cur:pointer to the document

    Function: xmlFreeDtd

    void	xmlFreeDtd			(xmlDtdPtr cur)

    Free a DTD structure.

    cur:the DTD structure to free up

    Function: xmlFreeNode

    void	xmlFreeNode			(xmlNodePtr cur)

    Free a node, this is a recursive behaviour, all the children are freed too. This doesn't unlink the child from the list, use xmlUnlinkNode() first.

    cur:the node

    Function: xmlFreeNodeList

    void	xmlFreeNodeList			(xmlNodePtr cur)

    Free a node and all its siblings, this is a recursive behaviour, all the children are freed too.

    cur:the first node in the list

    Function: xmlFreeNs

    void	xmlFreeNs			(xmlNsPtr cur)

    Free up the structures associated to a namespace

    cur:the namespace pointer

    Function: xmlFreeNsList

    void	xmlFreeNsList			(xmlNsPtr cur)

    Free up all the structures associated to the chained namespaces.

    cur:the first namespace pointer

    Function: xmlFreeProp

    void	xmlFreeProp			(xmlAttrPtr cur)

    Free one attribute, all the content is freed too

    cur:an attribute

    Function: xmlFreePropList

    void	xmlFreePropList			(xmlAttrPtr cur)

    Free a property and all its siblings, all the children are freed too.

    cur:the first property in the list

    Function: xmlGetBufferAllocationScheme

    xmlBufferAllocationScheme	xmlGetBufferAllocationScheme	(void)

    Types are XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, improves performance XML_BUFFER_ALLOC_HYBRID - use exact sizes on small strings to keep memory usage tight in normal usage, and doubleit on large strings to avoid pathological performance.

    Returns:the current allocation scheme

    Function: xmlGetCompressMode

    int	xmlGetCompressMode		(void)

    get the default compression mode used, ZLIB based.

    Returns:0 (uncompressed) to 9 (max compression)

    Function: xmlGetDocCompressMode

    int	xmlGetDocCompressMode		(xmlDocPtr doc)

    get the compression ratio for a document, ZLIB based

    doc:the document
    Returns:0 (uncompressed) to 9 (max compression)

    Function: xmlGetIntSubset

    xmlDtdPtr	xmlGetIntSubset		(xmlDocPtr doc)

    Get the internal subset of a document

    doc:the document pointer
    Returns:a pointer to the DTD structure or NULL if not found

    Function: xmlGetLastChild

    xmlNodePtr	xmlGetLastChild		(xmlNodePtr parent)

    Search the last child of a node.

    parent:the parent node
    Returns:the last child or NULL if none.

    Function: xmlGetLineNo

    long	xmlGetLineNo			(xmlNodePtr node)

    Get line number of @node. Try to override the limitation of lines being store in 16 bits ints if XML_PARSE_BIG_LINES parser option was used

    node:valid node
    Returns:the line number if successful, -1 otherwise

    Function: xmlGetNoNsProp

    xmlChar *	xmlGetNoNsProp		(xmlNodePtr node, 
    const xmlChar * name)

    Search and get the value of an attribute associated to a node This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. This function is similar to xmlGetProp except it will accept only an attribute in no namespace.

    node:the node
    name:the attribute name
    Returns:the attribute value or NULL if not found. It's up to the caller to free the memory with xmlFree().

    Function: xmlGetNodePath

    xmlChar *	xmlGetNodePath		(xmlNodePtr node)

    Build a structure based Path for the given node

    node:a node
    Returns:the new path or NULL in case of error. The caller must free the returned string

    Function: xmlGetNsList

    xmlNsPtr *	xmlGetNsList		(xmlDocPtr doc, 
    xmlNodePtr node)

    Search all the namespace applying to a given element.

    doc:the document
    node:the current node
    Returns:an NULL terminated array of all the #xmlNsPtr found that need to be freed by the caller or NULL if no namespace if defined

    Function: xmlGetNsProp

    xmlChar *	xmlGetNsProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * nameSpace)

    Search and get the value of an attribute associated to a node This attribute has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off.

    node:the node
    name:the attribute name
    nameSpace:the URI of the namespace
    Returns:the attribute value or NULL if not found. It's up to the caller to free the memory with xmlFree().

    Function: xmlGetProp

    xmlChar *	xmlGetProp		(xmlNodePtr node, 
    const xmlChar * name)

    Search and get the value of an attribute associated to a node This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. NOTE: this function acts independently of namespaces associated to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp() for namespace aware processing.

    node:the node
    name:the attribute name
    Returns:the attribute value or NULL if not found. It's up to the caller to free the memory with xmlFree().

    Function: xmlHasNsProp

    xmlAttrPtr	xmlHasNsProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * nameSpace)

    Search for an attribute associated to a node This attribute has to be anchored in the namespace specified. This does the entity substitution. This function looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off. Note that a namespace of NULL indicates to use the default namespace.

    node:the node
    name:the attribute name
    nameSpace:the URI of the namespace
    Returns:the attribute or the attribute declaration or NULL if neither was found.

    Function: xmlHasProp

    xmlAttrPtr	xmlHasProp		(xmlNodePtr node, 
    const xmlChar * name)

    Search an attribute associated to a node This function also looks in DTD attribute declaration for #FIXED or default declaration values unless DTD use has been turned off.

    node:the node
    name:the attribute name
    Returns:the attribute or the attribute declaration or NULL if neither was found.

    Function: xmlIsBlankNode

    int	xmlIsBlankNode			(xmlNodePtr node)

    Checks whether this node is an empty or whitespace only (and possibly ignorable) text-node.

    node:the node
    Returns:1 yes, 0 no

    Function: xmlIsXHTML

    int	xmlIsXHTML			(const xmlChar * systemID, 
    const xmlChar * publicID)

    Try to find if the document correspond to an XHTML DTD

    systemID:the system identifier
    publicID:the public identifier
    Returns:1 if true, 0 if not and -1 in case of error

    Function: xmlLastElementChild

    xmlNodePtr	xmlLastElementChild	(xmlNodePtr parent)

    Finds the last child node of that element which is a Element node Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

    parent:the parent node
    Returns:the last element child or NULL if not available

    Function: xmlNewCDataBlock

    xmlNodePtr	xmlNewCDataBlock	(xmlDocPtr doc, 
    const xmlChar * content,
    int len)

    Creation of a new node containing a CDATA block.

    doc:the document
    content:the CDATA block content content
    len:the length of the block
    Returns:a pointer to the new node object.

    Function: xmlNewCharRef

    xmlNodePtr	xmlNewCharRef		(xmlDocPtr doc, 
    const xmlChar * name)

    Creation of a new character reference node.

    doc:the document
    name:the char ref string, starting with # or "&# ... ;"
    Returns:a pointer to the new node object.

    Function: xmlNewChild

    xmlNodePtr	xmlNewChild		(xmlNodePtr parent, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)

    Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child list containing the TEXTs and ENTITY_REFs node will be created. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references. XML special chars must be escaped first by using xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used.

    parent:the parent node
    ns:a namespace if any
    name:the name of the child
    content:the XML content of the child if any.
    Returns:a pointer to the new node object.

    Function: xmlNewComment

    xmlNodePtr	xmlNewComment		(const xmlChar * content)

    Creation of a new node containing a comment.

    content:the comment content
    Returns:a pointer to the new node object.

    Function: xmlNewDoc

    xmlDocPtr	xmlNewDoc		(const xmlChar * version)

    Creates a new XML document

    version:xmlChar string giving the version of XML "1.0"
    Returns:a new document

    Function: xmlNewDocComment

    xmlNodePtr	xmlNewDocComment	(xmlDocPtr doc, 
    const xmlChar * content)

    Creation of a new node containing a comment within a document.

    doc:the document
    content:the comment content
    Returns:a pointer to the new node object.

    Function: xmlNewDocFragment

    xmlNodePtr	xmlNewDocFragment	(xmlDocPtr doc)

    Creation of a new Fragment node.

    doc:the document owning the fragment
    Returns:a pointer to the new node object.

    Function: xmlNewDocNode

    xmlNodePtr	xmlNewDocNode		(xmlDocPtr doc, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)

    Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support.

    doc:the document
    ns:namespace if any
    name:the node name
    content:the XML text content if any
    Returns:a pointer to the new node object.

    Function: xmlNewDocNodeEatName

    xmlNodePtr	xmlNewDocNodeEatName	(xmlDocPtr doc, 
    xmlNsPtr ns,
    xmlChar * name,
    const xmlChar * content)

    Creation of a new node element within a document. @ns and @content are optional (NULL). NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't need entities support.

    doc:the document
    ns:namespace if any
    name:the node name
    content:the XML text content if any
    Returns:a pointer to the new node object.

    Function: xmlNewDocPI

    xmlNodePtr	xmlNewDocPI		(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * content)

    Creation of a processing instruction element.

    doc:the target document
    name:the processing instruction name
    content:the PI content
    Returns:a pointer to the new node object.

    Function: xmlNewDocProp

    xmlAttrPtr	xmlNewDocProp		(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * value)

    Create a new property carried by a document.

    doc:the document
    name:the name of the attribute
    value:the value of the attribute
    Returns:a pointer to the attribute

    Function: xmlNewDocRawNode

    xmlNodePtr	xmlNewDocRawNode	(xmlDocPtr doc, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)

    Creation of a new node element within a document. @ns and @content are optional (NULL).

    doc:the document
    ns:namespace if any
    name:the node name
    content:the text content if any
    Returns:a pointer to the new node object.

    Function: xmlNewDocText

    xmlNodePtr	xmlNewDocText		(xmlDocPtr doc, 
    const xmlChar * content)

    Creation of a new text node within a document.

    doc:the document
    content:the text content
    Returns:a pointer to the new node object.

    Function: xmlNewDocTextLen

    xmlNodePtr	xmlNewDocTextLen	(xmlDocPtr doc, 
    const xmlChar * content,
    int len)

    Creation of a new text node with an extra content length parameter. The text node pertain to a given document.

    doc:the document
    content:the text content
    len:the text len.
    Returns:a pointer to the new node object.

    Function: xmlNewDtd

    xmlDtdPtr	xmlNewDtd		(xmlDocPtr doc, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Creation of a new DTD for the external subset. To create an internal subset, use xmlCreateIntSubset().

    doc:the document pointer
    name:the DTD name
    ExternalID:the external ID
    SystemID:the system ID
    Returns:a pointer to the new DTD structure

    Function: xmlNewGlobalNs

    xmlNsPtr	xmlNewGlobalNs		(xmlDocPtr doc, 
    const xmlChar * href,
    const xmlChar * prefix)

    Creation of a Namespace, the old way using PI and without scoping DEPRECATED !!!

    doc:the document carrying the namespace
    href:the URI associated
    prefix:the prefix for the namespace
    Returns:NULL this functionality had been removed

    Function: xmlNewNode

    xmlNodePtr	xmlNewNode		(xmlNsPtr ns, 
    const xmlChar * name)

    Creation of a new node element. @ns is optional (NULL).

    ns:namespace if any
    name:the node name
    Returns:a pointer to the new node object. Uses xmlStrdup() to make copy of @name.

    Function: xmlNewNodeEatName

    xmlNodePtr	xmlNewNodeEatName	(xmlNsPtr ns, 
    xmlChar * name)

    Creation of a new node element. @ns is optional (NULL).

    ns:namespace if any
    name:the node name
    Returns:a pointer to the new node object, with pointer @name as new node's name. Use xmlNewNode() if a copy of @name string is is needed as new node's name.

    Function: xmlNewNs

    xmlNsPtr	xmlNewNs		(xmlNodePtr node, 
    const xmlChar * href,
    const xmlChar * prefix)

    Creation of a new Namespace. This function will refuse to create a namespace with a similar prefix than an existing one present on this node. We use href==NULL in the case of an element creation where the namespace was not defined.

    node:the element carrying the namespace
    href:the URI associated
    prefix:the prefix for the namespace
    Returns:a new namespace pointer or NULL

    Function: xmlNewNsProp

    xmlAttrPtr	xmlNewNsProp		(xmlNodePtr node, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * value)

    Create a new property tagged with a namespace and carried by a node.

    node:the holding node
    ns:the namespace
    name:the name of the attribute
    value:the value of the attribute
    Returns:a pointer to the attribute

    Function: xmlNewNsPropEatName

    xmlAttrPtr	xmlNewNsPropEatName	(xmlNodePtr node, 
    xmlNsPtr ns,
    xmlChar * name,
    const xmlChar * value)

    Create a new property tagged with a namespace and carried by a node.

    node:the holding node
    ns:the namespace
    name:the name of the attribute
    value:the value of the attribute
    Returns:a pointer to the attribute

    Function: xmlNewPI

    xmlNodePtr	xmlNewPI		(const xmlChar * name, 
    const xmlChar * content)

    Creation of a processing instruction element. Use xmlDocNewPI preferably to get string interning

    name:the processing instruction name
    content:the PI content
    Returns:a pointer to the new node object.

    Function: xmlNewProp

    xmlAttrPtr	xmlNewProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * value)

    Create a new property carried by a node.

    node:the holding node
    name:the name of the attribute
    value:the value of the attribute
    Returns:a pointer to the attribute

    Function: xmlNewReference

    xmlNodePtr	xmlNewReference		(xmlDocPtr doc, 
    const xmlChar * name)

    Creation of a new reference node.

    doc:the document
    name:the reference name, or the reference string with & and ;
    Returns:a pointer to the new node object.

    Function: xmlNewText

    xmlNodePtr	xmlNewText		(const xmlChar * content)

    Creation of a new text node.

    content:the text content
    Returns:a pointer to the new node object.

    Function: xmlNewTextChild

    xmlNodePtr	xmlNewTextChild		(xmlNodePtr parent, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * content)

    Creation of a new child element, added at the end of @parent children list. @ns and @content parameters are optional (NULL). If @ns is NULL, the newly created element inherits the namespace of @parent. If @content is non NULL, a child TEXT node will be created containing the string @content. NOTE: Use xmlNewChild() if @content will contain entities that need to be preserved. Use this function, xmlNewTextChild(), if you need to ensure that reserved XML chars that might appear in @content, such as the ampersand, greater-than or less-than signs, are automatically replaced by their XML escaped entity representations.

    parent:the parent node
    ns:a namespace if any
    name:the name of the child
    content:the text content of the child if any.
    Returns:a pointer to the new node object.

    Function: xmlNewTextLen

    xmlNodePtr	xmlNewTextLen		(const xmlChar * content, 
    int len)

    Creation of a new text node with an extra parameter for the content's length

    content:the text content
    len:the text len.
    Returns:a pointer to the new node object.

    Function: xmlNextElementSibling

    xmlNodePtr	xmlNextElementSibling	(xmlNodePtr node)

    Finds the first closest next sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

    node:the current node
    Returns:the next element sibling or NULL if not available

    Function: xmlNodeAddContent

    void	xmlNodeAddContent		(xmlNodePtr cur, 
    const xmlChar * content)

    Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContent(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported.

    cur:the node being modified
    content:extra content

    Function: xmlNodeAddContentLen

    void	xmlNodeAddContentLen		(xmlNodePtr cur, 
    const xmlChar * content,
    int len)

    Append the extra substring to the node content. NOTE: In contrast to xmlNodeSetContentLen(), @content is supposed to be raw text, so unescaped XML special chars are allowed, entity references are not supported.

    cur:the node being modified
    content:extra content
    len:the size of @content

    Function: xmlNodeBufGetContent

    int	xmlNodeBufGetContent		(xmlBufferPtr buffer, 
    xmlNodePtr cur)

    Read the value of a node @cur, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted. Fills up the buffer @buffer with this value

    buffer:a buffer
    cur:the node being read
    Returns:0 in case of success and -1 in case of error.

    Function: xmlNodeDump

    int	xmlNodeDump			(xmlBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    int level,
    int format)

    Dump an XML node, recursive behaviour,children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called Since this is using xmlBuffer structures it is limited to 2GB and somehow deprecated, use xmlBufNodeDump() instead.

    buf:the XML buffer output
    doc:the document
    cur:the current node
    level:the imbrication level for indenting
    format:is formatting allowed
    Returns:the number of bytes written to the buffer or -1 in case of error

    Function: xmlNodeDumpOutput

    void	xmlNodeDumpOutput		(xmlOutputBufferPtr buf, 
    xmlDocPtr doc,
    xmlNodePtr cur,
    int level,
    int format,
    const char * encoding)

    Dump an XML node, recursive behaviour, children are printed too. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

    buf:the XML buffer output
    doc:the document
    cur:the current node
    level:the imbrication level for indenting
    format:is formatting allowed
    encoding:an optional encoding string

    Function: xmlNodeGetBase

    xmlChar *	xmlNodeGetBase		(xmlDocPtr doc, 
    xmlNodePtr cur)

    Searches for the BASE URL. The code should work on both XML and HTML document even if base mechanisms are completely different. It returns the base as defined in RFC 2396 sections 5.1.1. Base URI within Document Content and 5.1.2. Base URI from the Encapsulating Entity However it does not return the document base (5.1.3), use doc->URL in this case

    doc:the document the node pertains to
    cur:the node being checked
    Returns:a pointer to the base URL, or NULL if not found It's up to the caller to free the memory with xmlFree().

    Function: xmlNodeGetContent

    xmlChar *	xmlNodeGetContent	(xmlNodePtr cur)

    Read the value of a node, this can be either the text carried directly by this node if it's a TEXT node or the aggregate string of the values carried by this node child's (TEXT and ENTITY_REF). Entity references are substituted.

    cur:the node being read
    Returns:a new #xmlChar * or NULL if no content is available. It's up to the caller to free the memory with xmlFree().

    Function: xmlNodeGetLang

    xmlChar *	xmlNodeGetLang		(xmlNodePtr cur)

    Searches the language of a node, i.e. the values of the xml:lang attribute or the one carried by the nearest ancestor.

    cur:the node being checked
    Returns:a pointer to the lang value, or NULL if not found It's up to the caller to free the memory with xmlFree().

    Function: xmlNodeGetSpacePreserve

    int	xmlNodeGetSpacePreserve		(xmlNodePtr cur)

    Searches the space preserving behaviour of a node, i.e. the values of the xml:space attribute or the one carried by the nearest ancestor.

    cur:the node being checked
    Returns:-1 if xml:space is not inherited, 0 if "default", 1 if "preserve"

    Function: xmlNodeIsText

    int	xmlNodeIsText			(xmlNodePtr node)

    Is this node a Text node ?

    node:the node
    Returns:1 yes, 0 no

    Function: xmlNodeListGetRawString

    xmlChar *	xmlNodeListGetRawString	(xmlDocPtr doc, 
    xmlNodePtr list,
    int inLine)

    Builds the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString() this function doesn't do any character encoding handling.

    doc:the document
    list:a Node list
    inLine:should we replace entity contents or show their external form
    Returns:a pointer to the string copy, the caller must free it with xmlFree().

    Function: xmlNodeListGetString

    xmlChar *	xmlNodeListGetString	(xmlDocPtr doc, 
    xmlNodePtr list,
    int inLine)

    Build the string equivalent to the text contained in the Node list made of TEXTs and ENTITY_REFs

    doc:the document
    list:a Node list
    inLine:should we replace entity contents or show their external form
    Returns:a pointer to the string copy, the caller must free it with xmlFree().

    Function: xmlNodeSetBase

    void	xmlNodeSetBase			(xmlNodePtr cur, 
    const xmlChar * uri)

    Set (or reset) the base URI of a node, i.e. the value of the xml:base attribute.

    cur:the node being changed
    uri:the new base URI

    Function: xmlNodeSetContent

    void	xmlNodeSetContent		(xmlNodePtr cur, 
    const xmlChar * content)

    Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().

    cur:the node being modified
    content:the new value of the content

    Function: xmlNodeSetContentLen

    void	xmlNodeSetContentLen		(xmlNodePtr cur, 
    const xmlChar * content,
    int len)

    Replace the content of a node. NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity references, but XML special chars need to be escaped first by using xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().

    cur:the node being modified
    content:the new value of the content
    len:the size of @content

    Function: xmlNodeSetLang

    void	xmlNodeSetLang			(xmlNodePtr cur, 
    const xmlChar * lang)

    Set the language of a node, i.e. the values of the xml:lang attribute.

    cur:the node being changed
    lang:the language description

    Function: xmlNodeSetName

    void	xmlNodeSetName			(xmlNodePtr cur, 
    const xmlChar * name)

    Set (or reset) the name of a node.

    cur:the node being changed
    name:the new tag name

    Function: xmlNodeSetSpacePreserve

    void	xmlNodeSetSpacePreserve		(xmlNodePtr cur, 
    int val)

    Set (or reset) the space preserving behaviour of a node, i.e. the value of the xml:space attribute.

    cur:the node being changed
    val:the xml:space value ("0": default, 1: "preserve")

    Function: xmlPreviousElementSibling

    xmlNodePtr	xmlPreviousElementSibling	(xmlNodePtr node)

    Finds the first closest previous sibling of the node which is an element node. Note the handling of entities references is different than in the W3C DOM element traversal spec since we don't have back reference from entities content to entities references.

    node:the current node
    Returns:the previous element sibling or NULL if not available

    Function: xmlReconciliateNs

    int	xmlReconciliateNs		(xmlDocPtr doc, 
    xmlNodePtr tree)

    This function checks that all the namespaces declared within the given tree are properly declared. This is needed for example after Copy or Cut and then paste operations. The subtree may still hold pointers to namespace declarations outside the subtree or invalid/masked. As much as possible the function try to reuse the existing namespaces found in the new environment. If not possible the new namespaces are redeclared on @tree at the top of the given subtree.

    doc:the document
    tree:a node defining the subtree to reconciliate
    Returns:the number of namespace declarations created or -1 in case of error.

    Function: xmlRemoveProp

    int	xmlRemoveProp			(xmlAttrPtr cur)

    Unlink and free one attribute, all the content is freed too Note this doesn't work for namespace definition attributes

    cur:an attribute
    Returns:0 if success and -1 in case of error.

    Function: xmlReplaceNode

    xmlNodePtr	xmlReplaceNode		(xmlNodePtr old, 
    xmlNodePtr cur)

    Unlink the old node from its current context, prune the new one at the same place. If @cur was already inserted in a document it is first unlinked from its existing context.

    old:the old node
    cur:the node
    Returns:the @old node

    Function: xmlSaveFile

    int	xmlSaveFile			(const char * filename, 
    xmlDocPtr cur)

    Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used.

    filename:the filename (or URL)
    cur:the document
    Returns:the number of bytes written or -1 in case of failure.

    Function: xmlSaveFileEnc

    int	xmlSaveFileEnc			(const char * filename, 
    xmlDocPtr cur,
    const char * encoding)

    Dump an XML document, converting it to the given encoding

    filename:the filename (or URL)
    cur:the document
    encoding:the name of an encoding (or NULL)
    Returns:the number of bytes written or -1 in case of failure.

    Function: xmlSaveFileTo

    int	xmlSaveFileTo			(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding)

    Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.

    buf:an output I/O buffer
    cur:the document
    encoding:the encoding if any assuming the I/O layer handles the trancoding
    Returns:the number of bytes written or -1 in case of failure.

    Function: xmlSaveFormatFile

    int	xmlSaveFormatFile		(const char * filename, 
    xmlDocPtr cur,
    int format)

    Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used. If @format is set then the document will be indented on output. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

    filename:the filename (or URL)
    cur:the document
    format:should formatting spaces been added
    Returns:the number of bytes written or -1 in case of failure.

    Function: xmlSaveFormatFileEnc

    int	xmlSaveFormatFileEnc		(const char * filename, 
    xmlDocPtr cur,
    const char * encoding,
    int format)

    Dump an XML document to a file or an URL.

    filename:the filename or URL to output
    cur:the document being saved
    encoding:the name of the encoding to use or NULL.
    format:should formatting spaces be added.
    Returns:the number of bytes written or -1 in case of error. Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

    Function: xmlSaveFormatFileTo

    int	xmlSaveFormatFileTo		(xmlOutputBufferPtr buf, 
    xmlDocPtr cur,
    const char * encoding,
    int format)

    Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.

    buf:an output I/O buffer
    cur:the document
    encoding:the encoding if any assuming the I/O layer handles the trancoding
    format:should formatting spaces been added
    Returns:the number of bytes written or -1 in case of failure.

    Function: xmlSearchNs

    xmlNsPtr	xmlSearchNs		(xmlDocPtr doc, 
    xmlNodePtr node,
    const xmlChar * nameSpace)

    Search a Ns registered under a given name space for a document. recurse on the parents until it finds the defined namespace or return NULL otherwise. @nameSpace can be NULL, this is a search for the default namespace. We don't allow to cross entities boundaries. If you don't declare the namespace within those you will be in troubles !!! A warning is generated to cover this case.

    doc:the document
    node:the current node
    nameSpace:the namespace prefix
    Returns:the namespace pointer or NULL.

    Function: xmlSearchNsByHref

    xmlNsPtr	xmlSearchNsByHref	(xmlDocPtr doc, 
    xmlNodePtr node,
    const xmlChar * href)

    Search a Ns aliasing a given URI. Recurse on the parents until it finds the defined namespace or return NULL otherwise.

    doc:the document
    node:the current node
    href:the namespace value
    Returns:the namespace pointer or NULL.

    Function: xmlSetBufferAllocationScheme

    void	xmlSetBufferAllocationScheme	(xmlBufferAllocationScheme scheme)

    Set the buffer allocation method. Types are XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, improves performance

    scheme:allocation method to use

    Function: xmlSetCompressMode

    void	xmlSetCompressMode		(int mode)

    set the default compression mode used, ZLIB based Correct values: 0 (uncompressed) to 9 (max compression)

    mode:the compression ratio

    Function: xmlSetDocCompressMode

    void	xmlSetDocCompressMode		(xmlDocPtr doc, 
    int mode)

    set the compression ratio for a document, ZLIB based Correct values: 0 (uncompressed) to 9 (max compression)

    doc:the document
    mode:the compression ratio

    Function: xmlSetListDoc

    void	xmlSetListDoc			(xmlNodePtr list, 
    xmlDocPtr doc)

    update all nodes in the list to point to the right document

    list:the first element
    doc:the document

    Function: xmlSetNs

    void	xmlSetNs			(xmlNodePtr node, 
    xmlNsPtr ns)

    Associate a namespace to a node, a posteriori.

    node:a node in the document
    ns:a namespace pointer

    Function: xmlSetNsProp

    xmlAttrPtr	xmlSetNsProp		(xmlNodePtr node, 
    xmlNsPtr ns,
    const xmlChar * name,
    const xmlChar * value)

    Set (or reset) an attribute carried by a node. The ns structure must be in scope, this is not checked

    node:the node
    ns:the namespace definition
    name:the attribute name
    value:the attribute value
    Returns:the attribute pointer.

    Function: xmlSetProp

    xmlAttrPtr	xmlSetProp		(xmlNodePtr node, 
    const xmlChar * name,
    const xmlChar * value)

    Set (or reset) an attribute carried by a node. If @name has a prefix, then the corresponding namespace-binding will be used, if in scope; it is an error it there's no such ns-binding for the prefix in scope.

    node:the node
    name:the attribute name (a QName)
    value:the attribute value
    Returns:the attribute pointer.

    Function: xmlSetTreeDoc

    void	xmlSetTreeDoc			(xmlNodePtr tree, 
    xmlDocPtr doc)

    update all nodes under the tree to point to the right document

    tree:the top element
    doc:the document

    Function: xmlSplitQName2

    xmlChar *	xmlSplitQName2		(const xmlChar * name, 
    xmlChar ** prefix)

    parse an XML qualified name string [NS 5] QName ::= (Prefix ':')? LocalPart [NS 6] Prefix ::= NCName [NS 7] LocalPart ::= NCName

    name:the full QName
    prefix:a xmlChar **
    Returns:NULL if not a QName, otherwise the local part, and prefix is updated to get the Prefix if any.

    Function: xmlSplitQName3

    const xmlChar *	xmlSplitQName3		(const xmlChar * name, 
    int * len)

    parse an XML qualified name string,i

    name:the full QName
    len:an int *
    Returns:NULL if it is not a Qualified Name, otherwise, update len with the length in byte of the prefix and return a pointer to the start of the name without the prefix

    Function: xmlStringGetNodeList

    xmlNodePtr	xmlStringGetNodeList	(xmlDocPtr doc, 
    const xmlChar * value)

    Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs.

    doc:the document
    value:the value of the attribute
    Returns:a pointer to the first child

    Function: xmlStringLenGetNodeList

    xmlNodePtr	xmlStringLenGetNodeList	(xmlDocPtr doc, 
    const xmlChar * value,
    int len)

    Parse the value string and build the node list associated. Should produce a flat tree with only TEXTs and ENTITY_REFs.

    doc:the document
    value:the value of the text
    len:the length of the string value
    Returns:a pointer to the first child

    Function: xmlTextConcat

    int	xmlTextConcat			(xmlNodePtr node, 
    const xmlChar * content,
    int len)

    Concat the given string at the end of the existing node content

    node:the node
    content:the content
    len:@content length
    Returns:-1 in case of error, 0 otherwise

    Function: xmlTextMerge

    xmlNodePtr	xmlTextMerge		(xmlNodePtr first, 
    xmlNodePtr second)

    Merge two text nodes into one

    first:the first text node
    second:the second text node being merged
    Returns:the first text node augmented

    Function: xmlUnlinkNode

    void	xmlUnlinkNode			(xmlNodePtr cur)

    Unlink a node from it's current context, the node is not freed If one need to free the node, use xmlFreeNode() routine after the unlink to discard it. Note that namespace nodes can't be unlinked as they do not have pointer to their parent.

    cur:the node

    Function: xmlUnsetNsProp

    int	xmlUnsetNsProp			(xmlNodePtr node, 
    xmlNsPtr ns,
    const xmlChar * name)

    Remove an attribute carried by a node.

    node:the node
    ns:the namespace definition
    name:the attribute name
    Returns:0 if successful, -1 if not found

    Function: xmlUnsetProp

    int	xmlUnsetProp			(xmlNodePtr node, 
    const xmlChar * name)

    Remove an attribute carried by a node. This handles only attributes in no namespace.

    node:the node
    name:the attribute name
    Returns:0 if successful, -1 if not found

    Function: xmlValidateNCName

    int	xmlValidateNCName		(const xmlChar * value, 
    int space)

    Check that a value conforms to the lexical space of NCName

    value:the value to check
    space:allow spaces in front and end of the string
    Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlValidateNMToken

    int	xmlValidateNMToken		(const xmlChar * value, 
    int space)

    Check that a value conforms to the lexical space of NMToken

    value:the value to check
    space:allow spaces in front and end of the string
    Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlValidateName

    int	xmlValidateName			(const xmlChar * value, 
    int space)

    Check that a value conforms to the lexical space of Name

    value:the value to check
    space:allow spaces in front and end of the string
    Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlValidateQName

    int	xmlValidateQName		(const xmlChar * value, 
    int space)

    Check that a value conforms to the lexical space of QName

    value:the value to check
    space:allow spaces in front and end of the string
    Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xpointer.html0000644000175000017500000007225212134171043020314 0ustar aronaron Module xpointer from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xpointer from libxml2

    API Menu
    API Indexes
    Related links

    API to handle XML Pointers Base implementation was made accordingly to W3C Candidate Recommendation 7 June 2000

    Table of Contents

    Structure xmlLocationSet
    struct _xmlLocationSet
    Typedef xmlLocationSet * xmlLocationSetPtr
    
    xmlNodePtr	xmlXPtrBuildNodeList	(xmlXPathObjectPtr obj)
    xmlXPathObjectPtr	xmlXPtrEval	(const xmlChar * str, 
    xmlXPathContextPtr ctx)
    void	xmlXPtrEvalRangePredicate	(xmlXPathParserContextPtr ctxt)
    void	xmlXPtrFreeLocationSet		(xmlLocationSetPtr obj)
    void	xmlXPtrLocationSetAdd		(xmlLocationSetPtr cur, 
    xmlXPathObjectPtr val)
    xmlLocationSetPtr	xmlXPtrLocationSetCreate	(xmlXPathObjectPtr val)
    void	xmlXPtrLocationSetDel		(xmlLocationSetPtr cur, 
    xmlXPathObjectPtr val)
    xmlLocationSetPtr	xmlXPtrLocationSetMerge	(xmlLocationSetPtr val1, 
    xmlLocationSetPtr val2)
    void	xmlXPtrLocationSetRemove	(xmlLocationSetPtr cur, 
    int val)
    xmlXPathObjectPtr	xmlXPtrNewCollapsedRange	(xmlNodePtr start)
    xmlXPathContextPtr	xmlXPtrNewContext	(xmlDocPtr doc, 
    xmlNodePtr here,
    xmlNodePtr origin)
    xmlXPathObjectPtr	xmlXPtrNewLocationSetNodeSet	(xmlNodeSetPtr set)
    xmlXPathObjectPtr	xmlXPtrNewLocationSetNodes	(xmlNodePtr start, 
    xmlNodePtr end)
    xmlXPathObjectPtr	xmlXPtrNewRange	(xmlNodePtr start, 
    int startindex,
    xmlNodePtr end,
    int endindex)
    xmlXPathObjectPtr	xmlXPtrNewRangeNodeObject	(xmlNodePtr start, 
    xmlXPathObjectPtr end)
    xmlXPathObjectPtr	xmlXPtrNewRangeNodePoint	(xmlNodePtr start, 
    xmlXPathObjectPtr end)
    xmlXPathObjectPtr	xmlXPtrNewRangeNodes	(xmlNodePtr start, 
    xmlNodePtr end)
    xmlXPathObjectPtr	xmlXPtrNewRangePointNode	(xmlXPathObjectPtr start, 
    xmlNodePtr end)
    xmlXPathObjectPtr	xmlXPtrNewRangePoints	(xmlXPathObjectPtr start, 
    xmlXPathObjectPtr end)
    void	xmlXPtrRangeToFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    xmlXPathObjectPtr	xmlXPtrWrapLocationSet	(xmlLocationSetPtr val)

    Description

    Structure xmlLocationSet

    Structure xmlLocationSet
    struct _xmlLocationSet { int locNr : number of locations in the set int locMax : size of the array as allocated xmlXPathObjectPtr * locTab : array of locations }

    Function: xmlXPtrBuildNodeList

    xmlNodePtr	xmlXPtrBuildNodeList	(xmlXPathObjectPtr obj)

    Build a node list tree copy of the XPointer result. This will drop Attributes and Namespace declarations.

    obj:the XPointer result from the evaluation.
    Returns:an xmlNodePtr list or NULL. the caller has to free the node tree.

    Function: xmlXPtrEval

    xmlXPathObjectPtr	xmlXPtrEval	(const xmlChar * str, 
    xmlXPathContextPtr ctx)

    Evaluate the XPath Location Path in the given context.

    str:the XPointer expression
    ctx:the XPointer context
    Returns:the xmlXPathObjectPtr resulting from the evaluation or NULL. the caller has to free the object.

    Function: xmlXPtrEvalRangePredicate

    void	xmlXPtrEvalRangePredicate	(xmlXPathParserContextPtr ctxt)

    [8] Predicate ::= '[' PredicateExpr ']' [9] PredicateExpr ::= Expr Evaluate a predicate as in xmlXPathEvalPredicate() but for a Location Set instead of a node set

    ctxt:the XPointer Parser context

    Function: xmlXPtrFreeLocationSet

    void	xmlXPtrFreeLocationSet		(xmlLocationSetPtr obj)

    Free the LocationSet compound (not the actual ranges !).

    obj:the xmlLocationSetPtr to free

    Function: xmlXPtrLocationSetAdd

    void	xmlXPtrLocationSetAdd		(xmlLocationSetPtr cur, 
    xmlXPathObjectPtr val)

    add a new xmlXPathObjectPtr to an existing LocationSet If the location already exist in the set @val is freed.

    cur:the initial range set
    val:a new xmlXPathObjectPtr

    Function: xmlXPtrLocationSetCreate

    xmlLocationSetPtr	xmlXPtrLocationSetCreate	(xmlXPathObjectPtr val)

    Create a new xmlLocationSetPtr of type double and of value @val

    val:an initial xmlXPathObjectPtr, or NULL
    Returns:the newly created object.

    Function: xmlXPtrLocationSetDel

    void	xmlXPtrLocationSetDel		(xmlLocationSetPtr cur, 
    xmlXPathObjectPtr val)

    Removes an xmlXPathObjectPtr from an existing LocationSet

    cur:the initial range set
    val:an xmlXPathObjectPtr

    Function: xmlXPtrLocationSetMerge

    xmlLocationSetPtr	xmlXPtrLocationSetMerge	(xmlLocationSetPtr val1, 
    xmlLocationSetPtr val2)

    Merges two rangesets, all ranges from @val2 are added to @val1

    val1:the first LocationSet
    val2:the second LocationSet
    Returns:val1 once extended or NULL in case of error.

    Function: xmlXPtrLocationSetRemove

    void	xmlXPtrLocationSetRemove	(xmlLocationSetPtr cur, 
    int val)

    Removes an entry from an existing LocationSet list.

    cur:the initial range set
    val:the index to remove

    Function: xmlXPtrNewCollapsedRange

    xmlXPathObjectPtr	xmlXPtrNewCollapsedRange	(xmlNodePtr start)

    Create a new xmlXPathObjectPtr of type range using a single nodes

    start:the starting and ending node
    Returns:the newly created object.

    Function: xmlXPtrNewContext

    xmlXPathContextPtr	xmlXPtrNewContext	(xmlDocPtr doc, 
    xmlNodePtr here,
    xmlNodePtr origin)

    Create a new XPointer context

    doc:the XML document
    here:the node that directly contains the XPointer being evaluated or NULL
    origin:the element from which a user or program initiated traversal of the link, or NULL.
    Returns:the xmlXPathContext just allocated.

    Function: xmlXPtrNewLocationSetNodeSet

    xmlXPathObjectPtr	xmlXPtrNewLocationSetNodeSet	(xmlNodeSetPtr set)

    Create a new xmlXPathObjectPtr of type LocationSet and initialize it with all the nodes from @set

    set:a node set
    Returns:the newly created object.

    Function: xmlXPtrNewLocationSetNodes

    xmlXPathObjectPtr	xmlXPtrNewLocationSetNodes	(xmlNodePtr start, 
    xmlNodePtr end)

    Create a new xmlXPathObjectPtr of type LocationSet and initialize it with the single range made of the two nodes @start and @end

    start:the start NodePtr value
    end:the end NodePtr value or NULL
    Returns:the newly created object.

    Function: xmlXPtrNewRange

    xmlXPathObjectPtr	xmlXPtrNewRange	(xmlNodePtr start, 
    int startindex,
    xmlNodePtr end,
    int endindex)

    Create a new xmlXPathObjectPtr of type range

    start:the starting node
    startindex:the start index
    end:the ending point
    endindex:the ending index
    Returns:the newly created object.

    Function: xmlXPtrNewRangeNodeObject

    xmlXPathObjectPtr	xmlXPtrNewRangeNodeObject	(xmlNodePtr start, 
    xmlXPathObjectPtr end)

    Create a new xmlXPathObjectPtr of type range from a not to an object

    start:the starting node
    end:the ending object
    Returns:the newly created object.

    Function: xmlXPtrNewRangeNodePoint

    xmlXPathObjectPtr	xmlXPtrNewRangeNodePoint	(xmlNodePtr start, 
    xmlXPathObjectPtr end)

    Create a new xmlXPathObjectPtr of type range from a node to a point

    start:the starting node
    end:the ending point
    Returns:the newly created object.

    Function: xmlXPtrNewRangeNodes

    xmlXPathObjectPtr	xmlXPtrNewRangeNodes	(xmlNodePtr start, 
    xmlNodePtr end)

    Create a new xmlXPathObjectPtr of type range using 2 nodes

    start:the starting node
    end:the ending node
    Returns:the newly created object.

    Function: xmlXPtrNewRangePointNode

    xmlXPathObjectPtr	xmlXPtrNewRangePointNode	(xmlXPathObjectPtr start, 
    xmlNodePtr end)

    Create a new xmlXPathObjectPtr of type range from a point to a node

    start:the starting point
    end:the ending node
    Returns:the newly created object.

    Function: xmlXPtrNewRangePoints

    xmlXPathObjectPtr	xmlXPtrNewRangePoints	(xmlXPathObjectPtr start, 
    xmlXPathObjectPtr end)

    Create a new xmlXPathObjectPtr of type range using 2 Points

    start:the starting point
    end:the ending point
    Returns:the newly created object.

    Function: xmlXPtrRangeToFunction

    void	xmlXPtrRangeToFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the range-to() XPointer function

    ctxt:the XPointer Parser context
    nargs:the number of args

    Function: xmlXPtrWrapLocationSet

    xmlXPathObjectPtr	xmlXPtrWrapLocationSet	(xmlLocationSetPtr val)

    Wrap the LocationSet @val in a new xmlXPathObjectPtr

    val:the LocationSet value
    Returns:the newly created object.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlmemory.html0000644000175000017500000007104012134171042020466 0ustar aronaron Module xmlmemory from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlmemory from libxml2

    API Menu
    API Indexes
    Related links

    provides interfaces for the memory allocator, including debugging capabilities.

    Table of Contents

    #define DEBUG_MEMORY
    Variable xmlMallocFunc xmlMalloc
    
    
    Variable xmlMallocFunc xmlMallocAtomic
    
    
    Variable xmlStrdupFunc xmlMemStrdup
    
    
    Variable xmlReallocFunc xmlRealloc
    
    
    void	xmlCleanupMemory		(void)
    Function type: xmlFreeFunc
    void	xmlFreeFunc			(void * mem)
    
    int	xmlGcMemGet			(xmlFreeFunc * freeFunc, 
    xmlMallocFunc * mallocFunc,
    xmlMallocFunc * mallocAtomicFunc,
    xmlReallocFunc * reallocFunc,
    xmlStrdupFunc * strdupFunc)
    int	xmlGcMemSetup			(xmlFreeFunc freeFunc, 
    xmlMallocFunc mallocFunc,
    xmlMallocFunc mallocAtomicFunc,
    xmlReallocFunc reallocFunc,
    xmlStrdupFunc strdupFunc)
    int	xmlInitMemory			(void)
    void *	xmlMallocAtomicLoc		(size_t size, 
    const char * file,
    int line)
    Function type: xmlMallocFunc
    void *	xmlMallocFunc			(size_t size)
    
    void *	xmlMallocLoc			(size_t size, 
    const char * file,
    int line)
    int	xmlMemBlocks			(void)
    void	xmlMemDisplay			(FILE * fp)
    void	xmlMemDisplayLast		(FILE * fp, 
    long nbBytes)
    void	xmlMemFree			(void * ptr)
    int	xmlMemGet			(xmlFreeFunc * freeFunc, 
    xmlMallocFunc * mallocFunc,
    xmlReallocFunc * reallocFunc,
    xmlStrdupFunc * strdupFunc)
    void *	xmlMemMalloc			(size_t size)
    void *	xmlMemRealloc			(void * ptr, 
    size_t size)
    int	xmlMemSetup			(xmlFreeFunc freeFunc, 
    xmlMallocFunc mallocFunc,
    xmlReallocFunc reallocFunc,
    xmlStrdupFunc strdupFunc)
    void	xmlMemShow			(FILE * fp, 
    int nr)
    char *	xmlMemStrdupLoc			(const char * str, 
    const char * file,
    int line)
    int	xmlMemUsed			(void)
    void	xmlMemoryDump			(void)
    char *	xmlMemoryStrdup			(const char * str)
    Function type: xmlReallocFunc
    void *	xmlReallocFunc			(void * mem, 
    size_t size)
    void *	xmlReallocLoc			(void * ptr, 
    size_t size,
    const char * file,
    int line)
    Function type: xmlStrdupFunc
    char *	xmlStrdupFunc			(const char * str)
    

    Description

    Macro: DEBUG_MEMORY

    #define DEBUG_MEMORY

    DEBUG_MEMORY replaces the allocator with a collect and debug shell to the libc allocator. DEBUG_MEMORY should only be activated when debugging libxml i.e. if libxml has been configured with --with-debug-mem too. #define DEBUG_MEMORY_FREED #define DEBUG_MEMORY_LOCATION

    Function: xmlCleanupMemory

    void	xmlCleanupMemory		(void)

    Free up all the memory allocated by the library for its own use. This should not be called by user level code.

    Function type: xmlFreeFunc

    Function type: xmlFreeFunc
    void	xmlFreeFunc			(void * mem)
    

    Signature for a free() implementation.

    mem:an already allocated block of memory

    Function: xmlGcMemGet

    int	xmlGcMemGet			(xmlFreeFunc * freeFunc, 
    xmlMallocFunc * mallocFunc,
    xmlMallocFunc * mallocAtomicFunc,
    xmlReallocFunc * reallocFunc,
    xmlStrdupFunc * strdupFunc)

    Provides the memory access functions set currently in use The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators

    freeFunc:place to save the free() function in use
    mallocFunc:place to save the malloc() function in use
    mallocAtomicFunc:place to save the atomic malloc() function in use
    reallocFunc:place to save the realloc() function in use
    strdupFunc:place to save the strdup() function in use
    Returns:0 on success

    Function: xmlGcMemSetup

    int	xmlGcMemSetup			(xmlFreeFunc freeFunc, 
    xmlMallocFunc mallocFunc,
    xmlMallocFunc mallocAtomicFunc,
    xmlReallocFunc reallocFunc,
    xmlStrdupFunc strdupFunc)

    Override the default memory access functions with a new set This has to be called before any other libxml routines ! The mallocAtomicFunc is specialized for atomic block allocations (i.e. of areas useful for garbage collected memory allocators Should this be blocked if there was already some allocations done ?

    freeFunc:the free() function to use
    mallocFunc:the malloc() function to use
    mallocAtomicFunc:the malloc() function to use for atomic allocations
    reallocFunc:the realloc() function to use
    strdupFunc:the strdup() function to use
    Returns:0 on success

    Function: xmlInitMemory

    int	xmlInitMemory			(void)

    Initialize the memory layer.

    Returns:0 on success

    Function: xmlMallocAtomicLoc

    void *	xmlMallocAtomicLoc		(size_t size, 
    const char * file,
    int line)

    a malloc() equivalent, with logging of the allocation info.

    size:an int specifying the size in byte to allocate.
    file:the file name or NULL
    line:the line number
    Returns:a pointer to the allocated area or NULL in case of lack of memory.

    Function type: xmlMallocFunc

    Function type: xmlMallocFunc
    void *	xmlMallocFunc			(size_t size)
    

    Signature for a malloc() implementation.

    size:the size requested in bytes
    Returns:a pointer to the newly allocated block or NULL in case of error.

    Function: xmlMallocLoc

    void *	xmlMallocLoc			(size_t size, 
    const char * file,
    int line)

    a malloc() equivalent, with logging of the allocation info.

    size:an int specifying the size in byte to allocate.
    file:the file name or NULL
    line:the line number
    Returns:a pointer to the allocated area or NULL in case of lack of memory.

    Function: xmlMemBlocks

    int	xmlMemBlocks			(void)

    Provides the number of memory areas currently allocated

    Returns:an int representing the number of blocks

    Function: xmlMemDisplay

    void	xmlMemDisplay			(FILE * fp)

    show in-extenso the memory blocks allocated

    fp:a FILE descriptor used as the output file, if NULL, the result is written to the file .memorylist

    Function: xmlMemDisplayLast

    void	xmlMemDisplayLast		(FILE * fp, 
    long nbBytes)

    the last nbBytes of memory allocated and not freed, useful for dumping the memory left allocated between two places at runtime.

    fp:a FILE descriptor used as the output file, if NULL, the result is written to the file .memorylist
    nbBytes:the amount of memory to dump

    Function: xmlMemFree

    void	xmlMemFree			(void * ptr)

    a free() equivalent, with error checking.

    ptr:the memory block pointer

    Function: xmlMemGet

    int	xmlMemGet			(xmlFreeFunc * freeFunc, 
    xmlMallocFunc * mallocFunc,
    xmlReallocFunc * reallocFunc,
    xmlStrdupFunc * strdupFunc)

    Provides the memory access functions set currently in use

    freeFunc:place to save the free() function in use
    mallocFunc:place to save the malloc() function in use
    reallocFunc:place to save the realloc() function in use
    strdupFunc:place to save the strdup() function in use
    Returns:0 on success

    Function: xmlMemMalloc

    void *	xmlMemMalloc			(size_t size)

    a malloc() equivalent, with logging of the allocation info.

    size:an int specifying the size in byte to allocate.
    Returns:a pointer to the allocated area or NULL in case of lack of memory.

    Function: xmlMemRealloc

    void *	xmlMemRealloc			(void * ptr, 
    size_t size)

    a realloc() equivalent, with logging of the allocation info.

    ptr:the initial memory block pointer
    size:an int specifying the size in byte to allocate.
    Returns:a pointer to the allocated area or NULL in case of lack of memory.

    Function: xmlMemSetup

    int	xmlMemSetup			(xmlFreeFunc freeFunc, 
    xmlMallocFunc mallocFunc,
    xmlReallocFunc reallocFunc,
    xmlStrdupFunc strdupFunc)

    Override the default memory access functions with a new set This has to be called before any other libxml routines ! Should this be blocked if there was already some allocations done ?

    freeFunc:the free() function to use
    mallocFunc:the malloc() function to use
    reallocFunc:the realloc() function to use
    strdupFunc:the strdup() function to use
    Returns:0 on success

    Function: xmlMemShow

    void	xmlMemShow			(FILE * fp, 
    int nr)

    show a show display of the memory allocated, and dump the @nr last allocated areas which were not freed

    fp:a FILE descriptor used as the output file
    nr:number of entries to dump

    Function: xmlMemStrdupLoc

    char *	xmlMemStrdupLoc			(const char * str, 
    const char * file,
    int line)

    a strdup() equivalent, with logging of the allocation info.

    str:the initial string pointer
    file:the file name or NULL
    line:the line number
    Returns:a pointer to the new string or NULL if allocation error occurred.

    Function: xmlMemUsed

    int	xmlMemUsed			(void)

    Provides the amount of memory currently allocated

    Returns:an int representing the amount of memory allocated.

    Function: xmlMemoryDump

    void	xmlMemoryDump			(void)

    Dump in-extenso the memory blocks allocated to the file .memorylist

    Function: xmlMemoryStrdup

    char *	xmlMemoryStrdup			(const char * str)

    a strdup() equivalent, with logging of the allocation info.

    str:the initial string pointer
    Returns:a pointer to the new string or NULL if allocation error occurred.

    Function type: xmlReallocFunc

    Function type: xmlReallocFunc
    void *	xmlReallocFunc			(void * mem, 
    size_t size)

    Signature for a realloc() implementation.

    mem:an already allocated block of memory
    size:the new size requested in bytes
    Returns:a pointer to the newly reallocated block or NULL in case of error.

    Function: xmlReallocLoc

    void *	xmlReallocLoc			(void * ptr, 
    size_t size,
    const char * file,
    int line)

    a realloc() equivalent, with logging of the allocation info.

    ptr:the initial memory block pointer
    size:an int specifying the size in byte to allocate.
    file:the file name or NULL
    line:the line number
    Returns:a pointer to the allocated area or NULL in case of lack of memory.

    Function type: xmlStrdupFunc

    Function type: xmlStrdupFunc
    char *	xmlStrdupFunc			(const char * str)
    

    Signature for an strdup() implementation.

    str:a zero terminated string
    Returns:the copy of the string or NULL in case of error.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-HTMLparser.html0000644000175000017500000016507012134171042020425 0ustar aronaron Module HTMLparser from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module HTMLparser from libxml2

    API Menu
    API Indexes
    Related links

    this module implements an HTML 4.0 non-verifying parser with API compatible with the XML parser ones. It should be able to parse "real world" HTML, even if severely broken from a specification point of view.

    Table of Contents

    #define htmlDefaultSubelement
    #define htmlElementAllowedHereDesc
    #define htmlRequiredAttrs
    Typedef xmlDocPtr htmlDocPtr
    
    Structure htmlElemDesc
    struct _htmlElemDesc
    Typedef htmlElemDesc * htmlElemDescPtr
    
    Structure htmlEntityDesc
    struct _htmlEntityDesc
    Typedef htmlEntityDesc * htmlEntityDescPtr
    
    Typedef xmlNodePtr htmlNodePtr
    
    Typedef xmlParserCtxt htmlParserCtxt
    
    Typedef xmlParserCtxtPtr htmlParserCtxtPtr
    
    Typedef xmlParserInput htmlParserInput
    
    Typedef xmlParserInputPtr htmlParserInputPtr
    
    Typedef xmlParserNodeInfo htmlParserNodeInfo
    
    Enum htmlParserOption
    
    Typedef xmlSAXHandler htmlSAXHandler
    
    Typedef xmlSAXHandlerPtr htmlSAXHandlerPtr
    
    Enum htmlStatus
    
    int	UTF8ToHtml			(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)
    htmlStatus	htmlAttrAllowed		(const htmlElemDesc * elt, 
    const xmlChar * attr,
    int legacy)
    int	htmlAutoCloseTag		(htmlDocPtr doc, 
    const xmlChar * name,
    htmlNodePtr elem)
    htmlParserCtxtPtr	htmlCreateMemoryParserCtxt	(const char * buffer, 
    int size)
    htmlParserCtxtPtr	htmlCreatePushParserCtxt	(htmlSAXHandlerPtr sax, 
    void * user_data,
    const char * chunk,
    int size,
    const char * filename,
    xmlCharEncoding enc)
    htmlDocPtr	htmlCtxtReadDoc		(htmlParserCtxtPtr ctxt, 
    const xmlChar * cur,
    const char * URL,
    const char * encoding,
    int options)
    htmlDocPtr	htmlCtxtReadFd		(htmlParserCtxtPtr ctxt, 
    int fd,
    const char * URL,
    const char * encoding,
    int options)
    htmlDocPtr	htmlCtxtReadFile	(htmlParserCtxtPtr ctxt, 
    const char * filename,
    const char * encoding,
    int options)
    htmlDocPtr	htmlCtxtReadIO		(htmlParserCtxtPtr ctxt, 
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)
    htmlDocPtr	htmlCtxtReadMemory	(htmlParserCtxtPtr ctxt, 
    const char * buffer,
    int size,
    const char * URL,
    const char * encoding,
    int options)
    void	htmlCtxtReset			(htmlParserCtxtPtr ctxt)
    int	htmlCtxtUseOptions		(htmlParserCtxtPtr ctxt, 
    int options)
    int	htmlElementAllowedHere		(const htmlElemDesc * parent, 
    const xmlChar * elt)
    htmlStatus	htmlElementStatusHere	(const htmlElemDesc * parent, 
    const htmlElemDesc * elt)
    int	htmlEncodeEntities		(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen,
    int quoteChar)
    const htmlEntityDesc *	htmlEntityLookup	(const xmlChar * name)
    const htmlEntityDesc *	htmlEntityValueLookup	(unsigned int value)
    void	htmlFreeParserCtxt		(htmlParserCtxtPtr ctxt)
    int	htmlHandleOmittedElem		(int val)
    int	htmlIsAutoClosed		(htmlDocPtr doc, 
    htmlNodePtr elem)
    int	htmlIsScriptAttribute		(const xmlChar * name)
    htmlParserCtxtPtr	htmlNewParserCtxt	(void)
    htmlStatus	htmlNodeStatus		(const htmlNodePtr node, 
    int legacy)
    int	htmlParseCharRef		(htmlParserCtxtPtr ctxt)
    int	htmlParseChunk			(htmlParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    int terminate)
    htmlDocPtr	htmlParseDoc		(xmlChar * cur, 
    const char * encoding)
    int	htmlParseDocument		(htmlParserCtxtPtr ctxt)
    void	htmlParseElement		(htmlParserCtxtPtr ctxt)
    const htmlEntityDesc *	htmlParseEntityRef	(htmlParserCtxtPtr ctxt, 
    const xmlChar ** str)
    htmlDocPtr	htmlParseFile		(const char * filename, 
    const char * encoding)
    htmlDocPtr	htmlReadDoc		(const xmlChar * cur, 
    const char * URL,
    const char * encoding,
    int options)
    htmlDocPtr	htmlReadFd		(int fd, 
    const char * URL,
    const char * encoding,
    int options)
    htmlDocPtr	htmlReadFile		(const char * filename, 
    const char * encoding,
    int options)
    htmlDocPtr	htmlReadIO		(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)
    htmlDocPtr	htmlReadMemory		(const char * buffer, 
    int size,
    const char * URL,
    const char * encoding,
    int options)
    htmlDocPtr	htmlSAXParseDoc		(xmlChar * cur, 
    const char * encoding,
    htmlSAXHandlerPtr sax,
    void * userData)
    htmlDocPtr	htmlSAXParseFile	(const char * filename, 
    const char * encoding,
    htmlSAXHandlerPtr sax,
    void * userData)
    const htmlElemDesc *	htmlTagLookup	(const xmlChar * tag)

    Description

    Macro: htmlDefaultSubelement

    #define htmlDefaultSubelement

    Returns the default subelement for this element

    Macro: htmlElementAllowedHereDesc

    #define htmlElementAllowedHereDesc

    Checks whether an HTML element description may be a direct child of the specified element. Returns 1 if allowed; 0 otherwise.

    Macro: htmlRequiredAttrs

    #define htmlRequiredAttrs

    Returns the attributes required for the specified element.

    Structure htmlElemDesc

    Structure htmlElemDesc
    struct _htmlElemDesc { const char * name : The tag name char startTag : Whether the start tag can be implied char endTag : Whether the end tag can be implied char saveEndTag : Whether the end tag should be saved char empty : Is this an empty element ? char depr : Is this a deprecated element ? char dtd : 1: only in Loose DTD, 2: only Frameset char isinline : is this a block 0 or inline 1 element const char * desc : the description NRK Jan.2003 * New fiel const char ** subelts : allowed sub-elements of this element const char * defaultsubelt : subelement for suggested auto-repair if const char ** attrs_opt : Optional Attributes const char ** attrs_depr : Additional deprecated attributes const char ** attrs_req : Required attributes }

    Structure htmlEntityDesc

    Structure htmlEntityDesc
    struct _htmlEntityDesc { unsigned int value : the UNICODE value for the character const char * name : The entity name const char * desc : the description }

    Enum htmlParserOption

    Enum htmlParserOption {
        HTML_PARSE_RECOVER = 1 : Relaxed parsing
        HTML_PARSE_NODEFDTD = 4 : do not default a doctype if not found
        HTML_PARSE_NOERROR = 32 : suppress error reports
        HTML_PARSE_NOWARNING = 64 : suppress warning reports
        HTML_PARSE_PEDANTIC = 128 : pedantic error reporting
        HTML_PARSE_NOBLANKS = 256 : remove blank nodes
        HTML_PARSE_NONET = 2048 : Forbid network access
        HTML_PARSE_NOIMPLIED = 8192 : Do not add implied html/body... elements
        HTML_PARSE_COMPACT = 65536 : compact small text nodes
        HTML_PARSE_IGNORE_ENC = 2097152 : ignore internal document encoding hint
    }
    

    Enum htmlStatus

    Enum htmlStatus {
        HTML_NA = 0 : something we don't check at all
        HTML_INVALID = 1
        HTML_DEPRECATED = 2
        HTML_VALID = 4
        HTML_REQUIRED = 12 : VALID bit set so ( & HTML_VALID ) is TRUE
    }
    

    Function: UTF8ToHtml

    int	UTF8ToHtml			(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)

    Take a block of UTF-8 chars in and try to convert it to an ASCII plus HTML entities block of chars out.

    out:a pointer to an array of bytes to store the result
    outlen:the length of @out
    in:a pointer to an array of UTF-8 chars
    inlen:the length of @in
    Returns:0 if success, -2 if the transcoding fails, or -1 otherwise The value of @inlen after return is the number of octets consumed as the return value is positive, else unpredictable. The value of @outlen after return is the number of octets consumed.

    Function: htmlAttrAllowed

    htmlStatus	htmlAttrAllowed		(const htmlElemDesc * elt, 
    const xmlChar * attr,
    int legacy)

    Checks whether an attribute is valid for an element Has full knowledge of Required and Deprecated attributes

    elt:HTML element
    attr:HTML attribute
    legacy:whether to allow deprecated attributes
    Returns:one of HTML_REQUIRED, HTML_VALID, HTML_DEPRECATED, HTML_INVALID

    Function: htmlAutoCloseTag

    int	htmlAutoCloseTag		(htmlDocPtr doc, 
    const xmlChar * name,
    htmlNodePtr elem)

    The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if the element or one of it's children would autoclose the given tag.

    doc:the HTML document
    name:The tag name
    elem:the HTML element
    Returns:1 if autoclose, 0 otherwise

    Function: htmlCreateMemoryParserCtxt

    htmlParserCtxtPtr	htmlCreateMemoryParserCtxt	(const char * buffer, 
    int size)

    Create a parser context for an HTML in-memory document.

    buffer:a pointer to a char array
    size:the size of the array
    Returns:the new parser context or NULL

    Function: htmlCreatePushParserCtxt

    htmlParserCtxtPtr	htmlCreatePushParserCtxt	(htmlSAXHandlerPtr sax, 
    void * user_data,
    const char * chunk,
    int size,
    const char * filename,
    xmlCharEncoding enc)

    Create a parser context for using the HTML parser in push mode The value of @filename is used for fetching external entities and error/warning reports.

    sax:a SAX handler
    user_data:The user data returned on SAX callbacks
    chunk:a pointer to an array of chars
    size:number of chars in the array
    filename:an optional file name or URI
    enc:an optional encoding
    Returns:the new parser context or NULL

    Function: htmlCtxtReadDoc

    htmlDocPtr	htmlCtxtReadDoc		(htmlParserCtxtPtr ctxt, 
    const xmlChar * cur,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

    ctxt:an HTML parser context
    cur:a pointer to a zero terminated string
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlCtxtReadFd

    htmlDocPtr	htmlCtxtReadFd		(htmlParserCtxtPtr ctxt, 
    int fd,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context

    ctxt:an HTML parser context
    fd:an open file descriptor
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlCtxtReadFile

    htmlDocPtr	htmlCtxtReadFile	(htmlParserCtxtPtr ctxt, 
    const char * filename,
    const char * encoding,
    int options)

    parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context

    ctxt:an HTML parser context
    filename:a file or URL
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlCtxtReadIO

    htmlDocPtr	htmlCtxtReadIO		(htmlParserCtxtPtr ctxt, 
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)

    parse an HTML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context

    ctxt:an HTML parser context
    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlCtxtReadMemory

    htmlDocPtr	htmlCtxtReadMemory	(htmlParserCtxtPtr ctxt, 
    const char * buffer,
    int size,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

    ctxt:an HTML parser context
    buffer:a pointer to a char array
    size:the size of the array
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlCtxtReset

    void	htmlCtxtReset			(htmlParserCtxtPtr ctxt)

    Reset a parser context

    ctxt:an HTML parser context

    Function: htmlCtxtUseOptions

    int	htmlCtxtUseOptions		(htmlParserCtxtPtr ctxt, 
    int options)

    Applies the options to the parser context

    ctxt:an HTML parser context
    options:a combination of htmlParserOption(s)
    Returns:0 in case of success, the set of unknown or unimplemented options in case of error.

    Function: htmlElementAllowedHere

    int	htmlElementAllowedHere		(const htmlElemDesc * parent, 
    const xmlChar * elt)

    Checks whether an HTML element may be a direct child of a parent element. Note - doesn't check for deprecated elements

    parent:HTML parent element
    elt:HTML element
    Returns:1 if allowed; 0 otherwise.

    Function: htmlElementStatusHere

    htmlStatus	htmlElementStatusHere	(const htmlElemDesc * parent, 
    const htmlElemDesc * elt)

    Checks whether an HTML element may be a direct child of a parent element. and if so whether it is valid or deprecated.

    parent:HTML parent element
    elt:HTML element
    Returns:one of HTML_VALID, HTML_DEPRECATED, HTML_INVALID

    Function: htmlEncodeEntities

    int	htmlEncodeEntities		(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen,
    int quoteChar)

    Take a block of UTF-8 chars in and try to convert it to an ASCII plus HTML entities block of chars out.

    out:a pointer to an array of bytes to store the result
    outlen:the length of @out
    in:a pointer to an array of UTF-8 chars
    inlen:the length of @in
    quoteChar:the quote character to escape (' or ") or zero.
    Returns:0 if success, -2 if the transcoding fails, or -1 otherwise The value of @inlen after return is the number of octets consumed as the return value is positive, else unpredictable. The value of @outlen after return is the number of octets consumed.

    Function: htmlEntityLookup

    const htmlEntityDesc *	htmlEntityLookup	(const xmlChar * name)

    Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed.

    name:the entity name
    Returns:the associated htmlEntityDescPtr if found, NULL otherwise.

    Function: htmlEntityValueLookup

    const htmlEntityDesc *	htmlEntityValueLookup	(unsigned int value)

    Lookup the given entity in EntitiesTable TODO: the linear scan is really ugly, an hash table is really needed.

    value:the entity's unicode value
    Returns:the associated htmlEntityDescPtr if found, NULL otherwise.

    Function: htmlFreeParserCtxt

    void	htmlFreeParserCtxt		(htmlParserCtxtPtr ctxt)

    Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed.

    ctxt:an HTML parser context

    Function: htmlHandleOmittedElem

    int	htmlHandleOmittedElem		(int val)

    Set and return the previous value for handling HTML omitted tags.

    val:int 0 or 1
    Returns:the last value for 0 for no handling, 1 for auto insertion.

    Function: htmlIsAutoClosed

    int	htmlIsAutoClosed		(htmlDocPtr doc, 
    htmlNodePtr elem)

    The HTML DTD allows a tag to implicitly close other tags. The list is kept in htmlStartClose array. This function checks if a tag is autoclosed by one of it's child

    doc:the HTML document
    elem:the HTML element
    Returns:1 if autoclosed, 0 otherwise

    Function: htmlIsScriptAttribute

    int	htmlIsScriptAttribute		(const xmlChar * name)

    Check if an attribute is of content type Script

    name:an attribute name
    Returns:1 is the attribute is a script 0 otherwise

    Function: htmlNewParserCtxt

    htmlParserCtxtPtr	htmlNewParserCtxt	(void)

    Allocate and initialize a new parser context.

    Returns:the htmlParserCtxtPtr or NULL in case of allocation error

    Function: htmlNodeStatus

    htmlStatus	htmlNodeStatus		(const htmlNodePtr node, 
    int legacy)

    Checks whether the tree node is valid. Experimental (the author only uses the HTML enhancements in a SAX parser)

    node:an htmlNodePtr in a tree
    legacy:whether to allow deprecated elements (YES is faster here for Element nodes)
    Returns:for Element nodes, a return from htmlElementAllowedHere (if legacy allowed) or htmlElementStatusHere (otherwise). for Attribute nodes, a return from htmlAttrAllowed for other nodes, HTML_NA (no checks performed)

    Function: htmlParseCharRef

    int	htmlParseCharRef		(htmlParserCtxtPtr ctxt)

    parse Reference declarations [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'

    ctxt:an HTML parser context
    Returns:the value parsed (as an int)

    Function: htmlParseChunk

    int	htmlParseChunk			(htmlParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    int terminate)

    Parse a Chunk of memory

    ctxt:an HTML parser context
    chunk:an char array
    size:the size in byte of the chunk
    terminate:last chunk indicator
    Returns:zero if no error, the xmlParserErrors otherwise.

    Function: htmlParseDoc

    htmlDocPtr	htmlParseDoc		(xmlChar * cur, 
    const char * encoding)

    parse an HTML in-memory document and build a tree.

    cur:a pointer to an array of xmlChar
    encoding:a free form C string describing the HTML document encoding, or NULL
    Returns:the resulting document tree

    Function: htmlParseDocument

    int	htmlParseDocument		(htmlParserCtxtPtr ctxt)

    parse an HTML document (and build a tree if using the standard SAX interface).

    ctxt:an HTML parser context
    Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

    Function: htmlParseElement

    void	htmlParseElement		(htmlParserCtxtPtr ctxt)

    parse an HTML element, this is highly recursive this is kept for compatibility with previous code versions [39] element ::= EmptyElemTag | STag content ETag [41] Attribute ::= Name Eq AttValue

    ctxt:an HTML parser context

    Function: htmlParseEntityRef

    const htmlEntityDesc *	htmlParseEntityRef	(htmlParserCtxtPtr ctxt, 
    const xmlChar ** str)

    parse an HTML ENTITY references [68] EntityRef ::= '&' Name ';'

    ctxt:an HTML parser context
    str:location to store the entity name
    Returns:the associated htmlEntityDescPtr if found, or NULL otherwise, if non-NULL *str will have to be freed by the caller.

    Function: htmlParseFile

    htmlDocPtr	htmlParseFile		(const char * filename, 
    const char * encoding)

    parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

    filename:the filename
    encoding:a free form C string describing the HTML document encoding, or NULL
    Returns:the resulting document tree

    Function: htmlReadDoc

    htmlDocPtr	htmlReadDoc		(const xmlChar * cur, 
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree.

    cur:a pointer to a zero terminated string
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlReadFd

    htmlDocPtr	htmlReadFd		(int fd, 
    const char * URL,
    const char * encoding,
    int options)

    parse an XML from a file descriptor and build a tree.

    fd:an open file descriptor
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlReadFile

    htmlDocPtr	htmlReadFile		(const char * filename, 
    const char * encoding,
    int options)

    parse an XML file from the filesystem or the network.

    filename:a file or URL
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlReadIO

    htmlDocPtr	htmlReadIO		(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)

    parse an HTML document from I/O functions and source and build a tree.

    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlReadMemory

    htmlDocPtr	htmlReadMemory		(const char * buffer, 
    int size,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree.

    buffer:a pointer to a char array
    size:the size of the array
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of htmlParserOption(s)
    Returns:the resulting document tree

    Function: htmlSAXParseDoc

    htmlDocPtr	htmlSAXParseDoc		(xmlChar * cur, 
    const char * encoding,
    htmlSAXHandlerPtr sax,
    void * userData)

    Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks to handle parse events. If sax is NULL, fallback to the default DOM behavior and return a tree.

    cur:a pointer to an array of xmlChar
    encoding:a free form C string describing the HTML document encoding, or NULL
    sax:the SAX handler block
    userData:if using SAX, this pointer will be provided on callbacks.
    Returns:the resulting document tree unless SAX is NULL or the document is not well formed.

    Function: htmlSAXParseFile

    htmlDocPtr	htmlSAXParseFile	(const char * filename, 
    const char * encoding,
    htmlSAXHandlerPtr sax,
    void * userData)

    parse an HTML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

    filename:the filename
    encoding:a free form C string describing the HTML document encoding, or NULL
    sax:the SAX handler block
    userData:if using SAX, this pointer will be provided on callbacks.
    Returns:the resulting document tree unless SAX is NULL or the document is not well formed.

    Function: htmlTagLookup

    const htmlElemDesc *	htmlTagLookup	(const xmlChar * tag)

    Lookup the HTML tag in the ElementTable

    tag:The tag name in lowercase
    Returns:the related htmlElemDescPtr or NULL if not found.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-parser.html0000644000175000017500000043564412134171042017747 0ustar aronaron Module parser from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module parser from libxml2

    API Menu
    API Indexes
    Related links

    Interfaces, constants and types related to the XML parser

    Table of Contents

    #define XML_COMPLETE_ATTRS
    #define XML_DEFAULT_VERSION
    #define XML_DETECT_IDS
    #define XML_SAX2_MAGIC
    #define XML_SKIP_IDS
    Enum xmlFeature
    
    Enum xmlParserInputState
    
    Enum xmlParserMode
    
    Structure xmlParserNodeInfo
    struct _xmlParserNodeInfo
    Typedef xmlParserNodeInfo * xmlParserNodeInfoPtr
    
    Structure xmlParserNodeInfoSeq
    struct _xmlParserNodeInfoSeq
    Typedef xmlParserNodeInfoSeq * xmlParserNodeInfoSeqPtr
    
    Enum xmlParserOption
    
    Structure xmlSAXHandlerV1
    struct _xmlSAXHandlerV1
    Typedef xmlSAXHandlerV1 * xmlSAXHandlerV1Ptr
    
    Function type: attributeDeclSAXFunc
    void	attributeDeclSAXFunc		(void * ctx, 
    const xmlChar * elem,
    const xmlChar * fullname,
    int type,
    int def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)
    Function type: attributeSAXFunc
    void	attributeSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * value)
    Function type: cdataBlockSAXFunc
    void	cdataBlockSAXFunc		(void * ctx, 
    const xmlChar * value,
    int len)
    Function type: charactersSAXFunc
    void	charactersSAXFunc		(void * ctx, 
    const xmlChar * ch,
    int len)
    Function type: commentSAXFunc
    void	commentSAXFunc			(void * ctx, 
    const xmlChar * value)
    Function type: elementDeclSAXFunc
    void	elementDeclSAXFunc		(void * ctx, 
    const xmlChar * name,
    int type,
    xmlElementContentPtr content)
    Function type: endDocumentSAXFunc
    void	endDocumentSAXFunc		(void * ctx)
    
    Function type: endElementNsSAX2Func
    void	endElementNsSAX2Func		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI)
    Function type: endElementSAXFunc
    void	endElementSAXFunc		(void * ctx, 
    const xmlChar * name)
    Function type: entityDeclSAXFunc
    void	entityDeclSAXFunc		(void * ctx, 
    const xmlChar * name,
    int type,
    const xmlChar * publicId,
    const xmlChar * systemId,
    xmlChar * content)
    Function type: errorSAXFunc
    void	errorSAXFunc			(void * ctx, 
    const char * msg,
    ... ...)
    Function type: externalSubsetSAXFunc
    void	externalSubsetSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    Function type: fatalErrorSAXFunc
    void	fatalErrorSAXFunc		(void * ctx, 
    const char * msg,
    ... ...)
    Function type: getEntitySAXFunc
    xmlEntityPtr	getEntitySAXFunc	(void * ctx, 
    const xmlChar * name)
    Function type: getParameterEntitySAXFunc
    xmlEntityPtr	getParameterEntitySAXFunc	(void * ctx, 
    const xmlChar * name)
    Function type: hasExternalSubsetSAXFunc
    int	hasExternalSubsetSAXFunc	(void * ctx)
    
    Function type: hasInternalSubsetSAXFunc
    int	hasInternalSubsetSAXFunc	(void * ctx)
    
    Function type: ignorableWhitespaceSAXFunc
    void	ignorableWhitespaceSAXFunc	(void * ctx, 
    const xmlChar * ch,
    int len)
    Function type: internalSubsetSAXFunc
    void	internalSubsetSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    Function type: isStandaloneSAXFunc
    int	isStandaloneSAXFunc		(void * ctx)
    
    Function type: notationDeclSAXFunc
    void	notationDeclSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId)
    Function type: processingInstructionSAXFunc
    void	processingInstructionSAXFunc	(void * ctx, 
    const xmlChar * target,
    const xmlChar * data)
    Function type: referenceSAXFunc
    void	referenceSAXFunc		(void * ctx, 
    const xmlChar * name)
    Function type: resolveEntitySAXFunc
    xmlParserInputPtr	resolveEntitySAXFunc	(void * ctx, 
    const xmlChar * publicId,
    const xmlChar * systemId)
    Function type: setDocumentLocatorSAXFunc
    void	setDocumentLocatorSAXFunc	(void * ctx, 
    xmlSAXLocatorPtr loc)
    Function type: startDocumentSAXFunc
    void	startDocumentSAXFunc		(void * ctx)
    
    Function type: startElementNsSAX2Func
    void	startElementNsSAX2Func		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI,
    int nb_namespaces,
    const xmlChar ** namespaces,
    int nb_attributes,
    int nb_defaulted,
    const xmlChar ** attributes)
    Function type: startElementSAXFunc
    void	startElementSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar ** atts)
    Function type: unparsedEntityDeclSAXFunc
    void	unparsedEntityDeclSAXFunc	(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId,
    const xmlChar * notationName)
    Function type: warningSAXFunc
    void	warningSAXFunc			(void * ctx, 
    const char * msg,
    ... ...)
    long	xmlByteConsumed			(xmlParserCtxtPtr ctxt)
    void	xmlCleanupParser		(void)
    void	xmlClearNodeInfoSeq		(xmlParserNodeInfoSeqPtr seq)
    void	xmlClearParserCtxt		(xmlParserCtxtPtr ctxt)
    xmlParserCtxtPtr	xmlCreateDocParserCtxt	(const xmlChar * cur)
    xmlParserCtxtPtr	xmlCreateIOParserCtxt	(xmlSAXHandlerPtr sax, 
    void * user_data,
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    xmlCharEncoding enc)
    xmlParserCtxtPtr	xmlCreatePushParserCtxt	(xmlSAXHandlerPtr sax, 
    void * user_data,
    const char * chunk,
    int size,
    const char * filename)
    xmlDocPtr	xmlCtxtReadDoc		(xmlParserCtxtPtr ctxt, 
    const xmlChar * cur,
    const char * URL,
    const char * encoding,
    int options)
    xmlDocPtr	xmlCtxtReadFd		(xmlParserCtxtPtr ctxt, 
    int fd,
    const char * URL,
    const char * encoding,
    int options)
    xmlDocPtr	xmlCtxtReadFile		(xmlParserCtxtPtr ctxt, 
    const char * filename,
    const char * encoding,
    int options)
    xmlDocPtr	xmlCtxtReadIO		(xmlParserCtxtPtr ctxt, 
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)
    xmlDocPtr	xmlCtxtReadMemory	(xmlParserCtxtPtr ctxt, 
    const char * buffer,
    int size,
    const char * URL,
    const char * encoding,
    int options)
    void	xmlCtxtReset			(xmlParserCtxtPtr ctxt)
    int	xmlCtxtResetPush		(xmlParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    const char * filename,
    const char * encoding)
    int	xmlCtxtUseOptions		(xmlParserCtxtPtr ctxt, 
    int options)
    Function type: xmlExternalEntityLoader
    xmlParserInputPtr	xmlExternalEntityLoader	(const char * URL, 
    const char * ID,
    xmlParserCtxtPtr context)
    void	xmlFreeParserCtxt		(xmlParserCtxtPtr ctxt)
    xmlExternalEntityLoader	xmlGetExternalEntityLoader	(void)
    int	xmlGetFeature			(xmlParserCtxtPtr ctxt, 
    const char * name,
    void * result)
    int	xmlGetFeaturesList		(int * len, 
    const char ** result)
    int	xmlHasFeature			(xmlFeature feature)
    xmlDtdPtr	xmlIOParseDTD		(xmlSAXHandlerPtr sax, 
    xmlParserInputBufferPtr input,
    xmlCharEncoding enc)
    void	xmlInitNodeInfoSeq		(xmlParserNodeInfoSeqPtr seq)
    void	xmlInitParser			(void)
    int	xmlInitParserCtxt		(xmlParserCtxtPtr ctxt)
    int	xmlKeepBlanksDefault		(int val)
    int	xmlLineNumbersDefault		(int val)
    xmlParserInputPtr	xmlLoadExternalEntity	(const char * URL, 
    const char * ID,
    xmlParserCtxtPtr ctxt)
    xmlParserInputPtr	xmlNewIOInputStream	(xmlParserCtxtPtr ctxt, 
    xmlParserInputBufferPtr input,
    xmlCharEncoding enc)
    xmlParserCtxtPtr	xmlNewParserCtxt	(void)
    int	xmlParseBalancedChunkMemory	(xmlDocPtr doc, 
    xmlSAXHandlerPtr sax,
    void * user_data,
    int depth,
    const xmlChar * string,
    xmlNodePtr * lst)
    int	xmlParseBalancedChunkMemoryRecover	(xmlDocPtr doc, 
    xmlSAXHandlerPtr sax,
    void * user_data,
    int depth,
    const xmlChar * string,
    xmlNodePtr * lst,
    int recover)
    int	xmlParseChunk			(xmlParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    int terminate)
    int	xmlParseCtxtExternalEntity	(xmlParserCtxtPtr ctx, 
    const xmlChar * URL,
    const xmlChar * ID,
    xmlNodePtr * lst)
    xmlDtdPtr	xmlParseDTD		(const xmlChar * ExternalID, 
    const xmlChar * SystemID)
    xmlDocPtr	xmlParseDoc		(const xmlChar * cur)
    int	xmlParseDocument		(xmlParserCtxtPtr ctxt)
    xmlDocPtr	xmlParseEntity		(const char * filename)
    int	xmlParseExtParsedEnt		(xmlParserCtxtPtr ctxt)
    int	xmlParseExternalEntity		(xmlDocPtr doc, 
    xmlSAXHandlerPtr sax,
    void * user_data,
    int depth,
    const xmlChar * URL,
    const xmlChar * ID,
    xmlNodePtr * lst)
    xmlDocPtr	xmlParseFile		(const char * filename)
    xmlParserErrors	xmlParseInNodeContext	(xmlNodePtr node, 
    const char * data,
    int datalen,
    int options,
    xmlNodePtr * lst)
    xmlDocPtr	xmlParseMemory		(const char * buffer, 
    int size)
    void	xmlParserAddNodeInfo		(xmlParserCtxtPtr ctxt, 
    const xmlParserNodeInfoPtr info)
    const xmlParserNodeInfo *	xmlParserFindNodeInfo	(const xmlParserCtxtPtr ctx, 
    const xmlNodePtr node)
    unsigned long	xmlParserFindNodeInfoIndex	(const xmlParserNodeInfoSeqPtr seq, 
    const xmlNodePtr node)
    Function type: xmlParserInputDeallocate
    void	xmlParserInputDeallocate	(xmlChar * str)
    
    int	xmlParserInputGrow		(xmlParserInputPtr in, 
    int len)
    int	xmlParserInputRead		(xmlParserInputPtr in, 
    int len)
    int	xmlPedanticParserDefault	(int val)
    xmlDocPtr	xmlReadDoc		(const xmlChar * cur, 
    const char * URL,
    const char * encoding,
    int options)
    xmlDocPtr	xmlReadFd		(int fd, 
    const char * URL,
    const char * encoding,
    int options)
    xmlDocPtr	xmlReadFile		(const char * filename, 
    const char * encoding,
    int options)
    xmlDocPtr	xmlReadIO		(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)
    xmlDocPtr	xmlReadMemory		(const char * buffer, 
    int size,
    const char * URL,
    const char * encoding,
    int options)
    xmlDocPtr	xmlRecoverDoc		(const xmlChar * cur)
    xmlDocPtr	xmlRecoverFile		(const char * filename)
    xmlDocPtr	xmlRecoverMemory	(const char * buffer, 
    int size)
    xmlDtdPtr	xmlSAXParseDTD		(xmlSAXHandlerPtr sax, 
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    xmlDocPtr	xmlSAXParseDoc		(xmlSAXHandlerPtr sax, 
    const xmlChar * cur,
    int recovery)
    xmlDocPtr	xmlSAXParseEntity	(xmlSAXHandlerPtr sax, 
    const char * filename)
    xmlDocPtr	xmlSAXParseFile		(xmlSAXHandlerPtr sax, 
    const char * filename,
    int recovery)
    xmlDocPtr	xmlSAXParseFileWithData	(xmlSAXHandlerPtr sax, 
    const char * filename,
    int recovery,
    void * data)
    xmlDocPtr	xmlSAXParseMemory	(xmlSAXHandlerPtr sax, 
    const char * buffer,
    int size,
    int recovery)
    xmlDocPtr	xmlSAXParseMemoryWithData	(xmlSAXHandlerPtr sax, 
    const char * buffer,
    int size,
    int recovery,
    void * data)
    int	xmlSAXUserParseFile		(xmlSAXHandlerPtr sax, 
    void * user_data,
    const char * filename)
    int	xmlSAXUserParseMemory		(xmlSAXHandlerPtr sax, 
    void * user_data,
    const char * buffer,
    int size)
    void	xmlSetExternalEntityLoader	(xmlExternalEntityLoader f)
    int	xmlSetFeature			(xmlParserCtxtPtr ctxt, 
    const char * name,
    void * value)
    void	xmlSetupParserForBuffer		(xmlParserCtxtPtr ctxt, 
    const xmlChar * buffer,
    const char * filename)
    void	xmlStopParser			(xmlParserCtxtPtr ctxt)
    int	xmlSubstituteEntitiesDefault	(int val)

    Description

    Macro: XML_COMPLETE_ATTRS

    #define XML_COMPLETE_ATTRS

    Bit in the loadsubset context field to tell to do complete the elements attributes lists with the ones defaulted from the DTDs. Use it to initialize xmlLoadExtDtdDefaultValue.

    Macro: XML_DEFAULT_VERSION

    #define XML_DEFAULT_VERSION

    The default version of XML used: 1.0

    Macro: XML_DETECT_IDS

    #define XML_DETECT_IDS

    Bit in the loadsubset context field to tell to do ID/REFs lookups. Use it to initialize xmlLoadExtDtdDefaultValue.

    Macro: XML_SAX2_MAGIC

    #define XML_SAX2_MAGIC

    Special constant found in SAX2 blocks initialized fields

    Macro: XML_SKIP_IDS

    #define XML_SKIP_IDS

    Bit in the loadsubset context field to tell to not do ID/REFs registration. Used to initialize xmlLoadExtDtdDefaultValue in some special cases.

    Enum xmlFeature

    Enum xmlFeature {
        XML_WITH_THREAD = 1
        XML_WITH_TREE = 2
        XML_WITH_OUTPUT = 3
        XML_WITH_PUSH = 4
        XML_WITH_READER = 5
        XML_WITH_PATTERN = 6
        XML_WITH_WRITER = 7
        XML_WITH_SAX1 = 8
        XML_WITH_FTP = 9
        XML_WITH_HTTP = 10
        XML_WITH_VALID = 11
        XML_WITH_HTML = 12
        XML_WITH_LEGACY = 13
        XML_WITH_C14N = 14
        XML_WITH_CATALOG = 15
        XML_WITH_XPATH = 16
        XML_WITH_XPTR = 17
        XML_WITH_XINCLUDE = 18
        XML_WITH_ICONV = 19
        XML_WITH_ISO8859X = 20
        XML_WITH_UNICODE = 21
        XML_WITH_REGEXP = 22
        XML_WITH_AUTOMATA = 23
        XML_WITH_EXPR = 24
        XML_WITH_SCHEMAS = 25
        XML_WITH_SCHEMATRON = 26
        XML_WITH_MODULES = 27
        XML_WITH_DEBUG = 28
        XML_WITH_DEBUG_MEM = 29
        XML_WITH_DEBUG_RUN = 30
        XML_WITH_ZLIB = 31
        XML_WITH_ICU = 32
        XML_WITH_LZMA = 33
        XML_WITH_NONE = 99999 : just to be sure of allocation size
    }
    

    Enum xmlParserInputState

    Enum xmlParserInputState {
        XML_PARSER_EOF = -1 : nothing is to be parsed
        XML_PARSER_START = 0 : nothing has been parsed
        XML_PARSER_MISC = 1 : Misc* before int subset
        XML_PARSER_PI = 2 : Within a processing instruction
        XML_PARSER_DTD = 3 : within some DTD content
        XML_PARSER_PROLOG = 4 : Misc* after internal subset
        XML_PARSER_COMMENT = 5 : within a comment
        XML_PARSER_START_TAG = 6 : within a start tag
        XML_PARSER_CONTENT = 7 : within the content
        XML_PARSER_CDATA_SECTION = 8 : within a CDATA section
        XML_PARSER_END_TAG = 9 : within a closing tag
        XML_PARSER_ENTITY_DECL = 10 : within an entity declaration
        XML_PARSER_ENTITY_VALUE = 11 : within an entity value in a decl
        XML_PARSER_ATTRIBUTE_VALUE = 12 : within an attribute value
        XML_PARSER_SYSTEM_LITERAL = 13 : within a SYSTEM value
        XML_PARSER_EPILOG = 14 : the Misc* after the last end tag
        XML_PARSER_IGNORE = 15 : within an IGNORED section
        XML_PARSER_PUBLIC_LITERAL = 16 : within a PUBLIC value
    }
    

    Enum xmlParserMode

    Enum xmlParserMode {
        XML_PARSE_UNKNOWN = 0
        XML_PARSE_DOM = 1
        XML_PARSE_SAX = 2
        XML_PARSE_PUSH_DOM = 3
        XML_PARSE_PUSH_SAX = 4
        XML_PARSE_READER = 5
    }
    

    Structure xmlParserNodeInfo

    Structure xmlParserNodeInfo
    struct _xmlParserNodeInfo { const struct _xmlNode * node : Position & line # that text that create unsigned long begin_pos unsigned long begin_line unsigned long end_pos unsigned long end_line }

    Structure xmlParserNodeInfoSeq

    Structure xmlParserNodeInfoSeq
    struct _xmlParserNodeInfoSeq { unsigned long maximum unsigned long length xmlParserNodeInfo * buffer }

    Enum xmlParserOption

    Enum xmlParserOption {
        XML_PARSE_RECOVER = 1 : recover on errors
        XML_PARSE_NOENT = 2 : substitute entities
        XML_PARSE_DTDLOAD = 4 : load the external subset
        XML_PARSE_DTDATTR = 8 : default DTD attributes
        XML_PARSE_DTDVALID = 16 : validate with the DTD
        XML_PARSE_NOERROR = 32 : suppress error reports
        XML_PARSE_NOWARNING = 64 : suppress warning reports
        XML_PARSE_PEDANTIC = 128 : pedantic error reporting
        XML_PARSE_NOBLANKS = 256 : remove blank nodes
        XML_PARSE_SAX1 = 512 : use the SAX1 interface internally
        XML_PARSE_XINCLUDE = 1024 : Implement XInclude substitition
        XML_PARSE_NONET = 2048 : Forbid network access
        XML_PARSE_NODICT = 4096 : Do not reuse the context dictionnary
        XML_PARSE_NSCLEAN = 8192 : remove redundant namespaces declarations
        XML_PARSE_NOCDATA = 16384 : merge CDATA as text nodes
        XML_PARSE_NOXINCNODE = 32768 : do not generate XINCLUDE START/END nodes
        XML_PARSE_COMPACT = 65536 : compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree)
        XML_PARSE_OLD10 = 131072 : parse using XML-1.0 before update 5
        XML_PARSE_NOBASEFIX = 262144 : do not fixup XINCLUDE xml:base uris
        XML_PARSE_HUGE = 524288 : relax any hardcoded limit from the parser
        XML_PARSE_OLDSAX = 1048576 : parse using SAX2 interface before 2.7.0
        XML_PARSE_IGNORE_ENC = 2097152 : ignore internal document encoding hint
        XML_PARSE_BIG_LINES = 4194304 : Store big lines numbers in text PSVI field
    }
    

    Structure xmlSAXHandlerV1

    Structure xmlSAXHandlerV1
    struct _xmlSAXHandlerV1 { internalSubsetSAXFunc internalSubset isStandaloneSAXFunc isStandalone hasInternalSubsetSAXFunc hasInternalSubset hasExternalSubsetSAXFunc hasExternalSubset resolveEntitySAXFunc resolveEntity getEntitySAXFunc getEntity entityDeclSAXFunc entityDecl notationDeclSAXFunc notationDecl attributeDeclSAXFunc attributeDecl elementDeclSAXFunc elementDecl unparsedEntityDeclSAXFunc unparsedEntityDecl setDocumentLocatorSAXFunc setDocumentLocator startDocumentSAXFunc startDocument endDocumentSAXFunc endDocument startElementSAXFunc startElement endElementSAXFunc endElement referenceSAXFunc reference charactersSAXFunc characters ignorableWhitespaceSAXFunc ignorableWhitespace processingInstructionSAXFunc processingInstruction commentSAXFunc comment warningSAXFunc warning errorSAXFunc error fatalErrorSAXFunc fatalError : unused error() get all the errors getParameterEntitySAXFunc getParameterEntity cdataBlockSAXFunc cdataBlock externalSubsetSAXFunc externalSubset unsigned int initialized }

    Function type: attributeDeclSAXFunc

    Function type: attributeDeclSAXFunc
    void	attributeDeclSAXFunc		(void * ctx, 
    const xmlChar * elem,
    const xmlChar * fullname,
    int type,
    int def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)

    An attribute definition has been parsed.

    ctx:the user data (XML parser context)
    elem:the name of the element
    fullname:the attribute name
    type:the attribute type
    def:the type of default value
    defaultValue:the attribute default value
    tree:the tree of enumerated value set

    Function type: attributeSAXFunc

    Function type: attributeSAXFunc
    void	attributeSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * value)

    Handle an attribute that has been read by the parser. The default handling is to convert the attribute into an DOM subtree and past it in a new xmlAttr element added to the element.

    ctx:the user data (XML parser context)
    name:The attribute name, including namespace prefix
    value:The attribute value

    Function type: cdataBlockSAXFunc

    Function type: cdataBlockSAXFunc
    void	cdataBlockSAXFunc		(void * ctx, 
    const xmlChar * value,
    int len)

    Called when a pcdata block has been parsed.

    ctx:the user data (XML parser context)
    value:The pcdata content
    len:the block length

    Function type: charactersSAXFunc

    Function type: charactersSAXFunc
    void	charactersSAXFunc		(void * ctx, 
    const xmlChar * ch,
    int len)

    Receiving some chars from the parser.

    ctx:the user data (XML parser context)
    ch:a xmlChar string
    len:the number of xmlChar

    Function type: commentSAXFunc

    Function type: commentSAXFunc
    void	commentSAXFunc			(void * ctx, 
    const xmlChar * value)

    A comment has been parsed.

    ctx:the user data (XML parser context)
    value:the comment content

    Function type: elementDeclSAXFunc

    Function type: elementDeclSAXFunc
    void	elementDeclSAXFunc		(void * ctx, 
    const xmlChar * name,
    int type,
    xmlElementContentPtr content)

    An element definition has been parsed.

    ctx:the user data (XML parser context)
    name:the element name
    type:the element type
    content:the element value tree

    Function type: endDocumentSAXFunc

    Function type: endDocumentSAXFunc
    void	endDocumentSAXFunc		(void * ctx)
    

    Called when the document end has been detected.

    ctx:the user data (XML parser context)

    Function type: endElementNsSAX2Func

    Function type: endElementNsSAX2Func
    void	endElementNsSAX2Func		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI)

    SAX2 callback when an element end has been detected by the parser. It provides the namespace informations for the element.

    ctx:the user data (XML parser context)
    localname:the local name of the element
    prefix:the element namespace prefix if available
    URI:the element namespace name if available

    Function type: endElementSAXFunc

    Function type: endElementSAXFunc
    void	endElementSAXFunc		(void * ctx, 
    const xmlChar * name)

    Called when the end of an element has been detected.

    ctx:the user data (XML parser context)
    name:The element name

    Function type: entityDeclSAXFunc

    Function type: entityDeclSAXFunc
    void	entityDeclSAXFunc		(void * ctx, 
    const xmlChar * name,
    int type,
    const xmlChar * publicId,
    const xmlChar * systemId,
    xmlChar * content)

    An entity definition has been parsed.

    ctx:the user data (XML parser context)
    name:the entity name
    type:the entity type
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    content:the entity value (without processing).

    Function type: errorSAXFunc

    Function type: errorSAXFunc
    void	errorSAXFunc			(void * ctx, 
    const char * msg,
    ... ...)

    Display and format an error messages, callback.

    ctx:an XML parser context
    msg:the message to display/transmit
    ...:extra parameters for the message display

    Function type: externalSubsetSAXFunc

    Function type: externalSubsetSAXFunc
    void	externalSubsetSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Callback on external subset declaration.

    ctx:the user data (XML parser context)
    name:the root element name
    ExternalID:the external ID
    SystemID:the SYSTEM ID (e.g. filename or URL)

    Function type: fatalErrorSAXFunc

    Function type: fatalErrorSAXFunc
    void	fatalErrorSAXFunc		(void * ctx, 
    const char * msg,
    ... ...)

    Display and format fatal error messages, callback. Note: so far fatalError() SAX callbacks are not used, error() get all the callbacks for errors.

    ctx:an XML parser context
    msg:the message to display/transmit
    ...:extra parameters for the message display

    Function type: getEntitySAXFunc

    Function type: getEntitySAXFunc
    xmlEntityPtr	getEntitySAXFunc	(void * ctx, 
    const xmlChar * name)

    Get an entity by name.

    ctx:the user data (XML parser context)
    name:The entity name
    Returns:the xmlEntityPtr if found.

    Function type: getParameterEntitySAXFunc

    Function type: getParameterEntitySAXFunc
    xmlEntityPtr	getParameterEntitySAXFunc	(void * ctx, 
    const xmlChar * name)

    Get a parameter entity by name.

    ctx:the user data (XML parser context)
    name:The entity name
    Returns:the xmlEntityPtr if found.

    Function type: hasExternalSubsetSAXFunc

    Function type: hasExternalSubsetSAXFunc
    int	hasExternalSubsetSAXFunc	(void * ctx)
    

    Does this document has an external subset?

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function type: hasInternalSubsetSAXFunc

    Function type: hasInternalSubsetSAXFunc
    int	hasInternalSubsetSAXFunc	(void * ctx)
    

    Does this document has an internal subset.

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function type: ignorableWhitespaceSAXFunc

    Function type: ignorableWhitespaceSAXFunc
    void	ignorableWhitespaceSAXFunc	(void * ctx, 
    const xmlChar * ch,
    int len)

    Receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use characters.

    ctx:the user data (XML parser context)
    ch:a xmlChar string
    len:the number of xmlChar

    Function type: internalSubsetSAXFunc

    Function type: internalSubsetSAXFunc
    void	internalSubsetSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Callback on internal subset declaration.

    ctx:the user data (XML parser context)
    name:the root element name
    ExternalID:the external ID
    SystemID:the SYSTEM ID (e.g. filename or URL)

    Function type: isStandaloneSAXFunc

    Function type: isStandaloneSAXFunc
    int	isStandaloneSAXFunc		(void * ctx)
    

    Is this document tagged standalone?

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function type: notationDeclSAXFunc

    Function type: notationDeclSAXFunc
    void	notationDeclSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId)

    What to do when a notation declaration has been parsed.

    ctx:the user data (XML parser context)
    name:The name of the notation
    publicId:The public ID of the entity
    systemId:The system ID of the entity

    Function type: processingInstructionSAXFunc

    Function type: processingInstructionSAXFunc
    void	processingInstructionSAXFunc	(void * ctx, 
    const xmlChar * target,
    const xmlChar * data)

    A processing instruction has been parsed.

    ctx:the user data (XML parser context)
    target:the target name
    data:the PI data's

    Function type: referenceSAXFunc

    Function type: referenceSAXFunc
    void	referenceSAXFunc		(void * ctx, 
    const xmlChar * name)

    Called when an entity reference is detected.

    ctx:the user data (XML parser context)
    name:The entity name

    Function type: resolveEntitySAXFunc

    Function type: resolveEntitySAXFunc
    xmlParserInputPtr	resolveEntitySAXFunc	(void * ctx, 
    const xmlChar * publicId,
    const xmlChar * systemId)

    Callback: The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine

    ctx:the user data (XML parser context)
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    Returns:the xmlParserInputPtr if inlined or NULL for DOM behaviour.

    Function type: setDocumentLocatorSAXFunc

    Function type: setDocumentLocatorSAXFunc
    void	setDocumentLocatorSAXFunc	(void * ctx, 
    xmlSAXLocatorPtr loc)

    Receive the document locator at startup, actually xmlDefaultSAXLocator. Everything is available on the context, so this is useless in our case.

    ctx:the user data (XML parser context)
    loc:A SAX Locator

    Function type: startDocumentSAXFunc

    Function type: startDocumentSAXFunc
    void	startDocumentSAXFunc		(void * ctx)
    

    Called when the document start being processed.

    ctx:the user data (XML parser context)

    Function type: startElementNsSAX2Func

    Function type: startElementNsSAX2Func
    void	startElementNsSAX2Func		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI,
    int nb_namespaces,
    const xmlChar ** namespaces,
    int nb_attributes,
    int nb_defaulted,
    const xmlChar ** attributes)

    SAX2 callback when an element start has been detected by the parser. It provides the namespace informations for the element, as well as the new namespace declarations on the element.

    ctx:the user data (XML parser context)
    localname:the local name of the element
    prefix:the element namespace prefix if available
    URI:the element namespace name if available
    nb_namespaces:number of namespace definitions on that node
    namespaces:pointer to the array of prefix/URI pairs namespace definitions
    nb_attributes:the number of attributes on that node
    nb_defaulted:the number of defaulted attributes. The defaulted ones are at the end of the array
    attributes:pointer to the array of (localname/prefix/URI/value/end) attribute values.

    Function type: startElementSAXFunc

    Function type: startElementSAXFunc
    void	startElementSAXFunc		(void * ctx, 
    const xmlChar * name,
    const xmlChar ** atts)

    Called when an opening tag has been processed.

    ctx:the user data (XML parser context)
    name:The element name, including namespace prefix
    atts:An array of name/value attributes pairs, NULL terminated

    Function type: unparsedEntityDeclSAXFunc

    Function type: unparsedEntityDeclSAXFunc
    void	unparsedEntityDeclSAXFunc	(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId,
    const xmlChar * notationName)

    What to do when an unparsed entity declaration is parsed.

    ctx:the user data (XML parser context)
    name:The name of the entity
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    notationName:the name of the notation

    Function type: warningSAXFunc

    Function type: warningSAXFunc
    void	warningSAXFunc			(void * ctx, 
    const char * msg,
    ... ...)

    Display and format a warning messages, callback.

    ctx:an XML parser context
    msg:the message to display/transmit
    ...:extra parameters for the message display

    Function: xmlByteConsumed

    long	xmlByteConsumed			(xmlParserCtxtPtr ctxt)

    This function provides the current index of the parser relative to the start of the current entity. This function is computed in bytes from the beginning starting at zero and finishing at the size in byte of the file if parsing a file. The function is of constant cost if the input is UTF-8 but can be costly if run on non-UTF-8 input.

    ctxt:an XML parser context
    Returns:the index in bytes from the beginning of the entity or -1 in case the index could not be computed.

    Function: xmlCleanupParser

    void	xmlCleanupParser		(void)

    This function name is somewhat misleading. It does not clean up parser state, it cleans up memory allocated by the library itself. It is a cleanup function for the XML library. It tries to reclaim all related global memory allocated for the library processing. It doesn't deallocate any document related memory. One should call xmlCleanupParser() only when the process has finished using the library and all XML/HTML documents built with it. See also xmlInitParser() which has the opposite function of preparing the library for operations. WARNING: if your application is multithreaded or has plugin support calling this may crash the application if another thread or a plugin is still using libxml2. It's sometimes very hard to guess if libxml2 is in use in the application, some libraries or plugins may use it without notice. In case of doubt abstain from calling this function or do it just before calling exit() to avoid leak reports from valgrind !

    Function: xmlClearNodeInfoSeq

    void	xmlClearNodeInfoSeq		(xmlParserNodeInfoSeqPtr seq)

    -- Clear (release memory and reinitialize) node info sequence

    seq:a node info sequence pointer

    Function: xmlClearParserCtxt

    void	xmlClearParserCtxt		(xmlParserCtxtPtr ctxt)

    Clear (release owned resources) and reinitialize a parser context

    ctxt:an XML parser context

    Function: xmlCreateDocParserCtxt

    xmlParserCtxtPtr	xmlCreateDocParserCtxt	(const xmlChar * cur)

    Creates a parser context for an XML in-memory document.

    cur:a pointer to an array of xmlChar
    Returns:the new parser context or NULL

    Function: xmlCreateIOParserCtxt

    xmlParserCtxtPtr	xmlCreateIOParserCtxt	(xmlSAXHandlerPtr sax, 
    void * user_data,
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    xmlCharEncoding enc)

    Create a parser context for using the XML parser with an existing I/O stream

    sax:a SAX handler
    user_data:The user data returned on SAX callbacks
    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    enc:the charset encoding if known
    Returns:the new parser context or NULL

    Function: xmlCreatePushParserCtxt

    xmlParserCtxtPtr	xmlCreatePushParserCtxt	(xmlSAXHandlerPtr sax, 
    void * user_data,
    const char * chunk,
    int size,
    const char * filename)

    Create a parser context for using the XML parser in push mode. If @buffer and @size are non-NULL, the data is used to detect the encoding. The remaining characters will be parsed so they don't need to be fed in again through xmlParseChunk. To allow content encoding detection, @size should be >= 4 The value of @filename is used for fetching external entities and error/warning reports.

    sax:a SAX handler
    user_data:The user data returned on SAX callbacks
    chunk:a pointer to an array of chars
    size:number of chars in the array
    filename:an optional file name or URI
    Returns:the new parser context or NULL

    Function: xmlCtxtReadDoc

    xmlDocPtr	xmlCtxtReadDoc		(xmlParserCtxtPtr ctxt, 
    const xmlChar * cur,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

    ctxt:an XML parser context
    cur:a pointer to a zero terminated string
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlCtxtReadFd

    xmlDocPtr	xmlCtxtReadFd		(xmlParserCtxtPtr ctxt, 
    int fd,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML from a file descriptor and build a tree. This reuses the existing @ctxt parser context NOTE that the file descriptor will not be closed when the reader is closed or reset.

    ctxt:an XML parser context
    fd:an open file descriptor
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlCtxtReadFile

    xmlDocPtr	xmlCtxtReadFile		(xmlParserCtxtPtr ctxt, 
    const char * filename,
    const char * encoding,
    int options)

    parse an XML file from the filesystem or the network. This reuses the existing @ctxt parser context

    ctxt:an XML parser context
    filename:a file or URL
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlCtxtReadIO

    xmlDocPtr	xmlCtxtReadIO		(xmlParserCtxtPtr ctxt, 
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML document from I/O functions and source and build a tree. This reuses the existing @ctxt parser context

    ctxt:an XML parser context
    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlCtxtReadMemory

    xmlDocPtr	xmlCtxtReadMemory	(xmlParserCtxtPtr ctxt, 
    const char * buffer,
    int size,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree. This reuses the existing @ctxt parser context

    ctxt:an XML parser context
    buffer:a pointer to a char array
    size:the size of the array
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlCtxtReset

    void	xmlCtxtReset			(xmlParserCtxtPtr ctxt)

    Reset a parser context

    ctxt:an XML parser context

    Function: xmlCtxtResetPush

    int	xmlCtxtResetPush		(xmlParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    const char * filename,
    const char * encoding)

    Reset a push parser context

    ctxt:an XML parser context
    chunk:a pointer to an array of chars
    size:number of chars in the array
    filename:an optional file name or URI
    encoding:the document encoding, or NULL
    Returns:0 in case of success and 1 in case of error

    Function: xmlCtxtUseOptions

    int	xmlCtxtUseOptions		(xmlParserCtxtPtr ctxt, 
    int options)

    Applies the options to the parser context

    ctxt:an XML parser context
    options:a combination of xmlParserOption
    Returns:0 in case of success, the set of unknown or unimplemented options in case of error.

    Function type: xmlExternalEntityLoader

    Function type: xmlExternalEntityLoader
    xmlParserInputPtr	xmlExternalEntityLoader	(const char * URL, 
    const char * ID,
    xmlParserCtxtPtr context)

    External entity loaders types.

    URL:The System ID of the resource requested
    ID:The Public ID of the resource requested
    context:the XML parser context
    Returns:the entity input parser.

    Function: xmlFreeParserCtxt

    void	xmlFreeParserCtxt		(xmlParserCtxtPtr ctxt)

    Free all the memory used by a parser context. However the parsed document in ctxt->myDoc is not freed.

    ctxt:an XML parser context

    Function: xmlGetExternalEntityLoader

    xmlExternalEntityLoader	xmlGetExternalEntityLoader	(void)

    Get the default external entity resolver function for the application

    Returns:the xmlExternalEntityLoader function pointer

    Function: xmlGetFeature

    int	xmlGetFeature			(xmlParserCtxtPtr ctxt, 
    const char * name,
    void * result)

    Read the current value of one feature of this parser instance

    ctxt:an XML/HTML parser context
    name:the feature name
    result:location to store the result
    Returns:-1 in case or error, 0 otherwise

    Function: xmlGetFeaturesList

    int	xmlGetFeaturesList		(int * len, 
    const char ** result)

    Copy at most *@len feature names into the @result array

    len:the length of the features name array (input/output)
    result:an array of string to be filled with the features name.
    Returns:-1 in case or error, or the total number of features, len is updated with the number of strings copied, strings must not be deallocated

    Function: xmlHasFeature

    int	xmlHasFeature			(xmlFeature feature)

    Examines if the library has been compiled with a given feature.

    feature:the feature to be examined
    Returns:a non-zero value if the feature exist, otherwise zero. Returns zero (0) if the feature does not exist or an unknown unknown feature is requested, non-zero otherwise.

    Function: xmlIOParseDTD

    xmlDtdPtr	xmlIOParseDTD		(xmlSAXHandlerPtr sax, 
    xmlParserInputBufferPtr input,
    xmlCharEncoding enc)

    Load and parse a DTD

    sax:the SAX handler block or NULL
    input:an Input Buffer
    enc:the charset encoding if known
    Returns:the resulting xmlDtdPtr or NULL in case of error. @input will be freed by the function in any case.

    Function: xmlInitNodeInfoSeq

    void	xmlInitNodeInfoSeq		(xmlParserNodeInfoSeqPtr seq)

    -- Initialize (set to initial state) node info sequence

    seq:a node info sequence pointer

    Function: xmlInitParser

    void	xmlInitParser			(void)

    Initialization function for the XML parser. This is not reentrant. Call once before processing in case of use in multithreaded programs.

    Function: xmlInitParserCtxt

    int	xmlInitParserCtxt		(xmlParserCtxtPtr ctxt)

    Initialize a parser context

    ctxt:an XML parser context
    Returns:0 in case of success and -1 in case of error

    Function: xmlKeepBlanksDefault

    int	xmlKeepBlanksDefault		(int val)

    Set and return the previous value for default blanks text nodes support. The 1.x version of the parser used an heuristic to try to detect ignorable white spaces. As a result the SAX callback was generating xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when using the DOM output text nodes containing those blanks were not generated. The 2.x and later version will switch to the XML standard way and ignorableWhitespace() are only generated when running the parser in validating mode and when the current element doesn't allow CDATA or mixed content. This function is provided as a way to force the standard behavior on 1.X libs and to switch back to the old mode for compatibility when running 1.X client code on 2.X . Upgrade of 1.X code should be done by using xmlIsBlankNode() commodity function to detect the "empty" nodes generated. This value also affect autogeneration of indentation when saving code if blanks sections are kept, indentation is not generated.

    val:int 0 or 1
    Returns:the last value for 0 for no substitution, 1 for substitution.

    Function: xmlLineNumbersDefault

    int	xmlLineNumbersDefault		(int val)

    Set and return the previous value for enabling line numbers in elements contents. This may break on old application and is turned off by default.

    val:int 0 or 1
    Returns:the last value for 0 for no substitution, 1 for substitution.

    Function: xmlLoadExternalEntity

    xmlParserInputPtr	xmlLoadExternalEntity	(const char * URL, 
    const char * ID,
    xmlParserCtxtPtr ctxt)

    Load an external entity, note that the use of this function for unparsed entities may generate problems

    URL:the URL for the entity to load
    ID:the Public ID for the entity to load
    ctxt:the context in which the entity is called or NULL
    Returns:the xmlParserInputPtr or NULL

    Function: xmlNewIOInputStream

    xmlParserInputPtr	xmlNewIOInputStream	(xmlParserCtxtPtr ctxt, 
    xmlParserInputBufferPtr input,
    xmlCharEncoding enc)

    Create a new input stream structure encapsulating the @input into a stream suitable for the parser.

    ctxt:an XML parser context
    input:an I/O Input
    enc:the charset encoding if known
    Returns:the new input stream or NULL

    Function: xmlNewParserCtxt

    xmlParserCtxtPtr	xmlNewParserCtxt	(void)

    Allocate and initialize a new parser context.

    Returns:the xmlParserCtxtPtr or NULL

    Function: xmlParseBalancedChunkMemory

    int	xmlParseBalancedChunkMemory	(xmlDocPtr doc, 
    xmlSAXHandlerPtr sax,
    void * user_data,
    int depth,
    const xmlChar * string,
    xmlNodePtr * lst)

    Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

    doc:the document the chunk pertains to
    sax:the SAX handler bloc (possibly NULL)
    user_data:The user data returned on SAX callbacks (possibly NULL)
    depth:Used for loop detection, use 0
    string:the input string in UTF8 or ISO-Latin (zero terminated)
    lst:the return value for the set of parsed nodes
    Returns:0 if the chunk is well balanced, -1 in case of args problem and the parser error code otherwise

    Function: xmlParseBalancedChunkMemoryRecover

    int	xmlParseBalancedChunkMemoryRecover	(xmlDocPtr doc, 
    xmlSAXHandlerPtr sax,
    void * user_data,
    int depth,
    const xmlChar * string,
    xmlNodePtr * lst,
    int recover)

    Parse a well-balanced chunk of an XML document called by the parser The allowed sequence for the Well Balanced Chunk is the one defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

    doc:the document the chunk pertains to
    sax:the SAX handler bloc (possibly NULL)
    user_data:The user data returned on SAX callbacks (possibly NULL)
    depth:Used for loop detection, use 0
    string:the input string in UTF8 or ISO-Latin (zero terminated)
    lst:the return value for the set of parsed nodes
    recover:return nodes even if the data is broken (use 0)
    Returns:0 if the chunk is well balanced, -1 in case of args problem and the parser error code otherwise In case recover is set to 1, the nodelist will not be empty even if the parsed chunk is not well balanced, assuming the parsing succeeded to some extent.

    Function: xmlParseChunk

    int	xmlParseChunk			(xmlParserCtxtPtr ctxt, 
    const char * chunk,
    int size,
    int terminate)

    Parse a Chunk of memory

    ctxt:an XML parser context
    chunk:an char array
    size:the size in byte of the chunk
    terminate:last chunk indicator
    Returns:zero if no error, the xmlParserErrors otherwise.

    Function: xmlParseCtxtExternalEntity

    int	xmlParseCtxtExternalEntity	(xmlParserCtxtPtr ctx, 
    const xmlChar * URL,
    const xmlChar * ID,
    xmlNodePtr * lst)

    Parse an external general entity within an existing parsing context An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content

    ctx:the existing parsing context
    URL:the URL for the entity to load
    ID:the System ID for the entity to load
    lst:the return value for the set of parsed nodes
    Returns:0 if the entity is well formed, -1 in case of args problem and the parser error code otherwise

    Function: xmlParseDTD

    xmlDtdPtr	xmlParseDTD		(const xmlChar * ExternalID, 
    const xmlChar * SystemID)

    Load and parse an external subset.

    ExternalID:a NAME* containing the External ID of the DTD
    SystemID:a NAME* containing the URL to the DTD
    Returns:the resulting xmlDtdPtr or NULL in case of error.

    Function: xmlParseDoc

    xmlDocPtr	xmlParseDoc		(const xmlChar * cur)

    parse an XML in-memory document and build a tree.

    cur:a pointer to an array of xmlChar
    Returns:the resulting document tree

    Function: xmlParseDocument

    int	xmlParseDocument		(xmlParserCtxtPtr ctxt)

    parse an XML document (and build a tree if using the standard SAX interface). [1] document ::= prolog element Misc* [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?

    ctxt:an XML parser context
    Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

    Function: xmlParseEntity

    xmlDocPtr	xmlParseEntity		(const char * filename)

    parse an XML external entity out of context and build a tree. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk

    filename:the filename
    Returns:the resulting document tree

    Function: xmlParseExtParsedEnt

    int	xmlParseExtParsedEnt		(xmlParserCtxtPtr ctxt)

    parse a general parsed entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content

    ctxt:an XML parser context
    Returns:0, -1 in case of error. the parser context is augmented as a result of the parsing.

    Function: xmlParseExternalEntity

    int	xmlParseExternalEntity		(xmlDocPtr doc, 
    xmlSAXHandlerPtr sax,
    void * user_data,
    int depth,
    const xmlChar * URL,
    const xmlChar * ID,
    xmlNodePtr * lst)

    Parse an external general entity An external general parsed entity is well-formed if it matches the production labeled extParsedEnt. [78] extParsedEnt ::= TextDecl? content

    doc:the document the chunk pertains to
    sax:the SAX handler bloc (possibly NULL)
    user_data:The user data returned on SAX callbacks (possibly NULL)
    depth:Used for loop detection, use 0
    URL:the URL for the entity to load
    ID:the System ID for the entity to load
    lst:the return value for the set of parsed nodes
    Returns:0 if the entity is well formed, -1 in case of args problem and the parser error code otherwise

    Function: xmlParseFile

    xmlDocPtr	xmlParseFile		(const char * filename)

    parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time.

    filename:the filename
    Returns:the resulting document tree if the file was wellformed, NULL otherwise.

    Function: xmlParseInNodeContext

    xmlParserErrors	xmlParseInNodeContext	(xmlNodePtr node, 
    const char * data,
    int datalen,
    int options,
    xmlNodePtr * lst)

    Parse a well-balanced chunk of an XML document within the context (DTD, namespaces, etc ...) of the given node. The allowed sequence for the data is a Well Balanced Chunk defined by the content production in the XML grammar: [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

    node:the context node
    data:the input string
    datalen:the input string length in bytes
    options:a combination of xmlParserOption
    lst:the return value for the set of parsed nodes
    Returns:XML_ERR_OK if the chunk is well balanced, and the parser error code otherwise

    Function: xmlParseMemory

    xmlDocPtr	xmlParseMemory		(const char * buffer, 
    int size)

    parse an XML in-memory block and build a tree.

    buffer:an pointer to a char array
    size:the size of the array
    Returns:the resulting document tree

    Function: xmlParserAddNodeInfo

    void	xmlParserAddNodeInfo		(xmlParserCtxtPtr ctxt, 
    const xmlParserNodeInfoPtr info)

    Insert node info record into the sorted sequence

    ctxt:an XML parser context
    info:a node info sequence pointer

    Function: xmlParserFindNodeInfo

    const xmlParserNodeInfo *	xmlParserFindNodeInfo	(const xmlParserCtxtPtr ctx, 
    const xmlNodePtr node)

    Find the parser node info struct for a given node

    ctx:an XML parser context
    node:an XML node within the tree
    Returns:an xmlParserNodeInfo block pointer or NULL

    Function: xmlParserFindNodeInfoIndex

    unsigned long	xmlParserFindNodeInfoIndex	(const xmlParserNodeInfoSeqPtr seq, 
    const xmlNodePtr node)

    xmlParserFindNodeInfoIndex : Find the index that the info record for the given node is or should be at in a sorted sequence

    seq:a node info sequence pointer
    node:an XML node pointer
    Returns:a long indicating the position of the record

    Function type: xmlParserInputDeallocate

    Function type: xmlParserInputDeallocate
    void	xmlParserInputDeallocate	(xmlChar * str)
    

    Callback for freeing some parser input allocations.

    str:the string to deallocate

    Function: xmlParserInputGrow

    int	xmlParserInputGrow		(xmlParserInputPtr in, 
    int len)

    This function increase the input for the parser. It tries to preserve pointers to the input buffer, and keep already read data

    in:an XML parser input
    len:an indicative size for the lookahead
    Returns:the amount of char read, or -1 in case of error, 0 indicate the end of this entity

    Function: xmlParserInputRead

    int	xmlParserInputRead		(xmlParserInputPtr in, 
    int len)

    This function was internal and is deprecated.

    in:an XML parser input
    len:an indicative size for the lookahead
    Returns:-1 as this is an error to use it.

    Function: xmlPedanticParserDefault

    int	xmlPedanticParserDefault	(int val)

    Set and return the previous value for enabling pedantic warnings.

    val:int 0 or 1
    Returns:the last value for 0 for no substitution, 1 for substitution.

    Function: xmlReadDoc

    xmlDocPtr	xmlReadDoc		(const xmlChar * cur, 
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree.

    cur:a pointer to a zero terminated string
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlReadFd

    xmlDocPtr	xmlReadFd		(int fd, 
    const char * URL,
    const char * encoding,
    int options)

    parse an XML from a file descriptor and build a tree. NOTE that the file descriptor will not be closed when the reader is closed or reset.

    fd:an open file descriptor
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlReadFile

    xmlDocPtr	xmlReadFile		(const char * filename, 
    const char * encoding,
    int options)

    parse an XML file from the filesystem or the network.

    filename:a file or URL
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlReadIO

    xmlDocPtr	xmlReadIO		(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML document from I/O functions and source and build a tree.

    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlReadMemory

    xmlDocPtr	xmlReadMemory		(const char * buffer, 
    int size,
    const char * URL,
    const char * encoding,
    int options)

    parse an XML in-memory document and build a tree.

    buffer:a pointer to a char array
    size:the size of the array
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the resulting document tree

    Function: xmlRecoverDoc

    xmlDocPtr	xmlRecoverDoc		(const xmlChar * cur)

    parse an XML in-memory document and build a tree. In the case the document is not Well Formed, a attempt to build a tree is tried anyway

    cur:a pointer to an array of xmlChar
    Returns:the resulting document tree or NULL in case of failure

    Function: xmlRecoverFile

    xmlDocPtr	xmlRecoverFile		(const char * filename)

    parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. In the case the document is not Well Formed, it attempts to build a tree anyway

    filename:the filename
    Returns:the resulting document tree or NULL in case of failure

    Function: xmlRecoverMemory

    xmlDocPtr	xmlRecoverMemory	(const char * buffer, 
    int size)

    parse an XML in-memory block and build a tree. In the case the document is not Well Formed, an attempt to build a tree is tried anyway

    buffer:an pointer to a char array
    size:the size of the array
    Returns:the resulting document tree or NULL in case of error

    Function: xmlSAXParseDTD

    xmlDtdPtr	xmlSAXParseDTD		(xmlSAXHandlerPtr sax, 
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Load and parse an external subset.

    sax:the SAX handler block
    ExternalID:a NAME* containing the External ID of the DTD
    SystemID:a NAME* containing the URL to the DTD
    Returns:the resulting xmlDtdPtr or NULL in case of error.

    Function: xmlSAXParseDoc

    xmlDocPtr	xmlSAXParseDoc		(xmlSAXHandlerPtr sax, 
    const xmlChar * cur,
    int recovery)

    parse an XML in-memory document and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

    sax:the SAX handler block
    cur:a pointer to an array of xmlChar
    recovery:work in recovery mode, i.e. tries to read no Well Formed documents
    Returns:the resulting document tree

    Function: xmlSAXParseEntity

    xmlDocPtr	xmlSAXParseEntity	(xmlSAXHandlerPtr sax, 
    const char * filename)

    parse an XML external entity out of context and build a tree. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. [78] extParsedEnt ::= TextDecl? content This correspond to a "Well Balanced" chunk

    sax:the SAX handler block
    filename:the filename
    Returns:the resulting document tree

    Function: xmlSAXParseFile

    xmlDocPtr	xmlSAXParseFile		(xmlSAXHandlerPtr sax, 
    const char * filename,
    int recovery)

    parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

    sax:the SAX handler block
    filename:the filename
    recovery:work in recovery mode, i.e. tries to read no Well Formed documents
    Returns:the resulting document tree

    Function: xmlSAXParseFileWithData

    xmlDocPtr	xmlSAXParseFileWithData	(xmlSAXHandlerPtr sax, 
    const char * filename,
    int recovery,
    void * data)

    parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. It use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml

    sax:the SAX handler block
    filename:the filename
    recovery:work in recovery mode, i.e. tries to read no Well Formed documents
    data:the userdata
    Returns:the resulting document tree

    Function: xmlSAXParseMemory

    xmlDocPtr	xmlSAXParseMemory	(xmlSAXHandlerPtr sax, 
    const char * buffer,
    int size,
    int recovery)

    parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines.

    sax:the SAX handler block
    buffer:an pointer to a char array
    size:the size of the array
    recovery:work in recovery mode, i.e. tries to read not Well Formed documents
    Returns:the resulting document tree

    Function: xmlSAXParseMemoryWithData

    xmlDocPtr	xmlSAXParseMemoryWithData	(xmlSAXHandlerPtr sax, 
    const char * buffer,
    int size,
    int recovery,
    void * data)

    parse an XML in-memory block and use the given SAX function block to handle the parsing callback. If sax is NULL, fallback to the default DOM tree building routines. User data (void *) is stored within the parser context in the context's _private member, so it is available nearly everywhere in libxml

    sax:the SAX handler block
    buffer:an pointer to a char array
    size:the size of the array
    recovery:work in recovery mode, i.e. tries to read no Well Formed documents
    data:the userdata
    Returns:the resulting document tree

    Function: xmlSAXUserParseFile

    int	xmlSAXUserParseFile		(xmlSAXHandlerPtr sax, 
    void * user_data,
    const char * filename)

    parse an XML file and call the given SAX handler routines. Automatic support for ZLIB/Compress compressed document is provided

    sax:a SAX handler
    user_data:The user data returned on SAX callbacks
    filename:a file name
    Returns:0 in case of success or a error number otherwise

    Function: xmlSAXUserParseMemory

    int	xmlSAXUserParseMemory		(xmlSAXHandlerPtr sax, 
    void * user_data,
    const char * buffer,
    int size)

    A better SAX parsing routine. parse an XML in-memory buffer and call the given SAX handler routines.

    sax:a SAX handler
    user_data:The user data returned on SAX callbacks
    buffer:an in-memory XML document input
    size:the length of the XML document in bytes
    Returns:0 in case of success or a error number otherwise

    Function: xmlSetExternalEntityLoader

    void	xmlSetExternalEntityLoader	(xmlExternalEntityLoader f)

    Changes the defaultexternal entity resolver function for the application

    f:the new entity resolver function

    Function: xmlSetFeature

    int	xmlSetFeature			(xmlParserCtxtPtr ctxt, 
    const char * name,
    void * value)

    Change the current value of one feature of this parser instance

    ctxt:an XML/HTML parser context
    name:the feature name
    value:pointer to the location of the new value
    Returns:-1 in case or error, 0 otherwise

    Function: xmlSetupParserForBuffer

    void	xmlSetupParserForBuffer		(xmlParserCtxtPtr ctxt, 
    const xmlChar * buffer,
    const char * filename)

    Setup the parser context to parse a new buffer; Clears any prior contents from the parser context. The buffer parameter must not be NULL, but the filename parameter can be

    ctxt:an XML parser context
    buffer:a xmlChar * buffer
    filename:a file name

    Function: xmlStopParser

    void	xmlStopParser			(xmlParserCtxtPtr ctxt)

    Blocks further parser processing

    ctxt:an XML parser context

    Function: xmlSubstituteEntitiesDefault

    int	xmlSubstituteEntitiesDefault	(int val)

    Set and return the previous value for default entity support. Initially the parser always keep entity references instead of substituting entity values in the output. This function has to be used to change the default parser behavior SAX::substituteEntities() has to be used for changing that on a file by file basis.

    val:int 0 or 1
    Returns:the last value for 0 for no substitution, 1 for substitution.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/left.png0000644000175000017500000000071311234335462015731 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1&¹³[(XIDATxœµ•!OÃPEïÛ*ˆ‰ŠID%~ꊯ˜ÄÕ"pæ'öŘ`sÜ–¥rKf–´‚¤â h—mi—ÇIžz}÷ܯIû¤–.pÚö\“`xä‹ ˆl‡?l·[²,H¬‡¯×k<Ï#Žcþ%\’AUx[S³7–n6ù¾¯år¹ßèõzE‰‡’s’žŒ1³ºö“²æÅj@œ—NL$ݤiª0 ¿5/ð}¿²\E‡Ž¤KIo¥Í“$a0üjÞdF£bŠkIê„‹æAh>ŸW¶lC'?“tk;|/t*I»ÝN«ÕÊZø^`Œy•4ë÷ûšN§r]×® çJÒÌó<«’½À“Út»Ýú€à`±Xàºî1@p´ä€¸d½÷ŽZ')høÖÚK¬ ª$V?%Å]€­+³L’sgUKà"ÿw5â3O·•ÜòIEND®B`‚libxml2-2.9.1+dfsg1/doc/html/libxml-SAX.html0000644000175000017500000012473012134171042017075 0ustar aronaron Module SAX from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module SAX from libxml2

    API Menu
    API Indexes
    Related links

    This module is deprecated

    DEPRECATED set of SAX version 1 interfaces used to build the DOM tree.

    Table of Contents

    void	comment			(void * ctx, 
    const xmlChar * value)
    int	checkNamespace			(void * ctx, 
    xmlChar * namespace)
    int	getColumnNumber			(void * ctx)
    void	entityDecl			(void * ctx, 
    const xmlChar * name,
    int type,
    const xmlChar * publicId,
    const xmlChar * systemId,
    xmlChar * content)
    void	attribute			(void * ctx, 
    const xmlChar * fullname,
    const xmlChar * value)
    xmlNsPtr	getNamespace		(void * ctx)
    void	setDocumentLocator		(void * ctx, 
    xmlSAXLocatorPtr loc)
    void	initxmlDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr, 
    int warning)
    void	ignorableWhitespace		(void * ctx, 
    const xmlChar * ch,
    int len)
    int	hasExternalSubset		(void * ctx)
    void	unparsedEntityDecl		(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId,
    const xmlChar * notationName)
    void	globalNamespace			(void * ctx, 
    const xmlChar * href,
    const xmlChar * prefix)
    int	hasInternalSubset		(void * ctx)
    void	reference			(void * ctx, 
    const xmlChar * name)
    void	notationDecl			(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId)
    const xmlChar *	getSystemId		(void * ctx)
    void	externalSubset			(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    xmlParserInputPtr	resolveEntity	(void * ctx, 
    const xmlChar * publicId,
    const xmlChar * systemId)
    void	startDocument			(void * ctx)
    void	setNamespace			(void * ctx, 
    const xmlChar * name)
    void	cdataBlock			(void * ctx, 
    const xmlChar * value,
    int len)
    const xmlChar *	getPublicId		(void * ctx)
    void	inithtmlDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr)
    void	processingInstruction		(void * ctx, 
    const xmlChar * target,
    const xmlChar * data)
    void	endElement			(void * ctx, 
    const xmlChar * name)
    void	namespaceDecl			(void * ctx, 
    const xmlChar * href,
    const xmlChar * prefix)
    void	initdocbDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr)
    xmlEntityPtr	getEntity		(void * ctx, 
    const xmlChar * name)
    void	characters			(void * ctx, 
    const xmlChar * ch,
    int len)
    void	elementDecl			(void * ctx, 
    const xmlChar * name,
    int type,
    xmlElementContentPtr content)
    void	startElement			(void * ctx, 
    const xmlChar * fullname,
    const xmlChar ** atts)
    xmlEntityPtr	getParameterEntity	(void * ctx, 
    const xmlChar * name)
    void	attributeDecl			(void * ctx, 
    const xmlChar * elem,
    const xmlChar * fullname,
    int type,
    int def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)
    int	isStandalone			(void * ctx)
    void	internalSubset			(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    void	endDocument			(void * ctx)
    int	getLineNumber			(void * ctx)

    Description

    Function: comment

    void	comment			(void * ctx, 
    const xmlChar * value)

    A comment has been parsed. DEPRECATED: use xmlSAX2Comment()

    ctx:the user data (XML parser context)
    value:the comment content

    Function: checkNamespace

    int	checkNamespace			(void * ctx, 
    xmlChar * namespace)

    Check that the current element namespace is the same as the one read upon parsing. DEPRECATED

    ctx:the user data (XML parser context)
    namespace:the namespace to check against
    Returns:1 if true 0 otherwise

    Function: getColumnNumber

    int	getColumnNumber			(void * ctx)

    Provide the column number of the current parsing point. DEPRECATED: use xmlSAX2GetColumnNumber()

    ctx:the user data (XML parser context)
    Returns:an int

    Function: entityDecl

    void	entityDecl			(void * ctx, 
    const xmlChar * name,
    int type,
    const xmlChar * publicId,
    const xmlChar * systemId,
    xmlChar * content)

    An entity definition has been parsed DEPRECATED: use xmlSAX2EntityDecl()

    ctx:the user data (XML parser context)
    name:the entity name
    type:the entity type
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    content:the entity value (without processing).

    Function: attribute

    void	attribute			(void * ctx, 
    const xmlChar * fullname,
    const xmlChar * value)

    Handle an attribute that has been read by the parser. The default handling is to convert the attribute into an DOM subtree and past it in a new xmlAttr element added to the element. DEPRECATED: use xmlSAX2Attribute()

    ctx:the user data (XML parser context)
    fullname:The attribute name, including namespace prefix
    value:The attribute value

    Function: getNamespace

    xmlNsPtr	getNamespace		(void * ctx)

    Get the current element namespace. DEPRECATED

    ctx:the user data (XML parser context)
    Returns:the xmlNsPtr or NULL if none

    Function: setDocumentLocator

    void	setDocumentLocator		(void * ctx, 
    xmlSAXLocatorPtr loc)

    Receive the document locator at startup, actually xmlDefaultSAXLocator Everything is available on the context, so this is useless in our case. DEPRECATED

    ctx:the user data (XML parser context)
    loc:A SAX Locator

    Function: initxmlDefaultSAXHandler

    void	initxmlDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr, 
    int warning)

    Initialize the default XML SAX version 1 handler DEPRECATED: use xmlSAX2InitDefaultSAXHandler() for the new SAX2 blocks

    hdlr:the SAX handler
    warning:flag if non-zero sets the handler warning procedure

    Function: ignorableWhitespace

    void	ignorableWhitespace		(void * ctx, 
    const xmlChar * ch,
    int len)

    receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use characters DEPRECATED: use xmlSAX2IgnorableWhitespace()

    ctx:the user data (XML parser context)
    ch:a xmlChar string
    len:the number of xmlChar

    Function: hasExternalSubset

    int	hasExternalSubset		(void * ctx)

    Does this document has an external subset DEPRECATED: use xmlSAX2HasExternalSubset()

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function: unparsedEntityDecl

    void	unparsedEntityDecl		(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId,
    const xmlChar * notationName)

    What to do when an unparsed entity declaration is parsed DEPRECATED: use xmlSAX2UnparsedEntityDecl()

    ctx:the user data (XML parser context)
    name:The name of the entity
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    notationName:the name of the notation

    Function: globalNamespace

    void	globalNamespace			(void * ctx, 
    const xmlChar * href,
    const xmlChar * prefix)

    An old global namespace has been parsed. DEPRECATED

    ctx:the user data (XML parser context)
    href:the namespace associated URN
    prefix:the namespace prefix

    Function: hasInternalSubset

    int	hasInternalSubset		(void * ctx)

    Does this document has an internal subset DEPRECATED: use xmlSAX2HasInternalSubset()

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function: reference

    void	reference			(void * ctx, 
    const xmlChar * name)

    called when an entity reference is detected. DEPRECATED: use xmlSAX2Reference()

    ctx:the user data (XML parser context)
    name:The entity name

    Function: notationDecl

    void	notationDecl			(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId)

    What to do when a notation declaration has been parsed. DEPRECATED: use xmlSAX2NotationDecl()

    ctx:the user data (XML parser context)
    name:The name of the notation
    publicId:The public ID of the entity
    systemId:The system ID of the entity

    Function: getSystemId

    const xmlChar *	getSystemId		(void * ctx)

    Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd DEPRECATED: use xmlSAX2GetSystemId()

    ctx:the user data (XML parser context)
    Returns:a xmlChar *

    Function: externalSubset

    void	externalSubset			(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Callback on external subset declaration. DEPRECATED: use xmlSAX2ExternalSubset()

    ctx:the user data (XML parser context)
    name:the root element name
    ExternalID:the external ID
    SystemID:the SYSTEM ID (e.g. filename or URL)

    Function: resolveEntity

    xmlParserInputPtr	resolveEntity	(void * ctx, 
    const xmlChar * publicId,
    const xmlChar * systemId)

    The entity loader, to control the loading of external entities, the application can either: - override this resolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine DEPRECATED: use xmlSAX2ResolveEntity()

    ctx:the user data (XML parser context)
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    Returns:the xmlParserInputPtr if inlined or NULL for DOM behaviour.

    Function: startDocument

    void	startDocument			(void * ctx)

    called when the document start being processed. DEPRECATED: use xmlSAX2StartDocument()

    ctx:the user data (XML parser context)

    Function: setNamespace

    void	setNamespace			(void * ctx, 
    const xmlChar * name)

    Set the current element namespace. DEPRECATED

    ctx:the user data (XML parser context)
    name:the namespace prefix

    Function: cdataBlock

    void	cdataBlock			(void * ctx, 
    const xmlChar * value,
    int len)

    called when a pcdata block has been parsed DEPRECATED: use xmlSAX2CDataBlock()

    ctx:the user data (XML parser context)
    value:The pcdata content
    len:the block length

    Function: getPublicId

    const xmlChar *	getPublicId		(void * ctx)

    Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" DEPRECATED: use xmlSAX2GetPublicId()

    ctx:the user data (XML parser context)
    Returns:a xmlChar *

    Function: inithtmlDefaultSAXHandler

    void	inithtmlDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr)

    Initialize the default HTML SAX version 1 handler DEPRECATED: use xmlSAX2InitHtmlDefaultSAXHandler() for the new SAX2 blocks

    hdlr:the SAX handler

    Function: processingInstruction

    void	processingInstruction		(void * ctx, 
    const xmlChar * target,
    const xmlChar * data)

    A processing instruction has been parsed. DEPRECATED: use xmlSAX2ProcessingInstruction()

    ctx:the user data (XML parser context)
    target:the target name
    data:the PI data's

    Function: endElement

    void	endElement			(void * ctx, 
    const xmlChar * name)

    called when the end of an element has been detected. DEPRECATED: use xmlSAX2EndElement()

    ctx:the user data (XML parser context)
    name:The element name

    Function: namespaceDecl

    void	namespaceDecl			(void * ctx, 
    const xmlChar * href,
    const xmlChar * prefix)

    A namespace has been parsed. DEPRECATED

    ctx:the user data (XML parser context)
    href:the namespace associated URN
    prefix:the namespace prefix

    Function: initdocbDefaultSAXHandler

    void	initdocbDefaultSAXHandler	(xmlSAXHandlerV1 * hdlr)

    Initialize the default DocBook SAX version 1 handler DEPRECATED: use xmlSAX2InitDocbDefaultSAXHandler() for the new SAX2 blocks

    hdlr:the SAX handler

    Function: getEntity

    xmlEntityPtr	getEntity		(void * ctx, 
    const xmlChar * name)

    Get an entity by name DEPRECATED: use xmlSAX2GetEntity()

    ctx:the user data (XML parser context)
    name:The entity name
    Returns:the xmlEntityPtr if found.

    Function: characters

    void	characters			(void * ctx, 
    const xmlChar * ch,
    int len)

    receiving some chars from the parser. DEPRECATED: use xmlSAX2Characters()

    ctx:the user data (XML parser context)
    ch:a xmlChar string
    len:the number of xmlChar

    Function: elementDecl

    void	elementDecl			(void * ctx, 
    const xmlChar * name,
    int type,
    xmlElementContentPtr content)

    An element definition has been parsed DEPRECATED: use xmlSAX2ElementDecl()

    ctx:the user data (XML parser context)
    name:the element name
    type:the element type
    content:the element value tree

    Function: startElement

    void	startElement			(void * ctx, 
    const xmlChar * fullname,
    const xmlChar ** atts)

    called when an opening tag has been processed. DEPRECATED: use xmlSAX2StartElement()

    ctx:the user data (XML parser context)
    fullname:The element name, including namespace prefix
    atts:An array of name/value attributes pairs, NULL terminated

    Function: getParameterEntity

    xmlEntityPtr	getParameterEntity	(void * ctx, 
    const xmlChar * name)

    Get a parameter entity by name DEPRECATED: use xmlSAX2GetParameterEntity()

    ctx:the user data (XML parser context)
    name:The entity name
    Returns:the xmlEntityPtr if found.

    Function: attributeDecl

    void	attributeDecl			(void * ctx, 
    const xmlChar * elem,
    const xmlChar * fullname,
    int type,
    int def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)

    An attribute definition has been parsed DEPRECATED: use xmlSAX2AttributeDecl()

    ctx:the user data (XML parser context)
    elem:the name of the element
    fullname:the attribute name
    type:the attribute type
    def:the type of default value
    defaultValue:the attribute default value
    tree:the tree of enumerated value set

    Function: isStandalone

    int	isStandalone			(void * ctx)

    Is this document tagged standalone ? DEPRECATED: use xmlSAX2IsStandalone()

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function: internalSubset

    void	internalSubset			(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Callback on internal subset declaration. DEPRECATED: use xmlSAX2InternalSubset()

    ctx:the user data (XML parser context)
    name:the root element name
    ExternalID:the external ID
    SystemID:the SYSTEM ID (e.g. filename or URL)

    Function: endDocument

    void	endDocument			(void * ctx)

    called when the document end has been detected. DEPRECATED: use xmlSAX2EndDocument()

    ctx:the user data (XML parser context)

    Function: getLineNumber

    int	getLineNumber			(void * ctx)

    Provide the line number of the current parsing point. DEPRECATED: use xmlSAX2GetLineNumber()

    ctx:the user data (XML parser context)
    Returns:an int

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xpathInternals.html0000644000175000017500000042737612134171043021463 0ustar aronaron Module xpathInternals from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xpathInternals from libxml2

    API Menu
    API Indexes
    Related links

    internal interfaces for XML Path Language implementation used to build new modules on top of XPath like XPointer and XSLT

    Table of Contents

    #define CAST_TO_BOOLEAN
    #define CAST_TO_NUMBER
    #define CAST_TO_STRING
    #define CHECK_ARITY
    #define CHECK_ERROR
    #define CHECK_ERROR0
    #define CHECK_TYPE
    #define CHECK_TYPE0
    #define XP_ERROR
    #define XP_ERROR0
    #define xmlXPathCheckError
    #define xmlXPathEmptyNodeSet
    #define xmlXPathGetContextNode
    #define xmlXPathGetDocument
    #define xmlXPathGetError
    #define xmlXPathReturnBoolean
    #define xmlXPathReturnEmptyNodeSet
    #define xmlXPathReturnEmptyString
    #define xmlXPathReturnExternal
    #define xmlXPathReturnFalse
    #define xmlXPathReturnNodeSet
    #define xmlXPathReturnNumber
    #define xmlXPathReturnString
    #define xmlXPathReturnTrue
    #define xmlXPathSetArityError
    #define xmlXPathSetError
    #define xmlXPathSetTypeError
    #define xmlXPathStackIsExternal
    #define xmlXPathStackIsNodeSet
    xmlXPathObjectPtr	valuePop	(xmlXPathParserContextPtr ctxt)
    int	valuePush			(xmlXPathParserContextPtr ctxt, 
    xmlXPathObjectPtr value)
    void	xmlXPathAddValues		(xmlXPathParserContextPtr ctxt)
    void	xmlXPathBooleanFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathCeilingFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    int	xmlXPathCompareValues		(xmlXPathParserContextPtr ctxt, 
    int inf,
    int strict)
    void	xmlXPathConcatFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathContainsFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathCountFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathDebugDumpCompExpr	(FILE * output, 
    xmlXPathCompExprPtr comp,
    int depth)
    void	xmlXPathDebugDumpObject		(FILE * output, 
    xmlXPathObjectPtr cur,
    int depth)
    xmlNodeSetPtr	xmlXPathDifference	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)
    xmlNodeSetPtr	xmlXPathDistinct	(xmlNodeSetPtr nodes)
    xmlNodeSetPtr	xmlXPathDistinctSorted	(xmlNodeSetPtr nodes)
    void	xmlXPathDivValues		(xmlXPathParserContextPtr ctxt)
    int	xmlXPathEqualValues		(xmlXPathParserContextPtr ctxt)
    void	xmlXPathErr			(xmlXPathParserContextPtr ctxt, 
    int error)
    void	xmlXPathEvalExpr		(xmlXPathParserContextPtr ctxt)
    int	xmlXPathEvaluatePredicateResult	(xmlXPathParserContextPtr ctxt, 
    xmlXPathObjectPtr res)
    void	xmlXPathFalseFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathFloorFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathFreeParserContext	(xmlXPathParserContextPtr ctxt)
    xmlXPathFunction	xmlXPathFunctionLookup	(xmlXPathContextPtr ctxt, 
    const xmlChar * name)
    xmlXPathFunction	xmlXPathFunctionLookupNS	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)
    int	xmlXPathHasSameNodes		(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)
    void	xmlXPathIdFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    xmlNodeSetPtr	xmlXPathIntersection	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)
    int	xmlXPathIsNodeType		(const xmlChar * name)
    void	xmlXPathLangFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathLastFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    xmlNodeSetPtr	xmlXPathLeading		(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)
    xmlNodeSetPtr	xmlXPathLeadingSorted	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)
    void	xmlXPathLocalNameFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathModValues		(xmlXPathParserContextPtr ctxt)
    void	xmlXPathMultValues		(xmlXPathParserContextPtr ctxt)
    void	xmlXPathNamespaceURIFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    xmlXPathObjectPtr	xmlXPathNewBoolean	(int val)
    xmlXPathObjectPtr	xmlXPathNewCString	(const char * val)
    xmlXPathObjectPtr	xmlXPathNewFloat	(double val)
    xmlXPathObjectPtr	xmlXPathNewNodeSet	(xmlNodePtr val)
    xmlXPathObjectPtr	xmlXPathNewNodeSetList	(xmlNodeSetPtr val)
    xmlXPathParserContextPtr	xmlXPathNewParserContext	(const xmlChar * str, 
    xmlXPathContextPtr ctxt)
    xmlXPathObjectPtr	xmlXPathNewString	(const xmlChar * val)
    xmlXPathObjectPtr	xmlXPathNewValueTree	(xmlNodePtr val)
    xmlNodePtr	xmlXPathNextAncestor	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextAncestorOrSelf	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextAttribute	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextChild	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextDescendant	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextDescendantOrSelf	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextFollowing	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextFollowingSibling	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextNamespace	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextParent	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextPreceding	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextPrecedingSibling	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodePtr	xmlXPathNextSelf	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)
    xmlNodeSetPtr	xmlXPathNodeLeading	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)
    xmlNodeSetPtr	xmlXPathNodeLeadingSorted	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)
    int	xmlXPathNodeSetAdd		(xmlNodeSetPtr cur, 
    xmlNodePtr val)
    int	xmlXPathNodeSetAddNs		(xmlNodeSetPtr cur, 
    xmlNodePtr node,
    xmlNsPtr ns)
    int	xmlXPathNodeSetAddUnique	(xmlNodeSetPtr cur, 
    xmlNodePtr val)
    int	xmlXPathNodeSetContains		(xmlNodeSetPtr cur, 
    xmlNodePtr val)
    void	xmlXPathNodeSetDel		(xmlNodeSetPtr cur, 
    xmlNodePtr val)
    void	xmlXPathNodeSetFreeNs		(xmlNsPtr ns)
    xmlNodeSetPtr	xmlXPathNodeSetMerge	(xmlNodeSetPtr val1, 
    xmlNodeSetPtr val2)
    void	xmlXPathNodeSetRemove		(xmlNodeSetPtr cur, 
    int val)
    void	xmlXPathNodeSetSort		(xmlNodeSetPtr set)
    xmlNodeSetPtr	xmlXPathNodeTrailing	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)
    xmlNodeSetPtr	xmlXPathNodeTrailingSorted	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)
    void	xmlXPathNormalizeFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    int	xmlXPathNotEqualValues		(xmlXPathParserContextPtr ctxt)
    void	xmlXPathNotFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    const xmlChar *	xmlXPathNsLookup	(xmlXPathContextPtr ctxt, 
    const xmlChar * prefix)
    void	xmlXPathNumberFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    xmlChar *	xmlXPathParseNCName	(xmlXPathParserContextPtr ctxt)
    xmlChar *	xmlXPathParseName	(xmlXPathParserContextPtr ctxt)
    int	xmlXPathPopBoolean		(xmlXPathParserContextPtr ctxt)
    void *	xmlXPathPopExternal		(xmlXPathParserContextPtr ctxt)
    xmlNodeSetPtr	xmlXPathPopNodeSet	(xmlXPathParserContextPtr ctxt)
    double	xmlXPathPopNumber		(xmlXPathParserContextPtr ctxt)
    xmlChar *	xmlXPathPopString	(xmlXPathParserContextPtr ctxt)
    void	xmlXPathPositionFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathRegisterAllFunctions	(xmlXPathContextPtr ctxt)
    int	xmlXPathRegisterFunc		(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    xmlXPathFunction f)
    void	xmlXPathRegisterFuncLookup	(xmlXPathContextPtr ctxt, 
    xmlXPathFuncLookupFunc f,
    void * funcCtxt)
    int	xmlXPathRegisterFuncNS		(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri,
    xmlXPathFunction f)
    int	xmlXPathRegisterNs		(xmlXPathContextPtr ctxt, 
    const xmlChar * prefix,
    const xmlChar * ns_uri)
    int	xmlXPathRegisterVariable	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    xmlXPathObjectPtr value)
    void	xmlXPathRegisterVariableLookup	(xmlXPathContextPtr ctxt, 
    xmlXPathVariableLookupFunc f,
    void * data)
    int	xmlXPathRegisterVariableNS	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri,
    xmlXPathObjectPtr value)
    void	xmlXPathRegisteredFuncsCleanup	(xmlXPathContextPtr ctxt)
    void	xmlXPathRegisteredNsCleanup	(xmlXPathContextPtr ctxt)
    void	xmlXPathRegisteredVariablesCleanup	(xmlXPathContextPtr ctxt)
    void	xmlXPathRoot			(xmlXPathParserContextPtr ctxt)
    void	xmlXPathRoundFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathStartsWithFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    double	xmlXPathStringEvalNumber	(const xmlChar * str)
    void	xmlXPathStringFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathStringLengthFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathSubValues		(xmlXPathParserContextPtr ctxt)
    void	xmlXPathSubstringAfterFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathSubstringBeforeFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathSubstringFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathSumFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    xmlNodeSetPtr	xmlXPathTrailing	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)
    xmlNodeSetPtr	xmlXPathTrailingSorted	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)
    void	xmlXPathTranslateFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathTrueFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)
    void	xmlXPathValueFlipSign		(xmlXPathParserContextPtr ctxt)
    xmlXPathObjectPtr	xmlXPathVariableLookup	(xmlXPathContextPtr ctxt, 
    const xmlChar * name)
    xmlXPathObjectPtr	xmlXPathVariableLookupNS	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)
    xmlXPathObjectPtr	xmlXPathWrapCString	(char * val)
    xmlXPathObjectPtr	xmlXPathWrapExternal	(void * val)
    xmlXPathObjectPtr	xmlXPathWrapNodeSet	(xmlNodeSetPtr val)
    xmlXPathObjectPtr	xmlXPathWrapString	(xmlChar * val)
    void	xmlXPatherror			(xmlXPathParserContextPtr ctxt, 
    const char * file,
    int line,
    int no)

    Description

    Macro: CAST_TO_BOOLEAN

    #define CAST_TO_BOOLEAN

    Macro to try to cast the value on the top of the XPath stack to a boolean.

    Macro: CAST_TO_NUMBER

    #define CAST_TO_NUMBER

    Macro to try to cast the value on the top of the XPath stack to a number.

    Macro: CAST_TO_STRING

    #define CAST_TO_STRING

    Macro to try to cast the value on the top of the XPath stack to a string.

    Macro: CHECK_ARITY

    #define CHECK_ARITY

    Macro to check that the number of args passed to an XPath function matches.

    Macro: CHECK_ERROR

    #define CHECK_ERROR

    Macro to return from the function if an XPath error was detected.

    Macro: CHECK_ERROR0

    #define CHECK_ERROR0

    Macro to return 0 from the function if an XPath error was detected.

    Macro: CHECK_TYPE

    #define CHECK_TYPE

    Macro to check that the value on top of the XPath stack is of a given type.

    Macro: CHECK_TYPE0

    #define CHECK_TYPE0

    Macro to check that the value on top of the XPath stack is of a given type. Return(0) in case of failure

    Macro: XP_ERROR

    #define XP_ERROR

    Macro to raise an XPath error and return.

    Macro: XP_ERROR0

    #define XP_ERROR0

    Macro to raise an XPath error and return 0.

    Macro: xmlXPathCheckError

    #define xmlXPathCheckError

    Check if an XPath error was raised. Returns true if an error has been raised, false otherwise.

    Macro: xmlXPathEmptyNodeSet

    #define xmlXPathEmptyNodeSet

    Empties a node-set.

    Macro: xmlXPathGetContextNode

    #define xmlXPathGetContextNode

    Get the context node of an XPath context. Returns the context node.

    Macro: xmlXPathGetDocument

    #define xmlXPathGetDocument

    Get the document of an XPath context. Returns the context document.

    Macro: xmlXPathGetError

    #define xmlXPathGetError

    Get the error code of an XPath context. Returns the context error.

    Macro: xmlXPathReturnBoolean

    #define xmlXPathReturnBoolean

    Pushes the boolean @val on the context stack.

    Macro: xmlXPathReturnEmptyNodeSet

    #define xmlXPathReturnEmptyNodeSet

    Pushes an empty node-set on the context stack.

    Macro: xmlXPathReturnEmptyString

    #define xmlXPathReturnEmptyString

    Pushes an empty string on the stack.

    Macro: xmlXPathReturnExternal

    #define xmlXPathReturnExternal

    Pushes user data on the context stack.

    Macro: xmlXPathReturnFalse

    #define xmlXPathReturnFalse

    Pushes false on the context stack.

    Macro: xmlXPathReturnNodeSet

    #define xmlXPathReturnNodeSet

    Pushes the node-set @ns on the context stack.

    Macro: xmlXPathReturnNumber

    #define xmlXPathReturnNumber

    Pushes the double @val on the context stack.

    Macro: xmlXPathReturnString

    #define xmlXPathReturnString

    Pushes the string @str on the context stack.

    Macro: xmlXPathReturnTrue

    #define xmlXPathReturnTrue

    Pushes true on the context stack.

    Macro: xmlXPathSetArityError

    #define xmlXPathSetArityError

    Raises an XPATH_INVALID_ARITY error.

    Macro: xmlXPathSetError

    #define xmlXPathSetError

    Raises an error.

    Macro: xmlXPathSetTypeError

    #define xmlXPathSetTypeError

    Raises an XPATH_INVALID_TYPE error.

    Macro: xmlXPathStackIsExternal

    #define xmlXPathStackIsExternal

    Checks if the current value on the XPath stack is an external object. Returns true if the current object on the stack is an external object.

    Macro: xmlXPathStackIsNodeSet

    #define xmlXPathStackIsNodeSet

    Check if the current value on the XPath stack is a node set or an XSLT value tree. Returns true if the current object on the stack is a node-set.

    Function: valuePop

    xmlXPathObjectPtr	valuePop	(xmlXPathParserContextPtr ctxt)

    Pops the top XPath object from the value stack

    ctxt:an XPath evaluation context
    Returns:the XPath object just removed

    Function: valuePush

    int	valuePush			(xmlXPathParserContextPtr ctxt, 
    xmlXPathObjectPtr value)

    Pushes a new XPath object on top of the value stack

    ctxt:an XPath evaluation context
    value:the XPath object
    Returns:the number of items on the value stack

    Function: xmlXPathAddValues

    void	xmlXPathAddValues		(xmlXPathParserContextPtr ctxt)

    Implement the add operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.

    ctxt:the XPath Parser context

    Function: xmlXPathBooleanFunction

    void	xmlXPathBooleanFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the boolean() XPath function boolean boolean(object) The boolean function converts its argument to a boolean as follows: - a number is true if and only if it is neither positive or negative zero nor NaN - a node-set is true if and only if it is non-empty - a string is true if and only if its length is non-zero

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathCeilingFunction

    void	xmlXPathCeilingFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the ceiling() XPath function number ceiling(number) The ceiling function returns the smallest (closest to negative infinity) number that is not less than the argument and that is an integer.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathCompareValues

    int	xmlXPathCompareValues		(xmlXPathParserContextPtr ctxt, 
    int inf,
    int strict)

    Implement the compare operation on XPath objects: @arg1 < @arg2 (1, 1, ... @arg1 <= @arg2 (1, 0, ... @arg1 > @arg2 (0, 1, ... @arg1 >= @arg2 (0, 0, ... When neither object to be compared is a node-set and the operator is <=, <, >=, >, then the objects are compared by converted both objects to numbers and comparing the numbers according to IEEE 754. The < comparison will be true if and only if the first number is less than the second number. The <= comparison will be true if and only if the first number is less than or equal to the second number. The > comparison will be true if and only if the first number is greater than the second number. The >= comparison will be true if and only if the first number is greater than or equal to the second number.

    ctxt:the XPath Parser context
    inf:less than (1) or greater than (0)
    strict:is the comparison strict
    Returns:1 if the comparison succeeded, 0 if it failed

    Function: xmlXPathConcatFunction

    void	xmlXPathConcatFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the concat() XPath function string concat(string, string, string*) The concat function returns the concatenation of its arguments.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathContainsFunction

    void	xmlXPathContainsFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the contains() XPath function boolean contains(string, string) The contains function returns true if the first argument string contains the second argument string, and otherwise returns false.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathCountFunction

    void	xmlXPathCountFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the count() XPath function number count(node-set)

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathDebugDumpCompExpr

    void	xmlXPathDebugDumpCompExpr	(FILE * output, 
    xmlXPathCompExprPtr comp,
    int depth)

    Dumps the tree of the compiled XPath expression.

    output:the FILE * for the output
    comp:the precompiled XPath expression
    depth:the indentation level.

    Function: xmlXPathDebugDumpObject

    void	xmlXPathDebugDumpObject		(FILE * output, 
    xmlXPathObjectPtr cur,
    int depth)

    Dump the content of the object for debugging purposes

    output:the FILE * to dump the output
    cur:the object to inspect
    depth:indentation level

    Function: xmlXPathDifference

    xmlNodeSetPtr	xmlXPathDifference	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)

    Implements the EXSLT - Sets difference() function: node-set set:difference (node-set, node-set)

    nodes1:a node-set
    nodes2:a node-set
    Returns:the difference between the two node sets, or nodes1 if nodes2 is empty

    Function: xmlXPathDistinct

    xmlNodeSetPtr	xmlXPathDistinct	(xmlNodeSetPtr nodes)

    Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set) @nodes is sorted by document order, then #exslSetsDistinctSorted is called with the sorted node-set

    nodes:a node-set
    Returns:a subset of the nodes contained in @nodes, or @nodes if it is empty

    Function: xmlXPathDistinctSorted

    xmlNodeSetPtr	xmlXPathDistinctSorted	(xmlNodeSetPtr nodes)

    Implements the EXSLT - Sets distinct() function: node-set set:distinct (node-set)

    nodes:a node-set, sorted by document order
    Returns:a subset of the nodes contained in @nodes, or @nodes if it is empty

    Function: xmlXPathDivValues

    void	xmlXPathDivValues		(xmlXPathParserContextPtr ctxt)

    Implement the div operation on XPath objects @arg1 / @arg2: The numeric operators convert their operands to numbers as if by calling the number function.

    ctxt:the XPath Parser context

    Function: xmlXPathEqualValues

    int	xmlXPathEqualValues		(xmlXPathParserContextPtr ctxt)

    Implement the equal operation on XPath objects content: @arg1 == @arg2

    ctxt:the XPath Parser context
    Returns:0 or 1 depending on the results of the test.

    Function: xmlXPathErr

    void	xmlXPathErr			(xmlXPathParserContextPtr ctxt, 
    int error)

    Handle an XPath error

    ctxt:a XPath parser context
    error:the error code

    Function: xmlXPathEvalExpr

    void	xmlXPathEvalExpr		(xmlXPathParserContextPtr ctxt)

    Parse and evaluate an XPath expression in the given context, then push the result on the context stack

    ctxt:the XPath Parser context

    Function: xmlXPathEvaluatePredicateResult

    int	xmlXPathEvaluatePredicateResult	(xmlXPathParserContextPtr ctxt, 
    xmlXPathObjectPtr res)

    Evaluate a predicate result for the current node. A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the position of the context node in the context node list (as returned by the position function) and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function.

    ctxt:the XPath Parser context
    res:the Predicate Expression evaluation result
    Returns:1 if predicate is true, 0 otherwise

    Function: xmlXPathFalseFunction

    void	xmlXPathFalseFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the false() XPath function boolean false()

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathFloorFunction

    void	xmlXPathFloorFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the floor() XPath function number floor(number) The floor function returns the largest (closest to positive infinity) number that is not greater than the argument and that is an integer.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathFreeParserContext

    void	xmlXPathFreeParserContext	(xmlXPathParserContextPtr ctxt)

    Free up an xmlXPathParserContext

    ctxt:the context to free

    Function: xmlXPathFunctionLookup

    xmlXPathFunction	xmlXPathFunctionLookup	(xmlXPathContextPtr ctxt, 
    const xmlChar * name)

    Search in the Function array of the context for the given function.

    ctxt:the XPath context
    name:the function name
    Returns:the xmlXPathFunction or NULL if not found

    Function: xmlXPathFunctionLookupNS

    xmlXPathFunction	xmlXPathFunctionLookupNS	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)

    Search in the Function array of the context for the given function.

    ctxt:the XPath context
    name:the function name
    ns_uri:the function namespace URI
    Returns:the xmlXPathFunction or NULL if not found

    Function: xmlXPathHasSameNodes

    int	xmlXPathHasSameNodes		(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)

    Implements the EXSLT - Sets has-same-nodes function: boolean set:has-same-node(node-set, node-set)

    nodes1:a node-set
    nodes2:a node-set
    Returns:true (1) if @nodes1 shares any node with @nodes2, false (0) otherwise

    Function: xmlXPathIdFunction

    void	xmlXPathIdFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the id() XPath function node-set id(object) The id function selects elements by their unique ID (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, then the result is the union of the result of applying id to the string value of each of the nodes in the argument node-set. When the argument to id is of any other type, the argument is converted to a string as if by a call to the string function; the string is split into a whitespace-separated list of tokens (whitespace is any sequence of characters matching the production S); the result is a node-set containing the elements in the same document as the context node that have a unique ID equal to any of the tokens in the list.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathIntersection

    xmlNodeSetPtr	xmlXPathIntersection	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)

    Implements the EXSLT - Sets intersection() function: node-set set:intersection (node-set, node-set)

    nodes1:a node-set
    nodes2:a node-set
    Returns:a node set comprising the nodes that are within both the node sets passed as arguments

    Function: xmlXPathIsNodeType

    int	xmlXPathIsNodeType		(const xmlChar * name)

    Is the name given a NodeType one. [38] NodeType ::= 'comment' | 'text' | 'processing-instruction' | 'node'

    name:a name string
    Returns:1 if true 0 otherwise

    Function: xmlXPathLangFunction

    void	xmlXPathLangFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the lang() XPath function boolean lang(string) The lang function returns true or false depending on whether the language of the context node as specified by xml:lang attributes is the same as or is a sublanguage of the language specified by the argument string. The language of the context node is determined by the value of the xml:lang attribute on the context node, or, if the context node has no xml:lang attribute, by the value of the xml:lang attribute on the nearest ancestor of the context node that has an xml:lang attribute. If there is no such attribute, then lang

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathLastFunction

    void	xmlXPathLastFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the last() XPath function number last() The last function returns the number of nodes in the context node list.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathLeading

    xmlNodeSetPtr	xmlXPathLeading		(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)

    Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #exslSetsLeadingSorted is called.

    nodes1:a node-set
    nodes2:a node-set
    Returns:the nodes in @nodes1 that precede the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

    Function: xmlXPathLeadingSorted

    xmlNodeSetPtr	xmlXPathLeadingSorted	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)

    Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set)

    nodes1:a node-set, sorted by document order
    nodes2:a node-set, sorted by document order
    Returns:the nodes in @nodes1 that precede the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

    Function: xmlXPathLocalNameFunction

    void	xmlXPathLocalNameFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the local-name() XPath function string local-name(node-set?) The local-name function returns a string containing the local part of the name of the node in the argument node-set that is first in document order. If the node-set is empty or the first node has no name, an empty string is returned. If the argument is omitted it defaults to the context node.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathModValues

    void	xmlXPathModValues		(xmlXPathParserContextPtr ctxt)

    Implement the mod operation on XPath objects: @arg1 / @arg2 The numeric operators convert their operands to numbers as if by calling the number function.

    ctxt:the XPath Parser context

    Function: xmlXPathMultValues

    void	xmlXPathMultValues		(xmlXPathParserContextPtr ctxt)

    Implement the multiply operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.

    ctxt:the XPath Parser context

    Function: xmlXPathNamespaceURIFunction

    void	xmlXPathNamespaceURIFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the namespace-uri() XPath function string namespace-uri(node-set?) The namespace-uri function returns a string containing the namespace URI of the expanded name of the node in the argument node-set that is first in document order. If the node-set is empty, the first node has no name, or the expanded name has no namespace URI, an empty string is returned. If the argument is omitted it defaults to the context node.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathNewBoolean

    xmlXPathObjectPtr	xmlXPathNewBoolean	(int val)

    Create a new xmlXPathObjectPtr of type boolean and of value @val

    val:the boolean value
    Returns:the newly created object.

    Function: xmlXPathNewCString

    xmlXPathObjectPtr	xmlXPathNewCString	(const char * val)

    Create a new xmlXPathObjectPtr of type string and of value @val

    val:the char * value
    Returns:the newly created object.

    Function: xmlXPathNewFloat

    xmlXPathObjectPtr	xmlXPathNewFloat	(double val)

    Create a new xmlXPathObjectPtr of type double and of value @val

    val:the double value
    Returns:the newly created object.

    Function: xmlXPathNewNodeSet

    xmlXPathObjectPtr	xmlXPathNewNodeSet	(xmlNodePtr val)

    Create a new xmlXPathObjectPtr of type NodeSet and initialize it with the single Node @val

    val:the NodePtr value
    Returns:the newly created object.

    Function: xmlXPathNewNodeSetList

    xmlXPathObjectPtr	xmlXPathNewNodeSetList	(xmlNodeSetPtr val)

    Create a new xmlXPathObjectPtr of type NodeSet and initialize it with the Nodeset @val

    val:an existing NodeSet
    Returns:the newly created object.

    Function: xmlXPathNewParserContext

    xmlXPathParserContextPtr	xmlXPathNewParserContext	(const xmlChar * str, 
    xmlXPathContextPtr ctxt)

    Create a new xmlXPathParserContext

    str:the XPath expression
    ctxt:the XPath context
    Returns:the xmlXPathParserContext just allocated.

    Function: xmlXPathNewString

    xmlXPathObjectPtr	xmlXPathNewString	(const xmlChar * val)

    Create a new xmlXPathObjectPtr of type string and of value @val

    val:the xmlChar * value
    Returns:the newly created object.

    Function: xmlXPathNewValueTree

    xmlXPathObjectPtr	xmlXPathNewValueTree	(xmlNodePtr val)

    Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize it with the tree root @val

    val:the NodePtr value
    Returns:the newly created object.

    Function: xmlXPathNextAncestor

    xmlNodePtr	xmlXPathNextAncestor	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "ancestor" direction the ancestor axis contains the ancestors of the context node; the ancestors of the context node consist of the parent of context node and the parent's parent and so on; the nodes are ordered in reverse document order; thus the parent is the first node on the axis, and the parent's parent is the second node on the axis

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextAncestorOrSelf

    xmlNodePtr	xmlXPathNextAncestorOrSelf	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "ancestor-or-self" direction he ancestor-or-self axis contains the context node and ancestors of the context node in reverse document order; thus the context node is the first node on the axis, and the context node's parent the second; parent here is defined the same as with the parent axis.

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextAttribute

    xmlNodePtr	xmlXPathNextAttribute	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "attribute" direction TODO: support DTD inherited default attributes

    ctxt:the XPath Parser context
    cur:the current attribute in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextChild

    xmlNodePtr	xmlXPathNextChild	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "child" direction The child axis contains the children of the context node in document order.

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextDescendant

    xmlNodePtr	xmlXPathNextDescendant	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "descendant" direction the descendant axis contains the descendants of the context node in document order; a descendant is a child or a child of a child and so on.

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextDescendantOrSelf

    xmlNodePtr	xmlXPathNextDescendantOrSelf	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "descendant-or-self" direction the descendant-or-self axis contains the context node and the descendants of the context node in document order; thus the context node is the first node on the axis, and the first child of the context node is the second node on the axis

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextFollowing

    xmlNodePtr	xmlXPathNextFollowing	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "following" direction The following axis contains all nodes in the same document as the context node that are after the context node in document order, excluding any descendants and excluding attribute nodes and namespace nodes; the nodes are ordered in document order

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextFollowingSibling

    xmlNodePtr	xmlXPathNextFollowingSibling	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "following-sibling" direction The following-sibling axis contains the following siblings of the context node in document order.

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextNamespace

    xmlNodePtr	xmlXPathNextNamespace	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "namespace" direction the namespace axis contains the namespace nodes of the context node; the order of nodes on this axis is implementation-defined; the axis will be empty unless the context node is an element We keep the XML namespace node at the end of the list.

    ctxt:the XPath Parser context
    cur:the current attribute in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextParent

    xmlNodePtr	xmlXPathNextParent	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "parent" direction The parent axis contains the parent of the context node, if there is one.

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextPreceding

    xmlNodePtr	xmlXPathNextPreceding	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "preceding" direction the preceding axis contains all nodes in the same document as the context node that are before the context node in document order, excluding any ancestors and excluding attribute nodes and namespace nodes; the nodes are ordered in reverse document order

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextPrecedingSibling

    xmlNodePtr	xmlXPathNextPrecedingSibling	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "preceding-sibling" direction The preceding-sibling axis contains the preceding siblings of the context node in reverse document order; the first preceding sibling is first on the axis; the sibling preceding that node is the second on the axis and so on.

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNextSelf

    xmlNodePtr	xmlXPathNextSelf	(xmlXPathParserContextPtr ctxt, 
    xmlNodePtr cur)

    Traversal function for the "self" direction The self axis contains just the context node itself

    ctxt:the XPath Parser context
    cur:the current node in the traversal
    Returns:the next element following that axis

    Function: xmlXPathNodeLeading

    xmlNodeSetPtr	xmlXPathNodeLeading	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)

    Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set) @nodes is sorted by document order, then #exslSetsNodeLeadingSorted is called.

    nodes:a node-set
    node:a node
    Returns:the nodes in @nodes that precede @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

    Function: xmlXPathNodeLeadingSorted

    xmlNodeSetPtr	xmlXPathNodeLeadingSorted	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)

    Implements the EXSLT - Sets leading() function: node-set set:leading (node-set, node-set)

    nodes:a node-set, sorted by document order
    node:a node
    Returns:the nodes in @nodes that precede @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

    Function: xmlXPathNodeSetAdd

    int	xmlXPathNodeSetAdd		(xmlNodeSetPtr cur, 
    xmlNodePtr val)

    add a new xmlNodePtr to an existing NodeSet

    cur:the initial node set
    val:a new xmlNodePtr
    Returns:0 in case of success, and -1 in case of error

    Function: xmlXPathNodeSetAddNs

    int	xmlXPathNodeSetAddNs		(xmlNodeSetPtr cur, 
    xmlNodePtr node,
    xmlNsPtr ns)

    add a new namespace node to an existing NodeSet

    cur:the initial node set
    node:the hosting node
    ns:a the namespace node
    Returns:0 in case of success and -1 in case of error

    Function: xmlXPathNodeSetAddUnique

    int	xmlXPathNodeSetAddUnique	(xmlNodeSetPtr cur, 
    xmlNodePtr val)

    add a new xmlNodePtr to an existing NodeSet, optimized version when we are sure the node is not already in the set.

    cur:the initial node set
    val:a new xmlNodePtr
    Returns:0 in case of success and -1 in case of failure

    Function: xmlXPathNodeSetContains

    int	xmlXPathNodeSetContains		(xmlNodeSetPtr cur, 
    xmlNodePtr val)

    checks whether @cur contains @val

    cur:the node-set
    val:the node
    Returns:true (1) if @cur contains @val, false (0) otherwise

    Function: xmlXPathNodeSetDel

    void	xmlXPathNodeSetDel		(xmlNodeSetPtr cur, 
    xmlNodePtr val)

    Removes an xmlNodePtr from an existing NodeSet

    cur:the initial node set
    val:an xmlNodePtr

    Function: xmlXPathNodeSetFreeNs

    void	xmlXPathNodeSetFreeNs		(xmlNsPtr ns)

    Namespace nodes in libxml don't match the XPath semantic. In a node set the namespace nodes are duplicated and the next pointer is set to the parent node in the XPath semantic. Check if such a node needs to be freed

    ns:the XPath namespace node found in a nodeset.

    Function: xmlXPathNodeSetMerge

    xmlNodeSetPtr	xmlXPathNodeSetMerge	(xmlNodeSetPtr val1, 
    xmlNodeSetPtr val2)

    Merges two nodesets, all nodes from @val2 are added to @val1 if @val1 is NULL, a new set is created and copied from @val2

    val1:the first NodeSet or NULL
    val2:the second NodeSet
    Returns:@val1 once extended or NULL in case of error.

    Function: xmlXPathNodeSetRemove

    void	xmlXPathNodeSetRemove		(xmlNodeSetPtr cur, 
    int val)

    Removes an entry from an existing NodeSet list.

    cur:the initial node set
    val:the index to remove

    Function: xmlXPathNodeSetSort

    void	xmlXPathNodeSetSort		(xmlNodeSetPtr set)

    Sort the node set in document order

    set:the node set

    Function: xmlXPathNodeTrailing

    xmlNodeSetPtr	xmlXPathNodeTrailing	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)

    Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted is called.

    nodes:a node-set
    node:a node
    Returns:the nodes in @nodes that follow @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

    Function: xmlXPathNodeTrailingSorted

    xmlNodeSetPtr	xmlXPathNodeTrailingSorted	(xmlNodeSetPtr nodes, 
    xmlNodePtr node)

    Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set)

    nodes:a node-set, sorted by document order
    node:a node
    Returns:the nodes in @nodes that follow @node in document order, @nodes if @node is NULL or an empty node-set if @nodes doesn't contain @node

    Function: xmlXPathNormalizeFunction

    void	xmlXPathNormalizeFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the normalize-space() XPath function string normalize-space(string?) The normalize-space function returns the argument string with white space normalized by stripping leading and trailing whitespace and replacing sequences of whitespace characters by a single space. Whitespace characters are the same allowed by the S production in XML. If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathNotEqualValues

    int	xmlXPathNotEqualValues		(xmlXPathParserContextPtr ctxt)

    Implement the equal operation on XPath objects content: @arg1 == @arg2

    ctxt:the XPath Parser context
    Returns:0 or 1 depending on the results of the test.

    Function: xmlXPathNotFunction

    void	xmlXPathNotFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the not() XPath function boolean not(boolean) The not function returns true if its argument is false, and false otherwise.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathNsLookup

    const xmlChar *	xmlXPathNsLookup	(xmlXPathContextPtr ctxt, 
    const xmlChar * prefix)

    Search in the namespace declaration array of the context for the given namespace name associated to the given prefix

    ctxt:the XPath context
    prefix:the namespace prefix value
    Returns:the value or NULL if not found

    Function: xmlXPathNumberFunction

    void	xmlXPathNumberFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the number() XPath function number number(object?)

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathParseNCName

    xmlChar *	xmlXPathParseNCName	(xmlXPathParserContextPtr ctxt)

    parse an XML namespace non qualified name. [NS 3] NCName ::= (Letter | '_') (NCNameChar)* [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender

    ctxt:the XPath Parser context
    Returns:the namespace name or NULL

    Function: xmlXPathParseName

    xmlChar *	xmlXPathParseName	(xmlXPathParserContextPtr ctxt)

    parse an XML name [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)*

    ctxt:the XPath Parser context
    Returns:the namespace name or NULL

    Function: xmlXPathPopBoolean

    int	xmlXPathPopBoolean		(xmlXPathParserContextPtr ctxt)

    Pops a boolean from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

    ctxt:an XPath parser context
    Returns:the boolean

    Function: xmlXPathPopExternal

    void *	xmlXPathPopExternal		(xmlXPathParserContextPtr ctxt)

    Pops an external object from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

    ctxt:an XPath parser context
    Returns:the object

    Function: xmlXPathPopNodeSet

    xmlNodeSetPtr	xmlXPathPopNodeSet	(xmlXPathParserContextPtr ctxt)

    Pops a node-set from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

    ctxt:an XPath parser context
    Returns:the node-set

    Function: xmlXPathPopNumber

    double	xmlXPathPopNumber		(xmlXPathParserContextPtr ctxt)

    Pops a number from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

    ctxt:an XPath parser context
    Returns:the number

    Function: xmlXPathPopString

    xmlChar *	xmlXPathPopString	(xmlXPathParserContextPtr ctxt)

    Pops a string from the stack, handling conversion if needed. Check error with #xmlXPathCheckError.

    ctxt:an XPath parser context
    Returns:the string

    Function: xmlXPathPositionFunction

    void	xmlXPathPositionFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the position() XPath function number position() The position function returns the position of the context node in the context node list. The first position is 1, and so the last position will be equal to last().

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathRegisterAllFunctions

    void	xmlXPathRegisterAllFunctions	(xmlXPathContextPtr ctxt)

    Registers all default XPath functions in this context

    ctxt:the XPath context

    Function: xmlXPathRegisterFunc

    int	xmlXPathRegisterFunc		(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    xmlXPathFunction f)

    Register a new function. If @f is NULL it unregisters the function

    ctxt:the XPath context
    name:the function name
    f:the function implementation or NULL
    Returns:0 in case of success, -1 in case of error

    Function: xmlXPathRegisterFuncLookup

    void	xmlXPathRegisterFuncLookup	(xmlXPathContextPtr ctxt, 
    xmlXPathFuncLookupFunc f,
    void * funcCtxt)

    Registers an external mechanism to do function lookup.

    ctxt:the XPath context
    f:the lookup function
    funcCtxt:the lookup data

    Function: xmlXPathRegisterFuncNS

    int	xmlXPathRegisterFuncNS		(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri,
    xmlXPathFunction f)

    Register a new function. If @f is NULL it unregisters the function

    ctxt:the XPath context
    name:the function name
    ns_uri:the function namespace URI
    f:the function implementation or NULL
    Returns:0 in case of success, -1 in case of error

    Function: xmlXPathRegisterNs

    int	xmlXPathRegisterNs		(xmlXPathContextPtr ctxt, 
    const xmlChar * prefix,
    const xmlChar * ns_uri)

    Register a new namespace. If @ns_uri is NULL it unregisters the namespace

    ctxt:the XPath context
    prefix:the namespace prefix cannot be NULL or empty string
    ns_uri:the namespace name
    Returns:0 in case of success, -1 in case of error

    Function: xmlXPathRegisterVariable

    int	xmlXPathRegisterVariable	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    xmlXPathObjectPtr value)

    Register a new variable value. If @value is NULL it unregisters the variable

    ctxt:the XPath context
    name:the variable name
    value:the variable value or NULL
    Returns:0 in case of success, -1 in case of error

    Function: xmlXPathRegisterVariableLookup

    void	xmlXPathRegisterVariableLookup	(xmlXPathContextPtr ctxt, 
    xmlXPathVariableLookupFunc f,
    void * data)

    register an external mechanism to do variable lookup

    ctxt:the XPath context
    f:the lookup function
    data:the lookup data

    Function: xmlXPathRegisterVariableNS

    int	xmlXPathRegisterVariableNS	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri,
    xmlXPathObjectPtr value)

    Register a new variable value. If @value is NULL it unregisters the variable

    ctxt:the XPath context
    name:the variable name
    ns_uri:the variable namespace URI
    value:the variable value or NULL
    Returns:0 in case of success, -1 in case of error

    Function: xmlXPathRegisteredFuncsCleanup

    void	xmlXPathRegisteredFuncsCleanup	(xmlXPathContextPtr ctxt)

    Cleanup the XPath context data associated to registered functions

    ctxt:the XPath context

    Function: xmlXPathRegisteredNsCleanup

    void	xmlXPathRegisteredNsCleanup	(xmlXPathContextPtr ctxt)

    Cleanup the XPath context data associated to registered variables

    ctxt:the XPath context

    Function: xmlXPathRegisteredVariablesCleanup

    void	xmlXPathRegisteredVariablesCleanup	(xmlXPathContextPtr ctxt)

    Cleanup the XPath context data associated to registered variables

    ctxt:the XPath context

    Function: xmlXPathRoot

    void	xmlXPathRoot			(xmlXPathParserContextPtr ctxt)

    Initialize the context to the root of the document

    ctxt:the XPath Parser context

    Function: xmlXPathRoundFunction

    void	xmlXPathRoundFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the round() XPath function number round(number) The round function returns the number that is closest to the argument and that is an integer. If there are two such numbers, then the one that is even is returned.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathStartsWithFunction

    void	xmlXPathStartsWithFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the starts-with() XPath function boolean starts-with(string, string) The starts-with function returns true if the first argument string starts with the second argument string, and otherwise returns false.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathStringEvalNumber

    double	xmlXPathStringEvalNumber	(const xmlChar * str)

    [30a] Float ::= Number ('e' Digits?)? [30] Number ::= Digits ('.' Digits?)? | '.' Digits [31] Digits ::= [0-9]+ Compile a Number in the string In complement of the Number expression, this function also handles negative values : '-' Number.

    str:A string to scan
    Returns:the double value.

    Function: xmlXPathStringFunction

    void	xmlXPathStringFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the string() XPath function string string(object?) The string function converts an object to a string as follows: - A node-set is converted to a string by returning the value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned. - A number is converted to a string as follows + NaN is converted to the string NaN + positive zero is converted to the string 0 + negative zero is converted to the string 0 + positive infinity is converted to the string Infinity + negative infinity is converted to the string -Infinity + if the number is an integer, the number is represented in decimal form as a Number with no decimal point and no leading zeros, preceded by a minus sign (-) if the number is negative + otherwise, the number is represented in decimal form as a Number including a decimal point with at least one digit before the decimal point and at least one digit after the decimal point, preceded by a minus sign (-) if the number is negative; there must be no leading zeros before the decimal point apart possibly from the one required digit immediately before the decimal point; beyond the one required digit after the decimal point there must be as many, but only as many, more digits as are needed to uniquely distinguish the number from all other IEEE 754 numeric values. - The boolean false value is converted to the string false. The boolean true value is converted to the string true. If the argument is omitted, it defaults to a node-set with the context node as its only member.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathStringLengthFunction

    void	xmlXPathStringLengthFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the string-length() XPath function number string-length(string?) The string-length returns the number of characters in the string (see [3.6 Strings]). If the argument is omitted, it defaults to the context node converted to a string, in other words the value of the context node.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathSubValues

    void	xmlXPathSubValues		(xmlXPathParserContextPtr ctxt)

    Implement the subtraction operation on XPath objects: The numeric operators convert their operands to numbers as if by calling the number function.

    ctxt:the XPath Parser context

    Function: xmlXPathSubstringAfterFunction

    void	xmlXPathSubstringAfterFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the substring-after() XPath function string substring-after(string, string) The substring-after function returns the substring of the first argument string that follows the first occurrence of the second argument string in the first argument string, or the empty stringi if the first argument string does not contain the second argument string. For example, substring-after("1999/04/01","/") returns 04/01, and substring-after("1999/04/01","19") returns 99/04/01.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathSubstringBeforeFunction

    void	xmlXPathSubstringBeforeFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the substring-before() XPath function string substring-before(string, string) The substring-before function returns the substring of the first argument string that precedes the first occurrence of the second argument string in the first argument string, or the empty string if the first argument string does not contain the second argument string. For example, substring-before("1999/04/01","/") returns 1999.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathSubstringFunction

    void	xmlXPathSubstringFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the substring() XPath function string substring(string, number, number?) The substring function returns the substring of the first argument starting at the position specified in the second argument with length specified in the third argument. For example, substring("12345",2,3) returns "234". If the third argument is not specified, it returns the substring starting at the position specified in the second argument and continuing to the end of the string. For example, substring("12345",2) returns "2345". More precisely, each character in the string (see [3.6 Strings]) is considered to have a numeric position: the position of the first character is 1, the position of the second character is 2 and so on. The returned substring contains those characters for which the position of the character is greater than or equal to the second argument and, if the third argument is specified, less than the sum of the second and third arguments; the comparisons and addition used for the above follow the standard IEEE 754 rules. Thus: - substring("12345", 1.5, 2.6) returns "234" - substring("12345", 0, 3) returns "12" - substring("12345", 0 div 0, 3) returns "" - substring("12345", 1, 0 div 0) returns "" - substring("12345", -42, 1 div 0) returns "12345" - substring("12345", -1 div 0, 1 div 0) returns ""

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathSumFunction

    void	xmlXPathSumFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the sum() XPath function number sum(node-set) The sum function returns the sum of the values of the nodes in the argument node-set.

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathTrailing

    xmlNodeSetPtr	xmlXPathTrailing	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)

    Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set) @nodes1 and @nodes2 are sorted by document order, then #xmlXPathTrailingSorted is called.

    nodes1:a node-set
    nodes2:a node-set
    Returns:the nodes in @nodes1 that follow the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

    Function: xmlXPathTrailingSorted

    xmlNodeSetPtr	xmlXPathTrailingSorted	(xmlNodeSetPtr nodes1, 
    xmlNodeSetPtr nodes2)

    Implements the EXSLT - Sets trailing() function: node-set set:trailing (node-set, node-set)

    nodes1:a node-set, sorted by document order
    nodes2:a node-set, sorted by document order
    Returns:the nodes in @nodes1 that follow the first node in @nodes2 in document order, @nodes1 if @nodes2 is NULL or empty or an empty node-set if @nodes1 doesn't contain @nodes2

    Function: xmlXPathTranslateFunction

    void	xmlXPathTranslateFunction	(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the translate() XPath function string translate(string, string, string) The translate function returns the first argument string with occurrences of characters in the second argument string replaced by the character at the corresponding position in the third argument string. For example, translate("bar","abc","ABC") returns the string BAr. If there is a character in the second argument string with no character at a corresponding position in the third argument string (because the second argument string is longer than the third argument string), then occurrences of that character in the first argument string are removed. For example, translate("--aaa--","abc-","ABC")

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathTrueFunction

    void	xmlXPathTrueFunction		(xmlXPathParserContextPtr ctxt, 
    int nargs)

    Implement the true() XPath function boolean true()

    ctxt:the XPath Parser context
    nargs:the number of arguments

    Function: xmlXPathValueFlipSign

    void	xmlXPathValueFlipSign		(xmlXPathParserContextPtr ctxt)

    Implement the unary - operation on an XPath object The numeric operators convert their operands to numbers as if by calling the number function.

    ctxt:the XPath Parser context

    Function: xmlXPathVariableLookup

    xmlXPathObjectPtr	xmlXPathVariableLookup	(xmlXPathContextPtr ctxt, 
    const xmlChar * name)

    Search in the Variable array of the context for the given variable value.

    ctxt:the XPath context
    name:the variable name
    Returns:a copy of the value or NULL if not found

    Function: xmlXPathVariableLookupNS

    xmlXPathObjectPtr	xmlXPathVariableLookupNS	(xmlXPathContextPtr ctxt, 
    const xmlChar * name,
    const xmlChar * ns_uri)

    Search in the Variable array of the context for the given variable value.

    ctxt:the XPath context
    name:the variable name
    ns_uri:the variable namespace URI
    Returns:the a copy of the value or NULL if not found

    Function: xmlXPathWrapCString

    xmlXPathObjectPtr	xmlXPathWrapCString	(char * val)

    Wraps a string into an XPath object.

    val:the char * value
    Returns:the newly created object.

    Function: xmlXPathWrapExternal

    xmlXPathObjectPtr	xmlXPathWrapExternal	(void * val)

    Wraps the @val data into an XPath object.

    val:the user data
    Returns:the newly created object.

    Function: xmlXPathWrapNodeSet

    xmlXPathObjectPtr	xmlXPathWrapNodeSet	(xmlNodeSetPtr val)

    Wrap the Nodeset @val in a new xmlXPathObjectPtr

    val:the NodePtr value
    Returns:the newly created object.

    Function: xmlXPathWrapString

    xmlXPathObjectPtr	xmlXPathWrapString	(xmlChar * val)

    Wraps the @val string into an XPath object.

    val:the xmlChar * value
    Returns:the newly created object.

    Function: xmlXPatherror

    void	xmlXPatherror			(xmlXPathParserContextPtr ctxt, 
    const char * file,
    int line,
    int no)

    Formats an error message.

    ctxt:the XPath Parser context
    file:the file name
    line:the line number
    no:the error number

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-encoding.html0000644000175000017500000010362012134171042020223 0ustar aronaron Module encoding from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module encoding from libxml2

    API Menu
    API Indexes
    Related links

    interface for the encoding conversion functions needed for XML basic encoding and iconv() support. Related specs are rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies [ISO-10646] UTF-8 and UTF-16 in Annexes [ISO-8859-1] ISO Latin-1 characters codes. [UNICODE] The Unicode Consortium, "The Unicode Standard -- Worldwide Character Encoding -- Version 1.0", Addison- Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is described in Unicode Technical Report #4. [US-ASCII] Coded Character Set--7-bit American Standard Code for Information Interchange, ANSI X3.4-1986.

    Table of Contents

    Structure uconv_t
    struct _uconv_t
    Enum xmlCharEncoding
    
    Structure xmlCharEncodingHandler
    struct _xmlCharEncodingHandler
    Typedef xmlCharEncodingHandler * xmlCharEncodingHandlerPtr
    
    int	UTF8Toisolat1			(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)
    int	isolat1ToUTF8			(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)
    int	xmlAddEncodingAlias		(const char * name, 
    const char * alias)
    int	xmlCharEncCloseFunc		(xmlCharEncodingHandler * handler)
    int	xmlCharEncFirstLine		(xmlCharEncodingHandler * handler, 
    xmlBufferPtr out,
    xmlBufferPtr in)
    int	xmlCharEncInFunc		(xmlCharEncodingHandler * handler, 
    xmlBufferPtr out,
    xmlBufferPtr in)
    int	xmlCharEncOutFunc		(xmlCharEncodingHandler * handler, 
    xmlBufferPtr out,
    xmlBufferPtr in)
    Function type: xmlCharEncodingInputFunc
    int	xmlCharEncodingInputFunc	(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)
    Function type: xmlCharEncodingOutputFunc
    int	xmlCharEncodingOutputFunc	(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)
    void	xmlCleanupCharEncodingHandlers	(void)
    void	xmlCleanupEncodingAliases	(void)
    int	xmlDelEncodingAlias		(const char * alias)
    xmlCharEncoding	xmlDetectCharEncoding	(const unsigned char * in, 
    int len)
    xmlCharEncodingHandlerPtr	xmlFindCharEncodingHandler	(const char * name)
    xmlCharEncodingHandlerPtr	xmlGetCharEncodingHandler	(xmlCharEncoding enc)
    const char *	xmlGetCharEncodingName	(xmlCharEncoding enc)
    const char *	xmlGetEncodingAlias	(const char * alias)
    void	xmlInitCharEncodingHandlers	(void)
    xmlCharEncodingHandlerPtr	xmlNewCharEncodingHandler	(const char * name, 
    xmlCharEncodingInputFunc input,
    xmlCharEncodingOutputFunc output)
    xmlCharEncoding	xmlParseCharEncoding	(const char * name)
    void	xmlRegisterCharEncodingHandler	(xmlCharEncodingHandlerPtr handler)

    Description

    Structure uconv_t

    Structure uconv_t
    struct _uconv_t { UConverter * uconv : for conversion between an encoding and UConverter * utf8 : for conversion between UTF-8 and UTF-16 }

    Enum xmlCharEncoding

    Enum xmlCharEncoding {
        XML_CHAR_ENCODING_ERROR = -1 : No char encoding detected
        XML_CHAR_ENCODING_NONE = 0 : No char encoding detected
        XML_CHAR_ENCODING_UTF8 = 1 : UTF-8
        XML_CHAR_ENCODING_UTF16LE = 2 : UTF-16 little endian
        XML_CHAR_ENCODING_UTF16BE = 3 : UTF-16 big endian
        XML_CHAR_ENCODING_UCS4LE = 4 : UCS-4 little endian
        XML_CHAR_ENCODING_UCS4BE = 5 : UCS-4 big endian
        XML_CHAR_ENCODING_EBCDIC = 6 : EBCDIC uh!
        XML_CHAR_ENCODING_UCS4_2143 = 7 : UCS-4 unusual ordering
        XML_CHAR_ENCODING_UCS4_3412 = 8 : UCS-4 unusual ordering
        XML_CHAR_ENCODING_UCS2 = 9 : UCS-2
        XML_CHAR_ENCODING_8859_1 = 10 : ISO-8859-1 ISO Latin 1
        XML_CHAR_ENCODING_8859_2 = 11 : ISO-8859-2 ISO Latin 2
        XML_CHAR_ENCODING_8859_3 = 12 : ISO-8859-3
        XML_CHAR_ENCODING_8859_4 = 13 : ISO-8859-4
        XML_CHAR_ENCODING_8859_5 = 14 : ISO-8859-5
        XML_CHAR_ENCODING_8859_6 = 15 : ISO-8859-6
        XML_CHAR_ENCODING_8859_7 = 16 : ISO-8859-7
        XML_CHAR_ENCODING_8859_8 = 17 : ISO-8859-8
        XML_CHAR_ENCODING_8859_9 = 18 : ISO-8859-9
        XML_CHAR_ENCODING_2022_JP = 19 : ISO-2022-JP
        XML_CHAR_ENCODING_SHIFT_JIS = 20 : Shift_JIS
        XML_CHAR_ENCODING_EUC_JP = 21 : EUC-JP
        XML_CHAR_ENCODING_ASCII = 22 : pure ASCII
    }
    

    Structure xmlCharEncodingHandler

    Structure xmlCharEncodingHandler
    struct _xmlCharEncodingHandler { char * name xmlCharEncodingInputFunc input xmlCharEncodingOutputFunc output iconv_t iconv_in iconv_t iconv_out uconv_t * uconv_in uconv_t * uconv_out }

    Function: UTF8Toisolat1

    int	UTF8Toisolat1			(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)

    Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1 block of chars out.

    out:a pointer to an array of bytes to store the result
    outlen:the length of @out
    in:a pointer to an array of UTF-8 chars
    inlen:the length of @in
    Returns:the number of bytes written if success, -2 if the transcoding fails, or -1 otherwise The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictable. The value of @outlen after return is the number of octets consumed.

    Function: isolat1ToUTF8

    int	isolat1ToUTF8			(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)

    Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8 block of chars out.

    out:a pointer to an array of bytes to store the result
    outlen:the length of @out
    in:a pointer to an array of ISO Latin 1 chars
    inlen:the length of @in
    Returns:the number of bytes written if success, or -1 otherwise The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictable. The value of @outlen after return is the number of octets consumed.

    Function: xmlAddEncodingAlias

    int	xmlAddEncodingAlias		(const char * name, 
    const char * alias)

    Registers an alias @alias for an encoding named @name. Existing alias will be overwritten.

    name:the encoding name as parsed, in UTF-8 format (ASCII actually)
    alias:the alias name as parsed, in UTF-8 format (ASCII actually)
    Returns:0 in case of success, -1 in case of error

    Function: xmlCharEncCloseFunc

    int	xmlCharEncCloseFunc		(xmlCharEncodingHandler * handler)

    Generic front-end for encoding handler close function

    handler:char enconding transformation data structure
    Returns:0 if success, or -1 in case of error

    Function: xmlCharEncFirstLine

    int	xmlCharEncFirstLine		(xmlCharEncodingHandler * handler, 
    xmlBufferPtr out,
    xmlBufferPtr in)

    Front-end for the encoding handler input function, but handle only the very first line, i.e. limit itself to 45 chars.

    handler:char enconding transformation data structure
    out:an xmlBuffer for the output.
    in:an xmlBuffer for the input
    Returns:the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or

    Function: xmlCharEncInFunc

    int	xmlCharEncInFunc		(xmlCharEncodingHandler * handler, 
    xmlBufferPtr out,
    xmlBufferPtr in)

    Generic front-end for the encoding handler input function

    handler:char encoding transformation data structure
    out:an xmlBuffer for the output.
    in:an xmlBuffer for the input
    Returns:the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or

    Function: xmlCharEncOutFunc

    int	xmlCharEncOutFunc		(xmlCharEncodingHandler * handler, 
    xmlBufferPtr out,
    xmlBufferPtr in)

    Generic front-end for the encoding handler output function a first call with @in == NULL has to be made firs to initiate the output in case of non-stateless encoding needing to initiate their state or the output (like the BOM in UTF16). In case of UTF8 sequence conversion errors for the given encoder, the content will be automatically remapped to a CharRef sequence.

    handler:char enconding transformation data structure
    out:an xmlBuffer for the output.
    in:an xmlBuffer for the input
    Returns:the number of byte written if success, or -1 general error -2 if the transcoding fails (for *in is not valid utf8 string or the result of transformation can't fit into the encoding we want), or

    Function type: xmlCharEncodingInputFunc

    Function type: xmlCharEncodingInputFunc
    int	xmlCharEncodingInputFunc	(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)

    Take a block of chars in the original encoding and try to convert it to an UTF-8 block of chars out.

    out:a pointer to an array of bytes to store the UTF-8 result
    outlen:the length of @out
    in:a pointer to an array of chars in the original encoding
    inlen:the length of @in
    Returns:the number of bytes written, -1 if lack of space, or -2 if the transcoding failed. The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictiable. The value of @outlen after return is the number of octets consumed.

    Function type: xmlCharEncodingOutputFunc

    Function type: xmlCharEncodingOutputFunc
    int	xmlCharEncodingOutputFunc	(unsigned char * out, 
    int * outlen,
    const unsigned char * in,
    int * inlen)

    Take a block of UTF-8 chars in and try to convert it to another encoding. Note: a first call designed to produce heading info is called with in = NULL. If stateful this should also initialize the encoder state.

    out:a pointer to an array of bytes to store the result
    outlen:the length of @out
    in:a pointer to an array of UTF-8 chars
    inlen:the length of @in
    Returns:the number of bytes written, -1 if lack of space, or -2 if the transcoding failed. The value of @inlen after return is the number of octets consumed if the return value is positive, else unpredictiable. The value of @outlen after return is the number of octets produced.

    Function: xmlCleanupCharEncodingHandlers

    void	xmlCleanupCharEncodingHandlers	(void)

    Cleanup the memory allocated for the char encoding support, it unregisters all the encoding handlers and the aliases.

    Function: xmlCleanupEncodingAliases

    void	xmlCleanupEncodingAliases	(void)

    Unregisters all aliases

    Function: xmlDelEncodingAlias

    int	xmlDelEncodingAlias		(const char * alias)

    Unregisters an encoding alias @alias

    alias:the alias name as parsed, in UTF-8 format (ASCII actually)
    Returns:0 in case of success, -1 in case of error

    Function: xmlDetectCharEncoding

    xmlCharEncoding	xmlDetectCharEncoding	(const unsigned char * in, 
    int len)

    Guess the encoding of the entity using the first bytes of the entity content according to the non-normative appendix F of the XML-1.0 recommendation.

    in:a pointer to the first bytes of the XML entity, must be at least 2 bytes long (at least 4 if encoding is UTF4 variant).
    len:pointer to the length of the buffer
    Returns:one of the XML_CHAR_ENCODING_... values.

    Function: xmlFindCharEncodingHandler

    xmlCharEncodingHandlerPtr	xmlFindCharEncodingHandler	(const char * name)

    Search in the registered set the handler able to read/write that encoding.

    name:a string describing the char encoding.
    Returns:the handler or NULL if not found

    Function: xmlGetCharEncodingHandler

    xmlCharEncodingHandlerPtr	xmlGetCharEncodingHandler	(xmlCharEncoding enc)

    Search in the registered set the handler able to read/write that encoding.

    enc:an xmlCharEncoding value.
    Returns:the handler or NULL if not found

    Function: xmlGetCharEncodingName

    const char *	xmlGetCharEncodingName	(xmlCharEncoding enc)

    The "canonical" name for XML encoding. C.f. http://www.w3.org/TR/REC-xml#charencoding Section 4.3.3 Character Encoding in Entities

    enc:the encoding
    Returns:the canonical name for the given encoding

    Function: xmlGetEncodingAlias

    const char *	xmlGetEncodingAlias	(const char * alias)

    Lookup an encoding name for the given alias.

    alias:the alias name as parsed, in UTF-8 format (ASCII actually)
    Returns:NULL if not found, otherwise the original name

    Function: xmlInitCharEncodingHandlers

    void	xmlInitCharEncodingHandlers	(void)

    Initialize the char encoding support, it registers the default encoding supported. NOTE: while public, this function usually doesn't need to be called in normal processing.

    Function: xmlNewCharEncodingHandler

    xmlCharEncodingHandlerPtr	xmlNewCharEncodingHandler	(const char * name, 
    xmlCharEncodingInputFunc input,
    xmlCharEncodingOutputFunc output)

    Create and registers an xmlCharEncodingHandler.

    name:the encoding name, in UTF-8 format (ASCII actually)
    input:the xmlCharEncodingInputFunc to read that encoding
    output:the xmlCharEncodingOutputFunc to write that encoding
    Returns:the xmlCharEncodingHandlerPtr created (or NULL in case of error).

    Function: xmlParseCharEncoding

    xmlCharEncoding	xmlParseCharEncoding	(const char * name)

    Compare the string to the encoding schemes already known. Note that the comparison is case insensitive accordingly to the section [XML] 4.3.3 Character Encoding in Entities.

    name:the encoding name as parsed, in UTF-8 format (ASCII actually)
    Returns:one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE if not recognized.

    Function: xmlRegisterCharEncodingHandler

    void	xmlRegisterCharEncodingHandler	(xmlCharEncodingHandlerPtr handler)

    Register the char encoding handler, surprising, isn't it ?

    handler:the xmlCharEncodingHandlerPtr handler block

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlsave.html0000644000175000017500000004552512134171043020126 0ustar aronaron Module xmlsave from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlsave from libxml2

    API Menu
    API Indexes
    Related links

    API to save document or subtree of document

    Table of Contents

    Structure xmlSaveCtxt
    struct _xmlSaveCtxt The content of this structure is not made public by the API.
    Typedef xmlSaveCtxt * xmlSaveCtxtPtr
    
    Enum xmlSaveOption
    
    int	xmlSaveClose			(xmlSaveCtxtPtr ctxt)
    long	xmlSaveDoc			(xmlSaveCtxtPtr ctxt, 
    xmlDocPtr doc)
    int	xmlSaveFlush			(xmlSaveCtxtPtr ctxt)
    int	xmlSaveSetAttrEscape		(xmlSaveCtxtPtr ctxt, 
    xmlCharEncodingOutputFunc escape)
    int	xmlSaveSetEscape		(xmlSaveCtxtPtr ctxt, 
    xmlCharEncodingOutputFunc escape)
    xmlSaveCtxtPtr	xmlSaveToBuffer		(xmlBufferPtr buffer, 
    const char * encoding,
    int options)
    xmlSaveCtxtPtr	xmlSaveToFd		(int fd, 
    const char * encoding,
    int options)
    xmlSaveCtxtPtr	xmlSaveToFilename	(const char * filename, 
    const char * encoding,
    int options)
    xmlSaveCtxtPtr	xmlSaveToIO		(xmlOutputWriteCallback iowrite, 
    xmlOutputCloseCallback ioclose,
    void * ioctx,
    const char * encoding,
    int options)
    long	xmlSaveTree			(xmlSaveCtxtPtr ctxt, 
    xmlNodePtr node)

    Description

    Structure xmlSaveCtxt

    Structure xmlSaveCtxt
    struct _xmlSaveCtxt { The content of this structure is not made public by the API. }

    Enum xmlSaveOption

    Enum xmlSaveOption {
        XML_SAVE_FORMAT = 1 : format save output
        XML_SAVE_NO_DECL = 2 : drop the xml declaration
        XML_SAVE_NO_EMPTY = 4 : no empty tags
        XML_SAVE_NO_XHTML = 8 : disable XHTML1 specific rules
        XML_SAVE_XHTML = 16 : force XHTML1 specific rules
        XML_SAVE_AS_XML = 32 : force XML serialization on HTML doc
        XML_SAVE_AS_HTML = 64 : force HTML serialization on XML doc
        XML_SAVE_WSNONSIG = 128 : format with non-significant whitespace
    }
    

    Function: xmlSaveClose

    int	xmlSaveClose			(xmlSaveCtxtPtr ctxt)

    Close a document saving context, i.e. make sure that all bytes have been output and free the associated data.

    ctxt:a document saving context
    Returns:the number of byte written or -1 in case of error.

    Function: xmlSaveDoc

    long	xmlSaveDoc			(xmlSaveCtxtPtr ctxt, 
    xmlDocPtr doc)

    Save a full document to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead

    ctxt:a document saving context
    doc:a document
    Returns:the number of byte written or -1 in case of error

    Function: xmlSaveFlush

    int	xmlSaveFlush			(xmlSaveCtxtPtr ctxt)

    Flush a document saving context, i.e. make sure that all bytes have been output.

    ctxt:a document saving context
    Returns:the number of byte written or -1 in case of error.

    Function: xmlSaveSetAttrEscape

    int	xmlSaveSetAttrEscape		(xmlSaveCtxtPtr ctxt, 
    xmlCharEncodingOutputFunc escape)

    Set a custom escaping function to be used for text in attribute content

    ctxt:a document saving context
    escape:the escaping function
    Returns:0 if successful or -1 in case of error.

    Function: xmlSaveSetEscape

    int	xmlSaveSetEscape		(xmlSaveCtxtPtr ctxt, 
    xmlCharEncodingOutputFunc escape)

    Set a custom escaping function to be used for text in element content

    ctxt:a document saving context
    escape:the escaping function
    Returns:0 if successful or -1 in case of error.

    Function: xmlSaveToBuffer

    xmlSaveCtxtPtr	xmlSaveToBuffer		(xmlBufferPtr buffer, 
    const char * encoding,
    int options)

    Create a document saving context serializing to a buffer with the encoding and the options given

    buffer:a buffer
    encoding:the encoding name to use or NULL
    options:a set of xmlSaveOptions
    Returns:a new serialization context or NULL in case of error.

    Function: xmlSaveToFd

    xmlSaveCtxtPtr	xmlSaveToFd		(int fd, 
    const char * encoding,
    int options)

    Create a document saving context serializing to a file descriptor with the encoding and the options given.

    fd:a file descriptor number
    encoding:the encoding name to use or NULL
    options:a set of xmlSaveOptions
    Returns:a new serialization context or NULL in case of error.

    Function: xmlSaveToFilename

    xmlSaveCtxtPtr	xmlSaveToFilename	(const char * filename, 
    const char * encoding,
    int options)

    Create a document saving context serializing to a filename or possibly to an URL (but this is less reliable) with the encoding and the options given.

    filename:a file name or an URL
    encoding:the encoding name to use or NULL
    options:a set of xmlSaveOptions
    Returns:a new serialization context or NULL in case of error.

    Function: xmlSaveToIO

    xmlSaveCtxtPtr	xmlSaveToIO		(xmlOutputWriteCallback iowrite, 
    xmlOutputCloseCallback ioclose,
    void * ioctx,
    const char * encoding,
    int options)

    Create a document saving context serializing to a file descriptor with the encoding and the options given

    iowrite:an I/O write function
    ioclose:an I/O close function
    ioctx:an I/O handler
    encoding:the encoding name to use or NULL
    options:a set of xmlSaveOptions
    Returns:a new serialization context or NULL in case of error.

    Function: xmlSaveTree

    long	xmlSaveTree			(xmlSaveCtxtPtr ctxt, 
    xmlNodePtr node)

    Save a subtree starting at the node parameter to a saving context TODO: The function is not fully implemented yet as it does not return the byte count but 0 instead

    ctxt:a document saving context
    node:the top node of the subtree to save
    Returns:the number of byte written or -1 in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-catalog.html0000644000175000017500000012007212134171042020047 0ustar aronaron Module catalog from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module catalog from libxml2

    API Menu
    API Indexes
    Related links

    the catalog module implements the support for XML Catalogs and SGML catalogs

    Table of Contents

    #define XML_CATALOGS_NAMESPACE
    #define XML_CATALOG_PI
    Structure xmlCatalog
    struct _xmlCatalog The content of this structure is not made public by the API.
    Enum xmlCatalogAllow
    
    Enum xmlCatalogPrefer
    
    Typedef xmlCatalog * xmlCatalogPtr
    
    int	xmlACatalogAdd			(xmlCatalogPtr catal, 
    const xmlChar * type,
    const xmlChar * orig,
    const xmlChar * replace)
    void	xmlACatalogDump			(xmlCatalogPtr catal, 
    FILE * out)
    int	xmlACatalogRemove		(xmlCatalogPtr catal, 
    const xmlChar * value)
    xmlChar *	xmlACatalogResolve	(xmlCatalogPtr catal, 
    const xmlChar * pubID,
    const xmlChar * sysID)
    xmlChar *	xmlACatalogResolvePublic	(xmlCatalogPtr catal, 
    const xmlChar * pubID)
    xmlChar *	xmlACatalogResolveSystem	(xmlCatalogPtr catal, 
    const xmlChar * sysID)
    xmlChar *	xmlACatalogResolveURI	(xmlCatalogPtr catal, 
    const xmlChar * URI)
    int	xmlCatalogAdd			(const xmlChar * type, 
    const xmlChar * orig,
    const xmlChar * replace)
    void *	xmlCatalogAddLocal		(void * catalogs, 
    const xmlChar * URL)
    void	xmlCatalogCleanup		(void)
    int	xmlCatalogConvert		(void)
    void	xmlCatalogDump			(FILE * out)
    void	xmlCatalogFreeLocal		(void * catalogs)
    xmlCatalogAllow	xmlCatalogGetDefaults	(void)
    const xmlChar *	xmlCatalogGetPublic	(const xmlChar * pubID)
    const xmlChar *	xmlCatalogGetSystem	(const xmlChar * sysID)
    int	xmlCatalogIsEmpty		(xmlCatalogPtr catal)
    xmlChar *	xmlCatalogLocalResolve	(void * catalogs, 
    const xmlChar * pubID,
    const xmlChar * sysID)
    xmlChar *	xmlCatalogLocalResolveURI	(void * catalogs, 
    const xmlChar * URI)
    int	xmlCatalogRemove		(const xmlChar * value)
    xmlChar *	xmlCatalogResolve	(const xmlChar * pubID, 
    const xmlChar * sysID)
    xmlChar *	xmlCatalogResolvePublic	(const xmlChar * pubID)
    xmlChar *	xmlCatalogResolveSystem	(const xmlChar * sysID)
    xmlChar *	xmlCatalogResolveURI	(const xmlChar * URI)
    int	xmlCatalogSetDebug		(int level)
    xmlCatalogPrefer	xmlCatalogSetDefaultPrefer	(xmlCatalogPrefer prefer)
    void	xmlCatalogSetDefaults		(xmlCatalogAllow allow)
    int	xmlConvertSGMLCatalog		(xmlCatalogPtr catal)
    void	xmlFreeCatalog			(xmlCatalogPtr catal)
    void	xmlInitializeCatalog		(void)
    xmlCatalogPtr	xmlLoadACatalog		(const char * filename)
    int	xmlLoadCatalog			(const char * filename)
    void	xmlLoadCatalogs			(const char * pathss)
    xmlCatalogPtr	xmlLoadSGMLSuperCatalog	(const char * filename)
    xmlCatalogPtr	xmlNewCatalog		(int sgml)
    xmlDocPtr	xmlParseCatalogFile	(const char * filename)

    Description

    Macro: XML_CATALOGS_NAMESPACE

    #define XML_CATALOGS_NAMESPACE

    The namespace for the XML Catalogs elements.

    Macro: XML_CATALOG_PI

    #define XML_CATALOG_PI

    The specific XML Catalog Processing Instuction name.

    Structure xmlCatalog

    Structure xmlCatalog
    struct _xmlCatalog { The content of this structure is not made public by the API. }

    Enum xmlCatalogAllow

    Enum xmlCatalogAllow {
        XML_CATA_ALLOW_NONE = 0
        XML_CATA_ALLOW_GLOBAL = 1
        XML_CATA_ALLOW_DOCUMENT = 2
        XML_CATA_ALLOW_ALL = 3
    }
    

    Enum xmlCatalogPrefer

    Enum xmlCatalogPrefer {
        XML_CATA_PREFER_NONE = 0
        XML_CATA_PREFER_PUBLIC = 1
        XML_CATA_PREFER_SYSTEM = 2
    }
    

    Function: xmlACatalogAdd

    int	xmlACatalogAdd			(xmlCatalogPtr catal, 
    const xmlChar * type,
    const xmlChar * orig,
    const xmlChar * replace)

    Add an entry in the catalog, it may overwrite existing but different entries.

    catal:a Catalog
    type:the type of record to add to the catalog
    orig:the system, public or prefix to match
    replace:the replacement value for the match
    Returns:0 if successful, -1 otherwise

    Function: xmlACatalogDump

    void	xmlACatalogDump			(xmlCatalogPtr catal, 
    FILE * out)

    Dump the given catalog to the given file.

    catal:a Catalog
    out:the file.

    Function: xmlACatalogRemove

    int	xmlACatalogRemove		(xmlCatalogPtr catal, 
    const xmlChar * value)

    Remove an entry from the catalog

    catal:a Catalog
    value:the value to remove
    Returns:the number of entries removed if successful, -1 otherwise

    Function: xmlACatalogResolve

    xmlChar *	xmlACatalogResolve	(xmlCatalogPtr catal, 
    const xmlChar * pubID,
    const xmlChar * sysID)

    Do a complete resolution lookup of an External Identifier

    catal:a Catalog
    pubID:the public ID string
    sysID:the system ID string
    Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

    Function: xmlACatalogResolvePublic

    xmlChar *	xmlACatalogResolvePublic	(xmlCatalogPtr catal, 
    const xmlChar * pubID)

    Try to lookup the catalog local reference associated to a public ID in that catalog

    catal:a Catalog
    pubID:the public ID string
    Returns:the local resource if found or NULL otherwise, the value returned must be freed by the caller.

    Function: xmlACatalogResolveSystem

    xmlChar *	xmlACatalogResolveSystem	(xmlCatalogPtr catal, 
    const xmlChar * sysID)

    Try to lookup the catalog resource for a system ID

    catal:a Catalog
    sysID:the system ID string
    Returns:the resource if found or NULL otherwise, the value returned must be freed by the caller.

    Function: xmlACatalogResolveURI

    xmlChar *	xmlACatalogResolveURI	(xmlCatalogPtr catal, 
    const xmlChar * URI)

    Do a complete resolution lookup of an URI

    catal:a Catalog
    URI:the URI
    Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

    Function: xmlCatalogAdd

    int	xmlCatalogAdd			(const xmlChar * type, 
    const xmlChar * orig,
    const xmlChar * replace)

    Add an entry in the catalog, it may overwrite existing but different entries. If called before any other catalog routine, allows to override the default shared catalog put in place by xmlInitializeCatalog();

    type:the type of record to add to the catalog
    orig:the system, public or prefix to match
    replace:the replacement value for the match
    Returns:0 if successful, -1 otherwise

    Function: xmlCatalogAddLocal

    void *	xmlCatalogAddLocal		(void * catalogs, 
    const xmlChar * URL)

    Add the new entry to the catalog list

    catalogs:a document's list of catalogs
    URL:the URL to a new local catalog
    Returns:the updated list

    Function: xmlCatalogCleanup

    void	xmlCatalogCleanup		(void)

    Free up all the memory associated with catalogs

    Function: xmlCatalogConvert

    int	xmlCatalogConvert		(void)

    Convert all the SGML catalog entries as XML ones

    Returns:the number of entries converted if successful, -1 otherwise

    Function: xmlCatalogDump

    void	xmlCatalogDump			(FILE * out)

    Dump all the global catalog content to the given file.

    out:the file.

    Function: xmlCatalogFreeLocal

    void	xmlCatalogFreeLocal		(void * catalogs)

    Free up the memory associated to the catalog list

    catalogs:a document's list of catalogs

    Function: xmlCatalogGetDefaults

    xmlCatalogAllow	xmlCatalogGetDefaults	(void)

    Used to get the user preference w.r.t. to what catalogs should be accepted

    Returns:the current xmlCatalogAllow value

    Function: xmlCatalogGetPublic

    const xmlChar *	xmlCatalogGetPublic	(const xmlChar * pubID)

    Try to lookup the catalog reference associated to a public ID DEPRECATED, use xmlCatalogResolvePublic()

    pubID:the public ID string
    Returns:the resource if found or NULL otherwise.

    Function: xmlCatalogGetSystem

    const xmlChar *	xmlCatalogGetSystem	(const xmlChar * sysID)

    Try to lookup the catalog reference associated to a system ID DEPRECATED, use xmlCatalogResolveSystem()

    sysID:the system ID string
    Returns:the resource if found or NULL otherwise.

    Function: xmlCatalogIsEmpty

    int	xmlCatalogIsEmpty		(xmlCatalogPtr catal)

    Check is a catalog is empty

    catal:should this create an SGML catalog
    Returns:1 if the catalog is empty, 0 if not, amd -1 in case of error.

    Function: xmlCatalogLocalResolve

    xmlChar *	xmlCatalogLocalResolve	(void * catalogs, 
    const xmlChar * pubID,
    const xmlChar * sysID)

    Do a complete resolution lookup of an External Identifier using a document's private catalog list

    catalogs:a document's list of catalogs
    pubID:the public ID string
    sysID:the system ID string
    Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

    Function: xmlCatalogLocalResolveURI

    xmlChar *	xmlCatalogLocalResolveURI	(void * catalogs, 
    const xmlChar * URI)

    Do a complete resolution lookup of an URI using a document's private catalog list

    catalogs:a document's list of catalogs
    URI:the URI
    Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

    Function: xmlCatalogRemove

    int	xmlCatalogRemove		(const xmlChar * value)

    Remove an entry from the catalog

    value:the value to remove
    Returns:the number of entries removed if successful, -1 otherwise

    Function: xmlCatalogResolve

    xmlChar *	xmlCatalogResolve	(const xmlChar * pubID, 
    const xmlChar * sysID)

    Do a complete resolution lookup of an External Identifier

    pubID:the public ID string
    sysID:the system ID string
    Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

    Function: xmlCatalogResolvePublic

    xmlChar *	xmlCatalogResolvePublic	(const xmlChar * pubID)

    Try to lookup the catalog reference associated to a public ID

    pubID:the public ID string
    Returns:the resource if found or NULL otherwise, the value returned must be freed by the caller.

    Function: xmlCatalogResolveSystem

    xmlChar *	xmlCatalogResolveSystem	(const xmlChar * sysID)

    Try to lookup the catalog resource for a system ID

    sysID:the system ID string
    Returns:the resource if found or NULL otherwise, the value returned must be freed by the caller.

    Function: xmlCatalogResolveURI

    xmlChar *	xmlCatalogResolveURI	(const xmlChar * URI)

    Do a complete resolution lookup of an URI

    URI:the URI
    Returns:the URI of the resource or NULL if not found, it must be freed by the caller.

    Function: xmlCatalogSetDebug

    int	xmlCatalogSetDebug		(int level)

    Used to set the debug level for catalog operation, 0 disable debugging, 1 enable it

    level:the debug level of catalogs required
    Returns:the previous value of the catalog debugging level

    Function: xmlCatalogSetDefaultPrefer

    xmlCatalogPrefer	xmlCatalogSetDefaultPrefer	(xmlCatalogPrefer prefer)

    Allows to set the preference between public and system for deletion in XML Catalog resolution. C.f. section 4.1.1 of the spec Values accepted are XML_CATA_PREFER_PUBLIC or XML_CATA_PREFER_SYSTEM

    prefer:the default preference for delegation
    Returns:the previous value of the default preference for delegation

    Function: xmlCatalogSetDefaults

    void	xmlCatalogSetDefaults		(xmlCatalogAllow allow)

    Used to set the user preference w.r.t. to what catalogs should be accepted

    allow:what catalogs should be accepted

    Function: xmlConvertSGMLCatalog

    int	xmlConvertSGMLCatalog		(xmlCatalogPtr catal)

    Convert all the SGML catalog entries as XML ones

    catal:the catalog
    Returns:the number of entries converted if successful, -1 otherwise

    Function: xmlFreeCatalog

    void	xmlFreeCatalog			(xmlCatalogPtr catal)

    Free the memory allocated to a Catalog

    catal:a Catalog

    Function: xmlInitializeCatalog

    void	xmlInitializeCatalog		(void)

    Do the catalog initialization. this function is not thread safe, catalog initialization should preferably be done once at startup

    Function: xmlLoadACatalog

    xmlCatalogPtr	xmlLoadACatalog		(const char * filename)

    Load the catalog and build the associated data structures. This can be either an XML Catalog or an SGML Catalog It will recurse in SGML CATALOG entries. On the other hand XML Catalogs are not handled recursively.

    filename:a file path
    Returns:the catalog parsed or NULL in case of error

    Function: xmlLoadCatalog

    int	xmlLoadCatalog			(const char * filename)

    Load the catalog and makes its definitions effective for the default external entity loader. It will recurse in SGML CATALOG entries. this function is not thread safe, catalog initialization should preferably be done once at startup

    filename:a file path
    Returns:0 in case of success -1 in case of error

    Function: xmlLoadCatalogs

    void	xmlLoadCatalogs			(const char * pathss)

    Load the catalogs and makes their definitions effective for the default external entity loader. this function is not thread safe, catalog initialization should preferably be done once at startup

    pathss:a list of directories separated by a colon or a space.

    Function: xmlLoadSGMLSuperCatalog

    xmlCatalogPtr	xmlLoadSGMLSuperCatalog	(const char * filename)

    Load an SGML super catalog. It won't expand CATALOG or DELEGATE references. This is only needed for manipulating SGML Super Catalogs like adding and removing CATALOG or DELEGATE entries.

    filename:a file path
    Returns:the catalog parsed or NULL in case of error

    Function: xmlNewCatalog

    xmlCatalogPtr	xmlNewCatalog		(int sgml)

    create a new Catalog.

    sgml:should this create an SGML catalog
    Returns:the xmlCatalogPtr or NULL in case of error

    Function: xmlParseCatalogFile

    xmlDocPtr	xmlParseCatalogFile	(const char * filename)

    parse an XML file and build a tree. It's like xmlParseFile() except it bypass all catalog lookups.

    filename:the filename
    Returns:the resulting document tree or NULL in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlschemastypes.html0000644000175000017500000014034212134171043021671 0ustar aronaron Module xmlschemastypes from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlschemastypes from libxml2

    API Menu
    API Indexes
    Related links

    module providing the XML Schema Datatypes implementation both definition and validity checking

    Table of Contents

    Enum xmlSchemaWhitespaceValueType
    
    int	xmlSchemaCheckFacet		(xmlSchemaFacetPtr facet, 
    xmlSchemaTypePtr typeDecl,
    xmlSchemaParserCtxtPtr pctxt,
    const xmlChar * name)
    void	xmlSchemaCleanupTypes		(void)
    xmlChar *	xmlSchemaCollapseString	(const xmlChar * value)
    int	xmlSchemaCompareValues		(xmlSchemaValPtr x, 
    xmlSchemaValPtr y)
    int	xmlSchemaCompareValuesWhtsp	(xmlSchemaValPtr x, 
    xmlSchemaWhitespaceValueType xws,
    xmlSchemaValPtr y,
    xmlSchemaWhitespaceValueType yws)
    xmlSchemaValPtr	xmlSchemaCopyValue	(xmlSchemaValPtr val)
    void	xmlSchemaFreeFacet		(xmlSchemaFacetPtr facet)
    void	xmlSchemaFreeValue		(xmlSchemaValPtr value)
    xmlSchemaTypePtr	xmlSchemaGetBuiltInListSimpleTypeItemType	(xmlSchemaTypePtr type)
    xmlSchemaTypePtr	xmlSchemaGetBuiltInType	(xmlSchemaValType type)
    int	xmlSchemaGetCanonValue		(xmlSchemaValPtr val, 
    const xmlChar ** retValue)
    int	xmlSchemaGetCanonValueWhtsp	(xmlSchemaValPtr val, 
    const xmlChar ** retValue,
    xmlSchemaWhitespaceValueType ws)
    unsigned long	xmlSchemaGetFacetValueAsULong	(xmlSchemaFacetPtr facet)
    xmlSchemaTypePtr	xmlSchemaGetPredefinedType	(const xmlChar * name, 
    const xmlChar * ns)
    xmlSchemaValType	xmlSchemaGetValType	(xmlSchemaValPtr val)
    void	xmlSchemaInitTypes		(void)
    int	xmlSchemaIsBuiltInTypeFacet	(xmlSchemaTypePtr type, 
    int facetType)
    xmlSchemaFacetPtr	xmlSchemaNewFacet	(void)
    xmlSchemaValPtr	xmlSchemaNewNOTATIONValue	(const xmlChar * name, 
    const xmlChar * ns)
    xmlSchemaValPtr	xmlSchemaNewQNameValue	(const xmlChar * namespaceName, 
    const xmlChar * localName)
    xmlSchemaValPtr	xmlSchemaNewStringValue	(xmlSchemaValType type, 
    const xmlChar * value)
    int	xmlSchemaValPredefTypeNode	(xmlSchemaTypePtr type, 
    const xmlChar * value,
    xmlSchemaValPtr * val,
    xmlNodePtr node)
    int	xmlSchemaValPredefTypeNodeNoNorm	(xmlSchemaTypePtr type, 
    const xmlChar * value,
    xmlSchemaValPtr * val,
    xmlNodePtr node)
    int	xmlSchemaValidateFacet		(xmlSchemaTypePtr base, 
    xmlSchemaFacetPtr facet,
    const xmlChar * value,
    xmlSchemaValPtr val)
    int	xmlSchemaValidateFacetWhtsp	(xmlSchemaFacetPtr facet, 
    xmlSchemaWhitespaceValueType fws,
    xmlSchemaValType valType,
    const xmlChar * value,
    xmlSchemaValPtr val,
    xmlSchemaWhitespaceValueType ws)
    int	xmlSchemaValidateLengthFacet	(xmlSchemaTypePtr type, 
    xmlSchemaFacetPtr facet,
    const xmlChar * value,
    xmlSchemaValPtr val,
    unsigned long * length)
    int	xmlSchemaValidateLengthFacetWhtsp	(xmlSchemaFacetPtr facet, 
    xmlSchemaValType valType,
    const xmlChar * value,
    xmlSchemaValPtr val,
    unsigned long * length,
    xmlSchemaWhitespaceValueType ws)
    int	xmlSchemaValidateListSimpleTypeFacet	(xmlSchemaFacetPtr facet, 
    const xmlChar * value,
    unsigned long actualLen,
    unsigned long * expectedLen)
    int	xmlSchemaValidatePredefinedType	(xmlSchemaTypePtr type, 
    const xmlChar * value,
    xmlSchemaValPtr * val)
    int	xmlSchemaValueAppend		(xmlSchemaValPtr prev, 
    xmlSchemaValPtr cur)
    int	xmlSchemaValueGetAsBoolean	(xmlSchemaValPtr val)
    const xmlChar *	xmlSchemaValueGetAsString	(xmlSchemaValPtr val)
    xmlSchemaValPtr	xmlSchemaValueGetNext	(xmlSchemaValPtr cur)
    xmlChar *	xmlSchemaWhiteSpaceReplace	(const xmlChar * value)

    Description

    Enum xmlSchemaWhitespaceValueType

    Enum xmlSchemaWhitespaceValueType {
        XML_SCHEMA_WHITESPACE_UNKNOWN = 0
        XML_SCHEMA_WHITESPACE_PRESERVE = 1
        XML_SCHEMA_WHITESPACE_REPLACE = 2
        XML_SCHEMA_WHITESPACE_COLLAPSE = 3
    }
    

    Function: xmlSchemaCheckFacet

    int	xmlSchemaCheckFacet		(xmlSchemaFacetPtr facet, 
    xmlSchemaTypePtr typeDecl,
    xmlSchemaParserCtxtPtr pctxt,
    const xmlChar * name)

    Checks and computes the values of facets.

    facet:the facet
    typeDecl:the schema type definition
    pctxt:the schema parser context or NULL
    name:the optional name of the type
    Returns:0 if valid, a positive error code if not valid and -1 in case of an internal or API error.

    Function: xmlSchemaCleanupTypes

    void	xmlSchemaCleanupTypes		(void)

    Cleanup the default XML Schemas type library

    Function: xmlSchemaCollapseString

    xmlChar *	xmlSchemaCollapseString	(const xmlChar * value)

    Removes and normalize white spaces in the string

    value:a value
    Returns:the new string or NULL if no change was required.

    Function: xmlSchemaCompareValues

    int	xmlSchemaCompareValues		(xmlSchemaValPtr x, 
    xmlSchemaValPtr y)

    Compare 2 values

    x:a first value
    y:a second value
    Returns:-1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in case of error

    Function: xmlSchemaCompareValuesWhtsp

    int	xmlSchemaCompareValuesWhtsp	(xmlSchemaValPtr x, 
    xmlSchemaWhitespaceValueType xws,
    xmlSchemaValPtr y,
    xmlSchemaWhitespaceValueType yws)

    Compare 2 values

    x:a first value
    xws:the whitespace value of x
    y:a second value
    yws:the whitespace value of y
    Returns:-1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in case of error

    Function: xmlSchemaCopyValue

    xmlSchemaValPtr	xmlSchemaCopyValue	(xmlSchemaValPtr val)

    Copies the precomputed value. This duplicates any string within.

    val:the precomputed value to be copied
    Returns:the copy or NULL if a copy for a data-type is not implemented.

    Function: xmlSchemaFreeFacet

    void	xmlSchemaFreeFacet		(xmlSchemaFacetPtr facet)

    Deallocate a Schema Facet structure.

    facet:a schema facet structure

    Function: xmlSchemaFreeValue

    void	xmlSchemaFreeValue		(xmlSchemaValPtr value)

    Cleanup the default XML Schemas type library

    value:the value to free

    Function: xmlSchemaGetBuiltInListSimpleTypeItemType

    xmlSchemaTypePtr	xmlSchemaGetBuiltInListSimpleTypeItemType	(xmlSchemaTypePtr type)

    Lookup function

    type:the built-in simple type.
    Returns:the item type of @type as defined by the built-in datatype hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.

    Function: xmlSchemaGetBuiltInType

    xmlSchemaTypePtr	xmlSchemaGetBuiltInType	(xmlSchemaValType type)

    Gives you the type struct for a built-in type by its type id.

    type:the type of the built in type
    Returns:the type if found, NULL otherwise.

    Function: xmlSchemaGetCanonValue

    int	xmlSchemaGetCanonValue		(xmlSchemaValPtr val, 
    const xmlChar ** retValue)

    Get a the cononical lexical representation of the value. The caller has to FREE the returned retValue. WARNING: Some value types are not supported yet, resulting in a @retValue of "???". TODO: XML Schema 1.0 does not define canonical representations for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.

    val:the precomputed value
    retValue:the returned value
    Returns:0 if the value could be built, 1 if the value type is not supported yet and -1 in case of API errors.

    Function: xmlSchemaGetCanonValueWhtsp

    int	xmlSchemaGetCanonValueWhtsp	(xmlSchemaValPtr val, 
    const xmlChar ** retValue,
    xmlSchemaWhitespaceValueType ws)

    Get a the cononical representation of the value. The caller has to free the returned @retValue.

    val:the precomputed value
    retValue:the returned value
    ws:the whitespace type of the value
    Returns:0 if the value could be built, 1 if the value type is not supported yet and -1 in case of API errors.

    Function: xmlSchemaGetFacetValueAsULong

    unsigned long	xmlSchemaGetFacetValueAsULong	(xmlSchemaFacetPtr facet)

    Extract the value of a facet

    facet:an schemas type facet
    Returns:the value as a long

    Function: xmlSchemaGetPredefinedType

    xmlSchemaTypePtr	xmlSchemaGetPredefinedType	(const xmlChar * name, 
    const xmlChar * ns)

    Lookup a type in the default XML Schemas type library

    name:the type name
    ns:the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
    Returns:the type if found, NULL otherwise

    Function: xmlSchemaGetValType

    xmlSchemaValType	xmlSchemaGetValType	(xmlSchemaValPtr val)

    Accessor for the type of a value

    val:a schemas value
    Returns:the xmlSchemaValType of the value

    Function: xmlSchemaInitTypes

    void	xmlSchemaInitTypes		(void)

    Initialize the default XML Schemas type library

    Function: xmlSchemaIsBuiltInTypeFacet

    int	xmlSchemaIsBuiltInTypeFacet	(xmlSchemaTypePtr type, 
    int facetType)

    Evaluates if a specific facet can be used in conjunction with a type.

    type:the built-in type
    facetType:the facet type
    Returns:1 if the facet can be used with the given built-in type, 0 otherwise and -1 in case the type is not a built-in type.

    Function: xmlSchemaNewFacet

    xmlSchemaFacetPtr	xmlSchemaNewFacet	(void)

    Allocate a new Facet structure.

    Returns:the newly allocated structure or NULL in case or error

    Function: xmlSchemaNewNOTATIONValue

    xmlSchemaValPtr	xmlSchemaNewNOTATIONValue	(const xmlChar * name, 
    const xmlChar * ns)

    Allocate a new NOTATION value. The given values are consumed and freed with the struct.

    name:the notation name
    ns:the notation namespace name or NULL
    Returns:a pointer to the new value or NULL in case of error

    Function: xmlSchemaNewQNameValue

    xmlSchemaValPtr	xmlSchemaNewQNameValue	(const xmlChar * namespaceName, 
    const xmlChar * localName)

    Allocate a new QName value. The given values are consumed and freed with the struct.

    namespaceName:the namespace name
    localName:the local name
    Returns:a pointer to the new value or NULL in case of an error.

    Function: xmlSchemaNewStringValue

    xmlSchemaValPtr	xmlSchemaNewStringValue	(xmlSchemaValType type, 
    const xmlChar * value)

    Allocate a new simple type value. The type can be of XML_SCHEMAS_STRING. WARNING: This one is intended to be expanded for other string based types. We need this for anySimpleType as well. The given value is consumed and freed with the struct.

    type:the value type
    value:the value
    Returns:a pointer to the new value or NULL in case of error

    Function: xmlSchemaValPredefTypeNode

    int	xmlSchemaValPredefTypeNode	(xmlSchemaTypePtr type, 
    const xmlChar * value,
    xmlSchemaValPtr * val,
    xmlNodePtr node)

    Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val.

    type:the predefined type
    value:the value to check
    val:the return computed value
    node:the node containing the value
    Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlSchemaValPredefTypeNodeNoNorm

    int	xmlSchemaValPredefTypeNodeNoNorm	(xmlSchemaTypePtr type, 
    const xmlChar * value,
    xmlSchemaValPtr * val,
    xmlNodePtr node)

    Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val. This one does apply any normalization to the value.

    type:the predefined type
    value:the value to check
    val:the return computed value
    node:the node containing the value
    Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlSchemaValidateFacet

    int	xmlSchemaValidateFacet		(xmlSchemaTypePtr base, 
    xmlSchemaFacetPtr facet,
    const xmlChar * value,
    xmlSchemaValPtr val)

    Check a value against a facet condition

    base:the base type
    facet:the facet to check
    value:the lexical repr of the value to validate
    val:the precomputed value
    Returns:0 if the element is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlSchemaValidateFacetWhtsp

    int	xmlSchemaValidateFacetWhtsp	(xmlSchemaFacetPtr facet, 
    xmlSchemaWhitespaceValueType fws,
    xmlSchemaValType valType,
    const xmlChar * value,
    xmlSchemaValPtr val,
    xmlSchemaWhitespaceValueType ws)

    Check a value against a facet condition. This takes value normalization according to the specified whitespace types into account. Note that @value needs to be the *normalized* value if the facet is of type "pattern".

    facet:the facet to check
    fws:the whitespace type of the facet's value
    valType:the built-in type of the value
    value:the lexical (or normalized for pattern) repr of the value to validate
    val:the precomputed value
    ws:the whitespace type of the value
    Returns:0 if the element is schemas valid, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlSchemaValidateLengthFacet

    int	xmlSchemaValidateLengthFacet	(xmlSchemaTypePtr type, 
    xmlSchemaFacetPtr facet,
    const xmlChar * value,
    xmlSchemaValPtr val,
    unsigned long * length)

    Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value.

    type:the built-in type
    facet:the facet to check
    value:the lexical repr. of the value to be validated
    val:the precomputed value
    length:the actual length of the value
    Returns:0 if the value is valid, a positive error code otherwise and -1 in case of an internal or API error.

    Function: xmlSchemaValidateLengthFacetWhtsp

    int	xmlSchemaValidateLengthFacetWhtsp	(xmlSchemaFacetPtr facet, 
    xmlSchemaValType valType,
    const xmlChar * value,
    xmlSchemaValPtr val,
    unsigned long * length,
    xmlSchemaWhitespaceValueType ws)

    Checka a value against a "length", "minLength" and "maxLength" facet; sets @length to the computed length of @value.

    facet:the facet to check
    valType:the built-in type
    value:the lexical repr. of the value to be validated
    val:the precomputed value
    length:the actual length of the value
    ws:the whitespace type of the value
    Returns:0 if the value is valid, a positive error code otherwise and -1 in case of an internal or API error.

    Function: xmlSchemaValidateListSimpleTypeFacet

    int	xmlSchemaValidateListSimpleTypeFacet	(xmlSchemaFacetPtr facet, 
    const xmlChar * value,
    unsigned long actualLen,
    unsigned long * expectedLen)

    Checks the value of a list simple type against a facet.

    facet:the facet to check
    value:the lexical repr of the value to validate
    actualLen:the number of list items
    expectedLen:the resulting expected number of list items
    Returns:0 if the value is valid, a positive error code number otherwise and -1 in case of an internal error.

    Function: xmlSchemaValidatePredefinedType

    int	xmlSchemaValidatePredefinedType	(xmlSchemaTypePtr type, 
    const xmlChar * value,
    xmlSchemaValPtr * val)

    Check that a value conforms to the lexical space of the predefined type. if true a value is computed and returned in @val.

    type:the predefined type
    value:the value to check
    val:the return computed value
    Returns:0 if this validates, a positive error code number otherwise and -1 in case of internal or API error.

    Function: xmlSchemaValueAppend

    int	xmlSchemaValueAppend		(xmlSchemaValPtr prev, 
    xmlSchemaValPtr cur)

    Appends a next sibling to a list of computed values.

    prev:the value
    cur:the value to be appended
    Returns:0 if succeeded and -1 on API errors.

    Function: xmlSchemaValueGetAsBoolean

    int	xmlSchemaValueGetAsBoolean	(xmlSchemaValPtr val)

    Accessor for the boolean value of a computed value.

    val:the value
    Returns:1 if true and 0 if false, or in case of an error. Hmm.

    Function: xmlSchemaValueGetAsString

    const xmlChar *	xmlSchemaValueGetAsString	(xmlSchemaValPtr val)

    Accessor for the string value of a computed value.

    val:the value
    Returns:the string value or NULL if there was none, or on API errors.

    Function: xmlSchemaValueGetNext

    xmlSchemaValPtr	xmlSchemaValueGetNext	(xmlSchemaValPtr cur)

    Accessor for the next sibling of a list of computed values.

    cur:the value
    Returns:the next value or NULL if there was none, or on API errors.

    Function: xmlSchemaWhiteSpaceReplace

    xmlChar *	xmlSchemaWhiteSpaceReplace	(const xmlChar * value)

    Replaces 0xd, 0x9 and 0xa with a space.

    value:a value
    Returns:the new string or NULL if no change was required.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-lib.html0000644000175000017500000002264312134171042017210 0ustar aronaron Reference Manual for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Reference Manual for libxml2

    API Menu
    API Indexes
    Related links

    Table of Contents

    • DOCBparser: old DocBook SGML parser
    • HTMLparser: interface for an HTML 4.0 non-verifying parser
    • HTMLtree: specific APIs to process HTML tree, especially serialization
    • SAX: Old SAX version 1 handler, deprecated
    • SAX2: SAX2 parser interface used to build the DOM tree
    • c14n: Provide Canonical XML and Exclusive XML Canonicalization
    • catalog: interfaces to the Catalog handling system
    • chvalid: Unicode character range checking
    • debugXML: Tree debugging APIs
    • dict: string dictionnary
    • encoding: interface for the encoding conversion functions
    • entities: interface for the XML entities handling
    • globals: interface for all global variables of the library
    • hash: Chained hash tables
    • list: lists interfaces
    • nanoftp: minimal FTP implementation
    • nanohttp: minimal HTTP implementation
    • parser: the core parser module
    • parserInternals: internals routines and limits exported by the parser.
    • pattern: pattern expression handling
    • relaxng: implementation of the Relax-NG validation
    • schemasInternals: internal interfaces for XML Schemas
    • schematron: XML Schemastron implementation
    • threads: interfaces for thread handling
    • tree: interfaces for tree manipulation
    • uri: library of generic URI related routines
    • valid: The DTD validation
    • xinclude: implementation of XInclude
    • xlink: unfinished XLink detection module
    • xmlIO: interface for the I/O interfaces used by the parser
    • xmlautomata: API to build regexp automata
    • xmlerror: error handling
    • xmlexports: macros for marking symbols as exportable/importable.
    • xmlmemory: interface for the memory allocator
    • xmlmodule: dynamic module loading
    • xmlreader: the XMLReader implementation
    • xmlregexp: regular expressions handling
    • xmlsave: the XML document serializer
    • xmlschemas: incomplete XML Schemas structure implementation
    • xmlschemastypes: implementation of XML Schema Datatypes
    • xmlstring: set of routines to process strings
    • xmlunicode: Unicode character APIs
    • xmlversion: compile-time version informations
    • xmlwriter: text writing API for XML
    • xpath: XML Path Language implementation
    • xpathInternals: internal interfaces for XML Path Language implementation
    • xpointer: API to handle XML Pointers

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-chvalid.html0000644000175000017500000004376512134171042020064 0ustar aronaron Module chvalid from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module chvalid from libxml2

    API Menu
    API Indexes
    Related links

    this module exports interfaces for the character range validation APIs This file is automatically generated from the cvs source definition files using the genChRanges.py Python script

    Table of Contents

    #define xmlIsBaseCharQ
    #define xmlIsBaseChar_ch
    #define xmlIsBlankQ
    #define xmlIsBlank_ch
    #define xmlIsCharQ
    #define xmlIsChar_ch
    #define xmlIsCombiningQ
    #define xmlIsDigitQ
    #define xmlIsDigit_ch
    #define xmlIsExtenderQ
    #define xmlIsExtender_ch
    #define xmlIsIdeographicQ
    #define xmlIsPubidCharQ
    #define xmlIsPubidChar_ch
    Structure xmlChLRange
    struct _xmlChLRange
    Typedef xmlChLRange * xmlChLRangePtr
    
    Structure xmlChRangeGroup
    struct _xmlChRangeGroup
    Typedef xmlChRangeGroup * xmlChRangeGroupPtr
    
    Structure xmlChSRange
    struct _xmlChSRange
    Typedef xmlChSRange * xmlChSRangePtr
    
    int	xmlCharInRange			(unsigned int val, 
    const xmlChRangeGroup * rptr)
    int	xmlIsBaseChar			(unsigned int ch)
    int	xmlIsBlank			(unsigned int ch)
    int	xmlIsChar			(unsigned int ch)
    int	xmlIsCombining			(unsigned int ch)
    int	xmlIsDigit			(unsigned int ch)
    int	xmlIsExtender			(unsigned int ch)
    int	xmlIsIdeographic		(unsigned int ch)
    int	xmlIsPubidChar			(unsigned int ch)

    Description

    Macro: xmlIsBaseCharQ

    #define xmlIsBaseCharQ

    Automatically generated by genChRanges.py

    Macro: xmlIsBaseChar_ch

    #define xmlIsBaseChar_ch

    Automatically generated by genChRanges.py

    Macro: xmlIsBlankQ

    #define xmlIsBlankQ

    Automatically generated by genChRanges.py

    Macro: xmlIsBlank_ch

    #define xmlIsBlank_ch

    Automatically generated by genChRanges.py

    Macro: xmlIsCharQ

    #define xmlIsCharQ

    Automatically generated by genChRanges.py

    Macro: xmlIsChar_ch

    #define xmlIsChar_ch

    Automatically generated by genChRanges.py

    Macro: xmlIsCombiningQ

    #define xmlIsCombiningQ

    Automatically generated by genChRanges.py

    Macro: xmlIsDigitQ

    #define xmlIsDigitQ

    Automatically generated by genChRanges.py

    Macro: xmlIsDigit_ch

    #define xmlIsDigit_ch

    Automatically generated by genChRanges.py

    Macro: xmlIsExtenderQ

    #define xmlIsExtenderQ

    Automatically generated by genChRanges.py

    Macro: xmlIsExtender_ch

    #define xmlIsExtender_ch

    Automatically generated by genChRanges.py

    Macro: xmlIsIdeographicQ

    #define xmlIsIdeographicQ

    Automatically generated by genChRanges.py

    Macro: xmlIsPubidCharQ

    #define xmlIsPubidCharQ

    Automatically generated by genChRanges.py

    Macro: xmlIsPubidChar_ch

    #define xmlIsPubidChar_ch

    Automatically generated by genChRanges.py

    Structure xmlChLRange

    Structure xmlChLRange
    struct _xmlChLRange { unsigned int low unsigned int high }

    Structure xmlChRangeGroup

    Structure xmlChRangeGroup
    struct _xmlChRangeGroup { int nbShortRange int nbLongRange const xmlChSRange * shortRange : points to an array of ranges const xmlChLRange * longRange }

    Structure xmlChSRange

    Structure xmlChSRange
    struct _xmlChSRange { unsigned short low unsigned short high }

    Function: xmlCharInRange

    int	xmlCharInRange			(unsigned int val, 
    const xmlChRangeGroup * rptr)

    Does a binary search of the range table to determine if char is valid

    val:character to be validated
    rptr:pointer to range to be used to validate
    Returns:true if character valid, false otherwise

    Function: xmlIsBaseChar

    int	xmlIsBaseChar			(unsigned int ch)

    This function is DEPRECATED. Use xmlIsBaseChar_ch or xmlIsBaseCharQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Function: xmlIsBlank

    int	xmlIsBlank			(unsigned int ch)

    This function is DEPRECATED. Use xmlIsBlank_ch or xmlIsBlankQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Function: xmlIsChar

    int	xmlIsChar			(unsigned int ch)

    This function is DEPRECATED. Use xmlIsChar_ch or xmlIsCharQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Function: xmlIsCombining

    int	xmlIsCombining			(unsigned int ch)

    This function is DEPRECATED. Use xmlIsCombiningQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Function: xmlIsDigit

    int	xmlIsDigit			(unsigned int ch)

    This function is DEPRECATED. Use xmlIsDigit_ch or xmlIsDigitQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Function: xmlIsExtender

    int	xmlIsExtender			(unsigned int ch)

    This function is DEPRECATED. Use xmlIsExtender_ch or xmlIsExtenderQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Function: xmlIsIdeographic

    int	xmlIsIdeographic		(unsigned int ch)

    This function is DEPRECATED. Use xmlIsIdeographicQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Function: xmlIsPubidChar

    int	xmlIsPubidChar			(unsigned int ch)

    This function is DEPRECATED. Use xmlIsPubidChar_ch or xmlIsPubidCharQ instead

    ch:character to validate
    Returns:true if argument valid, false otherwise

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlIO.html0000644000175000017500000017352012134171042017473 0ustar aronaron Module xmlIO from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlIO from libxml2

    API Menu
    API Indexes
    Related links

    interface for the I/O interfaces used by the parser

    Table of Contents

    xmlOutputBufferPtr	xmlAllocOutputBuffer	(xmlCharEncodingHandlerPtr encoder)
    xmlParserInputBufferPtr	xmlAllocParserInputBuffer	(xmlCharEncoding enc)
    int	xmlCheckFilename		(const char * path)
    xmlParserInputPtr	xmlCheckHTTPInput	(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr ret)
    void	xmlCleanupInputCallbacks	(void)
    void	xmlCleanupOutputCallbacks	(void)
    int	xmlFileClose			(void * context)
    int	xmlFileMatch			(const char * filename)
    void *	xmlFileOpen			(const char * filename)
    int	xmlFileRead			(void * context, 
    char * buffer,
    int len)
    void	xmlFreeParserInputBuffer	(xmlParserInputBufferPtr in)
    int	xmlIOFTPClose			(void * context)
    int	xmlIOFTPMatch			(const char * filename)
    void *	xmlIOFTPOpen			(const char * filename)
    int	xmlIOFTPRead			(void * context, 
    char * buffer,
    int len)
    int	xmlIOHTTPClose			(void * context)
    int	xmlIOHTTPMatch			(const char * filename)
    void *	xmlIOHTTPOpen			(const char * filename)
    void *	xmlIOHTTPOpenW			(const char * post_uri, 
    int compression)
    int	xmlIOHTTPRead			(void * context, 
    char * buffer,
    int len)
    Function type: xmlInputCloseCallback
    int	xmlInputCloseCallback		(void * context)
    
    Function type: xmlInputMatchCallback
    int	xmlInputMatchCallback		(char const * filename)
    
    Function type: xmlInputOpenCallback
    void *	xmlInputOpenCallback		(char const * filename)
    
    Function type: xmlInputReadCallback
    int	xmlInputReadCallback		(void * context, 
    char * buffer,
    int len)
    xmlParserInputPtr	xmlNoNetExternalEntityLoader	(const char * URL, 
    const char * ID,
    xmlParserCtxtPtr ctxt)
    xmlChar *	xmlNormalizeWindowsPath	(const xmlChar * path)
    int	xmlOutputBufferClose		(xmlOutputBufferPtr out)
    xmlOutputBufferPtr	xmlOutputBufferCreateBuffer	(xmlBufferPtr buffer, 
    xmlCharEncodingHandlerPtr encoder)
    xmlOutputBufferPtr	xmlOutputBufferCreateFd	(int fd, 
    xmlCharEncodingHandlerPtr encoder)
    xmlOutputBufferPtr	xmlOutputBufferCreateFile	(FILE * file, 
    xmlCharEncodingHandlerPtr encoder)
    xmlOutputBufferPtr	xmlOutputBufferCreateFilename	(const char * URI, 
    xmlCharEncodingHandlerPtr encoder,
    int compression)
    xmlOutputBufferPtr	xmlOutputBufferCreateIO	(xmlOutputWriteCallback iowrite, 
    xmlOutputCloseCallback ioclose,
    void * ioctx,
    xmlCharEncodingHandlerPtr encoder)
    int	xmlOutputBufferFlush		(xmlOutputBufferPtr out)
    const xmlChar *	xmlOutputBufferGetContent	(xmlOutputBufferPtr out)
    size_t	xmlOutputBufferGetSize		(xmlOutputBufferPtr out)
    int	xmlOutputBufferWrite		(xmlOutputBufferPtr out, 
    int len,
    const char * buf)
    int	xmlOutputBufferWriteEscape	(xmlOutputBufferPtr out, 
    const xmlChar * str,
    xmlCharEncodingOutputFunc escaping)
    int	xmlOutputBufferWriteString	(xmlOutputBufferPtr out, 
    const char * str)
    Function type: xmlOutputCloseCallback
    int	xmlOutputCloseCallback		(void * context)
    
    Function type: xmlOutputMatchCallback
    int	xmlOutputMatchCallback		(char const * filename)
    
    Function type: xmlOutputOpenCallback
    void *	xmlOutputOpenCallback		(char const * filename)
    
    Function type: xmlOutputWriteCallback
    int	xmlOutputWriteCallback		(void * context, 
    const char * buffer,
    int len)
    char *	xmlParserGetDirectory		(const char * filename)
    xmlParserInputBufferPtr	xmlParserInputBufferCreateFd	(int fd, 
    xmlCharEncoding enc)
    xmlParserInputBufferPtr	xmlParserInputBufferCreateFile	(FILE * file, 
    xmlCharEncoding enc)
    xmlParserInputBufferPtr	xmlParserInputBufferCreateFilename	(const char * URI, 
    xmlCharEncoding enc)
    xmlParserInputBufferPtr	xmlParserInputBufferCreateIO	(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    xmlCharEncoding enc)
    xmlParserInputBufferPtr	xmlParserInputBufferCreateMem	(const char * mem, 
    int size,
    xmlCharEncoding enc)
    xmlParserInputBufferPtr	xmlParserInputBufferCreateStatic	(const char * mem, 
    int size,
    xmlCharEncoding enc)
    int	xmlParserInputBufferGrow	(xmlParserInputBufferPtr in, 
    int len)
    int	xmlParserInputBufferPush	(xmlParserInputBufferPtr in, 
    int len,
    const char * buf)
    int	xmlParserInputBufferRead	(xmlParserInputBufferPtr in, 
    int len)
    int	xmlPopInputCallbacks		(void)
    void	xmlRegisterDefaultInputCallbacks	(void)
    void	xmlRegisterDefaultOutputCallbacks	(void)
    void	xmlRegisterHTTPPostCallbacks	(void)
    int	xmlRegisterInputCallbacks	(xmlInputMatchCallback matchFunc, 
    xmlInputOpenCallback openFunc,
    xmlInputReadCallback readFunc,
    xmlInputCloseCallback closeFunc)
    int	xmlRegisterOutputCallbacks	(xmlOutputMatchCallback matchFunc, 
    xmlOutputOpenCallback openFunc,
    xmlOutputWriteCallback writeFunc,
    xmlOutputCloseCallback closeFunc)

    Description

    Function: xmlAllocOutputBuffer

    xmlOutputBufferPtr	xmlAllocOutputBuffer	(xmlCharEncodingHandlerPtr encoder)

    Create a buffered parser output

    encoder:the encoding converter or NULL
    Returns:the new parser output or NULL

    Function: xmlAllocParserInputBuffer

    xmlParserInputBufferPtr	xmlAllocParserInputBuffer	(xmlCharEncoding enc)

    Create a buffered parser input for progressive parsing

    enc:the charset encoding if known
    Returns:the new parser input or NULL

    Function: xmlCheckFilename

    int	xmlCheckFilename		(const char * path)

    function checks to see if @path is a valid source (file, socket...) for XML. if stat is not available on the target machine,

    path:the path to check
    Returns:1. if stat fails, returns 0 (if calling stat on the filename fails, it can't be right). if stat succeeds and the file is a directory, returns 2. otherwise returns 1.

    Function: xmlCheckHTTPInput

    xmlParserInputPtr	xmlCheckHTTPInput	(xmlParserCtxtPtr ctxt, 
    xmlParserInputPtr ret)

    Check an input in case it was created from an HTTP stream, in that case it will handle encoding and update of the base URL in case of redirection. It also checks for HTTP errors in which case the input is cleanly freed up and an appropriate error is raised in context

    ctxt:an XML parser context
    ret:an XML parser input
    Returns:the input or NULL in case of HTTP error.

    Function: xmlCleanupInputCallbacks

    void	xmlCleanupInputCallbacks	(void)

    clears the entire input callback table. this includes the compiled-in I/O.

    Function: xmlCleanupOutputCallbacks

    void	xmlCleanupOutputCallbacks	(void)

    clears the entire output callback table. this includes the compiled-in I/O callbacks.

    Function: xmlFileClose

    int	xmlFileClose			(void * context)

    Close an I/O channel

    context:the I/O context
    Returns:0 or -1 in case of error

    Function: xmlFileMatch

    int	xmlFileMatch			(const char * filename)

    input from FILE *

    filename:the URI for matching
    Returns:1 if matches, 0 otherwise

    Function: xmlFileOpen

    void *	xmlFileOpen			(const char * filename)

    Wrapper around xmlFileOpen_real that try it with an unescaped version of @filename, if this fails fallback to @filename

    filename:the URI for matching
    Returns:a handler or NULL in case or failure

    Function: xmlFileRead

    int	xmlFileRead			(void * context, 
    char * buffer,
    int len)

    Read @len bytes to @buffer from the I/O channel.

    context:the I/O context
    buffer:where to drop data
    len:number of bytes to write
    Returns:the number of bytes written or < 0 in case of failure

    Function: xmlFreeParserInputBuffer

    void	xmlFreeParserInputBuffer	(xmlParserInputBufferPtr in)

    Free up the memory used by a buffered parser input

    in:a buffered parser input

    Function: xmlIOFTPClose

    int	xmlIOFTPClose			(void * context)

    Close an FTP I/O channel

    context:the I/O context
    Returns:0

    Function: xmlIOFTPMatch

    int	xmlIOFTPMatch			(const char * filename)

    check if the URI matches an FTP one

    filename:the URI for matching
    Returns:1 if matches, 0 otherwise

    Function: xmlIOFTPOpen

    void *	xmlIOFTPOpen			(const char * filename)

    open an FTP I/O channel

    filename:the URI for matching
    Returns:an I/O context or NULL in case of error

    Function: xmlIOFTPRead

    int	xmlIOFTPRead			(void * context, 
    char * buffer,
    int len)

    Read @len bytes to @buffer from the I/O channel.

    context:the I/O context
    buffer:where to drop data
    len:number of bytes to write
    Returns:the number of bytes written

    Function: xmlIOHTTPClose

    int	xmlIOHTTPClose			(void * context)

    Close an HTTP I/O channel

    context:the I/O context
    Returns:0

    Function: xmlIOHTTPMatch

    int	xmlIOHTTPMatch			(const char * filename)

    check if the URI matches an HTTP one

    filename:the URI for matching
    Returns:1 if matches, 0 otherwise

    Function: xmlIOHTTPOpen

    void *	xmlIOHTTPOpen			(const char * filename)

    open an HTTP I/O channel

    filename:the URI for matching
    Returns:an I/O context or NULL in case of error

    Function: xmlIOHTTPOpenW

    void *	xmlIOHTTPOpenW			(const char * post_uri, 
    int compression)

    Open a temporary buffer to collect the document for a subsequent HTTP POST request. Non-static as is called from the output buffer creation routine.

    post_uri:The destination URI for the document
    compression:The compression desired for the document.
    Returns:an I/O context or NULL in case of error.

    Function: xmlIOHTTPRead

    int	xmlIOHTTPRead			(void * context, 
    char * buffer,
    int len)

    Read @len bytes to @buffer from the I/O channel.

    context:the I/O context
    buffer:where to drop data
    len:number of bytes to write
    Returns:the number of bytes written

    Function type: xmlInputCloseCallback

    Function type: xmlInputCloseCallback
    int	xmlInputCloseCallback		(void * context)
    

    Callback used in the I/O Input API to close the resource

    context:an Input context
    Returns:0 or -1 in case of error

    Function type: xmlInputMatchCallback

    Function type: xmlInputMatchCallback
    int	xmlInputMatchCallback		(char const * filename)
    

    Callback used in the I/O Input API to detect if the current handler can provide input fonctionnalities for this resource.

    filename:the filename or URI
    Returns:1 if yes and 0 if another Input module should be used

    Function type: xmlInputOpenCallback

    Function type: xmlInputOpenCallback
    void *	xmlInputOpenCallback		(char const * filename)
    

    Callback used in the I/O Input API to open the resource

    filename:the filename or URI
    Returns:an Input context or NULL in case or error

    Function type: xmlInputReadCallback

    Function type: xmlInputReadCallback
    int	xmlInputReadCallback		(void * context, 
    char * buffer,
    int len)

    Callback used in the I/O Input API to read the resource

    context:an Input context
    buffer:the buffer to store data read
    len:the length of the buffer in bytes
    Returns:the number of bytes read or -1 in case of error

    Function: xmlNoNetExternalEntityLoader

    xmlParserInputPtr	xmlNoNetExternalEntityLoader	(const char * URL, 
    const char * ID,
    xmlParserCtxtPtr ctxt)

    A specific entity loader disabling network accesses, though still allowing local catalog accesses for resolution.

    URL:the URL for the entity to load
    ID:the System ID for the entity to load
    ctxt:the context in which the entity is called or NULL
    Returns:a new allocated xmlParserInputPtr, or NULL.

    Function: xmlNormalizeWindowsPath

    xmlChar *	xmlNormalizeWindowsPath	(const xmlChar * path)

    This function is obsolete. Please see xmlURIFromPath in uri.c for a better solution.

    path:the input file path
    Returns:a canonicalized version of the path

    Function: xmlOutputBufferClose

    int	xmlOutputBufferClose		(xmlOutputBufferPtr out)

    flushes and close the output I/O channel and free up all the associated resources

    out:a buffered output
    Returns:the number of byte written or -1 in case of error.

    Function: xmlOutputBufferCreateBuffer

    xmlOutputBufferPtr	xmlOutputBufferCreateBuffer	(xmlBufferPtr buffer, 
    xmlCharEncodingHandlerPtr encoder)

    Create a buffered output for the progressive saving to a xmlBuffer

    buffer:a xmlBufferPtr
    encoder:the encoding converter or NULL
    Returns:the new parser output or NULL

    Function: xmlOutputBufferCreateFd

    xmlOutputBufferPtr	xmlOutputBufferCreateFd	(int fd, 
    xmlCharEncodingHandlerPtr encoder)

    Create a buffered output for the progressive saving to a file descriptor

    fd:a file descriptor number
    encoder:the encoding converter or NULL
    Returns:the new parser output or NULL

    Function: xmlOutputBufferCreateFile

    xmlOutputBufferPtr	xmlOutputBufferCreateFile	(FILE * file, 
    xmlCharEncodingHandlerPtr encoder)

    Create a buffered output for the progressive saving to a FILE * buffered C I/O

    file:a FILE*
    encoder:the encoding converter or NULL
    Returns:the new parser output or NULL

    Function: xmlOutputBufferCreateFilename

    xmlOutputBufferPtr	xmlOutputBufferCreateFilename	(const char * URI, 
    xmlCharEncodingHandlerPtr encoder,
    int compression)

    Create a buffered output for the progressive saving of a file If filename is "-' then we use stdout as the output. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. TODO: currently if compression is set, the library only support writing to a local file.

    URI:a C string containing the URI or filename
    encoder:the encoding converter or NULL
    compression:the compression ration (0 none, 9 max).
    Returns:the new output or NULL

    Function: xmlOutputBufferCreateIO

    xmlOutputBufferPtr	xmlOutputBufferCreateIO	(xmlOutputWriteCallback iowrite, 
    xmlOutputCloseCallback ioclose,
    void * ioctx,
    xmlCharEncodingHandlerPtr encoder)

    Create a buffered output for the progressive saving to an I/O handler

    iowrite:an I/O write function
    ioclose:an I/O close function
    ioctx:an I/O handler
    encoder:the charset encoding if known
    Returns:the new parser output or NULL

    Function: xmlOutputBufferFlush

    int	xmlOutputBufferFlush		(xmlOutputBufferPtr out)

    flushes the output I/O channel

    out:a buffered output
    Returns:the number of byte written or -1 in case of error.

    Function: xmlOutputBufferGetContent

    const xmlChar *	xmlOutputBufferGetContent	(xmlOutputBufferPtr out)

    Gives a pointer to the data currently held in the output buffer

    out:an xmlOutputBufferPtr
    Returns:a pointer to the data or NULL in case of error

    Function: xmlOutputBufferGetSize

    size_t	xmlOutputBufferGetSize		(xmlOutputBufferPtr out)

    Gives the length of the data currently held in the output buffer

    out:an xmlOutputBufferPtr
    Returns:0 in case or error or no data is held, the size otherwise

    Function: xmlOutputBufferWrite

    int	xmlOutputBufferWrite		(xmlOutputBufferPtr out, 
    int len,
    const char * buf)

    Write the content of the array in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.

    out:a buffered parser output
    len:the size in bytes of the array.
    buf:an char array
    Returns:the number of chars immediately written, or -1 in case of error.

    Function: xmlOutputBufferWriteEscape

    int	xmlOutputBufferWriteEscape	(xmlOutputBufferPtr out, 
    const xmlChar * str,
    xmlCharEncodingOutputFunc escaping)

    Write the content of the string in the output I/O buffer This routine escapes the caracters and then handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.

    out:a buffered parser output
    str:a zero terminated UTF-8 string
    escaping:an optional escaping function (or NULL)
    Returns:the number of chars immediately written, or -1 in case of error.

    Function: xmlOutputBufferWriteString

    int	xmlOutputBufferWriteString	(xmlOutputBufferPtr out, 
    const char * str)

    Write the content of the string in the output I/O buffer This routine handle the I18N transcoding from internal UTF-8 The buffer is lossless, i.e. will store in case of partial or delayed writes.

    out:a buffered parser output
    str:a zero terminated C string
    Returns:the number of chars immediately written, or -1 in case of error.

    Function type: xmlOutputCloseCallback

    Function type: xmlOutputCloseCallback
    int	xmlOutputCloseCallback		(void * context)
    

    Callback used in the I/O Output API to close the resource

    context:an Output context
    Returns:0 or -1 in case of error

    Function type: xmlOutputMatchCallback

    Function type: xmlOutputMatchCallback
    int	xmlOutputMatchCallback		(char const * filename)
    

    Callback used in the I/O Output API to detect if the current handler can provide output fonctionnalities for this resource.

    filename:the filename or URI
    Returns:1 if yes and 0 if another Output module should be used

    Function type: xmlOutputOpenCallback

    Function type: xmlOutputOpenCallback
    void *	xmlOutputOpenCallback		(char const * filename)
    

    Callback used in the I/O Output API to open the resource

    filename:the filename or URI
    Returns:an Output context or NULL in case or error

    Function type: xmlOutputWriteCallback

    Function type: xmlOutputWriteCallback
    int	xmlOutputWriteCallback		(void * context, 
    const char * buffer,
    int len)

    Callback used in the I/O Output API to write to the resource

    context:an Output context
    buffer:the buffer of data to write
    len:the length of the buffer in bytes
    Returns:the number of bytes written or -1 in case of error

    Function: xmlParserGetDirectory

    char *	xmlParserGetDirectory		(const char * filename)

    lookup the directory for that file

    filename:the path to a file
    Returns:a new allocated string containing the directory, or NULL.

    Function: xmlParserInputBufferCreateFd

    xmlParserInputBufferPtr	xmlParserInputBufferCreateFd	(int fd, 
    xmlCharEncoding enc)

    Create a buffered parser input for the progressive parsing for the input from a file descriptor

    fd:a file descriptor number
    enc:the charset encoding if known
    Returns:the new parser input or NULL

    Function: xmlParserInputBufferCreateFile

    xmlParserInputBufferPtr	xmlParserInputBufferCreateFile	(FILE * file, 
    xmlCharEncoding enc)

    Create a buffered parser input for the progressive parsing of a FILE * buffered C I/O

    file:a FILE*
    enc:the charset encoding if known
    Returns:the new parser input or NULL

    Function: xmlParserInputBufferCreateFilename

    xmlParserInputBufferPtr	xmlParserInputBufferCreateFilename	(const char * URI, 
    xmlCharEncoding enc)

    Create a buffered parser input for the progressive parsing of a file If filename is "-' then we use stdin as the input. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time. Do an encoding check if enc == XML_CHAR_ENCODING_NONE

    URI:a C string containing the URI or filename
    enc:the charset encoding if known
    Returns:the new parser input or NULL

    Function: xmlParserInputBufferCreateIO

    xmlParserInputBufferPtr	xmlParserInputBufferCreateIO	(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    xmlCharEncoding enc)

    Create a buffered parser input for the progressive parsing for the input from an I/O handler

    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    enc:the charset encoding if known
    Returns:the new parser input or NULL

    Function: xmlParserInputBufferCreateMem

    xmlParserInputBufferPtr	xmlParserInputBufferCreateMem	(const char * mem, 
    int size,
    xmlCharEncoding enc)

    Create a buffered parser input for the progressive parsing for the input from a memory area.

    mem:the memory input
    size:the length of the memory block
    enc:the charset encoding if known
    Returns:the new parser input or NULL

    Function: xmlParserInputBufferCreateStatic

    xmlParserInputBufferPtr	xmlParserInputBufferCreateStatic	(const char * mem, 
    int size,
    xmlCharEncoding enc)

    Create a buffered parser input for the progressive parsing for the input from an immutable memory area. This will not copy the memory area to the buffer, but the memory is expected to be available until the end of the parsing, this is useful for example when using mmap'ed file.

    mem:the memory input
    size:the length of the memory block
    enc:the charset encoding if known
    Returns:the new parser input or NULL

    Function: xmlParserInputBufferGrow

    int	xmlParserInputBufferGrow	(xmlParserInputBufferPtr in, 
    int len)

    Grow up the content of the input buffer, the old data are preserved This routine handle the I18N transcoding to internal UTF-8 This routine is used when operating the parser in normal (pull) mode TODO: one should be able to remove one extra copy by copying directly onto in->buffer or in->raw

    in:a buffered parser input
    len:indicative value of the amount of chars to read
    Returns:the number of chars read and stored in the buffer, or -1 in case of error.

    Function: xmlParserInputBufferPush

    int	xmlParserInputBufferPush	(xmlParserInputBufferPtr in, 
    int len,
    const char * buf)

    Push the content of the arry in the input buffer This routine handle the I18N transcoding to internal UTF-8 This is used when operating the parser in progressive (push) mode.

    in:a buffered parser input
    len:the size in bytes of the array.
    buf:an char array
    Returns:the number of chars read and stored in the buffer, or -1 in case of error.

    Function: xmlParserInputBufferRead

    int	xmlParserInputBufferRead	(xmlParserInputBufferPtr in, 
    int len)

    Refresh the content of the input buffer, the old data are considered consumed This routine handle the I18N transcoding to internal UTF-8

    in:a buffered parser input
    len:indicative value of the amount of chars to read
    Returns:the number of chars read and stored in the buffer, or -1 in case of error.

    Function: xmlPopInputCallbacks

    int	xmlPopInputCallbacks		(void)

    Clear the top input callback from the input stack. this includes the compiled-in I/O.

    Returns:the number of input callback registered or -1 in case of error.

    Function: xmlRegisterDefaultInputCallbacks

    void	xmlRegisterDefaultInputCallbacks	(void)

    Registers the default compiled-in I/O handlers.

    Function: xmlRegisterDefaultOutputCallbacks

    void	xmlRegisterDefaultOutputCallbacks	(void)

    Registers the default compiled-in I/O handlers.

    Function: xmlRegisterHTTPPostCallbacks

    void	xmlRegisterHTTPPostCallbacks	(void)

    By default, libxml submits HTTP output requests using the "PUT" method. Calling this method changes the HTTP output method to use the "POST" method instead.

    Function: xmlRegisterInputCallbacks

    int	xmlRegisterInputCallbacks	(xmlInputMatchCallback matchFunc, 
    xmlInputOpenCallback openFunc,
    xmlInputReadCallback readFunc,
    xmlInputCloseCallback closeFunc)

    Register a new set of I/O callback for handling parser input.

    matchFunc:the xmlInputMatchCallback
    openFunc:the xmlInputOpenCallback
    readFunc:the xmlInputReadCallback
    closeFunc:the xmlInputCloseCallback
    Returns:the registered handler number or -1 in case of error

    Function: xmlRegisterOutputCallbacks

    int	xmlRegisterOutputCallbacks	(xmlOutputMatchCallback matchFunc, 
    xmlOutputOpenCallback openFunc,
    xmlOutputWriteCallback writeFunc,
    xmlOutputCloseCallback closeFunc)

    Register a new set of I/O callback for handling output.

    matchFunc:the xmlOutputMatchCallback
    openFunc:the xmlOutputOpenCallback
    writeFunc:the xmlOutputWriteCallback
    closeFunc:the xmlOutputCloseCallback
    Returns:the registered handler number or -1 in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-entities.html0000644000175000017500000006603712134171042020273 0ustar aronaron Module entities from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module entities from libxml2

    API Menu
    API Indexes
    Related links

    this module provides some of the entity API needed for the parser and applications.

    Table of Contents

    Structure xmlEntitiesTable
    struct _xmlHashTable The content of this structure is not made public by the API.
    Typedef xmlEntitiesTable * xmlEntitiesTablePtr
    
    Enum xmlEntityType
    
    xmlEntityPtr	xmlAddDocEntity		(xmlDocPtr doc, 
    const xmlChar * name,
    int type,
    const xmlChar * ExternalID,
    const xmlChar * SystemID,
    const xmlChar * content)
    xmlEntityPtr	xmlAddDtdEntity		(xmlDocPtr doc, 
    const xmlChar * name,
    int type,
    const xmlChar * ExternalID,
    const xmlChar * SystemID,
    const xmlChar * content)
    void	xmlCleanupPredefinedEntities	(void)
    xmlEntitiesTablePtr	xmlCopyEntitiesTable	(xmlEntitiesTablePtr table)
    xmlEntitiesTablePtr	xmlCreateEntitiesTable	(void)
    void	xmlDumpEntitiesTable		(xmlBufferPtr buf, 
    xmlEntitiesTablePtr table)
    void	xmlDumpEntityDecl		(xmlBufferPtr buf, 
    xmlEntityPtr ent)
    const xmlChar *	xmlEncodeEntities	(xmlDocPtr doc, 
    const xmlChar * input)
    xmlChar *	xmlEncodeEntitiesReentrant	(xmlDocPtr doc, 
    const xmlChar * input)
    xmlChar *	xmlEncodeSpecialChars	(xmlDocPtr doc, 
    const xmlChar * input)
    void	xmlFreeEntitiesTable		(xmlEntitiesTablePtr table)
    xmlEntityPtr	xmlGetDocEntity		(xmlDocPtr doc, 
    const xmlChar * name)
    xmlEntityPtr	xmlGetDtdEntity		(xmlDocPtr doc, 
    const xmlChar * name)
    xmlEntityPtr	xmlGetParameterEntity	(xmlDocPtr doc, 
    const xmlChar * name)
    xmlEntityPtr	xmlGetPredefinedEntity	(const xmlChar * name)
    void	xmlInitializePredefinedEntities	(void)
    xmlEntityPtr	xmlNewEntity		(xmlDocPtr doc, 
    const xmlChar * name,
    int type,
    const xmlChar * ExternalID,
    const xmlChar * SystemID,
    const xmlChar * content)

    Description

    Structure xmlEntitiesTable

    Structure xmlEntitiesTable
    struct _xmlHashTable { The content of this structure is not made public by the API. }

    Enum xmlEntityType

    Enum xmlEntityType {
        XML_INTERNAL_GENERAL_ENTITY = 1
        XML_EXTERNAL_GENERAL_PARSED_ENTITY = 2
        XML_EXTERNAL_GENERAL_UNPARSED_ENTITY = 3
        XML_INTERNAL_PARAMETER_ENTITY = 4
        XML_EXTERNAL_PARAMETER_ENTITY = 5
        XML_INTERNAL_PREDEFINED_ENTITY = 6
    }
    

    Function: xmlAddDocEntity

    xmlEntityPtr	xmlAddDocEntity		(xmlDocPtr doc, 
    const xmlChar * name,
    int type,
    const xmlChar * ExternalID,
    const xmlChar * SystemID,
    const xmlChar * content)

    Register a new entity for this document.

    doc:the document
    name:the entity name
    type:the entity type XML_xxx_yyy_ENTITY
    ExternalID:the entity external ID if available
    SystemID:the entity system ID if available
    content:the entity content
    Returns:a pointer to the entity or NULL in case of error

    Function: xmlAddDtdEntity

    xmlEntityPtr	xmlAddDtdEntity		(xmlDocPtr doc, 
    const xmlChar * name,
    int type,
    const xmlChar * ExternalID,
    const xmlChar * SystemID,
    const xmlChar * content)

    Register a new entity for this document DTD external subset.

    doc:the document
    name:the entity name
    type:the entity type XML_xxx_yyy_ENTITY
    ExternalID:the entity external ID if available
    SystemID:the entity system ID if available
    content:the entity content
    Returns:a pointer to the entity or NULL in case of error

    Function: xmlCleanupPredefinedEntities

    void	xmlCleanupPredefinedEntities	(void)

    Cleanup up the predefined entities table. Deprecated call

    Function: xmlCopyEntitiesTable

    xmlEntitiesTablePtr	xmlCopyEntitiesTable	(xmlEntitiesTablePtr table)

    Build a copy of an entity table.

    table:An entity table
    Returns:the new xmlEntitiesTablePtr or NULL in case of error.

    Function: xmlCreateEntitiesTable

    xmlEntitiesTablePtr	xmlCreateEntitiesTable	(void)

    create and initialize an empty entities hash table. This really doesn't make sense and should be deprecated

    Returns:the xmlEntitiesTablePtr just created or NULL in case of error.

    Function: xmlDumpEntitiesTable

    void	xmlDumpEntitiesTable		(xmlBufferPtr buf, 
    xmlEntitiesTablePtr table)

    This will dump the content of the entity table as an XML DTD definition

    buf:An XML buffer.
    table:An entity table

    Function: xmlDumpEntityDecl

    void	xmlDumpEntityDecl		(xmlBufferPtr buf, 
    xmlEntityPtr ent)

    This will dump the content of the entity table as an XML DTD definition

    buf:An XML buffer.
    ent:An entity table

    Function: xmlEncodeEntities

    const xmlChar *	xmlEncodeEntities	(xmlDocPtr doc, 
    const xmlChar * input)

    TODO: remove xmlEncodeEntities, once we are not afraid of breaking binary compatibility People must migrate their code to xmlEncodeEntitiesReentrant ! This routine will issue a warning when encountered.

    doc:the document containing the string
    input:A string to convert to XML.
    Returns:NULL

    Function: xmlEncodeEntitiesReentrant

    xmlChar *	xmlEncodeEntitiesReentrant	(xmlDocPtr doc, 
    const xmlChar * input)

    Do a global encoding of a string, replacing the predefined entities and non ASCII values with their entities and CharRef counterparts. Contrary to xmlEncodeEntities, this routine is reentrant, and result must be deallocated.

    doc:the document containing the string
    input:A string to convert to XML.
    Returns:A newly allocated string with the substitution done.

    Function: xmlEncodeSpecialChars

    xmlChar *	xmlEncodeSpecialChars	(xmlDocPtr doc, 
    const xmlChar * input)

    Do a global encoding of a string, replacing the predefined entities this routine is reentrant, and result must be deallocated.

    doc:the document containing the string
    input:A string to convert to XML.
    Returns:A newly allocated string with the substitution done.

    Function: xmlFreeEntitiesTable

    void	xmlFreeEntitiesTable		(xmlEntitiesTablePtr table)

    Deallocate the memory used by an entities hash table.

    table:An entity table

    Function: xmlGetDocEntity

    xmlEntityPtr	xmlGetDocEntity		(xmlDocPtr doc, 
    const xmlChar * name)

    Do an entity lookup in the document entity hash table and

    doc:the document referencing the entity
    name:the entity name
    Returns:the corresponding entity, otherwise a lookup is done in the predefined entities too. Returns A pointer to the entity structure or NULL if not found.

    Function: xmlGetDtdEntity

    xmlEntityPtr	xmlGetDtdEntity		(xmlDocPtr doc, 
    const xmlChar * name)

    Do an entity lookup in the DTD entity hash table and

    doc:the document referencing the entity
    name:the entity name
    Returns:the corresponding entity, if found. Note: the first argument is the document node, not the DTD node. Returns A pointer to the entity structure or NULL if not found.

    Function: xmlGetParameterEntity

    xmlEntityPtr	xmlGetParameterEntity	(xmlDocPtr doc, 
    const xmlChar * name)

    Do an entity lookup in the internal and external subsets and

    doc:the document referencing the entity
    name:the entity name
    Returns:the corresponding parameter entity, if found. Returns A pointer to the entity structure or NULL if not found.

    Function: xmlGetPredefinedEntity

    xmlEntityPtr	xmlGetPredefinedEntity	(const xmlChar * name)

    Check whether this name is an predefined entity.

    name:the entity name
    Returns:NULL if not, otherwise the entity

    Function: xmlInitializePredefinedEntities

    void	xmlInitializePredefinedEntities	(void)

    Set up the predefined entities. Deprecated call

    Function: xmlNewEntity

    xmlEntityPtr	xmlNewEntity		(xmlDocPtr doc, 
    const xmlChar * name,
    int type,
    const xmlChar * ExternalID,
    const xmlChar * SystemID,
    const xmlChar * content)

    Create a new entity, this differs from xmlAddDocEntity() that if the document is NULL or has no internal subset defined, then an unlinked entity structure will be returned, it is then the responsability of the caller to link it to the document later or free it when not needed anymore.

    doc:the document
    name:the entity name
    type:the entity type XML_xxx_yyy_ENTITY
    ExternalID:the entity external ID if available
    SystemID:the entity system ID if available
    content:the entity content
    Returns:a pointer to the entity or NULL in case of error

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-valid.html0000644000175000017500000031007112134171042017534 0ustar aronaron Module valid from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module valid from libxml2

    API Menu
    API Indexes
    Related links

    API for the DTD handling and the validity checking

    Table of Contents

    #define XML_CTXT_FINISH_DTD_0
    #define XML_CTXT_FINISH_DTD_1
    Structure xmlAttributeTable
    struct _xmlHashTable The content of this structure is not made public by the API.
    Typedef xmlAttributeTable * xmlAttributeTablePtr
    
    Structure xmlElementTable
    struct _xmlHashTable The content of this structure is not made public by the API.
    Typedef xmlElementTable * xmlElementTablePtr
    
    Structure xmlIDTable
    struct _xmlHashTable The content of this structure is not made public by the API.
    Typedef xmlIDTable * xmlIDTablePtr
    
    Structure xmlNotationTable
    struct _xmlHashTable The content of this structure is not made public by the API.
    Typedef xmlNotationTable * xmlNotationTablePtr
    
    Structure xmlRefTable
    struct _xmlHashTable The content of this structure is not made public by the API.
    Typedef xmlRefTable * xmlRefTablePtr
    
    Structure xmlValidCtxt
    struct _xmlValidCtxt
    Typedef xmlValidCtxt * xmlValidCtxtPtr
    
    Structure xmlValidState
    struct _xmlValidState The content of this structure is not made public by the API.
    Typedef xmlValidState * xmlValidStatePtr
    
    xmlAttributePtr	xmlAddAttributeDecl	(xmlValidCtxtPtr ctxt, 
    xmlDtdPtr dtd,
    const xmlChar * elem,
    const xmlChar * name,
    const xmlChar * ns,
    xmlAttributeType type,
    xmlAttributeDefault def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)
    xmlElementPtr	xmlAddElementDecl	(xmlValidCtxtPtr ctxt, 
    xmlDtdPtr dtd,
    const xmlChar * name,
    xmlElementTypeVal type,
    xmlElementContentPtr content)
    xmlIDPtr	xmlAddID		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    const xmlChar * value,
    xmlAttrPtr attr)
    xmlNotationPtr	xmlAddNotationDecl	(xmlValidCtxtPtr ctxt, 
    xmlDtdPtr dtd,
    const xmlChar * name,
    const xmlChar * PublicID,
    const xmlChar * SystemID)
    xmlRefPtr	xmlAddRef		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    const xmlChar * value,
    xmlAttrPtr attr)
    xmlAttributeTablePtr	xmlCopyAttributeTable	(xmlAttributeTablePtr table)
    xmlElementContentPtr	xmlCopyDocElementContent	(xmlDocPtr doc, 
    xmlElementContentPtr cur)
    xmlElementContentPtr	xmlCopyElementContent	(xmlElementContentPtr cur)
    xmlElementTablePtr	xmlCopyElementTable	(xmlElementTablePtr table)
    xmlEnumerationPtr	xmlCopyEnumeration	(xmlEnumerationPtr cur)
    xmlNotationTablePtr	xmlCopyNotationTable	(xmlNotationTablePtr table)
    xmlEnumerationPtr	xmlCreateEnumeration	(const xmlChar * name)
    void	xmlDumpAttributeDecl		(xmlBufferPtr buf, 
    xmlAttributePtr attr)
    void	xmlDumpAttributeTable		(xmlBufferPtr buf, 
    xmlAttributeTablePtr table)
    void	xmlDumpElementDecl		(xmlBufferPtr buf, 
    xmlElementPtr elem)
    void	xmlDumpElementTable		(xmlBufferPtr buf, 
    xmlElementTablePtr table)
    void	xmlDumpNotationDecl		(xmlBufferPtr buf, 
    xmlNotationPtr nota)
    void	xmlDumpNotationTable		(xmlBufferPtr buf, 
    xmlNotationTablePtr table)
    void	xmlFreeAttributeTable		(xmlAttributeTablePtr table)
    void	xmlFreeDocElementContent	(xmlDocPtr doc, 
    xmlElementContentPtr cur)
    void	xmlFreeElementContent		(xmlElementContentPtr cur)
    void	xmlFreeElementTable		(xmlElementTablePtr table)
    void	xmlFreeEnumeration		(xmlEnumerationPtr cur)
    void	xmlFreeIDTable			(xmlIDTablePtr table)
    void	xmlFreeNotationTable		(xmlNotationTablePtr table)
    void	xmlFreeRefTable			(xmlRefTablePtr table)
    void	xmlFreeValidCtxt		(xmlValidCtxtPtr cur)
    xmlAttributePtr	xmlGetDtdAttrDesc	(xmlDtdPtr dtd, 
    const xmlChar * elem,
    const xmlChar * name)
    xmlElementPtr	xmlGetDtdElementDesc	(xmlDtdPtr dtd, 
    const xmlChar * name)
    xmlNotationPtr	xmlGetDtdNotationDesc	(xmlDtdPtr dtd, 
    const xmlChar * name)
    xmlAttributePtr	xmlGetDtdQAttrDesc	(xmlDtdPtr dtd, 
    const xmlChar * elem,
    const xmlChar * name,
    const xmlChar * prefix)
    xmlElementPtr	xmlGetDtdQElementDesc	(xmlDtdPtr dtd, 
    const xmlChar * name,
    const xmlChar * prefix)
    xmlAttrPtr	xmlGetID		(xmlDocPtr doc, 
    const xmlChar * ID)
    xmlListPtr	xmlGetRefs		(xmlDocPtr doc, 
    const xmlChar * ID)
    int	xmlIsID			(xmlDocPtr doc, 
    xmlNodePtr elem,
    xmlAttrPtr attr)
    int	xmlIsMixedElement		(xmlDocPtr doc, 
    const xmlChar * name)
    int	xmlIsRef			(xmlDocPtr doc, 
    xmlNodePtr elem,
    xmlAttrPtr attr)
    xmlElementContentPtr	xmlNewDocElementContent	(xmlDocPtr doc, 
    const xmlChar * name,
    xmlElementContentType type)
    xmlElementContentPtr	xmlNewElementContent	(const xmlChar * name, 
    xmlElementContentType type)
    xmlValidCtxtPtr	xmlNewValidCtxt		(void)
    int	xmlRemoveID			(xmlDocPtr doc, 
    xmlAttrPtr attr)
    int	xmlRemoveRef			(xmlDocPtr doc, 
    xmlAttrPtr attr)
    void	xmlSnprintfElementContent	(char * buf, 
    int size,
    xmlElementContentPtr content,
    int englob)
    void	xmlSprintfElementContent	(char * buf, 
    xmlElementContentPtr content,
    int englob)
    int	xmlValidBuildContentModel	(xmlValidCtxtPtr ctxt, 
    xmlElementPtr elem)
    xmlChar *	xmlValidCtxtNormalizeAttributeValue	(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * name,
    const xmlChar * value)
    int	xmlValidGetPotentialChildren	(xmlElementContent * ctree, 
    const xmlChar ** names,
    int * len,
    int max)
    int	xmlValidGetValidElements	(xmlNode * prev, 
    xmlNode * next,
    const xmlChar ** names,
    int max)
    xmlChar *	xmlValidNormalizeAttributeValue	(xmlDocPtr doc, 
    xmlNodePtr elem,
    const xmlChar * name,
    const xmlChar * value)
    int	xmlValidateAttributeDecl	(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlAttributePtr attr)
    int	xmlValidateAttributeValue	(xmlAttributeType type, 
    const xmlChar * value)
    int	xmlValidateDocument		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)
    int	xmlValidateDocumentFinal	(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)
    int	xmlValidateDtd			(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlDtdPtr dtd)
    int	xmlValidateDtdFinal		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)
    int	xmlValidateElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)
    int	xmlValidateElementDecl		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlElementPtr elem)
    int	xmlValidateNameValue		(const xmlChar * value)
    int	xmlValidateNamesValue		(const xmlChar * value)
    int	xmlValidateNmtokenValue		(const xmlChar * value)
    int	xmlValidateNmtokensValue	(const xmlChar * value)
    int	xmlValidateNotationDecl		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNotationPtr nota)
    int	xmlValidateNotationUse		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    const xmlChar * notationName)
    int	xmlValidateOneAttribute		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    xmlAttrPtr attr,
    const xmlChar * value)
    int	xmlValidateOneElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)
    int	xmlValidateOneNamespace		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * prefix,
    xmlNsPtr ns,
    const xmlChar * value)
    int	xmlValidatePopElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * qname)
    int	xmlValidatePushCData		(xmlValidCtxtPtr ctxt, 
    const xmlChar * data,
    int len)
    int	xmlValidatePushElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * qname)
    int	xmlValidateRoot			(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)
    Function type: xmlValidityErrorFunc
    void	xmlValidityErrorFunc		(void * ctx, 
    const char * msg,
    ... ...)
    Function type: xmlValidityWarningFunc
    void	xmlValidityWarningFunc		(void * ctx, 
    const char * msg,
    ... ...)

    Description

    Macro: XML_CTXT_FINISH_DTD_0

    #define XML_CTXT_FINISH_DTD_0

    Special value for finishDtd field when embedded in an xmlParserCtxt

    Macro: XML_CTXT_FINISH_DTD_1

    #define XML_CTXT_FINISH_DTD_1

    Special value for finishDtd field when embedded in an xmlParserCtxt

    Structure xmlAttributeTable

    Structure xmlAttributeTable
    struct _xmlHashTable { The content of this structure is not made public by the API. }

    Structure xmlElementTable

    Structure xmlElementTable
    struct _xmlHashTable { The content of this structure is not made public by the API. }

    Structure xmlIDTable

    Structure xmlIDTable
    struct _xmlHashTable { The content of this structure is not made public by the API. }

    Structure xmlNotationTable

    Structure xmlNotationTable
    struct _xmlHashTable { The content of this structure is not made public by the API. }

    Structure xmlRefTable

    Structure xmlRefTable
    struct _xmlHashTable { The content of this structure is not made public by the API. }

    Structure xmlValidCtxt

    Structure xmlValidCtxt
    struct _xmlValidCtxt { void * userData : user specific data block xmlValidityErrorFunc error : the callback in case of errors xmlValidityWarningFunc warning : the callback in case of warning Node an xmlNodePtr node : Current parsed Node int nodeNr : Depth of the parsing stack int nodeMax : Max depth of the parsing stack xmlNodePtr * nodeTab : array of nodes unsigned int finishDtd : finished validating the Dtd ? xmlDocPtr doc : the document int valid : temporary validity check result state s xmlValidState * vstate : current state int vstateNr : Depth of the validation stack int vstateMax : Max depth of the validation stack xmlValidState * vstateTab : array of validation states xmlAutomataPtr am : the automata xmlAutomataStatePtr state : used to build the automata void * am void * state }

    Structure xmlValidState

    Structure xmlValidState
    struct _xmlValidState { The content of this structure is not made public by the API. }

    Function: xmlAddAttributeDecl

    xmlAttributePtr	xmlAddAttributeDecl	(xmlValidCtxtPtr ctxt, 
    xmlDtdPtr dtd,
    const xmlChar * elem,
    const xmlChar * name,
    const xmlChar * ns,
    xmlAttributeType type,
    xmlAttributeDefault def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)

    Register a new attribute declaration Note that @tree becomes the ownership of the DTD

    ctxt:the validation context
    dtd:pointer to the DTD
    elem:the element name
    name:the attribute name
    ns:the attribute namespace prefix
    type:the attribute type
    def:the attribute default type
    defaultValue:the attribute default value
    tree:if it's an enumeration, the associated list
    Returns:NULL if not new, otherwise the attribute decl

    Function: xmlAddElementDecl

    xmlElementPtr	xmlAddElementDecl	(xmlValidCtxtPtr ctxt, 
    xmlDtdPtr dtd,
    const xmlChar * name,
    xmlElementTypeVal type,
    xmlElementContentPtr content)

    Register a new element declaration

    ctxt:the validation context
    dtd:pointer to the DTD
    name:the entity name
    type:the element type
    content:the element content tree or NULL
    Returns:NULL if not, otherwise the entity

    Function: xmlAddID

    xmlIDPtr	xmlAddID		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    const xmlChar * value,
    xmlAttrPtr attr)

    Register a new id declaration

    ctxt:the validation context
    doc:pointer to the document
    value:the value name
    attr:the attribute holding the ID
    Returns:NULL if not, otherwise the new xmlIDPtr

    Function: xmlAddNotationDecl

    xmlNotationPtr	xmlAddNotationDecl	(xmlValidCtxtPtr ctxt, 
    xmlDtdPtr dtd,
    const xmlChar * name,
    const xmlChar * PublicID,
    const xmlChar * SystemID)

    Register a new notation declaration

    ctxt:the validation context
    dtd:pointer to the DTD
    name:the entity name
    PublicID:the public identifier or NULL
    SystemID:the system identifier or NULL
    Returns:NULL if not, otherwise the entity

    Function: xmlAddRef

    xmlRefPtr	xmlAddRef		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    const xmlChar * value,
    xmlAttrPtr attr)

    Register a new ref declaration

    ctxt:the validation context
    doc:pointer to the document
    value:the value name
    attr:the attribute holding the Ref
    Returns:NULL if not, otherwise the new xmlRefPtr

    Function: xmlCopyAttributeTable

    xmlAttributeTablePtr	xmlCopyAttributeTable	(xmlAttributeTablePtr table)

    Build a copy of an attribute table.

    table:An attribute table
    Returns:the new xmlAttributeTablePtr or NULL in case of error.

    Function: xmlCopyDocElementContent

    xmlElementContentPtr	xmlCopyDocElementContent	(xmlDocPtr doc, 
    xmlElementContentPtr cur)

    Build a copy of an element content description.

    doc:the document owning the element declaration
    cur:An element content pointer.
    Returns:the new xmlElementContentPtr or NULL in case of error.

    Function: xmlCopyElementContent

    xmlElementContentPtr	xmlCopyElementContent	(xmlElementContentPtr cur)

    Build a copy of an element content description. Deprecated, use xmlCopyDocElementContent instead

    cur:An element content pointer.
    Returns:the new xmlElementContentPtr or NULL in case of error.

    Function: xmlCopyElementTable

    xmlElementTablePtr	xmlCopyElementTable	(xmlElementTablePtr table)

    Build a copy of an element table.

    table:An element table
    Returns:the new xmlElementTablePtr or NULL in case of error.

    Function: xmlCopyEnumeration

    xmlEnumerationPtr	xmlCopyEnumeration	(xmlEnumerationPtr cur)

    Copy an enumeration attribute node (recursive).

    cur:the tree to copy.
    Returns:the xmlEnumerationPtr just created or NULL in case of error.

    Function: xmlCopyNotationTable

    xmlNotationTablePtr	xmlCopyNotationTable	(xmlNotationTablePtr table)

    Build a copy of a notation table.

    table:A notation table
    Returns:the new xmlNotationTablePtr or NULL in case of error.

    Function: xmlCreateEnumeration

    xmlEnumerationPtr	xmlCreateEnumeration	(const xmlChar * name)

    create and initialize an enumeration attribute node.

    name:the enumeration name or NULL
    Returns:the xmlEnumerationPtr just created or NULL in case of error.

    Function: xmlDumpAttributeDecl

    void	xmlDumpAttributeDecl		(xmlBufferPtr buf, 
    xmlAttributePtr attr)

    This will dump the content of the attribute declaration as an XML DTD definition

    buf:the XML buffer output
    attr:An attribute declaration

    Function: xmlDumpAttributeTable

    void	xmlDumpAttributeTable		(xmlBufferPtr buf, 
    xmlAttributeTablePtr table)

    This will dump the content of the attribute table as an XML DTD definition

    buf:the XML buffer output
    table:An attribute table

    Function: xmlDumpElementDecl

    void	xmlDumpElementDecl		(xmlBufferPtr buf, 
    xmlElementPtr elem)

    This will dump the content of the element declaration as an XML DTD definition

    buf:the XML buffer output
    elem:An element table

    Function: xmlDumpElementTable

    void	xmlDumpElementTable		(xmlBufferPtr buf, 
    xmlElementTablePtr table)

    This will dump the content of the element table as an XML DTD definition

    buf:the XML buffer output
    table:An element table

    Function: xmlDumpNotationDecl

    void	xmlDumpNotationDecl		(xmlBufferPtr buf, 
    xmlNotationPtr nota)

    This will dump the content the notation declaration as an XML DTD definition

    buf:the XML buffer output
    nota:A notation declaration

    Function: xmlDumpNotationTable

    void	xmlDumpNotationTable		(xmlBufferPtr buf, 
    xmlNotationTablePtr table)

    This will dump the content of the notation table as an XML DTD definition

    buf:the XML buffer output
    table:A notation table

    Function: xmlFreeAttributeTable

    void	xmlFreeAttributeTable		(xmlAttributeTablePtr table)

    Deallocate the memory used by an entities hash table.

    table:An attribute table

    Function: xmlFreeDocElementContent

    void	xmlFreeDocElementContent	(xmlDocPtr doc, 
    xmlElementContentPtr cur)

    Free an element content structure. The whole subtree is removed.

    doc:the document owning the element declaration
    cur:the element content tree to free

    Function: xmlFreeElementContent

    void	xmlFreeElementContent		(xmlElementContentPtr cur)

    Free an element content structure. The whole subtree is removed. Deprecated, use xmlFreeDocElementContent instead

    cur:the element content tree to free

    Function: xmlFreeElementTable

    void	xmlFreeElementTable		(xmlElementTablePtr table)

    Deallocate the memory used by an element hash table.

    table:An element table

    Function: xmlFreeEnumeration

    void	xmlFreeEnumeration		(xmlEnumerationPtr cur)

    free an enumeration attribute node (recursive).

    cur:the tree to free.

    Function: xmlFreeIDTable

    void	xmlFreeIDTable			(xmlIDTablePtr table)

    Deallocate the memory used by an ID hash table.

    table:An id table

    Function: xmlFreeNotationTable

    void	xmlFreeNotationTable		(xmlNotationTablePtr table)

    Deallocate the memory used by an entities hash table.

    table:An notation table

    Function: xmlFreeRefTable

    void	xmlFreeRefTable			(xmlRefTablePtr table)

    Deallocate the memory used by an Ref hash table.

    table:An ref table

    Function: xmlFreeValidCtxt

    void	xmlFreeValidCtxt		(xmlValidCtxtPtr cur)

    Free a validation context structure.

    cur:the validation context to free

    Function: xmlGetDtdAttrDesc

    xmlAttributePtr	xmlGetDtdAttrDesc	(xmlDtdPtr dtd, 
    const xmlChar * elem,
    const xmlChar * name)

    Search the DTD for the description of this attribute on this element.

    dtd:a pointer to the DtD to search
    elem:the element name
    name:the attribute name
    Returns:the xmlAttributePtr if found or NULL

    Function: xmlGetDtdElementDesc

    xmlElementPtr	xmlGetDtdElementDesc	(xmlDtdPtr dtd, 
    const xmlChar * name)

    Search the DTD for the description of this element

    dtd:a pointer to the DtD to search
    name:the element name
    Returns:the xmlElementPtr if found or NULL

    Function: xmlGetDtdNotationDesc

    xmlNotationPtr	xmlGetDtdNotationDesc	(xmlDtdPtr dtd, 
    const xmlChar * name)

    Search the DTD for the description of this notation

    dtd:a pointer to the DtD to search
    name:the notation name
    Returns:the xmlNotationPtr if found or NULL

    Function: xmlGetDtdQAttrDesc

    xmlAttributePtr	xmlGetDtdQAttrDesc	(xmlDtdPtr dtd, 
    const xmlChar * elem,
    const xmlChar * name,
    const xmlChar * prefix)

    Search the DTD for the description of this qualified attribute on this element.

    dtd:a pointer to the DtD to search
    elem:the element name
    name:the attribute name
    prefix:the attribute namespace prefix
    Returns:the xmlAttributePtr if found or NULL

    Function: xmlGetDtdQElementDesc

    xmlElementPtr	xmlGetDtdQElementDesc	(xmlDtdPtr dtd, 
    const xmlChar * name,
    const xmlChar * prefix)

    Search the DTD for the description of this element

    dtd:a pointer to the DtD to search
    name:the element name
    prefix:the element namespace prefix
    Returns:the xmlElementPtr if found or NULL

    Function: xmlGetID

    xmlAttrPtr	xmlGetID		(xmlDocPtr doc, 
    const xmlChar * ID)

    Search the attribute declaring the given ID

    doc:pointer to the document
    ID:the ID value
    Returns:NULL if not found, otherwise the xmlAttrPtr defining the ID

    Function: xmlGetRefs

    xmlListPtr	xmlGetRefs		(xmlDocPtr doc, 
    const xmlChar * ID)

    Find the set of references for the supplied ID.

    doc:pointer to the document
    ID:the ID value
    Returns:NULL if not found, otherwise node set for the ID.

    Function: xmlIsID

    int	xmlIsID			(xmlDocPtr doc, 
    xmlNodePtr elem,
    xmlAttrPtr attr)

    Determine whether an attribute is of type ID. In case we have DTD(s) then this is done if DTD loading has been requested. In the case of HTML documents parsed with the HTML parser, then ID detection is done systematically.

    doc:the document
    elem:the element carrying the attribute
    attr:the attribute
    Returns:0 or 1 depending on the lookup result

    Function: xmlIsMixedElement

    int	xmlIsMixedElement		(xmlDocPtr doc, 
    const xmlChar * name)

    Search in the DtDs whether an element accept Mixed content (or ANY) basically if it is supposed to accept text childs

    doc:the document
    name:the element name
    Returns:0 if no, 1 if yes, and -1 if no element description is available

    Function: xmlIsRef

    int	xmlIsRef			(xmlDocPtr doc, 
    xmlNodePtr elem,
    xmlAttrPtr attr)

    Determine whether an attribute is of type Ref. In case we have DTD(s) then this is simple, otherwise we use an heuristic: name Ref (upper or lowercase).

    doc:the document
    elem:the element carrying the attribute
    attr:the attribute
    Returns:0 or 1 depending on the lookup result

    Function: xmlNewDocElementContent

    xmlElementContentPtr	xmlNewDocElementContent	(xmlDocPtr doc, 
    const xmlChar * name,
    xmlElementContentType type)

    Allocate an element content structure for the document.

    doc:the document
    name:the subelement name or NULL
    type:the type of element content decl
    Returns:NULL if not, otherwise the new element content structure

    Function: xmlNewElementContent

    xmlElementContentPtr	xmlNewElementContent	(const xmlChar * name, 
    xmlElementContentType type)

    Allocate an element content structure. Deprecated in favor of xmlNewDocElementContent

    name:the subelement name or NULL
    type:the type of element content decl
    Returns:NULL if not, otherwise the new element content structure

    Function: xmlNewValidCtxt

    xmlValidCtxtPtr	xmlNewValidCtxt		(void)

    Allocate a validation context structure.

    Returns:NULL if not, otherwise the new validation context structure

    Function: xmlRemoveID

    int	xmlRemoveID			(xmlDocPtr doc, 
    xmlAttrPtr attr)

    Remove the given attribute from the ID table maintained internally.

    doc:the document
    attr:the attribute
    Returns:-1 if the lookup failed and 0 otherwise

    Function: xmlRemoveRef

    int	xmlRemoveRef			(xmlDocPtr doc, 
    xmlAttrPtr attr)

    Remove the given attribute from the Ref table maintained internally.

    doc:the document
    attr:the attribute
    Returns:-1 if the lookup failed and 0 otherwise

    Function: xmlSnprintfElementContent

    void	xmlSnprintfElementContent	(char * buf, 
    int size,
    xmlElementContentPtr content,
    int englob)

    This will dump the content of the element content definition Intended just for the debug routine

    buf:an output buffer
    size:the buffer size
    content:An element table
    englob:1 if one must print the englobing parenthesis, 0 otherwise

    Function: xmlSprintfElementContent

    void	xmlSprintfElementContent	(char * buf, 
    xmlElementContentPtr content,
    int englob)

    Deprecated, unsafe, use xmlSnprintfElementContent

    buf:an output buffer
    content:An element table
    englob:1 if one must print the englobing parenthesis, 0 otherwise

    Function: xmlValidBuildContentModel

    int	xmlValidBuildContentModel	(xmlValidCtxtPtr ctxt, 
    xmlElementPtr elem)

    (Re)Build the automata associated to the content model of this element

    ctxt:a validation context
    elem:an element declaration node
    Returns:1 in case of success, 0 in case of error

    Function: xmlValidCtxtNormalizeAttributeValue

    xmlChar *	xmlValidCtxtNormalizeAttributeValue	(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * name,
    const xmlChar * value)

    Does the validation related extra step of the normalization of attribute values: If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by single space (#x20) character. Also check VC: Standalone Document Declaration in P32, and update ctxt->valid accordingly

    ctxt:the validation context or NULL
    doc:the document
    elem:the parent
    name:the attribute name
    value:the attribute value
    Returns:a new normalized string if normalization is needed, NULL otherwise the caller must free the returned value.

    Function: xmlValidGetPotentialChildren

    int	xmlValidGetPotentialChildren	(xmlElementContent * ctree, 
    const xmlChar ** names,
    int * len,
    int max)

    Build/extend a list of potential children allowed by the content tree

    ctree:an element content tree
    names:an array to store the list of child names
    len:a pointer to the number of element in the list
    max:the size of the array
    Returns:the number of element in the list, or -1 in case of error.

    Function: xmlValidGetValidElements

    int	xmlValidGetValidElements	(xmlNode * prev, 
    xmlNode * next,
    const xmlChar ** names,
    int max)

    This function returns the list of authorized children to insert within an existing tree while respecting the validity constraints forced by the Dtd. The insertion point is defined using @prev and @next in the following ways: to insert before 'node': xmlValidGetValidElements(node->prev, node, ... to insert next 'node': xmlValidGetValidElements(node, node->next, ... to replace 'node': xmlValidGetValidElements(node->prev, node->next, ... to prepend a child to 'node': xmlValidGetValidElements(NULL, node->childs, to append a child to 'node': xmlValidGetValidElements(node->last, NULL, ... pointers to the element names are inserted at the beginning of the array and do not need to be freed.

    prev:an element to insert after
    next:an element to insert next
    names:an array to store the list of child names
    max:the size of the array
    Returns:the number of element in the list, or -1 in case of error. If the function returns the value @max the caller is invited to grow the receiving array and retry.

    Function: xmlValidNormalizeAttributeValue

    xmlChar *	xmlValidNormalizeAttributeValue	(xmlDocPtr doc, 
    xmlNodePtr elem,
    const xmlChar * name,
    const xmlChar * value)

    Does the validation related extra step of the normalization of attribute values: If the declared value is not CDATA, then the XML processor must further process the normalized attribute value by discarding any leading and trailing space (#x20) characters, and by replacing sequences of space (#x20) characters by single space (#x20) character.

    doc:the document
    elem:the parent
    name:the attribute name
    value:the attribute value
    Returns:a new normalized string if normalization is needed, NULL otherwise the caller must free the returned value.

    Function: xmlValidateAttributeDecl

    int	xmlValidateAttributeDecl	(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlAttributePtr attr)

    Try to validate a single attribute definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Default Legal ] - [ VC: Enumeration ] - [ VC: ID Attribute Default ] The ID/IDREF uniqueness and matching are done separately

    ctxt:the validation context
    doc:a document instance
    attr:an attribute definition
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateAttributeValue

    int	xmlValidateAttributeValue	(xmlAttributeType type, 
    const xmlChar * value)

    Validate that the given attribute value match the proper production [ VC: ID ] Values of type ID must match the Name production.... [ VC: IDREF ] Values of type IDREF must match the Name production, and values of type IDREFS must match Names ... [ VC: Entity Name ] Values of type ENTITY must match the Name production, values of type ENTITIES must match Names ... [ VC: Name Token ] Values of type NMTOKEN must match the Nmtoken production; values of type NMTOKENS must match Nmtokens.

    type:an attribute type
    value:an attribute value
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateDocument

    int	xmlValidateDocument		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)

    Try to validate the document instance basically it does the all the checks described by the XML Rec i.e. validates the internal and external subset (if present) and validate the document tree.

    ctxt:the validation context
    doc:a document instance
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateDocumentFinal

    int	xmlValidateDocumentFinal	(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)

    Does the final step for the document validation once all the incremental validation steps have been completed basically it does the following checks described by the XML Rec Check all the IDREF/IDREFS attributes definition for validity

    ctxt:the validation context
    doc:a document instance
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateDtd

    int	xmlValidateDtd			(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlDtdPtr dtd)

    Try to validate the document against the dtd instance Basically it does check all the definitions in the DtD. Note the the internal subset (if present) is de-coupled (i.e. not used), which could give problems if ID or IDREF is present.

    ctxt:the validation context
    doc:a document instance
    dtd:a dtd instance
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateDtdFinal

    int	xmlValidateDtdFinal		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)

    Does the final step for the dtds validation once all the subsets have been parsed basically it does the following checks described by the XML Rec - check that ENTITY and ENTITIES type attributes default or possible values matches one of the defined entities. - check that NOTATION type attributes default or possible values matches one of the defined notations.

    ctxt:the validation context
    doc:a document instance
    Returns:1 if valid or 0 if invalid and -1 if not well-formed

    Function: xmlValidateElement

    int	xmlValidateElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)

    Try to validate the subtree under an element

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateElementDecl

    int	xmlValidateElementDecl		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlElementPtr elem)

    Try to validate a single element definition basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: One ID per Element Type ] - [ VC: No Duplicate Types ] - [ VC: Unique Element Type Declaration ]

    ctxt:the validation context
    doc:a document instance
    elem:an element definition
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateNameValue

    int	xmlValidateNameValue		(const xmlChar * value)

    Validate that the given value match Name production

    value:an Name value
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateNamesValue

    int	xmlValidateNamesValue		(const xmlChar * value)

    Validate that the given value match Names production

    value:an Names value
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateNmtokenValue

    int	xmlValidateNmtokenValue		(const xmlChar * value)

    Validate that the given value match Nmtoken production [ VC: Name Token ]

    value:an Nmtoken value
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateNmtokensValue

    int	xmlValidateNmtokensValue	(const xmlChar * value)

    Validate that the given value match Nmtokens production [ VC: Name Token ]

    value:an Nmtokens value
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateNotationDecl

    int	xmlValidateNotationDecl		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNotationPtr nota)

    Try to validate a single notation definition basically it does the following checks as described by the XML-1.0 recommendation: - it seems that no validity constraint exists on notation declarations But this function get called anyway ...

    ctxt:the validation context
    doc:a document instance
    nota:a notation definition
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateNotationUse

    int	xmlValidateNotationUse		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    const xmlChar * notationName)

    Validate that the given name match a notation declaration. - [ VC: Notation Declared ]

    ctxt:the validation context
    doc:the document
    notationName:the notation name to check
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateOneAttribute

    int	xmlValidateOneAttribute		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    xmlAttrPtr attr,
    const xmlChar * value)

    Try to validate a single attribute for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    attr:an attribute instance
    value:the attribute value (without entities processing)
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateOneElement

    int	xmlValidateOneElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem)

    Try to validate a single element and it's attributes, basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Element Valid ] - [ VC: Required Attribute ] Then call xmlValidateOneAttribute() for each attribute present. The ID/IDREF checkings are done separately

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    Returns:1 if valid or 0 otherwise

    Function: xmlValidateOneNamespace

    int	xmlValidateOneNamespace		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * prefix,
    xmlNsPtr ns,
    const xmlChar * value)

    Try to validate a single namespace declaration for an element basically it does the following checks as described by the XML-1.0 recommendation: - [ VC: Attribute Value Type ] - [ VC: Fixed Attribute Default ] - [ VC: Entity Name ] - [ VC: Name Token ] - [ VC: ID ] - [ VC: IDREF ] - [ VC: Entity Name ] - [ VC: Notation Attributes ] The ID/IDREF uniqueness and matching are done separately

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    prefix:the namespace prefix
    ns:an namespace declaration instance
    value:the attribute value (without entities processing)
    Returns:1 if valid or 0 otherwise

    Function: xmlValidatePopElement

    int	xmlValidatePopElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * qname)

    Pop the element end from the validation stack.

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    qname:the qualified name as appearing in the serialization
    Returns:1 if no validation problem was found or 0 otherwise

    Function: xmlValidatePushCData

    int	xmlValidatePushCData		(xmlValidCtxtPtr ctxt, 
    const xmlChar * data,
    int len)

    check the CData parsed for validation in the current stack

    ctxt:the validation context
    data:some character data read
    len:the length of the data
    Returns:1 if no validation problem was found or 0 otherwise

    Function: xmlValidatePushElement

    int	xmlValidatePushElement		(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc,
    xmlNodePtr elem,
    const xmlChar * qname)

    Push a new element start on the validation stack.

    ctxt:the validation context
    doc:a document instance
    elem:an element instance
    qname:the qualified name as appearing in the serialization
    Returns:1 if no validation problem was found or 0 otherwise

    Function: xmlValidateRoot

    int	xmlValidateRoot			(xmlValidCtxtPtr ctxt, 
    xmlDocPtr doc)

    Try to validate a the root element basically it does the following check as described by the XML-1.0 recommendation: - [ VC: Root Element Type ] it doesn't try to recurse or apply other check to the element

    ctxt:the validation context
    doc:a document instance
    Returns:1 if valid or 0 otherwise

    Function type: xmlValidityErrorFunc

    Function type: xmlValidityErrorFunc
    void	xmlValidityErrorFunc		(void * ctx, 
    const char * msg,
    ... ...)

    Callback called when a validity error is found. This is a message oriented function similar to an *printf function.

    ctx:usually an xmlValidCtxtPtr to a validity error context, but comes from ctxt->userData (which normally contains such a pointer); ctxt->userData can be changed by the user.
    msg:the string to format *printf like vararg
    ...:remaining arguments to the format

    Function type: xmlValidityWarningFunc

    Function type: xmlValidityWarningFunc
    void	xmlValidityWarningFunc		(void * ctx, 
    const char * msg,
    ... ...)

    Callback called when a validity warning is found. This is a message oriented function similar to an *printf function.

    ctx:usually an xmlValidCtxtPtr to a validity error context, but comes from ctxt->userData (which normally contains such a pointer); ctxt->userData can be changed by the user.
    msg:the string to format *printf like vararg
    ...:remaining arguments to the format

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/up.png0000644000175000017500000000062611234335462015426 0ustar aronaron‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2.œE€Ù#IDATxœí“=JÄ@F¿o‰] !+¤œ2…Å[ZÌ<@/á<€¥…XÛ Ú­20v±³ˆÂ…Ïj0»lþvV°ðA`˜ ïÍ ð—t*iùâHÒ­~xR~'IUUÉ9ç#OÁ‘my–eJÓTeY†GvÉ@x¤O#ß;2E>9²|t$DÞ9nnBäíÈjµò‘BRIsIªë:HîŸ8ŽU…œùëùPÖÚN™1fc­sNÎ95Mã§–ɵ¤ ׿ŸØŒ1~¸pEòe$ïIž°€Ç î7nrDòf!;Ã`¨çÝ'äykíÎI’øáû䲤sI_]ÿÇy—‡‘€ÅÀ^^I>O>Á¡ø­§²š?YBIEND®B`‚libxml2-2.9.1+dfsg1/doc/html/libxml-nanoftp.html0000644000175000017500000006471512134171042020115 0ustar aronaron Module nanoftp from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module nanoftp from libxml2

    API Menu
    API Indexes
    Related links

    minimal FTP implementation allowing to fetch resources like external subset.

    Table of Contents

    #define INVALID_SOCKET
    #define SOCKET
    Function type: ftpDataCallback
    void	ftpDataCallback			(void * userData, 
    const char * data,
    int len)
    Function type: ftpListCallback
    void	ftpListCallback			(void * userData, 
    const char * filename,
    const char * attrib,
    const char * owner,
    const char * group,
    unsigned long size,
    int links,
    int year,
    const char * month,
    int day,
    int hour,
    int minute)
    int	xmlNanoFTPCheckResponse		(void * ctx)
    void	xmlNanoFTPCleanup		(void)
    int	xmlNanoFTPClose			(void * ctx)
    int	xmlNanoFTPCloseConnection	(void * ctx)
    int	xmlNanoFTPConnect		(void * ctx)
    void *	xmlNanoFTPConnectTo		(const char * server, 
    int port)
    int	xmlNanoFTPCwd			(void * ctx, 
    const char * directory)
    int	xmlNanoFTPDele			(void * ctx, 
    const char * file)
    void	xmlNanoFTPFreeCtxt		(void * ctx)
    int	xmlNanoFTPGet			(void * ctx, 
    ftpDataCallback callback,
    void * userData,
    const char * filename)
    SOCKET	xmlNanoFTPGetConnection		(void * ctx)
    int	xmlNanoFTPGetResponse		(void * ctx)
    SOCKET	xmlNanoFTPGetSocket		(void * ctx, 
    const char * filename)
    void	xmlNanoFTPInit			(void)
    int	xmlNanoFTPList			(void * ctx, 
    ftpListCallback callback,
    void * userData,
    const char * filename)
    void *	xmlNanoFTPNewCtxt		(const char * URL)
    void *	xmlNanoFTPOpen			(const char * URL)
    void	xmlNanoFTPProxy			(const char * host, 
    int port,
    const char * user,
    const char * passwd,
    int type)
    int	xmlNanoFTPQuit			(void * ctx)
    int	xmlNanoFTPRead			(void * ctx, 
    void * dest,
    int len)
    void	xmlNanoFTPScanProxy		(const char * URL)
    int	xmlNanoFTPUpdateURL		(void * ctx, 
    const char * URL)

    Description

    Macro: INVALID_SOCKET

    #define INVALID_SOCKET

    macro used to provide portability of code to windows sockets the value to be used when the socket is not valid

    Macro: SOCKET

    #define SOCKET

    macro used to provide portability of code to windows sockets

    Function type: ftpDataCallback

    Function type: ftpDataCallback
    void	ftpDataCallback			(void * userData, 
    const char * data,
    int len)

    A callback for the xmlNanoFTPGet command.

    userData:the user provided context
    data:the data received
    len:its size in bytes

    Function type: ftpListCallback

    Function type: ftpListCallback
    void	ftpListCallback			(void * userData, 
    const char * filename,
    const char * attrib,
    const char * owner,
    const char * group,
    unsigned long size,
    int links,
    int year,
    const char * month,
    int day,
    int hour,
    int minute)

    A callback for the xmlNanoFTPList command. Note that only one of year and day:minute are specified.

    userData:user provided data for the callback
    filename:the file name (including "->" when links are shown)
    attrib:the attribute string
    owner:the owner string
    group:the group string
    size:the file size
    links:the link count
    year:the year
    month:the month
    day:the day
    hour:the hour
    minute:the minute

    Function: xmlNanoFTPCheckResponse

    int	xmlNanoFTPCheckResponse		(void * ctx)

    Check if there is a response from the FTP server after a command.

    ctx:an FTP context
    Returns:the code number, or 0

    Function: xmlNanoFTPCleanup

    void	xmlNanoFTPCleanup		(void)

    Cleanup the FTP protocol layer. This cleanup proxy informations.

    Function: xmlNanoFTPClose

    int	xmlNanoFTPClose			(void * ctx)

    Close the connection and both control and transport

    ctx:an FTP context
    Returns:-1 incase of error, 0 otherwise

    Function: xmlNanoFTPCloseConnection

    int	xmlNanoFTPCloseConnection	(void * ctx)

    Close the data connection from the server

    ctx:an FTP context
    Returns:-1 incase of error, 0 otherwise

    Function: xmlNanoFTPConnect

    int	xmlNanoFTPConnect		(void * ctx)

    Tries to open a control connection

    ctx:an FTP context
    Returns:-1 in case of error, 0 otherwise

    Function: xmlNanoFTPConnectTo

    void *	xmlNanoFTPConnectTo		(const char * server, 
    int port)

    Tries to open a control connection to the given server/port

    server:an FTP server name
    port:the port (use 21 if 0)
    Returns:an fTP context or NULL if it failed

    Function: xmlNanoFTPCwd

    int	xmlNanoFTPCwd			(void * ctx, 
    const char * directory)

    Tries to change the remote directory

    ctx:an FTP context
    directory:a directory on the server
    Returns:-1 incase of error, 1 if CWD worked, 0 if it failed

    Function: xmlNanoFTPDele

    int	xmlNanoFTPDele			(void * ctx, 
    const char * file)

    Tries to delete an item (file or directory) from server

    ctx:an FTP context
    file:a file or directory on the server
    Returns:-1 incase of error, 1 if DELE worked, 0 if it failed

    Function: xmlNanoFTPFreeCtxt

    void	xmlNanoFTPFreeCtxt		(void * ctx)

    Frees the context after closing the connection.

    ctx:an FTP context

    Function: xmlNanoFTPGet

    int	xmlNanoFTPGet			(void * ctx, 
    ftpDataCallback callback,
    void * userData,
    const char * filename)

    Fetch the given file from the server. All data are passed back in the callbacks. The last callback has a size of 0 block.

    ctx:an FTP context
    callback:the user callback
    userData:the user callback data
    filename:the file to retrieve
    Returns:-1 incase of error, 0 otherwise

    Function: xmlNanoFTPGetConnection

    SOCKET	xmlNanoFTPGetConnection		(void * ctx)

    Try to open a data connection to the server. Currently only passive mode is supported.

    ctx:an FTP context
    Returns:-1 incase of error, 0 otherwise

    Function: xmlNanoFTPGetResponse

    int	xmlNanoFTPGetResponse		(void * ctx)

    Get the response from the FTP server after a command.

    ctx:an FTP context
    Returns:the code number

    Function: xmlNanoFTPGetSocket

    SOCKET	xmlNanoFTPGetSocket		(void * ctx, 
    const char * filename)

    Initiate fetch of the given file from the server.

    ctx:an FTP context
    filename:the file to retrieve (or NULL if path is in context).
    Returns:the socket for the data connection, or <0 in case of error

    Function: xmlNanoFTPInit

    void	xmlNanoFTPInit			(void)

    Initialize the FTP protocol layer. Currently it just checks for proxy informations, and get the hostname

    Function: xmlNanoFTPList

    int	xmlNanoFTPList			(void * ctx, 
    ftpListCallback callback,
    void * userData,
    const char * filename)

    Do a listing on the server. All files info are passed back in the callbacks.

    ctx:an FTP context
    callback:the user callback
    userData:the user callback data
    filename:optional files to list
    Returns:-1 incase of error, 0 otherwise

    Function: xmlNanoFTPNewCtxt

    void *	xmlNanoFTPNewCtxt		(const char * URL)

    Allocate and initialize a new FTP context.

    URL:The URL used to initialize the context
    Returns:an FTP context or NULL in case of error.

    Function: xmlNanoFTPOpen

    void *	xmlNanoFTPOpen			(const char * URL)

    Start to fetch the given ftp:// resource

    URL:the URL to the resource
    Returns:an FTP context, or NULL

    Function: xmlNanoFTPProxy

    void	xmlNanoFTPProxy			(const char * host, 
    int port,
    const char * user,
    const char * passwd,
    int type)

    Setup the FTP proxy informations. This can also be done by using ftp_proxy ftp_proxy_user and ftp_proxy_password environment variables.

    host:the proxy host name
    port:the proxy port
    user:the proxy user name
    passwd:the proxy password
    type:the type of proxy 1 for using SITE, 2 for USER a@b

    Function: xmlNanoFTPQuit

    int	xmlNanoFTPQuit			(void * ctx)

    Send a QUIT command to the server

    ctx:an FTP context
    Returns:-1 in case of error, 0 otherwise

    Function: xmlNanoFTPRead

    int	xmlNanoFTPRead			(void * ctx, 
    void * dest,
    int len)

    This function tries to read @len bytes from the existing FTP connection and saves them in @dest. This is a blocking call.

    ctx:the FTP context
    dest:a buffer
    len:the buffer length
    Returns:the number of byte read. 0 is an indication of an end of connection. -1 indicates a parameter error.

    Function: xmlNanoFTPScanProxy

    void	xmlNanoFTPScanProxy		(const char * URL)

    (Re)Initialize the FTP Proxy context by parsing the URL and finding the protocol host port it indicates. Should be like ftp://myproxy/ or ftp://myproxy:3128/ A NULL URL cleans up proxy informations.

    URL:The proxy URL used to initialize the proxy context

    Function: xmlNanoFTPUpdateURL

    int	xmlNanoFTPUpdateURL		(void * ctx, 
    const char * URL)

    Update an FTP context by parsing the URL and finding new path it indicates. If there is an error in the protocol, hostname, port or other information, the error is raised. It indicates a new connection has to be established.

    ctx:an FTP context
    URL:The URL used to update the context
    Returns:0 if Ok, -1 in case of error (other host).

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-schemasInternals.html0000644000175000017500000017507012134171042021750 0ustar aronaron Module schemasInternals from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module schemasInternals from libxml2

    API Menu
    API Indexes
    Related links

    internal interfaces for the XML Schemas handling and schema validity checking The Schemas development is a Work In Progress. Some of those interfaces are not garanteed to be API or ABI stable !

    Table of Contents

    #define XML_SCHEMAS_ANYATTR_LAX
    #define XML_SCHEMAS_ANYATTR_SKIP
    #define XML_SCHEMAS_ANYATTR_STRICT
    #define XML_SCHEMAS_ANY_LAX
    #define XML_SCHEMAS_ANY_SKIP
    #define XML_SCHEMAS_ANY_STRICT
    #define XML_SCHEMAS_ATTRGROUP_GLOBAL
    #define XML_SCHEMAS_ATTRGROUP_HAS_REFS
    #define XML_SCHEMAS_ATTRGROUP_MARKED
    #define XML_SCHEMAS_ATTRGROUP_REDEFINED
    #define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED
    #define XML_SCHEMAS_ATTR_FIXED
    #define XML_SCHEMAS_ATTR_GLOBAL
    #define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED
    #define XML_SCHEMAS_ATTR_NSDEFAULT
    #define XML_SCHEMAS_ATTR_USE_OPTIONAL
    #define XML_SCHEMAS_ATTR_USE_PROHIBITED
    #define XML_SCHEMAS_ATTR_USE_REQUIRED
    #define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION
    #define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION
    #define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION
    #define XML_SCHEMAS_ELEM_ABSTRACT
    #define XML_SCHEMAS_ELEM_BLOCK_ABSENT
    #define XML_SCHEMAS_ELEM_BLOCK_EXTENSION
    #define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION
    #define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION
    #define XML_SCHEMAS_ELEM_CIRCULAR
    #define XML_SCHEMAS_ELEM_DEFAULT
    #define XML_SCHEMAS_ELEM_FINAL_ABSENT
    #define XML_SCHEMAS_ELEM_FINAL_EXTENSION
    #define XML_SCHEMAS_ELEM_FINAL_RESTRICTION
    #define XML_SCHEMAS_ELEM_FIXED
    #define XML_SCHEMAS_ELEM_GLOBAL
    #define XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    #define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED
    #define XML_SCHEMAS_ELEM_NILLABLE
    #define XML_SCHEMAS_ELEM_NSDEFAULT
    #define XML_SCHEMAS_ELEM_REF
    #define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD
    #define XML_SCHEMAS_ELEM_TOPLEVEL
    #define XML_SCHEMAS_FACET_COLLAPSE
    #define XML_SCHEMAS_FACET_PRESERVE
    #define XML_SCHEMAS_FACET_REPLACE
    #define XML_SCHEMAS_FACET_UNKNOWN
    #define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION
    #define XML_SCHEMAS_FINAL_DEFAULT_LIST
    #define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION
    #define XML_SCHEMAS_FINAL_DEFAULT_UNION
    #define XML_SCHEMAS_INCLUDING_CONVERT_NS
    #define XML_SCHEMAS_QUALIF_ATTR
    #define XML_SCHEMAS_QUALIF_ELEM
    #define XML_SCHEMAS_TYPE_ABSTRACT
    #define XML_SCHEMAS_TYPE_BLOCK_DEFAULT
    #define XML_SCHEMAS_TYPE_BLOCK_EXTENSION
    #define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION
    #define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE
    #define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
    #define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
    #define XML_SCHEMAS_TYPE_FACETSNEEDVALUE
    #define XML_SCHEMAS_TYPE_FINAL_DEFAULT
    #define XML_SCHEMAS_TYPE_FINAL_EXTENSION
    #define XML_SCHEMAS_TYPE_FINAL_LIST
    #define XML_SCHEMAS_TYPE_FINAL_RESTRICTION
    #define XML_SCHEMAS_TYPE_FINAL_UNION
    #define XML_SCHEMAS_TYPE_FIXUP_1
    #define XML_SCHEMAS_TYPE_GLOBAL
    #define XML_SCHEMAS_TYPE_HAS_FACETS
    #define XML_SCHEMAS_TYPE_INTERNAL_INVALID
    #define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED
    #define XML_SCHEMAS_TYPE_MARKED
    #define XML_SCHEMAS_TYPE_MIXED
    #define XML_SCHEMAS_TYPE_NORMVALUENEEDED
    #define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD
    #define XML_SCHEMAS_TYPE_REDEFINED
    #define XML_SCHEMAS_TYPE_VARIETY_ABSENT
    #define XML_SCHEMAS_TYPE_VARIETY_ATOMIC
    #define XML_SCHEMAS_TYPE_VARIETY_LIST
    #define XML_SCHEMAS_TYPE_VARIETY_UNION
    #define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE
    #define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE
    #define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE
    #define XML_SCHEMAS_WILDCARD_COMPLETE
    Structure xmlSchemaAnnot
    struct _xmlSchemaAnnot
    Typedef xmlSchemaAnnot * xmlSchemaAnnotPtr
    
    Structure xmlSchemaAttribute
    struct _xmlSchemaAttribute
    Structure xmlSchemaAttributeGroup
    struct _xmlSchemaAttributeGroup
    Typedef xmlSchemaAttributeGroup * xmlSchemaAttributeGroupPtr
    
    Structure xmlSchemaAttributeLink
    struct _xmlSchemaAttributeLink
    Typedef xmlSchemaAttributeLink * xmlSchemaAttributeLinkPtr
    
    Typedef xmlSchemaAttribute * xmlSchemaAttributePtr
    
    Enum xmlSchemaContentType
    
    Structure xmlSchemaElement
    struct _xmlSchemaElement
    Typedef xmlSchemaElement * xmlSchemaElementPtr
    
    Structure xmlSchemaFacet
    struct _xmlSchemaFacet
    Structure xmlSchemaFacetLink
    struct _xmlSchemaFacetLink
    Typedef xmlSchemaFacetLink * xmlSchemaFacetLinkPtr
    
    Typedef xmlSchemaFacet * xmlSchemaFacetPtr
    
    Structure xmlSchemaNotation
    struct _xmlSchemaNotation
    Typedef xmlSchemaNotation * xmlSchemaNotationPtr
    
    Structure xmlSchemaType
    struct _xmlSchemaType
    Structure xmlSchemaTypeLink
    struct _xmlSchemaTypeLink
    Typedef xmlSchemaTypeLink * xmlSchemaTypeLinkPtr
    
    Typedef xmlSchemaType * xmlSchemaTypePtr
    
    Enum xmlSchemaTypeType
    
    Structure xmlSchemaVal
    struct _xmlSchemaVal The content of this structure is not made public by the API.
    Typedef xmlSchemaVal * xmlSchemaValPtr
    
    Enum xmlSchemaValType
    
    Structure xmlSchemaWildcard
    struct _xmlSchemaWildcard
    Structure xmlSchemaWildcardNs
    struct _xmlSchemaWildcardNs
    Typedef xmlSchemaWildcardNs * xmlSchemaWildcardNsPtr
    
    Typedef xmlSchemaWildcard * xmlSchemaWildcardPtr
    
    void	xmlSchemaFreeType		(xmlSchemaTypePtr type)
    void	xmlSchemaFreeWildcard		(xmlSchemaWildcardPtr wildcard)

    Description

    Macro: XML_SCHEMAS_ANYATTR_LAX

    #define XML_SCHEMAS_ANYATTR_LAX

    Ignore validation non definition on attributes Obsolete, not used anymore.

    Macro: XML_SCHEMAS_ANYATTR_SKIP

    #define XML_SCHEMAS_ANYATTR_SKIP

    Skip unknown attribute from validation Obsolete, not used anymore.

    Macro: XML_SCHEMAS_ANYATTR_STRICT

    #define XML_SCHEMAS_ANYATTR_STRICT

    Apply strict validation rules on attributes Obsolete, not used anymore.

    Macro: XML_SCHEMAS_ANY_LAX

    #define XML_SCHEMAS_ANY_LAX

    Used by wildcards. Validate if type found, don't worry if not found

    Macro: XML_SCHEMAS_ANY_SKIP

    #define XML_SCHEMAS_ANY_SKIP

    Skip unknown attribute from validation

    Macro: XML_SCHEMAS_ANY_STRICT

    #define XML_SCHEMAS_ANY_STRICT

    Used by wildcards. Apply strict validation rules

    Macro: XML_SCHEMAS_ATTRGROUP_GLOBAL

    #define XML_SCHEMAS_ATTRGROUP_GLOBAL

    The attribute wildcard has been already builded.

    Macro: XML_SCHEMAS_ATTRGROUP_HAS_REFS

    #define XML_SCHEMAS_ATTRGROUP_HAS_REFS

    Whether this attr. group contains attr. group references.

    Macro: XML_SCHEMAS_ATTRGROUP_MARKED

    #define XML_SCHEMAS_ATTRGROUP_MARKED

    Marks the attr group as marked; used for circular checks.

    Macro: XML_SCHEMAS_ATTRGROUP_REDEFINED

    #define XML_SCHEMAS_ATTRGROUP_REDEFINED

    The attr group was redefined.

    Macro: XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED

    #define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED

    The attribute wildcard has been already builded.

    Macro: XML_SCHEMAS_ATTR_FIXED

    #define XML_SCHEMAS_ATTR_FIXED

    the attribute has a fixed value

    Macro: XML_SCHEMAS_ATTR_GLOBAL

    #define XML_SCHEMAS_ATTR_GLOBAL

    allow elements in no namespace

    Macro: XML_SCHEMAS_ATTR_INTERNAL_RESOLVED

    #define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED

    this is set when the "type" and "ref" references have been resolved.

    Macro: XML_SCHEMAS_ATTR_NSDEFAULT

    #define XML_SCHEMAS_ATTR_NSDEFAULT

    allow elements in no namespace

    Macro: XML_SCHEMAS_ATTR_USE_OPTIONAL

    #define XML_SCHEMAS_ATTR_USE_OPTIONAL

    The attribute is optional.

    Macro: XML_SCHEMAS_ATTR_USE_PROHIBITED

    #define XML_SCHEMAS_ATTR_USE_PROHIBITED

    Used by wildcards. The attribute is prohibited.

    Macro: XML_SCHEMAS_ATTR_USE_REQUIRED

    #define XML_SCHEMAS_ATTR_USE_REQUIRED

    The attribute is required.

    Macro: XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION

    #define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION

    the schema has "extension" in the set of blockDefault.

    Macro: XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION

    #define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION

    the schema has "restriction" in the set of blockDefault.

    Macro: XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION

    #define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION

    the schema has "substitution" in the set of blockDefault.

    Macro: XML_SCHEMAS_ELEM_ABSTRACT

    #define XML_SCHEMAS_ELEM_ABSTRACT

    the element is abstract

    Macro: XML_SCHEMAS_ELEM_BLOCK_ABSENT

    #define XML_SCHEMAS_ELEM_BLOCK_ABSENT

    the "block" attribute is absent

    Macro: XML_SCHEMAS_ELEM_BLOCK_EXTENSION

    #define XML_SCHEMAS_ELEM_BLOCK_EXTENSION

    disallowed substitutions are absent

    Macro: XML_SCHEMAS_ELEM_BLOCK_RESTRICTION

    #define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION

    disallowed substitutions: "restriction"

    Macro: XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION

    #define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION

    disallowed substitutions: "substituion"

    Macro: XML_SCHEMAS_ELEM_CIRCULAR

    #define XML_SCHEMAS_ELEM_CIRCULAR

    a helper flag for the search of circular references.

    Macro: XML_SCHEMAS_ELEM_DEFAULT

    #define XML_SCHEMAS_ELEM_DEFAULT

    the element has a default value

    Macro: XML_SCHEMAS_ELEM_FINAL_ABSENT

    #define XML_SCHEMAS_ELEM_FINAL_ABSENT

    substitution group exclusions are absent

    Macro: XML_SCHEMAS_ELEM_FINAL_EXTENSION

    #define XML_SCHEMAS_ELEM_FINAL_EXTENSION

    substitution group exclusions: "extension"

    Macro: XML_SCHEMAS_ELEM_FINAL_RESTRICTION

    #define XML_SCHEMAS_ELEM_FINAL_RESTRICTION

    substitution group exclusions: "restriction"

    Macro: XML_SCHEMAS_ELEM_FIXED

    #define XML_SCHEMAS_ELEM_FIXED

    the element has a fixed value

    Macro: XML_SCHEMAS_ELEM_GLOBAL

    #define XML_SCHEMAS_ELEM_GLOBAL

    the element is global

    Macro: XML_SCHEMAS_ELEM_INTERNAL_CHECKED

    #define XML_SCHEMAS_ELEM_INTERNAL_CHECKED

    this is set when the elem decl has been checked against all constraints

    Macro: XML_SCHEMAS_ELEM_INTERNAL_RESOLVED

    #define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED

    this is set when "type", "ref", "substitutionGroup" references have been resolved.

    Macro: XML_SCHEMAS_ELEM_NILLABLE

    #define XML_SCHEMAS_ELEM_NILLABLE

    the element is nillable

    Macro: XML_SCHEMAS_ELEM_NSDEFAULT

    #define XML_SCHEMAS_ELEM_NSDEFAULT

    allow elements in no namespace Obsolete, not used anymore.

    Macro: XML_SCHEMAS_ELEM_REF

    #define XML_SCHEMAS_ELEM_REF

    the element is a reference to a type

    Macro: XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD

    #define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD

    the declaration is a substitution group head

    Macro: XML_SCHEMAS_ELEM_TOPLEVEL

    #define XML_SCHEMAS_ELEM_TOPLEVEL

    the element is top level obsolete: use XML_SCHEMAS_ELEM_GLOBAL instead

    Macro: XML_SCHEMAS_FACET_COLLAPSE

    #define XML_SCHEMAS_FACET_COLLAPSE

    collapse the types of the facet

    Macro: XML_SCHEMAS_FACET_PRESERVE

    #define XML_SCHEMAS_FACET_PRESERVE

    preserve the type of the facet

    Macro: XML_SCHEMAS_FACET_REPLACE

    #define XML_SCHEMAS_FACET_REPLACE

    replace the type of the facet

    Macro: XML_SCHEMAS_FACET_UNKNOWN

    #define XML_SCHEMAS_FACET_UNKNOWN

    unknown facet handling

    Macro: XML_SCHEMAS_FINAL_DEFAULT_EXTENSION

    #define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION

    the schema has "extension" in the set of finalDefault.

    Macro: XML_SCHEMAS_FINAL_DEFAULT_LIST

    #define XML_SCHEMAS_FINAL_DEFAULT_LIST

    the cshema has "list" in the set of finalDefault.

    Macro: XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION

    #define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION

    the schema has "restriction" in the set of finalDefault.

    Macro: XML_SCHEMAS_FINAL_DEFAULT_UNION

    #define XML_SCHEMAS_FINAL_DEFAULT_UNION

    the schema has "union" in the set of finalDefault.

    Macro: XML_SCHEMAS_INCLUDING_CONVERT_NS

    #define XML_SCHEMAS_INCLUDING_CONVERT_NS

    the schema is currently including an other schema with no target namespace.

    Macro: XML_SCHEMAS_QUALIF_ATTR

    #define XML_SCHEMAS_QUALIF_ATTR

    Reflects attributeFormDefault == qualified in an XML schema document.

    Macro: XML_SCHEMAS_QUALIF_ELEM

    #define XML_SCHEMAS_QUALIF_ELEM

    Reflects elementFormDefault == qualified in an XML schema document.

    Macro: XML_SCHEMAS_TYPE_ABSTRACT

    #define XML_SCHEMAS_TYPE_ABSTRACT

    the simple/complexType is abstract.

    Macro: XML_SCHEMAS_TYPE_BLOCK_DEFAULT

    #define XML_SCHEMAS_TYPE_BLOCK_DEFAULT

    the complexType did not specify 'block' so use the default of the <schema> item.

    Macro: XML_SCHEMAS_TYPE_BLOCK_EXTENSION

    #define XML_SCHEMAS_TYPE_BLOCK_EXTENSION

    the complexType has a 'block' of "extension".

    Macro: XML_SCHEMAS_TYPE_BLOCK_RESTRICTION

    #define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION

    the complexType has a 'block' of "restriction".

    Macro: XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE

    #define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE

    Marks the item as a builtin primitive.

    Macro: XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION

    #define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION

    the simple or complex type has a derivation method of "extension".

    Macro: XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION

    #define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION

    the simple or complex type has a derivation method of "restriction".

    Macro: XML_SCHEMAS_TYPE_FACETSNEEDVALUE

    #define XML_SCHEMAS_TYPE_FACETSNEEDVALUE

    indicates if the facets need a computed value

    Macro: XML_SCHEMAS_TYPE_FINAL_DEFAULT

    #define XML_SCHEMAS_TYPE_FINAL_DEFAULT

    the simpleType has a final of "default".

    Macro: XML_SCHEMAS_TYPE_FINAL_EXTENSION

    #define XML_SCHEMAS_TYPE_FINAL_EXTENSION

    the complexType has a final of "extension".

    Macro: XML_SCHEMAS_TYPE_FINAL_LIST

    #define XML_SCHEMAS_TYPE_FINAL_LIST

    the simpleType has a final of "list".

    Macro: XML_SCHEMAS_TYPE_FINAL_RESTRICTION

    #define XML_SCHEMAS_TYPE_FINAL_RESTRICTION

    the simpleType/complexType has a final of "restriction".

    Macro: XML_SCHEMAS_TYPE_FINAL_UNION

    #define XML_SCHEMAS_TYPE_FINAL_UNION

    the simpleType has a final of "union".

    Macro: XML_SCHEMAS_TYPE_FIXUP_1

    #define XML_SCHEMAS_TYPE_FIXUP_1

    First stage of fixup was done.

    Macro: XML_SCHEMAS_TYPE_GLOBAL

    #define XML_SCHEMAS_TYPE_GLOBAL

    the type is global

    Macro: XML_SCHEMAS_TYPE_HAS_FACETS

    #define XML_SCHEMAS_TYPE_HAS_FACETS

    has facets

    Macro: XML_SCHEMAS_TYPE_INTERNAL_INVALID

    #define XML_SCHEMAS_TYPE_INTERNAL_INVALID

    indicates that the type is invalid

    Macro: XML_SCHEMAS_TYPE_INTERNAL_RESOLVED

    #define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED

    indicates that the type was typefixed

    Macro: XML_SCHEMAS_TYPE_MARKED

    #define XML_SCHEMAS_TYPE_MARKED

    Marks the item as marked; used for circular checks.

    Macro: XML_SCHEMAS_TYPE_MIXED

    #define XML_SCHEMAS_TYPE_MIXED

    the element content type is mixed

    Macro: XML_SCHEMAS_TYPE_NORMVALUENEEDED

    #define XML_SCHEMAS_TYPE_NORMVALUENEEDED

    indicates if the facets (pattern) need a normalized value

    Macro: XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD

    #define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD

    the complexType owns an attribute wildcard, i.e. it can be freed by the complexType

    Macro: XML_SCHEMAS_TYPE_REDEFINED

    #define XML_SCHEMAS_TYPE_REDEFINED

    The type was redefined.

    Macro: XML_SCHEMAS_TYPE_VARIETY_ABSENT

    #define XML_SCHEMAS_TYPE_VARIETY_ABSENT

    the simpleType has a variety of "absent". TODO: Actually not necessary :-/, since if none of the variety flags occur then it's automatically absent.

    Macro: XML_SCHEMAS_TYPE_VARIETY_ATOMIC

    #define XML_SCHEMAS_TYPE_VARIETY_ATOMIC

    the simpleType has a variety of "union".

    Macro: XML_SCHEMAS_TYPE_VARIETY_LIST

    #define XML_SCHEMAS_TYPE_VARIETY_LIST

    the simpleType has a variety of "list".

    Macro: XML_SCHEMAS_TYPE_VARIETY_UNION

    #define XML_SCHEMAS_TYPE_VARIETY_UNION

    the simpleType has a variety of "union".

    Macro: XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE

    #define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE

    a whitespace-facet value of "collapse"

    Macro: XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE

    #define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE

    a whitespace-facet value of "preserve"

    Macro: XML_SCHEMAS_TYPE_WHITESPACE_REPLACE

    #define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE

    a whitespace-facet value of "replace"

    Macro: XML_SCHEMAS_WILDCARD_COMPLETE

    #define XML_SCHEMAS_WILDCARD_COMPLETE

    If the wildcard is complete.

    Structure xmlSchemaAnnot

    Structure xmlSchemaAnnot
    struct _xmlSchemaAnnot { struct _xmlSchemaAnnot * next xmlNodePtr content : the annotation }

    Structure xmlSchemaAttribute

    Structure xmlSchemaAttribute
    struct _xmlSchemaAttribute { xmlSchemaTypeType type struct _xmlSchemaAttribute * next : the next attribute (not used?) const xmlChar * name : the name of the declaration const xmlChar * id : Deprecated; not used const xmlChar * ref : Deprecated; not used const xmlChar * refNs : Deprecated; not used const xmlChar * typeName : the local name of the type definition const xmlChar * typeNs : the ns URI of the type definition xmlSchemaAnnotPtr annot xmlSchemaTypePtr base : Deprecated; not used int occurs : Deprecated; not used const xmlChar * defValue : The initial value of the value constrai xmlSchemaTypePtr subtypes : the type definition xmlNodePtr node const xmlChar * targetNamespace int flags const xmlChar * refPrefix : Deprecated; not used xmlSchemaValPtr defVal : The compiled value constraint xmlSchemaAttributePtr refDecl : Deprecated; not used }

    Structure xmlSchemaAttributeGroup

    Structure xmlSchemaAttributeGroup
    struct _xmlSchemaAttributeGroup { xmlSchemaTypeType type : The kind of type struct _xmlSchemaAttribute * next : the next attribute if in a group ... const xmlChar * name const xmlChar * id const xmlChar * ref : Deprecated; not used const xmlChar * refNs : Deprecated; not used xmlSchemaAnnotPtr annot xmlSchemaAttributePtr attributes : Deprecated; not used xmlNodePtr node int flags xmlSchemaWildcardPtr attributeWildcard const xmlChar * refPrefix : Deprecated; not used xmlSchemaAttributeGroupPtr refItem : Deprecated; not used const xmlChar * targetNamespace void * attrUses }

    Structure xmlSchemaAttributeLink

    Structure xmlSchemaAttributeLink
    struct _xmlSchemaAttributeLink { struct _xmlSchemaAttributeLink * next : the next attribute link ... struct _xmlSchemaAttribute * attr : the linked attribute }

    Enum xmlSchemaContentType

    Enum xmlSchemaContentType {
        XML_SCHEMA_CONTENT_UNKNOWN = 0
        XML_SCHEMA_CONTENT_EMPTY = 1
        XML_SCHEMA_CONTENT_ELEMENTS = 2
        XML_SCHEMA_CONTENT_MIXED = 3
        XML_SCHEMA_CONTENT_SIMPLE = 4
        XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS = 5 : Obsolete
        XML_SCHEMA_CONTENT_BASIC = 6
        XML_SCHEMA_CONTENT_ANY = 7
    }
    

    Structure xmlSchemaElement

    Structure xmlSchemaElement
    struct _xmlSchemaElement { xmlSchemaTypeType type : The kind of type struct _xmlSchemaType * next : Not used? const xmlChar * name const xmlChar * id : Deprecated; not used const xmlChar * ref : Deprecated; not used const xmlChar * refNs : Deprecated; not used xmlSchemaAnnotPtr annot xmlSchemaTypePtr subtypes : the type definition xmlSchemaAttributePtr attributes xmlNodePtr node int minOccurs : Deprecated; not used int maxOccurs : Deprecated; not used int flags const xmlChar * targetNamespace const xmlChar * namedType const xmlChar * namedTypeNs const xmlChar * substGroup const xmlChar * substGroupNs const xmlChar * scope const xmlChar * value : The original value of the value constra struct _xmlSchemaElement * refDecl : This will now be used for the substitut xmlRegexpPtr contModel : Obsolete for WXS, maybe used for RelaxN xmlSchemaContentType contentType const xmlChar * refPrefix : Deprecated; not used xmlSchemaValPtr defVal : The compiled value contraint. void * idcs : The identity-constraint defs }

    Structure xmlSchemaFacet

    Structure xmlSchemaFacet
    struct _xmlSchemaFacet { xmlSchemaTypeType type : The kind of type struct _xmlSchemaFacet * next : the next type if in a sequence ... const xmlChar * value : The original value const xmlChar * id : Obsolete xmlSchemaAnnotPtr annot xmlNodePtr node int fixed : XML_SCHEMAS_FACET_PRESERVE, etc. int whitespace xmlSchemaValPtr val : The compiled value xmlRegexpPtr regexp : The regex for patterns }

    Structure xmlSchemaFacetLink

    Structure xmlSchemaFacetLink
    struct _xmlSchemaFacetLink { struct _xmlSchemaFacetLink * next : the next facet link ... xmlSchemaFacetPtr facet : the linked facet }

    Structure xmlSchemaNotation

    Structure xmlSchemaNotation
    struct _xmlSchemaNotation { xmlSchemaTypeType type : The kind of type const xmlChar * name xmlSchemaAnnotPtr annot const xmlChar * identifier const xmlChar * targetNamespace }

    Structure xmlSchemaType

    Structure xmlSchemaType
    struct _xmlSchemaType { xmlSchemaTypeType type : The kind of type struct _xmlSchemaType * next : the next type if in a sequence ... const xmlChar * name const xmlChar * id : Deprecated; not used const xmlChar * ref : Deprecated; not used const xmlChar * refNs : Deprecated; not used xmlSchemaAnnotPtr annot xmlSchemaTypePtr subtypes xmlSchemaAttributePtr attributes : Deprecated; not used xmlNodePtr node int minOccurs : Deprecated; not used int maxOccurs : Deprecated; not used int flags xmlSchemaContentType contentType const xmlChar * base : Base type's local name const xmlChar * baseNs : Base type's target namespace xmlSchemaTypePtr baseType : The base type component xmlSchemaFacetPtr facets : Local facets struct _xmlSchemaType * redef : Deprecated; not used int recurse : Obsolete xmlSchemaAttributeLinkPtr * attributeUses : Deprecated; not used xmlSchemaWildcardPtr attributeWildcard int builtInType : Type of built-in types. xmlSchemaTypeLinkPtr memberTypes : member-types if a union type. xmlSchemaFacetLinkPtr facetSet : All facets (incl. inherited) const xmlChar * refPrefix : Deprecated; not used xmlSchemaTypePtr contentTypeDef : Used for the simple content of complex xmlRegexpPtr contModel : Holds the automaton of the content mode const xmlChar * targetNamespace void * attrUses }

    Structure xmlSchemaTypeLink

    Structure xmlSchemaTypeLink
    struct _xmlSchemaTypeLink { struct _xmlSchemaTypeLink * next : the next type link ... xmlSchemaTypePtr type : the linked type }

    Enum xmlSchemaTypeType

    Enum xmlSchemaTypeType {
        XML_SCHEMA_TYPE_BASIC = 1 : A built-in datatype
        XML_SCHEMA_TYPE_ANY = 2
        XML_SCHEMA_TYPE_FACET = 3
        XML_SCHEMA_TYPE_SIMPLE = 4
        XML_SCHEMA_TYPE_COMPLEX = 5
        XML_SCHEMA_TYPE_SEQUENCE = 6
        XML_SCHEMA_TYPE_CHOICE = 7
        XML_SCHEMA_TYPE_ALL = 8
        XML_SCHEMA_TYPE_SIMPLE_CONTENT = 9
        XML_SCHEMA_TYPE_COMPLEX_CONTENT = 10
        XML_SCHEMA_TYPE_UR = 11
        XML_SCHEMA_TYPE_RESTRICTION = 12
        XML_SCHEMA_TYPE_EXTENSION = 13
        XML_SCHEMA_TYPE_ELEMENT = 14
        XML_SCHEMA_TYPE_ATTRIBUTE = 15
        XML_SCHEMA_TYPE_ATTRIBUTEGROUP = 16
        XML_SCHEMA_TYPE_GROUP = 17
        XML_SCHEMA_TYPE_NOTATION = 18
        XML_SCHEMA_TYPE_LIST = 19
        XML_SCHEMA_TYPE_UNION = 20
        XML_SCHEMA_TYPE_ANY_ATTRIBUTE = 21
        XML_SCHEMA_TYPE_IDC_UNIQUE = 22
        XML_SCHEMA_TYPE_IDC_KEY = 23
        XML_SCHEMA_TYPE_IDC_KEYREF = 24
        XML_SCHEMA_TYPE_PARTICLE = 25
        XML_SCHEMA_TYPE_ATTRIBUTE_USE = 26
        XML_SCHEMA_FACET_MININCLUSIVE = 1000
        XML_SCHEMA_FACET_MINEXCLUSIVE = 1001
        XML_SCHEMA_FACET_MAXINCLUSIVE = 1002
        XML_SCHEMA_FACET_MAXEXCLUSIVE = 1003
        XML_SCHEMA_FACET_TOTALDIGITS = 1004
        XML_SCHEMA_FACET_FRACTIONDIGITS = 1005
        XML_SCHEMA_FACET_PATTERN = 1006
        XML_SCHEMA_FACET_ENUMERATION = 1007
        XML_SCHEMA_FACET_WHITESPACE = 1008
        XML_SCHEMA_FACET_LENGTH = 1009
        XML_SCHEMA_FACET_MAXLENGTH = 1010
        XML_SCHEMA_FACET_MINLENGTH = 1011
        XML_SCHEMA_EXTRA_QNAMEREF = 2000
        XML_SCHEMA_EXTRA_ATTR_USE_PROHIB = 2001
    }
    

    Structure xmlSchemaVal

    Structure xmlSchemaVal
    struct _xmlSchemaVal { The content of this structure is not made public by the API. }

    Enum xmlSchemaValType

    Enum xmlSchemaValType {
        XML_SCHEMAS_UNKNOWN = 0
        XML_SCHEMAS_STRING = 1
        XML_SCHEMAS_NORMSTRING = 2
        XML_SCHEMAS_DECIMAL = 3
        XML_SCHEMAS_TIME = 4
        XML_SCHEMAS_GDAY = 5
        XML_SCHEMAS_GMONTH = 6
        XML_SCHEMAS_GMONTHDAY = 7
        XML_SCHEMAS_GYEAR = 8
        XML_SCHEMAS_GYEARMONTH = 9
        XML_SCHEMAS_DATE = 10
        XML_SCHEMAS_DATETIME = 11
        XML_SCHEMAS_DURATION = 12
        XML_SCHEMAS_FLOAT = 13
        XML_SCHEMAS_DOUBLE = 14
        XML_SCHEMAS_BOOLEAN = 15
        XML_SCHEMAS_TOKEN = 16
        XML_SCHEMAS_LANGUAGE = 17
        XML_SCHEMAS_NMTOKEN = 18
        XML_SCHEMAS_NMTOKENS = 19
        XML_SCHEMAS_NAME = 20
        XML_SCHEMAS_QNAME = 21
        XML_SCHEMAS_NCNAME = 22
        XML_SCHEMAS_ID = 23
        XML_SCHEMAS_IDREF = 24
        XML_SCHEMAS_IDREFS = 25
        XML_SCHEMAS_ENTITY = 26
        XML_SCHEMAS_ENTITIES = 27
        XML_SCHEMAS_NOTATION = 28
        XML_SCHEMAS_ANYURI = 29
        XML_SCHEMAS_INTEGER = 30
        XML_SCHEMAS_NPINTEGER = 31
        XML_SCHEMAS_NINTEGER = 32
        XML_SCHEMAS_NNINTEGER = 33
        XML_SCHEMAS_PINTEGER = 34
        XML_SCHEMAS_INT = 35
        XML_SCHEMAS_UINT = 36
        XML_SCHEMAS_LONG = 37
        XML_SCHEMAS_ULONG = 38
        XML_SCHEMAS_SHORT = 39
        XML_SCHEMAS_USHORT = 40
        XML_SCHEMAS_BYTE = 41
        XML_SCHEMAS_UBYTE = 42
        XML_SCHEMAS_HEXBINARY = 43
        XML_SCHEMAS_BASE64BINARY = 44
        XML_SCHEMAS_ANYTYPE = 45
        XML_SCHEMAS_ANYSIMPLETYPE = 46
    }
    

    Structure xmlSchemaWildcard

    Structure xmlSchemaWildcard
    struct _xmlSchemaWildcard { xmlSchemaTypeType type : The kind of type const xmlChar * id : Deprecated; not used xmlSchemaAnnotPtr annot xmlNodePtr node int minOccurs : Deprecated; not used int maxOccurs : Deprecated; not used int processContents int any : Indicates if the ns constraint is of ## xmlSchemaWildcardNsPtr nsSet : The list of allowed namespaces xmlSchemaWildcardNsPtr negNsSet : The negated namespace int flags }

    Structure xmlSchemaWildcardNs

    Structure xmlSchemaWildcardNs
    struct _xmlSchemaWildcardNs { struct _xmlSchemaWildcardNs * next : the next constraint link ... const xmlChar * value : the value }

    Function: xmlSchemaFreeType

    void	xmlSchemaFreeType		(xmlSchemaTypePtr type)

    Deallocate a Schema Type structure.

    type:a schema type structure

    Function: xmlSchemaFreeWildcard

    void	xmlSchemaFreeWildcard		(xmlSchemaWildcardPtr wildcard)

    Deallocates a wildcard structure.

    wildcard:a wildcard structure

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-dict.html0000644000175000017500000004305012134171042017360 0ustar aronaron Module dict from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module dict from libxml2

    API Menu
    API Indexes
    Related links

    dictionary of reusable strings, just used to avoid allocation and freeing operations.

    Table of Contents

    Structure xmlDict
    struct _xmlDict The content of this structure is not made public by the API.
    Typedef xmlDict * xmlDictPtr
    
    void	xmlDictCleanup			(void)
    xmlDictPtr	xmlDictCreate		(void)
    xmlDictPtr	xmlDictCreateSub	(xmlDictPtr sub)
    const xmlChar *	xmlDictExists		(xmlDictPtr dict, 
    const xmlChar * name,
    int len)
    void	xmlDictFree			(xmlDictPtr dict)
    size_t	xmlDictGetUsage			(xmlDictPtr dict)
    const xmlChar *	xmlDictLookup		(xmlDictPtr dict, 
    const xmlChar * name,
    int len)
    int	xmlDictOwns			(xmlDictPtr dict, 
    const xmlChar * str)
    const xmlChar *	xmlDictQLookup		(xmlDictPtr dict, 
    const xmlChar * prefix,
    const xmlChar * name)
    int	xmlDictReference		(xmlDictPtr dict)
    size_t	xmlDictSetLimit			(xmlDictPtr dict, 
    size_t limit)
    int	xmlDictSize			(xmlDictPtr dict)
    int	xmlInitializeDict		(void)

    Description

    Structure xmlDict

    Structure xmlDict
    struct _xmlDict { The content of this structure is not made public by the API. }

    Function: xmlDictCleanup

    void	xmlDictCleanup			(void)

    Free the dictionary mutex. Do not call unless sure the library is not in use anymore !

    Function: xmlDictCreate

    xmlDictPtr	xmlDictCreate		(void)

    Create a new dictionary

    Returns:the newly created dictionnary, or NULL if an error occured.

    Function: xmlDictCreateSub

    xmlDictPtr	xmlDictCreateSub	(xmlDictPtr sub)

    Create a new dictionary, inheriting strings from the read-only dictionnary @sub. On lookup, strings are first searched in the new dictionnary, then in @sub, and if not found are created in the new dictionnary.

    sub:an existing dictionnary
    Returns:the newly created dictionnary, or NULL if an error occured.

    Function: xmlDictExists

    const xmlChar *	xmlDictExists		(xmlDictPtr dict, 
    const xmlChar * name,
    int len)

    Check if the @name exists in the dictionnary @dict.

    dict:the dictionnary
    name:the name of the userdata
    len:the length of the name, if -1 it is recomputed
    Returns:the internal copy of the name or NULL if not found.

    Function: xmlDictFree

    void	xmlDictFree			(xmlDictPtr dict)

    Free the hash @dict and its contents. The userdata is deallocated with @f if provided.

    dict:the dictionnary

    Function: xmlDictGetUsage

    size_t	xmlDictGetUsage			(xmlDictPtr dict)

    Get how much memory is used by a dictionary for strings Added in 2.9.0

    dict:the dictionnary
    Returns:the amount of strings allocated

    Function: xmlDictLookup

    const xmlChar *	xmlDictLookup		(xmlDictPtr dict, 
    const xmlChar * name,
    int len)

    Add the @name to the dictionnary @dict if not present.

    dict:the dictionnary
    name:the name of the userdata
    len:the length of the name, if -1 it is recomputed
    Returns:the internal copy of the name or NULL in case of internal error

    Function: xmlDictOwns

    int	xmlDictOwns			(xmlDictPtr dict, 
    const xmlChar * str)

    check if a string is owned by the disctionary

    dict:the dictionnary
    str:the string
    Returns:1 if true, 0 if false and -1 in case of error -1 in case of error

    Function: xmlDictQLookup

    const xmlChar *	xmlDictQLookup		(xmlDictPtr dict, 
    const xmlChar * prefix,
    const xmlChar * name)

    Add the QName @prefix:@name to the hash @dict if not present.

    dict:the dictionnary
    prefix:the prefix
    name:the name
    Returns:the internal copy of the QName or NULL in case of internal error

    Function: xmlDictReference

    int	xmlDictReference		(xmlDictPtr dict)

    Increment the reference counter of a dictionary

    dict:the dictionnary
    Returns:0 in case of success and -1 in case of error

    Function: xmlDictSetLimit

    size_t	xmlDictSetLimit			(xmlDictPtr dict, 
    size_t limit)

    Set a size limit for the dictionary Added in 2.9.0

    dict:the dictionnary
    limit:the limit in bytes
    Returns:the previous limit of the dictionary or 0

    Function: xmlDictSize

    int	xmlDictSize			(xmlDictPtr dict)

    Query the number of elements installed in the hash @dict.

    dict:the dictionnary
    Returns:the number of elements in the dictionnary or -1 in case of error

    Function: xmlInitializeDict

    int	xmlInitializeDict		(void)

    Do the dictionary mutex initialization. this function is deprecated

    Returns:0 if initialization was already done, and 1 if that call led to the initialization

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-list.html0000644000175000017500000007263112134171042017417 0ustar aronaron Module list from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module list from libxml2

    API Menu
    API Indexes
    Related links

    this module implement the list support used in various place in the library.

    Table of Contents

    Structure xmlLink
    struct _xmlLink The content of this structure is not made public by the API.
    Typedef xmlLink * xmlLinkPtr
    
    Structure xmlList
    struct _xmlList The content of this structure is not made public by the API.
    Typedef xmlList * xmlListPtr
    
    void *	xmlLinkGetData			(xmlLinkPtr lk)
    int	xmlListAppend			(xmlListPtr l, 
    void * data)
    void	xmlListClear			(xmlListPtr l)
    int	xmlListCopy			(xmlListPtr cur, 
    const xmlListPtr old)
    xmlListPtr	xmlListCreate		(xmlListDeallocator deallocator, 
    xmlListDataCompare compare)
    Function type: xmlListDataCompare
    int	xmlListDataCompare		(const void * data0, 
    const void * data1)
    Function type: xmlListDeallocator
    void	xmlListDeallocator		(xmlLinkPtr lk)
    
    void	xmlListDelete			(xmlListPtr l)
    xmlListPtr	xmlListDup		(const xmlListPtr old)
    int	xmlListEmpty			(xmlListPtr l)
    xmlLinkPtr	xmlListEnd		(xmlListPtr l)
    xmlLinkPtr	xmlListFront		(xmlListPtr l)
    int	xmlListInsert			(xmlListPtr l, 
    void * data)
    void	xmlListMerge			(xmlListPtr l1, 
    xmlListPtr l2)
    void	xmlListPopBack			(xmlListPtr l)
    void	xmlListPopFront			(xmlListPtr l)
    int	xmlListPushBack			(xmlListPtr l, 
    void * data)
    int	xmlListPushFront		(xmlListPtr l, 
    void * data)
    int	xmlListRemoveAll		(xmlListPtr l, 
    void * data)
    int	xmlListRemoveFirst		(xmlListPtr l, 
    void * data)
    int	xmlListRemoveLast		(xmlListPtr l, 
    void * data)
    void	xmlListReverse			(xmlListPtr l)
    void *	xmlListReverseSearch		(xmlListPtr l, 
    void * data)
    void	xmlListReverseWalk		(xmlListPtr l, 
    xmlListWalker walker,
    const void * user)
    void *	xmlListSearch			(xmlListPtr l, 
    void * data)
    int	xmlListSize			(xmlListPtr l)
    void	xmlListSort			(xmlListPtr l)
    void	xmlListWalk			(xmlListPtr l, 
    xmlListWalker walker,
    const void * user)
    Function type: xmlListWalker
    int	xmlListWalker			(const void * data, 
    const void * user)

    Description

    Structure xmlLink

    Structure xmlLink
    struct _xmlLink { The content of this structure is not made public by the API. }

    Structure xmlList

    Structure xmlList
    struct _xmlList { The content of this structure is not made public by the API. }

    Function: xmlLinkGetData

    void *	xmlLinkGetData			(xmlLinkPtr lk)

    See Returns.

    lk:a link
    Returns:a pointer to the data referenced from this link

    Function: xmlListAppend

    int	xmlListAppend			(xmlListPtr l, 
    void * data)

    Insert data in the ordered list at the end for this value

    l:a list
    data:the data
    Returns:0 in case of success, 1 in case of failure

    Function: xmlListClear

    void	xmlListClear			(xmlListPtr l)

    Remove the all data in the list

    l:a list

    Function: xmlListCopy

    int	xmlListCopy			(xmlListPtr cur, 
    const xmlListPtr old)

    Move all the element from the old list in the new list

    cur:the new list
    old:the old list
    Returns:0 in case of success 1 in case of error

    Function: xmlListCreate

    xmlListPtr	xmlListCreate		(xmlListDeallocator deallocator, 
    xmlListDataCompare compare)

    Create a new list

    deallocator:an optional deallocator function
    compare:an optional comparison function
    Returns:the new list or NULL in case of error

    Function type: xmlListDataCompare

    Function type: xmlListDataCompare
    int	xmlListDataCompare		(const void * data0, 
    const void * data1)

    Callback function used to compare 2 data.

    data0:the first data
    data1:the second data
    Returns:0 is equality, -1 or 1 otherwise depending on the ordering.

    Function type: xmlListDeallocator

    Function type: xmlListDeallocator
    void	xmlListDeallocator		(xmlLinkPtr lk)
    

    Callback function used to free data from a list.

    lk:the data to deallocate

    Function: xmlListDelete

    void	xmlListDelete			(xmlListPtr l)

    Deletes the list and its associated data

    l:a list

    Function: xmlListDup

    xmlListPtr	xmlListDup		(const xmlListPtr old)

    Duplicate the list

    old:the list
    Returns:a new copy of the list or NULL in case of error

    Function: xmlListEmpty

    int	xmlListEmpty			(xmlListPtr l)

    Is the list empty ?

    l:a list
    Returns:1 if the list is empty, 0 if not empty and -1 in case of error

    Function: xmlListEnd

    xmlLinkPtr	xmlListEnd		(xmlListPtr l)

    Get the last element in the list

    l:a list
    Returns:the last element in the list, or NULL

    Function: xmlListFront

    xmlLinkPtr	xmlListFront		(xmlListPtr l)

    Get the first element in the list

    l:a list
    Returns:the first element in the list, or NULL

    Function: xmlListInsert

    int	xmlListInsert			(xmlListPtr l, 
    void * data)

    Insert data in the ordered list at the beginning for this value

    l:a list
    data:the data
    Returns:0 in case of success, 1 in case of failure

    Function: xmlListMerge

    void	xmlListMerge			(xmlListPtr l1, 
    xmlListPtr l2)

    include all the elements of the second list in the first one and clear the second list

    l1:the original list
    l2:the new list

    Function: xmlListPopBack

    void	xmlListPopBack			(xmlListPtr l)

    Removes the last element in the list

    l:a list

    Function: xmlListPopFront

    void	xmlListPopFront			(xmlListPtr l)

    Removes the first element in the list

    l:a list

    Function: xmlListPushBack

    int	xmlListPushBack			(xmlListPtr l, 
    void * data)

    add the new data at the end of the list

    l:a list
    data:new data
    Returns:1 if successful, 0 otherwise

    Function: xmlListPushFront

    int	xmlListPushFront		(xmlListPtr l, 
    void * data)

    add the new data at the beginning of the list

    l:a list
    data:new data
    Returns:1 if successful, 0 otherwise

    Function: xmlListRemoveAll

    int	xmlListRemoveAll		(xmlListPtr l, 
    void * data)

    Remove the all instance associated to data in the list

    l:a list
    data:list data
    Returns:the number of deallocation, or 0 if not found

    Function: xmlListRemoveFirst

    int	xmlListRemoveFirst		(xmlListPtr l, 
    void * data)

    Remove the first instance associated to data in the list

    l:a list
    data:list data
    Returns:1 if a deallocation occured, or 0 if not found

    Function: xmlListRemoveLast

    int	xmlListRemoveLast		(xmlListPtr l, 
    void * data)

    Remove the last instance associated to data in the list

    l:a list
    data:list data
    Returns:1 if a deallocation occured, or 0 if not found

    Function: xmlListReverse

    void	xmlListReverse			(xmlListPtr l)

    Reverse the order of the elements in the list

    l:a list

    Function: xmlListReverseSearch

    void *	xmlListReverseSearch		(xmlListPtr l, 
    void * data)

    Search the list in reverse order for an existing value of @data

    l:a list
    data:a search value
    Returns:the value associated to @data or NULL in case of error

    Function: xmlListReverseWalk

    void	xmlListReverseWalk		(xmlListPtr l, 
    xmlListWalker walker,
    const void * user)

    Walk all the element of the list in reverse order and apply the walker function to it

    l:a list
    walker:a processing function
    user:a user parameter passed to the walker function

    Function: xmlListSearch

    void *	xmlListSearch			(xmlListPtr l, 
    void * data)

    Search the list for an existing value of @data

    l:a list
    data:a search value
    Returns:the value associated to @data or NULL in case of error

    Function: xmlListSize

    int	xmlListSize			(xmlListPtr l)

    Get the number of elements in the list

    l:a list
    Returns:the number of elements in the list or -1 in case of error

    Function: xmlListSort

    void	xmlListSort			(xmlListPtr l)

    Sort all the elements in the list

    l:a list

    Function: xmlListWalk

    void	xmlListWalk			(xmlListPtr l, 
    xmlListWalker walker,
    const void * user)

    Walk all the element of the first from first to last and apply the walker function to it

    l:a list
    walker:a processing function
    user:a user parameter passed to the walker function

    Function type: xmlListWalker

    Function type: xmlListWalker
    int	xmlListWalker			(const void * data, 
    const void * user)

    Callback function used when walking a list with xmlListWalk().

    data:the data found in the list
    user:extra user provided data to the walker
    Returns:0 to stop walking the list, 1 otherwise.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlunicode.html0000644000175000017500000033432212134171043020612 0ustar aronaron Module xmlunicode from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlunicode from libxml2

    API Menu
    API Indexes
    Related links

    API for the Unicode character APIs This file is automatically generated from the UCS description files of the Unicode Character Database

    Table of Contents

    int	xmlUCSIsAegeanNumbers		(int code)
    int	xmlUCSIsAlphabeticPresentationForms	(int code)
    int	xmlUCSIsArabic			(int code)
    int	xmlUCSIsArabicPresentationFormsA	(int code)
    int	xmlUCSIsArabicPresentationFormsB	(int code)
    int	xmlUCSIsArmenian		(int code)
    int	xmlUCSIsArrows			(int code)
    int	xmlUCSIsBasicLatin		(int code)
    int	xmlUCSIsBengali			(int code)
    int	xmlUCSIsBlock			(int code, 
    const char * block)
    int	xmlUCSIsBlockElements		(int code)
    int	xmlUCSIsBopomofo		(int code)
    int	xmlUCSIsBopomofoExtended	(int code)
    int	xmlUCSIsBoxDrawing		(int code)
    int	xmlUCSIsBraillePatterns		(int code)
    int	xmlUCSIsBuhid			(int code)
    int	xmlUCSIsByzantineMusicalSymbols	(int code)
    int	xmlUCSIsCJKCompatibility	(int code)
    int	xmlUCSIsCJKCompatibilityForms	(int code)
    int	xmlUCSIsCJKCompatibilityIdeographs	(int code)
    int	xmlUCSIsCJKCompatibilityIdeographsSupplement	(int code)
    int	xmlUCSIsCJKRadicalsSupplement	(int code)
    int	xmlUCSIsCJKSymbolsandPunctuation	(int code)
    int	xmlUCSIsCJKUnifiedIdeographs	(int code)
    int	xmlUCSIsCJKUnifiedIdeographsExtensionA	(int code)
    int	xmlUCSIsCJKUnifiedIdeographsExtensionB	(int code)
    int	xmlUCSIsCat			(int code, 
    const char * cat)
    int	xmlUCSIsCatC			(int code)
    int	xmlUCSIsCatCc			(int code)
    int	xmlUCSIsCatCf			(int code)
    int	xmlUCSIsCatCo			(int code)
    int	xmlUCSIsCatCs			(int code)
    int	xmlUCSIsCatL			(int code)
    int	xmlUCSIsCatLl			(int code)
    int	xmlUCSIsCatLm			(int code)
    int	xmlUCSIsCatLo			(int code)
    int	xmlUCSIsCatLt			(int code)
    int	xmlUCSIsCatLu			(int code)
    int	xmlUCSIsCatM			(int code)
    int	xmlUCSIsCatMc			(int code)
    int	xmlUCSIsCatMe			(int code)
    int	xmlUCSIsCatMn			(int code)
    int	xmlUCSIsCatN			(int code)
    int	xmlUCSIsCatNd			(int code)
    int	xmlUCSIsCatNl			(int code)
    int	xmlUCSIsCatNo			(int code)
    int	xmlUCSIsCatP			(int code)
    int	xmlUCSIsCatPc			(int code)
    int	xmlUCSIsCatPd			(int code)
    int	xmlUCSIsCatPe			(int code)
    int	xmlUCSIsCatPf			(int code)
    int	xmlUCSIsCatPi			(int code)
    int	xmlUCSIsCatPo			(int code)
    int	xmlUCSIsCatPs			(int code)
    int	xmlUCSIsCatS			(int code)
    int	xmlUCSIsCatSc			(int code)
    int	xmlUCSIsCatSk			(int code)
    int	xmlUCSIsCatSm			(int code)
    int	xmlUCSIsCatSo			(int code)
    int	xmlUCSIsCatZ			(int code)
    int	xmlUCSIsCatZl			(int code)
    int	xmlUCSIsCatZp			(int code)
    int	xmlUCSIsCatZs			(int code)
    int	xmlUCSIsCherokee		(int code)
    int	xmlUCSIsCombiningDiacriticalMarks	(int code)
    int	xmlUCSIsCombiningDiacriticalMarksforSymbols	(int code)
    int	xmlUCSIsCombiningHalfMarks	(int code)
    int	xmlUCSIsCombiningMarksforSymbols	(int code)
    int	xmlUCSIsControlPictures		(int code)
    int	xmlUCSIsCurrencySymbols		(int code)
    int	xmlUCSIsCypriotSyllabary	(int code)
    int	xmlUCSIsCyrillic		(int code)
    int	xmlUCSIsCyrillicSupplement	(int code)
    int	xmlUCSIsDeseret			(int code)
    int	xmlUCSIsDevanagari		(int code)
    int	xmlUCSIsDingbats		(int code)
    int	xmlUCSIsEnclosedAlphanumerics	(int code)
    int	xmlUCSIsEnclosedCJKLettersandMonths	(int code)
    int	xmlUCSIsEthiopic		(int code)
    int	xmlUCSIsGeneralPunctuation	(int code)
    int	xmlUCSIsGeometricShapes		(int code)
    int	xmlUCSIsGeorgian		(int code)
    int	xmlUCSIsGothic			(int code)
    int	xmlUCSIsGreek			(int code)
    int	xmlUCSIsGreekExtended		(int code)
    int	xmlUCSIsGreekandCoptic		(int code)
    int	xmlUCSIsGujarati		(int code)
    int	xmlUCSIsGurmukhi		(int code)
    int	xmlUCSIsHalfwidthandFullwidthForms	(int code)
    int	xmlUCSIsHangulCompatibilityJamo	(int code)
    int	xmlUCSIsHangulJamo		(int code)
    int	xmlUCSIsHangulSyllables		(int code)
    int	xmlUCSIsHanunoo			(int code)
    int	xmlUCSIsHebrew			(int code)
    int	xmlUCSIsHighPrivateUseSurrogates	(int code)
    int	xmlUCSIsHighSurrogates		(int code)
    int	xmlUCSIsHiragana		(int code)
    int	xmlUCSIsIPAExtensions		(int code)
    int	xmlUCSIsIdeographicDescriptionCharacters	(int code)
    int	xmlUCSIsKanbun			(int code)
    int	xmlUCSIsKangxiRadicals		(int code)
    int	xmlUCSIsKannada			(int code)
    int	xmlUCSIsKatakana		(int code)
    int	xmlUCSIsKatakanaPhoneticExtensions	(int code)
    int	xmlUCSIsKhmer			(int code)
    int	xmlUCSIsKhmerSymbols		(int code)
    int	xmlUCSIsLao			(int code)
    int	xmlUCSIsLatin1Supplement	(int code)
    int	xmlUCSIsLatinExtendedA		(int code)
    int	xmlUCSIsLatinExtendedAdditional	(int code)
    int	xmlUCSIsLatinExtendedB		(int code)
    int	xmlUCSIsLetterlikeSymbols	(int code)
    int	xmlUCSIsLimbu			(int code)
    int	xmlUCSIsLinearBIdeograms	(int code)
    int	xmlUCSIsLinearBSyllabary	(int code)
    int	xmlUCSIsLowSurrogates		(int code)
    int	xmlUCSIsMalayalam		(int code)
    int	xmlUCSIsMathematicalAlphanumericSymbols	(int code)
    int	xmlUCSIsMathematicalOperators	(int code)
    int	xmlUCSIsMiscellaneousMathematicalSymbolsA	(int code)
    int	xmlUCSIsMiscellaneousMathematicalSymbolsB	(int code)
    int	xmlUCSIsMiscellaneousSymbols	(int code)
    int	xmlUCSIsMiscellaneousSymbolsandArrows	(int code)
    int	xmlUCSIsMiscellaneousTechnical	(int code)
    int	xmlUCSIsMongolian		(int code)
    int	xmlUCSIsMusicalSymbols		(int code)
    int	xmlUCSIsMyanmar			(int code)
    int	xmlUCSIsNumberForms		(int code)
    int	xmlUCSIsOgham			(int code)
    int	xmlUCSIsOldItalic		(int code)
    int	xmlUCSIsOpticalCharacterRecognition	(int code)
    int	xmlUCSIsOriya			(int code)
    int	xmlUCSIsOsmanya			(int code)
    int	xmlUCSIsPhoneticExtensions	(int code)
    int	xmlUCSIsPrivateUse		(int code)
    int	xmlUCSIsPrivateUseArea		(int code)
    int	xmlUCSIsRunic			(int code)
    int	xmlUCSIsShavian			(int code)
    int	xmlUCSIsSinhala			(int code)
    int	xmlUCSIsSmallFormVariants	(int code)
    int	xmlUCSIsSpacingModifierLetters	(int code)
    int	xmlUCSIsSpecials		(int code)
    int	xmlUCSIsSuperscriptsandSubscripts	(int code)
    int	xmlUCSIsSupplementalArrowsA	(int code)
    int	xmlUCSIsSupplementalArrowsB	(int code)
    int	xmlUCSIsSupplementalMathematicalOperators	(int code)
    int	xmlUCSIsSupplementaryPrivateUseAreaA	(int code)
    int	xmlUCSIsSupplementaryPrivateUseAreaB	(int code)
    int	xmlUCSIsSyriac			(int code)
    int	xmlUCSIsTagalog			(int code)
    int	xmlUCSIsTagbanwa		(int code)
    int	xmlUCSIsTags			(int code)
    int	xmlUCSIsTaiLe			(int code)
    int	xmlUCSIsTaiXuanJingSymbols	(int code)
    int	xmlUCSIsTamil			(int code)
    int	xmlUCSIsTelugu			(int code)
    int	xmlUCSIsThaana			(int code)
    int	xmlUCSIsThai			(int code)
    int	xmlUCSIsTibetan			(int code)
    int	xmlUCSIsUgaritic		(int code)
    int	xmlUCSIsUnifiedCanadianAboriginalSyllabics	(int code)
    int	xmlUCSIsVariationSelectors	(int code)
    int	xmlUCSIsVariationSelectorsSupplement	(int code)
    int	xmlUCSIsYiRadicals		(int code)
    int	xmlUCSIsYiSyllables		(int code)
    int	xmlUCSIsYijingHexagramSymbols	(int code)

    Description

    Function: xmlUCSIsAegeanNumbers

    int	xmlUCSIsAegeanNumbers		(int code)

    Check whether the character is part of AegeanNumbers UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsAlphabeticPresentationForms

    int	xmlUCSIsAlphabeticPresentationForms	(int code)

    Check whether the character is part of AlphabeticPresentationForms UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsArabic

    int	xmlUCSIsArabic			(int code)

    Check whether the character is part of Arabic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsArabicPresentationFormsA

    int	xmlUCSIsArabicPresentationFormsA	(int code)

    Check whether the character is part of ArabicPresentationForms-A UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsArabicPresentationFormsB

    int	xmlUCSIsArabicPresentationFormsB	(int code)

    Check whether the character is part of ArabicPresentationForms-B UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsArmenian

    int	xmlUCSIsArmenian		(int code)

    Check whether the character is part of Armenian UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsArrows

    int	xmlUCSIsArrows			(int code)

    Check whether the character is part of Arrows UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBasicLatin

    int	xmlUCSIsBasicLatin		(int code)

    Check whether the character is part of BasicLatin UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBengali

    int	xmlUCSIsBengali			(int code)

    Check whether the character is part of Bengali UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBlock

    int	xmlUCSIsBlock			(int code, 
    const char * block)

    Check whether the character is part of the UCS Block

    code:UCS code point
    block:UCS block name
    Returns:1 if true, 0 if false and -1 on unknown block

    Function: xmlUCSIsBlockElements

    int	xmlUCSIsBlockElements		(int code)

    Check whether the character is part of BlockElements UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBopomofo

    int	xmlUCSIsBopomofo		(int code)

    Check whether the character is part of Bopomofo UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBopomofoExtended

    int	xmlUCSIsBopomofoExtended	(int code)

    Check whether the character is part of BopomofoExtended UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBoxDrawing

    int	xmlUCSIsBoxDrawing		(int code)

    Check whether the character is part of BoxDrawing UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBraillePatterns

    int	xmlUCSIsBraillePatterns		(int code)

    Check whether the character is part of BraillePatterns UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsBuhid

    int	xmlUCSIsBuhid			(int code)

    Check whether the character is part of Buhid UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsByzantineMusicalSymbols

    int	xmlUCSIsByzantineMusicalSymbols	(int code)

    Check whether the character is part of ByzantineMusicalSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKCompatibility

    int	xmlUCSIsCJKCompatibility	(int code)

    Check whether the character is part of CJKCompatibility UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKCompatibilityForms

    int	xmlUCSIsCJKCompatibilityForms	(int code)

    Check whether the character is part of CJKCompatibilityForms UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKCompatibilityIdeographs

    int	xmlUCSIsCJKCompatibilityIdeographs	(int code)

    Check whether the character is part of CJKCompatibilityIdeographs UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKCompatibilityIdeographsSupplement

    int	xmlUCSIsCJKCompatibilityIdeographsSupplement	(int code)

    Check whether the character is part of CJKCompatibilityIdeographsSupplement UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKRadicalsSupplement

    int	xmlUCSIsCJKRadicalsSupplement	(int code)

    Check whether the character is part of CJKRadicalsSupplement UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKSymbolsandPunctuation

    int	xmlUCSIsCJKSymbolsandPunctuation	(int code)

    Check whether the character is part of CJKSymbolsandPunctuation UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKUnifiedIdeographs

    int	xmlUCSIsCJKUnifiedIdeographs	(int code)

    Check whether the character is part of CJKUnifiedIdeographs UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKUnifiedIdeographsExtensionA

    int	xmlUCSIsCJKUnifiedIdeographsExtensionA	(int code)

    Check whether the character is part of CJKUnifiedIdeographsExtensionA UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCJKUnifiedIdeographsExtensionB

    int	xmlUCSIsCJKUnifiedIdeographsExtensionB	(int code)

    Check whether the character is part of CJKUnifiedIdeographsExtensionB UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCat

    int	xmlUCSIsCat			(int code, 
    const char * cat)

    Check whether the character is part of the UCS Category

    code:UCS code point
    cat:UCS Category name
    Returns:1 if true, 0 if false and -1 on unknown category

    Function: xmlUCSIsCatC

    int	xmlUCSIsCatC			(int code)

    Check whether the character is part of C UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatCc

    int	xmlUCSIsCatCc			(int code)

    Check whether the character is part of Cc UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatCf

    int	xmlUCSIsCatCf			(int code)

    Check whether the character is part of Cf UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatCo

    int	xmlUCSIsCatCo			(int code)

    Check whether the character is part of Co UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatCs

    int	xmlUCSIsCatCs			(int code)

    Check whether the character is part of Cs UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatL

    int	xmlUCSIsCatL			(int code)

    Check whether the character is part of L UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatLl

    int	xmlUCSIsCatLl			(int code)

    Check whether the character is part of Ll UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatLm

    int	xmlUCSIsCatLm			(int code)

    Check whether the character is part of Lm UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatLo

    int	xmlUCSIsCatLo			(int code)

    Check whether the character is part of Lo UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatLt

    int	xmlUCSIsCatLt			(int code)

    Check whether the character is part of Lt UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatLu

    int	xmlUCSIsCatLu			(int code)

    Check whether the character is part of Lu UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatM

    int	xmlUCSIsCatM			(int code)

    Check whether the character is part of M UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatMc

    int	xmlUCSIsCatMc			(int code)

    Check whether the character is part of Mc UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatMe

    int	xmlUCSIsCatMe			(int code)

    Check whether the character is part of Me UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatMn

    int	xmlUCSIsCatMn			(int code)

    Check whether the character is part of Mn UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatN

    int	xmlUCSIsCatN			(int code)

    Check whether the character is part of N UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatNd

    int	xmlUCSIsCatNd			(int code)

    Check whether the character is part of Nd UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatNl

    int	xmlUCSIsCatNl			(int code)

    Check whether the character is part of Nl UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatNo

    int	xmlUCSIsCatNo			(int code)

    Check whether the character is part of No UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatP

    int	xmlUCSIsCatP			(int code)

    Check whether the character is part of P UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatPc

    int	xmlUCSIsCatPc			(int code)

    Check whether the character is part of Pc UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatPd

    int	xmlUCSIsCatPd			(int code)

    Check whether the character is part of Pd UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatPe

    int	xmlUCSIsCatPe			(int code)

    Check whether the character is part of Pe UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatPf

    int	xmlUCSIsCatPf			(int code)

    Check whether the character is part of Pf UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatPi

    int	xmlUCSIsCatPi			(int code)

    Check whether the character is part of Pi UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatPo

    int	xmlUCSIsCatPo			(int code)

    Check whether the character is part of Po UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatPs

    int	xmlUCSIsCatPs			(int code)

    Check whether the character is part of Ps UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatS

    int	xmlUCSIsCatS			(int code)

    Check whether the character is part of S UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatSc

    int	xmlUCSIsCatSc			(int code)

    Check whether the character is part of Sc UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatSk

    int	xmlUCSIsCatSk			(int code)

    Check whether the character is part of Sk UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatSm

    int	xmlUCSIsCatSm			(int code)

    Check whether the character is part of Sm UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatSo

    int	xmlUCSIsCatSo			(int code)

    Check whether the character is part of So UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatZ

    int	xmlUCSIsCatZ			(int code)

    Check whether the character is part of Z UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatZl

    int	xmlUCSIsCatZl			(int code)

    Check whether the character is part of Zl UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatZp

    int	xmlUCSIsCatZp			(int code)

    Check whether the character is part of Zp UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCatZs

    int	xmlUCSIsCatZs			(int code)

    Check whether the character is part of Zs UCS Category

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCherokee

    int	xmlUCSIsCherokee		(int code)

    Check whether the character is part of Cherokee UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCombiningDiacriticalMarks

    int	xmlUCSIsCombiningDiacriticalMarks	(int code)

    Check whether the character is part of CombiningDiacriticalMarks UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCombiningDiacriticalMarksforSymbols

    int	xmlUCSIsCombiningDiacriticalMarksforSymbols	(int code)

    Check whether the character is part of CombiningDiacriticalMarksforSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCombiningHalfMarks

    int	xmlUCSIsCombiningHalfMarks	(int code)

    Check whether the character is part of CombiningHalfMarks UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCombiningMarksforSymbols

    int	xmlUCSIsCombiningMarksforSymbols	(int code)

    Check whether the character is part of CombiningMarksforSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsControlPictures

    int	xmlUCSIsControlPictures		(int code)

    Check whether the character is part of ControlPictures UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCurrencySymbols

    int	xmlUCSIsCurrencySymbols		(int code)

    Check whether the character is part of CurrencySymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCypriotSyllabary

    int	xmlUCSIsCypriotSyllabary	(int code)

    Check whether the character is part of CypriotSyllabary UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCyrillic

    int	xmlUCSIsCyrillic		(int code)

    Check whether the character is part of Cyrillic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsCyrillicSupplement

    int	xmlUCSIsCyrillicSupplement	(int code)

    Check whether the character is part of CyrillicSupplement UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsDeseret

    int	xmlUCSIsDeseret			(int code)

    Check whether the character is part of Deseret UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsDevanagari

    int	xmlUCSIsDevanagari		(int code)

    Check whether the character is part of Devanagari UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsDingbats

    int	xmlUCSIsDingbats		(int code)

    Check whether the character is part of Dingbats UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsEnclosedAlphanumerics

    int	xmlUCSIsEnclosedAlphanumerics	(int code)

    Check whether the character is part of EnclosedAlphanumerics UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsEnclosedCJKLettersandMonths

    int	xmlUCSIsEnclosedCJKLettersandMonths	(int code)

    Check whether the character is part of EnclosedCJKLettersandMonths UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsEthiopic

    int	xmlUCSIsEthiopic		(int code)

    Check whether the character is part of Ethiopic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGeneralPunctuation

    int	xmlUCSIsGeneralPunctuation	(int code)

    Check whether the character is part of GeneralPunctuation UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGeometricShapes

    int	xmlUCSIsGeometricShapes		(int code)

    Check whether the character is part of GeometricShapes UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGeorgian

    int	xmlUCSIsGeorgian		(int code)

    Check whether the character is part of Georgian UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGothic

    int	xmlUCSIsGothic			(int code)

    Check whether the character is part of Gothic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGreek

    int	xmlUCSIsGreek			(int code)

    Check whether the character is part of Greek UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGreekExtended

    int	xmlUCSIsGreekExtended		(int code)

    Check whether the character is part of GreekExtended UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGreekandCoptic

    int	xmlUCSIsGreekandCoptic		(int code)

    Check whether the character is part of GreekandCoptic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGujarati

    int	xmlUCSIsGujarati		(int code)

    Check whether the character is part of Gujarati UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsGurmukhi

    int	xmlUCSIsGurmukhi		(int code)

    Check whether the character is part of Gurmukhi UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHalfwidthandFullwidthForms

    int	xmlUCSIsHalfwidthandFullwidthForms	(int code)

    Check whether the character is part of HalfwidthandFullwidthForms UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHangulCompatibilityJamo

    int	xmlUCSIsHangulCompatibilityJamo	(int code)

    Check whether the character is part of HangulCompatibilityJamo UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHangulJamo

    int	xmlUCSIsHangulJamo		(int code)

    Check whether the character is part of HangulJamo UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHangulSyllables

    int	xmlUCSIsHangulSyllables		(int code)

    Check whether the character is part of HangulSyllables UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHanunoo

    int	xmlUCSIsHanunoo			(int code)

    Check whether the character is part of Hanunoo UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHebrew

    int	xmlUCSIsHebrew			(int code)

    Check whether the character is part of Hebrew UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHighPrivateUseSurrogates

    int	xmlUCSIsHighPrivateUseSurrogates	(int code)

    Check whether the character is part of HighPrivateUseSurrogates UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHighSurrogates

    int	xmlUCSIsHighSurrogates		(int code)

    Check whether the character is part of HighSurrogates UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsHiragana

    int	xmlUCSIsHiragana		(int code)

    Check whether the character is part of Hiragana UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsIPAExtensions

    int	xmlUCSIsIPAExtensions		(int code)

    Check whether the character is part of IPAExtensions UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsIdeographicDescriptionCharacters

    int	xmlUCSIsIdeographicDescriptionCharacters	(int code)

    Check whether the character is part of IdeographicDescriptionCharacters UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsKanbun

    int	xmlUCSIsKanbun			(int code)

    Check whether the character is part of Kanbun UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsKangxiRadicals

    int	xmlUCSIsKangxiRadicals		(int code)

    Check whether the character is part of KangxiRadicals UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsKannada

    int	xmlUCSIsKannada			(int code)

    Check whether the character is part of Kannada UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsKatakana

    int	xmlUCSIsKatakana		(int code)

    Check whether the character is part of Katakana UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsKatakanaPhoneticExtensions

    int	xmlUCSIsKatakanaPhoneticExtensions	(int code)

    Check whether the character is part of KatakanaPhoneticExtensions UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsKhmer

    int	xmlUCSIsKhmer			(int code)

    Check whether the character is part of Khmer UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsKhmerSymbols

    int	xmlUCSIsKhmerSymbols		(int code)

    Check whether the character is part of KhmerSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLao

    int	xmlUCSIsLao			(int code)

    Check whether the character is part of Lao UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLatin1Supplement

    int	xmlUCSIsLatin1Supplement	(int code)

    Check whether the character is part of Latin-1Supplement UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLatinExtendedA

    int	xmlUCSIsLatinExtendedA		(int code)

    Check whether the character is part of LatinExtended-A UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLatinExtendedAdditional

    int	xmlUCSIsLatinExtendedAdditional	(int code)

    Check whether the character is part of LatinExtendedAdditional UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLatinExtendedB

    int	xmlUCSIsLatinExtendedB		(int code)

    Check whether the character is part of LatinExtended-B UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLetterlikeSymbols

    int	xmlUCSIsLetterlikeSymbols	(int code)

    Check whether the character is part of LetterlikeSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLimbu

    int	xmlUCSIsLimbu			(int code)

    Check whether the character is part of Limbu UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLinearBIdeograms

    int	xmlUCSIsLinearBIdeograms	(int code)

    Check whether the character is part of LinearBIdeograms UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLinearBSyllabary

    int	xmlUCSIsLinearBSyllabary	(int code)

    Check whether the character is part of LinearBSyllabary UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsLowSurrogates

    int	xmlUCSIsLowSurrogates		(int code)

    Check whether the character is part of LowSurrogates UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMalayalam

    int	xmlUCSIsMalayalam		(int code)

    Check whether the character is part of Malayalam UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMathematicalAlphanumericSymbols

    int	xmlUCSIsMathematicalAlphanumericSymbols	(int code)

    Check whether the character is part of MathematicalAlphanumericSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMathematicalOperators

    int	xmlUCSIsMathematicalOperators	(int code)

    Check whether the character is part of MathematicalOperators UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMiscellaneousMathematicalSymbolsA

    int	xmlUCSIsMiscellaneousMathematicalSymbolsA	(int code)

    Check whether the character is part of MiscellaneousMathematicalSymbols-A UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMiscellaneousMathematicalSymbolsB

    int	xmlUCSIsMiscellaneousMathematicalSymbolsB	(int code)

    Check whether the character is part of MiscellaneousMathematicalSymbols-B UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMiscellaneousSymbols

    int	xmlUCSIsMiscellaneousSymbols	(int code)

    Check whether the character is part of MiscellaneousSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMiscellaneousSymbolsandArrows

    int	xmlUCSIsMiscellaneousSymbolsandArrows	(int code)

    Check whether the character is part of MiscellaneousSymbolsandArrows UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMiscellaneousTechnical

    int	xmlUCSIsMiscellaneousTechnical	(int code)

    Check whether the character is part of MiscellaneousTechnical UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMongolian

    int	xmlUCSIsMongolian		(int code)

    Check whether the character is part of Mongolian UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMusicalSymbols

    int	xmlUCSIsMusicalSymbols		(int code)

    Check whether the character is part of MusicalSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsMyanmar

    int	xmlUCSIsMyanmar			(int code)

    Check whether the character is part of Myanmar UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsNumberForms

    int	xmlUCSIsNumberForms		(int code)

    Check whether the character is part of NumberForms UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsOgham

    int	xmlUCSIsOgham			(int code)

    Check whether the character is part of Ogham UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsOldItalic

    int	xmlUCSIsOldItalic		(int code)

    Check whether the character is part of OldItalic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsOpticalCharacterRecognition

    int	xmlUCSIsOpticalCharacterRecognition	(int code)

    Check whether the character is part of OpticalCharacterRecognition UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsOriya

    int	xmlUCSIsOriya			(int code)

    Check whether the character is part of Oriya UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsOsmanya

    int	xmlUCSIsOsmanya			(int code)

    Check whether the character is part of Osmanya UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsPhoneticExtensions

    int	xmlUCSIsPhoneticExtensions	(int code)

    Check whether the character is part of PhoneticExtensions UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsPrivateUse

    int	xmlUCSIsPrivateUse		(int code)

    Check whether the character is part of PrivateUse UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsPrivateUseArea

    int	xmlUCSIsPrivateUseArea		(int code)

    Check whether the character is part of PrivateUseArea UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsRunic

    int	xmlUCSIsRunic			(int code)

    Check whether the character is part of Runic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsShavian

    int	xmlUCSIsShavian			(int code)

    Check whether the character is part of Shavian UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSinhala

    int	xmlUCSIsSinhala			(int code)

    Check whether the character is part of Sinhala UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSmallFormVariants

    int	xmlUCSIsSmallFormVariants	(int code)

    Check whether the character is part of SmallFormVariants UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSpacingModifierLetters

    int	xmlUCSIsSpacingModifierLetters	(int code)

    Check whether the character is part of SpacingModifierLetters UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSpecials

    int	xmlUCSIsSpecials		(int code)

    Check whether the character is part of Specials UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSuperscriptsandSubscripts

    int	xmlUCSIsSuperscriptsandSubscripts	(int code)

    Check whether the character is part of SuperscriptsandSubscripts UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSupplementalArrowsA

    int	xmlUCSIsSupplementalArrowsA	(int code)

    Check whether the character is part of SupplementalArrows-A UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSupplementalArrowsB

    int	xmlUCSIsSupplementalArrowsB	(int code)

    Check whether the character is part of SupplementalArrows-B UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSupplementalMathematicalOperators

    int	xmlUCSIsSupplementalMathematicalOperators	(int code)

    Check whether the character is part of SupplementalMathematicalOperators UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSupplementaryPrivateUseAreaA

    int	xmlUCSIsSupplementaryPrivateUseAreaA	(int code)

    Check whether the character is part of SupplementaryPrivateUseArea-A UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSupplementaryPrivateUseAreaB

    int	xmlUCSIsSupplementaryPrivateUseAreaB	(int code)

    Check whether the character is part of SupplementaryPrivateUseArea-B UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsSyriac

    int	xmlUCSIsSyriac			(int code)

    Check whether the character is part of Syriac UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTagalog

    int	xmlUCSIsTagalog			(int code)

    Check whether the character is part of Tagalog UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTagbanwa

    int	xmlUCSIsTagbanwa		(int code)

    Check whether the character is part of Tagbanwa UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTags

    int	xmlUCSIsTags			(int code)

    Check whether the character is part of Tags UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTaiLe

    int	xmlUCSIsTaiLe			(int code)

    Check whether the character is part of TaiLe UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTaiXuanJingSymbols

    int	xmlUCSIsTaiXuanJingSymbols	(int code)

    Check whether the character is part of TaiXuanJingSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTamil

    int	xmlUCSIsTamil			(int code)

    Check whether the character is part of Tamil UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTelugu

    int	xmlUCSIsTelugu			(int code)

    Check whether the character is part of Telugu UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsThaana

    int	xmlUCSIsThaana			(int code)

    Check whether the character is part of Thaana UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsThai

    int	xmlUCSIsThai			(int code)

    Check whether the character is part of Thai UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsTibetan

    int	xmlUCSIsTibetan			(int code)

    Check whether the character is part of Tibetan UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsUgaritic

    int	xmlUCSIsUgaritic		(int code)

    Check whether the character is part of Ugaritic UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsUnifiedCanadianAboriginalSyllabics

    int	xmlUCSIsUnifiedCanadianAboriginalSyllabics	(int code)

    Check whether the character is part of UnifiedCanadianAboriginalSyllabics UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsVariationSelectors

    int	xmlUCSIsVariationSelectors	(int code)

    Check whether the character is part of VariationSelectors UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsVariationSelectorsSupplement

    int	xmlUCSIsVariationSelectorsSupplement	(int code)

    Check whether the character is part of VariationSelectorsSupplement UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsYiRadicals

    int	xmlUCSIsYiRadicals		(int code)

    Check whether the character is part of YiRadicals UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsYiSyllables

    int	xmlUCSIsYiSyllables		(int code)

    Check whether the character is part of YiSyllables UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Function: xmlUCSIsYijingHexagramSymbols

    int	xmlUCSIsYijingHexagramSymbols	(int code)

    Check whether the character is part of YijingHexagramSymbols UCS Block

    code:UCS code point
    Returns:1 if true 0 otherwise

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-c14n.html0000644000175000017500000004320512134171042017204 0ustar aronaron Module c14n from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module c14n from libxml2

    API Menu
    API Indexes
    Related links

    the c14n modules provides a "Canonical XML" implementation

    Table of Contents

    Enum xmlC14NMode
    
    int	xmlC14NDocDumpMemory		(xmlDocPtr doc, 
    xmlNodeSetPtr nodes,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    xmlChar ** doc_txt_ptr)
    int	xmlC14NDocSave			(xmlDocPtr doc, 
    xmlNodeSetPtr nodes,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    const char * filename,
    int compression)
    int	xmlC14NDocSaveTo		(xmlDocPtr doc, 
    xmlNodeSetPtr nodes,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    xmlOutputBufferPtr buf)
    int	xmlC14NExecute			(xmlDocPtr doc, 
    xmlC14NIsVisibleCallback is_visible_callback,
    void * user_data,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    xmlOutputBufferPtr buf)
    Function type: xmlC14NIsVisibleCallback
    int	xmlC14NIsVisibleCallback	(void * user_data, 
    xmlNodePtr node,
    xmlNodePtr parent)

    Description

    Enum xmlC14NMode

    Enum xmlC14NMode {
        XML_C14N_1_0 = 0 : Origianal C14N 1.0 spec
        XML_C14N_EXCLUSIVE_1_0 = 1 : Exclusive C14N 1.0 spec
        XML_C14N_1_1 = 2 : C14N 1.1 spec
    }
    

    Function: xmlC14NDocDumpMemory

    int	xmlC14NDocDumpMemory		(xmlDocPtr doc, 
    xmlNodeSetPtr nodes,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    xmlChar ** doc_txt_ptr)

    Dumps the canonized image of given XML document into memory. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

    doc:the XML document for canonization
    nodes:the nodes set to be included in the canonized image or NULL if all document nodes should be included
    mode:the c14n mode (see @xmlC14NMode)
    inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
    with_comments:include comments in the result (!=0) or not (==0)
    doc_txt_ptr:the memory pointer for allocated canonical XML text; the caller of this functions is responsible for calling xmlFree() to free allocated memory
    Returns:the number of bytes written on success or a negative value on fail

    Function: xmlC14NDocSave

    int	xmlC14NDocSave			(xmlDocPtr doc, 
    xmlNodeSetPtr nodes,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    const char * filename,
    int compression)

    Dumps the canonized image of given XML document into the file. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

    doc:the XML document for canonization
    nodes:the nodes set to be included in the canonized image or NULL if all document nodes should be included
    mode:the c14n mode (see @xmlC14NMode)
    inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
    with_comments:include comments in the result (!=0) or not (==0)
    filename:the filename to store canonical XML image
    compression:the compression level (zlib requred): -1 - libxml default, 0 - uncompressed, >0 - compression level
    Returns:the number of bytes written success or a negative value on fail

    Function: xmlC14NDocSaveTo

    int	xmlC14NDocSaveTo		(xmlDocPtr doc, 
    xmlNodeSetPtr nodes,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    xmlOutputBufferPtr buf)

    Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

    doc:the XML document for canonization
    nodes:the nodes set to be included in the canonized image or NULL if all document nodes should be included
    mode:the c14n mode (see @xmlC14NMode)
    inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
    with_comments:include comments in the result (!=0) or not (==0)
    buf:the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output
    Returns:non-negative value on success or a negative value on fail

    Function: xmlC14NExecute

    int	xmlC14NExecute			(xmlDocPtr doc, 
    xmlC14NIsVisibleCallback is_visible_callback,
    void * user_data,
    int mode,
    xmlChar ** inclusive_ns_prefixes,
    int with_comments,
    xmlOutputBufferPtr buf)

    Dumps the canonized image of given XML document into the provided buffer. For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n)

    doc:the XML document for canonization
    is_visible_callback:the function to use to determine is node visible or not
    user_data:the first parameter for @is_visible_callback function (in most cases, it is nodes set)
    mode:the c14n mode (see @xmlC14NMode)
    inclusive_ns_prefixes:the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise)
    with_comments:include comments in the result (!=0) or not (==0)
    buf:the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output
    Returns:non-negative value on success or a negative value on fail

    Function type: xmlC14NIsVisibleCallback

    Function type: xmlC14NIsVisibleCallback
    int	xmlC14NIsVisibleCallback	(void * user_data, 
    xmlNodePtr node,
    xmlNodePtr parent)

    Signature for a C14N callback on visible nodes

    user_data:user data
    node:the curent node
    parent:the parent node
    Returns:1 if the node should be included

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlreader.html0000644000175000017500000033672312134171043020435 0ustar aronaron Module xmlreader from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlreader from libxml2

    API Menu
    API Indexes
    Related links

    API of the XML streaming API based on C# interfaces.

    Table of Contents

    Enum xmlParserProperties
    
    Enum xmlParserSeverities
    
    Enum xmlReaderTypes
    
    Structure xmlTextReader
    struct _xmlTextReader The content of this structure is not made public by the API.
    Typedef void * xmlTextReaderLocatorPtr
    
    Enum xmlTextReaderMode
    
    Typedef xmlTextReader * xmlTextReaderPtr
    
    void	xmlFreeTextReader		(xmlTextReaderPtr reader)
    xmlTextReaderPtr	xmlNewTextReader	(xmlParserInputBufferPtr input, 
    const char * URI)
    xmlTextReaderPtr	xmlNewTextReaderFilename	(const char * URI)
    xmlTextReaderPtr	xmlReaderForDoc	(const xmlChar * cur, 
    const char * URL,
    const char * encoding,
    int options)
    xmlTextReaderPtr	xmlReaderForFd	(int fd, 
    const char * URL,
    const char * encoding,
    int options)
    xmlTextReaderPtr	xmlReaderForFile	(const char * filename, 
    const char * encoding,
    int options)
    xmlTextReaderPtr	xmlReaderForIO	(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)
    xmlTextReaderPtr	xmlReaderForMemory	(const char * buffer, 
    int size,
    const char * URL,
    const char * encoding,
    int options)
    int	xmlReaderNewDoc			(xmlTextReaderPtr reader, 
    const xmlChar * cur,
    const char * URL,
    const char * encoding,
    int options)
    int	xmlReaderNewFd			(xmlTextReaderPtr reader, 
    int fd,
    const char * URL,
    const char * encoding,
    int options)
    int	xmlReaderNewFile		(xmlTextReaderPtr reader, 
    const char * filename,
    const char * encoding,
    int options)
    int	xmlReaderNewIO			(xmlTextReaderPtr reader, 
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)
    int	xmlReaderNewMemory		(xmlTextReaderPtr reader, 
    const char * buffer,
    int size,
    const char * URL,
    const char * encoding,
    int options)
    int	xmlReaderNewWalker		(xmlTextReaderPtr reader, 
    xmlDocPtr doc)
    xmlTextReaderPtr	xmlReaderWalker	(xmlDocPtr doc)
    int	xmlTextReaderAttributeCount	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderBaseUri	(xmlTextReaderPtr reader)
    long	xmlTextReaderByteConsumed	(xmlTextReaderPtr reader)
    int	xmlTextReaderClose		(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstBaseUri	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstEncoding	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstLocalName	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstName	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstNamespaceUri	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstPrefix	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstString	(xmlTextReaderPtr reader, 
    const xmlChar * str)
    const xmlChar *	xmlTextReaderConstValue	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstXmlLang	(xmlTextReaderPtr reader)
    const xmlChar *	xmlTextReaderConstXmlVersion	(xmlTextReaderPtr reader)
    xmlDocPtr	xmlTextReaderCurrentDoc	(xmlTextReaderPtr reader)
    xmlNodePtr	xmlTextReaderCurrentNode	(xmlTextReaderPtr reader)
    int	xmlTextReaderDepth		(xmlTextReaderPtr reader)
    Function type: xmlTextReaderErrorFunc
    void	xmlTextReaderErrorFunc		(void * arg, 
    const char * msg,
    xmlParserSeverities severity,
    xmlTextReaderLocatorPtr locator)
    xmlNodePtr	xmlTextReaderExpand	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderGetAttribute	(xmlTextReaderPtr reader, 
    const xmlChar * name)
    xmlChar *	xmlTextReaderGetAttributeNo	(xmlTextReaderPtr reader, 
    int no)
    xmlChar *	xmlTextReaderGetAttributeNs	(xmlTextReaderPtr reader, 
    const xmlChar * localName,
    const xmlChar * namespaceURI)
    void	xmlTextReaderGetErrorHandler	(xmlTextReaderPtr reader, 
    xmlTextReaderErrorFunc * f,
    void ** arg)
    int	xmlTextReaderGetParserColumnNumber	(xmlTextReaderPtr reader)
    int	xmlTextReaderGetParserLineNumber	(xmlTextReaderPtr reader)
    int	xmlTextReaderGetParserProp	(xmlTextReaderPtr reader, 
    int prop)
    xmlParserInputBufferPtr	xmlTextReaderGetRemainder	(xmlTextReaderPtr reader)
    int	xmlTextReaderHasAttributes	(xmlTextReaderPtr reader)
    int	xmlTextReaderHasValue		(xmlTextReaderPtr reader)
    int	xmlTextReaderIsDefault		(xmlTextReaderPtr reader)
    int	xmlTextReaderIsEmptyElement	(xmlTextReaderPtr reader)
    int	xmlTextReaderIsNamespaceDecl	(xmlTextReaderPtr reader)
    int	xmlTextReaderIsValid		(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderLocalName	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderLocatorBaseURI	(xmlTextReaderLocatorPtr locator)
    int	xmlTextReaderLocatorLineNumber	(xmlTextReaderLocatorPtr locator)
    xmlChar *	xmlTextReaderLookupNamespace	(xmlTextReaderPtr reader, 
    const xmlChar * prefix)
    int	xmlTextReaderMoveToAttribute	(xmlTextReaderPtr reader, 
    const xmlChar * name)
    int	xmlTextReaderMoveToAttributeNo	(xmlTextReaderPtr reader, 
    int no)
    int	xmlTextReaderMoveToAttributeNs	(xmlTextReaderPtr reader, 
    const xmlChar * localName,
    const xmlChar * namespaceURI)
    int	xmlTextReaderMoveToElement	(xmlTextReaderPtr reader)
    int	xmlTextReaderMoveToFirstAttribute	(xmlTextReaderPtr reader)
    int	xmlTextReaderMoveToNextAttribute	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderName	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderNamespaceUri	(xmlTextReaderPtr reader)
    int	xmlTextReaderNext		(xmlTextReaderPtr reader)
    int	xmlTextReaderNextSibling	(xmlTextReaderPtr reader)
    int	xmlTextReaderNodeType		(xmlTextReaderPtr reader)
    int	xmlTextReaderNormalization	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderPrefix	(xmlTextReaderPtr reader)
    xmlNodePtr	xmlTextReaderPreserve	(xmlTextReaderPtr reader)
    int	xmlTextReaderPreservePattern	(xmlTextReaderPtr reader, 
    const xmlChar * pattern,
    const xmlChar ** namespaces)
    int	xmlTextReaderQuoteChar		(xmlTextReaderPtr reader)
    int	xmlTextReaderRead		(xmlTextReaderPtr reader)
    int	xmlTextReaderReadAttributeValue	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderReadInnerXml	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderReadOuterXml	(xmlTextReaderPtr reader)
    int	xmlTextReaderReadState		(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderReadString	(xmlTextReaderPtr reader)
    int	xmlTextReaderRelaxNGSetSchema	(xmlTextReaderPtr reader, 
    xmlRelaxNGPtr schema)
    int	xmlTextReaderRelaxNGValidate	(xmlTextReaderPtr reader, 
    const char * rng)
    int	xmlTextReaderRelaxNGValidateCtxt	(xmlTextReaderPtr reader, 
    xmlRelaxNGValidCtxtPtr ctxt,
    int options)
    int	xmlTextReaderSchemaValidate	(xmlTextReaderPtr reader, 
    const char * xsd)
    int	xmlTextReaderSchemaValidateCtxt	(xmlTextReaderPtr reader, 
    xmlSchemaValidCtxtPtr ctxt,
    int options)
    void	xmlTextReaderSetErrorHandler	(xmlTextReaderPtr reader, 
    xmlTextReaderErrorFunc f,
    void * arg)
    int	xmlTextReaderSetParserProp	(xmlTextReaderPtr reader, 
    int prop,
    int value)
    int	xmlTextReaderSetSchema		(xmlTextReaderPtr reader, 
    xmlSchemaPtr schema)
    void	xmlTextReaderSetStructuredErrorHandler	(xmlTextReaderPtr reader, 
    xmlStructuredErrorFunc f,
    void * arg)
    int	xmlTextReaderSetup		(xmlTextReaderPtr reader, 
    xmlParserInputBufferPtr input,
    const char * URL,
    const char * encoding,
    int options)
    int	xmlTextReaderStandalone		(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderValue	(xmlTextReaderPtr reader)
    xmlChar *	xmlTextReaderXmlLang	(xmlTextReaderPtr reader)

    Description

    Enum xmlParserProperties

    Enum xmlParserProperties {
        XML_PARSER_LOADDTD = 1
        XML_PARSER_DEFAULTATTRS = 2
        XML_PARSER_VALIDATE = 3
        XML_PARSER_SUBST_ENTITIES = 4
    }
    

    Enum xmlParserSeverities

    Enum xmlParserSeverities {
        XML_PARSER_SEVERITY_VALIDITY_WARNING = 1
        XML_PARSER_SEVERITY_VALIDITY_ERROR = 2
        XML_PARSER_SEVERITY_WARNING = 3
        XML_PARSER_SEVERITY_ERROR = 4
    }
    

    Enum xmlReaderTypes

    Enum xmlReaderTypes {
        XML_READER_TYPE_NONE = 0
        XML_READER_TYPE_ELEMENT = 1
        XML_READER_TYPE_ATTRIBUTE = 2
        XML_READER_TYPE_TEXT = 3
        XML_READER_TYPE_CDATA = 4
        XML_READER_TYPE_ENTITY_REFERENCE = 5
        XML_READER_TYPE_ENTITY = 6
        XML_READER_TYPE_PROCESSING_INSTRUCTION = 7
        XML_READER_TYPE_COMMENT = 8
        XML_READER_TYPE_DOCUMENT = 9
        XML_READER_TYPE_DOCUMENT_TYPE = 10
        XML_READER_TYPE_DOCUMENT_FRAGMENT = 11
        XML_READER_TYPE_NOTATION = 12
        XML_READER_TYPE_WHITESPACE = 13
        XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14
        XML_READER_TYPE_END_ELEMENT = 15
        XML_READER_TYPE_END_ENTITY = 16
        XML_READER_TYPE_XML_DECLARATION = 17
    }
    

    Structure xmlTextReader

    Structure xmlTextReader
    struct _xmlTextReader { The content of this structure is not made public by the API. }

    Enum xmlTextReaderMode

    Enum xmlTextReaderMode {
        XML_TEXTREADER_MODE_INITIAL = 0
        XML_TEXTREADER_MODE_INTERACTIVE = 1
        XML_TEXTREADER_MODE_ERROR = 2
        XML_TEXTREADER_MODE_EOF = 3
        XML_TEXTREADER_MODE_CLOSED = 4
        XML_TEXTREADER_MODE_READING = 5
    }
    
    Pointer to an xmlReader context.

    Function: xmlFreeTextReader

    void	xmlFreeTextReader		(xmlTextReaderPtr reader)

    Deallocate all the resources associated to the reader

    reader:the xmlTextReaderPtr

    Function: xmlNewTextReader

    xmlTextReaderPtr	xmlNewTextReader	(xmlParserInputBufferPtr input, 
    const char * URI)

    Create an xmlTextReader structure fed with @input

    input:the xmlParserInputBufferPtr used to read data
    URI:the URI information for the source if available
    Returns:the new xmlTextReaderPtr or NULL in case of error

    Function: xmlNewTextReaderFilename

    xmlTextReaderPtr	xmlNewTextReaderFilename	(const char * URI)

    Create an xmlTextReader structure fed with the resource at @URI

    URI:the URI of the resource to process
    Returns:the new xmlTextReaderPtr or NULL in case of error

    Function: xmlReaderForDoc

    xmlTextReaderPtr	xmlReaderForDoc	(const xmlChar * cur, 
    const char * URL,
    const char * encoding,
    int options)

    Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption.

    cur:a pointer to a zero terminated string
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the new reader or NULL in case of error.

    Function: xmlReaderForFd

    xmlTextReaderPtr	xmlReaderForFd	(int fd, 
    const char * URL,
    const char * encoding,
    int options)

    Create an xmltextReader for an XML from a file descriptor. The parsing flags @options are a combination of xmlParserOption. NOTE that the file descriptor will not be closed when the reader is closed or reset.

    fd:an open file descriptor
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the new reader or NULL in case of error.

    Function: xmlReaderForFile

    xmlTextReaderPtr	xmlReaderForFile	(const char * filename, 
    const char * encoding,
    int options)

    parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption.

    filename:a file or URL
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the new reader or NULL in case of error.

    Function: xmlReaderForIO

    xmlTextReaderPtr	xmlReaderForIO	(xmlInputReadCallback ioread, 
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)

    Create an xmltextReader for an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption.

    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the new reader or NULL in case of error.

    Function: xmlReaderForMemory

    xmlTextReaderPtr	xmlReaderForMemory	(const char * buffer, 
    int size,
    const char * URL,
    const char * encoding,
    int options)

    Create an xmltextReader for an XML in-memory document. The parsing flags @options are a combination of xmlParserOption.

    buffer:a pointer to a char array
    size:the size of the array
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:the new reader or NULL in case of error.

    Function: xmlReaderNewDoc

    int	xmlReaderNewDoc			(xmlTextReaderPtr reader, 
    const xmlChar * cur,
    const char * URL,
    const char * encoding,
    int options)

    Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

    reader:an XML reader
    cur:a pointer to a zero terminated string
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:0 in case of success and -1 in case of error

    Function: xmlReaderNewFd

    int	xmlReaderNewFd			(xmlTextReaderPtr reader, 
    int fd,
    const char * URL,
    const char * encoding,
    int options)

    Setup an xmltextReader to parse an XML from a file descriptor. NOTE that the file descriptor will not be closed when the reader is closed or reset. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

    reader:an XML reader
    fd:an open file descriptor
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:0 in case of success and -1 in case of error

    Function: xmlReaderNewFile

    int	xmlReaderNewFile		(xmlTextReaderPtr reader, 
    const char * filename,
    const char * encoding,
    int options)

    parse an XML file from the filesystem or the network. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

    reader:an XML reader
    filename:a file or URL
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:0 in case of success and -1 in case of error

    Function: xmlReaderNewIO

    int	xmlReaderNewIO			(xmlTextReaderPtr reader, 
    xmlInputReadCallback ioread,
    xmlInputCloseCallback ioclose,
    void * ioctx,
    const char * URL,
    const char * encoding,
    int options)

    Setup an xmltextReader to parse an XML document from I/O functions and source. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

    reader:an XML reader
    ioread:an I/O read function
    ioclose:an I/O close function
    ioctx:an I/O handler
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:0 in case of success and -1 in case of error

    Function: xmlReaderNewMemory

    int	xmlReaderNewMemory		(xmlTextReaderPtr reader, 
    const char * buffer,
    int size,
    const char * URL,
    const char * encoding,
    int options)

    Setup an xmltextReader to parse an XML in-memory document. The parsing flags @options are a combination of xmlParserOption. This reuses the existing @reader xmlTextReader.

    reader:an XML reader
    buffer:a pointer to a char array
    size:the size of the array
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:0 in case of success and -1 in case of error

    Function: xmlReaderNewWalker

    int	xmlReaderNewWalker		(xmlTextReaderPtr reader, 
    xmlDocPtr doc)

    Setup an xmltextReader to parse a preparsed XML document. This reuses the existing @reader xmlTextReader.

    reader:an XML reader
    doc:a preparsed document
    Returns:0 in case of success and -1 in case of error

    Function: xmlReaderWalker

    xmlTextReaderPtr	xmlReaderWalker	(xmlDocPtr doc)

    Create an xmltextReader for a preparsed document.

    doc:a preparsed document
    Returns:the new reader or NULL in case of error.

    Function: xmlTextReaderAttributeCount

    int	xmlTextReaderAttributeCount	(xmlTextReaderPtr reader)

    Provides the number of attributes of the current node

    reader:the xmlTextReaderPtr used
    Returns:0 i no attributes, -1 in case of error or the attribute count

    Function: xmlTextReaderBaseUri

    xmlChar *	xmlTextReaderBaseUri	(xmlTextReaderPtr reader)

    The base URI of the node.

    reader:the xmlTextReaderPtr used
    Returns:the base URI or NULL if not available, if non NULL it need to be freed by the caller.

    Function: xmlTextReaderByteConsumed

    long	xmlTextReaderByteConsumed	(xmlTextReaderPtr reader)

    This function provides the current index of the parser used by the reader, relative to the start of the current entity. This function actually just wraps a call to xmlBytesConsumed() for the parser context associated with the reader. See xmlBytesConsumed() for more information.

    reader:an XML reader
    Returns:the index in bytes from the beginning of the entity or -1 in case the index could not be computed.

    Function: xmlTextReaderClose

    int	xmlTextReaderClose		(xmlTextReaderPtr reader)

    This method releases any resources allocated by the current instance changes the state to Closed and close any underlying input.

    reader:the xmlTextReaderPtr used
    Returns:0 or -1 in case of error

    Function: xmlTextReaderConstBaseUri

    const xmlChar *	xmlTextReaderConstBaseUri	(xmlTextReaderPtr reader)

    The base URI of the node.

    reader:the xmlTextReaderPtr used
    Returns:the base URI or NULL if not available, the string will be deallocated with the reader

    Function: xmlTextReaderConstEncoding

    const xmlChar *	xmlTextReaderConstEncoding	(xmlTextReaderPtr reader)

    Determine the encoding of the document being read.

    reader:the xmlTextReaderPtr used
    Returns:a string containing the encoding of the document or NULL in case of error. The string is deallocated with the reader.

    Function: xmlTextReaderConstLocalName

    const xmlChar *	xmlTextReaderConstLocalName	(xmlTextReaderPtr reader)

    The local name of the node.

    reader:the xmlTextReaderPtr used
    Returns:the local name or NULL if not available, the string will be deallocated with the reader.

    Function: xmlTextReaderConstName

    const xmlChar *	xmlTextReaderConstName	(xmlTextReaderPtr reader)

    The qualified name of the node, equal to Prefix :LocalName.

    reader:the xmlTextReaderPtr used
    Returns:the local name or NULL if not available, the string is deallocated with the reader.

    Function: xmlTextReaderConstNamespaceUri

    const xmlChar *	xmlTextReaderConstNamespaceUri	(xmlTextReaderPtr reader)

    The URI defining the namespace associated with the node.

    reader:the xmlTextReaderPtr used
    Returns:the namespace URI or NULL if not available, the string will be deallocated with the reader

    Function: xmlTextReaderConstPrefix

    const xmlChar *	xmlTextReaderConstPrefix	(xmlTextReaderPtr reader)

    A shorthand reference to the namespace associated with the node.

    reader:the xmlTextReaderPtr used
    Returns:the prefix or NULL if not available, the string is deallocated with the reader.

    Function: xmlTextReaderConstString

    const xmlChar *	xmlTextReaderConstString	(xmlTextReaderPtr reader, 
    const xmlChar * str)

    Get an interned string from the reader, allows for example to speedup string name comparisons

    reader:the xmlTextReaderPtr used
    str:the string to intern.
    Returns:an interned copy of the string or NULL in case of error. The string will be deallocated with the reader.

    Function: xmlTextReaderConstValue

    const xmlChar *	xmlTextReaderConstValue	(xmlTextReaderPtr reader)

    Provides the text value of the node if present

    reader:the xmlTextReaderPtr used
    Returns:the string or NULL if not available. The result will be deallocated on the next Read() operation.

    Function: xmlTextReaderConstXmlLang

    const xmlChar *	xmlTextReaderConstXmlLang	(xmlTextReaderPtr reader)

    The xml:lang scope within which the node resides.

    reader:the xmlTextReaderPtr used
    Returns:the xml:lang value or NULL if none exists.

    Function: xmlTextReaderConstXmlVersion

    const xmlChar *	xmlTextReaderConstXmlVersion	(xmlTextReaderPtr reader)

    Determine the XML version of the document being read.

    reader:the xmlTextReaderPtr used
    Returns:a string containing the XML version of the document or NULL in case of error. The string is deallocated with the reader.

    Function: xmlTextReaderCurrentDoc

    xmlDocPtr	xmlTextReaderCurrentDoc	(xmlTextReaderPtr reader)

    Hacking interface allowing to get the xmlDocPtr correponding to the current document being accessed by the xmlTextReader. NOTE: as a result of this call, the reader will not destroy the associated XML document and calling xmlFreeDoc() on the result is needed once the reader parsing has finished.

    reader:the xmlTextReaderPtr used
    Returns:the xmlDocPtr or NULL in case of error.

    Function: xmlTextReaderCurrentNode

    xmlNodePtr	xmlTextReaderCurrentNode	(xmlTextReaderPtr reader)

    Hacking interface allowing to get the xmlNodePtr correponding to the current node being accessed by the xmlTextReader. This is dangerous because the underlying node may be destroyed on the next Reads.

    reader:the xmlTextReaderPtr used
    Returns:the xmlNodePtr or NULL in case of error.

    Function: xmlTextReaderDepth

    int	xmlTextReaderDepth		(xmlTextReaderPtr reader)

    The depth of the node in the tree.

    reader:the xmlTextReaderPtr used
    Returns:the depth or -1 in case of error

    Function type: xmlTextReaderErrorFunc

    Function type: xmlTextReaderErrorFunc
    void	xmlTextReaderErrorFunc		(void * arg, 
    const char * msg,
    xmlParserSeverities severity,
    xmlTextReaderLocatorPtr locator)

    Signature of an error callback from a reader parser

    arg:the user argument
    msg:the message
    severity:the severity of the error
    locator:a locator indicating where the error occured

    Function: xmlTextReaderExpand

    xmlNodePtr	xmlTextReaderExpand	(xmlTextReaderPtr reader)

    Reads the contents of the current node and the full subtree. It then makes the subtree available until the next xmlTextReaderRead() call

    reader:the xmlTextReaderPtr used
    Returns:a node pointer valid until the next xmlTextReaderRead() call or NULL in case of error.

    Function: xmlTextReaderGetAttribute

    xmlChar *	xmlTextReaderGetAttribute	(xmlTextReaderPtr reader, 
    const xmlChar * name)

    Provides the value of the attribute with the specified qualified name.

    reader:the xmlTextReaderPtr used
    name:the qualified name of the attribute.
    Returns:a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.

    Function: xmlTextReaderGetAttributeNo

    xmlChar *	xmlTextReaderGetAttributeNo	(xmlTextReaderPtr reader, 
    int no)

    Provides the value of the attribute with the specified index relative to the containing element.

    reader:the xmlTextReaderPtr used
    no:the zero-based index of the attribute relative to the containing element
    Returns:a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.

    Function: xmlTextReaderGetAttributeNs

    xmlChar *	xmlTextReaderGetAttributeNs	(xmlTextReaderPtr reader, 
    const xmlChar * localName,
    const xmlChar * namespaceURI)

    Provides the value of the specified attribute

    reader:the xmlTextReaderPtr used
    localName:the local name of the attribute.
    namespaceURI:the namespace URI of the attribute.
    Returns:a string containing the value of the specified attribute, or NULL in case of error. The string must be deallocated by the caller.

    Function: xmlTextReaderGetErrorHandler

    void	xmlTextReaderGetErrorHandler	(xmlTextReaderPtr reader, 
    xmlTextReaderErrorFunc * f,
    void ** arg)

    Retrieve the error callback function and user argument.

    reader:the xmlTextReaderPtr used
    f:the callback function or NULL is no callback has been registered
    arg:a user argument

    Function: xmlTextReaderGetParserColumnNumber

    int	xmlTextReaderGetParserColumnNumber	(xmlTextReaderPtr reader)

    Provide the column number of the current parsing point.

    reader:the user data (XML reader context)
    Returns:an int or 0 if not available

    Function: xmlTextReaderGetParserLineNumber

    int	xmlTextReaderGetParserLineNumber	(xmlTextReaderPtr reader)

    Provide the line number of the current parsing point.

    reader:the user data (XML reader context)
    Returns:an int or 0 if not available

    Function: xmlTextReaderGetParserProp

    int	xmlTextReaderGetParserProp	(xmlTextReaderPtr reader, 
    int prop)

    Read the parser internal property.

    reader:the xmlTextReaderPtr used
    prop:the xmlParserProperties to get
    Returns:the value, usually 0 or 1, or -1 in case of error.

    Function: xmlTextReaderGetRemainder

    xmlParserInputBufferPtr	xmlTextReaderGetRemainder	(xmlTextReaderPtr reader)

    Method to get the remainder of the buffered XML. this method stops the parser, set its state to End Of File and return the input stream with what is left that the parser did not use. The implementation is not good, the parser certainly procgressed past what's left in reader->input, and there is an allocation problem. Best would be to rewrite it differently.

    reader:the xmlTextReaderPtr used
    Returns:the xmlParserInputBufferPtr attached to the XML or NULL in case of error.

    Function: xmlTextReaderHasAttributes

    int	xmlTextReaderHasAttributes	(xmlTextReaderPtr reader)

    Whether the node has attributes.

    reader:the xmlTextReaderPtr used
    Returns:1 if true, 0 if false, and -1 in case or error

    Function: xmlTextReaderHasValue

    int	xmlTextReaderHasValue		(xmlTextReaderPtr reader)

    Whether the node can have a text value.

    reader:the xmlTextReaderPtr used
    Returns:1 if true, 0 if false, and -1 in case or error

    Function: xmlTextReaderIsDefault

    int	xmlTextReaderIsDefault		(xmlTextReaderPtr reader)

    Whether an Attribute node was generated from the default value defined in the DTD or schema.

    reader:the xmlTextReaderPtr used
    Returns:0 if not defaulted, 1 if defaulted, and -1 in case of error

    Function: xmlTextReaderIsEmptyElement

    int	xmlTextReaderIsEmptyElement	(xmlTextReaderPtr reader)

    Check if the current node is empty

    reader:the xmlTextReaderPtr used
    Returns:1 if empty, 0 if not and -1 in case of error

    Function: xmlTextReaderIsNamespaceDecl

    int	xmlTextReaderIsNamespaceDecl	(xmlTextReaderPtr reader)

    Determine whether the current node is a namespace declaration rather than a regular attribute.

    reader:the xmlTextReaderPtr used
    Returns:1 if the current node is a namespace declaration, 0 if it is a regular attribute or other type of node, or -1 in case of error.

    Function: xmlTextReaderIsValid

    int	xmlTextReaderIsValid		(xmlTextReaderPtr reader)

    Retrieve the validity status from the parser context

    reader:the xmlTextReaderPtr used
    Returns:the flag value 1 if valid, 0 if no, and -1 in case of error

    Function: xmlTextReaderLocalName

    xmlChar *	xmlTextReaderLocalName	(xmlTextReaderPtr reader)

    The local name of the node.

    reader:the xmlTextReaderPtr used
    Returns:the local name or NULL if not available, if non NULL it need to be freed by the caller.

    Function: xmlTextReaderLocatorBaseURI

    xmlChar *	xmlTextReaderLocatorBaseURI	(xmlTextReaderLocatorPtr locator)

    Obtain the base URI for the given locator.

    locator:the xmlTextReaderLocatorPtr used
    Returns:the base URI or NULL in case of error, if non NULL it need to be freed by the caller.

    Function: xmlTextReaderLocatorLineNumber

    int	xmlTextReaderLocatorLineNumber	(xmlTextReaderLocatorPtr locator)

    Obtain the line number for the given locator.

    locator:the xmlTextReaderLocatorPtr used
    Returns:the line number or -1 in case of error.

    Function: xmlTextReaderLookupNamespace

    xmlChar *	xmlTextReaderLookupNamespace	(xmlTextReaderPtr reader, 
    const xmlChar * prefix)

    Resolves a namespace prefix in the scope of the current element.

    reader:the xmlTextReaderPtr used
    prefix:the prefix whose namespace URI is to be resolved. To return the default namespace, specify NULL
    Returns:a string containing the namespace URI to which the prefix maps or NULL in case of error. The string must be deallocated by the caller.

    Function: xmlTextReaderMoveToAttribute

    int	xmlTextReaderMoveToAttribute	(xmlTextReaderPtr reader, 
    const xmlChar * name)

    Moves the position of the current instance to the attribute with the specified qualified name.

    reader:the xmlTextReaderPtr used
    name:the qualified name of the attribute.
    Returns:1 in case of success, -1 in case of error, 0 if not found

    Function: xmlTextReaderMoveToAttributeNo

    int	xmlTextReaderMoveToAttributeNo	(xmlTextReaderPtr reader, 
    int no)

    Moves the position of the current instance to the attribute with the specified index relative to the containing element.

    reader:the xmlTextReaderPtr used
    no:the zero-based index of the attribute relative to the containing element.
    Returns:1 in case of success, -1 in case of error, 0 if not found

    Function: xmlTextReaderMoveToAttributeNs

    int	xmlTextReaderMoveToAttributeNs	(xmlTextReaderPtr reader, 
    const xmlChar * localName,
    const xmlChar * namespaceURI)

    Moves the position of the current instance to the attribute with the specified local name and namespace URI.

    reader:the xmlTextReaderPtr used
    localName:the local name of the attribute.
    namespaceURI:the namespace URI of the attribute.
    Returns:1 in case of success, -1 in case of error, 0 if not found

    Function: xmlTextReaderMoveToElement

    int	xmlTextReaderMoveToElement	(xmlTextReaderPtr reader)

    Moves the position of the current instance to the node that contains the current Attribute node.

    reader:the xmlTextReaderPtr used
    Returns:1 in case of success, -1 in case of error, 0 if not moved

    Function: xmlTextReaderMoveToFirstAttribute

    int	xmlTextReaderMoveToFirstAttribute	(xmlTextReaderPtr reader)

    Moves the position of the current instance to the first attribute associated with the current node.

    reader:the xmlTextReaderPtr used
    Returns:1 in case of success, -1 in case of error, 0 if not found

    Function: xmlTextReaderMoveToNextAttribute

    int	xmlTextReaderMoveToNextAttribute	(xmlTextReaderPtr reader)

    Moves the position of the current instance to the next attribute associated with the current node.

    reader:the xmlTextReaderPtr used
    Returns:1 in case of success, -1 in case of error, 0 if not found

    Function: xmlTextReaderName

    xmlChar *	xmlTextReaderName	(xmlTextReaderPtr reader)

    The qualified name of the node, equal to Prefix :LocalName.

    reader:the xmlTextReaderPtr used
    Returns:the local name or NULL if not available, if non NULL it need to be freed by the caller.

    Function: xmlTextReaderNamespaceUri

    xmlChar *	xmlTextReaderNamespaceUri	(xmlTextReaderPtr reader)

    The URI defining the namespace associated with the node.

    reader:the xmlTextReaderPtr used
    Returns:the namespace URI or NULL if not available, if non NULL it need to be freed by the caller.

    Function: xmlTextReaderNext

    int	xmlTextReaderNext		(xmlTextReaderPtr reader)

    Skip to the node following the current one in document order while avoiding the subtree if any.

    reader:the xmlTextReaderPtr used
    Returns:1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error

    Function: xmlTextReaderNextSibling

    int	xmlTextReaderNextSibling	(xmlTextReaderPtr reader)

    Skip to the node following the current one in document order while avoiding the subtree if any. Currently implemented only for Readers built on a document

    reader:the xmlTextReaderPtr used
    Returns:1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error

    Function: xmlTextReaderNodeType

    int	xmlTextReaderNodeType		(xmlTextReaderPtr reader)

    Get the node type of the current node Reference: http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html

    reader:the xmlTextReaderPtr used
    Returns:the xmlNodeType of the current node or -1 in case of error

    Function: xmlTextReaderNormalization

    int	xmlTextReaderNormalization	(xmlTextReaderPtr reader)

    The value indicating whether to normalize white space and attribute values. Since attribute value and end of line normalizations are a MUST in the XML specification only the value true is accepted. The broken bahaviour of accepting out of range character entities like &#0; is of course not supported either.

    reader:the xmlTextReaderPtr used
    Returns:1 or -1 in case of error.

    Function: xmlTextReaderPrefix

    xmlChar *	xmlTextReaderPrefix	(xmlTextReaderPtr reader)

    A shorthand reference to the namespace associated with the node.

    reader:the xmlTextReaderPtr used
    Returns:the prefix or NULL if not available, if non NULL it need to be freed by the caller.

    Function: xmlTextReaderPreserve

    xmlNodePtr	xmlTextReaderPreserve	(xmlTextReaderPtr reader)

    This tells the XML Reader to preserve the current node. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished

    reader:the xmlTextReaderPtr used
    Returns:the xmlNodePtr or NULL in case of error.

    Function: xmlTextReaderPreservePattern

    int	xmlTextReaderPreservePattern	(xmlTextReaderPtr reader, 
    const xmlChar * pattern,
    const xmlChar ** namespaces)

    This tells the XML Reader to preserve all nodes matched by the pattern. The caller must also use xmlTextReaderCurrentDoc() to keep an handle on the resulting document once parsing has finished

    reader:the xmlTextReaderPtr used
    pattern:an XPath subset pattern
    namespaces:the prefix definitions, array of [URI, prefix] or NULL
    Returns:a positive number in case of success and -1 in case of error

    Function: xmlTextReaderQuoteChar

    int	xmlTextReaderQuoteChar		(xmlTextReaderPtr reader)

    The quotation mark character used to enclose the value of an attribute.

    reader:the xmlTextReaderPtr used
    Returns:" or ' and -1 in case of error

    Function: xmlTextReaderRead

    int	xmlTextReaderRead		(xmlTextReaderPtr reader)

    Moves the position of the current instance to the next node in the stream, exposing its properties.

    reader:the xmlTextReaderPtr used
    Returns:1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error

    Function: xmlTextReaderReadAttributeValue

    int	xmlTextReaderReadAttributeValue	(xmlTextReaderPtr reader)

    Parses an attribute value into one or more Text and EntityReference nodes.

    reader:the xmlTextReaderPtr used
    Returns:1 in case of success, 0 if the reader was not positionned on an ttribute node or all the attribute values have been read, or -1 in case of error.

    Function: xmlTextReaderReadInnerXml

    xmlChar *	xmlTextReaderReadInnerXml	(xmlTextReaderPtr reader)

    Reads the contents of the current node, including child nodes and markup.

    reader:the xmlTextReaderPtr used
    Returns:a string containing the XML content, or NULL if the current node is neither an element nor attribute, or has no child nodes. The string must be deallocated by the caller.

    Function: xmlTextReaderReadOuterXml

    xmlChar *	xmlTextReaderReadOuterXml	(xmlTextReaderPtr reader)

    Reads the contents of the current node, including child nodes and markup.

    reader:the xmlTextReaderPtr used
    Returns:a string containing the node and any XML content, or NULL if the current node cannot be serialized. The string must be deallocated by the caller.

    Function: xmlTextReaderReadState

    int	xmlTextReaderReadState		(xmlTextReaderPtr reader)

    Gets the read state of the reader.

    reader:the xmlTextReaderPtr used
    Returns:the state value, or -1 in case of error

    Function: xmlTextReaderReadString

    xmlChar *	xmlTextReaderReadString	(xmlTextReaderPtr reader)

    Reads the contents of an element or a text node as a string.

    reader:the xmlTextReaderPtr used
    Returns:a string containing the contents of the Element or Text node, or NULL if the reader is positioned on any other type of node. The string must be deallocated by the caller.

    Function: xmlTextReaderRelaxNGSetSchema

    int	xmlTextReaderRelaxNGSetSchema	(xmlTextReaderPtr reader, 
    xmlRelaxNGPtr schema)

    Use RelaxNG to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then RelaxNG validation is desactivated. @ The @schema should not be freed until the reader is deallocated or its use has been deactivated.

    reader:the xmlTextReaderPtr used
    schema:a precompiled RelaxNG schema
    Returns:0 in case the RelaxNG validation could be (des)activated and -1 in case of error.

    Function: xmlTextReaderRelaxNGValidate

    int	xmlTextReaderRelaxNGValidate	(xmlTextReaderPtr reader, 
    const char * rng)

    Use RelaxNG schema to validate the document as it is processed. Activation is only possible before the first Read(). If @rng is NULL, then RelaxNG schema validation is deactivated.

    reader:the xmlTextReaderPtr used
    rng:the path to a RelaxNG schema or NULL
    Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

    Function: xmlTextReaderRelaxNGValidateCtxt

    int	xmlTextReaderRelaxNGValidateCtxt	(xmlTextReaderPtr reader, 
    xmlRelaxNGValidCtxtPtr ctxt,
    int options)

    Use RelaxNG schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then RelaxNG schema validation is deactivated.

    reader:the xmlTextReaderPtr used
    ctxt:the RelaxNG schema validation context or NULL
    options:options (not used yet)
    Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

    Function: xmlTextReaderSchemaValidate

    int	xmlTextReaderSchemaValidate	(xmlTextReaderPtr reader, 
    const char * xsd)

    Use W3C XSD schema to validate the document as it is processed. Activation is only possible before the first Read(). If @xsd is NULL, then XML Schema validation is deactivated.

    reader:the xmlTextReaderPtr used
    xsd:the path to a W3C XSD schema or NULL
    Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

    Function: xmlTextReaderSchemaValidateCtxt

    int	xmlTextReaderSchemaValidateCtxt	(xmlTextReaderPtr reader, 
    xmlSchemaValidCtxtPtr ctxt,
    int options)

    Use W3C XSD schema context to validate the document as it is processed. Activation is only possible before the first Read(). If @ctxt is NULL, then XML Schema validation is deactivated.

    reader:the xmlTextReaderPtr used
    ctxt:the XML Schema validation context or NULL
    options:options (not used yet)
    Returns:0 in case the schemas validation could be (de)activated and -1 in case of error.

    Function: xmlTextReaderSetErrorHandler

    void	xmlTextReaderSetErrorHandler	(xmlTextReaderPtr reader, 
    xmlTextReaderErrorFunc f,
    void * arg)

    Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored.

    reader:the xmlTextReaderPtr used
    f:the callback function to call on error and warnings
    arg:a user argument to pass to the callback function

    Function: xmlTextReaderSetParserProp

    int	xmlTextReaderSetParserProp	(xmlTextReaderPtr reader, 
    int prop,
    int value)

    Change the parser processing behaviour by changing some of its internal properties. Note that some properties can only be changed before any read has been done.

    reader:the xmlTextReaderPtr used
    prop:the xmlParserProperties to set
    value:usually 0 or 1 to (de)activate it
    Returns:0 if the call was successful, or -1 in case of error

    Function: xmlTextReaderSetSchema

    int	xmlTextReaderSetSchema		(xmlTextReaderPtr reader, 
    xmlSchemaPtr schema)

    Use XSD Schema to validate the document as it is processed. Activation is only possible before the first Read(). if @schema is NULL, then Schema validation is desactivated. @ The @schema should not be freed until the reader is deallocated or its use has been deactivated.

    reader:the xmlTextReaderPtr used
    schema:a precompiled Schema schema
    Returns:0 in case the Schema validation could be (des)activated and -1 in case of error.

    Function: xmlTextReaderSetStructuredErrorHandler

    void	xmlTextReaderSetStructuredErrorHandler	(xmlTextReaderPtr reader, 
    xmlStructuredErrorFunc f,
    void * arg)

    Register a callback function that will be called on error and warnings. If @f is NULL, the default error and warning handlers are restored.

    reader:the xmlTextReaderPtr used
    f:the callback function to call on error and warnings
    arg:a user argument to pass to the callback function

    Function: xmlTextReaderSetup

    int	xmlTextReaderSetup		(xmlTextReaderPtr reader, 
    xmlParserInputBufferPtr input,
    const char * URL,
    const char * encoding,
    int options)

    Setup an XML reader with new options

    reader:an XML reader
    input:xmlParserInputBufferPtr used to feed the reader, will be destroyed with it.
    URL:the base URL to use for the document
    encoding:the document encoding, or NULL
    options:a combination of xmlParserOption
    Returns:0 in case of success and -1 in case of error.

    Function: xmlTextReaderStandalone

    int	xmlTextReaderStandalone		(xmlTextReaderPtr reader)

    Determine the standalone status of the document being read.

    reader:the xmlTextReaderPtr used
    Returns:1 if the document was declared to be standalone, 0 if it was declared to be not standalone, or -1 if the document did not specify its standalone status or in case of error.

    Function: xmlTextReaderValue

    xmlChar *	xmlTextReaderValue	(xmlTextReaderPtr reader)

    Provides the text value of the node if present

    reader:the xmlTextReaderPtr used
    Returns:the string or NULL if not available. The result must be deallocated with xmlFree()

    Function: xmlTextReaderXmlLang

    xmlChar *	xmlTextReaderXmlLang	(xmlTextReaderPtr reader)

    The xml:lang scope within which the node resides.

    reader:the xmlTextReaderPtr used
    Returns:the xml:lang value or NULL if none exists., if non NULL it need to be freed by the caller.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-SAX2.html0000644000175000017500000012664112134171042017162 0ustar aronaron Module SAX2 from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module SAX2 from libxml2

    API Menu
    API Indexes
    Related links

    those are the default SAX2 interfaces used by the library when building DOM tree.

    Table of Contents

    void	docbDefaultSAXHandlerInit	(void)
    void	htmlDefaultSAXHandlerInit	(void)
    void	xmlDefaultSAXHandlerInit	(void)
    void	xmlSAX2AttributeDecl		(void * ctx, 
    const xmlChar * elem,
    const xmlChar * fullname,
    int type,
    int def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)
    void	xmlSAX2CDataBlock		(void * ctx, 
    const xmlChar * value,
    int len)
    void	xmlSAX2Characters		(void * ctx, 
    const xmlChar * ch,
    int len)
    void	xmlSAX2Comment			(void * ctx, 
    const xmlChar * value)
    void	xmlSAX2ElementDecl		(void * ctx, 
    const xmlChar * name,
    int type,
    xmlElementContentPtr content)
    void	xmlSAX2EndDocument		(void * ctx)
    void	xmlSAX2EndElement		(void * ctx, 
    const xmlChar * name)
    void	xmlSAX2EndElementNs		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI)
    void	xmlSAX2EntityDecl		(void * ctx, 
    const xmlChar * name,
    int type,
    const xmlChar * publicId,
    const xmlChar * systemId,
    xmlChar * content)
    void	xmlSAX2ExternalSubset		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    int	xmlSAX2GetColumnNumber		(void * ctx)
    xmlEntityPtr	xmlSAX2GetEntity	(void * ctx, 
    const xmlChar * name)
    int	xmlSAX2GetLineNumber		(void * ctx)
    xmlEntityPtr	xmlSAX2GetParameterEntity	(void * ctx, 
    const xmlChar * name)
    const xmlChar *	xmlSAX2GetPublicId	(void * ctx)
    const xmlChar *	xmlSAX2GetSystemId	(void * ctx)
    int	xmlSAX2HasExternalSubset	(void * ctx)
    int	xmlSAX2HasInternalSubset	(void * ctx)
    void	xmlSAX2IgnorableWhitespace	(void * ctx, 
    const xmlChar * ch,
    int len)
    void	xmlSAX2InitDefaultSAXHandler	(xmlSAXHandler * hdlr, 
    int warning)
    void	xmlSAX2InitDocbDefaultSAXHandler	(xmlSAXHandler * hdlr)
    void	xmlSAX2InitHtmlDefaultSAXHandler	(xmlSAXHandler * hdlr)
    void	xmlSAX2InternalSubset		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)
    int	xmlSAX2IsStandalone		(void * ctx)
    void	xmlSAX2NotationDecl		(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId)
    void	xmlSAX2ProcessingInstruction	(void * ctx, 
    const xmlChar * target,
    const xmlChar * data)
    void	xmlSAX2Reference		(void * ctx, 
    const xmlChar * name)
    xmlParserInputPtr	xmlSAX2ResolveEntity	(void * ctx, 
    const xmlChar * publicId,
    const xmlChar * systemId)
    void	xmlSAX2SetDocumentLocator	(void * ctx, 
    xmlSAXLocatorPtr loc)
    void	xmlSAX2StartDocument		(void * ctx)
    void	xmlSAX2StartElement		(void * ctx, 
    const xmlChar * fullname,
    const xmlChar ** atts)
    void	xmlSAX2StartElementNs		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI,
    int nb_namespaces,
    const xmlChar ** namespaces,
    int nb_attributes,
    int nb_defaulted,
    const xmlChar ** attributes)
    void	xmlSAX2UnparsedEntityDecl	(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId,
    const xmlChar * notationName)
    int	xmlSAXDefaultVersion		(int version)
    int	xmlSAXVersion			(xmlSAXHandler * hdlr, 
    int version)

    Description

    Function: docbDefaultSAXHandlerInit

    void	docbDefaultSAXHandlerInit	(void)

    Initialize the default SAX handler

    Function: htmlDefaultSAXHandlerInit

    void	htmlDefaultSAXHandlerInit	(void)

    Initialize the default SAX handler

    Function: xmlDefaultSAXHandlerInit

    void	xmlDefaultSAXHandlerInit	(void)

    Initialize the default SAX2 handler

    Function: xmlSAX2AttributeDecl

    void	xmlSAX2AttributeDecl		(void * ctx, 
    const xmlChar * elem,
    const xmlChar * fullname,
    int type,
    int def,
    const xmlChar * defaultValue,
    xmlEnumerationPtr tree)

    An attribute definition has been parsed

    ctx:the user data (XML parser context)
    elem:the name of the element
    fullname:the attribute name
    type:the attribute type
    def:the type of default value
    defaultValue:the attribute default value
    tree:the tree of enumerated value set

    Function: xmlSAX2CDataBlock

    void	xmlSAX2CDataBlock		(void * ctx, 
    const xmlChar * value,
    int len)

    called when a pcdata block has been parsed

    ctx:the user data (XML parser context)
    value:The pcdata content
    len:the block length

    Function: xmlSAX2Characters

    void	xmlSAX2Characters		(void * ctx, 
    const xmlChar * ch,
    int len)

    receiving some chars from the parser.

    ctx:the user data (XML parser context)
    ch:a xmlChar string
    len:the number of xmlChar

    Function: xmlSAX2Comment

    void	xmlSAX2Comment			(void * ctx, 
    const xmlChar * value)

    A xmlSAX2Comment has been parsed.

    ctx:the user data (XML parser context)
    value:the xmlSAX2Comment content

    Function: xmlSAX2ElementDecl

    void	xmlSAX2ElementDecl		(void * ctx, 
    const xmlChar * name,
    int type,
    xmlElementContentPtr content)

    An element definition has been parsed

    ctx:the user data (XML parser context)
    name:the element name
    type:the element type
    content:the element value tree

    Function: xmlSAX2EndDocument

    void	xmlSAX2EndDocument		(void * ctx)

    called when the document end has been detected.

    ctx:the user data (XML parser context)

    Function: xmlSAX2EndElement

    void	xmlSAX2EndElement		(void * ctx, 
    const xmlChar * name)

    called when the end of an element has been detected.

    ctx:the user data (XML parser context)
    name:The element name

    Function: xmlSAX2EndElementNs

    void	xmlSAX2EndElementNs		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI)

    SAX2 callback when an element end has been detected by the parser. It provides the namespace informations for the element.

    ctx:the user data (XML parser context)
    localname:the local name of the element
    prefix:the element namespace prefix if available
    URI:the element namespace name if available

    Function: xmlSAX2EntityDecl

    void	xmlSAX2EntityDecl		(void * ctx, 
    const xmlChar * name,
    int type,
    const xmlChar * publicId,
    const xmlChar * systemId,
    xmlChar * content)

    An entity definition has been parsed

    ctx:the user data (XML parser context)
    name:the entity name
    type:the entity type
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    content:the entity value (without processing).

    Function: xmlSAX2ExternalSubset

    void	xmlSAX2ExternalSubset		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Callback on external subset declaration.

    ctx:the user data (XML parser context)
    name:the root element name
    ExternalID:the external ID
    SystemID:the SYSTEM ID (e.g. filename or URL)

    Function: xmlSAX2GetColumnNumber

    int	xmlSAX2GetColumnNumber		(void * ctx)

    Provide the column number of the current parsing point.

    ctx:the user data (XML parser context)
    Returns:an int

    Function: xmlSAX2GetEntity

    xmlEntityPtr	xmlSAX2GetEntity	(void * ctx, 
    const xmlChar * name)

    Get an entity by name

    ctx:the user data (XML parser context)
    name:The entity name
    Returns:the xmlEntityPtr if found.

    Function: xmlSAX2GetLineNumber

    int	xmlSAX2GetLineNumber		(void * ctx)

    Provide the line number of the current parsing point.

    ctx:the user data (XML parser context)
    Returns:an int

    Function: xmlSAX2GetParameterEntity

    xmlEntityPtr	xmlSAX2GetParameterEntity	(void * ctx, 
    const xmlChar * name)

    Get a parameter entity by name

    ctx:the user data (XML parser context)
    name:The entity name
    Returns:the xmlEntityPtr if found.

    Function: xmlSAX2GetPublicId

    const xmlChar *	xmlSAX2GetPublicId	(void * ctx)

    Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN"

    ctx:the user data (XML parser context)
    Returns:a xmlChar *

    Function: xmlSAX2GetSystemId

    const xmlChar *	xmlSAX2GetSystemId	(void * ctx)

    Provides the system ID, basically URL or filename e.g. http://www.sgmlsource.com/dtds/memo.dtd

    ctx:the user data (XML parser context)
    Returns:a xmlChar *

    Function: xmlSAX2HasExternalSubset

    int	xmlSAX2HasExternalSubset	(void * ctx)

    Does this document has an external subset

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function: xmlSAX2HasInternalSubset

    int	xmlSAX2HasInternalSubset	(void * ctx)

    Does this document has an internal subset

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function: xmlSAX2IgnorableWhitespace

    void	xmlSAX2IgnorableWhitespace	(void * ctx, 
    const xmlChar * ch,
    int len)

    receiving some ignorable whitespaces from the parser. UNUSED: by default the DOM building will use xmlSAX2Characters

    ctx:the user data (XML parser context)
    ch:a xmlChar string
    len:the number of xmlChar

    Function: xmlSAX2InitDefaultSAXHandler

    void	xmlSAX2InitDefaultSAXHandler	(xmlSAXHandler * hdlr, 
    int warning)

    Initialize the default XML SAX2 handler

    hdlr:the SAX handler
    warning:flag if non-zero sets the handler warning procedure

    Function: xmlSAX2InitDocbDefaultSAXHandler

    void	xmlSAX2InitDocbDefaultSAXHandler	(xmlSAXHandler * hdlr)

    Initialize the default DocBook SAX2 handler

    hdlr:the SAX handler

    Function: xmlSAX2InitHtmlDefaultSAXHandler

    void	xmlSAX2InitHtmlDefaultSAXHandler	(xmlSAXHandler * hdlr)

    Initialize the default HTML SAX2 handler

    hdlr:the SAX handler

    Function: xmlSAX2InternalSubset

    void	xmlSAX2InternalSubset		(void * ctx, 
    const xmlChar * name,
    const xmlChar * ExternalID,
    const xmlChar * SystemID)

    Callback on internal subset declaration.

    ctx:the user data (XML parser context)
    name:the root element name
    ExternalID:the external ID
    SystemID:the SYSTEM ID (e.g. filename or URL)

    Function: xmlSAX2IsStandalone

    int	xmlSAX2IsStandalone		(void * ctx)

    Is this document tagged standalone ?

    ctx:the user data (XML parser context)
    Returns:1 if true

    Function: xmlSAX2NotationDecl

    void	xmlSAX2NotationDecl		(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId)

    What to do when a notation declaration has been parsed.

    ctx:the user data (XML parser context)
    name:The name of the notation
    publicId:The public ID of the entity
    systemId:The system ID of the entity

    Function: xmlSAX2ProcessingInstruction

    void	xmlSAX2ProcessingInstruction	(void * ctx, 
    const xmlChar * target,
    const xmlChar * data)

    A processing instruction has been parsed.

    ctx:the user data (XML parser context)
    target:the target name
    data:the PI data's

    Function: xmlSAX2Reference

    void	xmlSAX2Reference		(void * ctx, 
    const xmlChar * name)

    called when an entity xmlSAX2Reference is detected.

    ctx:the user data (XML parser context)
    name:The entity name

    Function: xmlSAX2ResolveEntity

    xmlParserInputPtr	xmlSAX2ResolveEntity	(void * ctx, 
    const xmlChar * publicId,
    const xmlChar * systemId)

    The entity loader, to control the loading of external entities, the application can either: - override this xmlSAX2ResolveEntity() callback in the SAX block - or better use the xmlSetExternalEntityLoader() function to set up it's own entity resolution routine

    ctx:the user data (XML parser context)
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    Returns:the xmlParserInputPtr if inlined or NULL for DOM behaviour.

    Function: xmlSAX2SetDocumentLocator

    void	xmlSAX2SetDocumentLocator	(void * ctx, 
    xmlSAXLocatorPtr loc)

    Receive the document locator at startup, actually xmlDefaultSAXLocator Everything is available on the context, so this is useless in our case.

    ctx:the user data (XML parser context)
    loc:A SAX Locator

    Function: xmlSAX2StartDocument

    void	xmlSAX2StartDocument		(void * ctx)

    called when the document start being processed.

    ctx:the user data (XML parser context)

    Function: xmlSAX2StartElement

    void	xmlSAX2StartElement		(void * ctx, 
    const xmlChar * fullname,
    const xmlChar ** atts)

    called when an opening tag has been processed.

    ctx:the user data (XML parser context)
    fullname:The element name, including namespace prefix
    atts:An array of name/value attributes pairs, NULL terminated

    Function: xmlSAX2StartElementNs

    void	xmlSAX2StartElementNs		(void * ctx, 
    const xmlChar * localname,
    const xmlChar * prefix,
    const xmlChar * URI,
    int nb_namespaces,
    const xmlChar ** namespaces,
    int nb_attributes,
    int nb_defaulted,
    const xmlChar ** attributes)

    SAX2 callback when an element start has been detected by the parser. It provides the namespace informations for the element, as well as the new namespace declarations on the element.

    ctx:the user data (XML parser context)
    localname:the local name of the element
    prefix:the element namespace prefix if available
    URI:the element namespace name if available
    nb_namespaces:number of namespace definitions on that node
    namespaces:pointer to the array of prefix/URI pairs namespace definitions
    nb_attributes:the number of attributes on that node
    nb_defaulted:the number of defaulted attributes.
    attributes:pointer to the array of (localname/prefix/URI/value/end) attribute values.

    Function: xmlSAX2UnparsedEntityDecl

    void	xmlSAX2UnparsedEntityDecl	(void * ctx, 
    const xmlChar * name,
    const xmlChar * publicId,
    const xmlChar * systemId,
    const xmlChar * notationName)

    What to do when an unparsed entity declaration is parsed

    ctx:the user data (XML parser context)
    name:The name of the entity
    publicId:The public ID of the entity
    systemId:The system ID of the entity
    notationName:the name of the notation

    Function: xmlSAXDefaultVersion

    int	xmlSAXDefaultVersion		(int version)

    Set the default version of SAX used globally by the library. By default, during initialization the default is set to 2. Note that it is generally a better coding style to use xmlSAXVersion() to set up the version explicitly for a given parsing context.

    version:the version, 1 or 2
    Returns:the previous value in case of success and -1 in case of error.

    Function: xmlSAXVersion

    int	xmlSAXVersion			(xmlSAXHandler * hdlr, 
    int version)

    Initialize the default XML SAX handler according to the version

    hdlr:the SAX handler
    version:the version, 1 or 2
    Returns:0 in case of success and -1 in case of error.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xlink.html0000644000175000017500000005221412134171042017564 0ustar aronaron Module xlink from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xlink from libxml2

    API Menu
    API Indexes
    Related links

    unfinished XLink detection module

    Table of Contents

    Enum xlinkActuate
    
    Typedef xmlChar * xlinkHRef
    
    Structure xlinkHandler
    struct _xlinkHandler
    Typedef xlinkHandler * xlinkHandlerPtr
    
    Typedef xmlChar * xlinkRole
    
    Enum xlinkShow
    
    Typedef xmlChar * xlinkTitle
    
    Enum xlinkType
    
    Function type: xlinkExtendedLinkFunk
    void	xlinkExtendedLinkFunk		(void * ctx, 
    xmlNodePtr node,
    int nbLocators,
    const xlinkHRef * hrefs,
    const xlinkRole * roles,
    int nbArcs,
    const xlinkRole * from,
    const xlinkRole * to,
    xlinkShow * show,
    xlinkActuate * actuate,
    int nbTitles,
    const xlinkTitle * titles,
    const xmlChar ** langs)
    Function type: xlinkExtendedLinkSetFunk
    void	xlinkExtendedLinkSetFunk	(void * ctx, 
    xmlNodePtr node,
    int nbLocators,
    const xlinkHRef * hrefs,
    const xlinkRole * roles,
    int nbTitles,
    const xlinkTitle * titles,
    const xmlChar ** langs)
    xlinkNodeDetectFunc	xlinkGetDefaultDetect	(void)
    xlinkHandlerPtr	xlinkGetDefaultHandler	(void)
    xlinkType	xlinkIsLink		(xmlDocPtr doc, 
    xmlNodePtr node)
    Function type: xlinkNodeDetectFunc
    void	xlinkNodeDetectFunc		(void * ctx, 
    xmlNodePtr node)
    void	xlinkSetDefaultDetect		(xlinkNodeDetectFunc func)
    void	xlinkSetDefaultHandler		(xlinkHandlerPtr handler)
    Function type: xlinkSimpleLinkFunk
    void	xlinkSimpleLinkFunk		(void * ctx, 
    xmlNodePtr node,
    const xlinkHRef href,
    const xlinkRole role,
    const xlinkTitle title)

    Description

    Enum xlinkActuate

    Enum xlinkActuate {
        XLINK_ACTUATE_NONE = 0
        XLINK_ACTUATE_AUTO = 1
        XLINK_ACTUATE_ONREQUEST = 2
    }
    

    Structure xlinkHandler

    Structure xlinkHandler
    struct _xlinkHandler { xlinkSimpleLinkFunk simple xlinkExtendedLinkFunk extended xlinkExtendedLinkSetFunk set }

    Enum xlinkShow

    Enum xlinkShow {
        XLINK_SHOW_NONE = 0
        XLINK_SHOW_NEW = 1
        XLINK_SHOW_EMBED = 2
        XLINK_SHOW_REPLACE = 3
    }
    

    Enum xlinkType

    Enum xlinkType {
        XLINK_TYPE_NONE = 0
        XLINK_TYPE_SIMPLE = 1
        XLINK_TYPE_EXTENDED = 2
        XLINK_TYPE_EXTENDED_SET = 3
    }
    

    Function type: xlinkExtendedLinkFunk

    Function type: xlinkExtendedLinkFunk
    void	xlinkExtendedLinkFunk		(void * ctx, 
    xmlNodePtr node,
    int nbLocators,
    const xlinkHRef * hrefs,
    const xlinkRole * roles,
    int nbArcs,
    const xlinkRole * from,
    const xlinkRole * to,
    xlinkShow * show,
    xlinkActuate * actuate,
    int nbTitles,
    const xlinkTitle * titles,
    const xmlChar ** langs)

    This is the prototype for a extended link detection callback.

    ctx:user data pointer
    node:the node carrying the link
    nbLocators:the number of locators detected on the link
    hrefs:pointer to the array of locator hrefs
    roles:pointer to the array of locator roles
    nbArcs:the number of arcs detected on the link
    from:pointer to the array of source roles found on the arcs
    to:pointer to the array of target roles found on the arcs
    show:array of values for the show attributes found on the arcs
    actuate:array of values for the actuate attributes found on the arcs
    nbTitles:the number of titles detected on the link
    titles:
    langs:array of xml:lang values for the titles

    Function type: xlinkExtendedLinkSetFunk

    Function type: xlinkExtendedLinkSetFunk
    void	xlinkExtendedLinkSetFunk	(void * ctx, 
    xmlNodePtr node,
    int nbLocators,
    const xlinkHRef * hrefs,
    const xlinkRole * roles,
    int nbTitles,
    const xlinkTitle * titles,
    const xmlChar ** langs)

    This is the prototype for a extended link set detection callback.

    ctx:user data pointer
    node:the node carrying the link
    nbLocators:the number of locators detected on the link
    hrefs:pointer to the array of locator hrefs
    roles:pointer to the array of locator roles
    nbTitles:the number of titles detected on the link
    titles:
    langs:array of xml:lang values for the titles

    Function: xlinkGetDefaultDetect

    xlinkNodeDetectFunc	xlinkGetDefaultDetect	(void)

    Get the default xlink detection routine

    Returns:the current function or NULL;

    Function: xlinkGetDefaultHandler

    xlinkHandlerPtr	xlinkGetDefaultHandler	(void)

    Get the default xlink handler.

    Returns:the current xlinkHandlerPtr value.

    Function: xlinkIsLink

    xlinkType	xlinkIsLink		(xmlDocPtr doc, 
    xmlNodePtr node)

    Check whether the given node carries the attributes needed to be a link element (or is one of the linking elements issued from the (X)HTML DtDs). This routine don't try to do full checking of the link validity but tries to detect and return the appropriate link type.

    doc:the document containing the node
    node:the node pointer itself
    Returns:the xlinkType of the node (XLINK_TYPE_NONE if there is no link detected.

    Function type: xlinkNodeDetectFunc

    Function type: xlinkNodeDetectFunc
    void	xlinkNodeDetectFunc		(void * ctx, 
    xmlNodePtr node)

    This is the prototype for the link detection routine. It calls the default link detection callbacks upon link detection.

    ctx:user data pointer
    node:the node to check

    Function: xlinkSetDefaultDetect

    void	xlinkSetDefaultDetect		(xlinkNodeDetectFunc func)

    Set the default xlink detection routine

    func:pointer to the new detection routine.

    Function: xlinkSetDefaultHandler

    void	xlinkSetDefaultHandler		(xlinkHandlerPtr handler)

    Set the default xlink handlers

    handler:the new value for the xlink handler block

    Function type: xlinkSimpleLinkFunk

    Function type: xlinkSimpleLinkFunk
    void	xlinkSimpleLinkFunk		(void * ctx, 
    xmlNodePtr node,
    const xlinkHRef href,
    const xlinkRole role,
    const xlinkTitle title)

    This is the prototype for a simple link detection callback.

    ctx:user data pointer
    node:the node carrying the link
    href:the target of the link
    role:the role string
    title:the link title

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-globals.html0000644000175000017500000010047612134171042020066 0ustar aronaron Module globals from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module globals from libxml2

    API Menu
    API Indexes
    Related links

    all the global variables and thread handling for those variables is handled by this module. The bottom of this file is automatically generated by build_glob.py based on the description file global.data

    Table of Contents

    Structure xmlGlobalState
    struct _xmlGlobalState
    Typedef xmlGlobalState * xmlGlobalStatePtr
    
    void	xmlCleanupGlobals		(void)
    xmlDeregisterNodeFunc	xmlDeregisterNodeDefault	(xmlDeregisterNodeFunc func)
    Function type: xmlDeregisterNodeFunc
    void	xmlDeregisterNodeFunc		(xmlNodePtr node)
    
    void	xmlInitGlobals			(void)
    void	xmlInitializeGlobalState	(xmlGlobalStatePtr gs)
    xmlOutputBufferCreateFilenameFunc	xmlOutputBufferCreateFilenameDefault	(xmlOutputBufferCreateFilenameFunc func)
    Function type: xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferPtr	xmlOutputBufferCreateFilenameFunc	(const char * URI, 
    xmlCharEncodingHandlerPtr encoder,
    int compression)
    xmlParserInputBufferCreateFilenameFunc	xmlParserInputBufferCreateFilenameDefault	(xmlParserInputBufferCreateFilenameFunc func)
    Function type: xmlParserInputBufferCreateFilenameFunc
    xmlParserInputBufferPtr	xmlParserInputBufferCreateFilenameFunc	(const char * URI, 
    xmlCharEncoding enc)
    xmlRegisterNodeFunc	xmlRegisterNodeDefault	(xmlRegisterNodeFunc func)
    Function type: xmlRegisterNodeFunc
    void	xmlRegisterNodeFunc		(xmlNodePtr node)
    
    xmlBufferAllocationScheme	xmlThrDefBufferAllocScheme	(xmlBufferAllocationScheme v)
    int	xmlThrDefDefaultBufferSize	(int v)
    xmlDeregisterNodeFunc	xmlThrDefDeregisterNodeDefault	(xmlDeregisterNodeFunc func)
    int	xmlThrDefDoValidityCheckingDefaultValue	(int v)
    int	xmlThrDefGetWarningsDefaultValue	(int v)
    int	xmlThrDefIndentTreeOutput	(int v)
    int	xmlThrDefKeepBlanksDefaultValue	(int v)
    int	xmlThrDefLineNumbersDefaultValue	(int v)
    int	xmlThrDefLoadExtDtdDefaultValue	(int v)
    xmlOutputBufferCreateFilenameFunc	xmlThrDefOutputBufferCreateFilenameDefault	(xmlOutputBufferCreateFilenameFunc func)
    int	xmlThrDefParserDebugEntities	(int v)
    xmlParserInputBufferCreateFilenameFunc	xmlThrDefParserInputBufferCreateFilenameDefault	(xmlParserInputBufferCreateFilenameFunc func)
    int	xmlThrDefPedanticParserDefaultValue	(int v)
    xmlRegisterNodeFunc	xmlThrDefRegisterNodeDefault	(xmlRegisterNodeFunc func)
    int	xmlThrDefSaveNoEmptyTags	(int v)
    void	xmlThrDefSetGenericErrorFunc	(void * ctx, 
    xmlGenericErrorFunc handler)
    void	xmlThrDefSetStructuredErrorFunc	(void * ctx, 
    xmlStructuredErrorFunc handler)
    int	xmlThrDefSubstituteEntitiesDefaultValue	(int v)
    const char *	xmlThrDefTreeIndentString	(const char * v)

    Description

    Structure xmlGlobalState

    Structure xmlGlobalState
    struct _xmlGlobalState { const char * xmlParserVersion xmlSAXLocator xmlDefaultSAXLocator xmlSAXHandlerV1 xmlDefaultSAXHandler xmlSAXHandlerV1 docbDefaultSAXHandler xmlSAXHandlerV1 htmlDefaultSAXHandler xmlFreeFunc xmlFree xmlMallocFunc xmlMalloc xmlStrdupFunc xmlMemStrdup xmlReallocFunc xmlRealloc xmlGenericErrorFunc xmlGenericError xmlStructuredErrorFunc xmlStructuredError void * xmlGenericErrorContext int oldXMLWDcompatibility xmlBufferAllocationScheme xmlBufferAllocScheme int xmlDefaultBufferSize int xmlSubstituteEntitiesDefaultValue int xmlDoValidityCheckingDefaultValue int xmlGetWarningsDefaultValue int xmlKeepBlanksDefaultValue int xmlLineNumbersDefaultValue int xmlLoadExtDtdDefaultValue int xmlParserDebugEntities int xmlPedanticParserDefaultValue int xmlSaveNoEmptyTags int xmlIndentTreeOutput const char * xmlTreeIndentString xmlRegisterNodeFunc xmlRegisterNodeDefaultValue xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue xmlMallocFunc xmlMallocAtomic xmlError xmlLastError xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue void * xmlStructuredErrorContext }

    Function: xmlCleanupGlobals

    void	xmlCleanupGlobals		(void)

    Additional cleanup for multi-threading

    Function: xmlDeregisterNodeDefault

    xmlDeregisterNodeFunc	xmlDeregisterNodeDefault	(xmlDeregisterNodeFunc func)

    Registers a callback for node destruction

    func:function pointer to the new DeregisterNodeFunc
    Returns:the previous value of the deregistration function

    Function type: xmlDeregisterNodeFunc

    Function type: xmlDeregisterNodeFunc
    void	xmlDeregisterNodeFunc		(xmlNodePtr node)
    

    Signature for the deregistration callback of a discarded node

    node:the current node

    Function: xmlInitGlobals

    void	xmlInitGlobals			(void)

    Additional initialisation for multi-threading

    Function: xmlInitializeGlobalState

    void	xmlInitializeGlobalState	(xmlGlobalStatePtr gs)

    xmlInitializeGlobalState() initialize a global state with all the default values of the library.

    gs:a pointer to a newly allocated global state

    Function: xmlOutputBufferCreateFilenameDefault

    xmlOutputBufferCreateFilenameFunc	xmlOutputBufferCreateFilenameDefault	(xmlOutputBufferCreateFilenameFunc func)

    Registers a callback for URI output file handling

    func:function pointer to the new OutputBufferCreateFilenameFunc
    Returns:the old value of the registration function

    Function type: xmlOutputBufferCreateFilenameFunc

    Function type: xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferPtr	xmlOutputBufferCreateFilenameFunc	(const char * URI, 
    xmlCharEncodingHandlerPtr encoder,
    int compression)

    Signature for the function doing the lookup for a suitable output method corresponding to an URI.

    URI:the URI to write to
    encoder:
    compression:
    Returns:the new xmlOutputBufferPtr in case of success or NULL if no method was found.

    Function: xmlParserInputBufferCreateFilenameDefault

    xmlParserInputBufferCreateFilenameFunc	xmlParserInputBufferCreateFilenameDefault	(xmlParserInputBufferCreateFilenameFunc func)

    Registers a callback for URI input file handling

    func:function pointer to the new ParserInputBufferCreateFilenameFunc
    Returns:the old value of the registration function

    Function type: xmlParserInputBufferCreateFilenameFunc

    Function type: xmlParserInputBufferCreateFilenameFunc
    xmlParserInputBufferPtr	xmlParserInputBufferCreateFilenameFunc	(const char * URI, 
    xmlCharEncoding enc)

    Signature for the function doing the lookup for a suitable input method corresponding to an URI.

    URI:the URI to read from
    enc:the requested source encoding
    Returns:the new xmlParserInputBufferPtr in case of success or NULL if no method was found.

    Function: xmlRegisterNodeDefault

    xmlRegisterNodeFunc	xmlRegisterNodeDefault	(xmlRegisterNodeFunc func)

    Registers a callback for node creation

    func:function pointer to the new RegisterNodeFunc
    Returns:the old value of the registration function

    Function type: xmlRegisterNodeFunc

    Function type: xmlRegisterNodeFunc
    void	xmlRegisterNodeFunc		(xmlNodePtr node)
    

    Signature for the registration callback of a created node

    node:the current node

    Function: xmlThrDefBufferAllocScheme

    xmlBufferAllocationScheme	xmlThrDefBufferAllocScheme	(xmlBufferAllocationScheme v)

    v:
    Returns:

    Function: xmlThrDefDefaultBufferSize

    int	xmlThrDefDefaultBufferSize	(int v)

    v:
    Returns:

    Function: xmlThrDefDeregisterNodeDefault

    xmlDeregisterNodeFunc	xmlThrDefDeregisterNodeDefault	(xmlDeregisterNodeFunc func)

    func:
    Returns:

    Function: xmlThrDefDoValidityCheckingDefaultValue

    int	xmlThrDefDoValidityCheckingDefaultValue	(int v)

    v:
    Returns:

    Function: xmlThrDefGetWarningsDefaultValue

    int	xmlThrDefGetWarningsDefaultValue	(int v)

    v:
    Returns:

    Function: xmlThrDefIndentTreeOutput

    int	xmlThrDefIndentTreeOutput	(int v)

    v:
    Returns:

    Function: xmlThrDefKeepBlanksDefaultValue

    int	xmlThrDefKeepBlanksDefaultValue	(int v)

    v:
    Returns:

    Function: xmlThrDefLineNumbersDefaultValue

    int	xmlThrDefLineNumbersDefaultValue	(int v)

    v:
    Returns:

    Function: xmlThrDefLoadExtDtdDefaultValue

    int	xmlThrDefLoadExtDtdDefaultValue	(int v)

    v:
    Returns:

    Function: xmlThrDefOutputBufferCreateFilenameDefault

    xmlOutputBufferCreateFilenameFunc	xmlThrDefOutputBufferCreateFilenameDefault	(xmlOutputBufferCreateFilenameFunc func)

    func:
    Returns:

    Function: xmlThrDefParserDebugEntities

    int	xmlThrDefParserDebugEntities	(int v)

    v:
    Returns:

    Function: xmlThrDefParserInputBufferCreateFilenameDefault

    xmlParserInputBufferCreateFilenameFunc	xmlThrDefParserInputBufferCreateFilenameDefault	(xmlParserInputBufferCreateFilenameFunc func)

    func:
    Returns:

    Function: xmlThrDefPedanticParserDefaultValue

    int	xmlThrDefPedanticParserDefaultValue	(int v)

    v:
    Returns:

    Function: xmlThrDefRegisterNodeDefault

    xmlRegisterNodeFunc	xmlThrDefRegisterNodeDefault	(xmlRegisterNodeFunc func)

    func:
    Returns:

    Function: xmlThrDefSaveNoEmptyTags

    int	xmlThrDefSaveNoEmptyTags	(int v)

    v:
    Returns:

    Function: xmlThrDefSetGenericErrorFunc

    void	xmlThrDefSetGenericErrorFunc	(void * ctx, 
    xmlGenericErrorFunc handler)

    ctx:
    handler:

    Function: xmlThrDefSetStructuredErrorFunc

    void	xmlThrDefSetStructuredErrorFunc	(void * ctx, 
    xmlStructuredErrorFunc handler)

    ctx:
    handler:

    Function: xmlThrDefSubstituteEntitiesDefaultValue

    int	xmlThrDefSubstituteEntitiesDefaultValue	(int v)

    v:
    Returns:

    Function: xmlThrDefTreeIndentString

    const char *	xmlThrDefTreeIndentString	(const char * v)

    v:
    Returns:

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xzlib.html0000644000175000017500000001460512113312341017565 0ustar aronaron Module xzlib from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xzlib from libxml2

    API Menu
    API Indexes
    Related links

    Table of Contents

    #define LIBXML2_XZLIB_H
    Typedef void * xzFile
    

    Description

    Macro: LIBXML2_XZLIB_H

    #define LIBXML2_XZLIB_H

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/html/libxml-xmlerror.html0000644000175000017500000032620112134171042020311 0ustar aronaron Module xmlerror from libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Module xmlerror from libxml2

    API Menu
    API Indexes
    Related links

    the API used to report errors

    Table of Contents

    Structure xmlError
    struct _xmlError
    Enum xmlErrorDomain
    
    Enum xmlErrorLevel
    
    Typedef xmlError * xmlErrorPtr
    
    Enum xmlParserErrors
    
    void	initGenericErrorDefaultFunc	(xmlGenericErrorFunc * handler)
    int	xmlCopyError			(xmlErrorPtr from, 
    xmlErrorPtr to)
    xmlErrorPtr	xmlCtxtGetLastError	(void * ctx)
    void	xmlCtxtResetLastError		(void * ctx)
    Function type: xmlGenericErrorFunc
    void	xmlGenericErrorFunc		(void * ctx, 
    const char * msg,
    ... ...)
    xmlErrorPtr	xmlGetLastError		(void)
    void	xmlParserError			(void * ctx, 
    const char * msg,
    ... ...)
    void	xmlParserPrintFileContext	(xmlParserInputPtr input)
    void	xmlParserPrintFileInfo		(xmlParserInputPtr input)
    void	xmlParserValidityError		(void * ctx, 
    const char * msg,
    ... ...)
    void	xmlParserValidityWarning	(void * ctx, 
    const char * msg,
    ... ...)
    void	xmlParserWarning		(void * ctx, 
    const char * msg,
    ... ...)
    void	xmlResetError			(xmlErrorPtr err)
    void	xmlResetLastError		(void)
    void	xmlSetGenericErrorFunc		(void * ctx, 
    xmlGenericErrorFunc handler)
    void	xmlSetStructuredErrorFunc	(void * ctx, 
    xmlStructuredErrorFunc handler)
    Function type: xmlStructuredErrorFunc
    void	xmlStructuredErrorFunc		(void * userData, 
    xmlErrorPtr error)

    Description

    Structure xmlError

    Structure xmlError
    struct _xmlError { int domain : What part of the library raised this er int code : The error code, e.g. an xmlParserError char * message : human-readable informative error messag xmlErrorLevel level : how consequent is the error char * file : the filename int line : the line number if available char * str1 : extra string information char * str2 : extra string information char * str3 : extra string information int int1 : extra number information int int2 : column number of the error or 0 if N/A void * ctxt : the parser context if available void * node : the node in the tree }

    Enum xmlErrorDomain

    Enum xmlErrorDomain {
        XML_FROM_NONE = 0
        XML_FROM_PARSER = 1 : The XML parser
        XML_FROM_TREE = 2 : The tree module
        XML_FROM_NAMESPACE = 3 : The XML Namespace module
        XML_FROM_DTD = 4 : The XML DTD validation with parser contex
        XML_FROM_HTML = 5 : The HTML parser
        XML_FROM_MEMORY = 6 : The memory allocator
        XML_FROM_OUTPUT = 7 : The serialization code
        XML_FROM_IO = 8 : The Input/Output stack
        XML_FROM_FTP = 9 : The FTP module
        XML_FROM_HTTP = 10 : The HTTP module
        XML_FROM_XINCLUDE = 11 : The XInclude processing
        XML_FROM_XPATH = 12 : The XPath module
        XML_FROM_XPOINTER = 13 : The XPointer module
        XML_FROM_REGEXP = 14 : The regular expressions module
        XML_FROM_DATATYPE = 15 : The W3C XML Schemas Datatype module
        XML_FROM_SCHEMASP = 16 : The W3C XML Schemas parser module
        XML_FROM_SCHEMASV = 17 : The W3C XML Schemas validation module
        XML_FROM_RELAXNGP = 18 : The Relax-NG parser module
        XML_FROM_RELAXNGV = 19 : The Relax-NG validator module
        XML_FROM_CATALOG = 20 : The Catalog module
        XML_FROM_C14N = 21 : The Canonicalization module
        XML_FROM_XSLT = 22 : The XSLT engine from libxslt
        XML_FROM_VALID = 23 : The XML DTD validation with valid context
        XML_FROM_CHECK = 24 : The error checking module
        XML_FROM_WRITER = 25 : The xmlwriter module
        XML_FROM_MODULE = 26 : The dynamically loaded module modul
        XML_FROM_I18N = 27 : The module handling character conversion
        XML_FROM_SCHEMATRONV = 28 : The Schematron validator module
        XML_FROM_BUFFER = 29 : The buffers module
        XML_FROM_URI = 30 : The URI module
    }
    

    Enum xmlErrorLevel

    Enum xmlErrorLevel {
        XML_ERR_NONE = 0
        XML_ERR_WARNING = 1 : A simple warning
        XML_ERR_ERROR = 2 : A recoverable error
        XML_ERR_FATAL = 3 : A fatal error
    }
    

    Enum xmlParserErrors

    Enum xmlParserErrors {
        XML_ERR_OK = 0
        XML_ERR_INTERNAL_ERROR = 1 : 1
        XML_ERR_NO_MEMORY = 2 : 2
        XML_ERR_DOCUMENT_START = 3 : 3
        XML_ERR_DOCUMENT_EMPTY = 4 : 4
        XML_ERR_DOCUMENT_END = 5 : 5
        XML_ERR_INVALID_HEX_CHARREF = 6 : 6
        XML_ERR_INVALID_DEC_CHARREF = 7 : 7
        XML_ERR_INVALID_CHARREF = 8 : 8
        XML_ERR_INVALID_CHAR = 9 : 9
        XML_ERR_CHARREF_AT_EOF = 10 : 10
        XML_ERR_CHARREF_IN_PROLOG = 11 : 11
        XML_ERR_CHARREF_IN_EPILOG = 12 : 12
        XML_ERR_CHARREF_IN_DTD = 13 : 13
        XML_ERR_ENTITYREF_AT_EOF = 14 : 14
        XML_ERR_ENTITYREF_IN_PROLOG = 15 : 15
        XML_ERR_ENTITYREF_IN_EPILOG = 16 : 16
        XML_ERR_ENTITYREF_IN_DTD = 17 : 17
        XML_ERR_PEREF_AT_EOF = 18 : 18
        XML_ERR_PEREF_IN_PROLOG = 19 : 19
        XML_ERR_PEREF_IN_EPILOG = 20 : 20
        XML_ERR_PEREF_IN_INT_SUBSET = 21 : 21
        XML_ERR_ENTITYREF_NO_NAME = 22 : 22
        XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 : 23
        XML_ERR_PEREF_NO_NAME = 24 : 24
        XML_ERR_PEREF_SEMICOL_MISSING = 25 : 25
        XML_ERR_UNDECLARED_ENTITY = 26 : 26
        XML_WAR_UNDECLARED_ENTITY = 27 : 27
        XML_ERR_UNPARSED_ENTITY = 28 : 28
        XML_ERR_ENTITY_IS_EXTERNAL = 29 : 29
        XML_ERR_ENTITY_IS_PARAMETER = 30 : 30
        XML_ERR_UNKNOWN_ENCODING = 31 : 31
        XML_ERR_UNSUPPORTED_ENCODING = 32 : 32
        XML_ERR_STRING_NOT_STARTED = 33 : 33
        XML_ERR_STRING_NOT_CLOSED = 34 : 34
        XML_ERR_NS_DECL_ERROR = 35 : 35
        XML_ERR_ENTITY_NOT_STARTED = 36 : 36
        XML_ERR_ENTITY_NOT_FINISHED = 37 : 37
        XML_ERR_LT_IN_ATTRIBUTE = 38 : 38
        XML_ERR_ATTRIBUTE_NOT_STARTED = 39 : 39
        XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 : 40
        XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 : 41
        XML_ERR_ATTRIBUTE_REDEFINED = 42 : 42
        XML_ERR_LITERAL_NOT_STARTED = 43 : 43
        XML_ERR_LITERAL_NOT_FINISHED = 44 : 44
        XML_ERR_COMMENT_NOT_FINISHED = 45 : 45
        XML_ERR_PI_NOT_STARTED = 46 : 46
        XML_ERR_PI_NOT_FINISHED = 47 : 47
        XML_ERR_NOTATION_NOT_STARTED = 48 : 48
        XML_ERR_NOTATION_NOT_FINISHED = 49 : 49
        XML_ERR_ATTLIST_NOT_STARTED = 50 : 50
        XML_ERR_ATTLIST_NOT_FINISHED = 51 : 51
        XML_ERR_MIXED_NOT_STARTED = 52 : 52
        XML_ERR_MIXED_NOT_FINISHED = 53 : 53
        XML_ERR_ELEMCONTENT_NOT_STARTED = 54 : 54
        XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 : 55
        XML_ERR_XMLDECL_NOT_STARTED = 56 : 56
        XML_ERR_XMLDECL_NOT_FINISHED = 57 : 57
        XML_ERR_CONDSEC_NOT_STARTED = 58 : 58
        XML_ERR_CONDSEC_NOT_FINISHED = 59 : 59
        XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 : 60
        XML_ERR_DOCTYPE_NOT_FINISHED = 61 : 61
        XML_ERR_MISPLACED_CDATA_END = 62 : 62
        XML_ERR_CDATA_NOT_FINISHED = 63 : 63
        XML_ERR_RESERVED_XML_NAME = 64 : 64
        XML_ERR_SPACE_REQUIRED = 65 : 65
        XML_ERR_SEPARATOR_REQUIRED = 66 : 66
        XML_ERR_NMTOKEN_REQUIRED = 67 : 67
        XML_ERR_NAME_REQUIRED = 68 : 68
        XML_ERR_PCDATA_REQUIRED = 69 : 69
        XML_ERR_URI_REQUIRED = 70 : 70
        XML_ERR_PUBID_REQUIRED = 71 : 71
        XML_ERR_LT_REQUIRED = 72 : 72
        XML_ERR_GT_REQUIRED = 73 : 73
        XML_ERR_LTSLASH_REQUIRED = 74 : 74
        XML_ERR_EQUAL_REQUIRED = 75 : 75
        XML_ERR_TAG_NAME_MISMATCH = 76 : 76
        XML_ERR_TAG_NOT_FINISHED = 77 : 77
        XML_ERR_STANDALONE_VALUE = 78 : 78
        XML_ERR_ENCODING_NAME = 79 : 79
        XML_ERR_HYPHEN_IN_COMMENT = 80 : 80
        XML_ERR_INVALID_ENCODING = 81 : 81
        XML_ERR_EXT_ENTITY_STANDALONE = 82 : 82
        XML_ERR_CONDSEC_INVALID = 83 : 83
        XML_ERR_VALUE_REQUIRED = 84 : 84
        XML_ERR_NOT_WELL_BALANCED = 85 : 85
        XML_ERR_EXTRA_CONTENT = 86 : 86
        XML_ERR_ENTITY_CHAR_ERROR = 87 : 87
        XML_ERR_ENTITY_PE_INTERNAL = 88 : 88
        XML_ERR_ENTITY_LOOP = 89 : 89
        XML_ERR_ENTITY_BOUNDARY = 90 : 90
        XML_ERR_INVALID_URI = 91 : 91
        XML_ERR_URI_FRAGMENT = 92 : 92
        XML_WAR_CATALOG_PI = 93 : 93
        XML_ERR_NO_DTD = 94 : 94
        XML_ERR_CONDSEC_INVALID_KEYWORD = 95 : 95
        XML_ERR_VERSION_MISSING = 96 : 96
        XML_WAR_UNKNOWN_VERSION = 97 : 97
        XML_WAR_LANG_VALUE = 98 : 98
        XML_WAR_NS_URI = 99 : 99
        XML_WAR_NS_URI_RELATIVE = 100 : 100
        XML_ERR_MISSING_ENCODING = 101 : 101
        XML_WAR_SPACE_VALUE = 102 : 102
        XML_ERR_NOT_STANDALONE = 103 : 103
        XML_ERR_ENTITY_PROCESSING = 104 : 104
        XML_ERR_NOTATION_PROCESSING = 105 : 105
        XML_WAR_NS_COLUMN = 106 : 106
        XML_WAR_ENTITY_REDEFINED = 107 : 107
        XML_ERR_UNKNOWN_VERSION = 108 : 108
        XML_ERR_VERSION_MISMATCH = 109 : 109
        XML_ERR_NAME_TOO_LONG = 110 : 110
        XML_ERR_USER_STOP = 111 : 111
        XML_NS_ERR_XML_NAMESPACE = 200
        XML_NS_ERR_UNDEFINED_NAMESPACE = 201 : 201
        XML_NS_ERR_QNAME = 202 : 202
        XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 : 203
        XML_NS_ERR_EMPTY = 204 : 204
        XML_NS_ERR_COLON = 205 : 205
        XML_DTD_ATTRIBUTE_DEFAULT = 500
        XML_DTD_ATTRIBUTE_REDEFINED = 501 : 501
        XML_DTD_ATTRIBUTE_VALUE = 502 : 502
        XML_DTD_CONTENT_ERROR = 503 : 503
        XML_DTD_CONTENT_MODEL = 504 : 504
        XML_DTD_CONTENT_NOT_DETERMINIST = 505 : 505
        XML_DTD_DIFFERENT_PREFIX = 506 : 506
        XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 : 507
        XML_DTD_ELEM_NAMESPACE = 508 : 508
        XML_DTD_ELEM_REDEFINED = 509 : 509
        XML_DTD_EMPTY_NOTATION = 510 : 510
        XML_DTD_ENTITY_TYPE = 511 : 511
        XML_DTD_ID_FIXED = 512 : 512
        XML_DTD_ID_REDEFINED = 513 : 513
        XML_DTD_ID_SUBSET = 514 : 514
        XML_DTD_INVALID_CHILD = 515 : 515
        XML_DTD_INVALID_DEFAULT = 516 : 516
        XML_DTD_LOAD_ERROR = 517 : 517
        XML_DTD_MISSING_ATTRIBUTE = 518 : 518
        XML_DTD_MIXED_CORRUPT = 519 : 519
        XML_DTD_MULTIPLE_ID = 520 : 520
        XML_DTD_NO_DOC = 521 : 521
        XML_DTD_NO_DTD = 522 : 522
        XML_DTD_NO_ELEM_NAME = 523 : 523
        XML_DTD_NO_PREFIX = 524 : 524
        XML_DTD_NO_ROOT = 525 : 525
        XML_DTD_NOTATION_REDEFINED = 526 : 526
        XML_DTD_NOTATION_VALUE = 527 : 527
        XML_DTD_NOT_EMPTY = 528 : 528
        XML_DTD_NOT_PCDATA = 529 : 529
        XML_DTD_NOT_STANDALONE = 530 : 530
        XML_DTD_ROOT_NAME = 531 : 531
        XML_DTD_STANDALONE_WHITE_SPACE = 532 : 532
        XML_DTD_UNKNOWN_ATTRIBUTE = 533 : 533
        XML_DTD_UNKNOWN_ELEM = 534 : 534
        XML_DTD_UNKNOWN_ENTITY = 535 : 535
        XML_DTD_UNKNOWN_ID = 536 : 536
        XML_DTD_UNKNOWN_NOTATION = 537 : 537
        XML_DTD_STANDALONE_DEFAULTED = 538 : 538
        XML_DTD_XMLID_VALUE = 539 : 539
        XML_DTD_XMLID_TYPE = 540 : 540
        XML_DTD_DUP_TOKEN = 541 : 541
        XML_HTML_STRUCURE_ERROR = 800
        XML_HTML_UNKNOWN_TAG = 801 : 801
        XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000
        XML_RNGP_ATTR_CONFLICT = 1001 : 1001
        XML_RNGP_ATTRIBUTE_CHILDREN = 1002 : 1002
        XML_RNGP_ATTRIBUTE_CONTENT = 1003 : 1003
        XML_RNGP_ATTRIBUTE_EMPTY = 1004 : 1004
        XML_RNGP_ATTRIBUTE_NOOP = 1005 : 1005
        XML_RNGP_CHOICE_CONTENT = 1006 : 1006
        XML_RNGP_CHOICE_EMPTY = 1007 : 1007
        XML_RNGP_CREATE_FAILURE = 1008 : 1008
        XML_RNGP_DATA_CONTENT = 1009 : 1009
        XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 : 1010
        XML_RNGP_DEFINE_CREATE_FAILED = 1011 : 1011
        XML_RNGP_DEFINE_EMPTY = 1012 : 1012
        XML_RNGP_DEFINE_MISSING = 1013 : 1013
        XML_RNGP_DEFINE_NAME_MISSING = 1014 : 1014
        XML_RNGP_ELEM_CONTENT_EMPTY = 1015 : 1015
        XML_RNGP_ELEM_CONTENT_ERROR = 1016 : 1016
        XML_RNGP_ELEMENT_EMPTY = 1017 : 1017
        XML_RNGP_ELEMENT_CONTENT = 1018 : 1018
        XML_RNGP_ELEMENT_NAME = 1019 : 1019
        XML_RNGP_ELEMENT_NO_CONTENT = 1020 : 1020
        XML_RNGP_ELEM_TEXT_CONFLICT = 1021 : 1021
        XML_RNGP_EMPTY = 1022 : 1022
        XML_RNGP_EMPTY_CONSTRUCT = 1023 : 1023
        XML_RNGP_EMPTY_CONTENT = 1024 : 1024
        XML_RNGP_EMPTY_NOT_EMPTY = 1025 : 1025
        XML_RNGP_ERROR_TYPE_LIB = 1026 : 1026
        XML_RNGP_EXCEPT_EMPTY = 1027 : 1027
        XML_RNGP_EXCEPT_MISSING = 1028 : 1028
        XML_RNGP_EXCEPT_MULTIPLE = 1029 : 1029
        XML_RNGP_EXCEPT_NO_CONTENT = 1030 : 1030
        XML_RNGP_EXTERNALREF_EMTPY = 1031 : 1031
        XML_RNGP_EXTERNAL_REF_FAILURE = 1032 : 1032
        XML_RNGP_EXTERNALREF_RECURSE = 1033 : 1033
        XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 : 1034
        XML_RNGP_FOREIGN_ELEMENT = 1035 : 1035
        XML_RNGP_GRAMMAR_CONTENT = 1036 : 1036
        XML_RNGP_GRAMMAR_EMPTY = 1037 : 1037
        XML_RNGP_GRAMMAR_MISSING = 1038 : 1038
        XML_RNGP_GRAMMAR_NO_START = 1039 : 1039
        XML_RNGP_GROUP_ATTR_CONFLICT = 1040 : 1040
        XML_RNGP_HREF_ERROR = 1041 : 1041
        XML_RNGP_INCLUDE_EMPTY = 1042 : 1042
        XML_RNGP_INCLUDE_FAILURE = 1043 : 1043
        XML_RNGP_INCLUDE_RECURSE = 1044 : 1044
        XML_RNGP_INTERLEAVE_ADD = 1045 : 1045
        XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 : 1046
        XML_RNGP_INTERLEAVE_EMPTY = 1047 : 1047
        XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 : 1048
        XML_RNGP_INVALID_DEFINE_NAME = 1049 : 1049
        XML_RNGP_INVALID_URI = 1050 : 1050
        XML_RNGP_INVALID_VALUE = 1051 : 1051
        XML_RNGP_MISSING_HREF = 1052 : 1052
        XML_RNGP_NAME_MISSING = 1053 : 1053
        XML_RNGP_NEED_COMBINE = 1054 : 1054
        XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 : 1055
        XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 : 1056
        XML_RNGP_NSNAME_NO_NS = 1057 : 1057
        XML_RNGP_PARAM_FORBIDDEN = 1058 : 1058
        XML_RNGP_PARAM_NAME_MISSING = 1059 : 1059
        XML_RNGP_PARENTREF_CREATE_FAILED = 1060 : 1060
        XML_RNGP_PARENTREF_NAME_INVALID = 1061 : 1061
        XML_RNGP_PARENTREF_NO_NAME = 1062 : 1062
        XML_RNGP_PARENTREF_NO_PARENT = 1063 : 1063
        XML_RNGP_PARENTREF_NOT_EMPTY = 1064 : 1064
        XML_RNGP_PARSE_ERROR = 1065 : 1065
        XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 : 1066
        XML_RNGP_PAT_ATTR_ATTR = 1067 : 1067
        XML_RNGP_PAT_ATTR_ELEM = 1068 : 1068
        XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 : 1069
        XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 : 1070
        XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 : 1071
        XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 : 1072
        XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 : 1073
        XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 : 1074
        XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 : 1075
        XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 : 1076
        XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 : 1077
        XML_RNGP_PAT_LIST_ATTR = 1078 : 1078
        XML_RNGP_PAT_LIST_ELEM = 1079 : 1079
        XML_RNGP_PAT_LIST_INTERLEAVE = 1080 : 1080
        XML_RNGP_PAT_LIST_LIST = 1081 : 1081
        XML_RNGP_PAT_LIST_REF = 1082 : 1082
        XML_RNGP_PAT_LIST_TEXT = 1083 : 1083
        XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 : 1084
        XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 : 1085
        XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 : 1086
        XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 : 1087
        XML_RNGP_PAT_START_ATTR = 1088 : 1088
        XML_RNGP_PAT_START_DATA = 1089 : 1089
        XML_RNGP_PAT_START_EMPTY = 1090 : 1090
        XML_RNGP_PAT_START_GROUP = 1091 : 1091
        XML_RNGP_PAT_START_INTERLEAVE = 1092 : 1092
        XML_RNGP_PAT_START_LIST = 1093 : 1093
        XML_RNGP_PAT_START_ONEMORE = 1094 : 1094
        XML_RNGP_PAT_START_TEXT = 1095 : 1095
        XML_RNGP_PAT_START_VALUE = 1096 : 1096
        XML_RNGP_PREFIX_UNDEFINED = 1097 : 1097
        XML_RNGP_REF_CREATE_FAILED = 1098 : 1098
        XML_RNGP_REF_CYCLE = 1099 : 1099
        XML_RNGP_REF_NAME_INVALID = 1100 : 1100
        XML_RNGP_REF_NO_DEF = 1101 : 1101
        XML_RNGP_REF_NO_NAME = 1102 : 1102
        XML_RNGP_REF_NOT_EMPTY = 1103 : 1103
        XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 : 1104
        XML_RNGP_START_CONTENT = 1105 : 1105
        XML_RNGP_START_EMPTY = 1106 : 1106
        XML_RNGP_START_MISSING = 1107 : 1107
        XML_RNGP_TEXT_EXPECTED = 1108 : 1108
        XML_RNGP_TEXT_HAS_CHILD = 1109 : 1109
        XML_RNGP_TYPE_MISSING = 1110 : 1110
        XML_RNGP_TYPE_NOT_FOUND = 1111 : 1111
        XML_RNGP_TYPE_VALUE = 1112 : 1112
        XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 : 1113
        XML_RNGP_UNKNOWN_COMBINE = 1114 : 1114
        XML_RNGP_UNKNOWN_CONSTRUCT = 1115 : 1115
        XML_RNGP_UNKNOWN_TYPE_LIB = 1116 : 1116
        XML_RNGP_URI_FRAGMENT = 1117 : 1117
        XML_RNGP_URI_NOT_ABSOLUTE = 1118 : 1118
        XML_RNGP_VALUE_EMPTY = 1119 : 1119
        XML_RNGP_VALUE_NO_CONTENT = 1120 : 1120
        XML_RNGP_XMLNS_NAME = 1121 : 1121
        XML_RNGP_XML_NS = 1122 : 1122
        XML_XPATH_EXPRESSION_OK = 1200
        XML_XPATH_NUMBER_ERROR = 1201 : 1201
        XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 : 1202
        XML_XPATH_START_LITERAL_ERROR = 1203 : 1203
        XML_XPATH_VARIABLE_REF_ERROR = 1204 : 1204
        XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 : 1205
        XML_XPATH_INVALID_PREDICATE_ERROR = 1206 : 1206
        XML_XPATH_EXPR_ERROR = 1207 : 1207
        XML_XPATH_UNCLOSED_ERROR = 1208 : 1208
        XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 : 1209
        XML_XPATH_INVALID_OPERAND = 1210 : 1210
        XML_XPATH_INVALID_TYPE = 1211 : 1211
        XML_XPATH_INVALID_ARITY = 1212 : 1212
        XML_XPATH_INVALID_CTXT_SIZE = 1213 : 1213
        XML_XPATH_INVALID_CTXT_POSITION = 1214 : 1214
        XML_XPATH_MEMORY_ERROR = 1215 : 1215
        XML_XPTR_SYNTAX_ERROR = 1216 : 1216
        XML_XPTR_RESOURCE_ERROR = 1217 : 1217
        XML_XPTR_SUB_RESOURCE_ERROR = 1218 : 1218
        XML_XPATH_UNDEF_PREFIX_ERROR = 1219 : 1219
        XML_XPATH_ENCODING_ERROR = 1220 : 1220
        XML_XPATH_INVALID_CHAR_ERROR = 1221 : 1221
        XML_TREE_INVALID_HEX = 1300
        XML_TREE_INVALID_DEC = 1301 : 1301
        XML_TREE_UNTERMINATED_ENTITY = 1302 : 1302
        XML_TREE_NOT_UTF8 = 1303 : 1303
        XML_SAVE_NOT_UTF8 = 1400
        XML_SAVE_CHAR_INVALID = 1401 : 1401
        XML_SAVE_NO_DOCTYPE = 1402 : 1402
        XML_SAVE_UNKNOWN_ENCODING = 1403 : 1403
        XML_REGEXP_COMPILE_ERROR = 1450
        XML_IO_UNKNOWN = 1500
        XML_IO_EACCES = 1501 : 1501
        XML_IO_EAGAIN = 1502 : 1502
        XML_IO_EBADF = 1503 : 1503
        XML_IO_EBADMSG = 1504 : 1504
        XML_IO_EBUSY = 1505 : 1505
        XML_IO_ECANCELED = 1506 : 1506
        XML_IO_ECHILD = 1507 : 1507
        XML_IO_EDEADLK = 1508 : 1508
        XML_IO_EDOM = 1509 : 1509
        XML_IO_EEXIST = 1510 : 1510
        XML_IO_EFAULT = 1511 : 1511
        XML_IO_EFBIG = 1512 : 1512
        XML_IO_EINPROGRESS = 1513 : 1513
        XML_IO_EINTR = 1514 : 1514
        XML_IO_EINVAL = 1515 : 1515
        XML_IO_EIO = 1516 : 1516
        XML_IO_EISDIR = 1517 : 1517
        XML_IO_EMFILE = 1518 : 1518
        XML_IO_EMLINK = 1519 : 1519
        XML_IO_EMSGSIZE = 1520 : 1520
        XML_IO_ENAMETOOLONG = 1521 : 1521
        XML_IO_ENFILE = 1522 : 1522
        XML_IO_ENODEV = 1523 : 1523
        XML_IO_ENOENT = 1524 : 1524
        XML_IO_ENOEXEC = 1525 : 1525
        XML_IO_ENOLCK = 1526 : 1526
        XML_IO_ENOMEM = 1527 : 1527
        XML_IO_ENOSPC = 1528 : 1528
        XML_IO_ENOSYS = 1529 : 1529
        XML_IO_ENOTDIR = 1530 : 1530
        XML_IO_ENOTEMPTY = 1531 : 1531
        XML_IO_ENOTSUP = 1532 : 1532
        XML_IO_ENOTTY = 1533 : 1533
        XML_IO_ENXIO = 1534 : 1534
        XML_IO_EPERM = 1535 : 1535
        XML_IO_EPIPE = 1536 : 1536
        XML_IO_ERANGE = 1537 : 1537
        XML_IO_EROFS = 1538 : 1538
        XML_IO_ESPIPE = 1539 : 1539
        XML_IO_ESRCH = 1540 : 1540
        XML_IO_ETIMEDOUT = 1541 : 1541
        XML_IO_EXDEV = 1542 : 1542
        XML_IO_NETWORK_ATTEMPT = 1543 : 1543
        XML_IO_ENCODER = 1544 : 1544
        XML_IO_FLUSH = 1545 : 1545
        XML_IO_WRITE = 1546 : 1546
        XML_IO_NO_INPUT = 1547 : 1547
        XML_IO_BUFFER_FULL = 1548 : 1548
        XML_IO_LOAD_ERROR = 1549 : 1549
        XML_IO_ENOTSOCK = 1550 : 1550
        XML_IO_EISCONN = 1551 : 1551
        XML_IO_ECONNREFUSED = 1552 : 1552
        XML_IO_ENETUNREACH = 1553 : 1553
        XML_IO_EADDRINUSE = 1554 : 1554
        XML_IO_EALREADY = 1555 : 1555
        XML_IO_EAFNOSUPPORT = 1556 : 1556
        XML_XINCLUDE_RECURSION = 1600
        XML_XINCLUDE_PARSE_VALUE = 1601 : 1601
        XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 : 1602
        XML_XINCLUDE_NO_HREF = 1603 : 1603
        XML_XINCLUDE_NO_FALLBACK = 1604 : 1604
        XML_XINCLUDE_HREF_URI = 1605 : 1605
        XML_XINCLUDE_TEXT_FRAGMENT = 1606 : 1606
        XML_XINCLUDE_TEXT_DOCUMENT = 1607 : 1607
        XML_XINCLUDE_INVALID_CHAR = 1608 : 1608
        XML_XINCLUDE_BUILD_FAILED = 1609 : 1609
        XML_XINCLUDE_UNKNOWN_ENCODING = 1610 : 1610
        XML_XINCLUDE_MULTIPLE_ROOT = 1611 : 1611
        XML_XINCLUDE_XPTR_FAILED = 1612 : 1612
        XML_XINCLUDE_XPTR_RESULT = 1613 : 1613
        XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 : 1614
        XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 : 1615
        XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 : 1616
        XML_XINCLUDE_DEPRECATED_NS = 1617 : 1617
        XML_XINCLUDE_FRAGMENT_ID = 1618 : 1618
        XML_CATALOG_MISSING_ATTR = 1650
        XML_CATALOG_ENTRY_BROKEN = 1651 : 1651
        XML_CATALOG_PREFER_VALUE = 1652 : 1652
        XML_CATALOG_NOT_CATALOG = 1653 : 1653
        XML_CATALOG_RECURSION = 1654 : 1654
        XML_SCHEMAP_PREFIX_UNDEFINED = 1700
        XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 : 1701
        XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 : 1702
        XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 : 1703
        XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 : 1704
        XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 : 1705
        XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 : 1706
        XML_SCHEMAP_EXTENSION_NO_BASE = 1707 : 1707
        XML_SCHEMAP_FACET_NO_VALUE = 1708 : 1708
        XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 : 1709
        XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 : 1710
        XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 : 1711
        XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 : 1712
        XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 : 1713
        XML_SCHEMAP_INVALID_BOOLEAN = 1714 : 1714
        XML_SCHEMAP_INVALID_ENUM = 1715 : 1715
        XML_SCHEMAP_INVALID_FACET = 1716 : 1716
        XML_SCHEMAP_INVALID_FACET_VALUE = 1717 : 1717
        XML_SCHEMAP_INVALID_MAXOCCURS = 1718 : 1718
        XML_SCHEMAP_INVALID_MINOCCURS = 1719 : 1719
        XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 : 1720
        XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 : 1721
        XML_SCHEMAP_NOATTR_NOREF = 1722 : 1722
        XML_SCHEMAP_NOTATION_NO_NAME = 1723 : 1723
        XML_SCHEMAP_NOTYPE_NOREF = 1724 : 1724
        XML_SCHEMAP_REF_AND_SUBTYPE = 1725 : 1725
        XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 : 1726
        XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 : 1727
        XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 : 1728
        XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 : 1729
        XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 : 1730
        XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 : 1731
        XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 : 1732
        XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 : 1733
        XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 : 1734
        XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 : 1735
        XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 : 1736
        XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 : 1737
        XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 : 1738
        XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 : 1739
        XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 : 1740
        XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 : 1741
        XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 : 1742
        XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 : 1743
        XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 : 1744
        XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 : 1745
        XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 : 1746
        XML_SCHEMAP_UNKNOWN_REF = 1747 : 1747
        XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 : 1748
        XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 : 1749
        XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 : 1750
        XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 : 1751
        XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 : 1752
        XML_SCHEMAP_UNKNOWN_TYPE = 1753 : 1753
        XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 : 1754
        XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 : 1755
        XML_SCHEMAP_REGEXP_INVALID = 1756 : 1756
        XML_SCHEMAP_FAILED_LOAD = 1757 : 1757
        XML_SCHEMAP_NOTHING_TO_PARSE = 1758 : 1758
        XML_SCHEMAP_NOROOT = 1759 : 1759
        XML_SCHEMAP_REDEFINED_GROUP = 1760 : 1760
        XML_SCHEMAP_REDEFINED_TYPE = 1761 : 1761
        XML_SCHEMAP_REDEFINED_ELEMENT = 1762 : 1762
        XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 : 1763
        XML_SCHEMAP_REDEFINED_ATTR = 1764 : 1764
        XML_SCHEMAP_REDEFINED_NOTATION = 1765 : 1765
        XML_SCHEMAP_FAILED_PARSE = 1766 : 1766
        XML_SCHEMAP_UNKNOWN_PREFIX = 1767 : 1767
        XML_SCHEMAP_DEF_AND_PREFIX = 1768 : 1768
        XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 : 1769
        XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 : 1770
        XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 : 1771
        XML_SCHEMAP_NOT_SCHEMA = 1772 : 1772
        XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 : 1773
        XML_SCHEMAP_INVALID_ATTR_USE = 1774 : 1774
        XML_SCHEMAP_RECURSIVE = 1775 : 1775
        XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 : 1776
        XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 : 1777
        XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 : 1778
        XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 : 1779
        XML_SCHEMAP_INVALID_ATTR_NAME = 1780 : 1780
        XML_SCHEMAP_REF_AND_CONTENT = 1781 : 1781
        XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 : 1782
        XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 : 1783
        XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 : 1784
        XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 : 1785
        XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 : 1786
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 : 1787
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 : 1788
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 : 1789
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 : 1790
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 : 1791
        XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 : 1792
        XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 : 1793
        XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 : 1794
        XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 : 1795
        XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 : 1796
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 : 1797
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 : 1798
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 : 1799
        XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 : 1800
        XML_SCHEMAV_NOROOT = 1801
        XML_SCHEMAV_UNDECLAREDELEM = 1802 : 1802
        XML_SCHEMAV_NOTTOPLEVEL = 1803 : 1803
        XML_SCHEMAV_MISSING = 1804 : 1804
        XML_SCHEMAV_WRONGELEM = 1805 : 1805
        XML_SCHEMAV_NOTYPE = 1806 : 1806
        XML_SCHEMAV_NOROLLBACK = 1807 : 1807
        XML_SCHEMAV_ISABSTRACT = 1808 : 1808
        XML_SCHEMAV_NOTEMPTY = 1809 : 1809
        XML_SCHEMAV_ELEMCONT = 1810 : 1810
        XML_SCHEMAV_HAVEDEFAULT = 1811 : 1811
        XML_SCHEMAV_NOTNILLABLE = 1812 : 1812
        XML_SCHEMAV_EXTRACONTENT = 1813 : 1813
        XML_SCHEMAV_INVALIDATTR = 1814 : 1814
        XML_SCHEMAV_INVALIDELEM = 1815 : 1815
        XML_SCHEMAV_NOTDETERMINIST = 1816 : 1816
        XML_SCHEMAV_CONSTRUCT = 1817 : 1817
        XML_SCHEMAV_INTERNAL = 1818 : 1818
        XML_SCHEMAV_NOTSIMPLE = 1819 : 1819
        XML_SCHEMAV_ATTRUNKNOWN = 1820 : 1820
        XML_SCHEMAV_ATTRINVALID = 1821 : 1821
        XML_SCHEMAV_VALUE = 1822 : 1822
        XML_SCHEMAV_FACET = 1823 : 1823
        XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 : 1824
        XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 : 1825
        XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 : 1826
        XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 : 1827
        XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 : 1828
        XML_SCHEMAV_CVC_FACET_VALID = 1829 : 1829
        XML_SCHEMAV_CVC_LENGTH_VALID = 1830 : 1830
        XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 : 1831
        XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 : 1832
        XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 : 1833
        XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 : 1834
        XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 : 1835
        XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 : 1836
        XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 : 1837
        XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 : 1838
        XML_SCHEMAV_CVC_PATTERN_VALID = 1839 : 1839
        XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 : 1840
        XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 : 1841
        XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 : 1842
        XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 : 1843
        XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 : 1844
        XML_SCHEMAV_CVC_ELT_1 = 1845 : 1845
        XML_SCHEMAV_CVC_ELT_2 = 1846 : 1846
        XML_SCHEMAV_CVC_ELT_3_1 = 1847 : 1847
        XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 : 1848
        XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 : 1849
        XML_SCHEMAV_CVC_ELT_4_1 = 1850 : 1850
        XML_SCHEMAV_CVC_ELT_4_2 = 1851 : 1851
        XML_SCHEMAV_CVC_ELT_4_3 = 1852 : 1852
        XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 : 1853
        XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 : 1854
        XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 : 1855
        XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 : 1856
        XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 : 1857
        XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 : 1858
        XML_SCHEMAV_CVC_ELT_6 = 1859 : 1859
        XML_SCHEMAV_CVC_ELT_7 = 1860 : 1860
        XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 : 1861
        XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 : 1862
        XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 : 1863
        XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 : 1864
        XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 : 1865
        XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 : 1866
        XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 : 1867
        XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 : 1868
        XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 : 1869
        XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 : 1870
        XML_SCHEMAV_ELEMENT_CONTENT = 1871 : 1871
        XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 : 1872
        XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 : 1873
        XML_SCHEMAV_CVC_AU = 1874 : 1874
        XML_SCHEMAV_CVC_TYPE_1 = 1875 : 1875
        XML_SCHEMAV_CVC_TYPE_2 = 1876 : 1876
        XML_SCHEMAV_CVC_IDC = 1877 : 1877
        XML_SCHEMAV_CVC_WILDCARD = 1878 : 1878
        XML_SCHEMAV_MISC = 1879 : 1879
        XML_XPTR_UNKNOWN_SCHEME = 1900
        XML_XPTR_CHILDSEQ_START = 1901 : 1901
        XML_XPTR_EVAL_FAILED = 1902 : 1902
        XML_XPTR_EXTRA_OBJECTS = 1903 : 1903
        XML_C14N_CREATE_CTXT = 1950
        XML_C14N_REQUIRES_UTF8 = 1951 : 1951
        XML_C14N_CREATE_STACK = 1952 : 1952
        XML_C14N_INVALID_NODE = 1953 : 1953
        XML_C14N_UNKNOW_NODE = 1954 : 1954
        XML_C14N_RELATIVE_NAMESPACE = 1955 : 1955
        XML_FTP_PASV_ANSWER = 2000
        XML_FTP_EPSV_ANSWER = 2001 : 2001
        XML_FTP_ACCNT = 2002 : 2002
        XML_FTP_URL_SYNTAX = 2003 : 2003
        XML_HTTP_URL_SYNTAX = 2020
        XML_HTTP_USE_IP = 2021 : 2021
        XML_HTTP_UNKNOWN_HOST = 2022 : 2022
        XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000
        XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 : 3001
        XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 : 3002
        XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 : 3003
        XML_SCHEMAP_SRC_RESOLVE = 3004 : 3004
        XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 : 3005
        XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 : 3006
        XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 : 3007
        XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 : 3008
        XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 : 3009
        XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 : 3010
        XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 : 3011
        XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 : 3012
        XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 : 3013
        XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 : 3014
        XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 : 3015
        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 : 3016
        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 : 3017
        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 : 3018
        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 : 3019
        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 : 3020
        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 : 3021
        XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 : 3022
        XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 : 3023
        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 : 3024
        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 : 3025
        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 : 3026
        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 : 3027
        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 : 3028
        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 : 3029
        XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 : 3030
        XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 : 3031
        XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 : 3032
        XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 : 3033
        XML_SCHEMAP_S4S_ELEM_MISSING = 3034 : 3034
        XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 : 3035
        XML_SCHEMAP_S4S_ATTR_MISSING = 3036 : 3036
        XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 : 3037
        XML_SCHEMAP_SRC_ELEMENT_1 = 3038 : 3038
        XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 : 3039
        XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 : 3040
        XML_SCHEMAP_SRC_ELEMENT_3 = 3041 : 3041
        XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 : 3042
        XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 : 3043
        XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 : 3044
        XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 : 3045
        XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 : 3046
        XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 : 3047
        XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 : 3048
        XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 : 3049
        XML_SCHEMAP_SRC_INCLUDE = 3050 : 3050
        XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 : 3051
        XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 : 3052
        XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 : 3053
        XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 : 3054
        XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 : 3055
        XML_SCHEMAP_NO_XMLNS = 3056 : 3056
        XML_SCHEMAP_NO_XSI = 3057 : 3057
        XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 : 3058
        XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 : 3059
        XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 : 3060
        XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 : 3061
        XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 : 3062
        XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 : 3063
        XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 : 3064
        XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 : 3065
        XML_SCHEMAP_SRC_IMPORT_2 = 3066 : 3066
        XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 : 3067
        XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 : 3068
        XML_SCHEMAP_INTERNAL = 3069 : 3069 non-W3C
        XML_SCHEMAP_NOT_DETERMINISTIC = 3070 : 3070 non-W3C
        XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 : 3071
        XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 : 3072
        XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 : 3073
        XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 : 3074
        XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 : 3075
        XML_SCHEMAP_SRC_CT_1 = 3076 : 3076
        XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 : 3077
        XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 : 3078
        XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 : 3079
        XML_SCHEMAP_C_PROPS_CORRECT = 3080 : 3080
        XML_SCHEMAP_SRC_REDEFINE = 3081 : 3081
        XML_SCHEMAP_SRC_IMPORT = 3082 : 3082
        XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 : 3083
        XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 : 3084
        XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 : 3085
        XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 : 3085
        XML_SCHEMAP_AG_PROPS_CORRECT = 3087 : 3086
        XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 : 3087
        XML_SCHEMAP_AU_PROPS_CORRECT = 3089 : 3088
        XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 : 3089
        XML_SCHEMAP_COS_ALL_LIMITED = 3091 : 3090
        XML_SCHEMATRONV_ASSERT = 4000 : 4000
        XML_SCHEMATRONV_REPORT = 4001
        XML_MODULE_OPEN = 4900 : 4900
        XML_MODULE_CLOSE = 4901 : 4901
        XML_CHECK_FOUND_ELEMENT = 5000
        XML_CHECK_FOUND_ATTRIBUTE = 5001 : 5001
        XML_CHECK_FOUND_TEXT = 5002 : 5002
        XML_CHECK_FOUND_CDATA = 5003 : 5003
        XML_CHECK_FOUND_ENTITYREF = 5004 : 5004
        XML_CHECK_FOUND_ENTITY = 5005 : 5005
        XML_CHECK_FOUND_PI = 5006 : 5006
        XML_CHECK_FOUND_COMMENT = 5007 : 5007
        XML_CHECK_FOUND_DOCTYPE = 5008 : 5008
        XML_CHECK_FOUND_FRAGMENT = 5009 : 5009
        XML_CHECK_FOUND_NOTATION = 5010 : 5010
        XML_CHECK_UNKNOWN_NODE = 5011 : 5011
        XML_CHECK_ENTITY_TYPE = 5012 : 5012
        XML_CHECK_NO_PARENT = 5013 : 5013
        XML_CHECK_NO_DOC = 5014 : 5014
        XML_CHECK_NO_NAME = 5015 : 5015
        XML_CHECK_NO_ELEM = 5016 : 5016
        XML_CHECK_WRONG_DOC = 5017 : 5017
        XML_CHECK_NO_PREV = 5018 : 5018
        XML_CHECK_WRONG_PREV = 5019 : 5019
        XML_CHECK_NO_NEXT = 5020 : 5020
        XML_CHECK_WRONG_NEXT = 5021 : 5021
        XML_CHECK_NOT_DTD = 5022 : 5022
        XML_CHECK_NOT_ATTR = 5023 : 5023
        XML_CHECK_NOT_ATTR_DECL = 5024 : 5024
        XML_CHECK_NOT_ELEM_DECL = 5025 : 5025
        XML_CHECK_NOT_ENTITY_DECL = 5026 : 5026
        XML_CHECK_NOT_NS_DECL = 5027 : 5027
        XML_CHECK_NO_HREF = 5028 : 5028
        XML_CHECK_WRONG_PARENT = 5029 : 5029
        XML_CHECK_NS_SCOPE = 5030 : 5030
        XML_CHECK_NS_ANCESTOR = 5031 : 5031
        XML_CHECK_NOT_UTF8 = 5032 : 5032
        XML_CHECK_NO_DICT = 5033 : 5033
        XML_CHECK_NOT_NCNAME = 5034 : 5034
        XML_CHECK_OUTSIDE_DICT = 5035 : 5035
        XML_CHECK_WRONG_NAME = 5036 : 5036
        XML_CHECK_NAME_NOT_NULL = 5037 : 5037
        XML_I18N_NO_NAME = 6000
        XML_I18N_NO_HANDLER = 6001 : 6001
        XML_I18N_EXCESS_HANDLER = 6002 : 6002
        XML_I18N_CONV_FAILED = 6003 : 6003
        XML_I18N_NO_OUTPUT = 6004 : 6004
        XML_BUF_OVERFLOW = 7000
    }
    

    Function: initGenericErrorDefaultFunc

    void	initGenericErrorDefaultFunc	(xmlGenericErrorFunc * handler)

    Set or reset (if NULL) the default handler for generic errors to the builtin error function.

    handler:the handler

    Function: xmlCopyError

    int	xmlCopyError			(xmlErrorPtr from, 
    xmlErrorPtr to)

    Save the original error to the new place.

    from:a source error
    to:a target error
    Returns:0 in case of success and -1 in case of error.

    Function: xmlCtxtGetLastError

    xmlErrorPtr	xmlCtxtGetLastError	(void * ctx)

    Get the last parsing error registered.

    ctx:an XML parser context
    Returns:NULL if no error occured or a pointer to the error

    Function: xmlCtxtResetLastError

    void	xmlCtxtResetLastError		(void * ctx)

    Cleanup the last global error registered. For parsing error this does not change the well-formedness result.

    ctx:an XML parser context

    Function type: xmlGenericErrorFunc

    Function type: xmlGenericErrorFunc
    void	xmlGenericErrorFunc		(void * ctx, 
    const char * msg,
    ... ...)

    Signature of the function to use when there is an error and no parsing or validity context available .

    ctx:a parsing context
    msg:the message
    ...:the extra arguments of the varags to format the message

    Function: xmlGetLastError

    xmlErrorPtr	xmlGetLastError		(void)

    Get the last global error registered. This is per thread if compiled with thread support.

    Returns:NULL if no error occured or a pointer to the error

    Function: xmlParserError

    void	xmlParserError			(void * ctx, 
    const char * msg,
    ... ...)

    Display and format an error messages, gives file, line, position and extra parameters.

    ctx:an XML parser context
    msg:the message to display/transmit
    ...:extra parameters for the message display

    Function: xmlParserPrintFileContext

    void	xmlParserPrintFileContext	(xmlParserInputPtr input)

    Displays current context within the input content for error tracking

    input:an xmlParserInputPtr input

    Function: xmlParserPrintFileInfo

    void	xmlParserPrintFileInfo		(xmlParserInputPtr input)

    Displays the associated file and line informations for the current input

    input:an xmlParserInputPtr input

    Function: xmlParserValidityError

    void	xmlParserValidityError		(void * ctx, 
    const char * msg,
    ... ...)

    Display and format an validity error messages, gives file, line, position and extra parameters.

    ctx:an XML parser context
    msg:the message to display/transmit
    ...:extra parameters for the message display

    Function: xmlParserValidityWarning

    void	xmlParserValidityWarning	(void * ctx, 
    const char * msg,
    ... ...)

    Display and format a validity warning messages, gives file, line, position and extra parameters.

    ctx:an XML parser context
    msg:the message to display/transmit
    ...:extra parameters for the message display

    Function: xmlParserWarning

    void	xmlParserWarning		(void * ctx, 
    const char * msg,
    ... ...)

    Display and format a warning messages, gives file, line, position and extra parameters.

    ctx:an XML parser context
    msg:the message to display/transmit
    ...:extra parameters for the message display

    Function: xmlResetError

    void	xmlResetError			(xmlErrorPtr err)

    Cleanup the error.

    err:pointer to the error.

    Function: xmlResetLastError

    void	xmlResetLastError		(void)

    Cleanup the last global error registered. For parsing error this does not change the well-formedness result.

    Function: xmlSetGenericErrorFunc

    void	xmlSetGenericErrorFunc		(void * ctx, 
    xmlGenericErrorFunc handler)

    Function to reset the handler and the error context for out of context error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler One can simply force messages to be emitted to another FILE * than stderr by setting @ctx to this file handle and @handler to NULL. For multi-threaded applications, this must be set separately for each thread.

    ctx:the new error handling context
    handler:the new handler function

    Function: xmlSetStructuredErrorFunc

    void	xmlSetStructuredErrorFunc	(void * ctx, 
    xmlStructuredErrorFunc handler)

    Function to reset the handler and the error context for out of context structured error messages. This simply means that @handler will be called for subsequent error messages while not parsing nor validating. And @ctx will be passed as first argument to @handler For multi-threaded applications, this must be set separately for each thread.

    ctx:the new error handling context
    handler:the new handler function

    Function type: xmlStructuredErrorFunc

    Function type: xmlStructuredErrorFunc
    void	xmlStructuredErrorFunc		(void * userData, 
    xmlErrorPtr error)

    Signature of the function to use when there is an error and the module handles the new error reporting mechanism.

    userData:user provided data for the error callback
    error:the error being raised.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk1.html0000644000175000017500000011116512134171042015732 0ustar aronaron API Alphabetic Index C-C for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index C-C for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter C:

    C14N
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlC14NIsVisibleCallback
    CATALOG
    xmlLoadACatalog
    xmlLoadCatalog
    xmlLoadSGMLSuperCatalog
    CDATA
    HTML_PRESERVE_NODE
    _htmlElemDesc
    xmlKeepBlanksDefault
    xmlNewCDataBlock
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlParseAttValue
    xmlParseAttributeType
    xmlParseCDSect
    xmlParseCharData
    xmlTextWriterEndCDATA
    xmlTextWriterStartCDATA
    xmlTextWriterWriteCDATA
    xmlTextWriterWriteFormatCDATA
    xmlTextWriterWriteVFormatCDATA
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    CDEnd
    xmlParseCDSect
    CDSect
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCDSect
    xmlParseContent
    xmlParseInNodeContext
    CDStart
    xmlParseCDSect
    CData
    xmlParseCDSect
    xmlRelaxNGValidatePushCData
    xmlValidatePushCData
    CJKCompatibility
    xmlUCSIsCJKCompatibility
    CJKCompatibilityForms
    xmlUCSIsCJKCompatibilityForms
    CJKCompatibilityIdeographs
    xmlUCSIsCJKCompatibilityIdeographs
    CJKCompatibilityIdeographsSupplement
    xmlUCSIsCJKCompatibilityIdeographsSupplement
    CJKRadicalsSupplement
    xmlUCSIsCJKRadicalsSupplement
    CJKSymbolsandPunctuation
    xmlUCSIsCJKSymbolsandPunctuation
    CJKUnifiedIdeographs
    xmlUCSIsCJKUnifiedIdeographs
    CJKUnifiedIdeographsExtensionA
    xmlUCSIsCJKUnifiedIdeographsExtensionA
    CJKUnifiedIdeographsExtensionB
    xmlUCSIsCJKUnifiedIdeographsExtensionB
    CVS
    LIBXML_VERSION_EXTRA
    CWD
    xmlNanoFTPCwd
    Cache
    _xmlXPathContext
    Call
    htmlInitAutoClose
    xmlInitParser
    xmlXPathOrderDocElems
    Callback
    externalSubset
    externalSubsetSAXFunc
    internalSubset
    internalSubsetSAXFunc
    xmlEntityReferenceFunc
    xmlHashCopier
    xmlHashDeallocator
    xmlHashScanner
    xmlHashScannerFull
    xmlInputCloseCallback
    xmlInputMatchCallback
    xmlInputOpenCallback
    xmlInputReadCallback
    xmlListDataCompare
    xmlListDeallocator
    xmlListWalker
    xmlOutputCloseCallback
    xmlOutputMatchCallback
    xmlOutputOpenCallback
    xmlOutputWriteCallback
    xmlParserInputDeallocate
    xmlRegExecCallbacks
    xmlSAX2ExternalSubset
    xmlSAX2InternalSubset
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    Callback:
    resolveEntitySAXFunc
    Called
    cdataBlockSAXFunc
    endDocumentSAXFunc
    endElementSAXFunc
    referenceSAXFunc
    startDocumentSAXFunc
    startElementSAXFunc
    Calling
    xmlRegisterHTTPPostCallbacks
    Canonical
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    Canonicalization
    LIBXML_C14N_ENABLED
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    Carl
    xmlURIEscape
    Catalog
    LIBXML_CATALOG_ENABLED
    XML_CATALOG_PI
    xmlACatalogAdd
    xmlACatalogDump
    xmlACatalogRemove
    xmlACatalogResolve
    xmlACatalogResolvePublic
    xmlACatalogResolveSystem
    xmlACatalogResolveURI
    xmlCatalogSetDefaultPrefer
    xmlFreeCatalog
    xmlLoadACatalog
    xmlNewCatalog
    Catalogs
    XML_CATALOGS_NAMESPACE
    xmlLoadACatalog
    xmlLoadSGMLSuperCatalog
    Change
    xmlSetFeature
    xmlTextReaderSetParserProp
    Changes
    xmlSetExternalEntityLoader
    Char
    IS_BYTE_CHAR
    IS_CHAR
    xmlParseCDSect
    xmlParseCharRef
    xmlParseComment
    xmlParsePI
    CharData
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCharData
    xmlParseContent
    xmlParseInNodeContext
    CharRef
    htmlParseCharRef
    xmlCharEncOutFunc
    xmlDecodeEntities
    xmlEncodeEntitiesReentrant
    xmlParseCharRef
    xmlParseReference
    xmlParserHandleReference
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    Character
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemoryEnc
    xmlGetCharEncodingName
    xmlParseCharEncoding
    xmlParseCharRef
    Characters
    xmlParseCharRef
    Checka
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    Checks
    htmlAttrAllowed
    htmlElementAllowedHere
    htmlElementAllowedHereDesc
    htmlElementStatusHere
    htmlNodeStatus
    xmlAutomataIsDeterminist
    xmlCheckLanguageID
    xmlCheckUTF8
    xmlIsBlankNode
    xmlSchemaCheckFacet
    xmlSchemaValidateListSimpleTypeFacet
    xmlXPathNodeSetIsEmpty
    xmlXPathStackIsExternal
    Cherokee
    xmlUCSIsCherokee
    Children
    xmlParseElementContentDecl
    Chunk
    docbParseChunk
    htmlParseChunk
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseChunk
    xmlParseInNodeContext
    Cleanup
    xmlCleanupCharEncodingHandlers
    xmlCleanupPredefinedEntities
    xmlCtxtResetLastError
    xmlNanoFTPCleanup
    xmlNanoHTTPCleanup
    xmlRelaxNGCleanupTypes
    xmlResetError
    xmlResetLastError
    xmlSchemaCleanupTypes
    xmlSchemaFreeValue
    xmlXPathRegisteredFuncsCleanup
    xmlXPathRegisteredNsCleanup
    xmlXPathRegisteredVariablesCleanup
    Clear
    xmlClearNodeInfoSeq
    xmlClearParserCtxt
    xmlPopInputCallbacks
    Clears
    xmlSetupParserForBuffer
    Close
    xmlFileClose
    xmlIOFTPClose
    xmlIOHTTPClose
    xmlNanoFTPClose
    xmlNanoFTPCloseConnection
    xmlSaveClose
    Closed
    xmlTextReaderClose
    CombiningChar
    IS_COMBINING
    xmlNamespaceParseNCName
    xmlParseName
    xmlScanName
    xmlXPathParseNCName
    xmlXPathParseName
    CombiningDiacriticalMarks
    xmlUCSIsCombiningDiacriticalMarks
    CombiningDiacriticalMarksforSymbols
    xmlUCSIsCombiningDiacriticalMarksforSymbols
    CombiningHalfMarks
    xmlUCSIsCombiningHalfMarks
    CombiningMarksforSymbols
    xmlUCSIsCombiningMarksforSymbols
    Comment
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseComment
    xmlParseContent
    xmlParseInNodeContext
    xmlParseMarkupDecl
    xmlParseMisc
    Compare
    xmlParseCharEncoding
    xmlSchemaCompareValues
    xmlSchemaCompareValuesWhtsp
    xmlXPathCmpNodes
    Compile
    xmlAutomataCompile
    xmlPatterncompile
    xmlXPathCompile
    xmlXPathCtxtCompile
    xmlXPathStringEvalNumber
    Compress
    docbCreateFileParserCtxt
    docbParseFile
    docbSAXParseFile
    htmlCreateFileParserCtxt
    htmlParseFile
    htmlSAXParseFile
    xmlCreateEntityParserCtxt
    xmlCreateFileParserCtxt
    xmlCreateURLParserCtxt
    xmlOutputBufferCreateFilename
    xmlParseFile
    xmlParserInputBufferCreateFilename
    xmlRecoverFile
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXUserParseFile
    Computes
    xmlBuildURI
    Concat
    xmlTextConcat
    Constructs
    xmlCanonicPath
    xmlPathToURI
    Content
    xmlNodeGetBase
    xmlParseElementContentDecl
    Content-Type
    xmlNanoHTTPFetch
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    Contrary
    xmlEncodeEntitiesReentrant
    ControlPictures
    xmlUCSIsControlPictures
    Convenient
    xmlBoolToText
    Convert
    xmlCatalogConvert
    xmlConvertSGMLCatalog
    Converts
    xmlXPathCastBooleanToNumber
    xmlXPathCastBooleanToString
    xmlXPathCastNodeSetToBoolean
    xmlXPathCastNodeSetToNumber
    xmlXPathCastNodeSetToString
    xmlXPathCastNodeToNumber
    xmlXPathCastNodeToString
    xmlXPathCastNumberToBoolean
    xmlXPathCastNumberToString
    xmlXPathCastStringToBoolean
    xmlXPathCastStringToNumber
    xmlXPathCastToBoolean
    xmlXPathCastToNumber
    xmlXPathCastToString
    xmlXPathConvertBoolean
    xmlXPathConvertNumber
    xmlXPathConvertString
    Copies
    xmlSchemaCopyValue
    Copy
    xmlCopyEnumeration
    xmlGetFeaturesList
    xmlReconciliateNs
    Correct
    xmlSetCompressMode
    xmlSetDocCompressMode
    Could
    _xmlSchemaType
    Count
    xmlLsCountNode
    Creates
    htmlNewDoc
    htmlNewDocNoDtD
    xmlCreateDocParserCtxt
    xmlExpNewCtxt
    xmlNewDoc
    xmlXIncludeNewContext
    xmlXPathContextSetCache
    Creation
    xmlNewCDataBlock
    xmlNewCharRef
    xmlNewChild
    xmlNewComment
    xmlNewDocComment
    xmlNewDocFragment
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocPI
    xmlNewDocRawNode
    xmlNewDocText
    xmlNewDocTextLen
    xmlNewDtd
    xmlNewGlobalNs
    xmlNewNode
    xmlNewNodeEatName
    xmlNewNs
    xmlNewPI
    xmlNewReference
    xmlNewText
    xmlNewTextChild
    xmlNewTextLen
    CurrencySymbols
    xmlUCSIsCurrencySymbols
    Current
    _xmlParserCtxt
    _xmlParserInput
    _xmlValidCtxt
    Currently
    xmlDOMWrapCloneNode
    xmlNanoFTPGetConnection
    xmlNanoFTPInit
    xmlNanoHTTPInit
    xmlTextReaderNextSibling
    Cut
    xmlReconciliateNs
    CypriotSyllabary
    xmlUCSIsCypriotSyllabary
    Cyrillic
    xmlUCSIsCyrillic
    CyrillicSupplement
    xmlUCSIsCyrillicSupplement

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk6.html0000644000175000017500000007053412134171042015743 0ustar aronaron API Alphabetic Index Q-R for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index Q-R for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter Q:

    QName
    xmlBuildQName
    xmlDictQLookup
    xmlHashQLookup
    xmlNamespaceParseQName
    xmlParseAttribute
    xmlParseEndTag
    xmlParseStartTag
    xmlSchemaGetCanonValue
    xmlSchemaNewQNameValue
    xmlSetProp
    xmlSplitQName
    xmlSplitQName2
    xmlSplitQName3
    xmlStrQEqual
    xmlValidateQName
    QNames
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlHashQLookup2
    QUIT
    xmlNanoFTPQuit
    Qualified
    xmlSplitQName3
    Query
    xmlDictSize
    xmlHashSize
    xmlStreamWantsAnyNode

    Letter R:

    REC
    IS_BASECHAR
    IS_COMBINING
    IS_DIGIT
    xmlCheckLanguageID
    REC-xml
    xmlGetCharEncodingName
    xmlParserHandlePEReference
    xmlParserHandleReference
    REFs
    XML_DETECT_IDS
    XML_SKIP_IDS
    REQUIRED
    xmlParseAttributeType
    xmlParseDefaultDecl
    RFC
    xmlBuildURI
    xmlCheckLanguageID
    xmlNodeGetBase
    xmlNormalizeURIPath
    xmlParseURI
    xmlParseURIReference
    RFC2396
    xmlURIEscape
    Raises
    xmlXPathSetArityError
    xmlXPathSetError
    xmlXPathSetTypeError
    Read
    xmlBufGetNodeContent
    xmlFileRead
    xmlGetFeature
    xmlGetUTF8Char
    xmlIOFTPRead
    xmlIOHTTPRead
    xmlNodeBufGetContent
    xmlNodeGetContent
    xmlTextReaderConstValue
    xmlTextReaderGetParserProp
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    Reader
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    Readers
    xmlTextReaderNextSibling
    Reads
    xmlTextReaderCurrentNode
    xmlTextReaderExpand
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlTextReaderReadString
    Rec
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    Receive
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlParseDefaultDecl
    xmlSAX2SetDocumentLocator
    Receiving
    charactersSAXFunc
    ignorableWhitespaceSAXFunc
    Recurse
    xmlSearchNsByHref
    Recursion
    xmlParsePEReference
    xmlParserHandlePEReference
    Ref
    _xmlRef
    xmlAddRef
    xmlFreeRefTable
    xmlIsRef
    xmlRemoveRef
    Reference
    htmlParseCharRef
    xmlDecodeEntities
    xmlParseAttValue
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCharRef
    xmlParseContent
    xmlParseEntityValue
    xmlParseInNodeContext
    xmlParseReference
    xmlParserHandleReference
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    Reference:
    xmlTextReaderNodeType
    References
    xmlBuildURI
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlParseAttribute
    Reflects
    XML_SCHEMAS_QUALIF_ATTR
    XML_SCHEMAS_QUALIF_ELEM
    Refresh
    xmlParserInputBufferRead
    Reg
    xmlAutomataCompile
    Register
    xmlAddAttributeDecl
    xmlAddDocEntity
    xmlAddDtdEntity
    xmlAddElementDecl
    xmlAddID
    xmlAddNotationDecl
    xmlAddRef
    xmlRegisterCharEncodingHandler
    xmlRegisterInputCallbacks
    xmlRegisterOutputCallbacks
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetStructuredErrorHandler
    xmlXPathRegisterFunc
    xmlXPathRegisterFuncNS
    xmlXPathRegisterNs
    xmlXPathRegisterVariable
    xmlXPathRegisterVariableNS
    RegisterNodeFunc
    xmlRegisterNodeDefault
    Registers
    xmlAddEncodingAlias
    xmlDeregisterNodeDefault
    xmlOutputBufferCreateFilenameDefault
    xmlParserInputBufferCreateFilenameDefault
    xmlRegisterDefaultInputCallbacks
    xmlRegisterDefaultOutputCallbacks
    xmlRegisterNodeDefault
    xmlXPathRegisterAllFunctions
    xmlXPathRegisterFuncLookup
    Relative
    xmlBuildURI
    Relax-NG
    xmlRelaxNGGetParserErrors
    xmlRelaxNGGetValidErrors
    xmlRelaxNGParse
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetParserStructuredErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxNGSetValidStructuredErrors
    xmlRelaxNGValidateDoc
    xmlRelaxNGValidityErrorFunc
    xmlRelaxNGValidityWarningFunc
    RelaxNG
    _xmlSchemaElement
    xmlRelaxNGCleanupTypes
    xmlRelaxNGDump
    xmlRelaxNGDumpTree
    xmlRelaxNGFree
    xmlRelaxNGNewDocParserCtxt
    xmlRelaxNGParse
    xmlRelaxNGValidatePopElement
    xmlRelaxNGValidatePushCData
    xmlRelaxNGValidatePushElement
    xmlRelaxParserSetFlag
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    RelaxNGs
    xmlRelaxNGNewDocParserCtxt
    xmlRelaxNGNewMemParserCtxt
    xmlRelaxNGNewParserCtxt
    xmlRelaxNGNewValidCtxt
    Remove
    xmlACatalogRemove
    xmlBufShrink
    xmlBufferDetach
    xmlBufferShrink
    xmlCatalogRemove
    xmlListClear
    xmlListRemoveAll
    xmlListRemoveFirst
    xmlListRemoveLast
    xmlParserHandleReference
    xmlRemoveID
    xmlRemoveRef
    xmlUnsetNsProp
    xmlUnsetProp
    Removes
    xmlListPopBack
    xmlListPopFront
    xmlSchemaCollapseString
    xmlXPathNodeSetDel
    xmlXPathNodeSetRemove
    xmlXPtrLocationSetDel
    xmlXPtrLocationSetRemove
    Replace
    xmlNodeSetContent
    xmlNodeSetContentLen
    Replaces
    xmlSchemaWhiteSpaceReplace
    Required
    _htmlElemDesc
    htmlAttrAllowed
    xmlParseDefaultDecl
    xmlValidateOneElement
    Reset
    htmlCtxtReset
    xmlCtxtReset
    xmlCtxtResetPush
    Resize
    xmlBufferResize
    Resolves
    xmlTextReaderLookupNamespace
    Resolving
    xmlBuildURI
    Retrieve
    xmlTextReaderGetErrorHandler
    xmlTextReaderIsValid
    Return
    CHECK_TYPE0
    Returns
    htmlDefaultSubelement
    htmlElementAllowedHereDesc
    htmlRequiredAttrs
    xmlGetDocEntity
    xmlGetDtdEntity
    xmlGetParameterEntity
    xmlHasFeature
    xmlLinkGetData
    xmlXPathCheckError
    xmlXPathGetContextNode
    xmlXPathGetDocument
    xmlXPathGetError
    xmlXPathNodeSetGetLength
    xmlXPathNodeSetIsEmpty
    xmlXPathNodeSetItem
    xmlXPathStackIsExternal
    xmlXPathStackIsNodeSet
    Returns:
    xmlRegExecErrInfo
    xmlRegExecNextValues
    Reverse
    xmlListReverse
    Root
    xmlParseDocTypeDecl
    xmlValidateRoot
    Runic
    xmlUCSIsRunic

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk2.html0000644000175000017500000011745312134171042015741 0ustar aronaron API Alphabetic Index D-E for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index D-E for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter D:

    DEBUG_MEMORY
    DEBUG_MEMORY
    DEBUG_MEMORY_FREED
    DEBUG_MEMORY
    DEBUG_MEMORY_LOCATION
    DEBUG_MEMORY
    DELE
    xmlNanoFTPDele
    DELEGATE
    xmlLoadSGMLSuperCatalog
    DEMO
    getPublicId
    xmlSAX2GetPublicId
    DEPRECATED
    checkNamespace
    getNamespace
    globalNamespace
    namespaceDecl
    setDocumentLocator
    setNamespace
    xmlCatalogGetPublic
    xmlCatalogGetSystem
    xmlIsBaseChar
    xmlIsBlank
    xmlIsChar
    xmlIsCombining
    xmlIsDigit
    xmlIsExtender
    xmlIsIdeographic
    xmlIsPubidChar
    xmlNewGlobalNs
    DIGIT
    xmlCheckLanguageID
    DOCTYPE
    xmlParseDocTypeDecl
    DOM-wrapper
    xmlDOMWrapFreeCtxt
    xmlDOMWrapNewCtxt
    DTDs
    XML_COMPLETE_ATTRS
    xmlParserHandlePEReference
    Data
    xmlParseCDSect
    Datatype
    xmlRegexpCompile
    Datatypes
    xmlSchemaGetBuiltInListSimpleTypeItemType
    Deallocate
    xmlFreeAttributeTable
    xmlFreeElementTable
    xmlFreeEntitiesTable
    xmlFreeIDTable
    xmlFreeNotationTable
    xmlFreeRefTable
    xmlFreeTextReader
    xmlFreeTextWriter
    xmlRelaxNGFree
    xmlSchemaFree
    xmlSchemaFreeFacet
    xmlSchemaFreeType
    xmlSchematronFree
    Deallocates
    xmlSchemaFreeWildcard
    Debugging
    LIBXML_DEBUG_ENABLED
    xmlExpCtxtNbCons
    xmlExpCtxtNbNodes
    Declaration
    xmlParseElementDecl
    xmlParseMarkupDecl
    xmlParseSDDecl
    xmlValidCtxtNormalizeAttributeValue
    xmlValidateElementDecl
    Declared
    xmlParseEntityDecl
    xmlParseEntityRef
    xmlParsePEReference
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlValidateNotationUse
    Default
    xmlHandleEntity
    xmlParseAttributeType
    xmlParseDefaultDecl
    xmlValidateAttributeDecl
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    DefaultDecl
    xmlParseAttributeListDecl
    xmlParseDefaultDecl
    Deletes
    xmlListDelete
    Depth
    _xmlParserCtxt
    _xmlValidCtxt
    Dereference
    xmlExpFree
    DeregisterNodeFunc
    xmlDeregisterNodeDefault
    Deseret
    xmlUCSIsDeseret
    Determine
    htmlIsBooleanAttr
    xmlIsID
    xmlIsRef
    xmlTextReaderConstEncoding
    xmlTextReaderConstXmlVersion
    xmlTextReaderIsNamespaceDecl
    xmlTextReaderStandalone
    Devanagari
    xmlUCSIsDevanagari
    Different
    xmlStreamPushNode
    Digit
    IS_DIGIT
    xmlNamespaceParseNCName
    xmlParseName
    xmlScanName
    xmlXPathParseNCName
    xmlXPathParseName
    Digits
    xmlXPathStringEvalNumber
    Digits?
    xmlXPathStringEvalNumber
    Dingbats
    xmlUCSIsDingbats
    Display
    errorSAXFunc
    fatalErrorSAXFunc
    warningSAXFunc
    xmlParserError
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserWarning
    Displays
    xmlParserPrintFileContext
    xmlParserPrintFileInfo
    DocBook
    docbCreatePushParserCtxt
    initdocbDefaultSAXHandler
    xmlSAX2InitDocbDefaultSAXHandler
    Docbook
    LIBXML_DOCB_ENABLED
    _xmlParserCtxt
    docbParseFile
    Document
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemoryEnc
    xmlNodeGetBase
    xmlParseSDDecl
    xmlValidCtxtNormalizeAttributeValue
    xmlXIncludeNewContext
    Does
    hasExternalSubset
    hasExternalSubsetSAXFunc
    hasInternalSubset
    hasInternalSubsetSAXFunc
    xmlCharInRange
    xmlSAX2HasExternalSubset
    xmlSAX2HasInternalSubset
    xmlShellList
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    Douglas
    xmlURIEscape
    Draft
    xmlParseNamespace
    DtD
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlValidateDtd
    DtDs
    xlinkIsLink
    xmlIsMixedElement
    Dtd
    _xmlValidCtxt
    xmlValidGetValidElements
    Dumps
    xmlBufferDump
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpDTD
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpEntities
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlDebugDumpString
    xmlXPathDebugDumpCompExpr
    Duplicate
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlListDup
    xmlParseElementMixedContentDecl
    xmlValidateElementDecl

    Letter E:

    ELEMENT
    _xmlElementContent
    EMPTY
    xmlParseElementContentDecl
    ENTITIES
    xmlParseAttributeType
    xmlValidateAttributeValue
    xmlValidateDtdFinal
    ENTITY
    htmlParseEntityRef
    xmlParseAttributeType
    xmlParseEntityRef
    xmlParseEntityValue
    xmlValidateAttributeValue
    xmlValidateDtdFinal
    ENTITY_REF
    xmlBufGetNodeContent
    xmlNodeBufGetContent
    xmlNodeGetContent
    ENTITY_REFs
    xmlNewChild
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    ETag
    htmlParseElement
    xmlParseElement
    xmlParseEndTag
    EXSLT
    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathHasSameNodes
    xmlXPathIntersection
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathTrailing
    xmlXPathTrailingSorted
    Element
    _xmlAttribute
    _xmlElement
    _xmlElementContent
    htmlNodeStatus
    xmlFirstElementChild
    xmlLastElementChild
    xmlParseAttributeType
    xmlParseDocTypeDecl
    xmlParseElement
    xmlParseElementChildrenContentDecl
    xmlParseElementContentDecl
    xmlParseElementDecl
    xmlParseElementMixedContentDecl
    xmlTextReaderReadString
    xmlValidateElementDecl
    xmlValidateOneElement
    xmlValidateRoot
    ElementTable
    htmlTagLookup
    Empties
    xmlXPathEmptyNodeSet
    EmptyElemTag
    htmlParseElement
    xmlParseElement
    xmlParseStartTag
    EmptyElement
    xmlParseStartTag
    EncName
    xmlParseEncName
    xmlParseEncodingDecl
    Encapsulating
    xmlNodeGetBase
    EnclosedAlphanumerics
    xmlUCSIsEnclosedAlphanumerics
    EnclosedCJKLettersandMonths
    xmlUCSIsEnclosedCJKLettersandMonths
    Encoding
    htmlGetMetaEncoding
    xmlGetCharEncodingName
    xmlParseCharEncoding
    EncodingDecl
    xmlParseEncodingDecl
    xmlParseTextDecl
    EncodingDecl?
    xmlParseXMLDecl
    End
    _xmlDoc
    _xmlDtd
    _xmlNode
    xmlTextReaderGetRemainder
    xmlTextWriterEndAttribute
    xmlTextWriterEndCDATA
    xmlTextWriterEndComment
    xmlTextWriterEndDTD
    xmlTextWriterEndDTDAttlist
    xmlTextWriterEndDTDElement
    xmlTextWriterEndDTDEntity
    xmlTextWriterEndDocument
    xmlTextWriterEndElement
    xmlTextWriterEndPI
    xmlTextWriterFullEndElement
    End-of-Line
    xmlCurrentChar
    Ensures
    xmlDOMWrapReconcileNamespaces
    Entities
    xmlGetCharEncodingName
    xmlParseCharEncoding
    EntitiesTable
    htmlEntityLookup
    htmlEntityValueLookup
    Entity
    _xmlEntity
    xmlBufGetNodeContent
    xmlNewEntityInputStream
    xmlNodeBufGetContent
    xmlNodeGetBase
    xmlNodeGetContent
    xmlParseAttribute
    xmlParseAttributeType
    xmlParseEntityRef
    xmlParsePEReference
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlValidateAttributeValue
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    EntityDecl
    xmlParseEntityDecl
    xmlParseMarkupDecl
    EntityDef
    xmlParseEntityDecl
    EntityRef
    htmlParseEntityRef
    xmlDecodeEntities
    xmlParseEntityRef
    xmlParseReference
    xmlParserHandleReference
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    EntityReference
    xmlTextReaderReadAttributeValue
    EntityValue
    xmlParseEntityDecl
    xmlParseEntityValue
    Enumerated
    xmlParseEnumeratedType
    EnumeratedType
    xmlParseAttributeType
    xmlParseEnumeratedType
    Enumeration
    _xmlEnumeration
    xmlParseEnumeratedType
    xmlParseEnumerationType
    xmlValidateAttributeDecl
    Equal
    xmlStrQEqual
    Escaping
    xmlURIEscape
    Ethiopic
    xmlUCSIsEthiopic
    Evaluate
    xmlXPathCompiledEval
    xmlXPathEval
    xmlXPathEvalExpression
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPathNodeEval
    xmlXPtrEval
    xmlXPtrEvalRangePredicate
    Evaluates
    xmlExpExpDerive
    xmlSchemaIsBuiltInTypeFacet
    Everything
    _xmlParserCtxt
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlSAX2SetDocumentLocator
    Examines
    xmlHasFeature
    Exclusive
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    Existing
    xmlAddEncodingAlias
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    Exp
    xmlAutomataCompile
    Experimental
    htmlNodeStatus
    Expr
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPtrEvalRangePredicate
    Expresses
    xmlBuildRelativeURI
    Expression
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    Extender
    IS_EXTENDER
    xmlNamespaceParseNCName
    xmlParseName
    xmlScanName
    xmlXPathParseNCName
    xmlXPathParseName
    External
    _xmlDtd
    _xmlEntity
    xmlACatalogResolve
    xmlCatalogLocalResolve
    xmlCatalogResolve
    xmlExternalEntityLoader
    xmlParseAttribute
    xmlParseDTD
    xmlParseExternalID
    xmlSAXParseDTD
    ExternalID
    xmlParseDocTypeDecl
    xmlParseEntityDecl
    xmlParseExternalID
    xmlParseNotationDecl
    Extract
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlSchemaGetFacetValueAsULong
    xmlStrsub

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/interface.html0000644000175000017500000002001712124524424016147 0ustar aronaron The SAX interface
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    The SAX interface

    Developer Menu
    API Indexes
    Related links

    Sometimes the DOM tree output is just too large to fit reasonably into memory. In that case (and if you don't expect to save back the XML document loaded using libxml), it's better to use the SAX interface of libxml. SAX is a callback-based interface to the parser. Before parsing, the application layer registers a customized set of callbacks which are called by the library as it progresses through the XML input.

    To get more detailed step-by-step guidance on using the SAX interface of libxml, see the nice documentation.written by James Henstridge.

    You can debug the SAX behaviour by using the testSAX program located in the gnome-xml module (it's usually not shipped in the binary packages of libxml, but you can find it in the tar source distribution). Here is the sequence of callbacks that would be reported by testSAX when parsing the example XML document shown earlier:

    SAX.setDocumentLocator()
    SAX.startDocument()
    SAX.getEntity(amp)
    SAX.startElement(EXAMPLE, prop1='gnome is great', prop2='&amp; linux too')
    SAX.characters(   , 3)
    SAX.startElement(head)
    SAX.characters(    , 4)
    SAX.startElement(title)
    SAX.characters(Welcome to Gnome, 16)
    SAX.endElement(title)
    SAX.characters(   , 3)
    SAX.endElement(head)
    SAX.characters(   , 3)
    SAX.startElement(chapter)
    SAX.characters(    , 4)
    SAX.startElement(title)
    SAX.characters(The Linux adventure, 19)
    SAX.endElement(title)
    SAX.characters(    , 4)
    SAX.startElement(p)
    SAX.characters(bla bla bla ..., 15)
    SAX.endElement(p)
    SAX.characters(    , 4)
    SAX.startElement(image, href='linus.gif')
    SAX.endElement(image)
    SAX.characters(    , 4)
    SAX.startElement(p)
    SAX.characters(..., 3)
    SAX.endElement(p)
    SAX.characters(   , 3)
    SAX.endElement(chapter)
    SAX.characters( , 1)
    SAX.endElement(EXAMPLE)
    SAX.endDocument()

    Most of the other interfaces of libxml2 are based on the DOM tree-building facility, so nearly everything up to the end of this document presupposes the use of the standard DOM tree build. Note that the DOM tree itself is built by a set of registered default callbacks, without internal specific interface.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/Makefile.in0000644000175000017500000010772712134171754015411 0ustar aronaron# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_THREAD_LIBS = @BASE_THREAD_LIBS@ C14N_OBJ = @C14N_OBJ@ CATALOG_OBJ = @CATALOG_OBJ@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@ CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@ DEBUG_OBJ = @DEBUG_OBJ@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCB_OBJ = @DOCB_OBJ@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTP_OBJ = @FTP_OBJ@ GREP = @GREP@ HAVE_ISINF = @HAVE_ISINF@ HAVE_ISNAN = @HAVE_ISNAN@ HTML_DIR = @HTML_DIR@ HTML_OBJ = @HTML_OBJ@ HTTP_OBJ = @HTTP_OBJ@ ICONV_LIBS = @ICONV_LIBS@ ICU_LIBS = @ICU_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_MAJOR_VERSION = @LIBXML_MAJOR_VERSION@ LIBXML_MICRO_VERSION = @LIBXML_MICRO_VERSION@ LIBXML_MINOR_VERSION = @LIBXML_MINOR_VERSION@ LIBXML_VERSION = @LIBXML_VERSION@ LIBXML_VERSION_EXTRA = @LIBXML_VERSION_EXTRA@ LIBXML_VERSION_INFO = @LIBXML_VERSION_INFO@ LIBXML_VERSION_NUMBER = @LIBXML_VERSION_NUMBER@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LZMA_CFLAGS = @LZMA_CFLAGS@ LZMA_LIBS = @LZMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODULE_EXTENSION = @MODULE_EXTENSION@ MODULE_PLATFORM_LIBS = @MODULE_PLATFORM_LIBS@ MV = @MV@ M_LIBS = @M_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PYTHON = @PYTHON@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_SITE_PACKAGES = @PYTHON_SITE_PACKAGES@ PYTHON_SUBDIR = @PYTHON_SUBDIR@ PYTHON_TESTS = @PYTHON_TESTS@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RDL_LIBS = @RDL_LIBS@ READER_TEST = @READER_TEST@ RELDATE = @RELDATE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STATIC_BINARIES = @STATIC_BINARIES@ STRIP = @STRIP@ TAR = @TAR@ TEST_C14N = @TEST_C14N@ TEST_CATALOG = @TEST_CATALOG@ TEST_DEBUG = @TEST_DEBUG@ TEST_HTML = @TEST_HTML@ TEST_MODULES = @TEST_MODULES@ TEST_PATTERN = @TEST_PATTERN@ TEST_PHTML = @TEST_PHTML@ TEST_PUSH = @TEST_PUSH@ TEST_REGEXPS = @TEST_REGEXPS@ TEST_SAX = @TEST_SAX@ TEST_SCHEMAS = @TEST_SCHEMAS@ TEST_SCHEMATRON = @TEST_SCHEMATRON@ TEST_THREADS = @TEST_THREADS@ TEST_VALID = @TEST_VALID@ TEST_VTIME = @TEST_VTIME@ TEST_XINCLUDE = @TEST_XINCLUDE@ TEST_XPATH = @TEST_XPATH@ TEST_XPTR = @TEST_XPTR@ THREAD_CFLAGS = @THREAD_CFLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ WITH_DOCB = @WITH_DOCB@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_LZMA = @WITH_LZMA@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ WITH_MODULES = @WITH_MODULES@ WITH_OUTPUT = @WITH_OUTPUT@ WITH_PATTERN = @WITH_PATTERN@ WITH_PUSH = @WITH_PUSH@ WITH_READER = @WITH_READER@ WITH_REGEXPS = @WITH_REGEXPS@ WITH_RUN_DEBUG = @WITH_RUN_DEBUG@ WITH_SAX1 = @WITH_SAX1@ WITH_SCHEMAS = @WITH_SCHEMAS@ WITH_SCHEMATRON = @WITH_SCHEMATRON@ WITH_THREADS = @WITH_THREADS@ WITH_THREAD_ALLOC = @WITH_THREAD_ALLOC@ WITH_TREE = @WITH_TREE@ WITH_TRIO = @WITH_TRIO@ WITH_VALID = @WITH_VALID@ WITH_WRITER = @WITH_WRITER@ WITH_XINCLUDE = @WITH_XINCLUDE@ WITH_XPATH = @WITH_XPATH@ WITH_XPTR = @WITH_XPTR@ WITH_ZLIB = @WITH_ZLIB@ XINCLUDE_OBJ = @XINCLUDE_OBJ@ XMLLINT = @XMLLINT@ XML_CFLAGS = @XML_CFLAGS@ XML_INCLUDEDIR = @XML_INCLUDEDIR@ XML_LIBDIR = @XML_LIBDIR@ XML_LIBS = @XML_LIBS@ XML_LIBTOOLLIBS = @XML_LIBTOOLLIBS@ XPATH_OBJ = @XPATH_OBJ@ XPTR_OBJ = @XPTR_OBJ@ XSLTPROC = @XSLTPROC@ Z_CFLAGS = @Z_CFLAGS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . devhelp examples # The top-level SGML file. DOC_MAIN_XML_FILE = gnome-xml.xml # The directory containing the source code (if it contains documentation). DOC_SOURCE_DIR = .. # A file in win32 depends upon one of the doc files WIN32_DIR = $(top_srcdir)/win32 PAGES = architecture.html bugs.html contribs.html docs.html DOM.html \ downloads.html entities.html example.html help.html index.html \ interface.html intro.html library.html namespaces.html news.html \ tree.html xmldtd.html XMLinfo.html XSLT.html APIPAGES = APIconstructors.html APIfiles.html APIfunctions.html \ APIsymbols.html APIchunk0.html @REBUILD_DOCS_TRUE@EXTRA_DIST_wc = xmlcatalog_man.xml $(wildcard tutorial/*.html) \ @REBUILD_DOCS_TRUE@ $(wildcard tutorial/*.c) $(wildcard tutorial/*.pdf) \ @REBUILD_DOCS_TRUE@ $(wildcard tutorial/images/*.png) \ @REBUILD_DOCS_TRUE@ $(wildcard tutorial/images/callouts/*.png) $(wildcard API*.html) \ @REBUILD_DOCS_TRUE@ $(wildcard *.1) $(wildcard *.xsl) $(wildcard *.html) \ @REBUILD_DOCS_TRUE@ $(wildcard *.gif) w3c.png $(wildcard html/*.html) \ @REBUILD_DOCS_TRUE@ $(wildcard html/*.png) libxml2-api.xml index.py search.php \ @REBUILD_DOCS_TRUE@ apibuild.py libxml2.xsa xmllint.xml xmlcatalog_man.xml \ @REBUILD_DOCS_TRUE@ README.docs symbols.xml # Expanded form of EXTRA_DIST_wc # EXTRA_DIST = \ APIchunk0.html \ APIchunk1.html \ APIchunk2.html \ APIchunk3.html \ APIchunk4.html \ APIchunk5.html \ APIchunk6.html \ APIchunk7.html \ APIchunk8.html \ APIchunk9.html \ APIchunk10.html \ APIchunk11.html \ APIchunk12.html \ APIchunk13.html \ APIchunk14.html \ APIchunk15.html \ APIchunk16.html \ APIchunk17.html \ APIchunk18.html \ APIchunk19.html \ APIchunk20.html \ APIchunk21.html \ APIchunk22.html \ APIchunk23.html \ APIchunk24.html \ APIchunk25.html \ APIchunk26.html \ APIchunk27.html \ APIchunk28.html \ APIchunk29.html \ APIconstructors.html \ APIfiles.html \ APIfunctions.html \ APIsymbols.html \ ChangeLog.xsl \ DOM.gif \ DOM.html \ FAQ.html \ Libxml2-Logo-180x168.gif \ Libxml2-Logo-90x34.gif \ README.docs \ XMLinfo.html \ XSLT.html \ api.xsl \ apibuild.py \ architecture.html \ bugs.html \ catalog.gif \ catalog.html \ checkapisym.xsl \ contribs.html \ docs.html \ downloads.html \ elfgcchack.xsl \ encoding.html \ entities.html \ example.html \ guidelines.html \ help.html \ html/book1.html \ html/home.png \ html/index.html \ html/left.png \ html/libxml-DOCBparser.html \ html/libxml-HTMLparser.html \ html/libxml-HTMLtree.html \ html/libxml-SAX.html \ html/libxml-SAX2.html \ html/libxml-c14n.html \ html/libxml-catalog.html \ html/libxml-chvalid.html \ html/libxml-debugXML.html \ html/libxml-dict.html \ html/libxml-encoding.html \ html/libxml-entities.html \ html/libxml-globals.html \ html/libxml-hash.html \ html/libxml-lib.html \ html/libxml-list.html \ html/libxml-nanoftp.html \ html/libxml-nanohttp.html \ html/libxml-parser.html \ html/libxml-parserInternals.html \ html/libxml-pattern.html \ html/libxml-relaxng.html \ html/libxml-schemasInternals.html \ html/libxml-schematron.html \ html/libxml-threads.html \ html/libxml-tree.html \ html/libxml-uri.html \ html/libxml-valid.html \ html/libxml-xinclude.html \ html/libxml-xlink.html \ html/libxml-xmlIO.html \ html/libxml-xmlautomata.html \ html/libxml-xmlerror.html \ html/libxml-xmlexports.html \ html/libxml-xmlmemory.html \ html/libxml-xmlmodule.html \ html/libxml-xmlreader.html \ html/libxml-xmlregexp.html \ html/libxml-xmlsave.html \ html/libxml-xmlschemas.html \ html/libxml-xmlschemastypes.html \ html/libxml-xmlstring.html \ html/libxml-xmlunicode.html \ html/libxml-xmlversion.html \ html/libxml-xmlwriter.html \ html/libxml-xpath.html \ html/libxml-xpathInternals.html \ html/libxml-xpointer.html \ html/libxml-xzlib.html \ html/right.png \ html/up.png \ index.html \ index.py \ interface.html \ intro.html \ library.html \ libxml.gif \ libxml2-api.xml \ libxml2.xsa \ namespaces.html \ newapi.xsl \ news.html \ news.xsl \ python.html \ redhat.gif \ search.php \ searches.html \ searches.xsl \ site.xsl \ smallfootonly.gif \ structure.gif \ symbols.xml \ syms.xsl \ threads.html \ tree.html \ tutorial/apa.html \ tutorial/apb.html \ tutorial/apc.html \ tutorial/apd.html \ tutorial/ape.html \ tutorial/apf.html \ tutorial/apg.html \ tutorial/aph.html \ tutorial/api.html \ tutorial/ar01s02.html \ tutorial/ar01s03.html \ tutorial/ar01s04.html \ tutorial/ar01s05.html \ tutorial/ar01s06.html \ tutorial/ar01s07.html \ tutorial/ar01s08.html \ tutorial/ar01s09.html \ tutorial/images/blank.png \ tutorial/images/callouts/1.png \ tutorial/images/callouts/10.png \ tutorial/images/callouts/2.png \ tutorial/images/callouts/3.png \ tutorial/images/callouts/4.png \ tutorial/images/callouts/5.png \ tutorial/images/callouts/6.png \ tutorial/images/callouts/7.png \ tutorial/images/callouts/8.png \ tutorial/images/callouts/9.png \ tutorial/images/caution.png \ tutorial/images/draft.png \ tutorial/images/home.png \ tutorial/images/important.png \ tutorial/images/next.png \ tutorial/images/note.png \ tutorial/images/prev.png \ tutorial/images/tip.png \ tutorial/images/toc-blank.png \ tutorial/images/toc-minus.png \ tutorial/images/toc-plus.png \ tutorial/images/up.png \ tutorial/images/warning.png \ tutorial/includeaddattribute.c \ tutorial/includeaddkeyword.c \ tutorial/includeconvert.c \ tutorial/includegetattribute.c \ tutorial/includekeyword.c \ tutorial/includexpath.c \ tutorial/index.html \ tutorial/ix01.html \ tutorial/xmltutorial.pdf \ upgrade.html \ w3c.png \ wiki.xsl \ xml.html \ xmlcatalog.1 \ xmlcatalog_man.html \ xmlcatalog_man.xml \ xmldtd.html \ xmlio.html \ xmllint.1 \ xmllint.html \ xmllint.xml \ xmlmem.html \ xmlreader.html \ xsa.xsl man_MANS = xmllint.1 xmlcatalog.1 @REBUILD_DOCS_TRUE@source_file_deps = \ @REBUILD_DOCS_TRUE@ $(filter-out %/xmlversion.h, $(wildcard $(top_srcdir)/include/libxml/*.h)) \ @REBUILD_DOCS_TRUE@ $(top_srcdir)/include/libxml/xmlversion.h.in \ @REBUILD_DOCS_TRUE@ $(wildcard $(top_srcdir)/*.c) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-data-local install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ clean-local ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-man uninstall-man1 @REBUILD_DOCS_TRUE@docs: web $(top_builddir)/NEWS libxml2.xsa $(man_MANS) @REBUILD_DOCS_TRUE@api: libxml2-api.xml libxml2-refs.xml $(APIPAGES) $(srcdir)/html/index.html $(WIN32_DIR)/libxml2.def.src ../elfgcchack.h $(srcdir)/site.xsl @REBUILD_DOCS_TRUE@web: $(PAGES) @REBUILD_DOCS_TRUE@../elfgcchack.h: $(srcdir)/elfgcchack.xsl $(srcdir)/libxml2-api.xml @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Rebuilding the elfgcchack.h header" ; \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet $(srcdir)/elfgcchack.xsl $(srcdir)/libxml2-api.xml > elfgcchack.h ; \ @REBUILD_DOCS_TRUE@ if [ "`diff -q elfgcchack.h ../elfgcchack.h`" ] ; then \ @REBUILD_DOCS_TRUE@ echo "updating ../elfgcchack.h"; \ @REBUILD_DOCS_TRUE@ cp elfgcchack.h ../elfgcchack.h; \ @REBUILD_DOCS_TRUE@ fi ; rm -f elfgcchack.h ; fi ); @REBUILD_DOCS_TRUE@$(PAGES): xml.html $(srcdir)/site.xsl @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Rebuilding the HTML Web pages from xml.html" ; \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet --html --path $(srcdir) $(srcdir)/site.xsl $(srcdir)/xml.html > index.html ; fi ); @REBUILD_DOCS_TRUE@ -@(if [ -x $(XMLLINT) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Validating the HTML Web pages" ; \ @REBUILD_DOCS_TRUE@ $(XMLLINT) --nonet --valid --noout $(PAGES) ; fi ); @REBUILD_DOCS_TRUE@$(top_builddir)/NEWS: $(srcdir)/news.xsl $(srcdir)/news.html @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet $(srcdir)/news.xsl $(srcdir)/news.html > $(top_builddir)/NEWS ; fi ); @REBUILD_DOCS_TRUE@libxml2.xsa: $(srcdir)/xsa.xsl $(srcdir)/news.html @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Rebuilding the NEWS file" ; \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet $(srcdir)/xsa.xsl $(srcdir)/news.html > libxml2.xsa ; fi ); @REBUILD_DOCS_TRUE@$(APIPAGES): libxml2-api.xml libxml2-refs.xml $(srcdir)/site.xsl $(srcdir)/api.xsl @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Rebuilding the HTML API pages from libxml2-refs.xml" ; \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet --html $(srcdir)/api.xsl \ @REBUILD_DOCS_TRUE@ $(srcdir)/xml.html ; fi ); @REBUILD_DOCS_TRUE@ -@(if [ -x $(XMLLINT) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Validating the HTML API pages" ; \ @REBUILD_DOCS_TRUE@ $(XMLLINT) --nonet --valid --noout API*.html ; fi ); @REBUILD_DOCS_TRUE@$(srcdir)/html/index.html: libxml2-api.xml $(srcdir)/newapi.xsl @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Rebuilding the HTML pages from the XML API" ; \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet $(srcdir)/newapi.xsl $(srcdir)/libxml2-api.xml ; fi ) @REBUILD_DOCS_TRUE@ -@(if [ -x $(XMLLINT) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Validating the resulting XHTML pages" ; \ @REBUILD_DOCS_TRUE@ $(XMLLINT) --nonet --valid --noout html/*.html ; fi ); @REBUILD_DOCS_TRUE@wiki: libxml2-api.xml $(srcdir)/wiki.xsl @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ echo "Rebuilding the wiki HTML pages from the XML API" ; \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) --nonet $(srcdir)/wiki.xsl $(srcdir)/libxml2-api.xml; fi ) @REBUILD_DOCS_TRUE@$(WIN32_DIR)/libxml2.def.src: libxml2-api.xml @REBUILD_DOCS_TRUE@ -@(if [ -x $(XSLTPROC) ] ; then \ @REBUILD_DOCS_TRUE@ $(XSLTPROC) -o $(WIN32_DIR)/libxml2.def.src \ @REBUILD_DOCS_TRUE@ --nonet $(WIN32_DIR)/defgen.xsl libxml2-api.xml ; fi ) @REBUILD_DOCS_TRUE@libxml2-api.xml libxml2-refs.xml ../libxml2.syms: apibuild.py symbols.xml syms.xsl checkapisym.xsl $(source_file_deps) @REBUILD_DOCS_TRUE@ test -f $(top_srcdir)/include/libxml/xmlversion.h @REBUILD_DOCS_TRUE@ (cd $(srcdir) && ./apibuild.py) @REBUILD_DOCS_TRUE@ ($(XSLTPROC) $(srcdir)/checkapisym.xsl $(srcdir)/libxml2-api.xml) @REBUILD_DOCS_TRUE@ ($(XSLTPROC) -o ../libxml2.syms $(srcdir)/syms.xsl $(srcdir)/symbols.xml) @REBUILD_DOCS_TRUE@ -@(cd .. ; $(MAKE) rebuild_testapi) @REBUILD_DOCS_TRUE@xmllint.1: xmllint.xml @REBUILD_DOCS_TRUE@ -@($(XSLTPROC) --nonet xmllint.xml) @REBUILD_DOCS_TRUE@xmlcatalog.1: xmlcatalog_man.xml @REBUILD_DOCS_TRUE@ -@($(XSLTPROC) --nonet xmlcatalog_man.xml) @REBUILD_DOCS_TRUE@check-extra-dist: @REBUILD_DOCS_TRUE@ for f in $(EXTRA_DIST_wc) ; do echo $$f; done | sort -u >tmp.EXTRA_DIST_wc @REBUILD_DOCS_TRUE@ for f in $(EXTRA_DIST) ; do echo $$f; done | sort >tmp.EXTRA_DIST @REBUILD_DOCS_TRUE@ diff -u tmp.EXTRA_DIST_wc tmp.EXTRA_DIST @REBUILD_DOCS_TRUE@ rm -f tmp.EXTRA_DIST_wc tmp.EXTRA_DIST clean-local: rm -f *~ *.bak *.hierarchy *.signals *-unused.txt maintainer-clean-local: clean-local rm -rf libxml-decl-list.txt libxml-decl.txt rebuild: api docs install-data-local: $(MKDIR_P) $(DESTDIR)$(HTML_DIR) -$(INSTALL) -m 0644 $(srcdir)/xml.html $(srcdir)/encoding.html $(srcdir)/FAQ.html $(srcdir)/structure.gif $(srcdir)/DOM.gif $(srcdir)/smallfootonly.gif $(srcdir)/redhat.gif $(srcdir)/libxml.gif $(srcdir)/w3c.png $(srcdir)/Libxml2-Logo-180x168.gif $(srcdir)/Libxml2-Logo-90x34.gif $(DESTDIR)$(HTML_DIR) $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/html -$(INSTALL) -m 0644 $(srcdir)/html/*.html $(DESTDIR)$(HTML_DIR)/html -$(INSTALL) -m 0644 $(srcdir)/html/*.png $(DESTDIR)$(HTML_DIR)/html $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/tutorial -$(INSTALL) -m 0644 $(srcdir)/tutorial/*.* \ $(DESTDIR)$(HTML_DIR)/tutorial $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/tutorial/images -$(INSTALL) -m 0644 $(srcdir)/tutorial/images/*.* \ $(DESTDIR)$(HTML_DIR)/tutorial/images $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/tutorial/images/callouts -$(INSTALL) -m 0644 $(srcdir)/tutorial/images/callouts/*.* \ $(DESTDIR)$(HTML_DIR)/tutorial/images/callouts .PHONY: docs api web wiki rebuild # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libxml2-2.9.1+dfsg1/doc/xmldtd.html0000644000175000017500000003246412124524425015515 0ustar aronaron Validation & DTDs
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Validation & DTDs

    Main Menu
    Related links

    Table of Content:

    1. General overview
    2. The definition
    3. Simple rules
      1. How to reference a DTD from a document
      2. Declaring elements
      3. Declaring attributes
    4. Some examples
    5. How to validate
    6. Other resources

    General overview

    Well what is validation and what is a DTD ?

    DTD is the acronym for Document Type Definition. This is a description of the content for a family of XML files. This is part of the XML 1.0 specification, and allows one to describe and verify that a given document instance conforms to the set of rules detailing its structure and content.

    Validation is the process of checking a document against a DTD (more generally against a set of construction rules).

    The validation process and building DTDs are the two most difficult parts of the XML life cycle. Briefly a DTD defines all the possible elements to be found within your document, what is the formal shape of your document tree (by defining the allowed content of an element; either text, a regular expression for the allowed list of children, or mixed content i.e. both text and children). The DTD also defines the valid attributes for all elements and the types of those attributes.

    The definition

    The W3C XML Recommendation (Tim Bray's annotated version of Rev1):

    (unfortunately) all this is inherited from the SGML world, the syntax is ancient...

    Simple rules

    Writing DTDs can be done in many ways. The rules to build them if you need something permanent or something which can evolve over time can be radically different. Really complex DTDs like DocBook ones are flexible but quite harder to design. I will just focus on DTDs for a formats with a fixed simple structure. It is just a set of basic rules, and definitely not exhaustive nor usable for complex DTD design.

    How to reference a DTD from a document:

    Assuming the top element of the document is spec and the dtd is placed in the file mydtd in the subdirectory dtds of the directory from where the document were loaded:

    <!DOCTYPE spec SYSTEM "dtds/mydtd">

    Notes:

    • The system string is actually an URI-Reference (as defined in RFC 2396) so you can use a full URL string indicating the location of your DTD on the Web. This is a really good thing to do if you want others to validate your document.
    • It is also possible to associate a PUBLIC identifier (a magic string) so that the DTD is looked up in catalogs on the client side without having to locate it on the web.
    • A DTD contains a set of element and attribute declarations, but they don't define what the root of the document should be. This is explicitly told to the parser/validator as the first element of the DOCTYPE declaration.

    Declaring elements:

    The following declares an element spec:

    <!ELEMENT spec (front, body, back?)>

    It also expresses that the spec element contains one front, one body and one optional back children elements in this order. The declaration of one element of the structure and its content are done in a single declaration. Similarly the following declares div1 elements:

    <!ELEMENT div1 (head, (p | list | note)*, div2?)>

    which means div1 contains one head then a series of optional p, lists and notes and then an optional div2. And last but not least an element can contain text:

    <!ELEMENT b (#PCDATA)>

    b contains text or being of mixed content (text and elements in no particular order):

    <!ELEMENT p (#PCDATA|a|ul|b|i|em)*>

    p can contain text or a, ul, b, i or em elements in no particular order.

    Declaring attributes:

    Again the attributes declaration includes their content definition:

    <!ATTLIST termdef name CDATA #IMPLIED>

    means that the element termdef can have a name attribute containing text (CDATA) and which is optional (#IMPLIED). The attribute value can also be defined within a set:

    <!ATTLIST list type (bullets|ordered|glossary) "ordered">

    means list element have a type attribute with 3 allowed values "bullets", "ordered" or "glossary" and which default to "ordered" if the attribute is not explicitly specified.

    The content type of an attribute can be text (CDATA), anchor/reference/references (ID/IDREF/IDREFS), entity(ies) (ENTITY/ENTITIES) or name(s) (NMTOKEN/NMTOKENS). The following defines that a chapter element can have an optional id attribute of type ID, usable for reference from attribute of type IDREF:

    <!ATTLIST chapter id ID #IMPLIED>

    The last value of an attribute definition can be #REQUIRED meaning that the attribute has to be given, #IMPLIED meaning that it is optional, or the default value (possibly prefixed by #FIXED if it is the only allowed).

    Notes:

    • Usually the attributes pertaining to a given element are declared in a single expression, but it is just a convention adopted by a lot of DTD writers:
      <!ATTLIST termdef
                id      ID      #REQUIRED
                name    CDATA   #IMPLIED>

      The previous construct defines both id and name attributes for the element termdef.

    Some examples

    The directory test/valid/dtds/ in the libxml2 distribution contains some complex DTD examples. The example in the file test/valid/dia.xml shows an XML file where the simple DTD is directly included within the document.

    How to validate

    The simplest way is to use the xmllint program included with libxml. The --valid option turns-on validation of the files given as input. For example the following validates a copy of the first revision of the XML 1.0 specification:

    xmllint --valid --noout test/valid/REC-xml-19980210.xml

    the -- noout is used to disable output of the resulting tree.

    The --dtdvalid dtd allows validation of the document(s) against a given DTD.

    Libxml2 exports an API to handle DTDs and validation, check the associated description.

    Other resources

    DTDs are as old as SGML. So there may be a number of examples on-line, I will just list one for now, others pointers welcome:

    I suggest looking at the examples found under test/valid/dtd and any of the large number of books available on XML. The dia example in test/valid should be both simple and complete enough to allow you to build your own.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xmlcatalog_man.html0000644000175000017500000002162212113312342017170 0ustar aronaronxmlcatalog

    Name

    xmlcatalog — Command line tool to parse and manipulate XML or SGML catalog files.

    Synopsis

    xmlcatalog [[--shell] | [--create] | [--add type orig replace] | [--del values] | [--noout] | [--verbose]] [catalogfile] [entities]

    Introduction

    xmlcatalog is a command line application allowing users to monitor and manipulate XML and SGML catalogs. It is included in libxml2.

    Its functions can be invoked from a single command from the command line, or it can perform multiple functions in interactive mode. It can operate on both XML and SGML files.

    Command Line Options

    --shell filename
    Run a shell allowing interactive queries on catalog file filename.
    --create filename
    Create a new XML catalog. Outputs to stdout, ignoring filename unless --noout is used, in which case it creates a new catalog file filename.
    --add 'type' 'orig' 'replace' filename

    Add an entry to catalog file filename. type indicates the type of entry. Possible types are 'public', 'system', 'uri', 'rewriteSystem', 'rewriteURI', 'delegatePublic', 'delegateSystem', 'delegateURI' and 'nextCatalog'. 'orig' is the original reference to be replaced, and 'replace' is the URI of the replacement entity to be used. The --add option will not overwrite filename, outputing to stdout, unless --noout is used. The --add will always take three parameters even if some of the XML catalog constructs will have only a single argument.

    If the --add option is used following the --sgml option, only a single argument, a filename, is used. This is used to add the name of a catalog file to an SGML supercatalog, a file that contains references to other included SGML catalog files.

    --del 'values' filename
    Remove entries from the catalog file filename matching 'values'. The --del option will not overwrite filename, outputing to stdout, unless --noout is used.
    --noout
    Save output to the named file rather than outputing to stdout.
    --sgml
    Uses SGML Super catalogs for --add and --del options
    -v or --verbose
    output debugging information.

    Shell Commands

    Invoking xmlcatalog with the --shell filename option opens a command line shell allowing interactive access to the catalog file identified by filename. Invoking the shell provides a command line prompt after which commands can be entered.

    public 'PublicID'
    Execute a public identifier lookup of the catalog entry for 'PublicID'. The corresponding entry will be output to the command line.
    system 'SystemID'
    Execute a public identifier lookup of the catalog entry for 'SystemID'. The corresponding entry will be output to the command line.
    add 'type' 'orig' 'replace'
    Add an entry to the catalog file. type indicates the type of entry. Possible types are 'public', 'system', 'uri', 'rewriteSystem', 'rewriteURI', 'delegatePublic', 'delegateSystem', 'delegateURI' and 'nextCatalog'. 'orig' is the original reference to be replaced, and 'replace' is the URI of the replacement entity to be used.
    del 'values'
    Remove the catalog entry corresponding to 'values'.
    dump
    Print the current catalog.
    debug
    Print debugging statements showing the steps xmlcatalog is executing.
    quiet
    Stop printing debugging statements.
    exit
    Quit the shell.

    Return values

    xmlcatalog's return codes provide information that can be used when calling it from scripts.

    0: normal

    1: Failed to remove an entry from the catalog

    2: Failed to save to the catalog, check file permissions

    3: Failed to add an entry to the catalog

    4: Failed to lookup and entry in the catalog

    Catalogs

    Catalog behavior can be changed by redirecting queries to the user's own set of catalogs. This can be done by setting the XML_CATALOG_FILES environment variable to a list of catalogs. An empty one should deactivate loading the default /etc/xml/catalog default catalog.

    libxml2-2.9.1+dfsg1/doc/APIchunk15.html0000644000175000017500000012631412134171042016021 0ustar aronaron API Alphabetic Index f-f for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index f-f for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter f:

    fTP
    xmlNanoFTPConnectTo
    face
    XML_MAX_NAME_LENGTH
    facet
    XML_SCHEMAS_FACET_COLLAPSE
    XML_SCHEMAS_FACET_PRESERVE
    XML_SCHEMAS_FACET_REPLACE
    XML_SCHEMAS_FACET_UNKNOWN
    _xmlSchemaFacetLink
    xmlSchemaCheckFacet
    xmlSchemaFreeFacet
    xmlSchemaGetFacetValueAsULong
    xmlSchemaIsBuiltInTypeFacet
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    facets
    XML_SCHEMAS_TYPE_FACETSNEEDVALUE
    XML_SCHEMAS_TYPE_HAS_FACETS
    XML_SCHEMAS_TYPE_NORMVALUENEEDED
    _xmlSchemaType
    xmlSchemaCheckFacet
    facility
    xmlExpCtxtNbCons
    xmlExpCtxtNbNodes
    fail
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlShellPrintXPathError
    failed
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlNanoFTPConnectTo
    xmlNanoFTPCwd
    xmlNanoFTPDele
    xmlRemoveID
    xmlRemoveRef
    xmlShellLoad
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    xmlXPathCompareValues
    fails
    UTF8ToHtml
    UTF8Toisolat1
    _htmlElemDesc
    docbEncodeEntities
    htmlEncodeEntities
    xmlCanonicPath
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    xmlCheckFilename
    xmlFileOpen
    xmlPathToURI
    fallback
    XINCLUDE_FALLBACK
    docbSAXParseDoc
    docbSAXParseFile
    htmlSAXParseDoc
    htmlSAXParseFile
    xmlFileOpen
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    far
    _xmlParserCtxt
    fatalErrorSAXFunc
    xmlSchemaIsValid
    fashion
    xmlNewRMutex
    fast
    htmlInitAutoClose
    faster
    htmlNodeStatus
    xmlStrEqual
    fatal
    fatalErrorSAXFunc
    fatalError
    fatalErrorSAXFunc
    favor
    xmlNewElementContent
    feature
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    xmlGetFeature
    xmlGetFeaturesList
    xmlHasFeature
    xmlSetFeature
    features
    xmlGetFeaturesList
    fed
    xmlCreatePushParserCtxt
    xmlNewTextReader
    xmlNewTextReaderFilename
    xmlStreamPushNode
    xmlStreamWantsAnyNode
    feed
    xmlTextReaderSetup
    fetch
    xmlNanoFTPGetSocket
    xmlNanoFTPOpen
    xmlNanoHTTPFetch
    fetching
    docbCreatePushParserCtxt
    htmlCreatePushParserCtxt
    xmlCreatePushParserCtxt
    xmlUTF8Strpos
    field
    XML_COMPLETE_ATTRS
    XML_CTXT_FINISH_DTD_0
    XML_CTXT_FINISH_DTD_1
    XML_DETECT_IDS
    XML_SKIP_IDS
    _xmlError
    xmlParseMisc
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessTreeFlagsData
    xmlXPathOrderDocElems
    fields
    XML_SAX2_MAGIC
    _htmlElemDesc
    _xmlParserCtxt
    _xmlSAXHandler
    xmlParseURIReference
    files
    xmlNanoFTPList
    filesystem
    htmlCtxtReadFile
    htmlReadFile
    xmlCanonicPath
    xmlCtxtReadFile
    xmlPathToURI
    xmlReadFile
    xmlReaderForFile
    xmlReaderNewFile
    filled
    xmlGetFeaturesList
    fills
    xmlParseURIReference
    filters
    xmlParseEncodingDecl
    final
    XML_SCHEMAS_TYPE_FINAL_DEFAULT
    XML_SCHEMAS_TYPE_FINAL_EXTENSION
    XML_SCHEMAS_TYPE_FINAL_LIST
    XML_SCHEMAS_TYPE_FINAL_RESTRICTION
    XML_SCHEMAS_TYPE_FINAL_UNION
    xmlAutomataSetFinalState
    xmlBuildURI
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    finalDefault
    XML_SCHEMAS_FINAL_DEFAULT_EXTENSION
    XML_SCHEMAS_FINAL_DEFAULT_LIST
    XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION
    XML_SCHEMAS_FINAL_DEFAULT_UNION
    find
    xmlGetThreadId
    xmlIsXHTML
    xmlSchemaValidityLocatorFunc
    finding
    xmlNanoFTPScanProxy
    xmlNanoFTPUpdateURL
    xmlNanoHTTPScanProxy
    finds
    xmlSearchNs
    xmlSearchNsByHref
    finishDtd
    XML_CTXT_FINISH_DTD_0
    XML_CTXT_FINISH_DTD_1
    finished
    _xmlValidCtxt
    xmlCleanupParser
    xmlSkipBlankChars
    xmlTextReaderCurrentDoc
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    finishing
    xmlByteConsumed
    finite
    xmlExpParse
    firs
    xmlCharEncOutFunc
    fist
    xmlEntityReferenceFunc
    fit
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    fixed
    XML_SCHEMAS_ATTR_FIXED
    XML_SCHEMAS_ELEM_FIXED
    xmlParseDefaultDecl
    xmlSchemaGetCanonValue
    fixup
    XML_SCHEMAS_TYPE_FIXUP_1
    flag
    XML_SCHEMAS_ELEM_CIRCULAR
    htmlSetMetaEncoding
    initxmlDefaultSAXHandler
    xmlSAX2InitDefaultSAXHandler
    xmlTextReaderIsValid
    flagged
    _htmlElemDesc
    htmlGetMetaEncoding
    flags
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    _xmlXPathContext
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlPatterncompile
    xmlReaderForDoc
    xmlReaderForFd
    xmlReaderForFile
    xmlReaderForIO
    xmlReaderForMemory
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewFile
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlRelaxParserSetFlag
    xmlXIncludeSetFlags
    flat
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    floor
    xmlXPathFloorFunction
    flow
    xmlScanName
    xmlSchemaSAXPlug
    xmlSchemaSAXUnplug
    xmlSchemaValidateSetLocator
    xmlSchemaValidateStream
    flushed
    xmlTextWriterEndDocument
    flushes
    xmlOutputBufferClose
    xmlOutputBufferFlush
    follow
    xmlAutomataNewNegTrans
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathSubstringFunction
    xmlXPathTrailing
    xmlXPathTrailingSorted
    followed
    xmlCheckLanguageID
    following-sibling
    xmlXPathNextFollowingSibling
    follows
    xmlXPathStringFunction
    xmlXPathSubstringAfterFunction
    follows:
    xmlParseAttValue
    xmlXPathBooleanFunction
    xmlXPathStringFunction
    fonctionnalities
    xmlInputMatchCallback
    xmlOutputMatchCallback
    for:
    xmlSchemaGetCanonValue
    xmlXPathContextSetCache
    forbid
    XML_XPATH_NOVAR
    force
    xmlKeepBlanksDefault
    xmlSetGenericErrorFunc
    forced
    xmlValidGetValidElements
    form
    docbParseDoc
    docbParseFile
    docbSAXParseDoc
    docbSAXParseFile
    htmlCreateFileParserCtxt
    htmlParseDoc
    htmlParseFile
    htmlSAXParseDoc
    htmlSAXParseFile
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlPatterncompile
    xmlXPathStringFunction
    formal
    LIBXML_EXPR_ENABLED
    formatted
    xmlTextWriterWriteFormatAttribute
    xmlTextWriterWriteFormatAttributeNS
    xmlTextWriterWriteFormatCDATA
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteFormatDTDElement
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteFormatElement
    xmlTextWriterWriteFormatElementNS
    xmlTextWriterWriteFormatPI
    xmlTextWriterWriteFormatRaw
    xmlTextWriterWriteFormatString
    xmlTextWriterWriteVFormatAttribute
    xmlTextWriterWriteVFormatAttributeNS
    xmlTextWriterWriteVFormatCDATA
    xmlTextWriterWriteVFormatDTD
    xmlTextWriterWriteVFormatDTDAttlist
    xmlTextWriterWriteVFormatDTDElement
    xmlTextWriterWriteVFormatDTDInternalEntity
    xmlTextWriterWriteVFormatElement
    xmlTextWriterWriteVFormatElementNS
    xmlTextWriterWriteVFormatPI
    xmlTextWriterWriteVFormatRaw
    xmlTextWriterWriteVFormatString
    formatting
    htmlDocContentDumpFormatOutput
    htmlDocDumpMemoryFormat
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    htmlSaveFileEnc
    htmlSaveFileFormat
    xmlBufNodeDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocFormatDump
    xmlNodeDump
    xmlNodeDumpOutput
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlSaveFormatFileTo
    xmlStrPrintf
    xmlStrVPrintf
    formed
    _xmlParserCtxt
    htmlSAXParseDoc
    htmlSAXParseFile
    xmlParseCtxtExternalEntity
    xmlParseExternalEntity
    forward
    xmlSchemaValidateStream
    fptr
    XML_CAST_FPTR
    fragment
    _xmlURI
    xmlNewDocFragment
    xmlParseURI
    xmlPushInput
    fragments
    xmlParseURIRaw
    freeing
    xmlCanonicPath
    xmlParserInputDeallocate
    xmlPathToURI
    frees
    xmlBufferFree
    xmlXPathContextSetCache
    front
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateQName
    front-end
    xmlCharEncCloseFunc
    xmlCharEncInFunc
    xmlCharEncOutFunc
    ftp:
    xmlNanoFTPOpen
    xmlNanoFTPScanProxy
    ftp_proxy
    xmlNanoFTPProxy
    ftp_proxy_password
    xmlNanoFTPProxy
    ftp_proxy_user
    xmlNanoFTPProxy
    full
    _xmlEntity
    _xmlXPathParserContext
    htmlAttrAllowed
    xlinkIsLink
    xmlHashScannerFull
    xmlRelaxNGValidateFullElement
    xmlRelaxNGValidatePushElement
    xmlSaveDoc
    xmlShellPwd
    xmlSplitQName2
    xmlSplitQName3
    xmlTextReaderExpand
    xmlURIUnescapeString
    xmlUTF8Strlen
    fully
    _htmlElemDesc
    xmlSaveDoc
    xmlSaveTree
    func
    _xmlXPathContext
    funcs
    _xmlXPathContext
    function:
    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathHasSameNodes
    xmlXPathIntersection
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathTrailing
    xmlXPathTrailingSorted
    functionality
    xmlNewGlobalNs
    xmlXPathNodeSetGetLength
    xmlXPathNodeSetItem
    functions
    htmlCtxtReadIO
    htmlReadIO
    xmlC14NDocDumpMemory
    xmlCtxtReadIO
    xmlGcMemGet
    xmlGcMemSetup
    xmlMemGet
    xmlMemSetup
    xmlReadIO
    xmlReaderForIO
    xmlReaderNewIO
    xmlRelaxNGGetValidErrors
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetParserStructuredErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxNGSetValidStructuredErrors
    xmlSchemaGetValidErrors
    xmlSchemaSetParserErrors
    xmlSchemaSetParserStructuredErrors
    xmlSchemaSetValidErrors
    xmlSchemaSetValidStructuredErrors
    xmlSchematronSetValidStructuredErrors
    xmlShellCmd
    xmlSwitchEncoding
    xmlSwitchInputEncoding
    xmlSwitchToEncoding
    xmlXPathRegisterAllFunctions
    xmlXPathRegisteredFuncsCleanup
    further
    xmlParseAttValue
    xmlStopParser
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXIncludeSetFlags
    future
    _xmlDOMWrapCtxt
    xmlCheckLanguageID
    xmlSchemaValidateFile

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk21.html0000644000175000017500000011167012134171042016015 0ustar aronaron API Alphabetic Index o-o for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index o-o for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter o:

    object?
    xmlXPathNumberFunction
    xmlXPathStringFunction
    objects
    _xmlXPathContext
    xmlXPathCompareValues
    xmlXPathContextSetCache
    xmlXPathDivValues
    xmlXPathEqualValues
    xmlXPathFreeNodeSetList
    xmlXPathNotEqualValues
    objects:
    xmlXPathAddValues
    xmlXPathCompareValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathSubValues
    obligated
    xmlParseEntityRef
    obsolete
    xmlNormalizeWindowsPath
    obsolete:
    XML_SCHEMAS_ELEM_TOPLEVEL
    occupied
    xmlCanonicPath
    xmlPathToURI
    occur
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    xmlParseComment
    xmlParseMarkupDecl
    occured
    xmlCtxtGetLastError
    xmlDictCreate
    xmlDictCreateSub
    xmlGetLastError
    xmlHashCreate
    xmlHashCreateDict
    xmlListRemoveFirst
    xmlListRemoveLast
    xmlTextReaderErrorFunc
    occurences
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    occurred
    xmlMemStrdupLoc
    xmlMemoryStrdup
    occurrence
    xmlStrcasestr
    xmlStrchr
    xmlStrstr
    xmlStrsub
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    occurrences
    xmlXPathTranslateFunction
    occurs
    xmlNormalizeURIPath
    xmlParseSDDecl
    xmlStrPrintf
    xmlStrVPrintf
    octets
    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    of:
    xmlParseSDDecl
    off
    xmlGetNoNsProp
    xmlGetNsProp
    xmlGetProp
    xmlHasNsProp
    xmlHasProp
    xmlLineNumbersDefault
    xmlParseExternalID
    okay
    _xmlParserCtxt
    old
    _xmlDoc
    globalNamespace
    xmlDocSetRootElement
    xmlKeepBlanksDefault
    xmlLineNumbersDefault
    xmlListCopy
    xmlNewGlobalNs
    xmlOutputBufferCreateFilenameDefault
    xmlParserInputBufferCreateFilenameDefault
    xmlParserInputBufferGrow
    xmlParserInputBufferRead
    xmlRegisterNodeDefault
    xmlReplaceNode
    xmlXPathConvertBoolean
    xmlXPathConvertNumber
    xmlXPathConvertString
    oldNs
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapRemoveNode
    older
    LIBXML_SAX1_ENABLED
    xmlParseNamespace
    omitted
    htmlHandleOmittedElem
    xmlXPathLocalNameFunction
    xmlXPathNamespaceURIFunction
    xmlXPathNormalizeFunction
    xmlXPathStringFunction
    xmlXPathStringLengthFunction
    once
    htmlInitAutoClose
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlCleanupThreads
    xmlEncodeEntities
    xmlInitParser
    xmlInitializeCatalog
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlParseAttributeType
    xmlParseElementDecl
    xmlParseElementMixedContentDecl
    xmlParsePI
    xmlParseStartTag
    xmlTextReaderCurrentDoc
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    xmlXPathNodeSetMerge
    xmlXPtrLocationSetMerge
    ones
    XML_COMPLETE_ATTRS
    startElementNsSAX2Func
    xmlCatalogConvert
    xmlConvertSGMLCatalog
    ononymous
    _xmlSchema
    onto
    xmlParserInputBufferGrow
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    opaque
    _xmlSchema
    _xmlURI
    open
    htmlCtxtReadFd
    htmlDocDump
    htmlReadFd
    xmlCtxtReadFd
    xmlDocDump
    xmlDocFormatDump
    xmlIOFTPOpen
    xmlIOHTTPOpen
    xmlInputOpenCallback
    xmlNanoFTPConnect
    xmlNanoFTPConnectTo
    xmlNanoFTPGetConnection
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlOutputOpenCallback
    xmlReadFd
    xmlReaderForFd
    xmlReaderNewFd
    xmlTextWriterEndDocument
    opening
    startElement
    startElementSAXFunc
    xmlParseElementChildrenContentDecl
    xmlSAX2StartElement
    operands
    xmlXPathAddValues
    xmlXPathDivValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathSubValues
    xmlXPathValueFlipSign
    operating
    _xmlParserCtxt
    xmlParserInputBufferGrow
    xmlParserInputBufferPush
    operation
    xmlBuildRelativeURI
    xmlCatalogSetDebug
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlTextReaderConstValue
    xmlXPathAddValues
    xmlXPathCompareValues
    xmlXPathConvertBoolean
    xmlXPathConvertNumber
    xmlXPathConvertString
    xmlXPathDivValues
    xmlXPathEqualValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathNotEqualValues
    xmlXPathSubValues
    xmlXPathValueFlipSign
    operations
    _xmlDOMWrapCtxt
    xmlCleanupParser
    xmlModuleClose
    xmlModuleFree
    xmlReconciliateNs
    operator
    xmlExpParse
    xmlXPathCompareValues
    operators
    xmlExpParse
    xmlXPathAddValues
    xmlXPathDivValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathSubValues
    xmlXPathValueFlipSign
    opposite
    xmlCleanupParser
    optimized
    xmlXPathNodeSetAddUnique
    option
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlGetLineNo
    xmlSchemaValidCtxtGetOptions
    options
    htmlCtxtUseOptions
    xmlCtxtUseOptions
    xmlDOMWrapRemoveNode
    xmlModuleOpen
    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO
    xmlSchemaSetValidOptions
    xmlSchemaValidCtxtGetOptions
    xmlSchemaValidateFile
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetup
    xmlXPathContextSetCache
    ordered
    xmlListAppend
    xmlListInsert
    xmlXPathNextAncestor
    xmlXPathNextFollowing
    xmlXPathNextPreceding
    ordering
    xmlListDataCompare
    org
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCheckLanguageID
    xmlGetCharEncodingName
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlSchemaGetPredefinedType
    xmlTextReaderNodeType
    oriented
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    origin
    _xmlXPathContext
    original
    _xmlSchemaElement
    _xmlSchemaFacet
    xmlCharEncodingInputFunc
    xmlCopyError
    xmlGetEncodingAlias
    xmlListMerge
    xmlParseEntityValue
    xmlParseURIRaw
    xmlSchemaSAXPlug
    xmlSchemaSAXUnplug
    xmlShellSave
    xmlStrcat
    xmlStrncat
    xmlStrncatNew
    xmlXPathObjectCopy
    other
    XML_SCHEMAS_INCLUDING_CONVERT_NS
    htmlAutoCloseTag
    htmlIsAutoClosed
    htmlNodeStatus
    xmlAutomataNewNegTrans
    xmlCatalogAdd
    xmlGcMemSetup
    xmlLoadACatalog
    xmlMemSetup
    xmlNanoFTPUpdateURL
    xmlParseAttValue
    xmlParseAttribute
    xmlParseNamespace
    xmlParseSDDecl
    xmlSchemaNewStringValue
    xmlTextReaderIsNamespaceDecl
    xmlTextReaderReadString
    xmlValidateRoot
    xmlXPathIdFunction
    xmlXPathNormalizeFunction
    xmlXPathStringFunction
    xmlXPathStringLengthFunction
    our
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlSAX2SetDocumentLocator
    out
    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlLockLibrary
    xmlParseEntity
    xmlSAXParseEntity
    xmlSchemaValidityLocatorFunc
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlTextReaderNormalization
    xmlXPathFunction
    xmlXPathNodeSetItem
    out-of
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    output?
    xmlNewTextWriterDoc
    xmlNewTextWriterFilename
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlNewTextWriterTree
    outside
    xmlReconciliateNs
    over
    xmlExpCtxtNbCons
    overflow
    _xmlParserInput
    override
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    resolveEntity
    resolveEntitySAXFunc
    xmlCatalogAdd
    xmlGetLineNo
    xmlSAX2ResolveEntity
    overriding
    XML_MAX_NAME_LENGTH
    overwrite
    xmlACatalogAdd
    xmlCatalogAdd
    overwritten
    xmlAddEncodingAlias
    own
    _xmlEntity
    _xmlParserCtxt
    resolveEntity
    resolveEntitySAXFunc
    xmlCleanupMemory
    xmlSAX2ResolveEntity
    owned
    xmlClearParserCtxt
    xmlDictOwns
    owner
    ftpListCallback
    xmlDOMWrapRemoveNode
    ownership
    xmlAddAttributeDecl
    owning
    xmlCopyDocElementContent
    xmlFreeDocElementContent
    xmlNewDocFragment
    owns
    XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/libxml2.xsa0000644000175000017500000002046712125575513015426 0ustar aronaron Daniel Veillard daniel@veillard.com http://veillard.com/ libxml2 2.8.0 May 23 2012 http://xmlsoft.org/ - Features: add lzma compression support (Anders F Bjorklund) - Documentation: xmlcatalog: Add uri and delegateURI to possible add types in man page. (Ville Skyttä), Update README.tests (Daniel Veillard), URI handling code is not OOM resilient (Daniel Veillard), Fix an error in comment (Daniel Veillard), Fixed bug #617016 (Daniel Mustieles), Fixed two typos in the README document (Daniel Neel), add generated html files (Anders F Bjorklund), Clarify the need to use xmlFreeNode after xmlUnlinkNode (Daniel Veillard), Improve documentation a bit (Daniel Veillard), Updated URL for lxml python bindings (Daniel Veillard) - Portability: Restore code for Windows compilation (Daniel Veillard), Remove git error message during configure (Christian Dywan), xmllint: Build fix for endTimer if !defined(HAVE_GETTIMEOFDAY) (Patrick R. Gansterer), remove a bashism in confgure.in (John Hein), undef ERROR if already defined (Patrick R. Gansterer), Fix library problems with mingw-w64 (Michael Cronenworth), fix windows build. ifdef addition from bug 666491 makes no sense (Rob Richards), prefer native threads on win32 (Sam Thursfield), Allow to compile with Visual Studio 2010 (Thomas Lemm), Fix mingw's snprintf configure check (Andoni Morales), fixed a 64bit big endian issue (Marcus Meissner), Fix portability failure if netdb.h lacks NO_ADDRESS (Daniel Veillard), Fix windows build from lzma addition (Rob Richards), autogen: Only check for libtoolize (Colin Walters), Fix the Windows build files (Patrick von Reth), 634846 Remove a linking option breaking Windows VC10 (Daniel Veillard), 599241 fix an initialization problem on Win64 (Andrew W. Nosenko), fix win build (Rob Richards) - Bug fixes: Part for rand_r checking missing (Daniel Veillard), Cleanup on randomization (Daniel Veillard), Fix undefined reference in python module (Pacho Ramos), Fix a race in xmlNewInputStream (Daniel Veillard), Fix weird streaming RelaxNG errors (Noam), Fix various bugs in new code raised by the API checking (Daniel Veillard), Fix various problems with "make dist" (Daniel Veillard), Fix a memory leak in the xzlib code (Daniel Veillard), HTML parser error with <noscript> in the <head> (Denis Pauk), XSD: optional element in complex type extension (Remi Gacogne), Fix html serialization error and htmlSetMetaEncoding() (Daniel Veillard), Fix a wrong return value in previous patch (Daniel Veillard), Fix an uninitialized variable use (Daniel Veillard), Fix a compilation problem with --minimum (Brandon Slack), Remove redundant and ungarded include of resolv.h (Daniel Veillard), xinclude with parse="text" does not use the entity loader (Shaun McCance), Allow to parse 1 byte HTML files (Denis Pauk), Patch that fixes the skipping of the HTML_PARSE_NOIMPLIED flag (Martin Schröder), Avoid memory leak if xmlParserInputBufferCreateIO fails (Lin Yi-Li), Prevent an infinite loop when dumping a node with encoding problems (Timothy Elliott), xmlParseNodeInContext problems with an empty document (Tim Elliott), HTML element position is not detected propperly (Pavel Andrejs), Fix an off by one pointer access (Jüri Aedla), Try to fix a problem with entities in SAX mode (Daniel Veillard), Fix a crash with xmllint --path on empty results (Daniel Veillard), Fixed bug #667946 (Daniel Mustieles), Fix a logic error in Schemas Component Constraints (Ryan Sleevi), Fix a wrong enum type use in Schemas Types (Nico Weber), Fix SAX2 builder in case of undefined attributes namespace (Daniel Veillard), Fix SAX2 builder in case of undefined element namespaces (Daniel Veillard), fix reference to STDOUT_FILENO on MSVC (Tay Ray Chuan), fix a pair of possible out of array char references (Daniel Veillard), Fix an allocation error when copying entities (Daniel Veillard), Make sure the parser returns when getting a Stop order (Chris Evans), Fix some potential problems on reallocation failures(parser.c) (Xia Xinfeng), Fix a schema type duration comparison overflow (Daniel Veillard), Fix an unimplemented part in RNG value validation (Daniel Veillard), Fix missing error status in XPath evaluation (Daniel Veillard), Hardening of XPath evaluation (Daniel Veillard), Fix an off by one error in encoding (Daniel Veillard), Fix RELAX NG include bug #655288 (Shaun McCance), Fix XSD validation bug #630130 (Toyoda Eizi), Fix some potential problems on reallocation failures (Chris Evans), __xmlRaiseError: fix use of the structured callback channel (Dmitry V. Levin), __xmlRaiseError: fix the structured callback channel's data initialization (Dmitry V. Levin), Fix memory corruption when xmlParseBalancedChunkMemoryInternal is called from xmlParseBalancedChunk (Rob Richards), Small fix for previous commit (Daniel Veillard), Fix a potential freeing error in XPath (Daniel Veillard), Fix a potential memory access error (Daniel Veillard), Reactivate the shared library versionning script (Daniel Veillard) - Improvements: use mingw C99 compatible functions {v}snprintf instead those from MSVC runtime (Roumen Petrov), New symbols added for the next release (Daniel Veillard), xmlTextReader bails too quickly on error (Andy Lutomirski), Use a hybrid allocation scheme in xmlNodeSetContent (Conrad Irwin), Use buffers when constructing string node lists. (Conrad Irwin), Add HTML parser support for HTML5 meta charset encoding declaration (Denis Pauk), wrong message for double hyphen in comment XML error (Bryan Henderson), Fix "make tst" to grab lzma lib too (Daniel Veillard), Add "whereis" command to xmllint shell (Ryan), Improve xmllint shell (Ryan), add function xmlTextReaderRelaxNGValidateCtxt() (Noam Postavsky), Add --system support to autogen.sh (Daniel Veillard), Add hash randomization to hash and dict structures (Daniel Veillard), included xzlib in dist (Anders F Bjorklund), move xz/lzma helpers to separate included files (Anders F Bjorklund), add generated devhelp files (Anders F Bjorklund), add XML_WITH_LZMA to api (Anders F Bjorklund), autogen.sh: Honor NOCONFIGURE environment variable (Colin Walters), Improve the error report on undefined REFs (Daniel Veillard), Add exception for new W3C PI xml-model (Daniel Veillard), Add options to ignore the internal encoding (Daniel Veillard), testapi: use the right type for the check (Stefan Kost), various: handle return values of write calls (Stefan Kost), testWriter: xmlTextWriterWriteFormatElement wants an int instead of a long int (Stefan Kost), runxmlconf: update to latest testsuite version (Stefan Kost), configure: add -Wno-long-long to CFLAGS (Stefan Kost), configure: support silent automake rules if possible (Stefan Kost), xmlmemory: add a cast as size_t has no portable printf modifier (Stefan Kost), __xmlRaiseError: remove redundant schannel initialization (Dmitry V. Levin), __xmlRaiseError: do cheap code check early (Dmitry V. Levin) - Cleanups: Cleanups before 2.8.0-rc2 (Daniel Veillard), Avoid an extra operation (Daniel Veillard), Remove vestigial de-ANSI-fication support. (Javier Jardón), autogen.sh: Fix typo (Javier Jardón), Do not use unsigned but unsigned int (Daniel Veillard), Remove two references to u_short (Daniel Veillard), Fix -Wempty-body warning from clang (Nico Weber), Cleanups of lzma support (Daniel Veillard), Augment the list of ignored files (Daniel Veillard), python: remove unused variable (Stefan Kost), python: flag two unused args (Stefan Kost), configure: acconfig.h is deprecated since autoconf-2.50 (Stefan Kost), xpath: remove unused variable (Stefan Kost) libxml2-2.9.1+dfsg1/doc/APIchunk27.html0000644000175000017500000010227612134171042016025 0ustar aronaron API Alphabetic Index w-w for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index w-w for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter w:

    walker
    xmlListReverseWalk
    xmlListWalk
    xmlListWalker
    walking
    _xmlXPathContext
    _xmlXPathParserContext
    xmlListWalker
    want
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    xmlDOMWrapAdoptNode
    warn
    xmlCheckVersion
    warning
    XML_CAST_FPTR
    _xmlValidCtxt
    docbCreatePushParserCtxt
    htmlCreatePushParserCtxt
    initxmlDefaultSAXHandler
    warningSAXFunc
    xmlCreatePushParserCtxt
    xmlEncodeEntities
    xmlParserValidityWarning
    xmlParserWarning
    xmlRelaxNGGetParserErrors
    xmlRelaxNGGetValidErrors
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxNGValidityWarningFunc
    xmlSAX2InitDefaultSAXHandler
    xmlSchemaGetParserErrors
    xmlSchemaGetValidErrors
    xmlSchemaSetParserErrors
    xmlSchemaSetValidErrors
    xmlSchemaValidityWarningFunc
    xmlSchematronValidityWarningFunc
    xmlSearchNs
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetStructuredErrorHandler
    xmlValidityWarningFunc
    warnings
    _xmlParserCtxt
    xmlPedanticParserDefault
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetStructuredErrorHandler
    way
    HTML_COMMENT_NODE
    HTML_ENTITY_REF_NODE
    HTML_PI_NODE
    HTML_PRESERVE_NODE
    HTML_TEXT_NODE
    _xmlDoc
    xmlBoolToText
    xmlKeepBlanksDefault
    xmlNewGlobalNs
    ways:
    xmlValidGetValidElements
    well
    _xmlParserCtxt
    htmlSAXParseDoc
    htmlSAXParseFile
    startElementNsSAX2Func
    xmlCopyDoc
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCtxtExternalEntity
    xmlParseExternalEntity
    xmlParseInNodeContext
    xmlSAX2StartElementNs
    xmlSchemaNewStringValue
    well-balanced
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseInNodeContext
    well-formed
    xmlParseCtxtExternalEntity
    xmlParseEntityRef
    xmlParseExtParsedEnt
    xmlParseExternalEntity
    xmlParserHandleReference
    xmlValidateDtdFinal
    well-formedness
    xmlCtxtResetLastError
    xmlParseEntityRef
    xmlResetLastError
    wellformed
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlParseFile
    were
    _xmlParserCtxt
    xmlCheckLanguageID
    xmlKeepBlanksDefault
    xmlMemShow
    xmlSchemaIsValid
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    wether
    _xmlNodeSet
    what
    xmlCatalogGetDefaults
    xmlCatalogSetDefaults
    xmlParseNamespace
    xmlSchemaValidityLocatorFunc
    xmlTextReaderGetRemainder
    xmlTextWriterWriteRawLen
    where
    _htmlElemDesc
    xmlCopyProp
    xmlCopyPropList
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlExpGetLanguage
    xmlExpGetStart
    xmlFileRead
    xmlIOFTPRead
    xmlIOHTTPRead
    xmlNanoHTTPFetch
    xmlNanoHTTPSave
    xmlNewNs
    xmlParseMarkupDecl
    xmlParseSDDecl
    xmlTextReaderErrorFunc
    while
    xmlInitCharEncodingHandlers
    xmlParseAttributeType
    xmlParseEnumeratedType
    xmlParseEnumerationType
    xmlParseNotationType
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlTextReaderNext
    xmlTextReaderNextSibling
    xmlValidGetValidElements
    white
    xmlKeepBlanksDefault
    xmlParseSDDecl
    xmlSchemaCollapseString
    xmlTextReaderNormalization
    xmlXPathNormalizeFunction
    whitespace
    xmlIsBlankNode
    xmlParseAttValue
    xmlSchemaCompareValuesWhtsp
    xmlSchemaGetCanonValueWhtsp
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacetWhtsp
    xmlXPathIdFunction
    xmlXPathNormalizeFunction
    whitespace-facet
    XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE
    XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE
    XML_SCHEMAS_TYPE_WHITESPACE_REPLACE
    whitespace-separated
    xmlXPathIdFunction
    whitespaces
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    xmlSAX2IgnorableWhitespace
    whole
    xmlFreeDocElementContent
    xmlFreeElementContent
    whose
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlTextReaderLookupNamespace
    why
    xmlModuleOpen
    xmlModuleSymbol
    wierd
    xmlBuildRelativeURI
    wildcard
    XML_SCHEMAS_ATTRGROUP_GLOBAL
    XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED
    XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD
    XML_SCHEMAS_WILDCARD_COMPLETE
    xmlSchemaFreeWildcard
    wildcards
    XML_SCHEMAS_ANY_LAX
    XML_SCHEMAS_ANY_STRICT
    XML_SCHEMAS_ATTR_USE_PROHIBITED
    windows
    INVALID_SOCKET
    SOCKET
    with_ns
    _xmlNodeSet
    within
    _xmlValidCtxt
    xmlAutomataNewCounterTrans
    xmlGetUTF8Char
    xmlNewDocComment
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocRawNode
    xmlNewDocText
    xmlNodeGetBase
    xmlParseCharData
    xmlParseComment
    xmlParseCtxtExternalEntity
    xmlParseInNodeContext
    xmlParseMarkupDecl
    xmlParseSDDecl
    xmlParserFindNodeInfo
    xmlParserHandlePEReference
    xmlParserPrintFileContext
    xmlReconciliateNs
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    xmlSchemaCopyValue
    xmlSearchNs
    xmlTextReaderConstXmlLang
    xmlTextReaderXmlLang
    xmlTextWriterWriteBase64
    xmlTextWriterWriteBinHex
    xmlValidGetValidElements
    xmlXPathIntersection
    without
    XML_CAST_FPTR
    _xmlEntity
    entityDecl
    entityDeclSAXFunc
    htmlNewDocNoDtD
    xmlCleanupParser
    xmlCleanupThreads
    xmlNewGlobalNs
    xmlParseEntityRef
    xmlParsePEReference
    xmlParseSDDecl
    xmlParserHandlePEReference
    xmlSAX2EntityDecl
    xmlScanName
    xmlSplitQName3
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    won
    _xmlParserCtxt
    xmlAutomataNewNegTrans
    xmlBufferCreateStatic
    xmlLoadSGMLSuperCatalog
    xmlParseAttValue
    word
    _htmlElemDesc
    words
    xmlXPathNormalizeFunction
    xmlXPathStringLengthFunction
    work
    xmlBufferDetach
    xmlModuleOpen
    xmlModuleSymbol
    xmlNodeGetBase
    xmlPatternStreamable
    xmlRemoveProp
    xmlSAXParseDoc
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    worked
    xmlNanoFTPCwd
    xmlNanoFTPDele
    works
    xmlShellDu
    worry
    XML_SCHEMAS_ANY_LAX
    worthwhile
    xmlBuildRelativeURI
    would
    _xmlError
    htmlAutoCloseTag
    xmlModuleOpen
    xmlModuleSymbol
    xmlTextReaderGetRemainder
    wrapper
    xmlDOMWrapAcquireNsFunction
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    wraps
    xmlTextReaderByteConsumed
    write
    xmlFileRead
    xmlFindCharEncodingHandler
    xmlGetCharEncodingHandler
    xmlIOFTPRead
    xmlIOHTTPRead
    xmlNewCharEncodingHandler
    xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferCreateIO
    xmlOutputWriteCallback
    xmlSaveToIO
    xmlShellWrite
    writer
    xmlFreeTextWriter
    xmlNewTextWriter
    xmlNewTextWriterPushParser
    writes
    xmlBufferWriteQuotedString
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    writing
    xmlOutputBufferCreateFilename
    wrt
    xmlDOMWrapRemoveNode
    www
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    getSystemId
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCheckLanguageID
    xmlGetCharEncodingName
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlSAX2GetSystemId
    xmlSchemaGetPredefinedType
    xmlTextReaderNodeType

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xmlcatalog_man.xml0000644000175000017500000003205512113312342017026 0ustar aronaron xmlcatalog"> ]> xmlcatalog Manual libxml2 2001 2004 John Fleck
    jfleck@inkstain.net
    $Date$
    xmlcatalog 1 xmlcatalog Command line tool to parse and manipulate XML or SGML catalog files. xmlcatalog CATALOGFILE ENTITIES DESCRIPTION &xmlcatalog; is a command line application allowing users to monitor and manipulate XML and SGML catalogs. It is included in libxml 3 . Its functions can be invoked from a single command from the command line, or it can perform multiple functions in interactive mode. It can operate on both XML and SGML files. OPTIONS &xmlcatalog; accepts the following options (in alphabetical order): Add an entry to CATALOGFILE. TYPE indicates the type of entry. Possible types are: public system uri rewriteSystem rewriteURI delegatePublic delegateSystem delegateURI nextCatalog . ORIG is the original reference to be replaced, and REPLACE is the URI of the replacement entity to be used. The option will not overwrite CATALOGFILE, outputting to stdout, unless is used. The will always take three parameters even if some of the XML catalog constructs will have only a single argument. If the option is used following the option, only a single argument, a FILENAME, is used. This is used to add the name of a catalog file to an SGML supercatalog, a file that contains references to other included SGML catalog files. Create a new XML catalog. Outputs to stdout, ignoring filename unless is used, in which case it creates a new catalog file filename. Remove entries from CATALOGFILE matching VALUE(S). The option will not overwrite CATALOGFILE, outputting to stdout, unless is used. Save output to the named file rather than outputting to stdout. Do not update the SGML super catalog. Run a shell allowing interactive queries on catalog file CATALOGFILE. For the set of available commands see . Uses SGML super catalogs for and options. Output debugging information. SHELL COMMANDS Invoking &xmlcatalog; with the option opens a command line shell allowing interactive access to the catalog file identified by CATALOGFILE. Invoking the shell provides a command line prompt after which the following commands (described in alphabetical order) can be entered. Add an entry to the catalog file. TYPE indicates the type of entry. Possible types are: public system uri rewriteSystem rewriteURI delegatePublic delegateSystem delegateURI nextCatalog . ORIG is the original reference to be replaced, and REPLACE is the URI of the replacement entity to be used. The option will not overwrite CATALOGFILE, outputting to stdout, unless is used. The will always take three parameters even if some of the XML catalog constructs will have only a single argument. Print debugging statements showing the steps &xmlcatalog; is executing. Remove the catalog entry corresponding to VALUE(S). Print the current catalog. Quit the shell. Execute a Formal Public Identifier look-up of the catalog entry for PUBLIC-ID. The corresponding entry will be output to the command line. Stop printing debugging statements. Execute a Formal Public Identifier look-up of the catalog entry for SYSTEM-ID. The corresponding entry will be output to the command line. ENVIRONMENT XML_CATALOG_FILES XML catalog behavior can be changed by redirecting queries to the user's own set of catalogs. This can be done by setting the XML_CATALOG_FILES environment variable to a list of catalogs. An empty one should deactivate loading the default /etc/xml/catalog catalog. DIAGNOSTICS &xmlcatalog; return codes provide information that can be used when calling it from scripts. 0 No error 1 Failed to remove an entry from the catalog 2 Failed to save to the catalog, check file permissions 3 Failed to add an entry to the catalog 4 Failed to look up an entry in the catalog SEE ALSO libxml 3 More information can be found at libxml 3 web page libxml 3 catalog support web page at James Clark's SGML catalog page OASIS XML catalog specification
    libxml2-2.9.1+dfsg1/doc/APIconstructors.html0000644000175000017500000016415412134171042017317 0ustar aronaron List of constructors for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    List of constructors for libxml2

    Developer Menu
    API Indexes
    Related links

    Type SOCKET:

    xmlNanoFTPGetConnection
    xmlNanoFTPGetSocket

    Type const htmlElemDesc *:

    htmlTagLookup

    Type const htmlEntityDesc *:

    htmlEntityLookup
    htmlEntityValueLookup
    htmlParseEntityRef

    Type const xmlChar *:

    getPublicId
    getSystemId
    htmlGetMetaEncoding
    namePop
    xmlBufferContent
    xmlCatalogGetPublic
    xmlCatalogGetSystem
    xmlDictExists
    xmlDictLookup
    xmlDictQLookup
    xmlEncodeEntities
    xmlOutputBufferGetContent
    xmlParseAttribute
    xmlParseEncodingDecl
    xmlParseName
    xmlParsePITarget
    xmlParseStartTag
    xmlSAX2GetPublicId
    xmlSAX2GetSystemId
    xmlSchemaValueGetAsString
    xmlSplitQName3
    xmlStrcasestr
    xmlStrchr
    xmlStrstr
    xmlTextReaderConstBaseUri
    xmlTextReaderConstEncoding
    xmlTextReaderConstLocalName
    xmlTextReaderConstName
    xmlTextReaderConstNamespaceUri
    xmlTextReaderConstPrefix
    xmlTextReaderConstString
    xmlTextReaderConstValue
    xmlTextReaderConstXmlLang
    xmlTextReaderConstXmlVersion
    xmlUTF8Strpos
    xmlXPathNsLookup

    Type const xmlParserNodeInfo *:

    xmlParserFindNodeInfo

    Type docbDocPtr:

    docbParseDoc
    docbParseFile
    docbSAXParseDoc
    docbSAXParseFile

    Type docbParserCtxtPtr:

    docbCreateFileParserCtxt
    docbCreatePushParserCtxt

    Type double:

    xmlXPathCastBooleanToNumber
    xmlXPathCastNodeSetToNumber
    xmlXPathCastNodeToNumber
    xmlXPathCastStringToNumber
    xmlXPathCastToNumber
    xmlXPathPopNumber
    xmlXPathStringEvalNumber

    Type htmlDocPtr:

    htmlCtxtReadDoc
    htmlCtxtReadFd
    htmlCtxtReadFile
    htmlCtxtReadIO
    htmlCtxtReadMemory
    htmlNewDoc
    htmlNewDocNoDtD
    htmlParseDoc
    htmlParseFile
    htmlReadDoc
    htmlReadFd
    htmlReadFile
    htmlReadIO
    htmlReadMemory
    htmlSAXParseDoc
    htmlSAXParseFile

    Type htmlParserCtxtPtr:

    htmlCreateFileParserCtxt
    htmlCreateMemoryParserCtxt
    htmlCreatePushParserCtxt
    htmlNewParserCtxt

    Type htmlStatus:

    htmlAttrAllowed
    htmlElementStatusHere
    htmlNodeStatus

    Type long:

    xmlByteConsumed
    xmlGetLineNo
    xmlSaveDoc
    xmlSaveTree
    xmlTextReaderByteConsumed
    xmlXPathOrderDocElems

    Type size_t:

    xmlBufNodeDump
    xmlBufShrink
    xmlBufUse
    xmlDictGetUsage
    xmlDictSetLimit
    xmlOutputBufferGetSize

    Type unsigned long:

    xmlChildElementCount
    xmlParserFindNodeInfoIndex
    xmlSchemaGetFacetValueAsULong

    Type void *:

    xmlCatalogAddLocal
    xmlFileOpen
    xmlHashCopier
    xmlHashLookup
    xmlHashLookup2
    xmlHashLookup3
    xmlHashQLookup
    xmlHashQLookup2
    xmlHashQLookup3
    xmlIOFTPOpen
    xmlIOHTTPOpen
    xmlIOHTTPOpenW
    xmlInputOpenCallback
    xmlLinkGetData
    xmlListReverseSearch
    xmlListSearch
    xmlMallocAtomicLoc
    xmlMallocFunc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlNanoFTPConnectTo
    xmlNanoFTPNewCtxt
    xmlNanoFTPOpen
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlOutputOpenCallback
    xmlReallocFunc
    xmlReallocLoc
    xmlXPathPopExternal

    Type xlinkHandlerPtr:

    xlinkGetDefaultHandler

    Type xlinkNodeDetectFunc:

    xlinkGetDefaultDetect

    Type xlinkType:

    xlinkIsLink

    Type xmlAttrPtr:

    xmlCopyProp
    xmlCopyPropList
    xmlGetID
    xmlHasNsProp
    xmlHasProp
    xmlNewDocProp
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewProp
    xmlSetNsProp
    xmlSetProp

    Type xmlAttributePtr:

    xmlAddAttributeDecl
    xmlGetDtdAttrDesc
    xmlGetDtdQAttrDesc

    Type xmlAttributeTablePtr:

    xmlCopyAttributeTable

    Type xmlAutomataPtr:

    xmlNewAutomata

    Type xmlAutomataStatePtr:

    xmlAutomataGetInitState
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewState
    xmlAutomataNewTransition
    xmlAutomataNewTransition2

    Type xmlBufferAllocationScheme:

    xmlGetBufferAllocationScheme
    xmlThrDefBufferAllocScheme

    Type xmlBufferPtr:

    xmlBufferCreate
    xmlBufferCreateSize
    xmlBufferCreateStatic

    Type xmlCatalogAllow:

    xmlCatalogGetDefaults

    Type xmlCatalogPrefer:

    xmlCatalogSetDefaultPrefer

    Type xmlCatalogPtr:

    xmlLoadACatalog
    xmlLoadSGMLSuperCatalog
    xmlNewCatalog

    Type xmlChar:

    xmlPopInput

    Type xmlChar *:

    xmlACatalogResolve
    xmlACatalogResolvePublic
    xmlACatalogResolveSystem
    xmlACatalogResolveURI
    xmlBufContent
    xmlBufEnd
    xmlBufferDetach
    xmlBuildQName
    xmlBuildRelativeURI
    xmlBuildURI
    xmlCanonicPath
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCatalogResolve
    xmlCatalogResolvePublic
    xmlCatalogResolveSystem
    xmlCatalogResolveURI
    xmlCharStrdup
    xmlCharStrndup
    xmlDecodeEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlGetNoNsProp
    xmlGetNodePath
    xmlGetNsProp
    xmlGetProp
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNodeGetBase
    xmlNodeGetContent
    xmlNodeGetLang
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlNormalizeWindowsPath
    xmlParseAttValue
    xmlParseEncName
    xmlParseEntityValue
    xmlParseExternalID
    xmlParseNmtoken
    xmlParsePubidLiteral
    xmlParseQuotedString
    xmlParseSystemLiteral
    xmlParseVersionInfo
    xmlParseVersionNum
    xmlPathToURI
    xmlSaveUri
    xmlScanName
    xmlSchemaCollapseString
    xmlSchemaWhiteSpaceReplace
    xmlSplitQName
    xmlSplitQName2
    xmlStrcat
    xmlStrdup
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlStrncat
    xmlStrncatNew
    xmlStrndup
    xmlStrsub
    xmlTextReaderBaseUri
    xmlTextReaderGetAttribute
    xmlTextReaderGetAttributeNo
    xmlTextReaderGetAttributeNs
    xmlTextReaderLocalName
    xmlTextReaderLocatorBaseURI
    xmlTextReaderLookupNamespace
    xmlTextReaderName
    xmlTextReaderNamespaceUri
    xmlTextReaderPrefix
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlTextReaderReadString
    xmlTextReaderValue
    xmlTextReaderXmlLang
    xmlURIEscape
    xmlURIEscapeStr
    xmlUTF8Strndup
    xmlUTF8Strsub
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXPathCastBooleanToString
    xmlXPathCastNodeSetToString
    xmlXPathCastNodeToString
    xmlXPathCastNumberToString
    xmlXPathCastToString
    xmlXPathParseNCName
    xmlXPathParseName
    xmlXPathPopString

    Type xmlCharEncoding:

    xmlDetectCharEncoding
    xmlParseCharEncoding

    Type xmlCharEncodingHandlerPtr:

    xmlFindCharEncodingHandler
    xmlGetCharEncodingHandler
    xmlNewCharEncodingHandler

    Type xmlDOMWrapCtxtPtr:

    xmlDOMWrapNewCtxt

    Type xmlDeregisterNodeFunc:

    xmlDeregisterNodeDefault
    xmlThrDefDeregisterNodeDefault

    Type xmlDictPtr:

    xmlDictCreate
    xmlDictCreateSub

    Type xmlDocPtr:

    xmlCopyDoc
    xmlCtxtReadDoc
    xmlCtxtReadFd
    xmlCtxtReadFile
    xmlCtxtReadIO
    xmlCtxtReadMemory
    xmlNewDoc
    xmlParseCatalogFile
    xmlParseDoc
    xmlParseEntity
    xmlParseFile
    xmlParseMemory
    xmlReadDoc
    xmlReadFd
    xmlReadFile
    xmlReadIO
    xmlReadMemory
    xmlRecoverDoc
    xmlRecoverFile
    xmlRecoverMemory
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlTextReaderCurrentDoc

    Type xmlDtdPtr:

    xmlCopyDtd
    xmlCreateIntSubset
    xmlGetIntSubset
    xmlIOParseDTD
    xmlNewDtd
    xmlParseDTD
    xmlSAXParseDTD

    Type xmlElementContentPtr:

    xmlCopyDocElementContent
    xmlCopyElementContent
    xmlNewDocElementContent
    xmlNewElementContent
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl

    Type xmlElementPtr:

    xmlAddElementDecl
    xmlGetDtdElementDesc
    xmlGetDtdQElementDesc

    Type xmlElementTablePtr:

    xmlCopyElementTable

    Type xmlEntitiesTablePtr:

    xmlCopyEntitiesTable
    xmlCreateEntitiesTable

    Type xmlEntityPtr:

    getEntity
    getEntitySAXFunc
    getParameterEntity
    getParameterEntitySAXFunc
    xmlAddDocEntity
    xmlAddDtdEntity
    xmlGetDocEntity
    xmlGetDtdEntity
    xmlGetParameterEntity
    xmlGetPredefinedEntity
    xmlNewEntity
    xmlParseEntityRef
    xmlSAX2GetEntity
    xmlSAX2GetParameterEntity

    Type xmlEnumerationPtr:

    xmlCopyEnumeration
    xmlCreateEnumeration
    xmlParseEnumerationType
    xmlParseNotationType

    Type xmlErrorPtr:

    xmlCtxtGetLastError
    xmlGetLastError

    Type xmlExpCtxtPtr:

    xmlExpNewCtxt

    Type xmlExpNodePtr:

    xmlExpExpDerive
    xmlExpNewAtom
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlExpParse
    xmlExpStringDerive

    Type xmlExternalEntityLoader:

    xmlGetExternalEntityLoader

    Type xmlGlobalStatePtr:

    xmlGetGlobalState

    Type xmlHashTablePtr:

    xmlHashCopy
    xmlHashCreate
    xmlHashCreateDict

    Type xmlIDPtr:

    xmlAddID

    Type xmlLinkPtr:

    xmlListEnd
    xmlListFront

    Type xmlListPtr:

    xmlGetRefs
    xmlListCreate
    xmlListDup

    Type xmlLocationSetPtr:

    xmlXPtrLocationSetCreate
    xmlXPtrLocationSetMerge

    Type xmlModulePtr:

    xmlModuleOpen

    Type xmlMutexPtr:

    xmlNewMutex

    Type xmlNodePtr:

    nodePop
    xmlAddChild
    xmlAddChildList
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlAddSibling
    xmlCopyNode
    xmlCopyNodeList
    xmlDocCopyNode
    xmlDocCopyNodeList
    xmlDocGetRootElement
    xmlDocSetRootElement
    xmlFirstElementChild
    xmlGetLastChild
    xmlLastElementChild
    xmlNewCDataBlock
    xmlNewCharRef
    xmlNewChild
    xmlNewComment
    xmlNewDocComment
    xmlNewDocFragment
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocPI
    xmlNewDocRawNode
    xmlNewDocText
    xmlNewDocTextLen
    xmlNewNode
    xmlNewNodeEatName
    xmlNewPI
    xmlNewReference
    xmlNewText
    xmlNewTextChild
    xmlNewTextLen
    xmlNextElementSibling
    xmlPreviousElementSibling
    xmlReplaceNode
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    xmlTextMerge
    xmlTextReaderCurrentNode
    xmlTextReaderExpand
    xmlTextReaderPreserve
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextAttribute
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    xmlXPtrBuildNodeList

    Type xmlNodeSetPtr:

    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathIntersection
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeSetCreate
    xmlXPathNodeSetMerge
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathPopNodeSet
    xmlXPathTrailing
    xmlXPathTrailingSorted

    Type xmlNotationPtr:

    xmlAddNotationDecl
    xmlGetDtdNotationDesc

    Type xmlNotationTablePtr:

    xmlCopyNotationTable

    Type xmlNsPtr:

    getNamespace
    xmlCopyNamespace
    xmlCopyNamespaceList
    xmlDOMWrapAcquireNsFunction
    xmlNewGlobalNs
    xmlNewNs
    xmlSearchNs
    xmlSearchNsByHref

    Type xmlNsPtr *:

    xmlGetNsList

    Type xmlOutputBufferCreateFilenameFunc:

    xmlOutputBufferCreateFilenameDefault
    xmlThrDefOutputBufferCreateFilenameDefault

    Type xmlOutputBufferPtr:

    xmlAllocOutputBuffer
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferCreateIO

    Type xmlParserCtxtPtr:

    xmlCreateDocParserCtxt
    xmlCreateEntityParserCtxt
    xmlCreateFileParserCtxt
    xmlCreateIOParserCtxt
    xmlCreateMemoryParserCtxt
    xmlCreatePushParserCtxt
    xmlCreateURLParserCtxt
    xmlNewParserCtxt
    xmlSchemaValidCtxtGetParserCtxt

    Type xmlParserErrors:

    xmlParseInNodeContext

    Type xmlParserInputBufferCreateFilenameFunc:

    xmlParserInputBufferCreateFilenameDefault
    xmlThrDefParserInputBufferCreateFilenameDefault

    Type xmlParserInputBufferPtr:

    xmlAllocParserInputBuffer
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateFilenameFunc
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    xmlTextReaderGetRemainder

    Type xmlParserInputPtr:

    inputPop
    resolveEntity
    resolveEntitySAXFunc
    xmlCheckHTTPInput
    xmlExternalEntityLoader
    xmlLoadExternalEntity
    xmlNewEntityInputStream
    xmlNewIOInputStream
    xmlNewInputFromFile
    xmlNewInputStream
    xmlNewStringInputStream
    xmlNoNetExternalEntityLoader
    xmlSAX2ResolveEntity

    Type xmlPatternPtr:

    xmlPatterncompile

    Type xmlRMutexPtr:

    xmlNewRMutex

    Type xmlRefPtr:

    xmlAddRef

    Type xmlRegExecCtxtPtr:

    xmlRegNewExecCtxt

    Type xmlRegexpPtr:

    xmlAutomataCompile
    xmlRegexpCompile

    Type xmlRegisterNodeFunc:

    xmlRegisterNodeDefault
    xmlThrDefRegisterNodeDefault

    Type xmlRelaxNGParserCtxtPtr:

    xmlRelaxNGNewDocParserCtxt
    xmlRelaxNGNewMemParserCtxt
    xmlRelaxNGNewParserCtxt

    Type xmlRelaxNGPtr:

    xmlRelaxNGParse

    Type xmlRelaxNGValidCtxtPtr:

    xmlRelaxNGNewValidCtxt

    Type xmlSaveCtxtPtr:

    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO

    Type xmlSchemaFacetPtr:

    xmlSchemaNewFacet

    Type xmlSchemaParserCtxtPtr:

    xmlSchemaNewDocParserCtxt
    xmlSchemaNewMemParserCtxt
    xmlSchemaNewParserCtxt

    Type xmlSchemaPtr:

    xmlSchemaParse

    Type xmlSchemaSAXPlugPtr:

    xmlSchemaSAXPlug

    Type xmlSchemaTypePtr:

    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaGetBuiltInType
    xmlSchemaGetPredefinedType

    Type xmlSchemaValPtr:

    xmlSchemaCopyValue
    xmlSchemaNewNOTATIONValue
    xmlSchemaNewQNameValue
    xmlSchemaNewStringValue
    xmlSchemaValueGetNext

    Type xmlSchemaValType:

    xmlSchemaGetValType

    Type xmlSchemaValidCtxtPtr:

    xmlSchemaNewValidCtxt

    Type xmlSchematronParserCtxtPtr:

    xmlSchematronNewDocParserCtxt
    xmlSchematronNewMemParserCtxt
    xmlSchematronNewParserCtxt

    Type xmlSchematronPtr:

    xmlSchematronParse

    Type xmlSchematronValidCtxtPtr:

    xmlSchematronNewValidCtxt

    Type xmlStreamCtxtPtr:

    xmlPatternGetStreamCtxt

    Type xmlTextReaderPtr:

    xmlNewTextReader
    xmlNewTextReaderFilename
    xmlReaderForDoc
    xmlReaderForFd
    xmlReaderForFile
    xmlReaderForIO
    xmlReaderForMemory
    xmlReaderWalker

    Type xmlTextWriterPtr:

    xmlNewTextWriter
    xmlNewTextWriterDoc
    xmlNewTextWriterFilename
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlNewTextWriterTree

    Type xmlURIPtr:

    xmlCreateURI
    xmlParseURI
    xmlParseURIRaw

    Type xmlValidCtxtPtr:

    xmlNewValidCtxt

    Type xmlXIncludeCtxtPtr:

    xmlXIncludeNewContext

    Type xmlXPathCompExprPtr:

    xmlXPathCompile
    xmlXPathCtxtCompile

    Type xmlXPathContextPtr:

    xmlXPathNewContext
    xmlXPtrNewContext

    Type xmlXPathFunction:

    xmlXPathFuncLookupFunc
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS

    Type xmlXPathObjectPtr:

    valuePop
    xmlXPathAxisFunc
    xmlXPathCompiledEval
    xmlXPathConvertBoolean
    xmlXPathConvertNumber
    xmlXPathConvertString
    xmlXPathEval
    xmlXPathEvalExpression
    xmlXPathNewBoolean
    xmlXPathNewCString
    xmlXPathNewFloat
    xmlXPathNewNodeSet
    xmlXPathNewNodeSetList
    xmlXPathNewString
    xmlXPathNewValueTree
    xmlXPathNodeEval
    xmlXPathObjectCopy
    xmlXPathVariableLookup
    xmlXPathVariableLookupFunc
    xmlXPathVariableLookupNS
    xmlXPathWrapCString
    xmlXPathWrapExternal
    xmlXPathWrapNodeSet
    xmlXPathWrapString
    xmlXPtrEval
    xmlXPtrNewCollapsedRange
    xmlXPtrNewLocationSetNodeSet
    xmlXPtrNewLocationSetNodes
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints
    xmlXPtrWrapLocationSet

    Type xmlXPathParserContextPtr:

    xmlXPathNewParserContext

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/python.html0000644000175000017500000004672712124524425015551 0ustar aronaron Python and bindings
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Python and bindings

    Developer Menu
    API Indexes
    Related links

    There are a number of language bindings and wrappers available for libxml2, the list below is not exhaustive. Please contact the xml-bindings@gnome.org (archives) in order to get updates to this list or to discuss the specific topic of libxml2 or libxslt wrappers or bindings:

    • Libxml++ seems the most up-to-date C++ bindings for libxml2, check the documentation and the examples.
    • There is another C++ wrapper based on the gdome2 bindings maintained by Tobias Peters.
    • and a third C++ wrapper by Peter Jones <pjones@pmade.org>

      Website: http://pmade.org/pjones/software/xmlwrapp/

    • XML::LibXML Perl bindings are available on CPAN, as well as XML::LibXSLT Perl libxslt bindings.
    • If you're interested into scripting XML processing, have a look at XSH an XML editing shell based on Libxml2 Perl bindings.
    • Dave Kuhlman provides an earlier version of the libxml/libxslt wrappers for Python.
    • Gopal.V and Peter Minten develop libxml#, a set of C# libxml2 bindings.
    • Petr Kozelka provides Pascal units to glue libxml2 with Kylix, Delphi and other Pascal compilers.
    • Uwe Fechner also provides idom2, a DOM2 implementation for Kylix2/D5/D6 from Borland.
    • There is bindings for Ruby and libxml2 bindings are also available in Ruby through the libgdome-ruby module maintained by Tobias Peters.
    • Steve Ball and contributors maintains libxml2 and libxslt bindings for Tcl.
    • libxml2 and libxslt are the default XML libraries for PHP5.
    • LibxmlJ is an effort to create a 100% JAXP-compatible Java wrapper for libxml2 and libxslt as part of GNU ClasspathX project.
    • Patrick McPhee provides Rexx bindings fof libxml2 and libxslt, look for RexxXML.
    • Satimage provides XMLLib osax. This is an osax for Mac OS X with a set of commands to implement in AppleScript the XML DOM, XPATH and XSLT. Also includes commands for Property-lists (Apple's fast lookup table XML format.)
    • Francesco Montorsi developped wxXml2 wrappers that interface libxml2, allowing wxWidgets applications to load/save/edit XML instances.

    The distribution includes a set of Python bindings, which are guaranteed to be maintained as part of the library in the future, though the Python interface have not yet reached the completeness of the C API.

    Note that some of the Python purist dislike the default set of Python bindings, rather than complaining I suggest they have a look at lxml the more pythonic bindings for libxml2 and libxslt and check the mailing-list.

    Stéphane Bidoul maintains a Windows port of the Python bindings.

    Note to people interested in building bindings, the API is formalized as an XML API description file which allows to automate a large part of the Python bindings, this includes function descriptions, enums, structures, typedefs, etc... The Python script used to build the bindings is python/generator.py in the source distribution.

    To install the Python bindings there are 2 options:

    • If you use an RPM based distribution, simply install the libxml2-python RPM (and if needed the libxslt-python RPM).
    • Otherwise use the libxml2-python module distribution corresponding to your installed version of libxml2 and libxslt. Note that to install it you will need both libxml2 and libxslt installed and run "python setup.py build install" in the module tree.

    The distribution includes a set of examples and regression tests for the python bindings in the python/tests directory. Here are some excerpts from those tests:

    tst.py:

    This is a basic test of the file interface and DOM navigation:

    import libxml2, sys
    
    doc = libxml2.parseFile("tst.xml")
    if doc.name != "tst.xml":
        print "doc.name failed"
        sys.exit(1)
    root = doc.children
    if root.name != "doc":
        print "root.name failed"
        sys.exit(1)
    child = root.children
    if child.name != "foo":
        print "child.name failed"
        sys.exit(1)
    doc.freeDoc()

    The Python module is called libxml2; parseFile is the equivalent of xmlParseFile (most of the bindings are automatically generated, and the xml prefix is removed and the casing convention are kept). All node seen at the binding level share the same subset of accessors:

    • name : returns the node name
    • type : returns a string indicating the node type
    • content : returns the content of the node, it is based on xmlNodeGetContent() and hence is recursive.
    • parent , children, last, next, prev, doc, properties: pointing to the associated element in the tree, those may return None in case no such link exists.

    Also note the need to explicitly deallocate documents with freeDoc() . Reference counting for libxml2 trees would need quite a lot of work to function properly, and rather than risk memory leaks if not implemented correctly it sounds safer to have an explicit function to free a tree. The wrapper python objects like doc, root or child are them automatically garbage collected.

    validate.py:

    This test check the validation interfaces and redirection of error messages:

    import libxml2
    
    #deactivate error messages from the validation
    def noerr(ctx, str):
        pass
    
    libxml2.registerErrorHandler(noerr, None)
    
    ctxt = libxml2.createFileParserCtxt("invalid.xml")
    ctxt.validate(1)
    ctxt.parseDocument()
    doc = ctxt.doc()
    valid = ctxt.isValid()
    doc.freeDoc()
    if valid != 0:
        print "validity check failed"

    The first thing to notice is the call to registerErrorHandler(), it defines a new error handler global to the library. It is used to avoid seeing the error messages when trying to validate the invalid document.

    The main interest of that test is the creation of a parser context with createFileParserCtxt() and how the behaviour can be changed before calling parseDocument() . Similarly the information resulting from the parsing phase is also available using context methods.

    Contexts like nodes are defined as class and the libxml2 wrappers maps the C function interfaces in terms of objects method as much as possible. The best to get a complete view of what methods are supported is to look at the libxml2.py module containing all the wrappers.

    push.py:

    This test show how to activate the push parser interface:

    import libxml2
    
    ctxt = libxml2.createPushParser(None, "<foo", 4, "test.xml")
    ctxt.parseChunk("/>", 2, 1)
    doc = ctxt.doc()
    
    doc.freeDoc()

    The context is created with a special call based on the xmlCreatePushParser() from the C library. The first argument is an optional SAX callback object, then the initial set of data, the length and the name of the resource in case URI-References need to be computed by the parser.

    Then the data are pushed using the parseChunk() method, the last call setting the third argument terminate to 1.

    pushSAX.py:

    this test show the use of the event based parsing interfaces. In this case the parser does not build a document, but provides callback information as the parser makes progresses analyzing the data being provided:

    import libxml2
    log = ""
    
    class callback:
        def startDocument(self):
            global log
            log = log + "startDocument:"
    
        def endDocument(self):
            global log
            log = log + "endDocument:"
    
        def startElement(self, tag, attrs):
            global log
            log = log + "startElement %s %s:" % (tag, attrs)
    
        def endElement(self, tag):
            global log
            log = log + "endElement %s:" % (tag)
    
        def characters(self, data):
            global log
            log = log + "characters: %s:" % (data)
    
        def warning(self, msg):
            global log
            log = log + "warning: %s:" % (msg)
    
        def error(self, msg):
            global log
            log = log + "error: %s:" % (msg)
    
        def fatalError(self, msg):
            global log
            log = log + "fatalError: %s:" % (msg)
    
    handler = callback()
    
    ctxt = libxml2.createPushParser(handler, "<foo", 4, "test.xml")
    chunk = " url='tst'>b"
    ctxt.parseChunk(chunk, len(chunk), 0)
    chunk = "ar</foo>"
    ctxt.parseChunk(chunk, len(chunk), 1)
    
    reference = "startDocument:startElement foo {'url': 'tst'}:" + \ 
                "characters: bar:endElement foo:endDocument:"
    if log != reference:
        print "Error got: %s" % log
        print "Expected: %s" % reference

    The key object in that test is the handler, it provides a number of entry points which can be called by the parser as it makes progresses to indicate the information set obtained. The full set of callback is larger than what the callback class in that specific example implements (see the SAX definition for a complete list). The wrapper will only call those supplied by the object when activated. The startElement receives the names of the element and a dictionary containing the attributes carried by this element.

    Also note that the reference string generated from the callback shows a single character call even though the string "bar" is passed to the parser from 2 different call to parseChunk()

    xpath.py:

    This is a basic test of XPath wrappers support

    import libxml2
    
    doc = libxml2.parseFile("tst.xml")
    ctxt = doc.xpathNewContext()
    res = ctxt.xpathEval("//*")
    if len(res) != 2:
        print "xpath query: wrong node set size"
        sys.exit(1)
    if res[0].name != "doc" or res[1].name != "foo":
        print "xpath query: wrong node set value"
        sys.exit(1)
    doc.freeDoc()
    ctxt.xpathFreeContext()

    This test parses a file, then create an XPath context to evaluate XPath expression on it. The xpathEval() method execute an XPath query and returns the result mapped in a Python way. String and numbers are natively converted, and node sets are returned as a tuple of libxml2 Python nodes wrappers. Like the document, the XPath context need to be freed explicitly, also not that the result of the XPath query may point back to the document tree and hence the document must be freed after the result of the query is used.

    xpathext.py:

    This test shows how to extend the XPath engine with functions written in python:

    import libxml2
    
    def foo(ctx, x):
        return x + 1
    
    doc = libxml2.parseFile("tst.xml")
    ctxt = doc.xpathNewContext()
    libxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
    res = ctxt.xpathEval("foo(1)")
    if res != 2:
        print "xpath extension failure"
    doc.freeDoc()
    ctxt.xpathFreeContext()

    Note how the extension function is registered with the context (but that part is not yet finalized, this may change slightly in the future).

    tstxpath.py:

    This test is similar to the previous one but shows how the extension function can access the XPath evaluation context:

    def foo(ctx, x):
        global called
    
        #
        # test that access to the XPath evaluation contexts
        #
        pctxt = libxml2.xpathParserContext(_obj=ctx)
        ctxt = pctxt.context()
        called = ctxt.function()
        return x + 1

    All the interfaces around the XPath parser(or rather evaluation) context are not finalized, but it should be sufficient to do contextual work at the evaluation point.

    Memory debugging:

    last but not least, all tests starts with the following prologue:

    #memory debug specific
    libxml2.debugMemory(1)

    and ends with the following epilogue:

    #memory debug specific
    libxml2.cleanupParser()
    if libxml2.debugMemory(1) == 0:
        print "OK"
    else:
        print "Memory leak %d bytes" % (libxml2.debugMemory(1))
        libxml2.dumpMemory()

    Those activate the memory debugging interface of libxml2 where all allocated block in the library are tracked. The prologue then cleans up the library state and checks that all allocated memory has been freed. If not it calls dumpMemory() which saves that list in a .memdump file.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/newapi.xsl0000644000175000017500000006260512113312341015334 0ustar aronaron html ../ API Menu
    API Indexes
    Related links
        #define 
        
        Variable 
        
          
        
         
        
        
        
    
    
        
        
          
    	Enum 
    	
    	
    
          
          
    	Typedef 
    	
    	  
    	
    	 
    	
    	
    
          
        
        

    Enum

          Enum 
          
           {
    
          
            
                
            
             = 
            
            
    	   : 
    	  
    	    
    	  
            
            
    
          
          }
    
        
        Structure 
    The content of this structure is not made public by the API.

    Structure

        Structure 
    { The content of this structure is not made public by the API. : }

    Macro:

    #define 

        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )
        Function type: 
        
        
    
        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )

    Function type:

        Function type: 
        
        
    
        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )

    :
    Returns:

    Function:

        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )

    :
    Returns:

    This module is deprecated

    Module from <xsl:value-of select="$title"/>

    Table of Contents

    Description

    Table of Contents

    Description

    Daniel Veillard

  • :
  • Reference Manual for <xsl:value-of select="$title"/>

    Table of Contents

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/upgrade.html0000644000175000017500000003054012124524425015641 0ustar aronaron Upgrading 1.x code
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Upgrading 1.x code

    Developer Menu
    API Indexes
    Related links

    Incompatible changes:

    Version 2 of libxml2 is the first version introducing serious backward incompatible changes. The main goals were:

    • a general cleanup. A number of mistakes inherited from the very early versions couldn't be changed due to compatibility constraints. Example the "childs" element in the nodes.
    • Uniformization of the various nodes, at least for their header and link parts (doc, parent, children, prev, next), the goal is a simpler programming model and simplifying the task of the DOM implementors.
    • better conformances to the XML specification, for example version 1.x had an heuristic to try to detect ignorable white spaces. As a result the SAX event generated were ignorableWhitespace() while the spec requires character() in that case. This also mean that a number of DOM node containing blank text may populate the DOM tree which were not present before.

    How to fix libxml-1.x code:

    So client code of libxml designed to run with version 1.x may have to be changed to compile against version 2.x of libxml. Here is a list of changes that I have collected, they may not be sufficient, so in case you find other change which are required, drop me a mail:

    1. The package name have changed from libxml to libxml2, the library name is now -lxml2 . There is a new xml2-config script which should be used to select the right parameters libxml2
    2. Node childs field has been renamed children so s/childs/children/g should be applied (probability of having "childs" anywhere else is close to 0+
    3. The document don't have anymore a root element it has been replaced by children and usually you will get a list of element here. For example a Dtd element for the internal subset and it's declaration may be found in that list, as well as processing instructions or comments found before or after the document root element. Use xmlDocGetRootElement(doc) to get the root element of a document. Alternatively if you are sure to not reference DTDs nor have PIs or comments before or after the root element s/->root/->children/g will probably do it.
    4. The white space issue, this one is more complex, unless special case of validating parsing, the line breaks and spaces usually used for indenting and formatting the document content becomes significant. So they are reported by SAX and if your using the DOM tree, corresponding nodes are generated. Too approach can be taken:
      1. lazy one, use the compatibility call xmlKeepBlanksDefault(0) but be aware that you are relying on a special (and possibly broken) set of heuristics of libxml to detect ignorable blanks. Don't complain if it breaks or make your application not 100% clean w.r.t. to it's input.
      2. the Right Way: change you code to accept possibly insignificant blanks characters, or have your tree populated with weird blank text nodes. You can spot them using the commodity function xmlIsBlankNode(node) returning 1 for such blank nodes.

      Note also that with the new default the output functions don't add any extra indentation when saving a tree in order to be able to round trip (read and save) without inflating the document with extra formatting chars.

    5. The include path has changed to $prefix/libxml/ and the includes themselves uses this new prefix in includes instructions... If you are using (as expected) the
      xml2-config --cflags

      output to generate you compile commands this will probably work out of the box

    6. xmlDetectCharEncoding takes an extra argument indicating the length in byte of the head of the document available for character detection.

    Ensuring both libxml-1.x and libxml-2.x compatibility

    Two new version of libxml (1.8.11) and libxml2 (2.3.4) have been released to allow smooth upgrade of existing libxml v1code while retaining compatibility. They offers the following:

    1. similar include naming, one should use #include<libxml/...> in both cases.
    2. similar identifiers defined via macros for the child and root fields: respectively xmlChildrenNode and xmlRootNode
    3. a new macro LIBXML_TEST_VERSION which should be inserted once in the client code

    So the roadmap to upgrade your existing libxml applications is the following:

    1. install the libxml-1.8.8 (and libxml-devel-1.8.8) packages
    2. find all occurrences where the xmlDoc root field is used and change it to xmlRootNode
    3. similarly find all occurrences where the xmlNode childs field is used and change it to xmlChildrenNode
    4. add a LIBXML_TEST_VERSION macro somewhere in your main() or in the library init entry point
    5. Recompile, check compatibility, it should still work
    6. Change your configure script to look first for xml2-config and fall back using xml-config . Use the --cflags and --libs output of the command as the Include and Linking parameters needed to use libxml.
    7. install libxml2-2.3.x and libxml2-devel-2.3.x (libxml-1.8.y and libxml-devel-1.8.y can be kept simultaneously)
    8. remove your config.cache, relaunch your configuration mechanism, and recompile, if steps 2 and 3 were done right it should compile as-is
    9. Test that your application is still running correctly, if not this may be due to extra empty nodes due to formating spaces being kept in libxml2 contrary to libxml1, in that case insert xmlKeepBlanksDefault(1) in your code before calling the parser (next to LIBXML_TEST_VERSION is a fine place).

    Following those steps should work. It worked for some of my own code.

    Let me put some emphasis on the fact that there is far more changes from libxml 1.x to 2.x than the ones you may have to patch for. The overall code has been considerably cleaned up and the conformance to the XML specification has been drastically improved too. Don't take those changes as an excuse to not upgrade, it may cost a lot on the long term ...

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xmllint.xml0000644000175000017500000006220212124465257015544 0ustar aronaron xmllint"> ]> xmllint Manual libxml2 2001 2004 John Fleck
    jfleck@inkstain.net
    Ziying Sherwin
    sherwin@nlm.nih.gov
    Heiko Rupp
    hwr@pilhuhn.de
    $Date$
    xmllint 1 xmllint command line XML tool xmllint XML-FILE(S) - xmllint DESCRIPTION The &xmllint; program parses one or more XML files, specified on the command line as XML-FILE (or the standard input if the filename provided is - ). It prints various types of output, depending upon the options selected. It is useful for detecting errors both in XML code and in the XML parser itself. &xmllint; is included in libxml 3 . OPTIONS &xmllint; accepts the following options (in alphabetical order): Generate a small document for testing purposes. Use the SGML catalog(s) from SGML_CATALOG_FILES. Otherwise XML catalogs starting from /etc/xml/catalog are used by default. Turn on node registration. Useful for developers testing libxml 3 node tracking code. Turn on gzip 1 compression of output. Test the internal copy implementation. Use the W3C XML Canonicalisation (C14N) to serialize the result of parsing to stdout. It keeps comments in the result. Use the DTD specified by an URL for validation. Use the DTD specified by a Formal Public Identifier FPI for validation, note that this will require a catalog exporting that Formal Public Identifier to work. Parse a file and output an annotated tree of the in-memory version of the document. Debug the entities defined in the document. Remove DTD from output. Fetch external DTD and populate the tree with inherited attributes. Output in the given encoding. Reformat and reindent the output. The XMLLINT_INDENT environment variable controls the indentation. The default value is two spaces " "). Print out a short usage summary for &xmllint;. Use the HTML parser. Output results as an HTML file. This causes &xmllint; to output the necessary HTML tags surrounding the result tree output so the results can be displayed/viewed in a browser. Test for valid insertions. Fetch an external DTD. Display all the documents loaded during the processing to stderr. Test the parser memory support. NNBYTES is the maximum number of bytes the library is allowed to allocate. This can also be used to make sure batch processing of XML files will not exhaust the virtual memory of the server running them. Parse from memory. Drop ignorable blank spaces. Do not use any catalogs. Substitute CDATA section by equivalent text nodes. Substitute entity values for entity references. By default, &xmllint; leaves entity references in place. Do not use the Internet to fetch DTDs or entities. Suppress output. By default, &xmllint; outputs the result tree. Do not emit warnings from the parser and/or validator. Do not output HTML doc wrapper. Do XInclude processing but do not generate XInclude start and end nodes. Remove redundant namespace declarations. Define a file path where &xmllint; will save the result of parsing. Usually the programs build a tree and save it on stdout, with this option the result XML instance will be saved onto a file. Use the (space- or colon-separated) list of filesystem paths specified by PATHS to load DTDs or entities. Enclose space-separated lists by quotation marks. Used to exercise the pattern recognition engine, which can be used with the reader interface to the parser. It allows to select some nodes in the document based on an XPath (subset) expression. Used for debugging. Validate after parsing has completed. Use the push mode of the parser. Output any parsable portions of an invalid document. Use RelaxNG file named SCHEMA for validation. Repeat 100 times, for timing or profiling. Use a W3C XML Schema file named SCHEMA for validation. Run a navigating shell. Details on available commands in shell mode are below (see ). Run an XPath expression given as argument and print the result. In case of a nodeset result, each node in the node set is serialized in full in the output. In case of an empty node set the "XPath set is empty" result will be shown and an error exit code will be returned. Use streaming API - useful when used in combination with or options for validation of files that are too large to be held in memory. Test user input/output support. Output information about the time it takes &xmllint; to perform the various steps. Determine if the document is a valid instance of the included Document Type Definition (DTD). A DTD to be validated against also can be specified at the command line using the option. By default, &xmllint; also checks to determine if the document is well-formed. Display the version of libxml 3 used. Test the walker module, which is a reader interface but for a document tree, instead of using the reader API on an unparsed document it works on an existing in-memory tree. Used for debugging. Do XInclude processing. Used in conjunction with . Usually when HTML is parsed the document is saved with the HTML serializer. But with this option the resulting document is saved with the XML serializer. This is primarily used to generate XHTML from HTML input. SHELL COMMANDS &xmllint; offers an interactive shell mode invoked with the command. Available commands in shell mode include (in alphabetical order): base Display XML base of the node. bye Leave the shell. cat NODE Display the given node or the current one. cd PATH Change the current node to the given path (if unique) or root if no argument is given. dir PATH Dumps information about the node (namespace, attributes, content). du PATH Show the structure of the subtree under the given path or the current node. exit Leave the shell. help Show this help. free Display memory usage. load FILENAME Load a new document with the given filename. ls PATH List contents of the given path or the current directory. pwd Display the path to the current node. quit Leave the shell. save FILENAME Save the current document to the given filename or to the original name. Check the document for errors. write FILENAME Write the current node to the given filename. ENVIRONMENT SGML_CATALOG_FILES SGML catalog behavior can be changed by redirecting queries to the user's own set of catalogs. This can be done by setting the SGML_CATALOG_FILES environment variable to a list of catalogs. An empty one should deactivate loading the default /etc/sgml/catalog catalog. XML_CATALOG_FILES XML catalog behavior can be changed by redirecting queries to the user's own set of catalogs. This can be done by setting the XML_CATALOG_FILES environment variable to a list of catalogs. An empty one should deactivate loading the default /etc/xml/catalog catalog. XML_DEBUG_CATALOG Setting the environment variable XML_DEBUG_CATALOG to non-zero using the export command outputs debugging information related to catalog operations. XMLLINT_INDENT Setting the environment variable XMLLINT_INDENT controls the indentation. The default value is two spaces " ". DIAGNOSTICS &xmllint; return codes provide information that can be used when calling it from scripts. 0 No error 1 Unclassified 2 Error in DTD 3 Validation error 4 Validation error 5 Error in schema compilation 6 Error writing output 7 Error in pattern (generated when option is used) 8 Error in Reader registration (generated when option is used) 9 Out of memory error SEE ALSO libxml 3 More information can be found at libxml 3 web page W3C XSLT page
    libxml2-2.9.1+dfsg1/doc/APIsymbols.html0000644000175000017500000117354512134171042016244 0ustar aronaron Alphabetic List of Symbols in libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Alphabetic List of Symbols in libxml2

    Developer Menu
    API Indexes
    Related links

    Letter A:

    ATTRIBUTE_UNUSED

    Letter B:

    BAD_CAST
    BASE_BUFFER_SIZE

    Letter C:

    CAST_TO_BOOLEAN
    CAST_TO_NUMBER
    CAST_TO_STRING
    CHECK_ARITY
    CHECK_ERROR
    CHECK_ERROR0
    CHECK_TYPE
    CHECK_TYPE0

    Letter D:

    DEBUG_MEMORY
    DEBUG_MEMORY_LOCATION

    Letter H:

    HTML_COMMENT_NODE
    HTML_DEPRECATED
    HTML_ENTITY_REF_NODE
    HTML_INVALID
    HTML_NA
    HTML_PARSE_COMPACT
    HTML_PARSE_IGNORE_ENC
    HTML_PARSE_NOBLANKS
    HTML_PARSE_NODEFDTD
    HTML_PARSE_NOERROR
    HTML_PARSE_NOIMPLIED
    HTML_PARSE_NONET
    HTML_PARSE_NOWARNING
    HTML_PARSE_PEDANTIC
    HTML_PARSE_RECOVER
    HTML_PI_NODE
    HTML_PRESERVE_NODE
    HTML_REQUIRED
    HTML_TEXT_NODE
    HTML_VALID

    Letter I:

    INPUT_CHUNK
    INVALID_SOCKET
    IS_ASCII_DIGIT
    IS_ASCII_LETTER
    IS_BASECHAR
    IS_BLANK
    IS_BLANK_CH
    IS_BYTE_CHAR
    IS_CHAR
    IS_CHAR_CH
    IS_COMBINING
    IS_COMBINING_CH
    IS_DIGIT
    IS_DIGIT_CH
    IS_EXTENDER
    IS_EXTENDER_CH
    IS_IDEOGRAPHIC
    IS_LETTER
    IS_LETTER_CH
    IS_PUBIDCHAR
    IS_PUBIDCHAR_CH

    Letter L:

    LIBXML2_NEW_BUFFER
    LIBXML_ATTR_ALLOC_SIZE
    LIBXML_ATTR_FORMAT
    LIBXML_AUTOMATA_ENABLED
    LIBXML_C14N_ENABLED
    LIBXML_CATALOG_ENABLED
    LIBXML_DEBUG_ENABLED
    LIBXML_DEBUG_RUNTIME
    LIBXML_DLL_IMPORT
    LIBXML_DOCB_ENABLED
    LIBXML_DOTTED_VERSION
    LIBXML_EXPR_ENABLED
    LIBXML_FTP_ENABLED
    LIBXML_HTML_ENABLED
    LIBXML_HTTP_ENABLED
    LIBXML_ICONV_ENABLED
    LIBXML_ICU_ENABLED
    LIBXML_ISO8859X_ENABLED
    LIBXML_LEGACY_ENABLED
    LIBXML_LZMA_ENABLED
    LIBXML_MODULES_ENABLED
    LIBXML_MODULE_EXTENSION
    LIBXML_OUTPUT_ENABLED
    LIBXML_PATTERN_ENABLED
    LIBXML_PUSH_ENABLED
    LIBXML_READER_ENABLED
    LIBXML_REGEXP_ENABLED
    LIBXML_SAX1_ENABLED
    LIBXML_SCHEMAS_ENABLED
    LIBXML_SCHEMATRON_ENABLED
    LIBXML_TEST_VERSION
    LIBXML_THREAD_ALLOC_ENABLED
    LIBXML_THREAD_ENABLED
    LIBXML_TREE_ENABLED
    LIBXML_UNICODE_ENABLED
    LIBXML_VALID_ENABLED
    LIBXML_VERSION
    LIBXML_VERSION_EXTRA
    LIBXML_VERSION_STRING
    LIBXML_WRITER_ENABLED
    LIBXML_XINCLUDE_ENABLED
    LIBXML_XPATH_ENABLED
    LIBXML_XPTR_ENABLED
    LIBXML_ZLIB_ENABLED

    Letter M:

    MOVETO_ENDTAG
    MOVETO_STARTTAG

    Letter S:

    SKIP_EOL
    SOCKET

    Letter U:

    UTF8ToHtml
    UTF8Toisolat1

    Letter W:

    WITHOUT_TRIO
    WITH_TRIO

    Letter X:

    XINCLUDE_FALLBACK
    XINCLUDE_HREF
    XINCLUDE_NODE
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    XINCLUDE_PARSE
    XINCLUDE_PARSE_ENCODING
    XINCLUDE_PARSE_TEXT
    XINCLUDE_PARSE_XML
    XINCLUDE_PARSE_XPOINTER
    XLINK_ACTUATE_AUTO
    XLINK_ACTUATE_NONE
    XLINK_ACTUATE_ONREQUEST
    XLINK_SHOW_EMBED
    XLINK_SHOW_NEW
    XLINK_SHOW_NONE
    XLINK_SHOW_REPLACE
    XLINK_TYPE_EXTENDED
    XLINK_TYPE_EXTENDED_SET
    XLINK_TYPE_NONE
    XLINK_TYPE_SIMPLE
    XMLCALL
    XMLCDECL
    XMLPUBFUN
    XMLPUBVAR
    XML_ATTRIBUTE_CDATA
    XML_ATTRIBUTE_DECL
    XML_ATTRIBUTE_ENTITIES
    XML_ATTRIBUTE_ENTITY
    XML_ATTRIBUTE_ENUMERATION
    XML_ATTRIBUTE_FIXED
    XML_ATTRIBUTE_ID
    XML_ATTRIBUTE_IDREF
    XML_ATTRIBUTE_IDREFS
    XML_ATTRIBUTE_IMPLIED
    XML_ATTRIBUTE_NMTOKEN
    XML_ATTRIBUTE_NMTOKENS
    XML_ATTRIBUTE_NODE
    XML_ATTRIBUTE_NONE
    XML_ATTRIBUTE_NOTATION
    XML_ATTRIBUTE_REQUIRED
    XML_BUFFER_ALLOC_DOUBLEIT
    XML_BUFFER_ALLOC_EXACT
    XML_BUFFER_ALLOC_HYBRID
    XML_BUFFER_ALLOC_IMMUTABLE
    XML_BUFFER_ALLOC_IO
    XML_BUF_OVERFLOW
    XML_C14N_1_0
    XML_C14N_1_1
    XML_C14N_CREATE_CTXT
    XML_C14N_CREATE_STACK
    XML_C14N_EXCLUSIVE_1_0
    XML_C14N_INVALID_NODE
    XML_C14N_RELATIVE_NAMESPACE
    XML_C14N_REQUIRES_UTF8
    XML_C14N_UNKNOW_NODE
    XML_CAST_FPTR
    XML_CATALOGS_NAMESPACE
    XML_CATALOG_ENTRY_BROKEN
    XML_CATALOG_MISSING_ATTR
    XML_CATALOG_NOT_CATALOG
    XML_CATALOG_PI
    XML_CATALOG_PREFER_VALUE
    XML_CATALOG_RECURSION
    XML_CATA_ALLOW_ALL
    XML_CATA_ALLOW_DOCUMENT
    XML_CATA_ALLOW_GLOBAL
    XML_CATA_ALLOW_NONE
    XML_CATA_PREFER_NONE
    XML_CATA_PREFER_PUBLIC
    XML_CATA_PREFER_SYSTEM
    XML_CDATA_SECTION_NODE
    XML_CHAR_ENCODING_2022_JP
    XML_CHAR_ENCODING_8859_1
    XML_CHAR_ENCODING_8859_2
    XML_CHAR_ENCODING_8859_3
    XML_CHAR_ENCODING_8859_4
    XML_CHAR_ENCODING_8859_5
    XML_CHAR_ENCODING_8859_6
    XML_CHAR_ENCODING_8859_7
    XML_CHAR_ENCODING_8859_8
    XML_CHAR_ENCODING_8859_9
    XML_CHAR_ENCODING_ASCII
    XML_CHAR_ENCODING_EBCDIC
    XML_CHAR_ENCODING_ERROR
    XML_CHAR_ENCODING_EUC_JP
    XML_CHAR_ENCODING_NONE
    XML_CHAR_ENCODING_SHIFT_JIS
    XML_CHAR_ENCODING_UCS2
    XML_CHAR_ENCODING_UCS4BE
    XML_CHAR_ENCODING_UCS4LE
    XML_CHAR_ENCODING_UCS4_2143
    XML_CHAR_ENCODING_UCS4_3412
    XML_CHAR_ENCODING_UTF16BE
    XML_CHAR_ENCODING_UTF16LE
    XML_CHAR_ENCODING_UTF8
    XML_CHECK_ENTITY_TYPE
    XML_CHECK_FOUND_ATTRIBUTE
    XML_CHECK_FOUND_CDATA
    XML_CHECK_FOUND_COMMENT
    XML_CHECK_FOUND_DOCTYPE
    XML_CHECK_FOUND_ELEMENT
    XML_CHECK_FOUND_ENTITY
    XML_CHECK_FOUND_ENTITYREF
    XML_CHECK_FOUND_FRAGMENT
    XML_CHECK_FOUND_NOTATION
    XML_CHECK_FOUND_PI
    XML_CHECK_FOUND_TEXT
    XML_CHECK_NAME_NOT_NULL
    XML_CHECK_NOT_ATTR
    XML_CHECK_NOT_ATTR_DECL
    XML_CHECK_NOT_DTD
    XML_CHECK_NOT_ELEM_DECL
    XML_CHECK_NOT_ENTITY_DECL
    XML_CHECK_NOT_NCNAME
    XML_CHECK_NOT_NS_DECL
    XML_CHECK_NOT_UTF8
    XML_CHECK_NO_DICT
    XML_CHECK_NO_DOC
    XML_CHECK_NO_ELEM
    XML_CHECK_NO_HREF
    XML_CHECK_NO_NAME
    XML_CHECK_NO_NEXT
    XML_CHECK_NO_PARENT
    XML_CHECK_NO_PREV
    XML_CHECK_NS_ANCESTOR
    XML_CHECK_NS_SCOPE
    XML_CHECK_OUTSIDE_DICT
    XML_CHECK_UNKNOWN_NODE
    XML_CHECK_WRONG_DOC
    XML_CHECK_WRONG_NAME
    XML_CHECK_WRONG_NEXT
    XML_CHECK_WRONG_PARENT
    XML_CHECK_WRONG_PREV
    XML_COMMENT_NODE
    XML_COMPLETE_ATTRS
    XML_CTXT_FINISH_DTD_0
    XML_CTXT_FINISH_DTD_1
    XML_DEFAULT_VERSION
    XML_DETECT_IDS
    XML_DOCB_DOCUMENT_NODE
    XML_DOCUMENT_FRAG_NODE
    XML_DOCUMENT_NODE
    XML_DOCUMENT_TYPE_NODE
    XML_DOC_DTDVALID
    XML_DOC_HTML
    XML_DOC_INTERNAL
    XML_DOC_NSVALID
    XML_DOC_OLD10
    XML_DOC_USERBUILT
    XML_DOC_WELLFORMED
    XML_DOC_XINCLUDE
    XML_DTD_ATTRIBUTE_DEFAULT
    XML_DTD_ATTRIBUTE_REDEFINED
    XML_DTD_ATTRIBUTE_VALUE
    XML_DTD_CONTENT_ERROR
    XML_DTD_CONTENT_MODEL
    XML_DTD_CONTENT_NOT_DETERMINIST
    XML_DTD_DIFFERENT_PREFIX
    XML_DTD_DUP_TOKEN
    XML_DTD_ELEM_DEFAULT_NAMESPACE
    XML_DTD_ELEM_NAMESPACE
    XML_DTD_ELEM_REDEFINED
    XML_DTD_EMPTY_NOTATION
    XML_DTD_ENTITY_TYPE
    XML_DTD_ID_FIXED
    XML_DTD_ID_REDEFINED
    XML_DTD_ID_SUBSET
    XML_DTD_INVALID_CHILD
    XML_DTD_INVALID_DEFAULT
    XML_DTD_LOAD_ERROR
    XML_DTD_MISSING_ATTRIBUTE
    XML_DTD_MIXED_CORRUPT
    XML_DTD_MULTIPLE_ID
    XML_DTD_NODE
    XML_DTD_NOTATION_REDEFINED
    XML_DTD_NOTATION_VALUE
    XML_DTD_NOT_EMPTY
    XML_DTD_NOT_PCDATA
    XML_DTD_NOT_STANDALONE
    XML_DTD_NO_DOC
    XML_DTD_NO_DTD
    XML_DTD_NO_ELEM_NAME
    XML_DTD_NO_PREFIX
    XML_DTD_NO_ROOT
    XML_DTD_ROOT_NAME
    XML_DTD_STANDALONE_DEFAULTED
    XML_DTD_STANDALONE_WHITE_SPACE
    XML_DTD_UNKNOWN_ATTRIBUTE
    XML_DTD_UNKNOWN_ELEM
    XML_DTD_UNKNOWN_ENTITY
    XML_DTD_UNKNOWN_ID
    XML_DTD_UNKNOWN_NOTATION
    XML_DTD_XMLID_TYPE
    XML_DTD_XMLID_VALUE
    XML_ELEMENT_CONTENT_ELEMENT
    XML_ELEMENT_CONTENT_MULT
    XML_ELEMENT_CONTENT_ONCE
    XML_ELEMENT_CONTENT_OPT
    XML_ELEMENT_CONTENT_OR
    XML_ELEMENT_CONTENT_PCDATA
    XML_ELEMENT_CONTENT_PLUS
    XML_ELEMENT_CONTENT_SEQ
    XML_ELEMENT_DECL
    XML_ELEMENT_NODE
    XML_ELEMENT_TYPE_ANY
    XML_ELEMENT_TYPE_ELEMENT
    XML_ELEMENT_TYPE_EMPTY
    XML_ELEMENT_TYPE_MIXED
    XML_ELEMENT_TYPE_UNDEFINED
    XML_ENTITY_DECL
    XML_ENTITY_NODE
    XML_ENTITY_REF_NODE
    XML_ERR_ATTLIST_NOT_FINISHED
    XML_ERR_ATTLIST_NOT_STARTED
    XML_ERR_ATTRIBUTE_NOT_FINISHED
    XML_ERR_ATTRIBUTE_NOT_STARTED
    XML_ERR_ATTRIBUTE_REDEFINED
    XML_ERR_ATTRIBUTE_WITHOUT_VALUE
    XML_ERR_CDATA_NOT_FINISHED
    XML_ERR_CHARREF_AT_EOF
    XML_ERR_CHARREF_IN_DTD
    XML_ERR_CHARREF_IN_EPILOG
    XML_ERR_CHARREF_IN_PROLOG
    XML_ERR_COMMENT_NOT_FINISHED
    XML_ERR_CONDSEC_INVALID
    XML_ERR_CONDSEC_INVALID_KEYWORD
    XML_ERR_CONDSEC_NOT_FINISHED
    XML_ERR_CONDSEC_NOT_STARTED
    XML_ERR_DOCTYPE_NOT_FINISHED
    XML_ERR_DOCUMENT_EMPTY
    XML_ERR_DOCUMENT_END
    XML_ERR_DOCUMENT_START
    XML_ERR_ELEMCONTENT_NOT_FINISHED
    XML_ERR_ELEMCONTENT_NOT_STARTED
    XML_ERR_ENCODING_NAME
    XML_ERR_ENTITYREF_AT_EOF
    XML_ERR_ENTITYREF_IN_DTD
    XML_ERR_ENTITYREF_IN_EPILOG
    XML_ERR_ENTITYREF_IN_PROLOG
    XML_ERR_ENTITYREF_NO_NAME
    XML_ERR_ENTITYREF_SEMICOL_MISSING
    XML_ERR_ENTITY_BOUNDARY
    XML_ERR_ENTITY_CHAR_ERROR
    XML_ERR_ENTITY_IS_EXTERNAL
    XML_ERR_ENTITY_IS_PARAMETER
    XML_ERR_ENTITY_LOOP
    XML_ERR_ENTITY_NOT_FINISHED
    XML_ERR_ENTITY_NOT_STARTED
    XML_ERR_ENTITY_PE_INTERNAL
    XML_ERR_ENTITY_PROCESSING
    XML_ERR_EQUAL_REQUIRED
    XML_ERR_ERROR
    XML_ERR_EXTRA_CONTENT
    XML_ERR_EXT_ENTITY_STANDALONE
    XML_ERR_EXT_SUBSET_NOT_FINISHED
    XML_ERR_FATAL
    XML_ERR_GT_REQUIRED
    XML_ERR_HYPHEN_IN_COMMENT
    XML_ERR_INTERNAL_ERROR
    XML_ERR_INVALID_CHAR
    XML_ERR_INVALID_CHARREF
    XML_ERR_INVALID_DEC_CHARREF
    XML_ERR_INVALID_ENCODING
    XML_ERR_INVALID_HEX_CHARREF
    XML_ERR_INVALID_URI
    XML_ERR_LITERAL_NOT_FINISHED
    XML_ERR_LITERAL_NOT_STARTED
    XML_ERR_LTSLASH_REQUIRED
    XML_ERR_LT_IN_ATTRIBUTE
    XML_ERR_LT_REQUIRED
    XML_ERR_MISPLACED_CDATA_END
    XML_ERR_MISSING_ENCODING
    XML_ERR_MIXED_NOT_FINISHED
    XML_ERR_MIXED_NOT_STARTED
    XML_ERR_NAME_REQUIRED
    XML_ERR_NAME_TOO_LONG
    XML_ERR_NMTOKEN_REQUIRED
    XML_ERR_NONE
    XML_ERR_NOTATION_NOT_FINISHED
    XML_ERR_NOTATION_NOT_STARTED
    XML_ERR_NOTATION_PROCESSING
    XML_ERR_NOT_STANDALONE
    XML_ERR_NOT_WELL_BALANCED
    XML_ERR_NO_DTD
    XML_ERR_NO_MEMORY
    XML_ERR_NS_DECL_ERROR
    XML_ERR_OK
    XML_ERR_PCDATA_REQUIRED
    XML_ERR_PEREF_AT_EOF
    XML_ERR_PEREF_IN_EPILOG
    XML_ERR_PEREF_IN_INT_SUBSET
    XML_ERR_PEREF_IN_PROLOG
    XML_ERR_PEREF_NO_NAME
    XML_ERR_PEREF_SEMICOL_MISSING
    XML_ERR_PI_NOT_FINISHED
    XML_ERR_PI_NOT_STARTED
    XML_ERR_PUBID_REQUIRED
    XML_ERR_RESERVED_XML_NAME
    XML_ERR_SEPARATOR_REQUIRED
    XML_ERR_SPACE_REQUIRED
    XML_ERR_STANDALONE_VALUE
    XML_ERR_STRING_NOT_CLOSED
    XML_ERR_STRING_NOT_STARTED
    XML_ERR_TAG_NAME_MISMATCH
    XML_ERR_TAG_NOT_FINISHED
    XML_ERR_UNDECLARED_ENTITY
    XML_ERR_UNKNOWN_ENCODING
    XML_ERR_UNKNOWN_VERSION
    XML_ERR_UNPARSED_ENTITY
    XML_ERR_UNSUPPORTED_ENCODING
    XML_ERR_URI_FRAGMENT
    XML_ERR_URI_REQUIRED
    XML_ERR_USER_STOP
    XML_ERR_VALUE_REQUIRED
    XML_ERR_VERSION_MISMATCH
    XML_ERR_VERSION_MISSING
    XML_ERR_WARNING
    XML_ERR_XMLDECL_NOT_FINISHED
    XML_ERR_XMLDECL_NOT_STARTED
    XML_EXP_ATOM
    XML_EXP_COUNT
    XML_EXP_EMPTY
    XML_EXP_FORBID
    XML_EXP_OR
    XML_EXP_SEQ
    XML_EXTERNAL_GENERAL_PARSED_ENTITY
    XML_EXTERNAL_GENERAL_UNPARSED_ENTITY
    XML_EXTERNAL_PARAMETER_ENTITY
    XML_FROM_BUFFER
    XML_FROM_C14N
    XML_FROM_CATALOG
    XML_FROM_CHECK
    XML_FROM_DATATYPE
    XML_FROM_DTD
    XML_FROM_FTP
    XML_FROM_HTML
    XML_FROM_HTTP
    XML_FROM_I18N
    XML_FROM_IO
    XML_FROM_MEMORY
    XML_FROM_MODULE
    XML_FROM_NAMESPACE
    XML_FROM_NONE
    XML_FROM_OUTPUT
    XML_FROM_PARSER
    XML_FROM_REGEXP
    XML_FROM_RELAXNGP
    XML_FROM_RELAXNGV
    XML_FROM_SCHEMASP
    XML_FROM_SCHEMASV
    XML_FROM_SCHEMATRONV
    XML_FROM_TREE
    XML_FROM_URI
    XML_FROM_VALID
    XML_FROM_WRITER
    XML_FROM_XINCLUDE
    XML_FROM_XPATH
    XML_FROM_XPOINTER
    XML_FROM_XSLT
    XML_FTP_ACCNT
    XML_FTP_EPSV_ANSWER
    XML_FTP_PASV_ANSWER
    XML_FTP_URL_SYNTAX
    XML_GET_CONTENT
    XML_GET_LINE
    XML_HTML_DOCUMENT_NODE
    XML_HTML_STRUCURE_ERROR
    XML_HTML_UNKNOWN_TAG
    XML_HTTP_UNKNOWN_HOST
    XML_HTTP_URL_SYNTAX
    XML_HTTP_USE_IP
    XML_I18N_CONV_FAILED
    XML_I18N_EXCESS_HANDLER
    XML_I18N_NO_HANDLER
    XML_I18N_NO_NAME
    XML_I18N_NO_OUTPUT
    XML_INTERNAL_GENERAL_ENTITY
    XML_INTERNAL_PARAMETER_ENTITY
    XML_INTERNAL_PREDEFINED_ENTITY
    XML_IO_BUFFER_FULL
    XML_IO_EACCES
    XML_IO_EADDRINUSE
    XML_IO_EAFNOSUPPORT
    XML_IO_EAGAIN
    XML_IO_EALREADY
    XML_IO_EBADF
    XML_IO_EBADMSG
    XML_IO_EBUSY
    XML_IO_ECANCELED
    XML_IO_ECHILD
    XML_IO_ECONNREFUSED
    XML_IO_EDEADLK
    XML_IO_EDOM
    XML_IO_EEXIST
    XML_IO_EFAULT
    XML_IO_EFBIG
    XML_IO_EINPROGRESS
    XML_IO_EINTR
    XML_IO_EINVAL
    XML_IO_EIO
    XML_IO_EISCONN
    XML_IO_EISDIR
    XML_IO_EMFILE
    XML_IO_EMLINK
    XML_IO_EMSGSIZE
    XML_IO_ENAMETOOLONG
    XML_IO_ENCODER
    XML_IO_ENETUNREACH
    XML_IO_ENFILE
    XML_IO_ENODEV
    XML_IO_ENOENT
    XML_IO_ENOEXEC
    XML_IO_ENOLCK
    XML_IO_ENOMEM
    XML_IO_ENOSPC
    XML_IO_ENOSYS
    XML_IO_ENOTDIR
    XML_IO_ENOTEMPTY
    XML_IO_ENOTSOCK
    XML_IO_ENOTSUP
    XML_IO_ENOTTY
    XML_IO_ENXIO
    XML_IO_EPERM
    XML_IO_EPIPE
    XML_IO_ERANGE
    XML_IO_EROFS
    XML_IO_ESPIPE
    XML_IO_ESRCH
    XML_IO_ETIMEDOUT
    XML_IO_EXDEV
    XML_IO_FLUSH
    XML_IO_LOAD_ERROR
    XML_IO_NETWORK_ATTEMPT
    XML_IO_NO_INPUT
    XML_IO_UNKNOWN
    XML_IO_WRITE
    XML_LOCAL_NAMESPACE
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_LOOKUP_LIMIT
    XML_MAX_NAMELEN
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    XML_MODULE_CLOSE
    XML_MODULE_LAZY
    XML_MODULE_LOCAL
    XML_MODULE_OPEN
    XML_NAMESPACE_DECL
    XML_NOTATION_NODE
    XML_NS_ERR_ATTRIBUTE_REDEFINED
    XML_NS_ERR_COLON
    XML_NS_ERR_EMPTY
    XML_NS_ERR_QNAME
    XML_NS_ERR_UNDEFINED_NAMESPACE
    XML_NS_ERR_XML_NAMESPACE
    XML_PARSER_ATTRIBUTE_VALUE
    XML_PARSER_CDATA_SECTION
    XML_PARSER_COMMENT
    XML_PARSER_CONTENT
    XML_PARSER_DEFAULTATTRS
    XML_PARSER_DTD
    XML_PARSER_END_TAG
    XML_PARSER_ENTITY_DECL
    XML_PARSER_ENTITY_VALUE
    XML_PARSER_EOF
    XML_PARSER_EPILOG
    XML_PARSER_IGNORE
    XML_PARSER_LOADDTD
    XML_PARSER_MISC
    XML_PARSER_PI
    XML_PARSER_PROLOG
    XML_PARSER_PUBLIC_LITERAL
    XML_PARSER_SEVERITY_ERROR
    XML_PARSER_SEVERITY_VALIDITY_ERROR
    XML_PARSER_SEVERITY_VALIDITY_WARNING
    XML_PARSER_SEVERITY_WARNING
    XML_PARSER_START
    XML_PARSER_START_TAG
    XML_PARSER_SUBST_ENTITIES
    XML_PARSER_SYSTEM_LITERAL
    XML_PARSER_VALIDATE
    XML_PARSE_BIG_LINES
    XML_PARSE_COMPACT
    XML_PARSE_DOM
    XML_PARSE_DTDATTR
    XML_PARSE_DTDLOAD
    XML_PARSE_DTDVALID
    XML_PARSE_HUGE
    XML_PARSE_IGNORE_ENC
    XML_PARSE_NOBASEFIX
    XML_PARSE_NOBLANKS
    XML_PARSE_NOCDATA
    XML_PARSE_NODICT
    XML_PARSE_NOENT
    XML_PARSE_NOERROR
    XML_PARSE_NONET
    XML_PARSE_NOWARNING
    XML_PARSE_NOXINCNODE
    XML_PARSE_NSCLEAN
    XML_PARSE_OLD10
    XML_PARSE_OLDSAX
    XML_PARSE_PEDANTIC
    XML_PARSE_PUSH_DOM
    XML_PARSE_PUSH_SAX
    XML_PARSE_READER
    XML_PARSE_RECOVER
    XML_PARSE_SAX
    XML_PARSE_SAX1
    XML_PARSE_UNKNOWN
    XML_PARSE_XINCLUDE
    XML_PATTERN_DEFAULT
    XML_PATTERN_XPATH
    XML_PATTERN_XSFIELD
    XML_PATTERN_XSSEL
    XML_PI_NODE
    XML_READER_TYPE_ATTRIBUTE
    XML_READER_TYPE_CDATA
    XML_READER_TYPE_COMMENT
    XML_READER_TYPE_DOCUMENT
    XML_READER_TYPE_DOCUMENT_FRAGMENT
    XML_READER_TYPE_DOCUMENT_TYPE
    XML_READER_TYPE_ELEMENT
    XML_READER_TYPE_END_ELEMENT
    XML_READER_TYPE_END_ENTITY
    XML_READER_TYPE_ENTITY
    XML_READER_TYPE_ENTITY_REFERENCE
    XML_READER_TYPE_NONE
    XML_READER_TYPE_NOTATION
    XML_READER_TYPE_PROCESSING_INSTRUCTION
    XML_READER_TYPE_SIGNIFICANT_WHITESPACE
    XML_READER_TYPE_TEXT
    XML_READER_TYPE_WHITESPACE
    XML_READER_TYPE_XML_DECLARATION
    XML_REGEXP_COMPILE_ERROR
    XML_RELAXNGP_CRNG
    XML_RELAXNGP_FREE_DOC
    XML_RELAXNGP_NONE
    XML_RELAXNG_ERR_ATTREXTRANS
    XML_RELAXNG_ERR_ATTRNAME
    XML_RELAXNG_ERR_ATTRNONS
    XML_RELAXNG_ERR_ATTRVALID
    XML_RELAXNG_ERR_ATTRWRONGNS
    XML_RELAXNG_ERR_CONTENTVALID
    XML_RELAXNG_ERR_DATAELEM
    XML_RELAXNG_ERR_DATATYPE
    XML_RELAXNG_ERR_DUPID
    XML_RELAXNG_ERR_ELEMEXTRANS
    XML_RELAXNG_ERR_ELEMNAME
    XML_RELAXNG_ERR_ELEMNONS
    XML_RELAXNG_ERR_ELEMNOTEMPTY
    XML_RELAXNG_ERR_ELEMWRONG
    XML_RELAXNG_ERR_ELEMWRONGNS
    XML_RELAXNG_ERR_EXTRACONTENT
    XML_RELAXNG_ERR_EXTRADATA
    XML_RELAXNG_ERR_INTEREXTRA
    XML_RELAXNG_ERR_INTERNAL
    XML_RELAXNG_ERR_INTERNODATA
    XML_RELAXNG_ERR_INTERSEQ
    XML_RELAXNG_ERR_INVALIDATTR
    XML_RELAXNG_ERR_LACKDATA
    XML_RELAXNG_ERR_LIST
    XML_RELAXNG_ERR_LISTELEM
    XML_RELAXNG_ERR_LISTEMPTY
    XML_RELAXNG_ERR_LISTEXTRA
    XML_RELAXNG_ERR_MEMORY
    XML_RELAXNG_ERR_NODEFINE
    XML_RELAXNG_ERR_NOELEM
    XML_RELAXNG_ERR_NOGRAMMAR
    XML_RELAXNG_ERR_NOSTATE
    XML_RELAXNG_ERR_NOTELEM
    XML_RELAXNG_ERR_TEXTWRONG
    XML_RELAXNG_ERR_TYPE
    XML_RELAXNG_ERR_TYPECMP
    XML_RELAXNG_ERR_TYPEVAL
    XML_RELAXNG_ERR_VALELEM
    XML_RELAXNG_ERR_VALUE
    XML_RELAXNG_OK
    XML_RNGP_ANYNAME_ATTR_ANCESTOR
    XML_RNGP_ATTRIBUTE_CHILDREN
    XML_RNGP_ATTRIBUTE_CONTENT
    XML_RNGP_ATTRIBUTE_EMPTY
    XML_RNGP_ATTRIBUTE_NOOP
    XML_RNGP_ATTR_CONFLICT
    XML_RNGP_CHOICE_CONTENT
    XML_RNGP_CHOICE_EMPTY
    XML_RNGP_CREATE_FAILURE
    XML_RNGP_DATA_CONTENT
    XML_RNGP_DEFINE_CREATE_FAILED
    XML_RNGP_DEFINE_EMPTY
    XML_RNGP_DEFINE_MISSING
    XML_RNGP_DEFINE_NAME_MISSING
    XML_RNGP_DEF_CHOICE_AND_INTERLEAVE
    XML_RNGP_ELEMENT_CONTENT
    XML_RNGP_ELEMENT_EMPTY
    XML_RNGP_ELEMENT_NAME
    XML_RNGP_ELEMENT_NO_CONTENT
    XML_RNGP_ELEM_CONTENT_EMPTY
    XML_RNGP_ELEM_CONTENT_ERROR
    XML_RNGP_ELEM_TEXT_CONFLICT
    XML_RNGP_EMPTY
    XML_RNGP_EMPTY_CONSTRUCT
    XML_RNGP_EMPTY_CONTENT
    XML_RNGP_EMPTY_NOT_EMPTY
    XML_RNGP_ERROR_TYPE_LIB
    XML_RNGP_EXCEPT_EMPTY
    XML_RNGP_EXCEPT_MISSING
    XML_RNGP_EXCEPT_MULTIPLE
    XML_RNGP_EXCEPT_NO_CONTENT
    XML_RNGP_EXTERNALREF_EMTPY
    XML_RNGP_EXTERNALREF_RECURSE
    XML_RNGP_EXTERNAL_REF_FAILURE
    XML_RNGP_FORBIDDEN_ATTRIBUTE
    XML_RNGP_FOREIGN_ELEMENT
    XML_RNGP_GRAMMAR_CONTENT
    XML_RNGP_GRAMMAR_EMPTY
    XML_RNGP_GRAMMAR_MISSING
    XML_RNGP_GRAMMAR_NO_START
    XML_RNGP_GROUP_ATTR_CONFLICT
    XML_RNGP_HREF_ERROR
    XML_RNGP_INCLUDE_EMPTY
    XML_RNGP_INCLUDE_FAILURE
    XML_RNGP_INCLUDE_RECURSE
    XML_RNGP_INTERLEAVE_ADD
    XML_RNGP_INTERLEAVE_CREATE_FAILED
    XML_RNGP_INTERLEAVE_EMPTY
    XML_RNGP_INTERLEAVE_NO_CONTENT
    XML_RNGP_INVALID_DEFINE_NAME
    XML_RNGP_INVALID_URI
    XML_RNGP_INVALID_VALUE
    XML_RNGP_MISSING_HREF
    XML_RNGP_NAME_MISSING
    XML_RNGP_NEED_COMBINE
    XML_RNGP_NOTALLOWED_NOT_EMPTY
    XML_RNGP_NSNAME_ATTR_ANCESTOR
    XML_RNGP_NSNAME_NO_NS
    XML_RNGP_PARAM_FORBIDDEN
    XML_RNGP_PARAM_NAME_MISSING
    XML_RNGP_PARENTREF_CREATE_FAILED
    XML_RNGP_PARENTREF_NAME_INVALID
    XML_RNGP_PARENTREF_NOT_EMPTY
    XML_RNGP_PARENTREF_NO_NAME
    XML_RNGP_PARENTREF_NO_PARENT
    XML_RNGP_PARSE_ERROR
    XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME
    XML_RNGP_PAT_ATTR_ATTR
    XML_RNGP_PAT_ATTR_ELEM
    XML_RNGP_PAT_DATA_EXCEPT_ATTR
    XML_RNGP_PAT_DATA_EXCEPT_ELEM
    XML_RNGP_PAT_DATA_EXCEPT_EMPTY
    XML_RNGP_PAT_DATA_EXCEPT_GROUP
    XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE
    XML_RNGP_PAT_DATA_EXCEPT_LIST
    XML_RNGP_PAT_DATA_EXCEPT_ONEMORE
    XML_RNGP_PAT_DATA_EXCEPT_REF
    XML_RNGP_PAT_DATA_EXCEPT_TEXT
    XML_RNGP_PAT_LIST_ATTR
    XML_RNGP_PAT_LIST_ELEM
    XML_RNGP_PAT_LIST_INTERLEAVE
    XML_RNGP_PAT_LIST_LIST
    XML_RNGP_PAT_LIST_REF
    XML_RNGP_PAT_LIST_TEXT
    XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME
    XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME
    XML_RNGP_PAT_ONEMORE_GROUP_ATTR
    XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR
    XML_RNGP_PAT_START_ATTR
    XML_RNGP_PAT_START_DATA
    XML_RNGP_PAT_START_EMPTY
    XML_RNGP_PAT_START_GROUP
    XML_RNGP_PAT_START_INTERLEAVE
    XML_RNGP_PAT_START_LIST
    XML_RNGP_PAT_START_ONEMORE
    XML_RNGP_PAT_START_TEXT
    XML_RNGP_PAT_START_VALUE
    XML_RNGP_PREFIX_UNDEFINED
    XML_RNGP_REF_CREATE_FAILED
    XML_RNGP_REF_CYCLE
    XML_RNGP_REF_NAME_INVALID
    XML_RNGP_REF_NOT_EMPTY
    XML_RNGP_REF_NO_DEF
    XML_RNGP_REF_NO_NAME
    XML_RNGP_START_CHOICE_AND_INTERLEAVE
    XML_RNGP_START_CONTENT
    XML_RNGP_START_EMPTY
    XML_RNGP_START_MISSING
    XML_RNGP_TEXT_EXPECTED
    XML_RNGP_TEXT_HAS_CHILD
    XML_RNGP_TYPE_MISSING
    XML_RNGP_TYPE_NOT_FOUND
    XML_RNGP_TYPE_VALUE
    XML_RNGP_UNKNOWN_ATTRIBUTE
    XML_RNGP_UNKNOWN_COMBINE
    XML_RNGP_UNKNOWN_CONSTRUCT
    XML_RNGP_UNKNOWN_TYPE_LIB
    XML_RNGP_URI_FRAGMENT
    XML_RNGP_URI_NOT_ABSOLUTE
    XML_RNGP_VALUE_EMPTY
    XML_RNGP_VALUE_NO_CONTENT
    XML_RNGP_XMLNS_NAME
    XML_RNGP_XML_NS
    XML_SAVE_AS_HTML
    XML_SAVE_AS_XML
    XML_SAVE_CHAR_INVALID
    XML_SAVE_FORMAT
    XML_SAVE_NOT_UTF8
    XML_SAVE_NO_DECL
    XML_SAVE_NO_DOCTYPE
    XML_SAVE_NO_EMPTY
    XML_SAVE_NO_XHTML
    XML_SAVE_UNKNOWN_ENCODING
    XML_SAVE_WSNONSIG
    XML_SAVE_XHTML
    XML_SAX2_MAGIC
    XML_SCHEMAP_AG_PROPS_CORRECT
    XML_SCHEMAP_ATTRFORMDEFAULT_VALUE
    XML_SCHEMAP_ATTRGRP_NONAME_NOREF
    XML_SCHEMAP_ATTR_NONAME_NOREF
    XML_SCHEMAP_AU_PROPS_CORRECT
    XML_SCHEMAP_AU_PROPS_CORRECT_2
    XML_SCHEMAP_A_PROPS_CORRECT_2
    XML_SCHEMAP_A_PROPS_CORRECT_3
    XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF
    XML_SCHEMAP_COS_ALL_LIMITED
    XML_SCHEMAP_COS_CT_EXTENDS_1_1
    XML_SCHEMAP_COS_CT_EXTENDS_1_2
    XML_SCHEMAP_COS_CT_EXTENDS_1_3
    XML_SCHEMAP_COS_ST_DERIVED_OK_2_1
    XML_SCHEMAP_COS_ST_DERIVED_OK_2_2
    XML_SCHEMAP_COS_ST_RESTRICTS_1_1
    XML_SCHEMAP_COS_ST_RESTRICTS_1_2
    XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1
    XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2
    XML_SCHEMAP_COS_ST_RESTRICTS_2_1
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5
    XML_SCHEMAP_COS_ST_RESTRICTS_3_1
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5
    XML_SCHEMAP_COS_VALID_DEFAULT_1
    XML_SCHEMAP_COS_VALID_DEFAULT_2_1
    XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1
    XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2
    XML_SCHEMAP_CT_PROPS_CORRECT_1
    XML_SCHEMAP_CT_PROPS_CORRECT_2
    XML_SCHEMAP_CT_PROPS_CORRECT_3
    XML_SCHEMAP_CT_PROPS_CORRECT_4
    XML_SCHEMAP_CT_PROPS_CORRECT_5
    XML_SCHEMAP_CVC_SIMPLE_TYPE
    XML_SCHEMAP_C_PROPS_CORRECT
    XML_SCHEMAP_DEF_AND_PREFIX
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3
    XML_SCHEMAP_ELEMFORMDEFAULT_VALUE
    XML_SCHEMAP_ELEM_DEFAULT_FIXED
    XML_SCHEMAP_ELEM_NONAME_NOREF
    XML_SCHEMAP_EXTENSION_NO_BASE
    XML_SCHEMAP_E_PROPS_CORRECT_2
    XML_SCHEMAP_E_PROPS_CORRECT_3
    XML_SCHEMAP_E_PROPS_CORRECT_4
    XML_SCHEMAP_E_PROPS_CORRECT_5
    XML_SCHEMAP_E_PROPS_CORRECT_6
    XML_SCHEMAP_FACET_NO_VALUE
    XML_SCHEMAP_FAILED_BUILD_IMPORT
    XML_SCHEMAP_FAILED_LOAD
    XML_SCHEMAP_FAILED_PARSE
    XML_SCHEMAP_GROUP_NONAME_NOREF
    XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI
    XML_SCHEMAP_IMPORT_REDEFINE_NSNAME
    XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI
    XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI
    XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI
    XML_SCHEMAP_INTERNAL
    XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE
    XML_SCHEMAP_INVALID_ATTR_COMBINATION
    XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION
    XML_SCHEMAP_INVALID_ATTR_NAME
    XML_SCHEMAP_INVALID_ATTR_USE
    XML_SCHEMAP_INVALID_BOOLEAN
    XML_SCHEMAP_INVALID_ENUM
    XML_SCHEMAP_INVALID_FACET
    XML_SCHEMAP_INVALID_FACET_VALUE
    XML_SCHEMAP_INVALID_MAXOCCURS
    XML_SCHEMAP_INVALID_MINOCCURS
    XML_SCHEMAP_INVALID_REF_AND_SUBTYPE
    XML_SCHEMAP_INVALID_WHITE_SPACE
    XML_SCHEMAP_MG_PROPS_CORRECT_1
    XML_SCHEMAP_MG_PROPS_CORRECT_2
    XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD
    XML_SCHEMAP_NOATTR_NOREF
    XML_SCHEMAP_NOROOT
    XML_SCHEMAP_NOTATION_NO_NAME
    XML_SCHEMAP_NOTHING_TO_PARSE
    XML_SCHEMAP_NOTYPE_NOREF
    XML_SCHEMAP_NOT_DETERMINISTIC
    XML_SCHEMAP_NOT_SCHEMA
    XML_SCHEMAP_NO_XMLNS
    XML_SCHEMAP_NO_XSI
    XML_SCHEMAP_PREFIX_UNDEFINED
    XML_SCHEMAP_P_PROPS_CORRECT_1
    XML_SCHEMAP_P_PROPS_CORRECT_2_1
    XML_SCHEMAP_P_PROPS_CORRECT_2_2
    XML_SCHEMAP_RECURSIVE
    XML_SCHEMAP_REDEFINED_ATTR
    XML_SCHEMAP_REDEFINED_ATTRGROUP
    XML_SCHEMAP_REDEFINED_ELEMENT
    XML_SCHEMAP_REDEFINED_GROUP
    XML_SCHEMAP_REDEFINED_NOTATION
    XML_SCHEMAP_REDEFINED_TYPE
    XML_SCHEMAP_REF_AND_CONTENT
    XML_SCHEMAP_REF_AND_SUBTYPE
    XML_SCHEMAP_REGEXP_INVALID
    XML_SCHEMAP_RESTRICTION_NONAME_NOREF
    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE
    XML_SCHEMAP_S4S_ATTR_MISSING
    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED
    XML_SCHEMAP_S4S_ELEM_MISSING
    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED
    XML_SCHEMAP_SIMPLETYPE_NONAME
    XML_SCHEMAP_SRC_ATTRIBUTE_1
    XML_SCHEMAP_SRC_ATTRIBUTE_2
    XML_SCHEMAP_SRC_ATTRIBUTE_3_1
    XML_SCHEMAP_SRC_ATTRIBUTE_3_2
    XML_SCHEMAP_SRC_ATTRIBUTE_4
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3
    XML_SCHEMAP_SRC_CT_1
    XML_SCHEMAP_SRC_ELEMENT_1
    XML_SCHEMAP_SRC_ELEMENT_2_1
    XML_SCHEMAP_SRC_ELEMENT_2_2
    XML_SCHEMAP_SRC_ELEMENT_3
    XML_SCHEMAP_SRC_IMPORT
    XML_SCHEMAP_SRC_IMPORT_1_1
    XML_SCHEMAP_SRC_IMPORT_1_2
    XML_SCHEMAP_SRC_IMPORT_2
    XML_SCHEMAP_SRC_IMPORT_2_1
    XML_SCHEMAP_SRC_IMPORT_2_2
    XML_SCHEMAP_SRC_IMPORT_3_1
    XML_SCHEMAP_SRC_IMPORT_3_2
    XML_SCHEMAP_SRC_INCLUDE
    XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE
    XML_SCHEMAP_SRC_REDEFINE
    XML_SCHEMAP_SRC_RESOLVE
    XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE
    XML_SCHEMAP_SRC_SIMPLE_TYPE_1
    XML_SCHEMAP_SRC_SIMPLE_TYPE_2
    XML_SCHEMAP_SRC_SIMPLE_TYPE_3
    XML_SCHEMAP_SRC_SIMPLE_TYPE_4
    XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES
    XML_SCHEMAP_ST_PROPS_CORRECT_1
    XML_SCHEMAP_ST_PROPS_CORRECT_2
    XML_SCHEMAP_ST_PROPS_CORRECT_3
    XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE
    XML_SCHEMAP_TYPE_AND_SUBTYPE
    XML_SCHEMAP_UNION_NOT_EXPRESSIBLE
    XML_SCHEMAP_UNKNOWN_ALL_CHILD
    XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD
    XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD
    XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP
    XML_SCHEMAP_UNKNOWN_ATTR_CHILD
    XML_SCHEMAP_UNKNOWN_BASE_TYPE
    XML_SCHEMAP_UNKNOWN_CHOICE_CHILD
    XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD
    XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD
    XML_SCHEMAP_UNKNOWN_ELEM_CHILD
    XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD
    XML_SCHEMAP_UNKNOWN_FACET_CHILD
    XML_SCHEMAP_UNKNOWN_FACET_TYPE
    XML_SCHEMAP_UNKNOWN_GROUP_CHILD
    XML_SCHEMAP_UNKNOWN_IMPORT_CHILD
    XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD
    XML_SCHEMAP_UNKNOWN_LIST_CHILD
    XML_SCHEMAP_UNKNOWN_MEMBER_TYPE
    XML_SCHEMAP_UNKNOWN_NOTATION_CHILD
    XML_SCHEMAP_UNKNOWN_PREFIX
    XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD
    XML_SCHEMAP_UNKNOWN_REF
    XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD
    XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD
    XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD
    XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD
    XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD
    XML_SCHEMAP_UNKNOWN_TYPE
    XML_SCHEMAP_UNKNOWN_UNION_CHILD
    XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH
    XML_SCHEMAP_WARN_ATTR_REDECL_PROH
    XML_SCHEMAP_WARN_SKIP_SCHEMA
    XML_SCHEMAP_WARN_UNLOCATED_SCHEMA
    XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER
    XML_SCHEMAS_ANYATTR_LAX
    XML_SCHEMAS_ANYATTR_SKIP
    XML_SCHEMAS_ANYATTR_STRICT
    XML_SCHEMAS_ANYSIMPLETYPE
    XML_SCHEMAS_ANYTYPE
    XML_SCHEMAS_ANYURI
    XML_SCHEMAS_ANY_LAX
    XML_SCHEMAS_ANY_SKIP
    XML_SCHEMAS_ANY_STRICT
    XML_SCHEMAS_ATTRGROUP_GLOBAL
    XML_SCHEMAS_ATTRGROUP_HAS_REFS
    XML_SCHEMAS_ATTRGROUP_MARKED
    XML_SCHEMAS_ATTRGROUP_REDEFINED
    XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED
    XML_SCHEMAS_ATTR_FIXED
    XML_SCHEMAS_ATTR_GLOBAL
    XML_SCHEMAS_ATTR_INTERNAL_RESOLVED
    XML_SCHEMAS_ATTR_NSDEFAULT
    XML_SCHEMAS_ATTR_USE_OPTIONAL
    XML_SCHEMAS_ATTR_USE_PROHIBITED
    XML_SCHEMAS_ATTR_USE_REQUIRED
    XML_SCHEMAS_BASE64BINARY
    XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION
    XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION
    XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION
    XML_SCHEMAS_BOOLEAN
    XML_SCHEMAS_BYTE
    XML_SCHEMAS_DATE
    XML_SCHEMAS_DATETIME
    XML_SCHEMAS_DECIMAL
    XML_SCHEMAS_DOUBLE
    XML_SCHEMAS_DURATION
    XML_SCHEMAS_ELEM_ABSTRACT
    XML_SCHEMAS_ELEM_BLOCK_ABSENT
    XML_SCHEMAS_ELEM_BLOCK_EXTENSION
    XML_SCHEMAS_ELEM_BLOCK_RESTRICTION
    XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION
    XML_SCHEMAS_ELEM_CIRCULAR
    XML_SCHEMAS_ELEM_DEFAULT
    XML_SCHEMAS_ELEM_FINAL_ABSENT
    XML_SCHEMAS_ELEM_FINAL_EXTENSION
    XML_SCHEMAS_ELEM_FINAL_RESTRICTION
    XML_SCHEMAS_ELEM_FIXED
    XML_SCHEMAS_ELEM_GLOBAL
    XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    XML_SCHEMAS_ELEM_INTERNAL_RESOLVED
    XML_SCHEMAS_ELEM_NILLABLE
    XML_SCHEMAS_ELEM_NSDEFAULT
    XML_SCHEMAS_ELEM_REF
    XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD
    XML_SCHEMAS_ELEM_TOPLEVEL
    XML_SCHEMAS_ENTITIES
    XML_SCHEMAS_ENTITY
    XML_SCHEMAS_ERR_
    XML_SCHEMAS_ERR_ATTRINVALID
    XML_SCHEMAS_ERR_ATTRUNKNOWN
    XML_SCHEMAS_ERR_CONSTRUCT
    XML_SCHEMAS_ERR_ELEMCONT
    XML_SCHEMAS_ERR_EXTRACONTENT
    XML_SCHEMAS_ERR_FACET
    XML_SCHEMAS_ERR_HAVEDEFAULT
    XML_SCHEMAS_ERR_INTERNAL
    XML_SCHEMAS_ERR_INVALIDATTR
    XML_SCHEMAS_ERR_INVALIDELEM
    XML_SCHEMAS_ERR_ISABSTRACT
    XML_SCHEMAS_ERR_MISSING
    XML_SCHEMAS_ERR_NOROLLBACK
    XML_SCHEMAS_ERR_NOROOT
    XML_SCHEMAS_ERR_NOTDETERMINIST
    XML_SCHEMAS_ERR_NOTEMPTY
    XML_SCHEMAS_ERR_NOTNILLABLE
    XML_SCHEMAS_ERR_NOTSIMPLE
    XML_SCHEMAS_ERR_NOTTOPLEVEL
    XML_SCHEMAS_ERR_NOTYPE
    XML_SCHEMAS_ERR_OK
    XML_SCHEMAS_ERR_UNDECLAREDELEM
    XML_SCHEMAS_ERR_VALUE
    XML_SCHEMAS_ERR_WRONGELEM
    XML_SCHEMAS_ERR_XXX
    XML_SCHEMAS_FACET_COLLAPSE
    XML_SCHEMAS_FACET_PRESERVE
    XML_SCHEMAS_FACET_REPLACE
    XML_SCHEMAS_FACET_UNKNOWN
    XML_SCHEMAS_FINAL_DEFAULT_EXTENSION
    XML_SCHEMAS_FINAL_DEFAULT_LIST
    XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION
    XML_SCHEMAS_FINAL_DEFAULT_UNION
    XML_SCHEMAS_FLOAT
    XML_SCHEMAS_GDAY
    XML_SCHEMAS_GMONTH
    XML_SCHEMAS_GMONTHDAY
    XML_SCHEMAS_GYEAR
    XML_SCHEMAS_GYEARMONTH
    XML_SCHEMAS_HEXBINARY
    XML_SCHEMAS_ID
    XML_SCHEMAS_IDREF
    XML_SCHEMAS_IDREFS
    XML_SCHEMAS_INCLUDING_CONVERT_NS
    XML_SCHEMAS_INT
    XML_SCHEMAS_INTEGER
    XML_SCHEMAS_LANGUAGE
    XML_SCHEMAS_LONG
    XML_SCHEMAS_NAME
    XML_SCHEMAS_NCNAME
    XML_SCHEMAS_NINTEGER
    XML_SCHEMAS_NMTOKEN
    XML_SCHEMAS_NMTOKENS
    XML_SCHEMAS_NNINTEGER
    XML_SCHEMAS_NORMSTRING
    XML_SCHEMAS_NOTATION
    XML_SCHEMAS_NPINTEGER
    XML_SCHEMAS_PINTEGER
    XML_SCHEMAS_QNAME
    XML_SCHEMAS_QUALIF_ATTR
    XML_SCHEMAS_QUALIF_ELEM
    XML_SCHEMAS_SHORT
    XML_SCHEMAS_STRING
    XML_SCHEMAS_TIME
    XML_SCHEMAS_TOKEN
    XML_SCHEMAS_TYPE_ABSTRACT
    XML_SCHEMAS_TYPE_BLOCK_DEFAULT
    XML_SCHEMAS_TYPE_BLOCK_EXTENSION
    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION
    XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
    XML_SCHEMAS_TYPE_FACETSNEEDVALUE
    XML_SCHEMAS_TYPE_FINAL_DEFAULT
    XML_SCHEMAS_TYPE_FINAL_EXTENSION
    XML_SCHEMAS_TYPE_FINAL_LIST
    XML_SCHEMAS_TYPE_FINAL_RESTRICTION
    XML_SCHEMAS_TYPE_FINAL_UNION
    XML_SCHEMAS_TYPE_FIXUP_1
    XML_SCHEMAS_TYPE_GLOBAL
    XML_SCHEMAS_TYPE_HAS_FACETS
    XML_SCHEMAS_TYPE_INTERNAL_INVALID
    XML_SCHEMAS_TYPE_INTERNAL_RESOLVED
    XML_SCHEMAS_TYPE_MARKED
    XML_SCHEMAS_TYPE_MIXED
    XML_SCHEMAS_TYPE_NORMVALUENEEDED
    XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD
    XML_SCHEMAS_TYPE_REDEFINED
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    XML_SCHEMAS_TYPE_VARIETY_ATOMIC
    XML_SCHEMAS_TYPE_VARIETY_LIST
    XML_SCHEMAS_TYPE_VARIETY_UNION
    XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE
    XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE
    XML_SCHEMAS_TYPE_WHITESPACE_REPLACE
    XML_SCHEMAS_UBYTE
    XML_SCHEMAS_UINT
    XML_SCHEMAS_ULONG
    XML_SCHEMAS_UNKNOWN
    XML_SCHEMAS_USHORT
    XML_SCHEMAS_WILDCARD_COMPLETE
    XML_SCHEMATRONV_ASSERT
    XML_SCHEMATRONV_REPORT
    XML_SCHEMATRON_OUT_BUFFER
    XML_SCHEMATRON_OUT_ERROR
    XML_SCHEMATRON_OUT_FILE
    XML_SCHEMATRON_OUT_IO
    XML_SCHEMATRON_OUT_QUIET
    XML_SCHEMATRON_OUT_TEXT
    XML_SCHEMATRON_OUT_XML
    XML_SCHEMAV_ATTRINVALID
    XML_SCHEMAV_ATTRUNKNOWN
    XML_SCHEMAV_CONSTRUCT
    XML_SCHEMAV_CVC_ATTRIBUTE_1
    XML_SCHEMAV_CVC_ATTRIBUTE_2
    XML_SCHEMAV_CVC_ATTRIBUTE_3
    XML_SCHEMAV_CVC_ATTRIBUTE_4
    XML_SCHEMAV_CVC_AU
    XML_SCHEMAV_CVC_COMPLEX_TYPE_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2
    XML_SCHEMAV_CVC_COMPLEX_TYPE_4
    XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3
    XML_SCHEMAV_CVC_ELT_1
    XML_SCHEMAV_CVC_ELT_2
    XML_SCHEMAV_CVC_ELT_3_1
    XML_SCHEMAV_CVC_ELT_3_2_1
    XML_SCHEMAV_CVC_ELT_3_2_2
    XML_SCHEMAV_CVC_ELT_4_1
    XML_SCHEMAV_CVC_ELT_4_2
    XML_SCHEMAV_CVC_ELT_4_3
    XML_SCHEMAV_CVC_ELT_5_1_1
    XML_SCHEMAV_CVC_ELT_5_1_2
    XML_SCHEMAV_CVC_ELT_5_2_1
    XML_SCHEMAV_CVC_ELT_5_2_2_1
    XML_SCHEMAV_CVC_ELT_5_2_2_2_1
    XML_SCHEMAV_CVC_ELT_5_2_2_2_2
    XML_SCHEMAV_CVC_ELT_6
    XML_SCHEMAV_CVC_ELT_7
    XML_SCHEMAV_CVC_ENUMERATION_VALID
    XML_SCHEMAV_CVC_FACET_VALID
    XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID
    XML_SCHEMAV_CVC_IDC
    XML_SCHEMAV_CVC_LENGTH_VALID
    XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID
    XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID
    XML_SCHEMAV_CVC_MAXLENGTH_VALID
    XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID
    XML_SCHEMAV_CVC_MININCLUSIVE_VALID
    XML_SCHEMAV_CVC_MINLENGTH_VALID
    XML_SCHEMAV_CVC_PATTERN_VALID
    XML_SCHEMAV_CVC_TOTALDIGITS_VALID
    XML_SCHEMAV_CVC_TYPE_1
    XML_SCHEMAV_CVC_TYPE_2
    XML_SCHEMAV_CVC_TYPE_3_1_1
    XML_SCHEMAV_CVC_TYPE_3_1_2
    XML_SCHEMAV_CVC_WILDCARD
    XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING
    XML_SCHEMAV_ELEMCONT
    XML_SCHEMAV_ELEMENT_CONTENT
    XML_SCHEMAV_EXTRACONTENT
    XML_SCHEMAV_FACET
    XML_SCHEMAV_HAVEDEFAULT
    XML_SCHEMAV_INTERNAL
    XML_SCHEMAV_INVALIDATTR
    XML_SCHEMAV_INVALIDELEM
    XML_SCHEMAV_ISABSTRACT
    XML_SCHEMAV_MISC
    XML_SCHEMAV_MISSING
    XML_SCHEMAV_NOROLLBACK
    XML_SCHEMAV_NOROOT
    XML_SCHEMAV_NOTDETERMINIST
    XML_SCHEMAV_NOTEMPTY
    XML_SCHEMAV_NOTNILLABLE
    XML_SCHEMAV_NOTSIMPLE
    XML_SCHEMAV_NOTTOPLEVEL
    XML_SCHEMAV_NOTYPE
    XML_SCHEMAV_UNDECLAREDELEM
    XML_SCHEMAV_VALUE
    XML_SCHEMAV_WRONGELEM
    XML_SCHEMA_CONTENT_ANY
    XML_SCHEMA_CONTENT_BASIC
    XML_SCHEMA_CONTENT_ELEMENTS
    XML_SCHEMA_CONTENT_EMPTY
    XML_SCHEMA_CONTENT_MIXED
    XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS
    XML_SCHEMA_CONTENT_SIMPLE
    XML_SCHEMA_CONTENT_UNKNOWN
    XML_SCHEMA_EXTRA_ATTR_USE_PROHIB
    XML_SCHEMA_EXTRA_QNAMEREF
    XML_SCHEMA_FACET_ENUMERATION
    XML_SCHEMA_FACET_FRACTIONDIGITS
    XML_SCHEMA_FACET_LENGTH
    XML_SCHEMA_FACET_MAXEXCLUSIVE
    XML_SCHEMA_FACET_MAXINCLUSIVE
    XML_SCHEMA_FACET_MAXLENGTH
    XML_SCHEMA_FACET_MINEXCLUSIVE
    XML_SCHEMA_FACET_MININCLUSIVE
    XML_SCHEMA_FACET_MINLENGTH
    XML_SCHEMA_FACET_PATTERN
    XML_SCHEMA_FACET_TOTALDIGITS
    XML_SCHEMA_FACET_WHITESPACE
    XML_SCHEMA_TYPE_ALL
    XML_SCHEMA_TYPE_ANY
    XML_SCHEMA_TYPE_ANY_ATTRIBUTE
    XML_SCHEMA_TYPE_ATTRIBUTE
    XML_SCHEMA_TYPE_ATTRIBUTEGROUP
    XML_SCHEMA_TYPE_ATTRIBUTE_USE
    XML_SCHEMA_TYPE_BASIC
    XML_SCHEMA_TYPE_CHOICE
    XML_SCHEMA_TYPE_COMPLEX
    XML_SCHEMA_TYPE_COMPLEX_CONTENT
    XML_SCHEMA_TYPE_ELEMENT
    XML_SCHEMA_TYPE_EXTENSION
    XML_SCHEMA_TYPE_FACET
    XML_SCHEMA_TYPE_GROUP
    XML_SCHEMA_TYPE_IDC_KEY
    XML_SCHEMA_TYPE_IDC_KEYREF
    XML_SCHEMA_TYPE_IDC_UNIQUE
    XML_SCHEMA_TYPE_LIST
    XML_SCHEMA_TYPE_NOTATION
    XML_SCHEMA_TYPE_PARTICLE
    XML_SCHEMA_TYPE_RESTRICTION
    XML_SCHEMA_TYPE_SEQUENCE
    XML_SCHEMA_TYPE_SIMPLE
    XML_SCHEMA_TYPE_SIMPLE_CONTENT
    XML_SCHEMA_TYPE_UNION
    XML_SCHEMA_TYPE_UR
    XML_SCHEMA_VAL_VC_I_CREATE
    XML_SCHEMA_WHITESPACE_COLLAPSE
    XML_SCHEMA_WHITESPACE_PRESERVE
    XML_SCHEMA_WHITESPACE_REPLACE
    XML_SCHEMA_WHITESPACE_UNKNOWN
    XML_SKIP_IDS
    XML_SUBSTITUTE_BOTH
    XML_SUBSTITUTE_NONE
    XML_SUBSTITUTE_PEREF
    XML_SUBSTITUTE_REF
    XML_TEXTREADER_MODE_CLOSED
    XML_TEXTREADER_MODE_EOF
    XML_TEXTREADER_MODE_ERROR
    XML_TEXTREADER_MODE_INITIAL
    XML_TEXTREADER_MODE_INTERACTIVE
    XML_TEXTREADER_MODE_READING
    XML_TEXT_NODE
    XML_TREE_INVALID_DEC
    XML_TREE_INVALID_HEX
    XML_TREE_NOT_UTF8
    XML_TREE_UNTERMINATED_ENTITY
    XML_WAR_CATALOG_PI
    XML_WAR_ENTITY_REDEFINED
    XML_WAR_LANG_VALUE
    XML_WAR_NS_COLUMN
    XML_WAR_NS_URI
    XML_WAR_NS_URI_RELATIVE
    XML_WAR_SPACE_VALUE
    XML_WAR_UNDECLARED_ENTITY
    XML_WAR_UNKNOWN_VERSION
    XML_WITH_AUTOMATA
    XML_WITH_C14N
    XML_WITH_CATALOG
    XML_WITH_DEBUG
    XML_WITH_DEBUG_MEM
    XML_WITH_DEBUG_RUN
    XML_WITH_EXPR
    XML_WITH_FTP
    XML_WITH_HTML
    XML_WITH_HTTP
    XML_WITH_ICONV
    XML_WITH_ICU
    XML_WITH_ISO8859X
    XML_WITH_LEGACY
    XML_WITH_LZMA
    XML_WITH_MODULES
    XML_WITH_NONE
    XML_WITH_OUTPUT
    XML_WITH_PATTERN
    XML_WITH_PUSH
    XML_WITH_READER
    XML_WITH_REGEXP
    XML_WITH_SAX1
    XML_WITH_SCHEMAS
    XML_WITH_SCHEMATRON
    XML_WITH_THREAD
    XML_WITH_TREE
    XML_WITH_UNICODE
    XML_WITH_VALID
    XML_WITH_WRITER
    XML_WITH_XINCLUDE
    XML_WITH_XPATH
    XML_WITH_XPTR
    XML_WITH_ZLIB
    XML_XINCLUDE_BUILD_FAILED
    XML_XINCLUDE_DEPRECATED_NS
    XML_XINCLUDE_END
    XML_XINCLUDE_ENTITY_DEF_MISMATCH
    XML_XINCLUDE_FALLBACKS_IN_INCLUDE
    XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE
    XML_XINCLUDE_FRAGMENT_ID
    XML_XINCLUDE_HREF_URI
    XML_XINCLUDE_INCLUDE_IN_INCLUDE
    XML_XINCLUDE_INVALID_CHAR
    XML_XINCLUDE_MULTIPLE_ROOT
    XML_XINCLUDE_NO_FALLBACK
    XML_XINCLUDE_NO_HREF
    XML_XINCLUDE_PARSE_VALUE
    XML_XINCLUDE_RECURSION
    XML_XINCLUDE_START
    XML_XINCLUDE_TEXT_DOCUMENT
    XML_XINCLUDE_TEXT_FRAGMENT
    XML_XINCLUDE_UNKNOWN_ENCODING
    XML_XINCLUDE_XPTR_FAILED
    XML_XINCLUDE_XPTR_RESULT
    XML_XML_ID
    XML_XML_NAMESPACE
    XML_XPATH_CHECKNS
    XML_XPATH_ENCODING_ERROR
    XML_XPATH_EXPRESSION_OK
    XML_XPATH_EXPR_ERROR
    XML_XPATH_INVALID_ARITY
    XML_XPATH_INVALID_CHAR_ERROR
    XML_XPATH_INVALID_CTXT_POSITION
    XML_XPATH_INVALID_CTXT_SIZE
    XML_XPATH_INVALID_OPERAND
    XML_XPATH_INVALID_PREDICATE_ERROR
    XML_XPATH_INVALID_TYPE
    XML_XPATH_MEMORY_ERROR
    XML_XPATH_NOVAR
    XML_XPATH_NUMBER_ERROR
    XML_XPATH_START_LITERAL_ERROR
    XML_XPATH_UNCLOSED_ERROR
    XML_XPATH_UNDEF_PREFIX_ERROR
    XML_XPATH_UNDEF_VARIABLE_ERROR
    XML_XPATH_UNFINISHED_LITERAL_ERROR
    XML_XPATH_UNKNOWN_FUNC_ERROR
    XML_XPATH_VARIABLE_REF_ERROR
    XML_XPTR_CHILDSEQ_START
    XML_XPTR_EVAL_FAILED
    XML_XPTR_EXTRA_OBJECTS
    XML_XPTR_RESOURCE_ERROR
    XML_XPTR_SUB_RESOURCE_ERROR
    XML_XPTR_SYNTAX_ERROR
    XML_XPTR_UNKNOWN_SCHEME
    XPATH_BOOLEAN
    XPATH_ENCODING_ERROR
    XPATH_EXPRESSION_OK
    XPATH_EXPR_ERROR
    XPATH_FORBID_VARIABLE_ERROR
    XPATH_INVALID_ARITY
    XPATH_INVALID_CHAR_ERROR
    XPATH_INVALID_CTXT
    XPATH_INVALID_CTXT_POSITION
    XPATH_INVALID_CTXT_SIZE
    XPATH_INVALID_OPERAND
    XPATH_INVALID_PREDICATE_ERROR
    XPATH_INVALID_TYPE
    XPATH_LOCATIONSET
    XPATH_MEMORY_ERROR
    XPATH_NODESET
    XPATH_NUMBER
    XPATH_NUMBER_ERROR
    XPATH_POINT
    XPATH_RANGE
    XPATH_STACK_ERROR
    XPATH_START_LITERAL_ERROR
    XPATH_STRING
    XPATH_UNCLOSED_ERROR
    XPATH_UNDEFINED
    XPATH_UNDEF_PREFIX_ERROR
    XPATH_UNDEF_VARIABLE_ERROR
    XPATH_UNFINISHED_LITERAL_ERROR
    XPATH_UNKNOWN_FUNC_ERROR
    XPATH_USERS
    XPATH_VARIABLE_REF_ERROR
    XPATH_XSLT_TREE
    XPTR_RESOURCE_ERROR
    XPTR_SUB_RESOURCE_ERROR
    XPTR_SYNTAX_ERROR
    XP_ERROR
    XP_ERROR0

    Letter _:

    _REENTRANT
    _htmlElemDesc
    _htmlEntityDesc
    _uconv_t
    _xlinkHandler
    _xmlAttr
    _xmlAttribute
    _xmlBuffer
    _xmlChLRange
    _xmlChRangeGroup
    _xmlChSRange
    _xmlCharEncodingHandler
    _xmlDOMWrapCtxt
    _xmlDoc
    _xmlDtd
    _xmlElement
    _xmlElementContent
    _xmlEntity
    _xmlEnumeration
    _xmlError
    _xmlGlobalState
    _xmlID
    _xmlLocationSet
    _xmlNode
    _xmlNodeSet
    _xmlNotation
    _xmlNs
    _xmlOutputBuffer
    _xmlParserCtxt
    _xmlParserInput
    _xmlParserInputBuffer
    _xmlParserNodeInfo
    _xmlParserNodeInfoSeq
    _xmlRef
    _xmlSAXHandler
    _xmlSAXHandlerV1
    _xmlSAXLocator
    _xmlSchema
    _xmlSchemaAnnot
    _xmlSchemaAttribute
    _xmlSchemaAttributeGroup
    _xmlSchemaAttributeLink
    _xmlSchemaElement
    _xmlSchemaFacet
    _xmlSchemaFacetLink
    _xmlSchemaNotation
    _xmlSchemaType
    _xmlSchemaTypeLink
    _xmlSchemaWildcard
    _xmlSchemaWildcardNs
    _xmlShellCtxt
    _xmlURI
    _xmlValidCtxt
    _xmlXPathAxis
    _xmlXPathContext
    _xmlXPathFunct
    _xmlXPathObject
    _xmlXPathParserContext
    _xmlXPathType
    _xmlXPathVariable

    Letter a:

    attribute
    attributeDecl
    attributeDeclSAXFunc
    attributeSAXFunc

    Letter c:

    cdataBlock
    cdataBlockSAXFunc
    characters
    charactersSAXFunc
    checkNamespace
    comment
    commentSAXFunc

    Letter d:

    docbCreateFileParserCtxt
    docbCreatePushParserCtxt
    docbDefaultSAXHandler
    docbDefaultSAXHandlerInit
    docbDocPtr
    docbEncodeEntities
    docbFreeParserCtxt
    docbParseChunk
    docbParseDoc
    docbParseDocument
    docbParseFile
    docbParserCtxt
    docbParserCtxtPtr
    docbParserInput
    docbParserInputPtr
    docbSAXHandler
    docbSAXHandlerPtr
    docbSAXParseDoc
    docbSAXParseFile

    Letter e:

    elementDecl
    elementDeclSAXFunc
    emptyExp
    endDocument
    endDocumentSAXFunc
    endElement
    endElementNsSAX2Func
    endElementSAXFunc
    entityDecl
    entityDeclSAXFunc
    errorSAXFunc
    externalSubset
    externalSubsetSAXFunc

    Letter f:

    fatalErrorSAXFunc
    forbiddenExp
    ftpDataCallback
    ftpListCallback

    Letter g:

    getColumnNumber
    getEntity
    getEntitySAXFunc
    getLineNumber
    getNamespace
    getParameterEntity
    getParameterEntitySAXFunc
    getPublicId
    getSystemId
    globalNamespace

    Letter h:

    hasExternalSubset
    hasExternalSubsetSAXFunc
    hasInternalSubset
    hasInternalSubsetSAXFunc
    htmlAttrAllowed
    htmlAutoCloseTag
    htmlCreateFileParserCtxt
    htmlCreateMemoryParserCtxt
    htmlCreatePushParserCtxt
    htmlCtxtReadDoc
    htmlCtxtReadFd
    htmlCtxtReadFile
    htmlCtxtReadIO
    htmlCtxtReadMemory
    htmlCtxtReset
    htmlCtxtUseOptions
    htmlDefaultSAXHandler
    htmlDefaultSAXHandlerInit
    htmlDefaultSubelement
    htmlDocContentDumpFormatOutput
    htmlDocContentDumpOutput
    htmlDocDump
    htmlDocDumpMemory
    htmlDocDumpMemoryFormat
    htmlDocPtr
    htmlElemDesc
    htmlElemDescPtr
    htmlElementAllowedHere
    htmlElementAllowedHereDesc
    htmlElementStatusHere
    htmlEncodeEntities
    htmlEntityDesc
    htmlEntityDescPtr
    htmlEntityLookup
    htmlEntityValueLookup
    htmlFreeParserCtxt
    htmlGetMetaEncoding
    htmlHandleOmittedElem
    htmlInitAutoClose
    htmlIsAutoClosed
    htmlIsBooleanAttr
    htmlIsScriptAttribute
    htmlNewDoc
    htmlNewDocNoDtD
    htmlNewParserCtxt
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    htmlNodePtr
    htmlNodeStatus
    htmlParseCharRef
    htmlParseChunk
    htmlParseDoc
    htmlParseDocument
    htmlParseElement
    htmlParseEntityRef
    htmlParseFile
    htmlParserCtxt
    htmlParserCtxtPtr
    htmlParserInput
    htmlParserInputPtr
    htmlParserNodeInfo
    htmlParserOption
    htmlReadDoc
    htmlReadFd
    htmlReadFile
    htmlReadIO
    htmlReadMemory
    htmlRequiredAttrs
    htmlSAXHandler
    htmlSAXHandlerPtr
    htmlSAXParseDoc
    htmlSAXParseFile
    htmlSaveFile
    htmlSaveFileEnc
    htmlSaveFileFormat
    htmlSetMetaEncoding
    htmlStatus
    htmlTagLookup

    Letter i:

    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    initGenericErrorDefaultFunc
    initdocbDefaultSAXHandler
    inithtmlDefaultSAXHandler
    initxmlDefaultSAXHandler
    inputPop
    inputPush
    internalSubset
    internalSubsetSAXFunc
    isStandalone
    isStandaloneSAXFunc
    isolat1ToUTF8

    Letter n:

    namePop
    namePush
    namespaceDecl
    nodePop
    nodePush
    notationDecl
    notationDeclSAXFunc

    Letter o:

    oldXMLWDcompatibility

    Letter p:

    processingInstruction
    processingInstructionSAXFunc

    Letter r:

    reference
    referenceSAXFunc
    resolveEntity
    resolveEntitySAXFunc

    Letter s:

    setDocumentLocator
    setDocumentLocatorSAXFunc
    setNamespace
    startDocument
    startDocumentSAXFunc
    startElement
    startElementNsSAX2Func
    startElementSAXFunc

    Letter u:

    uconv_t
    unparsedEntityDecl
    unparsedEntityDeclSAXFunc

    Letter v:

    valuePop
    valuePush

    Letter w:

    warningSAXFunc

    Letter x:

    xlinkActuate
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkGetDefaultDetect
    xlinkGetDefaultHandler
    xlinkHRef
    xlinkHandler
    xlinkHandlerPtr
    xlinkIsLink
    xlinkNodeDetectFunc
    xlinkRole
    xlinkSetDefaultDetect
    xlinkSetDefaultHandler
    xlinkShow
    xlinkSimpleLinkFunk
    xlinkTitle
    xlinkType
    xmlACatalogAdd
    xmlACatalogDump
    xmlACatalogRemove
    xmlACatalogResolve
    xmlACatalogResolvePublic
    xmlACatalogResolveSystem
    xmlACatalogResolveURI
    xmlAddAttributeDecl
    xmlAddChild
    xmlAddChildList
    xmlAddDocEntity
    xmlAddDtdEntity
    xmlAddElementDecl
    xmlAddEncodingAlias
    xmlAddID
    xmlAddNextSibling
    xmlAddNotationDecl
    xmlAddPrevSibling
    xmlAddRef
    xmlAddSibling
    xmlAllocOutputBuffer
    xmlAllocParserInputBuffer
    xmlAttr
    xmlAttrPtr
    xmlAttrSerializeTxtContent
    xmlAttribute
    xmlAttributeDefault
    xmlAttributePtr
    xmlAttributeTable
    xmlAttributeTablePtr
    xmlAttributeType
    xmlAutomata
    xmlAutomataCompile
    xmlAutomataGetInitState
    xmlAutomataIsDeterminist
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounter
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewState
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlAutomataPtr
    xmlAutomataSetFinalState
    xmlAutomataState
    xmlAutomataStatePtr
    xmlBoolToText
    xmlBuf
    xmlBufContent
    xmlBufEnd
    xmlBufGetNodeContent
    xmlBufNodeDump
    xmlBufPtr
    xmlBufShrink
    xmlBufUse
    xmlBuffer
    xmlBufferAdd
    xmlBufferAddHead
    xmlBufferAllocScheme
    xmlBufferAllocationScheme
    xmlBufferCCat
    xmlBufferCat
    xmlBufferContent
    xmlBufferCreate
    xmlBufferCreateSize
    xmlBufferCreateStatic
    xmlBufferDetach
    xmlBufferDump
    xmlBufferEmpty
    xmlBufferFree
    xmlBufferGrow
    xmlBufferLength
    xmlBufferPtr
    xmlBufferResize
    xmlBufferSetAllocationScheme
    xmlBufferShrink
    xmlBufferWriteCHAR
    xmlBufferWriteChar
    xmlBufferWriteQuotedString
    xmlBuildQName
    xmlBuildRelativeURI
    xmlBuildURI
    xmlByteConsumed
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlC14NIsVisibleCallback
    xmlC14NMode
    xmlCanonicPath
    xmlCatalog
    xmlCatalogAdd
    xmlCatalogAddLocal
    xmlCatalogAllow
    xmlCatalogCleanup
    xmlCatalogConvert
    xmlCatalogDump
    xmlCatalogFreeLocal
    xmlCatalogGetDefaults
    xmlCatalogGetPublic
    xmlCatalogGetSystem
    xmlCatalogIsEmpty
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCatalogPrefer
    xmlCatalogPtr
    xmlCatalogRemove
    xmlCatalogResolve
    xmlCatalogResolvePublic
    xmlCatalogResolveSystem
    xmlCatalogResolveURI
    xmlCatalogSetDebug
    xmlCatalogSetDefaultPrefer
    xmlCatalogSetDefaults
    xmlChLRange
    xmlChLRangePtr
    xmlChRangeGroup
    xmlChRangeGroupPtr
    xmlChSRange
    xmlChSRangePtr
    xmlChar
    xmlCharEncCloseFunc
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    xmlCharEncoding
    xmlCharEncodingHandler
    xmlCharEncodingHandlerPtr
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlCharInRange
    xmlCharStrdup
    xmlCharStrndup
    xmlCheckFilename
    xmlCheckHTTPInput
    xmlCheckLanguageID
    xmlCheckUTF8
    xmlCheckVersion
    xmlChildElementCount
    xmlChildrenNode
    xmlCleanupCharEncodingHandlers
    xmlCleanupEncodingAliases
    xmlCleanupGlobals
    xmlCleanupInputCallbacks
    xmlCleanupMemory
    xmlCleanupOutputCallbacks
    xmlCleanupParser
    xmlCleanupPredefinedEntities
    xmlCleanupThreads
    xmlClearNodeInfoSeq
    xmlClearParserCtxt
    xmlConvertSGMLCatalog
    xmlCopyAttributeTable
    xmlCopyChar
    xmlCopyCharMultiByte
    xmlCopyDoc
    xmlCopyDocElementContent
    xmlCopyDtd
    xmlCopyElementContent
    xmlCopyElementTable
    xmlCopyEntitiesTable
    xmlCopyEnumeration
    xmlCopyError
    xmlCopyNamespace
    xmlCopyNamespaceList
    xmlCopyNode
    xmlCopyNodeList
    xmlCopyNotationTable
    xmlCopyProp
    xmlCopyPropList
    xmlCreateDocParserCtxt
    xmlCreateEntitiesTable
    xmlCreateEntityParserCtxt
    xmlCreateEnumeration
    xmlCreateFileParserCtxt
    xmlCreateIOParserCtxt
    xmlCreateIntSubset
    xmlCreateMemoryParserCtxt
    xmlCreatePushParserCtxt
    xmlCreateURI
    xmlCreateURLParserCtxt
    xmlCtxtGetLastError
    xmlCtxtReadDoc
    xmlCtxtReadFd
    xmlCtxtReadFile
    xmlCtxtReadIO
    xmlCtxtReadMemory
    xmlCtxtReset
    xmlCtxtResetLastError
    xmlCtxtResetPush
    xmlCtxtUseOptions
    xmlCurrentChar
    xmlDOMWrapAcquireNsFunction
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapCtxt
    xmlDOMWrapCtxtPtr
    xmlDOMWrapFreeCtxt
    xmlDOMWrapNewCtxt
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    xmlDebugCheckDocument
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpDTD
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpEntities
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlDebugDumpString
    xmlDecodeEntities
    xmlDefaultBufferSize
    xmlDefaultSAXHandler
    xmlDefaultSAXHandlerInit
    xmlDefaultSAXLocator
    xmlDelEncodingAlias
    xmlDeregisterNodeDefault
    xmlDeregisterNodeDefaultValue
    xmlDeregisterNodeFunc
    xmlDetectCharEncoding
    xmlDict
    xmlDictCleanup
    xmlDictCreate
    xmlDictCreateSub
    xmlDictExists
    xmlDictFree
    xmlDictGetUsage
    xmlDictLookup
    xmlDictOwns
    xmlDictPtr
    xmlDictQLookup
    xmlDictReference
    xmlDictSetLimit
    xmlDictSize
    xmlDllMain
    xmlDoValidityCheckingDefaultValue
    xmlDoc
    xmlDocCopyNode
    xmlDocCopyNodeList
    xmlDocDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemory
    xmlDocDumpMemoryEnc
    xmlDocFormatDump
    xmlDocGetRootElement
    xmlDocProperties
    xmlDocPtr
    xmlDocSetRootElement
    xmlDtd
    xmlDtdPtr
    xmlDumpAttributeDecl
    xmlDumpAttributeTable
    xmlDumpElementDecl
    xmlDumpElementTable
    xmlDumpEntitiesTable
    xmlDumpEntityDecl
    xmlDumpNotationDecl
    xmlDumpNotationTable
    xmlElemDump
    xmlElement
    xmlElementContent
    xmlElementContentOccur
    xmlElementContentPtr
    xmlElementContentType
    xmlElementPtr
    xmlElementTable
    xmlElementTablePtr
    xmlElementType
    xmlElementTypeVal
    xmlEncodeEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlEntitiesTable
    xmlEntitiesTablePtr
    xmlEntity
    xmlEntityPtr
    xmlEntityReferenceFunc
    xmlEntityType
    xmlEnumeration
    xmlEnumerationPtr
    xmlErrMemory
    xmlError
    xmlErrorDomain
    xmlErrorLevel
    xmlErrorPtr
    xmlExpCtxt
    xmlExpCtxtNbCons
    xmlExpCtxtNbNodes
    xmlExpCtxtPtr
    xmlExpDump
    xmlExpExpDerive
    xmlExpFree
    xmlExpFreeCtxt
    xmlExpGetLanguage
    xmlExpGetStart
    xmlExpIsNillable
    xmlExpMaxToken
    xmlExpNewAtom
    xmlExpNewCtxt
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlExpNode
    xmlExpNodePtr
    xmlExpNodeType
    xmlExpParse
    xmlExpRef
    xmlExpStringDerive
    xmlExpSubsume
    xmlExternalEntityLoader
    xmlFeature
    xmlFileClose
    xmlFileMatch
    xmlFileOpen
    xmlFileRead
    xmlFindCharEncodingHandler
    xmlFirstElementChild
    xmlFree
    xmlFreeAttributeTable
    xmlFreeAutomata
    xmlFreeCatalog
    xmlFreeDoc
    xmlFreeDocElementContent
    xmlFreeDtd
    xmlFreeElementContent
    xmlFreeElementTable
    xmlFreeEntitiesTable
    xmlFreeEnumeration
    xmlFreeFunc
    xmlFreeIDTable
    xmlFreeInputStream
    xmlFreeMutex
    xmlFreeNode
    xmlFreeNodeList
    xmlFreeNotationTable
    xmlFreeNs
    xmlFreeNsList
    xmlFreeParserCtxt
    xmlFreeParserInputBuffer
    xmlFreePattern
    xmlFreePatternList
    xmlFreeProp
    xmlFreePropList
    xmlFreeRMutex
    xmlFreeRefTable
    xmlFreeStreamCtxt
    xmlFreeTextReader
    xmlFreeTextWriter
    xmlFreeURI
    xmlFreeValidCtxt
    xmlGcMemGet
    xmlGcMemSetup
    xmlGenericError
    xmlGenericErrorContext
    xmlGenericErrorFunc
    xmlGetBufferAllocationScheme
    xmlGetCharEncodingHandler
    xmlGetCharEncodingName
    xmlGetCompressMode
    xmlGetDocCompressMode
    xmlGetDocEntity
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdEntity
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlGetEncodingAlias
    xmlGetExternalEntityLoader
    xmlGetFeature
    xmlGetFeaturesList
    xmlGetGlobalState
    xmlGetID
    xmlGetIntSubset
    xmlGetLastChild
    xmlGetLastError
    xmlGetLineNo
    xmlGetNoNsProp
    xmlGetNodePath
    xmlGetNsList
    xmlGetNsProp
    xmlGetParameterEntity
    xmlGetPredefinedEntity
    xmlGetProp
    xmlGetRefs
    xmlGetThreadId
    xmlGetUTF8Char
    xmlGetWarningsDefaultValue
    xmlGlobalState
    xmlGlobalStatePtr
    xmlHandleEntity
    xmlHasFeature
    xmlHasNsProp
    xmlHasProp
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashCopier
    xmlHashCopy
    xmlHashCreate
    xmlHashCreateDict
    xmlHashDeallocator
    xmlHashFree
    xmlHashLookup
    xmlHashLookup2
    xmlHashLookup3
    xmlHashQLookup
    xmlHashQLookup2
    xmlHashQLookup3
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlHashScanner
    xmlHashScannerFull
    xmlHashSize
    xmlHashTable
    xmlHashTablePtr
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlID
    xmlIDPtr
    xmlIDTable
    xmlIDTablePtr
    xmlIOFTPClose
    xmlIOFTPMatch
    xmlIOFTPOpen
    xmlIOFTPRead
    xmlIOHTTPClose
    xmlIOHTTPMatch
    xmlIOHTTPOpen
    xmlIOHTTPOpenW
    xmlIOHTTPRead
    xmlIOParseDTD
    xmlIndentTreeOutput
    xmlInitCharEncodingHandlers
    xmlInitGlobals
    xmlInitMemory
    xmlInitNodeInfoSeq
    xmlInitParser
    xmlInitParserCtxt
    xmlInitThreads
    xmlInitializeCatalog
    xmlInitializeDict
    xmlInitializeGlobalState
    xmlInitializePredefinedEntities
    xmlInputCloseCallback
    xmlInputMatchCallback
    xmlInputOpenCallback
    xmlInputReadCallback
    xmlIsBaseChar
    xmlIsBaseCharGroup
    xmlIsBaseCharQ
    xmlIsBaseChar_ch
    xmlIsBlank
    xmlIsBlankNode
    xmlIsBlankQ
    xmlIsBlank_ch
    xmlIsChar
    xmlIsCharGroup
    xmlIsCharQ
    xmlIsChar_ch
    xmlIsCombining
    xmlIsCombiningGroup
    xmlIsCombiningQ
    xmlIsDigit
    xmlIsDigitGroup
    xmlIsDigitQ
    xmlIsDigit_ch
    xmlIsExtender
    xmlIsExtenderGroup
    xmlIsExtenderQ
    xmlIsExtender_ch
    xmlIsID
    xmlIsIdeographic
    xmlIsIdeographicGroup
    xmlIsIdeographicQ
    xmlIsLetter
    xmlIsMainThread
    xmlIsMixedElement
    xmlIsPubidChar
    xmlIsPubidCharQ
    xmlIsPubidChar_ch
    xmlIsPubidChar_tab
    xmlIsRef
    xmlIsXHTML
    xmlKeepBlanksDefault
    xmlKeepBlanksDefaultValue
    xmlLastElementChild
    xmlLastError
    xmlLineNumbersDefault
    xmlLineNumbersDefaultValue
    xmlLink
    xmlLinkGetData
    xmlLinkPtr
    xmlList
    xmlListAppend
    xmlListClear
    xmlListCopy
    xmlListCreate
    xmlListDataCompare
    xmlListDeallocator
    xmlListDelete
    xmlListDup
    xmlListEmpty
    xmlListEnd
    xmlListFront
    xmlListInsert
    xmlListMerge
    xmlListPopBack
    xmlListPopFront
    xmlListPtr
    xmlListPushBack
    xmlListPushFront
    xmlListRemoveAll
    xmlListRemoveFirst
    xmlListRemoveLast
    xmlListReverse
    xmlListReverseSearch
    xmlListReverseWalk
    xmlListSearch
    xmlListSize
    xmlListSort
    xmlListWalk
    xmlListWalker
    xmlLoadACatalog
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlLoadExtDtdDefaultValue
    xmlLoadExternalEntity
    xmlLoadSGMLSuperCatalog
    xmlLocationSet
    xmlLocationSetPtr
    xmlLockLibrary
    xmlLsCountNode
    xmlLsOneNode
    xmlMalloc
    xmlMallocAtomic
    xmlMallocAtomicLoc
    xmlMallocFunc
    xmlMallocLoc
    xmlMemBlocks
    xmlMemDisplay
    xmlMemDisplayLast
    xmlMemFree
    xmlMemGet
    xmlMemMalloc
    xmlMemRealloc
    xmlMemSetup
    xmlMemShow
    xmlMemStrdup
    xmlMemStrdupLoc
    xmlMemUsed
    xmlMemoryDump
    xmlMemoryStrdup
    xmlModule
    xmlModuleClose
    xmlModuleFree
    xmlModuleOpen
    xmlModuleOption
    xmlModulePtr
    xmlModuleSymbol
    xmlMutex
    xmlMutexLock
    xmlMutexPtr
    xmlMutexUnlock
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNanoFTPCheckResponse
    xmlNanoFTPCleanup
    xmlNanoFTPClose
    xmlNanoFTPCloseConnection
    xmlNanoFTPConnect
    xmlNanoFTPConnectTo
    xmlNanoFTPCwd
    xmlNanoFTPDele
    xmlNanoFTPFreeCtxt
    xmlNanoFTPGet
    xmlNanoFTPGetConnection
    xmlNanoFTPGetResponse
    xmlNanoFTPGetSocket
    xmlNanoFTPInit
    xmlNanoFTPList
    xmlNanoFTPNewCtxt
    xmlNanoFTPOpen
    xmlNanoFTPProxy
    xmlNanoFTPQuit
    xmlNanoFTPRead
    xmlNanoFTPScanProxy
    xmlNanoFTPUpdateURL
    xmlNanoHTTPAuthHeader
    xmlNanoHTTPCleanup
    xmlNanoHTTPClose
    xmlNanoHTTPContentLength
    xmlNanoHTTPEncoding
    xmlNanoHTTPFetch
    xmlNanoHTTPInit
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPMimeType
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlNanoHTTPRead
    xmlNanoHTTPRedir
    xmlNanoHTTPReturnCode
    xmlNanoHTTPSave
    xmlNanoHTTPScanProxy
    xmlNewAutomata
    xmlNewCDataBlock
    xmlNewCatalog
    xmlNewCharEncodingHandler
    xmlNewCharRef
    xmlNewChild
    xmlNewComment
    xmlNewDoc
    xmlNewDocComment
    xmlNewDocElementContent
    xmlNewDocFragment
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocPI
    xmlNewDocProp
    xmlNewDocRawNode
    xmlNewDocText
    xmlNewDocTextLen
    xmlNewDtd
    xmlNewElementContent
    xmlNewEntity
    xmlNewEntityInputStream
    xmlNewGlobalNs
    xmlNewIOInputStream
    xmlNewInputFromFile
    xmlNewInputStream
    xmlNewMutex
    xmlNewNode
    xmlNewNodeEatName
    xmlNewNs
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewPI
    xmlNewParserCtxt
    xmlNewProp
    xmlNewRMutex
    xmlNewReference
    xmlNewStringInputStream
    xmlNewText
    xmlNewTextChild
    xmlNewTextLen
    xmlNewTextReader
    xmlNewTextReaderFilename
    xmlNewTextWriter
    xmlNewTextWriterDoc
    xmlNewTextWriterFilename
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlNewTextWriterTree
    xmlNewValidCtxt
    xmlNextChar
    xmlNextElementSibling
    xmlNoNetExternalEntityLoader
    xmlNode
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeBufGetContent
    xmlNodeDump
    xmlNodeDumpOutput
    xmlNodeGetBase
    xmlNodeGetContent
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    xmlNodeIsText
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlNodePtr
    xmlNodeSet
    xmlNodeSetBase
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlNodeSetLang
    xmlNodeSetName
    xmlNodeSetPtr
    xmlNodeSetSpacePreserve
    xmlNormalizeURIPath
    xmlNormalizeWindowsPath
    xmlNotation
    xmlNotationPtr
    xmlNotationTable
    xmlNotationTablePtr
    xmlNs
    xmlNsPtr
    xmlNsType
    xmlOutputBuffer
    xmlOutputBufferClose
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    xmlOutputBufferCreateFilenameDefault
    xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferCreateFilenameValue
    xmlOutputBufferCreateIO
    xmlOutputBufferFlush
    xmlOutputBufferGetContent
    xmlOutputBufferGetSize
    xmlOutputBufferPtr
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlOutputCloseCallback
    xmlOutputMatchCallback
    xmlOutputOpenCallback
    xmlOutputWriteCallback
    xmlParseAttValue
    xmlParseAttribute
    xmlParseAttributeListDecl
    xmlParseAttributeType
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseCDSect
    xmlParseCatalogFile
    xmlParseCharData
    xmlParseCharEncoding
    xmlParseCharRef
    xmlParseChunk
    xmlParseComment
    xmlParseContent
    xmlParseCtxtExternalEntity
    xmlParseDTD
    xmlParseDefaultDecl
    xmlParseDoc
    xmlParseDocTypeDecl
    xmlParseDocument
    xmlParseElement
    xmlParseElementChildrenContentDecl
    xmlParseElementContentDecl
    xmlParseElementDecl
    xmlParseElementMixedContentDecl
    xmlParseEncName
    xmlParseEncodingDecl
    xmlParseEndTag
    xmlParseEntity
    xmlParseEntityDecl
    xmlParseEntityRef
    xmlParseEntityValue
    xmlParseEnumeratedType
    xmlParseEnumerationType
    xmlParseExtParsedEnt
    xmlParseExternalEntity
    xmlParseExternalID
    xmlParseExternalSubset
    xmlParseFile
    xmlParseInNodeContext
    xmlParseMarkupDecl
    xmlParseMemory
    xmlParseMisc
    xmlParseName
    xmlParseNamespace
    xmlParseNmtoken
    xmlParseNotationDecl
    xmlParseNotationType
    xmlParsePEReference
    xmlParsePI
    xmlParsePITarget
    xmlParsePubidLiteral
    xmlParseQuotedString
    xmlParseReference
    xmlParseSDDecl
    xmlParseStartTag
    xmlParseSystemLiteral
    xmlParseTextDecl
    xmlParseURI
    xmlParseURIRaw
    xmlParseURIReference
    xmlParseVersionInfo
    xmlParseVersionNum
    xmlParseXMLDecl
    xmlParserAddNodeInfo
    xmlParserCtxt
    xmlParserCtxtPtr
    xmlParserDebugEntities
    xmlParserError
    xmlParserErrors
    xmlParserFindNodeInfo
    xmlParserFindNodeInfoIndex
    xmlParserGetDirectory
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlParserInput
    xmlParserInputBuffer
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateFilenameDefault
    xmlParserInputBufferCreateFilenameFunc
    xmlParserInputBufferCreateFilenameValue
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    xmlParserInputBufferGrow
    xmlParserInputBufferPtr
    xmlParserInputBufferPush
    xmlParserInputBufferRead
    xmlParserInputDeallocate
    xmlParserInputGrow
    xmlParserInputPtr
    xmlParserInputRead
    xmlParserInputShrink
    xmlParserInputState
    xmlParserMaxDepth
    xmlParserMode
    xmlParserNodeInfo
    xmlParserNodeInfoPtr
    xmlParserNodeInfoSeq
    xmlParserNodeInfoSeqPtr
    xmlParserOption
    xmlParserPrintFileContext
    xmlParserPrintFileInfo
    xmlParserProperties
    xmlParserSeverities
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserVersion
    xmlParserWarning
    xmlPathToURI
    xmlPattern
    xmlPatternFlags
    xmlPatternFromRoot
    xmlPatternGetStreamCtxt
    xmlPatternMatch
    xmlPatternMaxDepth
    xmlPatternMinDepth
    xmlPatternPtr
    xmlPatternStreamable
    xmlPatterncompile
    xmlPedanticParserDefault
    xmlPedanticParserDefaultValue
    xmlPopInput
    xmlPopInputCallbacks
    xmlPreviousElementSibling
    xmlPrintURI
    xmlPushInput
    xmlRMutex
    xmlRMutexLock
    xmlRMutexPtr
    xmlRMutexUnlock
    xmlReadDoc
    xmlReadFd
    xmlReadFile
    xmlReadIO
    xmlReadMemory
    xmlReaderForDoc
    xmlReaderForFd
    xmlReaderForFile
    xmlReaderForIO
    xmlReaderForMemory
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewFile
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlReaderNewWalker
    xmlReaderTypes
    xmlReaderWalker
    xmlRealloc
    xmlReallocFunc
    xmlReallocLoc
    xmlReconciliateNs
    xmlRecoverDoc
    xmlRecoverFile
    xmlRecoverMemory
    xmlRef
    xmlRefPtr
    xmlRefTable
    xmlRefTablePtr
    xmlRegExecCallbacks
    xmlRegExecCtxt
    xmlRegExecCtxtPtr
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRegFreeExecCtxt
    xmlRegFreeRegexp
    xmlRegNewExecCtxt
    xmlRegexp
    xmlRegexpCompile
    xmlRegexpExec
    xmlRegexpIsDeterminist
    xmlRegexpPrint
    xmlRegexpPtr
    xmlRegisterCharEncodingHandler
    xmlRegisterDefaultInputCallbacks
    xmlRegisterDefaultOutputCallbacks
    xmlRegisterHTTPPostCallbacks
    xmlRegisterInputCallbacks
    xmlRegisterNodeDefault
    xmlRegisterNodeDefaultValue
    xmlRegisterNodeFunc
    xmlRegisterOutputCallbacks
    xmlRelaxNG
    xmlRelaxNGCleanupTypes
    xmlRelaxNGDump
    xmlRelaxNGDumpTree
    xmlRelaxNGFree
    xmlRelaxNGFreeParserCtxt
    xmlRelaxNGFreeValidCtxt
    xmlRelaxNGGetParserErrors
    xmlRelaxNGGetValidErrors
    xmlRelaxNGInitTypes
    xmlRelaxNGNewDocParserCtxt
    xmlRelaxNGNewMemParserCtxt
    xmlRelaxNGNewParserCtxt
    xmlRelaxNGNewValidCtxt
    xmlRelaxNGParse
    xmlRelaxNGParserCtxt
    xmlRelaxNGParserCtxtPtr
    xmlRelaxNGParserFlag
    xmlRelaxNGPtr
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetParserStructuredErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxNGSetValidStructuredErrors
    xmlRelaxNGValidCtxt
    xmlRelaxNGValidCtxtPtr
    xmlRelaxNGValidErr
    xmlRelaxNGValidateDoc
    xmlRelaxNGValidateFullElement
    xmlRelaxNGValidatePopElement
    xmlRelaxNGValidatePushCData
    xmlRelaxNGValidatePushElement
    xmlRelaxNGValidityErrorFunc
    xmlRelaxNGValidityWarningFunc
    xmlRelaxParserSetFlag
    xmlRemoveID
    xmlRemoveProp
    xmlRemoveRef
    xmlReplaceNode
    xmlResetError
    xmlResetLastError
    xmlRootNode
    xmlSAX2AttributeDecl
    xmlSAX2CDataBlock
    xmlSAX2Characters
    xmlSAX2Comment
    xmlSAX2ElementDecl
    xmlSAX2EndDocument
    xmlSAX2EndElement
    xmlSAX2EndElementNs
    xmlSAX2EntityDecl
    xmlSAX2ExternalSubset
    xmlSAX2GetColumnNumber
    xmlSAX2GetEntity
    xmlSAX2GetLineNumber
    xmlSAX2GetParameterEntity
    xmlSAX2GetPublicId
    xmlSAX2GetSystemId
    xmlSAX2HasExternalSubset
    xmlSAX2HasInternalSubset
    xmlSAX2IgnorableWhitespace
    xmlSAX2InitDefaultSAXHandler
    xmlSAX2InitDocbDefaultSAXHandler
    xmlSAX2InitHtmlDefaultSAXHandler
    xmlSAX2InternalSubset
    xmlSAX2IsStandalone
    xmlSAX2NotationDecl
    xmlSAX2ProcessingInstruction
    xmlSAX2Reference
    xmlSAX2ResolveEntity
    xmlSAX2SetDocumentLocator
    xmlSAX2StartDocument
    xmlSAX2StartElement
    xmlSAX2StartElementNs
    xmlSAX2UnparsedEntityDecl
    xmlSAXDefaultVersion
    xmlSAXHandler
    xmlSAXHandlerPtr
    xmlSAXHandlerV1
    xmlSAXHandlerV1Ptr
    xmlSAXLocator
    xmlSAXLocatorPtr
    xmlSAXParseDTD
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlSAXUserParseFile
    xmlSAXUserParseMemory
    xmlSAXVersion
    xmlSaveClose
    xmlSaveCtxt
    xmlSaveCtxtPtr
    xmlSaveDoc
    xmlSaveFile
    xmlSaveFileEnc
    xmlSaveFileTo
    xmlSaveFlush
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlSaveFormatFileTo
    xmlSaveNoEmptyTags
    xmlSaveOption
    xmlSaveSetAttrEscape
    xmlSaveSetEscape
    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO
    xmlSaveTree
    xmlSaveUri
    xmlScanName
    xmlSchema
    xmlSchemaAnnot
    xmlSchemaAnnotPtr
    xmlSchemaAttribute
    xmlSchemaAttributeGroup
    xmlSchemaAttributeGroupPtr
    xmlSchemaAttributeLink
    xmlSchemaAttributeLinkPtr
    xmlSchemaAttributePtr
    xmlSchemaCheckFacet
    xmlSchemaCleanupTypes
    xmlSchemaCollapseString
    xmlSchemaCompareValues
    xmlSchemaCompareValuesWhtsp
    xmlSchemaContentType
    xmlSchemaCopyValue
    xmlSchemaDump
    xmlSchemaElement
    xmlSchemaElementPtr
    xmlSchemaFacet
    xmlSchemaFacetLink
    xmlSchemaFacetLinkPtr
    xmlSchemaFacetPtr
    xmlSchemaFree
    xmlSchemaFreeFacet
    xmlSchemaFreeParserCtxt
    xmlSchemaFreeType
    xmlSchemaFreeValidCtxt
    xmlSchemaFreeValue
    xmlSchemaFreeWildcard
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaGetBuiltInType
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlSchemaGetFacetValueAsULong
    xmlSchemaGetParserErrors
    xmlSchemaGetPredefinedType
    xmlSchemaGetValType
    xmlSchemaGetValidErrors
    xmlSchemaInitTypes
    xmlSchemaIsBuiltInTypeFacet
    xmlSchemaIsValid
    xmlSchemaNewDocParserCtxt
    xmlSchemaNewFacet
    xmlSchemaNewMemParserCtxt
    xmlSchemaNewNOTATIONValue
    xmlSchemaNewParserCtxt
    xmlSchemaNewQNameValue
    xmlSchemaNewStringValue
    xmlSchemaNewValidCtxt
    xmlSchemaNotation
    xmlSchemaNotationPtr
    xmlSchemaParse
    xmlSchemaParserCtxt
    xmlSchemaParserCtxtPtr
    xmlSchemaPtr
    xmlSchemaSAXPlug
    xmlSchemaSAXPlugPtr
    xmlSchemaSAXPlugStruct
    xmlSchemaSAXUnplug
    xmlSchemaSetParserErrors
    xmlSchemaSetParserStructuredErrors
    xmlSchemaSetValidErrors
    xmlSchemaSetValidOptions
    xmlSchemaSetValidStructuredErrors
    xmlSchemaType
    xmlSchemaTypeLink
    xmlSchemaTypeLinkPtr
    xmlSchemaTypePtr
    xmlSchemaTypeType
    xmlSchemaVal
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValPtr
    xmlSchemaValType
    xmlSchemaValidCtxt
    xmlSchemaValidCtxtGetOptions
    xmlSchemaValidCtxtGetParserCtxt
    xmlSchemaValidCtxtPtr
    xmlSchemaValidError
    xmlSchemaValidOption
    xmlSchemaValidateDoc
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateFile
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    xmlSchemaValidateOneElement
    xmlSchemaValidatePredefinedType
    xmlSchemaValidateSetFilename
    xmlSchemaValidateSetLocator
    xmlSchemaValidateStream
    xmlSchemaValidityErrorFunc
    xmlSchemaValidityLocatorFunc
    xmlSchemaValidityWarningFunc
    xmlSchemaValueAppend
    xmlSchemaValueGetAsBoolean
    xmlSchemaValueGetAsString
    xmlSchemaValueGetNext
    xmlSchemaWhiteSpaceReplace
    xmlSchemaWhitespaceValueType
    xmlSchemaWildcard
    xmlSchemaWildcardNs
    xmlSchemaWildcardNsPtr
    xmlSchemaWildcardPtr
    xmlSchematron
    xmlSchematronFree
    xmlSchematronFreeParserCtxt
    xmlSchematronFreeValidCtxt
    xmlSchematronNewDocParserCtxt
    xmlSchematronNewMemParserCtxt
    xmlSchematronNewParserCtxt
    xmlSchematronNewValidCtxt
    xmlSchematronParse
    xmlSchematronParserCtxt
    xmlSchematronParserCtxtPtr
    xmlSchematronPtr
    xmlSchematronSetValidStructuredErrors
    xmlSchematronValidCtxt
    xmlSchematronValidCtxtPtr
    xmlSchematronValidOptions
    xmlSchematronValidateDoc
    xmlSchematronValidityErrorFunc
    xmlSchematronValidityWarningFunc
    xmlSearchNs
    xmlSearchNsByHref
    xmlSetBufferAllocationScheme
    xmlSetCompressMode
    xmlSetDocCompressMode
    xmlSetEntityReferenceFunc
    xmlSetExternalEntityLoader
    xmlSetFeature
    xmlSetGenericErrorFunc
    xmlSetListDoc
    xmlSetNs
    xmlSetNsProp
    xmlSetProp
    xmlSetStructuredErrorFunc
    xmlSetTreeDoc
    xmlSetupParserForBuffer
    xmlShell
    xmlShellBase
    xmlShellCat
    xmlShellCmd
    xmlShellCtxt
    xmlShellCtxtPtr
    xmlShellDir
    xmlShellDu
    xmlShellList
    xmlShellLoad
    xmlShellPrintNode
    xmlShellPrintXPathError
    xmlShellPrintXPathResult
    xmlShellPwd
    xmlShellReadlineFunc
    xmlShellSave
    xmlShellValidate
    xmlShellWrite
    xmlSkipBlankChars
    xmlSnprintfElementContent
    xmlSplitQName
    xmlSplitQName2
    xmlSplitQName3
    xmlSprintfElementContent
    xmlStopParser
    xmlStrEqual
    xmlStrPrintf
    xmlStrQEqual
    xmlStrVPrintf
    xmlStrcasecmp
    xmlStrcasestr
    xmlStrcat
    xmlStrchr
    xmlStrcmp
    xmlStrdup
    xmlStrdupFunc
    xmlStreamCtxt
    xmlStreamCtxtPtr
    xmlStreamPop
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlStreamWantsAnyNode
    xmlStringComment
    xmlStringCurrentChar
    xmlStringDecodeEntities
    xmlStringGetNodeList
    xmlStringLenDecodeEntities
    xmlStringLenGetNodeList
    xmlStringText
    xmlStringTextNoenc
    xmlStrlen
    xmlStrncasecmp
    xmlStrncat
    xmlStrncatNew
    xmlStrncmp
    xmlStrndup
    xmlStrstr
    xmlStrsub
    xmlStructuredError
    xmlStructuredErrorContext
    xmlStructuredErrorFunc
    xmlSubstituteEntitiesDefault
    xmlSubstituteEntitiesDefaultValue
    xmlSwitchEncoding
    xmlSwitchInputEncoding
    xmlSwitchToEncoding
    xmlTextConcat
    xmlTextMerge
    xmlTextReader
    xmlTextReaderAttributeCount
    xmlTextReaderBaseUri
    xmlTextReaderByteConsumed
    xmlTextReaderClose
    xmlTextReaderConstBaseUri
    xmlTextReaderConstEncoding
    xmlTextReaderConstLocalName
    xmlTextReaderConstName
    xmlTextReaderConstNamespaceUri
    xmlTextReaderConstPrefix
    xmlTextReaderConstString
    xmlTextReaderConstValue
    xmlTextReaderConstXmlLang
    xmlTextReaderConstXmlVersion
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    xmlTextReaderDepth
    xmlTextReaderErrorFunc
    xmlTextReaderExpand
    xmlTextReaderGetAttribute
    xmlTextReaderGetAttributeNo
    xmlTextReaderGetAttributeNs
    xmlTextReaderGetErrorHandler
    xmlTextReaderGetParserColumnNumber
    xmlTextReaderGetParserLineNumber
    xmlTextReaderGetParserProp
    xmlTextReaderGetRemainder
    xmlTextReaderHasAttributes
    xmlTextReaderHasValue
    xmlTextReaderIsDefault
    xmlTextReaderIsEmptyElement
    xmlTextReaderIsNamespaceDecl
    xmlTextReaderIsValid
    xmlTextReaderLocalName
    xmlTextReaderLocatorBaseURI
    xmlTextReaderLocatorLineNumber
    xmlTextReaderLocatorPtr
    xmlTextReaderLookupNamespace
    xmlTextReaderMode
    xmlTextReaderMoveToAttribute
    xmlTextReaderMoveToAttributeNo
    xmlTextReaderMoveToAttributeNs
    xmlTextReaderMoveToElement
    xmlTextReaderMoveToFirstAttribute
    xmlTextReaderMoveToNextAttribute
    xmlTextReaderName
    xmlTextReaderNamespaceUri
    xmlTextReaderNext
    xmlTextReaderNextSibling
    xmlTextReaderNodeType
    xmlTextReaderNormalization
    xmlTextReaderPrefix
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    xmlTextReaderPtr
    xmlTextReaderQuoteChar
    xmlTextReaderRead
    xmlTextReaderReadAttributeValue
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlTextReaderReadState
    xmlTextReaderReadString
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetParserProp
    xmlTextReaderSetSchema
    xmlTextReaderSetStructuredErrorHandler
    xmlTextReaderSetup
    xmlTextReaderStandalone
    xmlTextReaderValue
    xmlTextReaderXmlLang
    xmlTextWriter
    xmlTextWriterEndAttribute
    xmlTextWriterEndCDATA
    xmlTextWriterEndComment
    xmlTextWriterEndDTD
    xmlTextWriterEndDTDAttlist
    xmlTextWriterEndDTDElement
    xmlTextWriterEndDTDEntity
    xmlTextWriterEndDocument
    xmlTextWriterEndElement
    xmlTextWriterEndPI
    xmlTextWriterFlush
    xmlTextWriterFullEndElement
    xmlTextWriterPtr
    xmlTextWriterSetIndent
    xmlTextWriterSetIndentString
    xmlTextWriterSetQuoteChar
    xmlTextWriterStartAttribute
    xmlTextWriterStartAttributeNS
    xmlTextWriterStartCDATA
    xmlTextWriterStartComment
    xmlTextWriterStartDTD
    xmlTextWriterStartDTDAttlist
    xmlTextWriterStartDTDElement
    xmlTextWriterStartDTDEntity
    xmlTextWriterStartDocument
    xmlTextWriterStartElement
    xmlTextWriterStartElementNS
    xmlTextWriterStartPI
    xmlTextWriterWriteAttribute
    xmlTextWriterWriteAttributeNS
    xmlTextWriterWriteBase64
    xmlTextWriterWriteBinHex
    xmlTextWriterWriteCDATA
    xmlTextWriterWriteComment
    xmlTextWriterWriteDTD
    xmlTextWriterWriteDTDAttlist
    xmlTextWriterWriteDTDElement
    xmlTextWriterWriteDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTDExternalEntityContents
    xmlTextWriterWriteDTDInternalEntity
    xmlTextWriterWriteDTDNotation
    xmlTextWriterWriteDocType
    xmlTextWriterWriteElement
    xmlTextWriterWriteElementNS
    xmlTextWriterWriteFormatAttribute
    xmlTextWriterWriteFormatAttributeNS
    xmlTextWriterWriteFormatCDATA
    xmlTextWriterWriteFormatComment
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteFormatDTDElement
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteFormatElement
    xmlTextWriterWriteFormatElementNS
    xmlTextWriterWriteFormatPI
    xmlTextWriterWriteFormatRaw
    xmlTextWriterWriteFormatString
    xmlTextWriterWritePI
    xmlTextWriterWriteProcessingInstruction
    xmlTextWriterWriteRaw
    xmlTextWriterWriteRawLen
    xmlTextWriterWriteString
    xmlTextWriterWriteVFormatAttribute
    xmlTextWriterWriteVFormatAttributeNS
    xmlTextWriterWriteVFormatCDATA
    xmlTextWriterWriteVFormatComment
    xmlTextWriterWriteVFormatDTD
    xmlTextWriterWriteVFormatDTDAttlist
    xmlTextWriterWriteVFormatDTDElement
    xmlTextWriterWriteVFormatDTDInternalEntity
    xmlTextWriterWriteVFormatElement
    xmlTextWriterWriteVFormatElementNS
    xmlTextWriterWriteVFormatPI
    xmlTextWriterWriteVFormatRaw
    xmlTextWriterWriteVFormatString
    xmlThrDefBufferAllocScheme
    xmlThrDefDefaultBufferSize
    xmlThrDefDeregisterNodeDefault
    xmlThrDefDoValidityCheckingDefaultValue
    xmlThrDefGetWarningsDefaultValue
    xmlThrDefIndentTreeOutput
    xmlThrDefKeepBlanksDefaultValue
    xmlThrDefLineNumbersDefaultValue
    xmlThrDefLoadExtDtdDefaultValue
    xmlThrDefOutputBufferCreateFilenameDefault
    xmlThrDefParserDebugEntities
    xmlThrDefParserInputBufferCreateFilenameDefault
    xmlThrDefPedanticParserDefaultValue
    xmlThrDefRegisterNodeDefault
    xmlThrDefSaveNoEmptyTags
    xmlThrDefSetGenericErrorFunc
    xmlThrDefSetStructuredErrorFunc
    xmlThrDefSubstituteEntitiesDefaultValue
    xmlThrDefTreeIndentString
    xmlTreeIndentString
    xmlUCSIsAegeanNumbers
    xmlUCSIsAlphabeticPresentationForms
    xmlUCSIsArabic
    xmlUCSIsArabicPresentationFormsA
    xmlUCSIsArabicPresentationFormsB
    xmlUCSIsArmenian
    xmlUCSIsArrows
    xmlUCSIsBasicLatin
    xmlUCSIsBengali
    xmlUCSIsBlock
    xmlUCSIsBlockElements
    xmlUCSIsBopomofo
    xmlUCSIsBopomofoExtended
    xmlUCSIsBoxDrawing
    xmlUCSIsBraillePatterns
    xmlUCSIsBuhid
    xmlUCSIsByzantineMusicalSymbols
    xmlUCSIsCJKCompatibility
    xmlUCSIsCJKCompatibilityForms
    xmlUCSIsCJKCompatibilityIdeographs
    xmlUCSIsCJKCompatibilityIdeographsSupplement
    xmlUCSIsCJKRadicalsSupplement
    xmlUCSIsCJKSymbolsandPunctuation
    xmlUCSIsCJKUnifiedIdeographs
    xmlUCSIsCJKUnifiedIdeographsExtensionA
    xmlUCSIsCJKUnifiedIdeographsExtensionB
    xmlUCSIsCat
    xmlUCSIsCatC
    xmlUCSIsCatCc
    xmlUCSIsCatCf
    xmlUCSIsCatCo
    xmlUCSIsCatCs
    xmlUCSIsCatL
    xmlUCSIsCatLl
    xmlUCSIsCatLm
    xmlUCSIsCatLo
    xmlUCSIsCatLt
    xmlUCSIsCatLu
    xmlUCSIsCatM
    xmlUCSIsCatMc
    xmlUCSIsCatMe
    xmlUCSIsCatMn
    xmlUCSIsCatN
    xmlUCSIsCatNd
    xmlUCSIsCatNl
    xmlUCSIsCatNo
    xmlUCSIsCatP
    xmlUCSIsCatPc
    xmlUCSIsCatPd
    xmlUCSIsCatPe
    xmlUCSIsCatPf
    xmlUCSIsCatPi
    xmlUCSIsCatPo
    xmlUCSIsCatPs
    xmlUCSIsCatS
    xmlUCSIsCatSc
    xmlUCSIsCatSk
    xmlUCSIsCatSm
    xmlUCSIsCatSo
    xmlUCSIsCatZ
    xmlUCSIsCatZl
    xmlUCSIsCatZp
    xmlUCSIsCatZs
    xmlUCSIsCherokee
    xmlUCSIsCombiningDiacriticalMarks
    xmlUCSIsCombiningDiacriticalMarksforSymbols
    xmlUCSIsCombiningHalfMarks
    xmlUCSIsCombiningMarksforSymbols
    xmlUCSIsControlPictures
    xmlUCSIsCurrencySymbols
    xmlUCSIsCypriotSyllabary
    xmlUCSIsCyrillic
    xmlUCSIsCyrillicSupplement
    xmlUCSIsDeseret
    xmlUCSIsDevanagari
    xmlUCSIsDingbats
    xmlUCSIsEnclosedAlphanumerics
    xmlUCSIsEnclosedCJKLettersandMonths
    xmlUCSIsEthiopic
    xmlUCSIsGeneralPunctuation
    xmlUCSIsGeometricShapes
    xmlUCSIsGeorgian
    xmlUCSIsGothic
    xmlUCSIsGreek
    xmlUCSIsGreekExtended
    xmlUCSIsGreekandCoptic
    xmlUCSIsGujarati
    xmlUCSIsGurmukhi
    xmlUCSIsHalfwidthandFullwidthForms
    xmlUCSIsHangulCompatibilityJamo
    xmlUCSIsHangulJamo
    xmlUCSIsHangulSyllables
    xmlUCSIsHanunoo
    xmlUCSIsHebrew
    xmlUCSIsHighPrivateUseSurrogates
    xmlUCSIsHighSurrogates
    xmlUCSIsHiragana
    xmlUCSIsIPAExtensions
    xmlUCSIsIdeographicDescriptionCharacters
    xmlUCSIsKanbun
    xmlUCSIsKangxiRadicals
    xmlUCSIsKannada
    xmlUCSIsKatakana
    xmlUCSIsKatakanaPhoneticExtensions
    xmlUCSIsKhmer
    xmlUCSIsKhmerSymbols
    xmlUCSIsLao
    xmlUCSIsLatin1Supplement
    xmlUCSIsLatinExtendedA
    xmlUCSIsLatinExtendedAdditional
    xmlUCSIsLatinExtendedB
    xmlUCSIsLetterlikeSymbols
    xmlUCSIsLimbu
    xmlUCSIsLinearBIdeograms
    xmlUCSIsLinearBSyllabary
    xmlUCSIsLowSurrogates
    xmlUCSIsMalayalam
    xmlUCSIsMathematicalAlphanumericSymbols
    xmlUCSIsMathematicalOperators
    xmlUCSIsMiscellaneousMathematicalSymbolsA
    xmlUCSIsMiscellaneousMathematicalSymbolsB
    xmlUCSIsMiscellaneousSymbols
    xmlUCSIsMiscellaneousSymbolsandArrows
    xmlUCSIsMiscellaneousTechnical
    xmlUCSIsMongolian
    xmlUCSIsMusicalSymbols
    xmlUCSIsMyanmar
    xmlUCSIsNumberForms
    xmlUCSIsOgham
    xmlUCSIsOldItalic
    xmlUCSIsOpticalCharacterRecognition
    xmlUCSIsOriya
    xmlUCSIsOsmanya
    xmlUCSIsPhoneticExtensions
    xmlUCSIsPrivateUse
    xmlUCSIsPrivateUseArea
    xmlUCSIsRunic
    xmlUCSIsShavian
    xmlUCSIsSinhala
    xmlUCSIsSmallFormVariants
    xmlUCSIsSpacingModifierLetters
    xmlUCSIsSpecials
    xmlUCSIsSuperscriptsandSubscripts
    xmlUCSIsSupplementalArrowsA
    xmlUCSIsSupplementalArrowsB
    xmlUCSIsSupplementalMathematicalOperators
    xmlUCSIsSupplementaryPrivateUseAreaA
    xmlUCSIsSupplementaryPrivateUseAreaB
    xmlUCSIsSyriac
    xmlUCSIsTagalog
    xmlUCSIsTagbanwa
    xmlUCSIsTags
    xmlUCSIsTaiLe
    xmlUCSIsTaiXuanJingSymbols
    xmlUCSIsTamil
    xmlUCSIsTelugu
    xmlUCSIsThaana
    xmlUCSIsThai
    xmlUCSIsTibetan
    xmlUCSIsUgaritic
    xmlUCSIsUnifiedCanadianAboriginalSyllabics
    xmlUCSIsVariationSelectors
    xmlUCSIsVariationSelectorsSupplement
    xmlUCSIsYiRadicals
    xmlUCSIsYiSyllables
    xmlUCSIsYijingHexagramSymbols
    xmlURI
    xmlURIEscape
    xmlURIEscapeStr
    xmlURIPtr
    xmlURIUnescapeString
    xmlUTF8Charcmp
    xmlUTF8Size
    xmlUTF8Strlen
    xmlUTF8Strloc
    xmlUTF8Strndup
    xmlUTF8Strpos
    xmlUTF8Strsize
    xmlUTF8Strsub
    xmlUnlinkNode
    xmlUnlockLibrary
    xmlUnsetNsProp
    xmlUnsetProp
    xmlValidBuildContentModel
    xmlValidCtxt
    xmlValidCtxtNormalizeAttributeValue
    xmlValidCtxtPtr
    xmlValidGetPotentialChildren
    xmlValidGetValidElements
    xmlValidNormalizeAttributeValue
    xmlValidState
    xmlValidStatePtr
    xmlValidateAttributeDecl
    xmlValidateAttributeValue
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtd
    xmlValidateDtdFinal
    xmlValidateElement
    xmlValidateElementDecl
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateNameValue
    xmlValidateNamesValue
    xmlValidateNmtokenValue
    xmlValidateNmtokensValue
    xmlValidateNotationDecl
    xmlValidateNotationUse
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidatePopElement
    xmlValidatePushCData
    xmlValidatePushElement
    xmlValidateQName
    xmlValidateRoot
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    xmlXIncludeCtxt
    xmlXIncludeCtxtPtr
    xmlXIncludeFreeContext
    xmlXIncludeNewContext
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    xmlXIncludeSetFlags
    xmlXPathAddValues
    xmlXPathAxis
    xmlXPathAxisFunc
    xmlXPathAxisPtr
    xmlXPathBooleanFunction
    xmlXPathCastBooleanToNumber
    xmlXPathCastBooleanToString
    xmlXPathCastNodeSetToBoolean
    xmlXPathCastNodeSetToNumber
    xmlXPathCastNodeSetToString
    xmlXPathCastNodeToNumber
    xmlXPathCastNodeToString
    xmlXPathCastNumberToBoolean
    xmlXPathCastNumberToString
    xmlXPathCastStringToBoolean
    xmlXPathCastStringToNumber
    xmlXPathCastToBoolean
    xmlXPathCastToNumber
    xmlXPathCastToString
    xmlXPathCeilingFunction
    xmlXPathCheckError
    xmlXPathCmpNodes
    xmlXPathCompExpr
    xmlXPathCompExprPtr
    xmlXPathCompareValues
    xmlXPathCompile
    xmlXPathCompiledEval
    xmlXPathCompiledEvalToBoolean
    xmlXPathConcatFunction
    xmlXPathContainsFunction
    xmlXPathContext
    xmlXPathContextPtr
    xmlXPathContextSetCache
    xmlXPathConvertBoolean
    xmlXPathConvertFunc
    xmlXPathConvertNumber
    xmlXPathConvertString
    xmlXPathCountFunction
    xmlXPathCtxtCompile
    xmlXPathDebugDumpCompExpr
    xmlXPathDebugDumpObject
    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathDivValues
    xmlXPathEmptyNodeSet
    xmlXPathEqualValues
    xmlXPathErr
    xmlXPathError
    xmlXPathEval
    xmlXPathEvalExpr
    xmlXPathEvalExpression
    xmlXPathEvalFunc
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPathFalseFunction
    xmlXPathFloorFunction
    xmlXPathFreeCompExpr
    xmlXPathFreeContext
    xmlXPathFreeNodeSet
    xmlXPathFreeNodeSetList
    xmlXPathFreeObject
    xmlXPathFreeParserContext
    xmlXPathFuncLookupFunc
    xmlXPathFuncPtr
    xmlXPathFunct
    xmlXPathFunction
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS
    xmlXPathGetContextNode
    xmlXPathGetDocument
    xmlXPathGetError
    xmlXPathHasSameNodes
    xmlXPathIdFunction
    xmlXPathInit
    xmlXPathIntersection
    xmlXPathIsInf
    xmlXPathIsNaN
    xmlXPathIsNodeType
    xmlXPathLangFunction
    xmlXPathLastFunction
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathLocalNameFunction
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathNAN
    xmlXPathNINF
    xmlXPathNamespaceURIFunction
    xmlXPathNewBoolean
    xmlXPathNewCString
    xmlXPathNewContext
    xmlXPathNewFloat
    xmlXPathNewNodeSet
    xmlXPathNewNodeSetList
    xmlXPathNewParserContext
    xmlXPathNewString
    xmlXPathNewValueTree
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextAttribute
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    xmlXPathNodeEval
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetAddUnique
    xmlXPathNodeSetContains
    xmlXPathNodeSetCreate
    xmlXPathNodeSetDel
    xmlXPathNodeSetFreeNs
    xmlXPathNodeSetGetLength
    xmlXPathNodeSetIsEmpty
    xmlXPathNodeSetItem
    xmlXPathNodeSetMerge
    xmlXPathNodeSetRemove
    xmlXPathNodeSetSort
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathNormalizeFunction
    xmlXPathNotEqualValues
    xmlXPathNotFunction
    xmlXPathNsLookup
    xmlXPathNumberFunction
    xmlXPathObject
    xmlXPathObjectCopy
    xmlXPathObjectPtr
    xmlXPathObjectType
    xmlXPathOrderDocElems
    xmlXPathPINF
    xmlXPathParseNCName
    xmlXPathParseName
    xmlXPathParserContext
    xmlXPathParserContextPtr
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    xmlXPathPositionFunction
    xmlXPathRegisterAllFunctions
    xmlXPathRegisterFunc
    xmlXPathRegisterFuncLookup
    xmlXPathRegisterFuncNS
    xmlXPathRegisterNs
    xmlXPathRegisterVariable
    xmlXPathRegisterVariableLookup
    xmlXPathRegisterVariableNS
    xmlXPathRegisteredFuncsCleanup
    xmlXPathRegisteredNsCleanup
    xmlXPathRegisteredVariablesCleanup
    xmlXPathReturnBoolean
    xmlXPathReturnEmptyNodeSet
    xmlXPathReturnEmptyString
    xmlXPathReturnExternal
    xmlXPathReturnFalse
    xmlXPathReturnNodeSet
    xmlXPathReturnNumber
    xmlXPathReturnString
    xmlXPathReturnTrue
    xmlXPathRoot
    xmlXPathRoundFunction
    xmlXPathSetArityError
    xmlXPathSetContextNode
    xmlXPathSetError
    xmlXPathSetTypeError
    xmlXPathStackIsExternal
    xmlXPathStackIsNodeSet
    xmlXPathStartsWithFunction
    xmlXPathStringEvalNumber
    xmlXPathStringFunction
    xmlXPathStringLengthFunction
    xmlXPathSubValues
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    xmlXPathSubstringFunction
    xmlXPathSumFunction
    xmlXPathTrailing
    xmlXPathTrailingSorted
    xmlXPathTranslateFunction
    xmlXPathTrueFunction
    xmlXPathType
    xmlXPathTypePtr
    xmlXPathValueFlipSign
    xmlXPathVariable
    xmlXPathVariableLookup
    xmlXPathVariableLookupFunc
    xmlXPathVariableLookupNS
    xmlXPathVariablePtr
    xmlXPathWrapCString
    xmlXPathWrapExternal
    xmlXPathWrapNodeSet
    xmlXPathWrapString
    xmlXPatherror
    xmlXPtrBuildNodeList
    xmlXPtrEval
    xmlXPtrEvalRangePredicate
    xmlXPtrFreeLocationSet
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetCreate
    xmlXPtrLocationSetDel
    xmlXPtrLocationSetMerge
    xmlXPtrLocationSetRemove
    xmlXPtrNewCollapsedRange
    xmlXPtrNewContext
    xmlXPtrNewLocationSetNodeSet
    xmlXPtrNewLocationSetNodes
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints
    xmlXPtrRangeToFunction
    xmlXPtrWrapLocationSet

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk26.html0000644000175000017500000007657112134171042016034 0ustar aronaron API Alphabetic Index u-v for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index u-v for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter u:

    ugly
    _xmlParserCtxt
    htmlEntityLookup
    htmlEntityValueLookup
    unary
    xmlXPathValueFlipSign
    unclean
    _xmlURI
    uncompressed
    xmlC14NDocSave
    xmlGetCompressMode
    xmlGetDocCompressMode
    xmlSetCompressMode
    xmlSetDocCompressMode
    under
    xmlBuildRelativeURI
    xmlSearchNs
    xmlSetTreeDoc
    xmlShellDu
    xmlShellWrite
    xmlValidateElement
    underlying
    xmlTextReaderClose
    xmlTextReaderCurrentNode
    understand
    xmlExpParse
    unescape
    xmlURIUnescapeString
    unescaped
    xmlFileOpen
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlURIUnescapeString
    unescaping
    xmlParseURIRaw
    unfriendly
    XML_MAX_LOOKUP_LIMIT
    XML_MAX_NAME_LENGTH
    unicode
    htmlEntityValueLookup
    xmlIsLetter
    unimplemented
    htmlCtxtUseOptions
    xmlCtxtUseOptions
    union
    XML_SCHEMAS_FINAL_DEFAULT_UNION
    XML_SCHEMAS_TYPE_FINAL_UNION
    XML_SCHEMAS_TYPE_VARIETY_ATOMIC
    XML_SCHEMAS_TYPE_VARIETY_UNION
    _xmlSchemaType
    xmlXPathIdFunction
    unique
    _xmlParserInput
    _xmlSchema
    xmlExpGetLanguage
    xmlExpGetStart
    xmlXPathIdFunction
    uniquely
    xmlParseAttributeType
    xmlXPathStringFunction
    uniqueness
    xmlValidateAttributeDecl
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    units
    xmlUTF8Strsub
    unknown
    XML_SCHEMAS_ANYATTR_SKIP
    XML_SCHEMAS_ANY_SKIP
    XML_SCHEMAS_FACET_UNKNOWN
    htmlCtxtUseOptions
    xmlCtxtUseOptions
    xmlHasFeature
    xmlUCSIsBlock
    xmlUCSIsCat
    unless
    htmlSAXParseDoc
    htmlSAXParseFile
    xmlDictCleanup
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlGetNoNsProp
    xmlGetNsProp
    xmlGetProp
    xmlHasNsProp
    xmlHasProp
    xmlXPathNextNamespace
    unliked
    xmlDOMWrapAdoptNode
    unlink
    xmlFreeNode
    xmlUnlinkNode
    unlinked
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlAddSibling
    xmlNewEntity
    xmlReplaceNode
    xmlUnlinkNode
    unload
    xmlModuleClose
    xmlModuleFree
    unloaded
    xmlModuleClose
    unlock
    xmlMutexUnlock
    xmlRMutexUnlock
    unparsed
    _xmlEntity
    unparsedEntityDecl
    unparsedEntityDeclSAXFunc
    xmlLoadExternalEntity
    xmlParseAttributeType
    xmlParseEntityRef
    xmlParserHandleReference
    xmlSAX2UnparsedEntityDecl
    unplug
    xmlSchemaSAXPlug
    unpredictable
    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    unpredictiable
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    unregisters
    xmlCleanupCharEncodingHandlers
    xmlXPathRegisterFunc
    xmlXPathRegisterFuncNS
    xmlXPathRegisterNs
    xmlXPathRegisterVariable
    xmlXPathRegisterVariableNS
    unsafe
    xmlSprintfElementContent
    unsigned
    c
    xmlURIUnescapeString
    unsupported
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    until
    xmlBufferCreateStatic
    xmlParserInputBufferCreateStatic
    xmlSearchNs
    xmlSearchNsByHref
    xmlTextReaderExpand
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderSetSchema
    xmlXPathAxisFunc
    unused
    ATTRIBUTE_UNUSED
    _xmlEntity
    _xmlSAXHandler
    _xmlSAXHandlerV1
    _xmlSchema
    _xmlXPathContext
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    xmlSchemaValidateFile
    xmlShellBase
    xmlShellCat
    xmlShellDir
    xmlShellDu
    xmlShellList
    xmlShellLoad
    xmlShellPwd
    xmlShellSave
    xmlShellValidate
    xmlShellWrite
    update
    xmlCheckHTTPInput
    xmlNanoFTPUpdateURL
    xmlSetListDoc
    xmlSetTreeDoc
    xmlSplitQName3
    xmlValidCtxtNormalizeAttributeValue
    updated
    xmlCatalogAddLocal
    xmlGetFeaturesList
    xmlNamespaceParseQName
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlSplitQName
    xmlSplitQName2
    upon
    checkNamespace
    xlinkNodeDetectFunc
    upper
    XML_MAX_LOOKUP_LIMIT
    xmlExpNewRange
    xmlIsRef
    uri
    xmlNormalizeWindowsPath
    usage
    XML_MAX_NAME_LENGTH
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    used:
    XML_DEFAULT_VERSION
    used?
    _xmlSchemaAttribute
    _xmlSchemaElement
    useful
    xmlGcMemGet
    xmlGcMemSetup
    xmlMemDisplayLast
    xmlNewRMutex
    xmlParserInputBufferCreateStatic
    useless
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlSAX2SetDocumentLocator
    userData
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    users
    _xmlSchema
    uses
    htmlNodeStatus
    usual
    xmlExpParse
    usually
    LIBXML_MODULE_EXTENSION
    c
    xmlExpExpDerive
    xmlInitCharEncodingHandlers
    xmlSchemaGetPredefinedType
    xmlTextReaderGetParserProp
    xmlTextReaderSetParserProp
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    utf8
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc

    Letter v:

    val1
    xmlXPtrLocationSetMerge
    valgrind
    xmlCleanupParser
    xmlCleanupThreads
    validated
    xmlCharInRange
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    validates
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidatePredefinedType
    xmlValidateDocument
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateQName
    validating
    _xmlAttr
    _xmlElement
    _xmlValidCtxt
    xmlKeepBlanksDefault
    xmlRelaxNGValidatePushElement
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    validator
    xmlSchemaValidityLocatorFunc
    validity
    _xmlParserCtxt
    _xmlValidCtxt
    xlinkIsLink
    xmlGenericErrorFunc
    xmlParseAttValue
    xmlParserValidityError
    xmlParserValidityWarning
    xmlTextReaderIsValid
    xmlURIEscape
    xmlValidGetValidElements
    xmlValidateDocumentFinal
    xmlValidateNotationDecl
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    value:
    xmlCheckUTF8
    values:
    xmlSetCompressMode
    xmlSetDocCompressMode
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    varags
    xmlGenericErrorFunc
    vararg
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    variables
    XML_XPATH_NOVAR
    _xmlXPathContext
    xmlNanoFTPProxy
    xmlXPathRegisteredNsCleanup
    xmlXPathRegisteredVariablesCleanup
    variant
    xmlCheckLanguageID
    xmlDetectCharEncoding
    variants
    xmlCheckLanguageID
    variety
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    XML_SCHEMAS_TYPE_VARIETY_ATOMIC
    XML_SCHEMAS_TYPE_VARIETY_LIST
    XML_SCHEMAS_TYPE_VARIETY_UNION
    various
    _xmlDOMWrapCtxt
    versions
    htmlParseElement
    very
    _htmlElemDesc
    _xmlParserInput
    xmlCharEncFirstLine
    xmlCleanupParser
    xmlCleanupThreads
    via
    xmlNanoHTTPFetch
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    view
    xmlShell
    violated
    XML_CAST_FPTR
    visible
    xmlC14NExecute
    xmlC14NIsVisibleCallback
    void
    XML_CAST_FPTR
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    volume
    _xmlParserCtxt

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk7.html0000644000175000017500000010011712134171042015733 0ustar aronaron API Alphabetic Index S-S for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index S-S for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter S:

    SAX1
    LIBXML_SAX1_ENABLED
    SAX2
    XML_SAX2_MAGIC
    endElementNsSAX2Func
    initdocbDefaultSAXHandler
    inithtmlDefaultSAXHandler
    initxmlDefaultSAXHandler
    startElementNsSAX2Func
    xmlDefaultSAXHandlerInit
    xmlSAX2EndElementNs
    xmlSAX2InitDefaultSAXHandler
    xmlSAX2InitDocbDefaultSAXHandler
    xmlSAX2InitHtmlDefaultSAXHandler
    xmlSAX2StartElementNs
    xmlSchemaValidateStream
    SAX::substituteEntities
    xmlSubstituteEntitiesDefault
    SDDecl
    xmlParseSDDecl
    SDDecl?
    xmlParseXMLDecl
    SEQ
    _xmlElementContent
    SGML
    LIBXML_DOCB_ENABLED
    docbCreateFileParserCtxt
    docbCreatePushParserCtxt
    docbEncodeEntities
    docbFreeParserCtxt
    docbParseDoc
    docbParseDocument
    docbParseFile
    docbSAXParseDoc
    docbSAXParseFile
    xmlCatalogConvert
    xmlCatalogIsEmpty
    xmlConvertSGMLCatalog
    xmlLoadACatalog
    xmlLoadCatalog
    xmlLoadSGMLSuperCatalog
    xmlNewCatalog
    xmlParseComment
    SGMLSOURCE
    getPublicId
    xmlSAX2GetPublicId
    SITE
    xmlNanoFTPProxy
    STag
    htmlParseElement
    xmlParseElement
    xmlParseStartTag
    SYSTEM
    _xmlDtd
    _xmlEntity
    _xmlParserCtxt
    externalSubset
    externalSubsetSAXFunc
    internalSubset
    internalSubsetSAXFunc
    xmlParseExternalID
    xmlParseNotationDecl
    xmlSAX2ExternalSubset
    xmlSAX2InternalSubset
    Same
    IS_PUBIDCHAR_CH
    Save
    xmlCopyError
    xmlSaveDoc
    xmlSaveTree
    xmlSaveUri
    Scan
    xmlHashCopy
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    Schema
    xmlSchemaDump
    xmlSchemaFree
    xmlSchemaFreeFacet
    xmlSchemaFreeType
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaGetCanonValue
    xmlSchemaParse
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    Schemas
    LIBXML_SCHEMAS_ENABLED
    xmlRegexpCompile
    xmlRelaxNGCleanupTypes
    xmlSchemaCleanupTypes
    xmlSchemaFreeValue
    xmlSchemaGetPredefinedType
    xmlSchemaInitTypes
    xmlSchemaNewDocParserCtxt
    xmlSchemaNewMemParserCtxt
    xmlSchemaNewParserCtxt
    xmlSchemaNewValidCtxt
    Schematron
    LIBXML_SCHEMATRON_ENABLED
    xmlSchematronFree
    xmlSchematronParse
    xmlSchematronSetValidStructuredErrors
    xmlSchematronValidityErrorFunc
    xmlSchematronValidityWarningFunc
    Schematrons
    xmlSchematronNewDocParserCtxt
    xmlSchematronNewMemParserCtxt
    xmlSchematronNewParserCtxt
    xmlSchematronNewValidCtxt
    Script
    htmlIsScriptAttribute
    Search
    xmlFindCharEncodingHandler
    xmlGetCharEncodingHandler
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlGetID
    xmlGetLastChild
    xmlGetNoNsProp
    xmlGetNsList
    xmlGetNsProp
    xmlGetProp
    xmlHasNsProp
    xmlHasProp
    xmlIsMixedElement
    xmlListReverseSearch
    xmlListSearch
    xmlSearchNs
    xmlSearchNsByHref
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS
    xmlXPathNsLookup
    xmlXPathVariableLookup
    xmlXPathVariableLookupNS
    Searches
    xmlNodeGetBase
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    Second
    xmlCheckLanguageID
    Section
    xmlGetCharEncodingName
    xmlNormalizeURIPath
    See
    xmlCleanupParser
    xmlLinkGetData
    xmlParseNotationDecl
    xmlTextReaderByteConsumed
    Semi
    xmlRelaxParserSetFlag
    Send
    xmlNanoFTPQuit
    Serialize
    xmlAttrSerializeTxtContent
    xmlExpDump
    Sets
    htmlSetMetaEncoding
    xmlBufferSetAllocationScheme
    xmlSchemaSetValidOptions
    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathHasSameNodes
    xmlXPathIntersection
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathSetContextNode
    xmlXPathTrailing
    xmlXPathTrailingSorted
    Setting
    xmlSchemaValidateSetLocator
    Setup
    xmlNanoFTPProxy
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlReaderNewWalker
    xmlSetupParserForBuffer
    xmlTextReaderSetup
    Shavian
    xmlUCSIsShavian
    Shell
    xmlShellReadlineFunc
    Shema
    xmlRelaxNGParse
    xmlSchemaParse
    xmlSchematronParse
    Should
    _xmlParserCtxt
    xmlGcMemSetup
    xmlMemSetup
    xmlNanoFTPScanProxy
    xmlNanoHTTPScanProxy
    xmlStrEqual
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    Show
    xmlShellPwd
    Signature
    xmlC14NIsVisibleCallback
    xmlDeregisterNodeFunc
    xmlFreeFunc
    xmlGenericErrorFunc
    xmlMallocFunc
    xmlOutputBufferCreateFilenameFunc
    xmlParserInputBufferCreateFilenameFunc
    xmlReallocFunc
    xmlRegisterNodeFunc
    xmlRelaxNGValidityErrorFunc
    xmlRelaxNGValidityWarningFunc
    xmlSchemaValidityErrorFunc
    xmlSchemaValidityWarningFunc
    xmlSchematronValidityErrorFunc
    xmlSchematronValidityWarningFunc
    xmlStrdupFunc
    xmlStructuredErrorFunc
    xmlTextReaderErrorFunc
    Similarly
    xmlParseEntityRef
    Simply
    xmlCreateURI
    Since
    xmlNodeDump
    xmlStrcat
    xmlStrdup
    xmlTextReaderNormalization
    Single
    xmlCheckLanguageID
    Sinhala
    xmlUCSIsSinhala
    Skip
    XML_SCHEMAS_ANYATTR_SKIP
    XML_SCHEMAS_ANY_SKIP
    xmlNextChar
    xmlParseComment
    xmlTextReaderNext
    xmlTextReaderNextSibling
    Skips
    MOVETO_ENDTAG
    MOVETO_STARTTAG
    SKIP_EOL
    SmallFormVariants
    xmlUCSIsSmallFormVariants
    Some
    _htmlElemDesc
    xmlBuildRelativeURI
    xmlSchemaGetCanonValue
    Sort
    xmlListSort
    xmlXPathNodeSetSort
    SpacingModifierLetters
    xmlUCSIsSpacingModifierLetters
    Spec
    xmlParseStartTag
    Special
    XML_CTXT_FINISH_DTD_0
    XML_CTXT_FINISH_DTD_1
    XML_SAX2_MAGIC
    Specials
    xmlUCSIsSpecials
    Speed
    _xmlParserCtxt
    Standalone
    xmlParseSDDecl
    xmlValidCtxtNormalizeAttributeValue
    Start
    xmlNanoFTPOpen
    xmlTextWriterStartAttribute
    xmlTextWriterStartAttributeNS
    xmlTextWriterStartCDATA
    xmlTextWriterStartComment
    xmlTextWriterStartDTD
    xmlTextWriterStartDTDAttlist
    xmlTextWriterStartDTDElement
    xmlTextWriterStartDTDEntity
    xmlTextWriterStartDocument
    xmlTextWriterStartElement
    xmlTextWriterStartElementNS
    xmlTextWriterStartPI
    StringType
    xmlParseAttributeType
    Strings
    xmlXPathStringLengthFunction
    xmlXPathSubstringFunction
    Subcode
    xmlCheckLanguageID
    Subset
    xmlParseMarkupDecl
    Super
    xmlLoadSGMLSuperCatalog
    SuperscriptsandSubscripts
    xmlUCSIsSuperscriptsandSubscripts
    SupplementalArrows-A
    xmlUCSIsSupplementalArrowsA
    SupplementalArrows-B
    xmlUCSIsSupplementalArrowsB
    SupplementalMathematicalOperators
    xmlUCSIsSupplementalMathematicalOperators
    SupplementaryPrivateUseArea-A
    xmlUCSIsSupplementaryPrivateUseAreaA
    SupplementaryPrivateUseArea-B
    xmlUCSIsSupplementaryPrivateUseAreaB
    Syriac
    xmlUCSIsSyriac
    System
    _xmlNotation
    xmlExternalEntityLoader
    xmlNoNetExternalEntityLoader
    xmlParseCtxtExternalEntity
    xmlParseExternalEntity
    xmlTextReaderNodeType
    SystemLiteral
    xmlNamespaceParseNSDef
    xmlParseExternalID
    xmlParseNotationDecl
    xmlParseSystemLiteral

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/encoding.html0000644000175000017500000004566412124524424016014 0ustar aronaron Encodings support
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Encodings support

    Main Menu
    Related links

    If you are not really familiar with Internationalization (usual shortcut is I18N) , Unicode, characters and glyphs, I suggest you read a presentation by Tim Bray on Unicode and why you should care about it.

    If you don't understand why it does not make sense to have a string without knowing what encoding it uses, then as Joel Spolsky said please do not write another line of code until you finish reading that article.. It is a prerequisite to understand this page, and avoid a lot of problems with libxml2, XML or text processing in general.

    Table of Content:

    1. What does internationalization support mean ?
    2. The internal encoding, how and why
    3. How is it implemented ?
    4. Default supported encodings
    5. How to extend the existing support

    What does internationalization support mean ?

    XML was designed from the start to allow the support of any character set by using Unicode. Any conformant XML parser has to support the UTF-8 and UTF-16 default encodings which can both express the full unicode ranges. UTF8 is a variable length encoding whose greatest points are to reuse the same encoding for ASCII and to save space for Western encodings, but it is a bit more complex to handle in practice. UTF-16 use 2 bytes per character (and sometimes combines two pairs), it makes implementation easier, but looks a bit overkill for Western languages encoding. Moreover the XML specification allows the document to be encoded in other encodings at the condition that they are clearly labeled as such. For example the following is a wellformed XML document encoded in ISO-8859-1 and using accentuated letters that we French like for both markup and content:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <très>là </très>

    Having internationalization support in libxml2 means the following:

    • the document is properly parsed
    • information about it's encoding is saved
    • it can be modified
    • it can be saved in its original encoding
    • it can also be saved in another encoding supported by libxml2 (for example straight UTF8 or even an ASCII form)

    Another very important point is that the whole libxml2 API, with the exception of a few routines to read with a specific encoding or save to a specific encoding, is completely agnostic about the original encoding of the document.

    It should be noted too that the HTML parser embedded in libxml2 now obey the same rules too, the following document will be (as of 2.2.2) handled in an internationalized fashion by libxml2 too:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
                          "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html lang="fr">
    <head>
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
    </head>
    <body>
    <p>W3C crée des standards pour le Web.</body>
    </html>

    The internal encoding, how and why

    One of the core decisions was to force all documents to be converted to a default internal encoding, and that encoding to be UTF-8, here are the rationales for those choices:

    • keeping the native encoding in the internal form would force the libxml users (or the code associated) to be fully aware of the encoding of the original document, for examples when adding a text node to a document, the content would have to be provided in the document encoding, i.e. the client code would have to check it before hand, make sure it's conformant to the encoding, etc ... Very hard in practice, though in some specific cases this may make sense.
    • the second decision was which encoding. From the XML spec only UTF8 and UTF16 really makes sense as being the two only encodings for which there is mandatory support. UCS-4 (32 bits fixed size encoding) could be considered an intelligent choice too since it's a direct Unicode mapping support. I selected UTF-8 on the basis of efficiency and compatibility with surrounding software:
      • UTF-8 while a bit more complex to convert from/to (i.e. slightly more costly to import and export CPU wise) is also far more compact than UTF-16 (and UCS-4) for a majority of the documents I see it used for right now (RPM RDF catalogs, advogato data, various configuration file formats, etc.) and the key point for today's computer architecture is efficient uses of caches. If one nearly double the memory requirement to store the same amount of data, this will trash caches (main memory/external caches/internal caches) and my take is that this harms the system far more than the CPU requirements needed for the conversion to UTF-8
      • Most of libxml2 version 1 users were using it with straight ASCII most of the time, doing the conversion with an internal encoding requiring all their code to be rewritten was a serious show-stopper for using UTF-16 or UCS-4.
      • UTF-8 is being used as the de-facto internal encoding standard for related code like the pango upcoming Gnome text widget, and a lot of Unix code (yet another place where Unix programmer base takes a different approach from Microsoft - they are using UTF-16)

    What does this mean in practice for the libxml2 user:

    • xmlChar, the libxml2 data type is a byte, those bytes must be assembled as UTF-8 valid strings. The proper way to terminate an xmlChar * string is simply to append 0 byte, as usual.
    • One just need to make sure that when using chars outside the ASCII set, the values has been properly converted to UTF-8

    How is it implemented ?

    Let's describe how all this works within libxml, basically the I18N (internationalization) support get triggered only during I/O operation, i.e. when reading a document or saving one. Let's look first at the reading sequence:

    1. when a document is processed, we usually don't know the encoding, a simple heuristic allows to detect UTF-16 and UCS-4 from encodings where the ASCII range (0-0x7F) maps with ASCII
    2. the xml declaration if available is parsed, including the encoding declaration. At that point, if the autodetected encoding is different from the one declared a call to xmlSwitchEncoding() is issued.
    3. If there is no encoding declaration, then the input has to be in either UTF-8 or UTF-16, if it is not then at some point when processing the input, the converter/checker of UTF-8 form will raise an encoding error. You may end-up with a garbled document, or no document at all ! Example:
      ~/XML -> ./xmllint err.xml 
      err.xml:1: error: Input is not proper UTF-8, indicate encoding !
      <très>là </très>
         ^
      err.xml:1: error: Bytes: 0xE8 0x73 0x3E 0x6C
      <très>là </très>
         ^
    4. xmlSwitchEncoding() does an encoding name lookup, canonicalize it, and then search the default registered encoding converters for that encoding. If it's not within the default set and iconv() support has been compiled it, it will ask iconv for such an encoder. If this fails then the parser will report an error and stops processing:
      ~/XML -> ./xmllint err2.xml 
      err2.xml:1: error: Unsupported encoding UnsupportedEnc
      <?xml version="1.0" encoding="UnsupportedEnc"?>
                                                   ^
    5. From that point the encoder processes progressively the input (it is plugged as a front-end to the I/O module) for that entity. It captures and converts on-the-fly the document to be parsed to UTF-8. The parser itself just does UTF-8 checking of this input and process it transparently. The only difference is that the encoding information has been added to the parsing context (more precisely to the input corresponding to this entity).
    6. The result (when using DOM) is an internal form completely in UTF-8 with just an encoding information on the document node.

    Ok then what happens when saving the document (assuming you collected/built an xmlDoc DOM like structure) ? It depends on the function called, xmlSaveFile() will just try to save in the original encoding, while xmlSaveFileTo() and xmlSaveFileEnc() can optionally save to a given encoding:

    1. if no encoding is given, libxml2 will look for an encoding value associated to the document and if it exists will try to save to that encoding,

      otherwise everything is written in the internal form, i.e. UTF-8

    2. so if an encoding was specified, either at the API level or on the document, libxml2 will again canonicalize the encoding name, lookup for a converter in the registered set or through iconv. If not found the function will return an error code
    3. the converter is placed before the I/O buffer layer, as another kind of buffer, then libxml2 will simply push the UTF-8 serialization to through that buffer, which will then progressively be converted and pushed onto the I/O layer.
    4. It is possible that the converter code fails on some input, for example trying to push an UTF-8 encoded Chinese character through the UTF-8 to ISO-8859-1 converter won't work. Since the encoders are progressive they will just report the error and the number of bytes converted, at that point libxml2 will decode the offending character, remove it from the buffer and replace it with the associated charRef encoding &#123; and resume the conversion. This guarantees that any document will be saved without losses (except for markup names where this is not legal, this is a problem in the current version, in practice avoid using non-ascii characters for tag or attribute names). A special "ascii" encoding name is used to save documents to a pure ascii form can be used when portability is really crucial

    Here are a few examples based on the same test document and assumin a terminal using ISO-8859-1 as the text encoding:

    ~/XML -> ./xmllint isolat1 
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <très>là</très>
    ~/XML -> ./xmllint --encode UTF-8 isolat1 
    <?xml version="1.0" encoding="UTF-8"?>
    <très>là  </très>
    ~/XML -> 

    The same processing is applied (and reuse most of the code) for HTML I18N processing. Looking up and modifying the content encoding is a bit more difficult since it is located in a <meta> tag under the <head>, so a couple of functions htmlGetMetaEncoding() and htmlSetMetaEncoding() have been provided. The parser also attempts to switch encoding on the fly when detecting such a tag on input. Except for that the processing is the same (and again reuses the same code).

    Default supported encodings

    libxml2 has a set of default converters for the following encodings (located in encoding.c):

    1. UTF-8 is supported by default (null handlers)
    2. UTF-16, both little and big endian
    3. ISO-Latin-1 (ISO-8859-1) covering most western languages
    4. ASCII, useful mostly for saving
    5. HTML, a specific handler for the conversion of UTF-8 to ASCII with HTML predefined entities like &copy; for the Copyright sign.

    More over when compiled on an Unix platform with iconv support the full set of encodings supported by iconv can be instantly be used by libxml. On a linux machine with glibc-2.1 the list of supported encodings and aliases fill 3 full pages, and include UCS-4, the full set of ISO-Latin encodings, and the various Japanese ones.

    To convert from the UTF-8 values returned from the API to another encoding then it is possible to use the function provided from the encoding module like UTF8Toisolat1, or use the POSIX iconv() API directly.

    Encoding aliases

    From 2.2.3, libxml2 has support to register encoding names aliases. The goal is to be able to parse document whose encoding is supported but where the name differs (for example from the default set of names accepted by iconv). The following functions allow to register and handle new aliases for existing encodings. Once registered libxml2 will automatically lookup the aliases when handling a document:

    • int xmlAddEncodingAlias(const char *name, const char *alias);
    • int xmlDelEncodingAlias(const char *alias);
    • const char * xmlGetEncodingAlias(const char *alias);
    • void xmlCleanupEncodingAliases(void);

    How to extend the existing support

    Well adding support for new encoding, or overriding one of the encoders (assuming it is buggy) should not be hard, just write input and output conversion routines to/from UTF-8, and register them using xmlNewCharEncodingHandler(name, xxxToUTF8, UTF8Toxxx), and they will be called automatically if the parser(s) encounter such an encoding name (register it uppercase, this will help). The description of the encoders, their arguments and expected return values are described in the encoding.h header.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/wiki.xsl0000644000175000017500000004643412113312342015017 0ustar aronaron wiki ../
        #define 
        
        Variable 
        
          
        
         
        
        
        
    
    
        
        
          
    	Enum 
    	
    	
    
          
          
    	Typedef 
    	
    	  
    	
    	 
    	
    	
    
          
        
        

    Enum

          Enum 
          
           {
    
          
            
                
            
             = 
            
            
    	   : 
    	  
    	    
    	  
            
            
    
          
          }
    
        
        Structure 
    The content of this structure is not made public by the API.

    Structure

        Structure 
    { The content of this structure is not made public by the API. : }

    Macro:

    #define 

        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )
        Function type: 
        
        
    
        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )

    Function type:

        Function type: 
        
        
    
        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )

    :
    Returns:

    Function:

        
          
        
        	
        
        
          	
        
        
          	
        
        	(
        
          void
        
        
          
            
          
           
          
          
            , 
    )

    :
    Returns:

    This module is deprecated

    Module from

    Table of Contents

    Description

    Table of Contents

    Description




    Reference Manual for
    libxml2-2.9.1+dfsg1/doc/symbols.xml0000644000175000017500000030045412134171025015535 0ustar aronaron xmlBoolToText xmlDebugDumpAttr xmlDebugDumpAttrList xmlDebugDumpDTD xmlDebugDumpDocument xmlDebugDumpDocumentHead xmlDebugDumpEntities xmlDebugDumpNode xmlDebugDumpNodeList xmlDebugDumpOneNode xmlDebugDumpString xmlLsCountNode xmlLsOneNode xmlShell xmlShellBase xmlShellCat xmlShellDir xmlShellDu xmlShellList xmlShellLoad xmlShellPrintNode xmlShellPrintXPathError xmlShellPrintXPathResult xmlShellPwd xmlShellSave xmlShellValidate xmlShellWrite xmlXPtrBuildNodeList xmlXPtrEval xmlXPtrEvalRangePredicate xmlXPtrFreeLocationSet xmlXPtrLocationSetAdd xmlXPtrLocationSetCreate xmlXPtrLocationSetDel xmlXPtrLocationSetMerge xmlXPtrLocationSetRemove xmlXPtrNewCollapsedRange xmlXPtrNewContext xmlXPtrNewLocationSetNodeSet xmlXPtrNewLocationSetNodes xmlXPtrNewRange xmlXPtrNewRangeNodeObject xmlXPtrNewRangeNodePoint xmlXPtrNewRangeNodes xmlXPtrNewRangePointNode xmlXPtrNewRangePoints xmlXPtrRangeToFunction xmlXPtrWrapLocationSet attribute attributeDecl cdataBlock characters checkNamespace comment docbDefaultSAXHandlerInit elementDecl endDocument endElement entityDecl externalSubset getColumnNumber getEntity getLineNumber getNamespace getParameterEntity getPublicId getSystemId globalNamespace hasExternalSubset hasInternalSubset htmlDefaultSAXHandlerInit ignorableWhitespace initdocbDefaultSAXHandler inithtmlDefaultSAXHandler initxmlDefaultSAXHandler internalSubset isStandalone namespaceDecl notationDecl processingInstruction reference resolveEntity setDocumentLocator setNamespace startDocument startElement unparsedEntityDecl xmlDefaultSAXHandlerInit htmlCreateFileParserCtxt htmlInitAutoClose inputPop inputPush namePop namePush nodePop nodePush xmlCheckLanguageID xmlCopyChar xmlCopyCharMultiByte xmlCreateEntityParserCtxt xmlCreateFileParserCtxt xmlCreateMemoryParserCtxt xmlCurrentChar xmlDecodeEntities xmlFreeInputStream xmlHandleEntity xmlIsBaseChar xmlIsBlank xmlIsChar xmlIsCombining xmlIsDigit xmlIsExtender xmlIsIdeographic xmlIsLetter xmlIsPubidChar xmlNamespaceParseNCName xmlNamespaceParseNSDef xmlNamespaceParseQName xmlNewEntityInputStream xmlNewInputFromFile xmlNewInputStream xmlNewParserCtxt xmlNewStringInputStream xmlNextChar xmlParseAttValue xmlParseAttribute xmlParseAttributeListDecl xmlParseAttributeType xmlParseCDSect xmlParseCharData xmlParseCharRef xmlParseComment xmlParseContent xmlParseDefaultDecl xmlParseDocTypeDecl xmlParseElement xmlParseElementChildrenContentDecl xmlParseElementContentDecl xmlParseElementDecl xmlParseElementMixedContentDecl xmlParseEncName xmlParseEncodingDecl xmlParseEndTag xmlParseEntityDecl xmlParseEntityRef xmlParseEntityValue xmlParseEnumeratedType xmlParseEnumerationType xmlParseExternalID xmlParseExternalSubset xmlParseMarkupDecl xmlParseMisc xmlParseName xmlParseNamespace xmlParseNmtoken xmlParseNotationDecl xmlParseNotationType xmlParsePEReference xmlParsePI xmlParsePITarget xmlParsePubidLiteral xmlParseQuotedString xmlParseReference xmlParseSDDecl xmlParseStartTag xmlParseSystemLiteral xmlParseTextDecl xmlParseVersionInfo xmlParseVersionNum xmlParseXMLDecl xmlParserHandlePEReference xmlParserHandleReference xmlParserInputShrink xmlPopInput xmlPushInput xmlScanName xmlSetEntityReferenceFunc xmlSkipBlankChars xmlSplitQName xmlStringComment xmlStringCurrentChar xmlStringDecodeEntities xmlStringText xmlStringTextNoenc xmlSwitchEncoding xmlSwitchToEncoding xmlC14NDocDumpMemory xmlC14NDocSave xmlC14NDocSaveTo xmlC14NExecute xmlACatalogAdd xmlACatalogDump xmlACatalogRemove xmlACatalogResolve xmlACatalogResolvePublic xmlACatalogResolveSystem xmlACatalogResolveURI xmlCatalogAdd xmlCatalogAddLocal xmlCatalogCleanup xmlCatalogConvert xmlCatalogDump xmlCatalogFreeLocal xmlCatalogGetDefaults xmlCatalogGetPublic xmlCatalogGetSystem xmlCatalogIsEmpty xmlCatalogLocalResolve xmlCatalogLocalResolveURI xmlCatalogRemove xmlCatalogResolve xmlCatalogResolvePublic xmlCatalogResolveSystem xmlCatalogResolveURI xmlCatalogSetDebug xmlCatalogSetDefaultPrefer xmlCatalogSetDefaults xmlConvertSGMLCatalog xmlFreeCatalog xmlInitializeCatalog xmlLoadACatalog xmlLoadCatalog xmlLoadCatalogs xmlLoadSGMLSuperCatalog xmlNewCatalog xmlParseCatalogFile valuePop valuePush xmlXPathAddValues xmlXPathBooleanFunction xmlXPathCeilingFunction xmlXPathCompareValues xmlXPathConcatFunction xmlXPathContainsFunction xmlXPathCountFunction xmlXPathDebugDumpCompExpr xmlXPathDebugDumpObject xmlXPathDifference xmlXPathDistinct xmlXPathDistinctSorted xmlXPathDivValues xmlXPathEqualValues xmlXPathEvalExpr xmlXPathEvaluatePredicateResult xmlXPathFalseFunction xmlXPathFloorFunction xmlXPathFreeParserContext xmlXPathFunctionLookup xmlXPathFunctionLookupNS xmlXPathHasSameNodes xmlXPathIdFunction xmlXPathIntersection xmlXPathIsNodeType xmlXPathLangFunction xmlXPathLastFunction xmlXPathLeading xmlXPathLeadingSorted xmlXPathLocalNameFunction xmlXPathModValues xmlXPathMultValues xmlXPathNamespaceURIFunction xmlXPathNewBoolean xmlXPathNewCString xmlXPathNewFloat xmlXPathNewNodeSet xmlXPathNewNodeSetList xmlXPathNewParserContext xmlXPathNewString xmlXPathNewValueTree xmlXPathNextAncestor xmlXPathNextAncestorOrSelf xmlXPathNextAttribute xmlXPathNextChild xmlXPathNextDescendant xmlXPathNextDescendantOrSelf xmlXPathNextFollowing xmlXPathNextFollowingSibling xmlXPathNextNamespace xmlXPathNextParent xmlXPathNextPreceding xmlXPathNextPrecedingSibling xmlXPathNextSelf xmlXPathNodeLeading xmlXPathNodeLeadingSorted xmlXPathNodeSetAdd xmlXPathNodeSetAddNs xmlXPathNodeSetAddUnique xmlXPathNodeSetContains xmlXPathNodeSetDel xmlXPathNodeSetFreeNs xmlXPathNodeSetMerge xmlXPathNodeSetRemove xmlXPathNodeSetSort xmlXPathNodeTrailing xmlXPathNodeTrailingSorted xmlXPathNormalizeFunction xmlXPathNotEqualValues xmlXPathNotFunction xmlXPathNsLookup xmlXPathNumberFunction xmlXPathParseNCName xmlXPathParseName xmlXPathPopBoolean xmlXPathPopExternal xmlXPathPopNodeSet xmlXPathPopNumber xmlXPathPopString xmlXPathPositionFunction xmlXPathRegisterAllFunctions xmlXPathRegisterFunc xmlXPathRegisterFuncLookup xmlXPathRegisterFuncNS xmlXPathRegisterNs xmlXPathRegisterVariable xmlXPathRegisterVariableLookup xmlXPathRegisterVariableNS xmlXPathRegisteredFuncsCleanup xmlXPathRegisteredNsCleanup xmlXPathRegisteredVariablesCleanup xmlXPathRoot xmlXPathRoundFunction xmlXPathStartsWithFunction xmlXPathStringEvalNumber xmlXPathStringFunction xmlXPathStringLengthFunction xmlXPathSubValues xmlXPathSubstringAfterFunction xmlXPathSubstringBeforeFunction xmlXPathSubstringFunction xmlXPathSumFunction xmlXPathTrailing xmlXPathTrailingSorted xmlXPathTranslateFunction xmlXPathTrueFunction xmlXPathValueFlipSign xmlXPathVariableLookup xmlXPathVariableLookupNS xmlXPathWrapCString xmlXPathWrapExternal xmlXPathWrapNodeSet xmlXPathWrapString xmlXPatherror xmlAutomataCompile xmlAutomataGetInitState xmlAutomataIsDeterminist xmlAutomataNewAllTrans xmlAutomataNewCountTrans xmlAutomataNewCountedTrans xmlAutomataNewCounter xmlAutomataNewCounterTrans xmlAutomataNewEpsilon xmlAutomataNewOnceTrans xmlAutomataNewState xmlAutomataNewTransition xmlAutomataSetFinalState xmlFreeAutomata xmlNewAutomata htmlDocContentDumpFormatOutput htmlDocContentDumpOutput htmlDocDump htmlDocDumpMemory htmlGetMetaEncoding htmlIsBooleanAttr htmlNewDoc htmlNewDocNoDtD htmlNodeDump htmlNodeDumpFile htmlNodeDumpFileFormat htmlNodeDumpFormatOutput htmlNodeDumpOutput htmlSaveFile htmlSaveFileEnc htmlSaveFileFormat htmlSetMetaEncoding xmlNanoFTPCheckResponse xmlNanoFTPCleanup xmlNanoFTPClose xmlNanoFTPCloseConnection xmlNanoFTPConnect xmlNanoFTPConnectTo xmlNanoFTPCwd xmlNanoFTPFreeCtxt xmlNanoFTPGet xmlNanoFTPGetConnection xmlNanoFTPGetResponse xmlNanoFTPGetSocket xmlNanoFTPInit xmlNanoFTPList xmlNanoFTPNewCtxt xmlNanoFTPOpen xmlNanoFTPProxy xmlNanoFTPQuit xmlNanoFTPRead xmlNanoFTPScanProxy xmlNanoFTPUpdateURL docbCreateFileParserCtxt docbCreatePushParserCtxt docbEncodeEntities docbFreeParserCtxt docbParseChunk docbParseDoc docbParseDocument docbParseFile docbSAXParseDoc docbSAXParseFile xmlXPathCastBooleanToNumber xmlXPathCastBooleanToString xmlXPathCastNodeSetToBoolean xmlXPathCastNodeSetToNumber xmlXPathCastNodeSetToString xmlXPathCastNodeToNumber xmlXPathCastNodeToString xmlXPathCastNumberToBoolean xmlXPathCastNumberToString xmlXPathCastStringToBoolean xmlXPathCastStringToNumber xmlXPathCastToBoolean xmlXPathCastToNumber xmlXPathCastToString xmlXPathCmpNodes xmlXPathCompile xmlXPathCompiledEval xmlXPathConvertBoolean xmlXPathConvertNumber xmlXPathConvertString xmlXPathEval xmlXPathEvalExpression xmlXPathEvalPredicate xmlXPathFreeCompExpr xmlXPathFreeContext xmlXPathFreeNodeSet xmlXPathFreeNodeSetList xmlXPathFreeObject xmlXPathInit xmlXPathIsInf xmlXPathIsNaN xmlXPathNAN xmlXPathNINF xmlXPathNewContext xmlXPathNodeSetCreate xmlXPathObjectCopy xmlXPathPINF xlinkGetDefaultDetect xlinkGetDefaultHandler xlinkIsLink xlinkSetDefaultDetect xlinkSetDefaultHandler xmlAddDocEntity xmlAddDtdEntity xmlCleanupPredefinedEntities xmlCopyEntitiesTable xmlCreateEntitiesTable xmlDumpEntitiesTable xmlDumpEntityDecl xmlEncodeEntities xmlEncodeEntitiesReentrant xmlEncodeSpecialChars xmlFreeEntitiesTable xmlGetDocEntity xmlGetDtdEntity xmlGetParameterEntity xmlGetPredefinedEntity xmlInitializePredefinedEntities xmlXIncludeProcess xmlLinkGetData xmlListAppend xmlListClear xmlListCopy xmlListCreate xmlListDelete xmlListDup xmlListEmpty xmlListEnd xmlListFront xmlListInsert xmlListMerge xmlListPopBack xmlListPopFront xmlListPushBack xmlListPushFront xmlListRemoveAll xmlListRemoveFirst xmlListRemoveLast xmlListReverse xmlListReverseSearch xmlListReverseWalk xmlListSearch xmlListSize xmlListSort xmlListWalk xmlInitMemory xmlMallocLoc xmlMemDisplay xmlMemFree xmlMemGet xmlMemMalloc xmlMemRealloc xmlMemSetup xmlMemShow xmlMemStrdupLoc xmlMemUsed xmlMemoryDump xmlMemoryStrdup xmlReallocLoc xmlAllocOutputBuffer xmlAllocParserInputBuffer xmlCheckFilename xmlCleanupInputCallbacks xmlCleanupOutputCallbacks xmlFileClose xmlFileMatch xmlFileOpen xmlFileRead xmlFreeParserInputBuffer xmlIOFTPClose xmlIOFTPMatch xmlIOFTPOpen xmlIOFTPRead xmlIOHTTPClose xmlIOHTTPMatch xmlIOHTTPOpen xmlIOHTTPOpenW xmlIOHTTPRead xmlNoNetExternalEntityLoader xmlNormalizeWindowsPath xmlOutputBufferClose xmlOutputBufferCreateFd xmlOutputBufferCreateFile xmlOutputBufferCreateFilename xmlOutputBufferCreateIO xmlOutputBufferFlush xmlOutputBufferWrite xmlOutputBufferWriteString xmlParserGetDirectory xmlParserInputBufferCreateFd xmlParserInputBufferCreateFile xmlParserInputBufferCreateFilename xmlParserInputBufferCreateIO xmlParserInputBufferCreateMem xmlParserInputBufferGrow xmlParserInputBufferPush xmlParserInputBufferRead xmlRegisterDefaultInputCallbacks xmlRegisterDefaultOutputCallbacks xmlRegisterHTTPPostCallbacks xmlRegisterInputCallbacks xmlRegisterOutputCallbacks xmlCheckVersion xmlAddAttributeDecl xmlAddElementDecl xmlAddID xmlAddNotationDecl xmlAddRef xmlCopyAttributeTable xmlCopyElementContent xmlCopyElementTable xmlCopyEnumeration xmlCopyNotationTable xmlCreateEnumeration xmlDumpAttributeDecl xmlDumpAttributeTable xmlDumpElementDecl xmlDumpElementTable xmlDumpNotationDecl xmlDumpNotationTable xmlFreeAttributeTable xmlFreeElementContent xmlFreeElementTable xmlFreeEnumeration xmlFreeIDTable xmlFreeNotationTable xmlFreeRefTable xmlGetDtdAttrDesc xmlGetDtdElementDesc xmlGetDtdNotationDesc xmlGetDtdQAttrDesc xmlGetDtdQElementDesc xmlGetID xmlGetRefs xmlIsID xmlIsMixedElement xmlIsRef xmlNewElementContent xmlRemoveID xmlRemoveRef xmlSnprintfElementContent xmlSplitQName2 xmlSprintfElementContent xmlValidBuildContentModel xmlValidCtxtNormalizeAttributeValue xmlValidGetPotentialChildren xmlValidGetValidElements xmlValidNormalizeAttributeValue xmlValidateAttributeDecl xmlValidateAttributeValue xmlValidateDocument xmlValidateDocumentFinal xmlValidateDtd xmlValidateDtdFinal xmlValidateElement xmlValidateElementDecl xmlValidateNameValue xmlValidateNamesValue xmlValidateNmtokenValue xmlValidateNmtokensValue xmlValidateNotationDecl xmlValidateNotationUse xmlValidateOneAttribute xmlValidateOneElement xmlValidateOneNamespace xmlValidateRoot UTF8ToHtml htmlAutoCloseTag htmlCreatePushParserCtxt htmlEncodeEntities htmlEntityLookup htmlEntityValueLookup htmlFreeParserCtxt htmlHandleOmittedElem htmlIsAutoClosed htmlIsScriptAttribute htmlParseCharRef htmlParseChunk htmlParseDoc htmlParseDocument htmlParseElement htmlParseEntityRef htmlParseFile htmlSAXParseDoc htmlSAXParseFile htmlTagLookup xmlCharStrdup xmlCharStrndup xmlCleanupParser xmlClearNodeInfoSeq xmlClearParserCtxt xmlCreateDocParserCtxt xmlCreateIOParserCtxt xmlCreatePushParserCtxt xmlFreeParserCtxt xmlGetExternalEntityLoader xmlGetFeature xmlGetFeaturesList xmlGetWarningsDefaultValue xmlIOParseDTD xmlInitNodeInfoSeq xmlInitParser xmlInitParserCtxt xmlKeepBlanksDefault xmlLineNumbersDefault xmlLoadExternalEntity xmlNewIOInputStream xmlParseBalancedChunkMemory xmlParseBalancedChunkMemoryRecover xmlParseChunk xmlParseCtxtExternalEntity xmlParseDTD xmlParseDoc xmlParseDocument xmlParseEntity xmlParseExtParsedEnt xmlParseExternalEntity xmlParseFile xmlParseMemory xmlParserAddNodeInfo xmlParserFindNodeInfo xmlParserFindNodeInfoIndex xmlParserInputGrow xmlParserInputRead xmlPedanticParserDefault xmlRecoverDoc xmlRecoverFile xmlRecoverMemory xmlSAXParseDTD xmlSAXParseDoc xmlSAXParseEntity xmlSAXParseFile xmlSAXParseFileWithData xmlSAXParseMemory xmlSAXParseMemoryWithData xmlSAXUserParseFile xmlSAXUserParseMemory xmlSetExternalEntityLoader xmlSetFeature xmlSetupParserForBuffer xmlStopParser xmlStrEqual xmlStrcasecmp xmlStrcasestr xmlStrcat xmlStrchr xmlStrcmp xmlStrdup xmlStrlen xmlStrncasecmp xmlStrncat xmlStrncmp xmlStrndup xmlStrstr xmlStrsub xmlSubstituteEntitiesDefault xmlFreeTextReader xmlNewTextReader xmlNewTextReaderFilename xmlTextReaderAttributeCount xmlTextReaderBaseUri xmlTextReaderDepth xmlTextReaderHasAttributes xmlTextReaderHasValue xmlTextReaderIsDefault xmlTextReaderIsEmptyElement xmlTextReaderLocalName xmlTextReaderName xmlTextReaderNamespaceUri xmlTextReaderNodeType xmlTextReaderPrefix xmlTextReaderQuoteChar xmlTextReaderRead xmlTextReaderValue xmlTextReaderXmlLang docbDefaultSAXHandler htmlDefaultSAXHandler xmlDefaultSAXHandler xmlDefaultSAXLocator xmlDoValidityCheckingDefaultValue xmlFree xmlGenericError xmlGenericErrorContext xmlInitializeGlobalState xmlKeepBlanksDefaultValue xmlLineNumbersDefaultValue xmlLoadExtDtdDefaultValue xmlMalloc xmlMemStrdup xmlParserDebugEntities xmlParserVersion xmlPedanticParserDefaultValue xmlRealloc xmlSaveNoEmptyTags xmlSubstituteEntitiesDefaultValue xmlTreeIndentString xmlCleanupThreads xmlFreeMutex xmlFreeRMutex xmlGetGlobalState xmlGetThreadId xmlInitThreads xmlIsMainThread xmlLockLibrary xmlMutexLock xmlMutexUnlock xmlNewMutex xmlNewRMutex xmlRMutexLock xmlRMutexUnlock xmlUnlockLibrary xmlHashAddEntry xmlHashAddEntry2 xmlHashAddEntry3 xmlHashCopy xmlHashCreate xmlHashFree xmlHashLookup xmlHashLookup2 xmlHashLookup3 xmlHashRemoveEntry xmlHashRemoveEntry2 xmlHashRemoveEntry3 xmlHashScan xmlHashScan3 xmlHashScanFull xmlHashScanFull3 xmlHashSize xmlHashUpdateEntry xmlHashUpdateEntry2 xmlHashUpdateEntry3 initGenericErrorDefaultFunc xmlParserError xmlParserPrintFileContext xmlParserPrintFileInfo xmlParserValidityError xmlParserValidityWarning xmlParserWarning xmlSetGenericErrorFunc oldXMLWDcompatibility xmlAddChild xmlAddChildList xmlAddNextSibling xmlAddPrevSibling xmlAddSibling xmlBufferAdd xmlBufferAddHead xmlBufferAllocScheme xmlBufferCCat xmlBufferCat xmlBufferContent xmlBufferCreate xmlBufferCreateSize xmlBufferDump xmlBufferEmpty xmlBufferFree xmlBufferGrow xmlBufferLength xmlBufferResize xmlBufferSetAllocationScheme xmlBufferShrink xmlBufferWriteCHAR xmlBufferWriteChar xmlBufferWriteQuotedString xmlCopyDoc xmlCopyDtd xmlCopyNamespace xmlCopyNamespaceList xmlCopyNode xmlCopyNodeList xmlCopyProp xmlCopyPropList xmlCreateIntSubset xmlDefaultBufferSize xmlDocCopyNode xmlDocDump xmlDocDumpFormatMemory xmlDocDumpFormatMemoryEnc xmlDocDumpMemory xmlDocDumpMemoryEnc xmlDocFormatDump xmlDocGetRootElement xmlDocSetRootElement xmlElemDump xmlFreeDoc xmlFreeDtd xmlFreeNode xmlFreeNodeList xmlFreeNs xmlFreeNsList xmlFreeProp xmlFreePropList xmlGetBufferAllocationScheme xmlGetCompressMode xmlGetDocCompressMode xmlGetIntSubset xmlGetLastChild xmlGetLineNo xmlGetNodePath xmlGetNsList xmlGetNsProp xmlGetProp xmlHasNsProp xmlHasProp xmlIndentTreeOutput xmlIsBlankNode xmlIsXHTML xmlNewCDataBlock xmlNewCharRef xmlNewChild xmlNewComment xmlNewDoc xmlNewDocComment xmlNewDocFragment xmlNewDocNode xmlNewDocNodeEatName xmlNewDocProp xmlNewDocRawNode xmlNewDocText xmlNewDocTextLen xmlNewDtd xmlNewGlobalNs xmlNewNode xmlNewNodeEatName xmlNewNs xmlNewNsProp xmlNewNsPropEatName xmlNewPI xmlNewProp xmlNewReference xmlNewText xmlNewTextChild xmlNewTextLen xmlNodeAddContent xmlNodeAddContentLen xmlNodeDump xmlNodeDumpOutput xmlNodeGetBase xmlNodeGetContent xmlNodeGetLang xmlNodeGetSpacePreserve xmlNodeIsText xmlNodeListGetRawString xmlNodeListGetString xmlNodeSetBase xmlNodeSetContent xmlNodeSetContentLen xmlNodeSetLang xmlNodeSetName xmlNodeSetSpacePreserve xmlReconciliateNs xmlRemoveProp xmlReplaceNode xmlSaveFile xmlSaveFileEnc xmlSaveFileTo xmlSaveFormatFile xmlSaveFormatFileEnc xmlSaveFormatFileTo xmlSearchNs xmlSearchNsByHref xmlSetBufferAllocationScheme xmlSetCompressMode xmlSetDocCompressMode xmlSetListDoc xmlSetNs xmlSetNsProp xmlSetProp xmlSetTreeDoc xmlStringGetNodeList xmlStringLenGetNodeList xmlTextConcat xmlTextMerge xmlUnlinkNode xmlUnsetNsProp xmlUnsetProp xmlRegExecPushString xmlRegFreeExecCtxt xmlRegFreeRegexp xmlRegNewExecCtxt xmlRegexpCompile xmlRegexpExec xmlRegexpIsDeterminist xmlRegexpPrint xmlNanoHTTPAuthHeader xmlNanoHTTPCleanup xmlNanoHTTPClose xmlNanoHTTPFetch xmlNanoHTTPInit xmlNanoHTTPMethod xmlNanoHTTPMethodRedir xmlNanoHTTPOpen xmlNanoHTTPOpenRedir xmlNanoHTTPRead xmlNanoHTTPReturnCode xmlNanoHTTPSave xmlNanoHTTPScanProxy xmlUCSIsAlphabeticPresentationForms xmlUCSIsArabic xmlUCSIsArabicPresentationFormsA xmlUCSIsArabicPresentationFormsB xmlUCSIsArmenian xmlUCSIsArrows xmlUCSIsBasicLatin xmlUCSIsBengali xmlUCSIsBlock xmlUCSIsBlockElements xmlUCSIsBopomofo xmlUCSIsBopomofoExtended xmlUCSIsBoxDrawing xmlUCSIsBraillePatterns xmlUCSIsByzantineMusicalSymbols xmlUCSIsCJKCompatibility xmlUCSIsCJKCompatibilityForms xmlUCSIsCJKCompatibilityIdeographs xmlUCSIsCJKCompatibilityIdeographsSupplement xmlUCSIsCJKRadicalsSupplement xmlUCSIsCJKSymbolsandPunctuation xmlUCSIsCJKUnifiedIdeographs xmlUCSIsCJKUnifiedIdeographsExtensionA xmlUCSIsCJKUnifiedIdeographsExtensionB xmlUCSIsCat xmlUCSIsCatC xmlUCSIsCatCc xmlUCSIsCatCf xmlUCSIsCatCo xmlUCSIsCatCs xmlUCSIsCatL xmlUCSIsCatLl xmlUCSIsCatLm xmlUCSIsCatLo xmlUCSIsCatLt xmlUCSIsCatLu xmlUCSIsCatM xmlUCSIsCatMc xmlUCSIsCatMe xmlUCSIsCatMn xmlUCSIsCatN xmlUCSIsCatNd xmlUCSIsCatNl xmlUCSIsCatNo xmlUCSIsCatP xmlUCSIsCatPc xmlUCSIsCatPd xmlUCSIsCatPe xmlUCSIsCatPf xmlUCSIsCatPi xmlUCSIsCatPo xmlUCSIsCatPs xmlUCSIsCatS xmlUCSIsCatSc xmlUCSIsCatSk xmlUCSIsCatSm xmlUCSIsCatSo xmlUCSIsCatZ xmlUCSIsCatZl xmlUCSIsCatZp xmlUCSIsCatZs xmlUCSIsCherokee xmlUCSIsCombiningDiacriticalMarks xmlUCSIsCombiningHalfMarks xmlUCSIsCombiningMarksforSymbols xmlUCSIsControlPictures xmlUCSIsCurrencySymbols xmlUCSIsCyrillic xmlUCSIsDeseret xmlUCSIsDevanagari xmlUCSIsDingbats xmlUCSIsEnclosedAlphanumerics xmlUCSIsEnclosedCJKLettersandMonths xmlUCSIsEthiopic xmlUCSIsGeneralPunctuation xmlUCSIsGeometricShapes xmlUCSIsGeorgian xmlUCSIsGothic xmlUCSIsGreek xmlUCSIsGreekExtended xmlUCSIsGujarati xmlUCSIsGurmukhi xmlUCSIsHalfwidthandFullwidthForms xmlUCSIsHangulCompatibilityJamo xmlUCSIsHangulJamo xmlUCSIsHangulSyllables xmlUCSIsHebrew xmlUCSIsHighPrivateUseSurrogates xmlUCSIsHighSurrogates xmlUCSIsHiragana xmlUCSIsIPAExtensions xmlUCSIsIdeographicDescriptionCharacters xmlUCSIsKanbun xmlUCSIsKangxiRadicals xmlUCSIsKannada xmlUCSIsKatakana xmlUCSIsKhmer xmlUCSIsLao xmlUCSIsLatin1Supplement xmlUCSIsLatinExtendedA xmlUCSIsLatinExtendedAdditional xmlUCSIsLatinExtendedB xmlUCSIsLetterlikeSymbols xmlUCSIsLowSurrogates xmlUCSIsMalayalam xmlUCSIsMathematicalAlphanumericSymbols xmlUCSIsMathematicalOperators xmlUCSIsMiscellaneousSymbols xmlUCSIsMiscellaneousTechnical xmlUCSIsMongolian xmlUCSIsMusicalSymbols xmlUCSIsMyanmar xmlUCSIsNumberForms xmlUCSIsOgham xmlUCSIsOldItalic xmlUCSIsOpticalCharacterRecognition xmlUCSIsOriya xmlUCSIsPrivateUse xmlUCSIsRunic xmlUCSIsSinhala xmlUCSIsSmallFormVariants xmlUCSIsSpacingModifierLetters xmlUCSIsSpecials xmlUCSIsSuperscriptsandSubscripts xmlUCSIsSyriac xmlUCSIsTags xmlUCSIsTamil xmlUCSIsTelugu xmlUCSIsThaana xmlUCSIsThai xmlUCSIsTibetan xmlUCSIsUnifiedCanadianAboriginalSyllabics xmlUCSIsYiRadicals xmlUCSIsYiSyllables xmlBuildURI xmlCreateURI xmlFreeURI xmlNormalizeURIPath xmlParseURI xmlParseURIReference xmlPrintURI xmlSaveUri xmlURIEscape xmlURIEscapeStr xmlURIUnescapeString UTF8Toisolat1 isolat1ToUTF8 xmlAddEncodingAlias xmlCharEncCloseFunc xmlCharEncFirstLine xmlCharEncInFunc xmlCharEncOutFunc xmlCheckUTF8 xmlCleanupCharEncodingHandlers xmlCleanupEncodingAliases xmlDelEncodingAlias xmlDetectCharEncoding xmlFindCharEncodingHandler xmlGetCharEncodingHandler xmlGetCharEncodingName xmlGetEncodingAlias xmlGetUTF8Char xmlInitCharEncodingHandlers xmlNewCharEncodingHandler xmlParseCharEncoding xmlRegisterCharEncodingHandler xmlUTF8Strlen xmlUTF8Strloc xmlUTF8Strndup xmlUTF8Strpos xmlUTF8Strsize xmlUTF8Strsub xmlDeregisterNodeDefault xmlDeregisterNodeDefaultValue xmlRegisterNodeDefault xmlRegisterNodeDefaultValue xmlTextReaderClose xmlTextReaderCurrentDoc xmlTextReaderCurrentNode xmlTextReaderGetAttributeNo xmlTextReaderGetAttributeNs xmlTextReaderGetAttribute xmlTextReaderGetParserProp xmlTextReaderGetRemainder xmlTextReaderLookupNamespace xmlTextReaderMoveToAttributeNo xmlTextReaderMoveToAttributeNs xmlTextReaderMoveToAttribute xmlTextReaderMoveToElement xmlTextReaderMoveToFirstAttribute xmlTextReaderMoveToNextAttribute xmlTextReaderNormalization xmlTextReaderReadAttributeValue xmlTextReaderReadInnerXml xmlTextReaderReadOuterXml xmlTextReaderReadState xmlTextReaderReadString xmlTextReaderSetParserProp xmlValidatePopElement xmlValidatePushCData xmlValidatePushElement xmlGetNoNsProp htmlAttrAllowed htmlElementAllowedHere htmlElementStatusHere htmlNodeStatus xmlRelaxNGCleanupTypes xmlRelaxNGDump xmlRelaxNGFreeParserCtxt xmlRelaxNGFree xmlRelaxNGFreeValidCtxt xmlRelaxNGNewMemParserCtxt xmlRelaxNGNewParserCtxt xmlRelaxNGNewValidCtxt xmlRelaxNGParse xmlRelaxNGSetParserErrors xmlRelaxNGSetValidErrors xmlRelaxNGValidateDoc xmlTextReaderGetErrorHandler xmlTextReaderLocatorBaseURI xmlTextReaderLocatorLineNumber xmlTextReaderSetErrorHandler xmlRelaxNGValidateStream xmlCanonicPath xmlRelaxNGDumpTree xmlValidateName xmlValidateNCName xmlValidateNMToken xmlValidateQName xmlNanoFTPDele xmlXPathOrderDocElems htmlCreateMemoryParserCtxt xmlAutomataNewTransition2 xmlBuildQName xmlGcMemGet xmlGcMemSetup xmlMallocAtomic xmlRegExecPushString2 xmlRelaxNGNewDocParserCtxt xmlRelaxNGValidateFullElement xmlRelaxNGValidatePopElement xmlRelaxNGValidatePushCData xmlRelaxNGValidatePushElement xmlTextReaderExpand xmlTextReaderIsValid xmlTextReaderNext xmlTextReaderRelaxNGSetSchema xmlTextReaderRelaxNGValidate xmlCleanupGlobals xmlInitGlobals xmlFreeValidCtxt xmlNewValidCtxt xmlSchemaFreeType xmlSchemaDump xmlSchemaFreeParserCtxt xmlSchemaFreeValidCtxt xmlSchemaFree xmlSchemaNewMemParserCtxt xmlSchemaNewParserCtxt xmlSchemaNewValidCtxt xmlSchemaParse xmlSchemaSetParserErrors xmlSchemaSetValidErrors xmlSchemaValidateDoc xmlSchemaValidateStream xmlSchemaCheckFacet xmlSchemaCleanupTypes xmlSchemaCompareValues xmlSchemaFreeFacet xmlSchemaFreeValue xmlSchemaGetPredefinedType xmlSchemaInitTypes xmlSchemaNewFacet xmlSchemaValidateFacet xmlSchemaValidatePredefinedType xmlSchemaValPredefTypeNode xmlThrDefBufferAllocScheme xmlThrDefDefaultBufferSize xmlThrDefDeregisterNodeDefault xmlThrDefDoValidityCheckingDefaultValue xmlThrDefGetWarningsDefaultValue xmlThrDefIndentTreeOutput xmlThrDefKeepBlanksDefaultValue xmlThrDefLineNumbersDefaultValue xmlThrDefLoadExtDtdDefaultValue xmlThrDefParserDebugEntities xmlThrDefPedanticParserDefaultValue xmlThrDefRegisterNodeDefault xmlThrDefSaveNoEmptyTags xmlThrDefSetGenericErrorFunc xmlThrDefSubstituteEntitiesDefaultValue xmlThrDefTreeIndentString xmlMallocAtomicLoc xmlRelaxNGGetParserErrors xmlRelaxNGGetValidErrors xmlSplitQName3 xmlUTF8Charcmp xmlUTF8Size xmlXIncludeProcessTree xmlSAX2AttributeDecl xmlSAX2CDataBlock xmlSAX2Characters xmlSAX2Comment xmlSAX2ElementDecl xmlSAX2EndDocument xmlSAX2EndElementNs xmlSAX2EndElement xmlSAX2EntityDecl xmlSAX2ExternalSubset xmlSAX2GetColumnNumber xmlSAX2GetEntity xmlSAX2GetLineNumber xmlSAX2GetParameterEntity xmlSAX2GetPublicId xmlSAX2GetSystemId xmlSAX2HasExternalSubset xmlSAX2HasInternalSubset xmlSAX2IgnorableWhitespace xmlSAX2InitDefaultSAXHandler xmlSAX2InitDocbDefaultSAXHandler xmlSAX2InitHtmlDefaultSAXHandler xmlSAX2InternalSubset xmlSAX2IsStandalone xmlSAX2NotationDecl xmlSAX2ProcessingInstruction xmlSAX2Reference xmlSAX2ResolveEntity xmlSAX2SetDocumentLocator xmlSAX2StartDocument xmlSAX2StartElementNs xmlSAX2StartElement xmlSAX2UnparsedEntityDecl xmlSAXDefaultVersion xmlSAXVersion htmlCtxtReadDoc htmlCtxtReadFd htmlCtxtReadFile htmlCtxtReadIO htmlCtxtReadMemory htmlCtxtReset htmlCtxtUseOptions htmlReadDoc htmlReadFd htmlReadFile htmlReadIO htmlReadMemory xmlBufferCreateStatic xmlCharInRange xmlCheckHTTPInput xmlCopyError xmlCtxtGetLastError xmlGetLastError xmlResetError xmlResetLastError xmlSetStructuredErrorFunc xmlCtxtReadDoc xmlCtxtReadFd xmlCtxtReadFile xmlCtxtReadIO xmlCtxtReadMemory xmlCtxtResetLastError xmlCtxtReset xmlCtxtUseOptions xmlReadDoc xmlReadFd xmlReadFile xmlReadIO xmlReadMemory xmlStrPrintf xmlStrQEqual xmlDictCreate xmlDictFree xmlDictLookup xmlDictOwns xmlDictQLookup xmlDictReference xmlDictSize xmlErrMemory xmlParserMaxDepth xmlStringLenDecodeEntities xmlSwitchInputEncoding xmlFreeTextWriter xmlNewTextWriterFilename xmlNewTextWriterMemory xmlNewTextWriter xmlTextWriterEndAttribute xmlTextWriterEndCDATA xmlTextWriterEndDocument xmlTextWriterEndDTD xmlTextWriterEndElement xmlTextWriterEndPI xmlTextWriterFlush xmlTextWriterFullEndElement xmlTextWriterStartAttributeNS xmlTextWriterStartAttribute xmlTextWriterStartCDATA xmlTextWriterStartDocument xmlTextWriterStartDTDAttlist xmlTextWriterStartDTDElement xmlTextWriterStartDTDEntity xmlTextWriterStartDTD xmlTextWriterStartElementNS xmlTextWriterStartElement xmlTextWriterStartPI xmlTextWriterWriteAttributeNS xmlTextWriterWriteAttribute xmlTextWriterWriteBase64 xmlTextWriterWriteBinHex xmlTextWriterWriteCDATA xmlTextWriterWriteComment xmlTextWriterWriteDTDAttlist xmlTextWriterWriteDTDElement xmlTextWriterWriteDTDEntity xmlTextWriterWriteDTDExternalEntity xmlTextWriterWriteDTDInternalEntity xmlTextWriterWriteDTDNotation xmlTextWriterWriteDTD xmlTextWriterWriteElementNS xmlTextWriterWriteElement xmlTextWriterWriteFormatAttributeNS xmlTextWriterWriteFormatAttribute xmlTextWriterWriteFormatCDATA xmlTextWriterWriteFormatComment xmlTextWriterWriteFormatDTDAttlist xmlTextWriterWriteFormatDTDElement xmlTextWriterWriteFormatDTDInternalEntity xmlTextWriterWriteFormatDTD xmlTextWriterWriteFormatElementNS xmlTextWriterWriteFormatElement xmlTextWriterWriteFormatPI xmlTextWriterWriteFormatRaw xmlTextWriterWriteFormatString xmlTextWriterWritePI xmlTextWriterWriteRawLen xmlTextWriterWriteRaw xmlTextWriterWriteString xmlTextWriterWriteVFormatAttributeNS xmlTextWriterWriteVFormatAttribute xmlTextWriterWriteVFormatCDATA xmlTextWriterWriteVFormatComment xmlTextWriterWriteVFormatDTDAttlist xmlTextWriterWriteVFormatDTDElement xmlTextWriterWriteVFormatDTDInternalEntity xmlTextWriterWriteVFormatDTD xmlTextWriterWriteVFormatElementNS xmlTextWriterWriteVFormatElement xmlTextWriterWriteVFormatPI xmlTextWriterWriteVFormatRaw xmlTextWriterWriteVFormatString xmlHashQLookup2 xmlHashQLookup3 xmlHashQLookup xmlIsBaseCharGroup xmlIsCharGroup xmlIsCombiningGroup xmlIsDigitGroup xmlIsExtenderGroup xmlIsIdeographicGroup xmlIsPubidChar_tab xmlLastError xmlNanoHTTPEncoding xmlNanoHTTPMimeType xmlNanoHTTPRedir xmlNodeBufGetContent xmlParserInputBufferCreateStatic xmlReaderForDoc xmlReaderForFd xmlReaderForFile xmlReaderForIO xmlReaderForMemory xmlReaderNewDoc xmlReaderNewFd xmlReaderNewFile xmlReaderNewIO xmlReaderNewMemory xmlReaderNewWalker xmlReaderWalker xmlTextReaderConstBaseUri xmlTextReaderConstLocalName xmlTextReaderConstNamespaceUri xmlTextReaderConstName xmlTextReaderConstPrefix xmlTextReaderConstString xmlTextReaderConstValue xmlTextReaderConstXmlLang xmlTextReaderNextSibling xmlTextReaderPreserve xmlStructuredError xmlThrDefSetStructuredErrorFunc xmlXPathErr xmlSAX2CheckNamespace xmlSAX2GetNamespace xmlSAX2GlobalNamespace xmlSAX2NamespaceDecl xmlSAX2SetNamespace xmlCtxtResetPush xmlCreateURLParserCtxt xmlSchemaNewDocParserCtxt xmlStrVPrintf xmlXIncludeFreeContext xmlXIncludeNewContext xmlXIncludeProcessNode xmlFreePatternList xmlFreePattern xmlPatterncompile xmlPatternMatch xmlNewTextWriterDoc xmlNewTextWriterPushParser xmlNewTextWriterTree xmlTextReaderPreservePattern xmlUCSIsAegeanNumbers xmlUCSIsBuhid xmlUCSIsCombiningDiacriticalMarksforSymbols xmlUCSIsCypriotSyllabary xmlUCSIsCyrillicSupplement xmlUCSIsGreekandCoptic xmlUCSIsHanunoo xmlUCSIsKatakanaPhoneticExtensions xmlUCSIsKhmerSymbols xmlUCSIsLimbu xmlUCSIsLinearBIdeograms xmlUCSIsLinearBSyllabary xmlUCSIsMiscellaneousMathematicalSymbolsA xmlUCSIsMiscellaneousMathematicalSymbolsB xmlUCSIsMiscellaneousSymbolsandArrows xmlUCSIsOsmanya xmlUCSIsPhoneticExtensions xmlUCSIsPrivateUseArea xmlUCSIsShavian xmlUCSIsSupplementalArrowsA xmlUCSIsSupplementalArrowsB xmlUCSIsSupplementalMathematicalOperators xmlUCSIsSupplementaryPrivateUseAreaA xmlUCSIsSupplementaryPrivateUseAreaB xmlUCSIsTagalog xmlUCSIsTagbanwa xmlUCSIsTaiLe xmlUCSIsTaiXuanJingSymbols xmlUCSIsUgaritic xmlUCSIsVariationSelectorsSupplement xmlUCSIsVariationSelectors xmlUCSIsYijingHexagramSymbols xmlXIncludeProcessFlags xmlXIncludeProcessTreeFlags xmlXIncludeSetFlags xmlCleanupMemory xmlDictCreateSub xmlRelaxParserSetFlag xmlStrncatNew xmlTextWriterSetIndentString xmlTextWriterSetIndent xmlXPathCtxtCompile xmlAttrSerializeTxtContent xmlByteConsumed xmlTextReaderSetStructuredErrorHandler xmlTextWriterEndComment xmlTextWriterStartComment xmlSaveClose xmlSaveDoc xmlSaveFlush xmlSaveToFd xmlSaveToFilename xmlSaveToIO xmlSaveTree xmlTextWriterEndDTDAttlist xmlTextWriterEndDTDElement xmlTextWriterEndDTDEntity xmlTextWriterWriteDTDExternalEntityContents xmlOutputBufferWriteEscape xmlPopInputCallbacks xmlSaveSetAttrEscape xmlSaveSetEscape xmlBuildRelativeURI xmlOutputBufferCreateFilenameDefault xmlOutputBufferCreateFilenameValue xmlParserInputBufferCreateFilenameDefault xmlParserInputBufferCreateFilenameValue xmlThrDefOutputBufferCreateFilenameDefault xmlThrDefParserInputBufferCreateFilenameDefault xmlSchemaFreeWildcard xmlSchemaCollapseString xmlSchemaGetBuiltInListSimpleTypeItemType xmlSchemaGetBuiltInType xmlSchemaIsBuiltInTypeFacet xmlSchemaValidateListSimpleTypeFacet xmlParseInNodeContext xmlSchemaGetFacetValueAsULong xmlSchemaValidateLengthFacet xmlSchemaValPredefTypeNodeNoNorm xmlSchemaGetParserErrors xmlSchemaGetValidErrors xmlAutomataNewCountTrans2 xmlAutomataNewOnceTrans2 xmlNanoHTTPContentLength xmlSchemaSetValidOptions xmlSchemaValidateOneElement xmlSchemaValidCtxtGetOptions xmlDebugCheckDocument xmlDocCopyNodeList xmlNewDocPI xmlTextReaderConstEncoding xmlTextReaderConstXmlVersion xmlTextReaderIsNamespaceDecl xmlTextReaderStandalone xmlMemBlocks xmlRelaxNGInitTypes xmlDictExists xmlModuleClose xmlModuleFree xmlModuleOpen xmlModuleSymbol xmlRegExecErrInfo xmlRegExecNextValues xmlSchemaWhiteSpaceReplace xmlTextReaderGetParserColumnNumber xmlTextReaderGetParserLineNumber xmlCopyDocElementContent xmlFreeDocElementContent xmlNewDocElementContent xmlDictCleanup xmlHashCreateDict xmlFreeStreamCtxt xmlPatternFromRoot xmlPatternGetStreamCtxt xmlPatternMaxDepth xmlPatternStreamable xmlStreamPop xmlStreamPushAttr xmlStreamPush xmlSchemaCompareValuesWhtsp xmlSchemaCopyValue xmlSchemaGetCanonValue xmlSchemaNewNOTATIONValue xmlSchemaNewStringValue xmlTextReaderByteConsumed xmlSchemaGetValType xmlSchemaValidateFacetWhtsp xmlSchemaValidateLengthFacetWhtsp xmlDOMWrapAdoptNode xmlDOMWrapFreeCtxt xmlDOMWrapNewCtxt xmlDOMWrapReconcileNamespaces xmlDOMWrapRemoveNode xmlSchemaGetCanonValueWhtsp xmlSchemaNewQNameValue xmlSchemaValueAppend xmlSchemaValueGetAsBoolean xmlSchemaValueGetAsString xmlSchemaValueGetNext xmlSchemaIsValid xmlSchemaSAXPlug xmlSchemaSAXUnplug xmlSchemaValidateFile xmlTextReaderSchemaValidate xmlTextReaderSetSchema xmlAutomataNewNegTrans emptyExp forbiddenExp xmlExpCtxtNbCons xmlExpCtxtNbNodes xmlExpDump xmlExpExpDerive xmlExpFreeCtxt xmlExpFree xmlExpGetLanguage xmlExpGetStart xmlExpIsNillable xmlExpMaxToken xmlExpNewAtom xmlExpNewCtxt xmlExpNewOr xmlExpNewRange xmlExpNewSeq xmlExpParse xmlExpRef xmlExpStringDerive xmlExpSubsume xmlHasFeature xmlParseURIRaw xmlPatternMinDepth xmlRelaxNGSetValidStructuredErrors xmlSchemaSetValidStructuredErrors xmlSchematronFreeParserCtxt xmlSchematronFree xmlSchematronFreeValidCtxt xmlSchematronNewDocParserCtxt xmlSchematronNewMemParserCtxt xmlSchematronNewParserCtxt xmlSchematronNewValidCtxt xmlSchematronParse xmlSchematronValidateDoc htmlDocDumpMemoryFormat xmlOutputBufferCreateBuffer xmlSaveToBuffer xmlSchemaSetParserStructuredErrors xmlStreamPushNode xmlStreamWantsAnyNode xmlTextReaderSchemaValidateCtxt xmlDOMWrapCloneNode xmlRelaxNGSetParserStructuredErrors xmlXPathContextSetCache htmlNewParserCtxt xmlPathToURI xmlXIncludeProcessFlagsData xmlXPathCompiledEvalToBoolean xmlTextReaderSetup xmlDllMain xmlSchematronSetValidStructuredErrors xmlMemDisplayLast xmlNewEntity xmlSchemaValidCtxtGetParserCtxt xmlChildElementCount xmlFirstElementChild xmlLastElementChild xmlNextElementSibling xmlPreviousElementSibling xmlStructuredErrorContext xmlXIncludeProcessTreeFlagsData xmlTextReaderRelaxNGValidateCtxt xmlBufferDetach xmlInitializeDict xmlBufContent xmlBufEnd xmlBufGetNodeContent xmlBufNodeDump xmlBufShrink xmlBufUse xmlDictGetUsage xmlDictSetLimit xmlSchemaValidateSetFilename xmlSchemaValidateSetLocator xmlOutputBufferGetContent xmlOutputBufferGetSize xmlTextWriterSetQuoteChar xmlXPathNodeEval xmlXPathSetContextNode libxml2-2.9.1+dfsg1/doc/tutorial/0000755000175000017500000000000012134171765015173 5ustar aronaronlibxml2-2.9.1+dfsg1/doc/tutorial/api.html0000644000175000017500000000355311234335462016634 0ustar aronaronI. Acknowledgements

    I. Acknowledgements

    A number of people have generously offered feedback, code and suggested improvements to this tutorial. In no particular order: Daniel Veillard, Marcus Labib Iskander, Christopher R. Harris, Igor Zlatkovic, Niraj Tolia, David Turover

    libxml2-2.9.1+dfsg1/doc/tutorial/apg.html0000644000175000017500000000571611234335462016635 0ustar aronaronG. Code for Retrieving Attribute Value Example

    G. Code for Retrieving Attribute Value Example

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <libxml/xmlmemory.h>
    #include <libxml/parser.h>
    
    void
    getReference (xmlDocPtr doc, xmlNodePtr cur) {
    
    	xmlChar *uri;
    	cur = cur->xmlChildrenNode;
    	while (cur != NULL) {
    	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {
    		    uri = xmlGetProp(cur, "uri");
    		    printf("uri: %s\n", uri);
    		    xmlFree(uri);
    	    }
    	    cur = cur->next;
    	}
    	return;
    }
    
    
    void
    parseDoc(char *docname) {
    
    	xmlDocPtr doc;
    	xmlNodePtr cur;
    
    	doc = xmlParseFile(docname);
    	
    	if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return;
    	}
    	
    	cur = xmlDocGetRootElement(doc);
    	
    	if (cur == NULL) {
    		fprintf(stderr,"empty document\n");
    		xmlFreeDoc(doc);
    		return;
    	}
    	
    	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    		fprintf(stderr,"document of the wrong type, root node != story");
    		xmlFreeDoc(doc);
    		return;
    	}
    	
    	getReference (doc, cur);
    	xmlFreeDoc(doc);
    	return;
    }
    
    int
    main(int argc, char **argv) {
    
    	char *docname;
    
    	if (argc <= 1) {
    		printf("Usage: %s docname\n", argv[0]);
    		return(0);
    	}
    
    	docname = argv[1];
    	parseDoc (docname);
    	
    	return (1);
    }
    
    

    libxml2-2.9.1+dfsg1/doc/tutorial/index.html0000644000175000017500000001345211234335462017171 0ustar aronaronLibxml Tutorial

    Libxml Tutorial

    John Fleck

    Revision History
    Revision 1June 4, 2002
    Initial draft
    Revision 2June 12, 2002
    retrieving attribute value added
    Revision 3Aug. 31, 2002
    freeing memory fix
    Revision 4Nov. 10, 2002
    encoding discussion added
    Revision 5Dec. 15, 2002
    more memory freeing changes
    Revision 6Jan. 26. 2003
    add index
    Revision 7April 25, 2003
    add compilation appendix
    Revision 8July 24, 2003
    add XPath example
    Revision 9Feb. 14, 2004
    Fix bug in XPath example
    Revision 7Aug. 24, 2004
    Fix another bug in XPath example

    Abstract

    Libxml is a freely licensed C language library for handling XML, portable across a large number of platforms. This tutorial provides examples of its basic functions.

    Introduction

    Libxml is a C language library implementing functions for reading, creating and manipulating XML data. This tutorial provides example code and explanations of its basic functionality.

    Libxml and more details about its use are available on the project home page. Included there is complete API documentation. This tutorial is not meant to substitute for that complete documentation, but to illustrate the functions needed to use the library to perform basic operations.

    The tutorial is based on a simple XML application I use for articles I write. The format includes metadata and the body of the article.

    The example code in this tutorial demonstrates how to:

    • Parse the document.

    • Extract the text within a specified element.

    • Add an element and its content.

    • Add an attribute.

    • Extract the value of an attribute.

    Full code for the examples is included in the appendices.

    libxml2-2.9.1+dfsg1/doc/tutorial/includegetattribute.c0000644000175000017500000000222311234335462021401 0ustar aronaron #include #include #include #include void getReference (xmlDocPtr doc, xmlNodePtr cur) { xmlChar *uri; cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) { uri = xmlGetProp(cur, "uri"); printf("uri: %s\n", uri); xmlFree(uri); } cur = cur->next; } return; } void parseDoc(char *docname) { xmlDocPtr doc; xmlNodePtr cur; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return; } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr,"empty document\n"); xmlFreeDoc(doc); return; } if (xmlStrcmp(cur->name, (const xmlChar *) "story")) { fprintf(stderr,"document of the wrong type, root node != story"); xmlFreeDoc(doc); return; } getReference (doc, cur); xmlFreeDoc(doc); return; } int main(int argc, char **argv) { char *docname; if (argc <= 1) { printf("Usage: %s docname\n", argv[0]); return(0); } docname = argv[1]; parseDoc (docname); return (1); } ]]> libxml2-2.9.1+dfsg1/doc/tutorial/ar01s07.html0000644000175000017500000000743211234335462017160 0ustar aronaronWriting Attribute

    Writing Attribute

    Writing an attribute is similar to writing text to a new element. In this case, we'll add a reference URI to our document. Full code:Appendix F, Code for Add Attribute Example.

    A reference is a child of the story element, so finding the place to put our new element and attribute is simple. As soon as we do the error-checking test in our parseDoc, we are in the right spot to add our element. But before we do that, we need to make a declaration using a data type we have not seen yet:

    	xmlAttrPtr newattr;
          

    We also need an extra xmlNodePtr:

    	xmlNodePtr newnode;
          

    The rest of parseDoc is the same as before until we check to see if our root element is story. If it is, then we know we are at the right spot to add our element:

    	1 newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
    	2 newattr = xmlNewProp (newnode, "uri", uri);	
          

    1

    First we add a new node at the location of the current node pointer, cur. using the xmlNewTextChild function.

    Once the node is added, the file is written to disk just as in the previous example in which we added an element with text content.

    libxml2-2.9.1+dfsg1/doc/tutorial/ar01s02.html0000644000175000017500000000634211234335462017152 0ustar aronaronData Types

    Data Types

    Libxml declares a number of data types we will encounter repeatedly, hiding the messy stuff so you do not have to deal with it unless you have some specific need.

    xmlChar

    A basic replacement for char, a byte in a UTF-8 encoded string. If your data uses another encoding, it must be converted to UTF-8 for use with libxml's functions. More information on encoding is available on the libxml encoding support web page.

    xmlDoc

    A structure containing the tree created by a parsed doc. xmlDocPtr is a pointer to the structure.

    xmlNodePtr and xmlNode

    A structure containing a single node. xmlNodePtr is a pointer to the structure, and is used in traversing the document tree.

    libxml2-2.9.1+dfsg1/doc/tutorial/ar01s04.html0000644000175000017500000001411711234335462017153 0ustar aronaronRetrieving Element Content

    Retrieving Element Content

    Retrieving the content of an element involves traversing the document tree until you find what you are looking for. In this case, we are looking for an element called "keyword" contained within element called "story". The process to find the node we are interested in involves tediously walking the tree. We assume you already have an xmlDocPtr called doc and an xmlNodPtr called cur.

    	1cur = cur->xmlChildrenNode;
    	2while (cur != NULL) {
    		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
    			parseStory (doc, cur);
    		}
    		 
    	cur = cur->next;
    	}
          

    1

    Get the first child node of cur. At this point, cur points at the document root, which is the element "story".

    2

    This loop iterates through the elements that are children of "story", looking for one called "storyinfo". That is the element that will contain the "keywords" we are looking for. It uses the libxml string comparison function, xmlStrcmp. If there is a match, it calls the function parseStory.

    void
    parseStory (xmlDocPtr doc, xmlNodePtr cur) {
    
    	xmlChar *key;
    	1 cur = cur->xmlChildrenNode;
    	2 while (cur != NULL) {
    	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
    	3	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
    		    printf("keyword: %s\n", key);
    		    xmlFree(key);
     	    }
    	cur = cur->next;
    	}
        return;
    }
          

    1

    Again we get the first child node.

    2

    Like the loop above, we then iterate through the nodes, looking for one that matches the element we're interested in, in this case "keyword".

    3

    When we find the "keyword" element, we need to print its contents. Remember that in XML, the text contained within an element is a child node of that element, so we turn to cur->xmlChildrenNode. To retrieve it, we use the function xmlNodeListGetString, which also takes the doc pointer as an argument. In this case, we just print it out.

    [Note]Note

    Because xmlNodeListGetString allocates memory for the string it returns, you must use xmlFree to free it.

    libxml2-2.9.1+dfsg1/doc/tutorial/aph.html0000644000175000017500000000702011234335462016624 0ustar aronaronH. Code for Encoding Conversion Example

    H. Code for Encoding Conversion Example

    #include <string.h>
    #include <libxml/parser.h>
    
    
    unsigned char*
    convert (unsigned char *in, char *encoding)
    {
    	unsigned char *out;
            int ret,size,out_size,temp;
            xmlCharEncodingHandlerPtr handler;
    
            size = (int)strlen(in)+1; 
            out_size = size*2-1; 
            out = malloc((size_t)out_size); 
    
            if (out) {
                    handler = xmlFindCharEncodingHandler(encoding);
                    
                    if (!handler) {
                            free(out);
                            out = NULL;
                    }
            }
            if (out) {
                    temp=size-1;
                    ret = handler->input(out, &out_size, in, &temp);
                    if (ret || temp-size+1) {
                            if (ret) {
                                    printf("conversion wasn't successful.\n");
                            } else {
                                    printf("conversion wasn't successful. converted: %i octets.\n",temp);
                            }
                            free(out);
                            out = NULL;
                    } else {
                            out = realloc(out,out_size+1); 
                            out[out_size]=0; /*null terminating out*/
                            
                    }
            } else {
                    printf("no mem\n");
            }
            return (out);
    }	
    
    
    int
    main(int argc, char **argv) {
    
    	unsigned char *content, *out;
    	xmlDocPtr doc;
    	xmlNodePtr rootnode;
    	char *encoding = "ISO-8859-1";
    	
    		
    	if (argc <= 1) {
    		printf("Usage: %s content\n", argv[0]);
    		return(0);
    	}
    
    	content = argv[1];
    
    	out = convert(content, encoding);
    
    	doc = xmlNewDoc ("1.0");
    	rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out);
    	xmlDocSetRootElement(doc, rootnode);
    
    	xmlSaveFormatFileEnc("-", doc, encoding, 1);
    	return (1);
    }
    
    

    libxml2-2.9.1+dfsg1/doc/tutorial/xmltutorial.pdf0000644000175000017500000014477511234335462020270 0ustar aronaron%PDF-1.3 %ª«¬­ 4 0 obj << /Type /Info /Producer (FOP 0.20.5) >> endobj 5 0 obj << /Length 1748 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gb"/*>Edeu'RnB3cso,c'tRV<@2QG"Te1sI,sZ*n#KKlNVMQ<5BAq5!'k+!#c"8(NNgbpHe&;a;1aP(M@rJfk-$BS+$?JcRY,(_A6k,SUN`TO7efXhh3i=3:BXHM%E2OW]0H+sk$H[O\XG#u0mW@.r"s`W.g99!tcR*(\/("@>q@BW^Q2G*D>/#n3]_.il=X.o?OD#U^04dS]Ss+,a%^lQgnf/]&ceW@ko*%B0QokTBn:$jairCK+PLS%Cdch@t;kIOGu!8)fQ]DhR/U#>#9%l:;J>aO=nBdX8N?;VToPUM@?BfP;2DbSCG8.#;H:nr:@X[RoUP5#8V!2XYms3+,Pg+L(An4XOouF2iL@.s#m5[\'e,fq`PS,Y"o@$je=#b?gu9;/r=qMt:mb%%G5$FjcsdUbn".i6X#Km]hZSOE(i@A:'C!]#YQVN-&c&_nu&jGD2gg2I,X>Af/QL5%8n)7XSCb0W0Z8*)+\&9B^bTmkJ.5_$RWeH_2p2XZM9@ot$UX[_53q*&3VO&J)5%86Y$AZWkI@N:&FKcs%p6WMQCcUFbh8)(40P\*ZA"bb8R+Uti6J;Fdmlr'!#08-$\rUW.S*`0l$l7lOkfeCu3KUG37:dV;6?`SiLnX36m\Ar>kEqpnE4+,0ZZ3>mbtc]/Ye]ERO8`($8oE>X;g2g1^GaWe,."f\E*6Km3M;^8S1^,jb5M4kL$muHb\#!ZDs2A'bm;94ZWTnMuE=%!9!G)bJEiSMujhEeJoj\[m_?-@s8c*.C1268G+TV1+An"dq!66BOQ/uWk*6"Zr]hpdqsAYX6mH:4q,p%/mN/clgm6_*Vk"=D&P?A)R&GV[-;l5h5dH^[E8!6^O+q)a!Ngs^]Q]QTYaG>BGrFu endstream endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 5 0 R /Annots 7 0 R >> endobj 7 0 obj [ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 26 0 R 28 0 R 30 0 R 32 0 R 34 0 R 36 0 R 38 0 R 40 0 R 42 0 R ] endobj 8 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 336.111 193.44 326.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 9 0 R /H /I >> endobj 10 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 325.111 189.82 315.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 11 0 R /H /I >> endobj 12 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 314.111 204.55 304.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 13 0 R /H /I >> endobj 14 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 303.111 256.22 293.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 15 0 R /H /I >> endobj 16 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 292.111 312.05 282.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 17 0 R /H /I >> endobj 18 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 281.111 241.21 271.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 19 0 R /H /I >> endobj 20 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 270.111 213.72 260.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 21 0 R /H /I >> endobj 22 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 259.111 228.72 249.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 23 0 R /H /I >> endobj 24 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 248.111 230.94 238.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 25 0 R /H /I >> endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 237.111 206.23 227.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 27 0 R /H /I >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 226.111 229.83 216.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 215.111 268.7 205.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 31 0 R /H /I >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 204.111 257.04 194.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 33 0 R /H /I >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 193.111 287.86 183.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 35 0 R /H /I >> endobj 36 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 182.111 286.21 172.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 37 0 R /H /I >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 171.111 339.25 161.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 40 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 160.111 318.98 150.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 41 0 R /H /I >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 149.111 231.76 139.111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 43 0 R /H /I >> endobj 44 0 obj << /Length 1970 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=,=c_>r%"@)@iO:/L`pnKL/_:&.,f(7`!X7:ABPbqR$=B([4oTk@OWIA+4)'QU(?B+bQUm"&pP5fY2lRStIc)5A=+PRF'mbH1$b\5c1meN1+6MFRp&93T.bTmCC[Xt;`dSL&60,^g0&&(*cX!K=g*;q:et62rBUCjRZ5n?05Ff\bT:/_4"`%09AcElf^08^P=?A?TFKJcGeUf"b7J5C3b<,X-$:\'NQXH>\Y#;"_As:Kf[l:Q."b%M*F!R*3AN'##69g9!fQc."g"2G@I+`7q@&5U'r$"^?k@\d^C1kkf4S(@Gq.OJSaUa\R=EctaF!:u9NfqLs,%M0\b<%#]H])4C,>^$F,<;gtL22]H)KKDnY251JPZj\_eqmgMQE@Du&XI!2GcuSro%=1]VO6g=97Burk(cB>ITR8R9JdtsHgE+k=Y'S]VNL4U<"+-#;V85td%%r\Xj6![NqhME,!+"t90\oA1k+o'>"$rlgTG:gRa:t%=mj>_$I7F/7j+`9b?+Xi^hU:Bh;,1@e9s4!-,?0#(UN<#4[8>'Q@NK56"R\7)dp;4j$:,H[&4!7)rI?Y68=RN#]qkrdkK@JH&pq:D`NOOr+d=Y[c]gWC-oViQH)!;CLs;hDhq)GuRnlk89ZK>+-C0.HtfRmQ5LA[Kn^hXV3ei2*!;C1nA4A`m2C'q29lVD77t>J8P9p3`RP`$hQgfWHkO#_dki3GO?PeZMhFM?]pW-r6Hc`op.:b4a0TfB(JojgKl7A\h!I&P;]dG4)u'c,+fp1G+Abf*8ZAaTcL,fGt;[+lkrH>\r;ljeq11PAF>FXedJZ;>Z&l)EkXRIf\Ha:#=XgB)1-Z]&q+"bP*.A&V'C_X"L7PlNNX?lVp91%H1n=Yn]oa#3@,Ib&J[LZUmFMg?jPEDa2sgp0db=,c^&1/*9LC9rV/n?;UW_\>iXRc"`1qPj8u)8'H'Dq?7ZQ\j`KtH<>V9O@M`ZPm(VaoFUW4Y&A;KK>o#o*Rsd0gnWrK?R;#r`((7;dH8YnLcA1=o[9G:t*4EBVooVn0Ia'=2/(T5?Q`5l'GhY endstream endobj 45 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 44 0 R /Annots 46 0 R >> endobj 46 0 obj [ 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R ] endobj 47 0 obj << /Type /Annot /Subtype /Link /Rect [ 384.46 600.674 473.05 590.674 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.xmlsoft.org/) /S /URI >> /H /I >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Rect [ 253.694 589.674 331.744 579.674 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-lib.html) /S /URI >> /H /I >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 251.348 179.0 241.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLCHAR) /S /URI >> /H /I >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [ 352.782 207.348 469.722 197.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.xmlsoft.org/encoding.html) /S /URI >> /H /I >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [ 264.0 196.348 282.88 186.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.xmlsoft.org/encoding.html) /S /URI >> /H /I >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 175.348 176.22 165.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLDOC) /S /URI >> /H /I >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.44 164.348 327.33 154.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLDOCPTR) /S /URI >> /H /I >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 143.348 192.89 133.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLNODEPTR) /S /URI >> /H /I >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.33 143.348 231.22 133.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLNODE) /S /URI >> /H /I >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 132.348 165.66 122.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLNODE) /S /URI >> /H /I >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.512 143.348 473.402 133.348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLNODEPTR) /S /URI >> /H /I >> endobj 58 0 obj << /Length 2255 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat$:CN%rcn9]V)f)7lYMf=BOaGonl2NeL#u91a,^@K1brQZuE0=@IajGN?FZ4NajnBA_M>$dU!$+"`eJ1M:]Ojt7YKEu/OYS42f>`:;^:<_db'E9`C7D86c>iM!V?%pq(j]8(TmjVJ@/hO"p#j@3$Cj)4QYlBcgmo5=D]d<8.JRsJY8>L4/XA88AID>np@tONC8KI)bAGC3$m"!ol?'^:h?4-6L<"E#a5rAX2ShL+&_V,VqYEtn>0Fj43E%+&Ekf?Li<4)g$teS2lhk6>sg2KSjV/BMUnok;DSIBKIbUhDRqs.9s]Bp3=r"*W]mmU)T`L'&is2[VesK?nNlQW+Uahq#nVnFM-VB)JSoeo1rq&7<6]P/6JJ0/D,$3%QY<05[,$Bu^Ae]k+F4_O=l2g^<#2LmSAW:Dg?r!I#$;1'RT^-d;:$PNM0SfjJc!"cQZR?[dCCA/snB&hh'4#.+2d?roNc-)'@gK;cN$J7'="QakeCFunHn=1U3USH&9&$/,lqM)"Y'4*H3g)qD<)kXPS;]okLL`JWqWMRlE%3`n0@O6tXU$U;4<#MC&G$?d=.VcSME<\3sIPJl.7[CM!ZS1#ahHq'0`Oa78ENU_Er5@;9oP[b`k;X'n*oo_28P_AZ;d>63&TeE_^UH_:)bSM4b*=#7>H"2PAtLr:%D#t"8/uEm0)SGaq+.A4rZ_<:#;WB`mk28O`#XYBYHe(CXl;7[=Zmnf>CFp_Qk&EE2=-\/)BUG5CgE:$^ea!Vce4,h-eulDr1h9jd6+g2s43i!`Z.X^b9(aAqnjcQ@#)-c0&?Xo*d_B%7i[ujL\pI$,cZci6BNbt0l'I+Bi.ml?R'^Z`)<2DCRJKmENilV[D6AmL%9&fp=rSnhn:Er+E!o"Oe/%nf]X^Y]=[(V],=KW>)Qr9^.hEfHP[P0--L4i9JHYLN4q+nC%k"+67D6+u7]g3=L*SSkBV;5s=(V;;;%S/O/rCA\tC;K[g]Og43!D]U)&(IYu4,t5,Q"4p=_kW]Kf37`!Q/i=UI(]S\AY3NrUr9n?lPpei&m6CoL!F`f1+bJ$84s'f0tU@=jQIjTU("RUJle@h7c`d.fuADeA4tVEWS[5H-"W0_a^lq5DI(Z2_DWJIGhSjqc(nY"rdP.V*G7.LOF'0]?;ZgSME\LiNLcOJ+n?Na8g7&Y@WgLo39FL'PQ9aFr##"lo'oaIMH0MX/E.nHkg4Ja0!6:N$p!WhL5inlikLtQKUXVR8#9Lh=1YEJL(oo\t'U@@iK;.=#g=V3+>Aj=?H/_SNohk*67B;HjI&#_:l42+^]%"B)M<=5DK%T79CZ_=P(W3NMU6`#oPccelH<4)5@*IX4oI:AR5OYQ=li?mjlg"1":[Y00-:\@)_A>F8"AAX!RU?Ocn3'i?Sh%Z1?T8k[CjJ%Hk6[#]Abe7DpY5@:0R%J)<$X+,\`)9`~> endstream endobj 59 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 58 0 R /Annots 60 0 R >> endobj 60 0 obj [ 61 0 R 62 0 R ] endobj 61 0 obj << /Type /Annot /Subtype /Link /Rect [ 249.81 674.674 414.8 664.674 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 31 0 R /H /I >> endobj 62 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.83 222.18 395.71 212.18 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.w3.org/TR/REC-xml#charencoding) /S /URI >> /H /I >> endobj 63 0 obj << /Length 2246 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gau0ED/\/e&H88.i?T1`KZ:@;DYDi(6aa\!>qr$"?Y%npAuc0WfOT1=I4j@Nj)4aBQ+q3Pa3(aUU75?9EhY]l!(_GIo\i/[M"`c&W]oL@>WG])@66`>;!2H^Tuf2u+>EkCXSYS$Jd,P;E2f]]etge+?UA!d^F52EY@d6K^eU5Ao`BTU$H"J%tJ);S?DXeUbSelaNNpNBJ:qjS%,84V;iGk6&C/X=k"Ec0X*j/C,d`ch#rca=9PGr$LkQM(\i=)+LfKG,7,5mV3ukqfp2#4k[g+o[g^=T[UHJ0EXb!&7_2]id]cpVh;;n>n+oX=-TgO"HeIrM%V&aG9Ym?8^oG@Nk%=e4V_YOgd_#ac6BF,E@*'](*M^fsd4%&6;Ho*r8-JYbRJc!Rr?YK0@8i]-$F+&X!">e:>m3Q243PU53n6(SnKNAVS]:$7i93u=TieI'rtbdbTmc6Skbif(hQsKIh3RO-bUDoE'B:EbR#3YQp`RO"5j0%IfboC=\KHS'!Pks:fn&tHtHb&d[6ii,[f4aK-WW*YbPsnK`Suho`#&;[P_2iGNd@@W-FaZ(iMbV#?.=*)?XIU0Kbd_>Dh$$dfO'+X8CHRDEPulqFjCEAYaJV#F*BC4U[/%os/M]h`1EbRcUh;7g`\I;3`m.H.m1e(U]LN,P.<5>*P+>9]9/-&eb4'>g($8@JE,4OBmN$\u[*!=YS#46d`GNnr*CJK6<2jMm^m*B$8jq*qg5qR$LQ?#-q-foc\)T7G;Uo<`^Vdra4PYor"Nb/t3r*ki*!SV^2ZK$)$+&4@u&XOYemi9M?Aj3AuPS3;^gfV$47i(4oA-`?*'oFB!ogXt:2?o<-;^ckYV(R@!(pI\H^S+=*bkTe^Y31&$6j,=d7p.ffdV;nY"lp3Yb0UujM)F"[M+DKmK+2Ot^LO>)]O.5?Rm8?]gr^%Z;IDLZji1m;=uketLoR=IZQpk@B:]K@8(&(g$k?8KB7>E%K_AXend`36oJc5)8Do0cObfGJL;Md\*+:U;M%e5gK8VjQ4PaL;o]49r5f;Bfcs=I>R;I(u3bPc0]'j%aO$dLm"A4"se*j%-VW,kPmgToCI:i7pJ_F((hrse=HpsIi@ee1K[Br0lq!dSBrQ(8#g:+6N`R*\#939.tKt9rlACg=OC8VEc8jEVQ3f0aicZH-[4CpkX"l'pke7rA*TO?jHJ.#MFgW'`J!2Rk=a"k+@9:I`]'"7BMU;8/]l\"3aNSo%"bgW5lGYe)r0/(d?@=ZrXohAR73#)Y-6q.8-I0Of'7Z4lVE7sDnnK9Q&.&8FpPttORU@,_l?"4F2!]:RGLkj@1?YAcGB5*9[IcG_`i]cg7[hiI_1SBC/McQI/-s=8@5`p8@_-a=IcI$)hi$FI$&9dD8 endstream endobj 64 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 63 0 R /Annots 65 0 R >> endobj 65 0 obj [ 66 0 R 67 0 R ] endobj 66 0 obj << /Type /Annot /Subtype /Link /Rect [ 186.56 514.4 240.56 504.4 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-parser.html#XMLSTRCMP) /S /URI >> /H /I >> endobj 67 0 obj << /Type /Annot /Subtype /Link /Rect [ 262.18 229.78 382.18 219.78 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLNODELISTGETSTRING) /S /URI >> /H /I >> endobj 68 0 obj << /Length 2448 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat^W'uNY0_Xf9KZ+sN+]f\Y0XhlN`OXShJ0_co2^'JFQL?"Y%SXR1@]`YPL]N6qYe(mO2n-Z(TS>Q&1"=J?.2uMn!F9ISR)9h0'@QhZA2r5\uol7c6@ODf.H$"aZ^nd*TPs4n%.1-b\!IloaWu8OPh*54L,b>X$9YN+%PJ5))^OljfW,u+S$c9T(A[.3GZg.=O_J#<>O:H7=S]&cT)hTd=]/Jc1fE`g+`q^p$ReCb0I0aX9GV48Z&mj4JT=WFuC1C=Z'ad&aEstoX%'i'X,=8^f93::pC)9og[0ZJf+-+kWH-0'[nm7Cm-U>l+aLEu.5n6Gh9Y/L^Y!BO%f7D'VMp&d2+Etg#SN<[44`Del8(gVW"&f;/C0@N??3!7V3o??'8&33a/QAs)Qh4#Y[INpQ]=lcL3:$A'#?CoI.#2,UZ]G8SkCVa^7+N*q['QpWCjB3.oJp.=0C/`0o"'nP7F=P=Pp0Wo[7`L_t.0QVS+N1j(r0(cEKLH@i_qUtfgg]-*Jj@JiiDFZAs4NABV72_)m7lck-C;U*`&KpX!@8N)Til]s7C,FY%.BgeO>K^)N![Um]LY>9&)EFo7fPNR),'Q<9"Q[)U14`7fBj2RuG8J7AJ8\\EUIN1VlE2g44VcX6WG;bkEZW:Om=/(':s&[4Q>$g-c7A!Wh;nUtni\/\Wpdct?R*)+1eYYlFf.o6OG@63'I7/02kX'pG&@H1]ju\nT,eg=V!#;"2.*rb]h4^0dck22HQ7jY4YFIj(`#bd;?9cZ8`PWZPN0-\j8u`$dWHAtfHX;DNVX?aVkGPK(\MeFW8VRUe6r0oR?^Y3C-US'%*,4'Xol)QZ.6hiMOH/UJXW@or4nUJ8#`r>KbMr=V'Hb=+l:3IpI1[F:Q8MR6D_9n[2+Ws*CB`4.0NO8B6H*Rs">%I7+pp-l,)ZY34E39q@l]IV7M?Kj1"#+b]gpRV%%qatk)\!BNJ=Q(V*g<,Qp+MrS_l%0[)!EUc,Ilh)dAaW,Yk3tZ.[.J+d"E+Ah#=Gp:dnQBpW2[V>iC%LV"&sIFdF+e5Whj,;_T(-/IP_H`oBZP:3JKt$)r8YaT_rOs$gQpBA!SU<3RVE0e/;qN-\^KoBAajC]>'%VZD40K)Vo1qklK/c=edgY6chpU]L/C8:mr"H3qTFBi*mGorIE6OE4MAM=j1nN$]#US0'U*L[[i].Z!O;P+iX'l'eb9'A%t4G/D0Fe.c@?W8]uN7[HPWM\hHKo,@]Pd(l_oIP%.r;#R_'?lqV0&Hucn:)5f=%HZaVnY2b7^Z@mWnQI5p"9TGYGD(T1)-q_iZT15JQ9lo]dHcJ4`=^PX/9IH+UOH',T5Mb(^1WRa>3T&E\d:i~> endstream endobj 69 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 68 0 R /Annots 70 0 R >> endobj 70 0 obj [ 71 0 R 72 0 R 73 0 R ] endobj 71 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.98 698.0 381.19 688.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-xpath.html) /S /URI >> /H /I >> endobj 72 0 obj << /Type /Annot /Subtype /Link /Rect [ 263.38 597.866 341.98 587.866 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.w3.org/TR/xpath) /S /URI >> /H /I >> endobj 73 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.38 586.866 424.81 576.866 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 33 0 R /H /I >> endobj 74 0 obj << /Length 2451 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gasar99\,?&\cSp;#.ERe/0A(k2nMWXK.k63=fn@.i%6_Tcf72M9pjMjf)5YHU)b,h%2$\Q7i+ndHGI1q>n:chYltM[ZRg#2V\19Yk`;e2hCqLND)^_9T)6Y.,A]8Rt&-NW&s\Nk22Zq?`[54OTA!Y8S"4pI#0djP)3Z>\iZ,sTaU`q)@"KaDS!FT_?JWUl;/RH"<5$a+8,VfPX!C$Ui)#IWp5UnP;s`GAC=X"'IMXs`mid:Tkn'iC'LkXnGfe]Cu\MVY!/@-12l%/-Z=9P@Nu0klY+@3DjA"6hGd@;V`,'L;ehIl4Xg:O>'Y/4d)V2i!d1;JV%=*mSLMV9%_6p-OYlRi*'lXH$_uW[2a:RqG'l2*g1S!bfaj8"D]I3A/IDI7L5`e6gnLcXE1Q3gZ]aD>0)-p_X-tO'kMC9-H6tGIm(e60+9TNkhJR5/DOf_\;Hs)YVLn?eM?n(j/3il+Hc)2gjKQX.%3bpm'nDq.6ZG,\/[e8knrl#+tD.JIO[_bDO+DVb:-Xq0[>6.`9!bh@RI9,Dbqd)m4UJ&8q!HnoR'qq_\bIgs0q\HSit'dGa)5.I2_]o,A8;%H(7@C%GRgHi8hhFP,Ds^-#MXW'7KNBLPaZ8.72(3*Y0S5Ss+Ln[RpsRS@*pm)?UP')2']J'paRlLmd\I+Jmt.$F#J%g4!"B@ZA6DoDJ9IYo014=Z)BLiUh]+'i%MX2\FhPODTbr7QeZ8J.JE(F)omVj"DnB@V7o57L+u/YQ]2\K=l%T^OWN;$!H,l?]pe@Y.Q)dG0sF6i=:YI")%]FSrJJrmhrrg2M.0a:@uYpX'pWonJI)%OM#G#<^n9^F.lf-Z[fXZ+XZs%B1rH6oe$X`@sD#[%k5`,*8-C("llc/[TChY0apeTqX-Bfst6]3WSkOc?p`E5`>S(1'jud28EOYW)//EEi[:(n=UG/&3&Vpme`DH^4De?0.ia8p"Ms-L_R]1[.'=p8k9??Rlns*hV'D65GD+oPCXa%!aoWfE12-5V*t^W/.>`ItdY57BqZHjTC$KJ`oq="M1c3M5c>J!4)4Oj'7D:DZCrS,NNGh-ZRq"$MUos9IME-aU:7ktce_UEdpKYq![CX[G0D'lU#luaWj<+8+:>dT(%!n#YM/.KL[aaMT*5;N4WZ>HomM"=EuO4Ds[:3Uj",jK9d`hhK#jKo&l1HhFA"10jInOua:6kTBi*`m2H7[6el!edoBk,[2%mSpkZj)iZLg/cGQYYddK+G6(*gD`ct('-"@Z>J_@DU[tK"<\'^G<0#<2\H0V0q]L]=bo@4\)S/:Y*@,\+Q^aQA-6dM^*Y\T%H3+b_MKP6=GIror,rWc\urD!MCn*U@t)D=stWd*g;6#`\^>a;:M$Wl^*+6-\-(-8@u;kj-`jX$em[0fZmdsEc15Y03;]$*Y$ErD!"QAYF-gMgp`&C#fbEeB"9=Q\YLAZCH4#P_e&6DYRS-[Me1u#(f(^gLqVA"ShhLe#=!b.!XA9)O-@$"Lsmk#m7XQl@)Ilh,s(ArJWdWe7>@WQu#O/[KVH$+TOb.EGl@Wr.S2QeJl4%"48C9-^`lK`US@it7[TbFp05Si&l;.Dp70if4#V&HMgQ#Fr7dS)dH"LnU,O*&_8?-0(L!N'l:'9)$11?,[a;ShNt%e++a]:/s3A>]kOElQo=j]^-L#T$M0)''pj?#*a8*/[SZ:SlN8r^baQu;VGstii2\od]Wb-%"!(LdW6P>0mrr]ZFG+Ln;96\9Zp?hWb,fdrr_0@G\I~> endstream endobj 75 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 74 0 R /Annots 76 0 R >> endobj 76 0 obj [ 77 0 R 78 0 R 79 0 R 80 0 R ] endobj 77 0 obj << /Type /Annot /Subtype /Link /Rect [ 272.33 574.54 455.37 564.54 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 35 0 R /H /I >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Rect [ 186.348 433.66 276.348 423.66 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLNEWTEXTCHILD) /S /URI >> /H /I >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Rect [ 324.744 220.754 470.014 210.754 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 37 0 R /H /I >> endobj 80 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 209.754 208.16 199.754 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 37 0 R /H /I >> endobj 81 0 obj << /Length 2156 /Filter [ /ASCII85Decode /FlateDecode ] >> stream GatU4=`<(R&:XAW:]hF%()p9JiLg?p3H,S?BtEP%[h"@^o!4S#NC:_qMZ3>[77oAa9'ZJ2!J<2fI,pfffpA27+"pR9F_o+P'PEGKF66X9r4/,_HGGKtIhGqS46t5aLV*+\m+?YfYH2B!UL_Y#G$b:=q9&QWgAD"[i;bb9"b?^^4Zc=pct:T(_%1oTYg.%88>JX.+Jm+LE1+f=7TbGIDV/`eT=BEL/eCJs1#CiVP$Y'.mKf)?D4aoRC@\L/,VP:m-_KrmbAYK'K&AGjNu(4U[O+HU65kh1AdmH\#?J,l<[m'S8RNoHVpr$BP/MOVBS=`';1C`?3VQXq`q->?Eq\]fG!&9Ofm#eM)ig;(k/pqh)=4%VmS-BU!gI_qpR4EeJJ&+\8BQTP,L4jVl/NV)naGOGh5Uh0e2=d?<@P>0f^o>_RQ;o]C'6)"'nKr>,&PY#%.NYHeHMZ_MKR"-[5esp%eaN&2TGqTRHgC7e#0iOX;BHhE;CL*&B#l6`goi_Su:Z)k':'g7,IM[PjKgl`Pa>:q,KcEr@C]u3<3mhT$3!`h^VW)"2567"61``P%T_@Dhn^BdsD0U2u;CCgY@8\gbLf!]:BWGBPC!UBo#kb$LrtWCMa[JBZf7[#Q:gNZ2.t0NiHn;+C_98Rj-*Xn*?jmeg!6=n?;c&AV57Gejf[n#<339o!1R(gjSSSZm4]+Pk_&df#`VD#O8Vh=*L4B(b54n]6-7UBu-`p?9<6]o7/JiZWi]FtepGHIP*%g.]NX*@o%(b)rS2dY"GZb':M&O`aZdc$N2Ro;j+UhQs+kM'Tmf=Y?[)g"^qqOI^UXp3ljX26T,)]49t$+R'e!'Cpn-k1&_2IHq1('$Y,m?\!IJAQtHkj^>S+,[VN$XP31LjLiIK)BFO(SWQnZeRRSQ9W6_I3V?ldFKW[o!56g_&jI9"LR;[L:oe);Ek=`(P-FdVsg+6(CE?%d-RnK?<@qHt=Tc(2DZ@pUq(32)l#d\IE&:6r=$7;Y.'.I+1OXhp4>YI&UWSnGnS]KFSVFk;SV%h/colS3/ElIQ02bZd15,g!3(<'mZa4P+uA.-opVha"G\;[Ou_]^>mmQ3kj2TP99YHpI'&sEH!1LEGC*R('l&C*OG^&i4F7rq2l[$ZhM:j(V1r\>Y"Cm%Q`;k:FC&DgU8UXs-Xqc[I1aJfkIW'TY/uk"QB[MUS#lU5r7Lg_9a@.k.5cp5PqtnKiS_K\gBWAN8_E+[_:NunDoiZogef7OTY6/ZE0haWh..]2"Z,.GE_ZL]KQ9)me=>po=Mn@hm\3JIQ]_t<*a-lVOeW=]-?jqG,>1uY;A=oG[[?7#G"_R"Q)*K`ic>j,8"nCXSLhPDjaSBdrbNR`[)Ud#4P/P,ReX8e;(u9L5JoG4,F=JpqGF!X2TX*JeuFM*+=Y/er4G^"LPoFkS3o%pih1F%u(J+-2]7V6Pa.VK:*od36#ccZ,?$)!Gth@=%?@u(4-P(gEfJ*L;i)j/nJYr:rd21V-a)h@ajIMi")]=kt'84)S%&-9*-ro$:^7tm[FfJ09:DkXg"f17Ub?+ooe'C!qh2N)/DpTU5(8aYhhlg2J8ZT:ZG`Da6L]A$gItu*E^k9.aEK)Hat endstream endobj 82 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 81 0 R /Annots 83 0 R >> endobj 83 0 obj [ 84 0 R 85 0 R 86 0 R 87 0 R ] endobj 84 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.89 545.98 279.89 535.98 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLNEWTEXTCHILD) /S /URI >> /H /I >> endobj 85 0 obj << /Type /Annot /Subtype /Link /Rect [ 338.334 437.654 471.934 427.654 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 86 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 426.654 242.88 416.654 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 87 0 obj << /Type /Annot /Subtype /Link /Rect [ 246.998 175.034 306.998 165.034 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://xmlsoft.org/html/libxml-tree.html#XMLGETPROP) /S /URI >> /H /I >> endobj 88 0 obj << /Length 3062 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=.D/\LD&cV3*Z,h^W?#-KeIn@ugaYcPj8C84+iX41(5k!--,$J\2;>.Q8^*I?i)9Q.;.IIS9a5h2O3#p4Wn%7u+n#s&l)Fme.DROa*n`Kfpfu3#[Z>%H0hGeJ1`EBP#*]O+Fs*_BBpStk*YdmB,.VbunX>]N3p>(?@7b)])2ZMWMs(k(=Rj9nMNBf-Ja`Bh6%ZnRZK[#*5UHV(N*g%ECLd-=Z>8jC4:"Xd`7RABsnA\mOqLo#gm\G])`CqZA2kJ\<&RI7G-%%caI9)@22KWDu$$Uck3MfXOrU#JD`]+4S@INT7rVGZ8NQkTJX/\s[h0Ar;@M=nh%.b)q%Z($8UC_Op0LGG8rH0%hN=H,QKG#;-.>$,KJ\l82YSCrRN6![?e>*'6s"R?HZBb!3>d=1,HNbjB-%otsYjL^8LX!)4]V.3OFF)#Mb`KMbAFS.pp/UY)g+EkEZ0S9>-(@\b^_%fg\BY1=%U1G[<^cIV9KQ:[=]ELb:Cecr8*_!!!9c68%"6&&Qdf#t;dpfQi&Ve7+ZR!jC@5'E.+%3U+RQ+FQ^,spj`cOR5ZsunQ+#b<)=sB2;c\t:5drmt$So8AUaMd"-86MVphQa=tA%"cf#h9:RRLo_$%:c7]&2m67)W4!#gKg&>!9!W;Qpc9KOVJ)HVG*fI>>('-\+n/5H$_Xk/0VIdb(06+?2U@NQr'$l1Knk@0CdAIjF(b/L(+4)V,R6OgC3]OI^PbT@nDimj=L=W,XkhqE^/c.rHN/(mPeT8D**'g0I$kG7]DZBm:PP`j6,r7l]@5j13Ya&kXCW7GjYU5fSZuoQsmj;2.,^>8cHFL_F[,E'b6oT+B'b2ICQ.&B=]@Zm"$qa'7^@`jtAh@6=t/?g'ZMNfai]3*2Oa.4]FVV1+XAhX*)@9Fr1>VKOl\k,L+_Yh`Z^ES2"pkbD^+*TKX.Mq1t[JF=j!%&RFLEl2nJ`G8'nXIMRH:ic90+f%bjM8"=gU*&pA,oX4XrCMlT:U%Tlk*Di!W[q5TR3&j/f(>D*l`N"luAPpDgS]ms?Y5:j;4jois'^e0d9>952;TVuH5KXi:L$!-i&P>\*8j%d#^/35S<4N2a:dKD,Zh8>^2!B>pr:@UHMSU@&/@/RN?5-e!^M>E\-T-13UJ'RG[tNIq]S8N\nl"prl^1"-pVeCPoe^!Q@rjDNCX^PFjk*!"35#R245@$\"'!SV>1rciW^2<_6qN/LVX4(QBHnP8:^n=?j<_U[l*I2XBShl's<#KqEBT%1rqf+u+*'WHGj^'OTu&RjP!;%M,NZUob'UC*pfqqYf?[S*?r0l66+56fQD:U?'hje?+T"&\CX<:Odcc!=ES(.FHTC2F^"C,5r.OQ")dK!tl/2<'D*f-)Bt3=j5E.R9%R^9T7og?#DbIO:OscXcI,0DE8\pTEe/jTAsm1mA-u?)\M6W.;[R`sKU&YjXUtU9=BE08?N^ZQYbiM0WX;iRpZ(aS=pVgN)E:RIW5YCDIDo8T#1@d,OFd_AA[R-K:XL;B<406j`gL*#=H#qH.:&a5o)M[=i5Nbn(OLN@D/>)J0je'%@=UZFHL]GJC\fhoi20IX?)aq?o#B>gDk>5)ZVOb+b[?[ekkPE%X3Yn1Wb9n?:dA/>&;9Ms@*KWQf!$e$cNaK4RP+F>%!'GP9HsFVuKJ'kf\<\7[D#=$6j+q6*fah]f@n.Mi&<"l'FWbId9J*>A=L,7A%L-.f0OIl+:,5IDS,I()"$SCKYNb,>U-Gce`PQR2IMr\h$X<>#&a9Q&:aHr8iLWp=&H;0YO_^M+X9AW/4$j1]ek.V3#tnZ#Q,:kc"geUJn4q?IqqfXg>0K?6-Uln#[Bn@RbNj`uF^k"R6SOCqJhcY$hC5Q!FQ3[_pr]ME,oWtLGihWT/B7QW-dB;;-WnE.VEW@liO[#F#?UuLAC%Q/g-c46u92`R&(3;CR!dJeNdhTW1G=Z^*A?<=n]NheBAT$2@'YM6lpTH.*`F>(jt4crCCj>Yr_N)LahT]P]ccBcE0RBlTf[T"TabbnR>Dm4qt0Rj$n4NMJrq;5D#0BAb;Le0H2%rKS_L"q%"%L:FX._].JPV[T'ps-5e1HGsII^`_,he%/1EYQ,m@s!3j0842/.%^)-WpHgr3QcR7$#._!)hQJ-=p7YBLO?2XZ\].Kkj]SW)Q0JdKK?7p]!K6hN!l$cI'?/NOFY3b7%WlFQ%QD"/E"T8ic:i;a~> endstream endobj 89 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 88 0 R /Annots 90 0 R >> endobj 90 0 obj [ 91 0 R ] endobj 91 0 obj << /Type /Annot /Subtype /Link /Rect [ 219.0 344.54 435.37 334.54 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 41 0 R /H /I >> endobj 92 0 obj << /Length 2048 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=,D/\/e&H88.Tk5.-$o'>kHJR!`l\c!i6+8$*Vg0?uM7/,\P"SYDK44e.-^#*6>B5=hBZiL-T&[NTkdSaAq''d^Md0o*5'*:>)0T9[K,kqd^l5LQE9&QocJlZ$F(Y-OfVH%Li)OdsJ9,j@)(AH^0jUVUOqmIpKXJcU@\BUu(2P&CK"(b2(*sccC0I;+VZIt2^/tKbJji9`0?*):f=X@qVK$HRsWF##YU>hDO#-X$ZQ>0mbt,f=_!Y6#1M:Q$=A@Lo".+lblXl(a1Pg/La0([KVlj-2".T]&;]U[V9r)c=Sp2@?_1n.`B3o#skAJZ!,J\Rr6$P!@TQMQ[Yi\`IEGG_b9oZs=Bf?ume::TV-V*R,^"a\9O7,_e27Ap?'klu7Zo%%&HRM3qhq=MRr%dT)_tR&c$$"qi.J.F"U:#T,28X6bJc$HZ?_M\VV?is-l3sQ-qQPE\(5jbok/+0+[\4$DhX6h8BU\8]WTeJ,,6pC>Up-4YcVNCQ"8-0J;/9,RHPlb&O[$Ip(F&o`[BFKc^l=H0a@aD57"%9g?oX]1M0t7ceY,P+5<=trle/De_)a^r=DeMSO3mjI?R;Rs>X_W(s5A=Vj:=2O,g)kXU68G1j;f]$HWG&e\na.cOVOBb"&(Qn7EN%Ld.])&:IoOBiYEKKkmS8:ZtZC2M24&YSiUihY#.d&7/\NonBR;rc)QRh&iN$>nSAY(,W3k`Q79jM?S2KPh@"-RU`lPaMGR&&)1;MaQR0dQTf6P<.^I_91nV(jK@5W>)[U6Shc7;Ra,te:;oUDN1:(m`Ul]`nV86mc@H=4),`%TO]uZ9e/b^V$nKAm$FC`I6XX,*OQ!Pm5^U7:h?+Sc`@g:N]3YNaSM:S_H@>%1eYla[rNU/Kq.r8)SdHbk4h"*H`UIF+YeVnK$hsd't*Gl4r`pLeLAfPSr;6B/Zc#B#eB#mu8oUFk*86\C%lYS70o.;-n&ebM."+6;pPqTG"GMK_^9=0*VES82q]4_"nHk'X+3pd4,Bje&61/sSfD2\hjUjY3ceu\m9lm7EHF)Ca\Q^*$>g)Q6LjoBsI#o?"Jpj#1HS+(CoMQ.Sac0*g)b8M$!AJD7f5:eRcU[@<)+bG_"UEnsH+q'"9H^U@k(@l5GB[qkf35n4#5U7r?AnQO:PNL3Ye+gE5c!E.eEsCZ"/V.s2;1eBlU"fH:'l-.q385kF%/\qWeRrE.36c$G2,S\9h>V"+f[7o2J8!Mh_7(q44IPeNqj.*,L#BX33kSWrkUS+FVc6JBZWGMr'8^1r/k1C/pfDLp1G'1Q7D;kY,/68llZ-?5IYkbq8-hrpON(?pB6oj<[r06)u&&/I]t>31<_imL/Bt^V)]Gm=(*W_@i]&@Go&>'UIC7^eE=O\Dcq9aGee`WWg endstream endobj 93 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 92 0 R >> endobj 94 0 obj << /Length 1148 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gatm:>AMtc&:XAW:f7XD8LJjlD/Tr%P/8B,SCWB\Pm>iG-N[Fk=)sd,c@8'jP&*^ueo%/aJp'1$Ml2.!baf&08=$@S283c\,$][Y?I@usVs9a8_62%o;Dn(@[0q>.ZI3,--WmC4:_>mj,Q2p![Q-HXD!1bQq]2WjAU6FL4cXDEl,H0;DPM9O^qZ(B3^;(U:4q?WW7U?ltd_o=j9+B7abk]1Mq%haO^fKf>kYQSEc)m!k0I,NbDhWs`BSsPeCG.CUTq?k#*##l$HT^Q?f!68O2Oo_I%f_'8b55'e9VH_0bLnD@[E[3b>GK%QK_RP!S2!k<&G2K3+ERl8)p5),ba,::YifpEg!=suk#kRT$MZgCh1KN>n!0hP$2[8`oq;-N(#A]l843_lYDgjGq.`[7!p$Cn/O:*_[9\;f4G/TpU;FA\2ad\ASc64amQ*j^-A'`jl`3tL.cUQ;MIK\emF&I8mehqH=98fbI^p\@2`%b%^Mq@+Yt_#RB#47Jr=61NMqmsM?Z+lo^3=Yo&2.+&=uLia[ endstream endobj 95 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 94 0 R >> endobj 96 0 obj << /Length 1343 /Filter [ /ASCII85Decode /FlateDecode ] >> stream GatU3>ArLj'Ro4H=@e]"929(]2c$p9LYX:WX!g]MXAgXoK*)5A(2R`TCnds0^#KL70k6*@8-GD,d?/8*X,='P%2+#T7KH6lgY_+CT0*QA^?t[2r*[b`g/`Xh"\`>0*TD4Vhf-"e!0D)GFYZ:\0H2%'_H#i&^1g6`V?ZZ21Yu9oRG4T4VGfX'G[%@$SF.Nb;QKL<3>W6#t^5!h&eSVfnrhO_ZU6$%-7B%tG[6s8[Ds>%:Ed-+J*/N.Aq.n7]cmj[K>nTW[b+GK_;C0G$Xq:%k(lV?4-Ve5QV7_uuJ+$[_AVI$ThO[])kS7/:cQcpB35t@ZtrPk_OA`-UO=12q(.+I.TDj?dq]PX0HQiSp^in-e_(T5s%&-GtpmQcNs9p3GsR)(V\Cacr,N$hM+/Kq_4266XPRQ*(E1ldg)S-nJ)6>"D+DP$U%C1)npoLcne!o_WHTU5-=/mP:6'j0$+pFWg0(7gaq1k,%49>6DA.]u8$mpmO!S#QR/M3r8`e4ZVK+4DK!MTo^bQjb3L'[:KW4#!j)&0MLA<j.ee:9PcCH[r.&c"i7aGK9m7Pl*bL0!=hs2Z;JhDi?iu5=f.g@iA][rMeYf`Q<.:1$>Q3Hj_.Y\"om_S/X%HKVa0rA9h;Kt[Z_(4j3R]rppClG(AKEruL/4-X$BBk1AYPo(_5p!U91E/c?Q*ZG+IBCk&jV-92Gm7\rR@-UBKZ$A>O_2%kn7BV9L[49J_9U;QoN-=i0(7FlM`AZ"^M.aUrqV#)4&*CmWhP1<'PnQ`:cBSC\0X.^irY"6hJ7t,DV-bJ\&?@^D-C9.T6@`Mt(f`d\arVlo?Y'!\UmGT1;f_/l"*8rZi\U]`**dgJpLo9n6qrJ^I]N%:6`@"2?6uSRg8U(`f,U3;5W(hQCR5gmoA=X-iWp#>MK6>RY_Rp,]^$#MOE*LV?o-0L]GP/4G+$Y!p6<4/();o@?+7H-;K'&1?(12tnRA)N:LcN>O('5hphg'NN]0*F#0)$!X[Q>#;3O:6cA)_Gq3s#:/;j!ReMc@%X,c-r,?6BL>oQ;DHik91egU-`TsIJ(mr5cMJR#1Jap>EX=MpV1!Ja"GPlZH086n00?&'*M$\FrtUflpL7M%u&M^%@dic@,s"CYgB5\u<+tT:S"dm6s\mKp1u`Gg`-O\s%[=RQlHCKfC1cUP=BuWSU`i!='8K<%J/,>jm?#&9Sr)YIR\t!l;u]H9JH"'PZag`7AL\N$RetRk58[RCF!E0Xj^TR.2.&gWCBhjtk*Hd+^BYdZX endstream endobj 99 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 98 0 R >> endobj 100 0 obj << /Length 1188 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=+?#S1_'Re<2n.r-jY2In&jmfR*Zp97s.`Cb0-ense32sO$@a5'@OD@g=p`[XINq4i9U>Ro4sr%\I_6_BC^8nYuq4l>&U:)Wg9BA^^Q\/\&W:(q%Pb4@nujEB=<:`O/d7?`tl#dkQ?3A>T5ACSCIe4';hr%XSseO#.T*!@3rLn8ahpHc2&cdQend>O-)Oj2:]ZfK*G*5_7LZ%`KFn5Yp'k@\QpW,q^QsiXG4,1a]1jCU5SmBlN/V^gr[M9o]nLU3Hd@2DSe^?:al2[,B\Ju$^ss,9`F*1E],l35de,NoA4&07JWt=76Er&Dn<:k+Y4ksY^'BNXB]j?g[+0to^_f'FjKYgl!cR+:cZ!9[)TFcSCoDG2FU4&abbtXncGOsI:,$Kh?Zj/.fT\O0<+u`gotb2Qa=P'OE,?RhPn-9+kdn6YkRc>sB^#U8A6Ln=lMI%C>),l<@hT8#I#r/d@.rsuo[2=dTMe[J@aO8MDT=+_J#r>'$S5GG``["PO;e^c"u6BV;+4>e'^KMGh1H:CN`DR/;Pq6H&&>a<*Tc-E%okku_T)hF\dE]*+EiaH-CEtc\GR`#bNj"M-Tij=`)e)'BO1HuIX5lDWUM6IX%&WIb'iaV*/ZO@0C]`_nU>RT[29^`GJ@)i,$^d]Z6Y+6GZu+5YFa7?Nmca7a!WME)MG/:K#4UV]8p(#Xm3XHSg+k(j#?b66&341W.b#[WGYD54@3=D-k[/lj85~> endstream endobj 101 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 100 0 R >> endobj 102 0 obj << /Length 1250 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat%#>E@5m'RoMS#_Q/m&Y-*H4-!H/=pBkk)Bfk'04Z+jlZOI08_6[LB!p@m^*gDPK&$p:>/edtIQmbVl.a2XeIX)n,i-=r(?f+;YDWbAR@a'V3M0*8/o?6,m3rks<-u%4!(`bYj")W(u1O>B@5P7e`rRpj3aMDf1:Y,J#/Ks?/YBi(A:8Q6\\Lf'3dA4K4#jj[A?@:SL)u['@rG=b)YQSK90i?N*Tb@%ejQ>XBBRC"(!]d>,i[Qu43/#dY7C@e%J2G>(d91BU'c"E%\7#G@K**I]2S`Q%VuU0GUTbZh`Fc=2oj:/u4C)>+!J9$_@,UUtlS4`r.g)pW"QEOK?fF.1cV5;oo44mtLPn7-'m1NX%g>LHoIr587)DA8:bDgK-%Z-%4HkKo5r`W2;31^.0KRY\XFeEM=T6%6>R2?#V,VnA+dq=*7$s2V,DVX?Z$f,l0.82M:B]OLLDqLLR4[/`%PU2.U&+?mM[\GlJ>Q]<+7dhK?&b&sj^EX-K8'flDH'pTIZq@[6"nqo8'OQOp/qb"*d/.=hO5htJCat=u-ODViR?$pN/HbUclK\sC*A_4qZ)G&cdEP@,]Tn'MgrW33jcSj)A4*6#qH?o<=7(pgZ1Zm4GB-?%(W4Q<8f;:9uh!jtY[Xo2O,jG:O;W-g0,7;e95C\NT1k$-X^>tA*-CVUndP]rGm#FmCoV#~> endstream endobj 103 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 102 0 R >> endobj 104 0 obj << /Length 1203 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat%"gMYb8&:N/3YV$8RXutPk05[/5,^+dT.+2.A$B7BK<\a]5<0sC"-cj&8QDDHq]Tc\=0M#r]B?jag/LHh9O[f]hDm>lFD_n(._*@54LuCiGs+f$,CqWWn"VKp1O#-.X9+HQ^m^9'0SW=m:362T`Df,m$+mcF*C-;bbVY!nhIhkIqPpqo$KB6bIL]C%Q"W4g1._sN;b=DVs,I"69Y'T:`XL]mO_GQ$hGgtHb/?cHZR-@.ZSOt"inu&1J^&UAW"hbTO,3_E#6i!e2a`c89G4F"BI6N1daNJ_[g%m)k%>nhqJ=BV(W=Ie$a4]2P4JarbA4">ddc_qkH+R,lZM,6Oc!O]b`:hun-SuADm@jR+g*,??&8;Nk,8Z1SF5YbsDlp<_s!uoFZQ/Fi^/sFd!f-S=^n@J\0b;>8aaaIns]bt?AUuFE6I".$">t2bfW/L;h69">g8FS;5)S*H#K[miPY_Y`?mK=R6^q5j*NH"Tr>]/%E^$8DT@,*S#$)c$q!6tHiE]Z`]mKXj=AW3NtXQEali1FO+k5g7`@?[.)S--H]MVaB'@3L_\k%7W,Z'XU:bEnD(pg>u4b1*-9:lIgdLnd[eH-JJj!"7'-E$R%bK_qP'S_9IK-eLhO?*4*N2!?2]3<8HVt(f@=`]lJXQAT+J$'LZqEtDbfdil$U*u#A%#@i+-/[^S7mdgng7ph867%GZ\+KR[<7T2+QK;Rth?sN=d[oifV(foA$G04ltNPo2V[[LWYM;Y5RK@(/he'3a9V-Z_*_4*7'^3R;.It4StQ7m9M:js0c!QK4Z7Q+uZuW7P]3lH0`QoP?6m=Q]INW"EKf#e-^bMKBf=B)L?&%n\1rA:T)C[m17McmW endstream endobj 105 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 104 0 R >> endobj 106 0 obj << /Length 1326 /Filter [ /ASCII85Decode /FlateDecode ] >> stream GatU3>Ar7S'Roe[cjX`s^%d6p8PrZX!G`XL*J3VjpF-FV9r;3)16kFO13D?%+)+Rg4/C>7#S>&kcZa9a\`i-qFM1lT`0_JK\LPW13i7%;N?>O^bF;T(WEh*/XPl*sVfIT/YaO'"Q.RBf58GD8+*PlICZc]Td-8b2h\ZF$6*#F7@[IUOs1eb\#j97cd3'_bahS!^Y=DX@j^qHVY>6Q[JoY3?@AMG?7iUF"r6eK]HKebRk#;:YfCj"lJV9B4ZdN'Su:f(>J]oc%)_)17(!)B"T^Lh-1QUq2^rV>j=ikEWI]oFK#[#bfmXKk1dif?YW^E".rmF"s5eU!QL*6YUFClC&5;+H@A>3(rnehj"M:]?u#rF$pQMq.S#g"0C,>bnd+X1^0!NdN_p@0XZdIrb]H@/)O9O[]b2BA/rh(hq'AIqa"a@a6*BV@/X*1gF;tD&$_^3d_65g3s19Y]1`;Llr82&MEUTiK@5;I!KKg8>QNf7mH],0BZ^@`LciSbR.\`T@,,!ZB$N[MnJ(I!fYT.F1'O+<[$(ji>]h-5U%*,8;,>XbapAe)bCVp'4#C(398,DZc5("li]i3dfW4aa<)Nr_7f"qFM>U:*`X%BTpVCC:?TlPX\#e>_6(l2tJ.S^-6Z==Y79g>6oigGnKlhkoCN7/a`\^WaYt;s)/Yep\tf6f"oGn8=BoYpdb3;D5=\W6JJ!C-FKA&A??7fg.VX1b"Tr)tDB@CD5Is7ncag)n/3u?P!qXn3d0QF*LtBU4,2;hs+djk?P,fR!OsgdQ_=5R#BL,+0!D5>qSWs2'5\B!)>7&e_'N#$B8*oDa!r6oMU0\Z0nBfY<56= endstream endobj 107 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 106 0 R >> endobj 108 0 obj << /Length 817 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat%!?#uMY'RekG_.,6a&.hh->Os^H-ge8]Vpf@X&$1[A%4bZ\B_q1Ud3r*9VrNDM4Qfu;"YQ/+k2J9%(dS;QI"O\h_#W-n"&,Zt@h_0JKCf/XS\.,ik6)$O,(p#:;Ds<40Ku@TIs_t,W.^6!GrnA#;$s(f9)Y?njhchE&*?4F[QJmroANC3B!/e:.BB\)JOQ]!C$4[(gs)X_6\-S26U;)p&ieiOdM[QSYB]2mpjJ`JopoZP2JdO'V?T$KYciKiD*c47hETggnZGLA-'G\'#LoBWT!TojA.W9Q/SNQ]nJ`O]ANEHXS8j':ceoE+9cGii^Wf=[A1kBGCWM]!jkED&P^+_.>&bKm.5;3qTK?ppVcZ$AGm)GD=Q>Cg9$OE':kjQWVe.YT9E=O6,PD&>4CZYags^t'3erVnTh.?YQ\q9sZF44TY%64A7?c+qhj7TB`T'>Gd$])l4-[KR2YPVSJ_4/jW9$HYfU'(JV5&]0_?P<=eaf<-5s2DgkGad1Gs8n@;)91d-5CJ!F%[/#D(20lr6&ha,YfIo"9%b_Y4gXf9u5h@OGJ1VCRqSC_V!>M\+e+%H7@E>](t%:T`*,,0an'h\o2,oMu`\9j5r*;!sCH3#nAPNNG\AqDJ]ro_tDX%Ef>f@noBOGmLBeZcb0k0PLCUR)UIp~> endstream endobj 109 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 108 0 R /Annots 110 0 R >> endobj 110 0 obj [ ] endobj 113 0 obj << /Title (\376\377\0\114\0\151\0\142\0\170\0\155\0\154\0\40\0\124\0\165\0\164\0\157\0\162\0\151\0\141\0\154) /Parent 111 0 R /Next 115 0 R /A 112 0 R >> endobj 115 0 obj << /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163) /Parent 111 0 R /Prev 113 0 R /Next 116 0 R /A 114 0 R >> endobj 116 0 obj << /Title (\376\377\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) /Parent 111 0 R /Prev 115 0 R /Next 117 0 R /A 9 0 R >> endobj 117 0 obj << /Title (\376\377\0\104\0\141\0\164\0\141\0\40\0\124\0\171\0\160\0\145\0\163) /Parent 111 0 R /Prev 116 0 R /Next 118 0 R /A 11 0 R >> endobj 118 0 obj << /Title (\376\377\0\120\0\141\0\162\0\163\0\151\0\156\0\147\0\40\0\164\0\150\0\145\0\40\0\146\0\151\0\154\0\145) /Parent 111 0 R /Prev 117 0 R /Next 119 0 R /A 13 0 R >> endobj 119 0 obj << /Title (\376\377\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164) /Parent 111 0 R /Prev 118 0 R /Next 120 0 R /A 15 0 R >> endobj 120 0 obj << /Title (\376\377\0\125\0\163\0\151\0\156\0\147\0\40\0\130\0\120\0\141\0\164\0\150\0\40\0\164\0\157\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\145\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164) /Parent 111 0 R /Prev 119 0 R /Next 121 0 R /A 17 0 R >> endobj 121 0 obj << /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\145\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\143\0\157\0\156\0\164\0\145\0\156\0\164) /Parent 111 0 R /Prev 120 0 R /Next 122 0 R /A 19 0 R >> endobj 122 0 obj << /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145) /Parent 111 0 R /Prev 121 0 R /Next 123 0 R /A 21 0 R >> endobj 123 0 obj << /Title (\376\377\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\163) /Parent 111 0 R /Prev 122 0 R /Next 124 0 R /A 23 0 R >> endobj 124 0 obj << /Title (\376\377\0\105\0\156\0\143\0\157\0\144\0\151\0\156\0\147\0\40\0\103\0\157\0\156\0\166\0\145\0\162\0\163\0\151\0\157\0\156) /Parent 111 0 R /Prev 123 0 R /Next 125 0 R /A 25 0 R >> endobj 125 0 obj << /Title (\376\377\0\101\0\56\0\240\0\103\0\157\0\155\0\160\0\151\0\154\0\141\0\164\0\151\0\157\0\156) /Parent 111 0 R /Prev 124 0 R /Next 126 0 R /A 27 0 R >> endobj 126 0 obj << /Title (\376\377\0\102\0\56\0\240\0\123\0\141\0\155\0\160\0\154\0\145\0\40\0\104\0\157\0\143\0\165\0\155\0\145\0\156\0\164) /Parent 111 0 R /Prev 125 0 R /Next 127 0 R /A 29 0 R >> endobj 127 0 obj << /Title (\376\377\0\103\0\56\0\240\0\103\0\157\0\144\0\145\0\40\0\146\0\157\0\162\0\40\0\113\0\145\0\171\0\167\0\157\0\162\0\144\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145) /Parent 111 0 R /Prev 126 0 R /Next 128 0 R /A 31 0 R >> endobj 128 0 obj << /Title (\376\377\0\104\0\56\0\240\0\103\0\157\0\144\0\145\0\40\0\146\0\157\0\162\0\40\0\130\0\120\0\141\0\164\0\150\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145) /Parent 111 0 R /Prev 127 0 R /Next 129 0 R /A 33 0 R >> endobj 129 0 obj << /Title (\376\377\0\105\0\56\0\240\0\103\0\157\0\144\0\145\0\40\0\146\0\157\0\162\0\40\0\101\0\144\0\144\0\40\0\113\0\145\0\171\0\167\0\157\0\162\0\144\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145) /Parent 111 0 R /Prev 128 0 R /Next 130 0 R /A 35 0 R >> endobj 130 0 obj << /Title (\376\377\0\106\0\56\0\240\0\103\0\157\0\144\0\145\0\40\0\146\0\157\0\162\0\40\0\101\0\144\0\144\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145) /Parent 111 0 R /Prev 129 0 R /Next 131 0 R /A 37 0 R >> endobj 131 0 obj << /Title (\376\377\0\107\0\56\0\240\0\103\0\157\0\144\0\145\0\40\0\146\0\157\0\162\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\40\0\126\0\141\0\154\0\165\0\145\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145) /Parent 111 0 R /Prev 130 0 R /Next 132 0 R /A 39 0 R >> endobj 132 0 obj << /Title (\376\377\0\110\0\56\0\240\0\103\0\157\0\144\0\145\0\40\0\146\0\157\0\162\0\40\0\105\0\156\0\143\0\157\0\144\0\151\0\156\0\147\0\40\0\103\0\157\0\156\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145) /Parent 111 0 R /Prev 131 0 R /Next 133 0 R /A 41 0 R >> endobj 133 0 obj << /Title (\376\377\0\111\0\56\0\240\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163) /Parent 111 0 R /Prev 132 0 R /Next 135 0 R /A 43 0 R >> endobj 135 0 obj << /Title (\376\377\0\111\0\156\0\144\0\145\0\170) /Parent 111 0 R /Prev 133 0 R /A 134 0 R >> endobj 136 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 137 0 obj << /Type /Font /Subtype /Type1 /Name /F14 /BaseFont /ZapfDingbats >> endobj 138 0 obj << /Type /Font /Subtype /Type1 /Name /F5 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 139 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 140 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 141 0 obj << /Type /Font /Subtype /Type1 /Name /F9 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 142 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 1 0 obj << /Type /Pages /Count 17 /Kids [6 0 R 45 0 R 59 0 R 64 0 R 69 0 R 75 0 R 82 0 R 89 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R /Outlines 111 0 R /PageMode /UseOutlines >> endobj 3 0 obj << /Font << /F3 136 0 R /F5 138 0 R /F14 137 0 R /F1 140 0 R /F6 139 0 R /F9 141 0 R /F7 142 0 R >> /ProcSet [ /PDF /ImageC /Text ] >> endobj 9 0 obj << /S /GoTo /D [45 0 R /XYZ 139.0 693.0 null] >> endobj 11 0 obj << /S /GoTo /D [45 0 R /XYZ 139.0 363.674 null] >> endobj 13 0 obj << /S /GoTo /D [59 0 R /XYZ 139.0 725.0 null] >> endobj 15 0 obj << /S /GoTo /D [59 0 R /XYZ 139.0 173.18 null] >> endobj 17 0 obj << /S /GoTo /D [64 0 R /XYZ 139.0 156.646 null] >> endobj 19 0 obj << /S /GoTo /D [75 0 R /XYZ 139.0 667.866 null] >> endobj 21 0 obj << /S /GoTo /D [75 0 R /XYZ 139.0 281.08 null] >> endobj 23 0 obj << /S /GoTo /D [82 0 R /XYZ 139.0 508.98 null] >> endobj 25 0 obj << /S /GoTo /D [89 0 R /XYZ 139.0 725.0 null] >> endobj 27 0 obj << /S /GoTo /D [93 0 R /XYZ 139.0 648.0 null] >> endobj 29 0 obj << /S /GoTo /D [93 0 R /XYZ 139.0 564.561 null] >> endobj 31 0 obj << /S /GoTo /D [93 0 R /XYZ 139.0 386.942 null] >> endobj 33 0 obj << /S /GoTo /D [95 0 R /XYZ 139.0 182.42 null] >> endobj 35 0 obj << /S /GoTo /D [99 0 R /XYZ 139.0 665.56 null] >> endobj 37 0 obj << /S /GoTo /D [101 0 R /XYZ 139.0 497.94 null] >> endobj 39 0 obj << /S /GoTo /D [103 0 R /XYZ 139.0 438.78 null] >> endobj 41 0 obj << /S /GoTo /D [105 0 R /XYZ 139.0 281.02 null] >> endobj 43 0 obj << /S /GoTo /D [107 0 R /XYZ 139.0 113.4 null] >> endobj 111 0 obj << /First 113 0 R /Last 135 0 R >> endobj 112 0 obj << /S /GoTo /D [6 0 R /XYZ 139.0 725.0 null] >> endobj 114 0 obj << /S /GoTo /D [6 0 R /XYZ 139.0 396.11 null] >> endobj 134 0 obj << /S /GoTo /D [109 0 R /XYZ 139.0 682.0 null] >> endobj xref 0 143 0000000000 65535 f 0000046903 00000 n 0000047079 00000 n 0000047172 00000 n 0000000015 00000 n 0000000071 00000 n 0000001911 00000 n 0000002031 00000 n 0000002175 00000 n 0000047325 00000 n 0000002309 00000 n 0000047389 00000 n 0000002445 00000 n 0000047456 00000 n 0000002581 00000 n 0000047521 00000 n 0000002717 00000 n 0000047587 00000 n 0000002853 00000 n 0000047654 00000 n 0000002989 00000 n 0000047721 00000 n 0000003125 00000 n 0000047787 00000 n 0000003261 00000 n 0000047853 00000 n 0000003397 00000 n 0000047918 00000 n 0000003533 00000 n 0000047983 00000 n 0000003669 00000 n 0000048050 00000 n 0000003804 00000 n 0000048117 00000 n 0000003940 00000 n 0000048183 00000 n 0000004076 00000 n 0000048249 00000 n 0000004212 00000 n 0000048316 00000 n 0000004348 00000 n 0000048383 00000 n 0000004484 00000 n 0000048450 00000 n 0000004620 00000 n 0000006683 00000 n 0000006806 00000 n 0000006903 00000 n 0000007078 00000 n 0000007271 00000 n 0000007469 00000 n 0000007659 00000 n 0000007846 00000 n 0000008044 00000 n 0000008246 00000 n 0000008448 00000 n 0000008648 00000 n 0000008847 00000 n 0000009052 00000 n 0000011400 00000 n 0000011523 00000 n 0000011557 00000 n 0000011693 00000 n 0000011884 00000 n 0000014223 00000 n 0000014346 00000 n 0000014380 00000 n 0000014580 00000 n 0000014791 00000 n 0000017332 00000 n 0000017455 00000 n 0000017496 00000 n 0000017685 00000 n 0000017863 00000 n 0000018000 00000 n 0000020544 00000 n 0000020667 00000 n 0000020715 00000 n 0000020850 00000 n 0000021058 00000 n 0000021197 00000 n 0000021333 00000 n 0000023582 00000 n 0000023705 00000 n 0000023753 00000 n 0000023959 00000 n 0000024098 00000 n 0000024234 00000 n 0000024439 00000 n 0000027594 00000 n 0000027717 00000 n 0000027744 00000 n 0000027878 00000 n 0000030019 00000 n 0000030127 00000 n 0000031368 00000 n 0000031476 00000 n 0000032912 00000 n 0000033020 00000 n 0000034353 00000 n 0000034461 00000 n 0000035743 00000 n 0000035853 00000 n 0000037197 00000 n 0000037307 00000 n 0000038604 00000 n 0000038714 00000 n 0000040134 00000 n 0000040244 00000 n 0000041154 00000 n 0000041280 00000 n 0000048516 00000 n 0000048570 00000 n 0000041301 00000 n 0000048635 00000 n 0000041476 00000 n 0000041677 00000 n 0000041848 00000 n 0000042007 00000 n 0000042201 00000 n 0000042455 00000 n 0000042784 00000 n 0000043020 00000 n 0000043221 00000 n 0000043446 00000 n 0000043659 00000 n 0000043842 00000 n 0000044048 00000 n 0000044306 00000 n 0000044552 00000 n 0000044833 00000 n 0000045126 00000 n 0000045496 00000 n 0000045825 00000 n 0000048701 00000 n 0000046038 00000 n 0000046154 00000 n 0000046268 00000 n 0000046354 00000 n 0000046465 00000 n 0000046577 00000 n 0000046686 00000 n 0000046793 00000 n trailer << /Size 143 /Root 2 0 R /Info 4 0 R >> startxref 48768 %%EOF libxml2-2.9.1+dfsg1/doc/tutorial/images/0000755000175000017500000000000012134171765016440 5ustar aronaronlibxml2-2.9.1+dfsg1/doc/tutorial/images/toc-minus.png0000644000175000017500000000040311234335462021055 0ustar aronaron‰PNG  IHDR Èä)‹bKGDª#2IDATxÚchÿ`À¥ÿÏg  I×j?}-p®ZóºECtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatureecf413ef47524404f90c44d8c7d12a2e݈þš tEXtPage15x9+0+07vð¸IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/prev.png0000644000175000017500000000215411234335462020120 0ustar aronaron‰PNG  IHDR#Yi†&PLTE„Œ!Œ!)”)1œ1BœBJ¥JR­Rkµks½s„½„ŒÆŒ”Δ¥Î¥­Ö­ÆÞÆÎçÎÖïÖçïçï÷ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ìĪbKGDˆH{IDATxÚµ‘ÁÂ0 C»ÊV%2þÿo%eâÀĶ 8—Xz²§ð\å· #KSŸ›!Q±aĪ (9±Wv|ÉY­‹YÒŒ» d=âæ[¦é«‚’ù—NÇýìg£$Ü Üÿõ‹C=µô%Š ¹‹CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature0f87aaf0b04e24ba165f2a4bfa6bca57kИ•tEXtPage35x15+0+0~FòIEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/warning.png0000644000175000017500000000233111234335462020606 0ustar aronaron‰PNG  IHDRשÍÊPLTE!)1BJRZks{„Œ””{{œRRœZZœ{{¥¥99¥JJ¥„„¥””¥¥¥­­11­””µµ))µŒŒµœœµ¥¥µµµ½½­­½µµÆÆÆÆÆÆÎÎÎÎ))ÖÖ))ÖÖÖÞÞÞÞçç!!çççïïïïï÷÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp;ã”bKGDˆHèIDATxÚm’}o‚0Æï”MÜæÄé¦5…%¼•%m ßÿs­ìzP“^ÿ ²¥UDÂýKnßk[;Ò»?0n!¿œqCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec42b7d2d564aab588891979703f02b45Oß“tEXtPage24x24+0+0r[ 1IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/toc-blank.png0000644000175000017500000000047611234335462021023 0ustar aronaron‰PNG  IHDR ¡kd0PLTE€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿO&IbKGDˆHIDATxÚcøÿ¿ÿ?|`ø h  Ì”ÐBÒh±àCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturef7e388dabd4ef0097714b5643fdd3cfbb†œÒ tEXtPage15x9+0+07vð¸IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/home.png0000644000175000017500000000220411234335462020070 0ustar aronaron‰PNG  IHDR#Yi†&PLTEŒ!Œ!)”)1œ1BœBJ¥Jc­cs½s„½„ŒÆŒ”Δ¥Î¥µÞµÆÞÆÎçÎÖïÖçïçï÷ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòî¤GbKGDˆH“IDATxÚ­QÑà l)œ xÿÿ±£Y¶,]Ò¾”„âå8uÁu,÷q¼£»Å™N!`’œîRN`Mè}‡™%,»ióímˆõ¡‹ )ûΪš +¹· šC²©<ÙóÍqU;pZÚ–ÔüzJky¯à ƒŒà4ãy|Ÿ¨50ܦyì³k»ù/.ã Ì×j*1ÝCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature154332ef94ba5222343b4126d6035f91ìïé€tEXtPage35x15+0+0~FòIEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/0000755000175000017500000000000012134171765020266 5ustar aronaronlibxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/9.png0000644000175000017500000000054511234335462021144 0ustar aronaron‰PNG  IHDR s;bKGDª#2IDATxÚŽ!„0 GFVb‘ÈJ,²¹WX‰ä È^Y¹’kTb++#³©É{“?/ù˜YÙ—y/j†é!ÀÚRj»”Ç+“~ “àöEœ#y@„§·öà·‘š!âî¦s².Ôg±þ…E±‡íÒëOÍr /¯óŒP8bÙÒûCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature34623e5e4d48310e409b280afe247602Ô14$tEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/3.png0000644000175000017500000000053611234335462021136 0ustar aronaron‰PNG  IHDR s;bKGDª#2xIDATxÚ%N«Ã@ 4ô†^¥´0°+ ì »F``¨a ¡+§&–ÞÓU¹¹ª² qXÒ çqî K ࢵ‚Ð]pêÁ›qðËŸø3×&”=èÛ¿-#—ùõž™S:ºbÁmìRÎ&jçüQ¸5cüëLCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature80bbda2726ddace8ab8a01f59de2ebdbýutEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/7.png0000644000175000017500000000053011234335462021134 0ustar aronaron‰PNG  IHDR s;bKGDª#2rIDATxÚ%Ž­…0 „OV"Y!²²‰¬ìL•O¾•¬Á Hdä‘+‰H¾äò’£ší‡“ ×e _ÊÐpD—²ã„l½ðC›0T+ÈÊ«+¤® ’VA†jÝ“ ƒ{ŒO•9ølsLGÉIÉz¼ó>61¿GVSCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature298368142ac43cebd2586d8d1137c8df&9é™tEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/4.png0000644000175000017500000000053111234335462021132 0ustar aronaron‰PNG  IHDR s;bKGDª#2sIDATxÚ!…0C#‘•Xdee¯P‰Ä"‘\£òËo+{%leåʰ!bç½ÙÌ$ûci 1 qá dCwC‚ôèmJVàÁ$‹Ë6ïhu•œTšj~<_­Â²ä¹|ËÀù™ó㣴 KªF¾ê6Ž[ê¼ÃCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature9f82fcac9e039cbdb72380a4591324f5€»øvtEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/6.png0000644000175000017500000000054311234335462021137 0ustar aronaron‰PNG  IHDR s;bKGDª#2}IDATxÚ!Ã0  š ú ýFa¾PXXj˜'”ú ¡†‚‚ªÌnçnöˆˆó©ºµ „oPêHÈÜl\BuNØ­«ð!‹«i`¥À°ÞûdÂÝÛ'äì× ¿ç,ÃË–eøÔ¸g¡NL©¤Lï< ÿV‘õðˆ?³s8ê ¸YCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatured25d7176d67a038afc1c56558e3dfb1aýõµtEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/5.png0000644000175000017500000000053411234335462021136 0ustar aronaron‰PNG  IHDR s;bKGDª#2vIDATxÚŽ¡Ä0  †ª—ðõ†~+_Bh  áýIlgvö’—ÅÏM‚áÖZmÖÃmã†Àwb$|SÜq$Ìñ^€%Ô)%¤•°ÞÔèõYP3ö]2­QÙjµ%—›õ|ç#[7/B_ûCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturefe690463379eb25e562fcc8cc9b3c7e0ß²9žtEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/10.png0000644000175000017500000000055111234335462021211 0ustar aronaron‰PNG  IHDR s;bKGDª#2ƒIDATxÚ%Ž¡!C#‘H,‰œN^ [¶p‰\»%Œ¤${‰Ì;‹û/yI@ò’à¥l\â\òyˆSM³}ßi㎋ªŠs¢à×uœÈŒèºËÿaˆXÌ  ÷eøÚ­ÀÜvù¶G¶j…É!=£dçRµ;?Ý¢CbË kCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature386e83bb9bdfba3227f58bb897e2c8a5Ÿ+ tEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/2.png0000644000175000017500000000054111234335462021131 0ustar aronaron‰PNG  IHDR s;bKGDª#2{IDATxÚŽ¡Ã0 D?44,5,ô ]£°°Ð+†f„¬ÐK UÉG¤{º÷u¸ÛÖkí»¹ãSàÞ@¦cB»æïSCá¸hS‰øž¤{ë2y–4Cm¬s^ö¹% Ðû D¯§+O£ŽJ)}‹:TÙ5`Ÿ/£CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature80eae529c94a7f47deccfada28acb9dfåo± tEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/1.png0000644000175000017500000000051111234335462021125 0ustar aronaron‰PNG  IHDR s;bKGDª#2cIDATxÚUޱ À0¿¤ô.)½Bf£té6#d¬Á”H¢(ð'¤ÿ‡»ÍÑÚXæW¨¬ 9c±A€M-!d>°0(Ï* ?ðœ/Èc}ÜÖ®5u„‰ÆŒ:Àx,ìÁT´CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature58a072e070da22f6135cbd3e414546f9hj!ítEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/callouts/8.png0000644000175000017500000000054511234335462021143 0ustar aronaron‰PNG  IHDR s;bKGDª#2IDATxÚŽ¡Ã0  –†v…¬Ð¼‚a` × 544T¥ é?Ý»/TõÜ—¸W[Б!Dغ…õ¹[`TÈ3Ð(”fñ•põçï¹g¿ˆcµÁÙ3Á1–Ø¿.0µ”>Џú_ê³ +U­9Æäïü£Ÿ9ºFbíCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature57be19505c03f92f3847f535e9b114e9Ù4kCtEXtPage12x12+0+0„m»}IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/important.png0000644000175000017500000000132211234335462021155 0ustar aronaron‰PNG  IHDRשÍÊäPLTE)))999BB1ZZ)ccBBBRRRkkBccRssRccckkk{{{ŒŒŒŒ9½½­­!­­9œœZŒŒ{œœcœœ{µµJµµR½½Z¥¥c­­k­­{ÞÞÖÖÞÞ!ÞÞ1ÞÞ9ççïïïïÿÿÿÿÿÿçç)çç1ïï1ÿÿ!ÆÆZÖÖRÎÎsÖÖcÖÖkïïBççcçç{„„„ŒŒŒ”””¥¥„­­Œ¥¥”¥¥œ½½„½½œ¥¥¥­­¥­­­µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷ÿÿÿ­ÒÃÞbKGDCgÐ bIDATxÚm’ SÂ0 Ç3Eñ1•¡ÀÔÉKÜPT”•‰F'µûþßÇ®Qïö¿ë]’_iÈK±B¥&ºF‚(å6àßñrúðcºŒ/‘Ñ´…\NÞÃh£°›* â2pã¹=…:©ôJí÷v•?°•¾ÿ 6Ôï| @}÷`ÿ^Û>ƒ¯µs P¿ÕvB¡É¨é@Ãd6"èo;g•`PsÎ+ÁÝÞÖs%˜Çǯ%@ÈS{4ñܾ•Už-µs"þ1чßÄ?øjª<`g ­ñeZÔ* Ô+½ƒÃ¦Ú2Ã_Yvì*ÿÁ¤è•lv¬~Œg Z¶[s“ôY[Ãa; =ùí/öoJĘ!¤f€þcl¯RmÌRCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec3ecc1fc5135d1e959695e569d213122riðIEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/draft.png0000644000175000017500000004205611234335462020251 0ustar aronaron‰PNG  IHDRŒ¶K°ZJgAMA± üa IDATxœíÝÛvÛ¸–…a<ËNºG¿ÿ3öèŠmQ<¢/Ö·¶’€ øW®TB1rÌ©,ÚZ«ˆÏ4MY–m}[2[ߟ躮m۾﷾‘-å[ßïu]w¹\¦išçY)U–åÖw´ *i@\–„VJãx¹\[OSI"rÐbùâ€õ´¦q ‰ ½È󼪪ªªÂßÕ†¨¤Qø&¡•Rã8*¥´Ö‡ª§ iÀö¾Oh!ãÞÖÚãÔÓ„4`c·$´RJk-õ´Rê 9MH¶tcB/•Ó„4`3÷&´8NNÒ€mô}ÿ@B‹ƒä4! ØÀc5ôµ#ä4! mM }mÙç$Õœ&¤Aõ}ß¶íú„Vè÷fïn@8z1 Ã0 KZ§„„ã<¡•Ryžc’Úsœ„Vì8ðÚ BàØÿýßÿÍóìöšLhÅp7À­þù‡„v…8Ã<´[ wÜ`Ú9*i€$´„4`-ÚB° í! xb^Ñ8x5´oTÒ€GÐÒ€»‘ÐaÒ€û0 sÒ€;ø«¡ëº&¡ß!¤·b”;0†»7¡†üÌkBC}Ž÷ðb$ô÷xkßñ”ÐeY’Ð?âÝ|‰„Þoàs$ôæxŸ ¡cÀÛx„Žïà?ÐñàÍü Þ/À¿üù󇄎 {w”¢†Žï€:R¼qptþüÇÑí5Ih'xïàÐHè˜1' ÇÅæ¡•RÓ4EAB;Ä[ ÇòÏ?ÿøHh¥”ÖúõõÕÓʼn€ñ1}ÍZûòòBN»BHÀQø˜‡þˆœvˆ€Cð4ý)rÚBÒ2¡9í„¶Ön}|ÏCCkýëׯzA=í •4Äew ­®êi¯}dêxõ4! ùóçÏîZHNWUŸ·C„4Äb/óÐ_a~Ú9B¢°÷„ä´[„4l/„ä´C„4l,¥„ä´+„4l)½„ÁrúÏŸ? ç4ë¤`3©&ô‚õÓ+mÿ-€cŠóä ·8z%*iØ@ò5ô5©§»®›çÙë ¥WOÇõ€#xyy9NB«€ûœ¤7?Ý÷Ò6ϳóí3cNh¦Lkظw¤ßNH•1&Ïó¦i´Ö®.yB Öe=€9iØÀ4Mã8¶m»ršv/ ½ ßû.ûø¦@b²,Ëó¼®ë5ẻ„VÔÓw¢’€Í¬©§÷˜Ð êéíï[ Éx¸žŽm=ô½¨§oD% »·ž–º®kß çõôvù R"õôeñ2ʽ÷„Vìï}B¶·äô÷ë²v=ý©%§½þö»~šánˆÅ4MÃ0\.—OǽÓKèkmÛú÷¶Öþþý{_ãÞ„4Dä«ùédæ¡¿ §ÕÞæ§ü8Z¹9ɧýÞGHh¥TÓ4ô{¿C% μ¾¾Ê$ëʤ¹®§’Ð êék„4¸!§OºÊTÉé®ë²,;NB rzAH€×çC»Êéyž§iʲ,ÉN±ï‘Ó‚€µ®Z¸Êik­«Ã²v‡œV„4¬ô1¡ÅÑæ’} §7„}•ÐJ©yžeѳïŒIýÞ„4<蛄äôz’Ó¾gå£ÍiBñcB rz½¦iªª:æþÞÌIÀÝnLèóÓë…™Ÿ~~~.ËÒëKÜ…JîóòòrWB+êiÂÌO¿¾¾ö}ïõ%îBHÀž¼$§× 3?UNÒp«•íEäôz2? ,’œfNnâªXk]–%óÓkg~šJ~æ°õ×ZK=½Òqæ§ iøÁbß›çyÇqË|ØArš€ïøØæBkçyžç‡Ý—Û‰#ô‘1' _ò‘Ь™v«mÛ®ëæyöú*[ÍOSIÀçHè]³ÙVýÞ„4|‚„Þ‘óÓZëMršánx„Þ£$×eQIÀ ¡w*É~o*iø·{Oθ Rbõ4•4ü‹óõЊ„.±uYTÒ £ÜiI¦ž¦’_;–Ð[I¦ž¦’ptÔЩJ ž¦’phž:Ïszs ô{SI8.jè#Øu=M% à HèƒØõü4•4€#b=ôÑì´ž¦’p8¬‡> ÎOÒŽ…QîÃÚcNÒ„„>¸Ýå4! à(Hh¨½å4! àXEÓ4UUí"§ iéó´ëgžçMÓÐ{T×õ.rš8£Ü$ô®Õuÿ¸7! eþF¹IèÄ??MHH£ÜøQäóÓ„4€4ù;}’„NLÌóÓl Ažvý¤†NØåréº.¶}C©¤¤ÆÓ®Ÿ$tÚ⬧ iI¡S ‹0§ ié S +Å–Ó„4€D°NDµ~šÆ1)`”nEÒGF% `÷Hh8ɸ7! `ßHhxCNÒvŒ„†W›ÏOÒöŠ„FÛîïMã€]bO1„´U•4€ýñ±§ë¡ñ­æ§ i;ÃÉØÄ&9MHØ ŸÓ„4€Ý`O1l.XNË?uBÀ>°/7" §ó<·ÖZks¯®°Ú Q©ëZ)å©ß»(ŠªªŠ¢ÐZSIˆ yª§¯Z1Ü r$4¢å|?²w ­ØÌ@ÌHhÄÏÕ>'ZQIˆ ]p2îýiB+B@œHhìÈÊœþ*¡! B$ôÓ49÷ð£‡sú›„VJ± @\Hè5Æq†a†q›¦ÙúvŽåuYß'´"¤D…„^Cºm[¥Ô<ÏJ)r:°»rúÇ„V wˆ ½ÆuB+¥æyîºnùOsã¸÷- ­¨¤D‚„^ã]B ÉiE=œÔÓ}ßu ê ­i1 ¡×ø4¡Å<Ïrž9˜ä´RêcNߞЊ°9zoZLÓDNoâÓœ¾+¡! `[þº®kZLÓĸ÷&Þåô½ ­i¢†^ãÆ„Œ{oeÉi­õ½ ­Ø»ÀVHè5îJèE–eeY’Óáõ}/‡—ߕЊ° ¯£Üyžøác -Èé­XkïMhÅ:iá‘ÐkHBŸÏçÇþ¸ô‘±~:¼ZQIÌGBk­‹¢8NB¯XcLUUÔÓñ£’ ½Æ8Ž}ß?\C_“>2êéøÒ!¡×úr¹<6júãÞ»@H„^ÃÕ(÷;Ó4MÓôÕÖ•ˆ! À;O }¨N1%ožçEQ$ÿî! À/5tÓ4ÉÌÊ^îoäy^UUUUί ‡èîà£Ükx­¡Iè] ’à £ÜkPCCÒèÐi£’°™ä÷÷–õÐ>jhú ¨¤l,Õzzåvþ˜e”û8¨¤l,ÉùiNÒ¶—XN“Ðp……drš„†CÌIˆÈ<ÏmÛîw~š„†[„4€¸ì7§eµ ‡îcLÓ4»÷^NŸ$¡á! :»ËiO»~ZkIèƒ#¤ÄhÉéø÷9ñ·ëgQ$ôÁ1' ^ñÏOÓ)¯iQ “ÓÆ˜ß¿ß›Ó$4|c¸@ÔÂÌOÏó|ï¸7 i±‹°lésžÐY–‘ÐXÒvÀÏyY^χæl+\cNÀnë#{~~βìÓÿëu”»,˺®Ý^»F% `7‚{¿¾¾~ú9ÀSB[ke”›„Æ;TÒvFêé¾ï½>¾>ÖÓžv,QtŠákTÒvFêé²,ÔÓÓ4-ÿé)¡éÃ7¨¤ìRÈùi¥546AHØ«09­µ®ªªë::Å! `ÇÂÌOû@BãÌIرe~ÚëúiçHhÜ(ßú`Éi¥”ïqoWHhÜŽJÀî…Y?í »Äþn±‹œ&¡q¯xÿ5À]"ÏiˆñŸ2<&Úœ&¡ñ˜¸þÀJæ4 ‡Åò\‰*§Ih¬±ý¿`pnÉém×O“ÐX‰uÒÒ´ùúiëQIHÖ†õ4 'i)ÛdßP®Ò8§Ih8Äœ4€ô…œŸÎ󜄆+TÒ!غ¬¾ï§iòú8BÀQ„Ééyž_^^Èi8AH80ýÞä4\ÑÖڭç¹m[ßóÓÆ˜_¿~eYæï%<*i‡Ã¸7ö‚pDä4vánÇ5ÏóåréûžqoĉJÀqcêº.Ë’zq"¤Ú’Óô{#B wãÞˆ•40îHÒ 9(Ò@\Æqô}¾BN#6ÌIy}}íû¾,K9îP)åû4|f~Zkýû÷oæ§ñ=Bˆ…$ôòŸyžgYVU•1†¨Œ>2D‚¢ð.¡¯UU•繜 áu™®‘Óˆ! lVJYkµÖEQäy^UQ ãÞØ! lìû„’ÓBf¬}¶A=mÒÀ–nIèOÑ\ 9 ÒÀfNh¡µ6Æ”eYE–eÖþ0î­ÒÀ6V&ô5kmÓ4Y–IaMZû@Nc„4°‡ ½0ÆÈª-9+‚1pç÷Fx„4š„^H]×u–eEQ( k§ÈiFHA½½½u]æµd5càn‘Ó‰ ™Ð²jË£µ–šæ2WÈiCH„LèOITSX;AN# Baó„^ ë<Ïe/)²7¼¥½£ßÒ€w›'ô;²s™Öyž+ ëGQOÃ7Bð+¶„Ka-;—åyΖà!§á! xgB¿ó®°&ªï,§ŸŸŸeäÇAH¾ì"¡¯I[ÙÒ\†Û‘Óð„¼Çñíímš¦­oänƘ,˪ªÊ²Œæ²Û‘Óð¼°ÖÊÎb; 9­µDµ4„+šËn@NÃ9BðeÇ———½ÿˆÉ.(Ò_FsÙÈi¸EH¾LÓÔ¶m×u ›Œ{7M#ƒá üü!§á! xÔuÝÛÛÛcVk]E<o­•„–½Pèÿ9 WiÀ£išÎçó0 üYkm]×yž_.k­×Çý½¤§¬®kc ÍeŸ"§á! øÕ¶­¤ì½ÐZ›çùét2Æ ÃÐ÷ý4MñüÀZkeÜ[¢ZŽÅÄ5rëÒ€_ÖÚ?þ<¶K"°ª*­µµ¶ëºaÆq”ýœßêÃd \ZÁi.»&9= ƒ×ÅxZë_¿~‘ÓI"¤¿¬µRL?|…_¿~-uª„ôc¥¹WR÷Ks™ÖšÀXPOc BðnÇ?þ<üÇó<zzºÞ·Y¢ºëºiš",[—ƒ¶h.aêir:I„4àÓmÛ>–XRž–eiŒY~Qʲ¶m§iŠm\nFXË8'CÓx ! „Ð÷ýÛÛÛÃ?n‹ia­¦i†®ë¢jÿ^Èзl ~ðð`~ ¤¬µooo}ß?|…ªªžžž¾ú¿òèïº.¶ÅZêoa-càÒwØæ2r÷"¤¬µ}ߟÏç‡âŒ1MÓTUõÍKÌó<üõèúu}zÇ1ÇÀeÆi yž_^^Æq|¸ˆ,˲išï³ÍZ+diu„«w]·æ eY>???–²Ëø<Ïã8>|^ÉsIšÀ¥¡=áÂ:Ìü´"§÷‰‚’yâ———5•“Öút:•eùp5,·!MàÑFµÈó<ùæ2êi|…B“C¦W®*ËRN±|ø ÒD6Žã<ÏçóYýÝj4NÒ\&ýeI6—ÑïOÒÀú¾yyY™4·/ÇúÑ4M²a™4;¹¦×;—©äÆÀÉi|DHbzå¾`EQ4Mãêi+…µ4Ë”yÌcÌua½õí8Ãü4Þ!¤m¬\‹¥”ÒZ?==•eéê–„µvÇqû¾÷+i­¥ \Þ„4ÒšœÆ5BØÆ<ϯ¯¯+›¶Œ1¿ÿöN²FKvA‰v'ðE–eRXgY–@T‡Éé<Ïe-Ÿ¿—Àz|Œ6“çù0 +g¦û¾—ÎgWw%äÙ]×µ¬Ô’>p·/áÌ©_.—º®%°w}Жœ ._{Êé,Ë\54À+*i`3ã8¾¼¼¬ü,ŠâééÉw&MÓ4ϳÌXKõsíºÜߺ¬,ˤ›2:~„4°‰½óù¼2Hš¦Y /dëïišú¾—IëÈóÏS×µ´˜©¸?U|ÅǸ7 ½/ w›‘ÕׇÇ0 r:…“»úŠþ«( ‰ 9b+Úú²þ{9½CVmí+ª—qoWG™‘лC% lìíímÍ.¡J)kíóó³„P0RU/Mà‘?Id·2iÏó|_Qíªž&¡÷ˆ¶$‡^œÏç•u’œº~×LY]}¹\duuœGa.äÞ–-Á#¿ÛkësÚs:HèÝa¸Ø’ ÆfY¶2¤eqsø>)y9i/ŠBšÀ£ýè/7v¹\´Ö}ßËY[Zëøske¿75ô~QI“búõõuåuò<ÿýû·“[zØ<ÏÖZ9bKÒ:æRUâ¹,K™ÑünÕ£õ4 ½k„4°½q___§iÚE›÷¤›Lvïû^ÅÝ®e­½ŽêÈXß›Ó$ôÞÒ@.—‹EµÆú£±Ü’#¶Ú¶uÕœì•4ÛKs™“®{OnÏiÙ±DÖ‹‡¹78Çœ495yeûn×uEQnóþ†l -3îRXÇÕó<Ë(ýRX—eáøë²Hè4PI±p²KŠéðmÞß“çŒë7o CŽÅ”íP"ܹìûzš„N•4kmUUÃ0¬©5µÖq- 'gUåy.Û–E¾ºZú¤g^VmEÕ\öM¿·lµFB§Jˆ…ì%VkÄ63ýÑõ[ñw–)¥¬µÒUUIUÉ ¬§1MÓÐÉ ’b!Ûú–#¡b~F/GlÉøü0 2„Iò}¤µ–#Fdƺ®kYà¾õ}½¯§åN•4‘išÚ¶íºne\Õu}:\Ý•o2î-Û–y=AÙ!éÏó\šã¶ýx!õô4MeY’Љ!¤¸8Y‹eŒyzzŠ¡Ô»4W÷}ßu]ÌUµÉiY¬%…õ¶Íz²•ºô¸mxpŽán .eY.3µ“À‹§Ëé2×+{‹n}/?“7VJ—éê­VmI/zàE|S¸HM¦õªQ.kíù|–µ×ïÍ·qåøË}¶P7NÇQñ”íP¨há! ÄEk]–¥œ(µæ"J)©ðöxÃ0ÈÄêçàäM–¨^šËŒ1yžïî3¢Âœ4éº\.+¯SÅóóó.b× ý)kmñ—ŒgìâØPIÑYæWaã8v]W×µ»[óbY3½õ¸$ËH{_-{ƒo}_Ø*i F®Šé²,Ÿžžb®áÒ«¡?%­²D*Ë2ÆÀq#*i FNÚÇ”R}ß—e)ûqFHjèäZýÝdt iYµEs~D% DÊZûòò²~¸ªª¦i"̃ƒÔП’¡oÙœÂß ’âUUÕú †!Âiiç5´ìã±—‰íyžå”Y¯UU…5>E% Äkš¦××ו;eÊùZQÍL/bº,˺®§i’^-ÙËÅÉňgç2Ćâe­íûþõõue¾fYöüüÉÓ_zW\Z*Q9ë³ë:Y²ìêU|³ÖcŠ¢Èó¼,ËxÚ¶i jÃ0œÏçqW>²›¦YŽKÚï„^XkåÐ*‰êø7¿&çvÈ)a‘|´ÂVi vooo]×­¼Hžç§ÓiÛí}$tQß·ÅÉ6æmÛÊ4°«—@6,«ëšM¹Œï=;i[Ù%Ç!»º¥«¡?þ69LŽØ’ F\݃Wò©BN‰ÞÑ0Ü"¤Ø9Ù[vGÉó|“âeµ•« Þ˜Ð׿_k}:Æq”C»­µ‘#J+Yžç$ô‘Ò@ìŒ1MÓ¬ï…–ÃšŠ¢üÐw¾úÞ„ò·Îÿ’PRª:¹+·äˆŽ¢(X—up|ûݼW†œŒ÷†Ohçë¡Hèw²,“ÓG꺮ªJEvúE–eMÓÐP4Ž{ÑuÝúµXZë§§§`»„FRCO¦iêº.†ªZNHhB؇yžßÞÞÖ7^ÕuÝ4M€ÂÑߎ%>ÒK¦¨¥èßpuµÌC“ÐXÒÀ>H„´m»ò:Zëççç¢(œÜÕWö•Ð ‰j™«–mËBƒ“Ðøˆvcžç?þ¬\I¥µ–‰XI°Ó„¾&CôRX‡'¡ñ)þ5{"F®¹‚TŠþ Dç ­µœÐJ©,Ëdû—§§§Û‰Ðø •4°'ã8¾¼¼¬_‹u:ä8W7&¨¡ß‘C$e w>NB㬓öÄSUÕårYsIyžÝî F ýñ”RyžËª­yže ÜÕöm$4¾GH{bŒq’¬}ßEá0¤Ó«¡ß‘C$1ÏÏÏKgÙÊmËHhüˆv¦ªª¾ï×/†ÁUNoµ/wxRXËBó¢(–F¸Ô²ëglGD…vÆZ+Gn¬qÕZËŽë7_jè5¹mB/䓳Ÿ‹¢†AÎļ=­—„æ$J|/ÒŸ_‘qW'½K—Ëeåètò£Üß“ïEUUOOO§Ó©,Ë[Þ‡e_n?¢»ØYFõöö¶ò:Y–É!ÓEþÁú#YT-Uõ8ŽŸ¾«ìú‰»0Ü ìÖZŽIž¦iMI-ÝOí>FB”e™,°VJɦåïfHhÜ‹JØ«¶m×ïjŒyzzº7§Iè[,çvÌó,ÓÿMÓ0»PI»d­-ŠBÖ­¹ŽT{wx“Ð7Zή–ÕÕUUI©½õ}aOi`—¤e)˲õ;K·m+Ê·üfú^˸µ6Õ¿#üá_ °WZëõ‡NÊ¿1t}ì)VE ½6‚­ïûÃ?`ßœ:ÙuÝ¿ÇÓ®ŸMÓ^ÀWøÙ@ÔìÚúv¢“e™ì~µ’Lš~óHh`ÌI#"²¬ÈZ;ϳœA$[k-7ò…ÖZ~›¿SwA~X¹%§¼ÛÒüñÿú˜‡.Š‚„~DHcKKOÓ$t(¥–Ó%9ä u5«gŒ‘Þæ¥yJ]EøÑHSÒú}³»®Ë󼪪w¿NBb4¶!¬”êºN¶Ôx¬,–zZ‚JjJõ·ê8¬µ///+w϶ÖÖu]×õõÇØ•4‚’†A6yX¢Zbõp•¹êyž‡aM¸deꡤZkó<—ш‡/¢µîûþº’&¡ÍQI#™õìºNBÚk½[–å2x{„ÂzÇ———•?ÎÖÚ²,ŸžžŒ1$4B!H±+}ä à IDAT)øÂgñWòUµµör¹œÏç•ol–eOOOr5Ø! ï$˜Û¶Ýd•LZ7M³œ|ª¾ï___×’y}ˆ! ¿º®ëºneOÓzÒ\&ÛOn{'þXkÏçó-Û’„DBk¤\X`CÖZ9XW èÍg…­µrʯ¬Ýʲló[òAÖbI/^ d×Ox•4Ü“Ï}߯_¼ëƒÌRWU•^NÏóüúúºù¸… †Ö£’†cÖÚ¶mû¾§ž{Gz˧iJ/?Œ1UUÅÒ$4à??pFúÂ^__å”û­oç;óç/¡åŒ&é:^ÿ¬—1ð¾ïû¾†Á_xü×ý×~Ïœ–·è|>;ùyÿõë×~Ç€}a¸ŸõÐnÏZ›eYY–eYfYæêâ˘¹Ll;ÔýôUd˜w§¤ ]¸jëû^zÖ_ À÷ø1Ã{RC;O£º®O§Óétr˜Ð×ʲ¬ëÚÓ ´4¬ù¸r0r䆓Kãèä:~DHã?xÚSìt:UUU–¥úÛæƒÌsÿþýÛG‘7Ž£“é­H1ídÄ~š&W#ç¾GHãß|ÔÐZë_¿~•eéiÊw¤“ùùùÙÇGä^I7€“¿‚4د¿€ïÒøçb²½³4ž¿Ìóüׯ_n_ÔZÛuÝ®“ÉZ+õë/%ëßÖ_À÷i(åa”[¶w>Na 褞v˜ÓRšï:¤—}cÖ_J>²Ó€o„4ÜrËÜp]×Û®Yʲ¬i‡”…L»ñ6Æ8yOd8ÙnýÕ|…>:ç5tžçMÓlžÐêïAû½%™v]L«¿ÓN.u¹\8uˆ!}hÎkh Å<Ï#YD++³î¼!士«mÂá§ -‘‹âIŠM8ï‹-¡…/áêjËš®.¸‰¢(œäô<ÏÃ0ìýÝbÑÃ!9OhÙ+#¶„eY:áa¸jSJMÓ”ÀD+ºç)ð4gB ‡ËÀäèL'—ÚŠœ8éªÍ[N])EúH…?Î÷åŽs”ûš´JeYæd`VNÉ\mYk˲tòÏàr¹Ò€'‘>UáIòb_qX;¦±îH¶fsuµ½oóD+ê+Ü:H§ØWœœŒ¹\'œ–åì믣µ– SxO€ØìàÙ 'žÐJ)cŒ“L’¥Ò{Ÿ–V®ÛÇœŸm @ÒAB«¿›b®¿á”¢¨ª*'k±¤˜¦Ípn7OX<Œ„^8¹g é4†våÈ ';æyÇ1·ˆÇβ¸ ýÎúédkmÝÝB™v56Ð÷}2ï ‰]>gq#úÙÍÛÉu’ô–]hœTÀòñeïÛ¦QÙ壷8Ôžb7r2-Àf&ïdYæä³‹µör¹0â 8´×§-¾ç£†Ž|O±­ÏWiŠN)ŠŠ¢p¸½y×u)½9À¶öýÀŧåþ†1feNËf&)ÓÖZÙ‘ÍÉ¥dÍôúKP„tzHè­‰‰ç”Zýms5<0 C×uë¯@Ò‰!¡o±&bÝæY<´Öu]»ÚÛdÚ¼'Òyò‚„¾ÑÊ|Õ¹ºŸH¸j}WJÑã ¸’ÔÃ÷ÈHèÍó¼&?d¸;±2ZdYæd÷1¥”µ¶m[ŽÜÖKêù{X¬¶ºÝ<ÏkþR2ÜÞÛ"òˆ£m[ú.rÊäš+aüÖá§:È€•Ò|AÛ¶mÛ:¼`ò -eôš–3£R}„1¦( WŸEº®c-°FÊ›„‘ÐY?úº~òøIÛ ««õ}O›7𰔟ȩ:ŸÏ$ô¬µ+‡^Ýîq-Y0íêÃ0 ɬüIù¡œ$æ¡¶ò´ckmòoÑ¢,KWíc²fúsù€Gyè¤QoÓZWUuœ¢°( WÙišX3 <&ñGsJHè5¦iZ3!m­Í²,áÒïh­‹¢0Ƹ:rƒAoà1é?Ó@B¯1MÓúW‡#À» #g¦‡apr)àPÒ@'€„^cÙelM%W…«}­÷Âaû˜ÖzGΙþ3zïèå^IkÝuÝʾncŒ«cwÄá‘Zë¶mÙØ¸×!ÓûÅ®ŸëÏç•ûicš¦qu?;"3Ó? Ã@1 Üå(Oê=b”{½¾ï׃LE³ïÉaû˜µ¶ïûõ×å(ëÝiÛö|>; †&ô4MÃ0¬ßîª,ËŽu kmÓ4®þú+{ì:Êóz_¤†v˜Ð ŸýaÖGB]×Gk»&«Îž_éäcpzdï…QîTχþF×uçóyåEòlB;Yí##Nniïò첫Oi­ëº^ÿ©EkÝ4,¿vrc@Úø9Ù˜ìúé¶b³ÖÎó|¨JEþÊ®Î->N‡:KãFòÙeå$¡ù܈'Ñ–Ú¶u»ëç¢ë:©Tò4´Ö¾½½­¯¡­µRCú±ÉZ+¿.Çu\ ÿ\~q9Ôrù#ËûeŒ‘)€Ç> ‘ÐÀéÍt]çv=ô5kírñ䟉ó<¿¾¾®_Õc­Íóüã‘”ËÈÄ<ÏÒ’¶¼–µÖZ+gÊr?Y–É/j­1׺ò…ü¯ÝŶ,`wOx !½ y çyîoc‡ƒä´$´«·±,˲,Õß`VJõ}/Ù,9½‘ïêæå×åëŸ$¯3[¾)ò@~1þj[ί¼w;tx؃#WXÏZ;Žãår†Áß«¤ý|t›ÐUU5M#ß—e—é•QE~î$›•RÒå·Œ'ÇœÙÖÚ?þÜ5nq:RýøFHo)LN«DŸ’nZ)U×õ8ŽŸÖÁ¾-¹Ä³DµÔôKGØr˜Õù|¾åÑ!=áG>¡X‰áî-É㸮k¥”לNoÜÛyB+¥œ·Ùßny]c—O RÊËæá²1çõYÞêíÿŠÅ ’ÞžÔÓmÛz=x ¥qo ­e`|écÝÐä?·*²/—Ë÷‹ûSú÷lˆŽóÓ·;TB¿³t«ÉwPzÈó<—5cRd‡ ìaÎçó7óIΰá1Ü…0ãÞ ô{ÏóüòòrØ3”–ºYFÅ—þs¥”´‹/­gÛþ2»(Š<Ï?ýF¤ñYˆ•tD¨§¿wäúGï&ªË²”Ö3Y- ¸¶´×½¾¾¾Û@f¿ÿº€8QIG„zú$ô÷®X°Õß"ûz}—1ÆI뙿1fš¦å:$4à•tt‚ÕÓ;ZsðQî•®#YN ’ïþ²!šz4°‡axyy‘¯IhÀB:FŒ{_³Ö¾¼¼PC;±ÌRË0¸L]KëÙEö4MmÛö}¿—KÀîÒ‘bŸAB‡!%µDuQêoëø­grH xBHÇ‹zš„iYß%©,G>ËØø²ÉÇÀ–c¼—­È¸EHGíÈ9MBoèzT\)u]dËðø»“E"Ù²H!»cæô§8ÀŸwI,E¶tJßOX‚»®Ë’š„ŽÇ»õ]Ã0\Ÿ¶ ÀBz•ÓŒrGN¦¨eÜ…2ðÞ‡ƒä4 ¿ØfF€´ñAx7–œ–2žXkÏçó0 ›œ©LBGNvA!¡`¨¤÷$áó§7IhY<ϳ Û^·G-[RËt/+jh` „ôÎ$9[–É!Q2Ÿj­•ÕD×냗ÿœçÙþ%÷6Ž£ü§×ûŒ54!½?‰å´ï^nIb§UJÉ×êæâx‰d‰m9Rbš&In òq½ž ¹¹}íô¤„uÒ{•Æúiߣܲ+u]×ú¯õ×\JmùÙ‘´–…IJ)ù:±‚»iØ!½c{?/Ë_BË*Þ²,ó<Ïó@ÃEò£$sØó<Ã ß )ÁÃ܃sÔÐÀ¶é}ÛoNûKè,˪ª’z«ñçë‰m­õ0 ó{š¦Aˆ !y¦w]×÷½×z`Mާ„.ËRÚÄÒHèw$°µÖ2¾´ž-­¸ý[“Ð@léÔÄYO“ÐN\ï€f­íû^Šì¥ø^ó>Ð@„é…©§o¦“Ð>\·žÉ`ø²&ûjˆÛ‚&Hö •¯ýå´µör¹(¥¾²“О,ËÌäT´¥È¾^ßµÔÙêÛ"›„¢E%¬êizïf²…¶úÐ.NB1#¤S¶mN“БŸñ%ª¥]|Ù „bFH'n«>2:N×­gêïa$4-B:}áëiz"Ü‹À;4Ž¥/pYQçó™„Žï$?*é£VOk­ŸÌHB8&*é£VO;ÿØGB8,Bú@Âä´[$4€##¤e_9MB88Búpö’Ó$4ÒGN“РéÊ9§Ih„ôqÅ™Ó$4,éC‹-§Ih¸FHÝ’Ór¾á†wBBÀ;fëÀö$§ëº–“‰7ABÀGl Š ³oè§HhøÃÝø—­æ§Ihø ! ??MBÀ7˜“þÜrPÄõËáNÿo2–ùé²,}¿–1&Ïs¾B%­–¸•ÿœ¦ÉZ«µž¦iùõ71Zë,Ëä÷cŒ1J)­µ1FþàÞ#'ظ÷4Mó:Ü“qžgcL×uÓ4 à ±ÔÊ_UÀ˯ú®G¼­µ]×-ñ\E–eyž/Õ¶‡¿/Áêé¶måå²,ó÷*°G‡X‚%ð8ŽÖÚ¾ï§iZŠfÁ)oìRU—eiŒ‘¯½¾®[aÖei­eœœ€k‰‡´$±Íã8JNoò¢EQcªªZFÈÃßɽ‚­Ÿnš†œ€k)‡´”ËmÛÎó<Ž£ŠfÀ9Ë2©e{ëÛù9 ›H3¤¥t–ê9Ú¿ µ6Ïó¢(dê:òšœ€ð é®ë†aèºNES:Oê麮#ož ™ÓEQìbŒ¼J'¤eÝÔù|–%U[ßÎÝ´ÖEQ”eYE´Ÿ-Èi)‘‡à0 }ßã¸ì@²;Òy> CY–yžWUaxàuYŠõÓŽm÷O@i {{{KcH@VZã8 CÓ4²AÊÖ7õÈifßÃÝã8ö}¿ì†±õí8–e™ €G˜Raƽ­µ§Ó‰qo‡µã–„sXÓ†´Ö§Ó)ÏóØzÊÈiðm>™©=ŸÏÃ0ìwúvó<¿½½ÉyŽUUm};ÿloƽÖΞz²}ØårñÝ]Æ—‚uš¦ÓéOCYÈùiò!§ÊžyÖÚa.—‹lv4ó<_.—išd™V$ eÁršó²Ðnžwó<Ë.%ÇLhõ·¤†AÚ뺎d–š~oðd»yžÛ¶•|Úú^¶'{’Ïó|:Œ11 }/9-£þ^è|>7M£Èiǰƒînú+Ƙ¦iâiü–~ïËåâ»åžýÈDì!=MSÛ¶;Ýé3­uÓ4²¢zë{QŠœ§¢éiš^^^ˆçïÉPsUUeYn}/J\?-çe‘Ó¾‘L[k­µ1,¤3?­µ¦ß@ò"}ºÅ“ÐËHÃÇþ¬xÖ++¥Æq”Ié«Ú–ä´¾I¿7<,ÆGÛ0 oooÁZbXâV´Ð-k‘µÖÒS-_ÈŸšç9ªœV7ý¨ªjó®oÖeÀzÑ=×.—˲½TÆeYJ¨dYf­•„»oõ·n–Qe­õ<ÏÛã8Ê>hó’Hèät×uÆ­u ç”0î àÈœ=Hè`|ç´\<ÏóBZýݵF¾fÜÀ¡¸9Ž‚„LZÜýe‰µöõõ5Ì)×7*Š¢ª*ß“åmÛö}Õ_À‘9xʓЛXêéa|ì&ÍÞr>·ó‹?&@=͸7€¨¬} ‘Ð*ËRV¢{ªü¤‰¬ªªxeÜÀ¡¬z‘Лóº.ËZÛ÷½|ˆç1rÀq<^!‘Бùé,Ë|lÃ>MÓù|Ž'¡óÓâÁ*„ŽJY–ó<ûônÛ6†íB¯1? ੤IèÕuí/G‡að}²õ¤žö½‰©lAïõ°8øÊÝõg[Eët:i­}œÃ1Žã0 yžÇÓA&–zºë:×·Ö6M£µŽmÀÀAÜ÷Ìõw¶ íDÓ4žÞF¯g{¬QEY–žêé¦iʲd¬ÀVîxúxå–c—HhW꺞çÙÇè´œ‘abyª§ëº&¡lëÖóÐ{¡µ–²ÒyNOÓ4M“1&¶Aoå:§e”›„°¹›žAþZ–¹½ìÁ-'R8ï÷–=Èb8ÅòSsš„‰ŸK"¯ Ûž4HNû8!C–MGÛêìd~šQnñøáI䯗›„öJk-oï<Ïn¿}Ó4㸔­±YYO“Тò]%í¯—›„@rÚy1-˱Ü^Ó­‡ëi@l¾ i½Ü$t0Zë_¿~9Ïé¾ïËik- BŸ‡´×^n:°º®ÝöcÏóyvË<4bi&²²,Ýî™åã3œs·ä454€˜½iæ¡Ó“eYQn½çyîº.òbZÝÓÔÐbö!ͯÐâ—w]çi£G¹¦µ–³xãÑ4Í4MÏÞèû>˲ÜøTQr«{ù`ààŒ]?}ßûèÇÃdÅ‘ÃLóéodYFBØ óßÿýßþ®.E9­µ1¦( WÃnërÀ5£”úŸÿù/@NÇÆSU•ÃoÇ^ÖbÀîükØ“œ>”,ËN§“«oÇŽz¼`_þ=7 §½ÎãvZë,˶7;? Þí8æ;§‡a §#!ë†\JL;¹àÚû._êéãp¸lšJ|ød)Ž×œžç™z:Czz¼À¹Ï×Ë2î}²%œ«µX|7À¹/7µ §À“繓ïBß÷,Ä·¾ÛyŠùéä¹ÚØDkm­å[ ný°=$óÓiÓZçyîd-=ÞàÜÏ{8SO§-ÏscÌú÷ßþåä®ê–VÔÓ©+ËÒÉ‘Ó4ñM‡n}4ÓG–0Ièõoþ<ÏK ÝQ?‘Ó©’ö±õ×™ç™bºo“œN’1&˲•E°µvžgŠipèî™Hr:=ÖÚ¢(VNKË*,Å®&àÎ#Ïer:1ZkcŒ«ÕÒNn   iź¬eY¶þ Ÿ¦‰ánpåñNÖe¥DN˜^¾_àЪiHƽ“¡µ–Aï•×áÌJphíC™œNÆúJšÇÀ-ûL‘ÓiXßö%³Ñ|§À!­ÈéT¬,¦e©´«›¸ iENïŸ1ÆÉÞ|Àg!­Èéý[¹©§«õÖá2¤9½gë»»i·‡´"§wËZ+ ±Ö\„%XàûVìG¶[+Ka†»À-/!­ØlŸÖ¿Ÿ$48ä+¤õô­¯ƒ ipÈcH+êé]‘Ó ×¼™Nfµ ¿!­è#ÛkíÊ3¬ä”B\ñÒŠœÞ ©ƒW^ÄÃ7\ Ò*TN³'åã8®œw BZé#»\.”q‘Ùèõ•´“‹D¸Vô‘ELÞ½•ÉóÜÉîßú‘ʸw„\}¬Y¿±(àÚÔ9͸÷½ú¾Ÿ¦iÍ´Öyž»º€Ú$¤ýÞ‘Y¿øJ.’ç9ÒàÐfƒ“Œ{Ç£ïû•ÒÖZúºÀ¹-gÃô{“Óß›çyå@·ú;Ö]…“[ˆÛ|ô{“Óß›ç¹ïû•‘½Æ˜_·¶ïÅ¥žÞ$ôú7Gk]–%ÒàÖö!­ü×Óäô§¤ðÇq}ËÝàC!­Èé-h­»®Çqý¥ØÆ|ˆèÁJNÖ÷ýúÙh¥TQ´v€…´"§’µÑëûº•Ryž³ øWH+r:”qÛ¶]cLUUë¯ø(ºVä´ã8^.'—b—1ð'ÆVä´O²|ÜI¿˜Rªª*ZÆÀ“x¯ä´ÖZkm×uN6©ëš–1ð'ÞVä´Zëóùìä¯,SRF€?±?aÉi·Îçóʳ4EQÔuíäR€OÅÒŠœv§m[W eY]×lÖ ^í ¤9íÂ0 Ã08Y-Çicèë¯öÒŠœ^g†¾ï]utk­›¦a6|ÛÓs–œ~ŒüÕº®suÁ¦ihê€öÒŠœ~ˆÛ„.Ë’„€0vÒŠœ¾Óår9ŸÏ®Ûzz#ÍIDAT®¦µ.Š‚º Œý…´"§oæ6¡•RUU±S7³ËVäô ú¾w›ÐeY’ÐÒ^CZ‘Ó߆Áá<´RÊSÝÒ¾Ÿ¹äô§†a¸\.®\)¥Œ1eY–eÉÂhiß!­Èé–„v¸˜1¦iÛ}H+ÿ9ÝuÝ^rÚSB???“Ð^ !­<ç´µvõ´§„>N$4l"‘V‡÷–„†ÁaBk­åÄhB6‘NH«ç´óN1‘çyQì/[I*¤Õ!sÚÇ(·ú{\4 J-¤ÕÁrz†¶mÝ&´µVº‹¢puMÀ iu˜œ–zš&·5´Öút:‘а¹4CZ §=r+¥žžžØþb ?â£ò¿ÿû¿þ.®µ®ªª®ëð›e’ÐpÉVÒ"ÉõÓþºiš²,Ý^ð°ÄCZ÷nÛ6XNûK說Ø¢’~H+ÿ9--ÖrÚwB³à ¢rˆVIä´¿„–®hç€Ø$Þ8öŽ×>29q¹i}d¾kh"t”JZì´ž&¡à˜ŽÒj‡9MBÀa.¤Õ®rš„€#;Öœôµøç§—Ó'Þ˜ ¡`ŽXI‹ÈëiO§O*öã¸!­"ÎiF¹êÈÃÝ‹ØÆ½åˆCWÒ"ªzš„,i¥¢Éiæ¡×éÙ<§™‡¼ÃœôØj~Z"|š&° ’þ›ÔÓRC“Ѐwé÷ç4£Ü€¯0Üý¹0ãÞÓ4‘Ѐ¯Ò_òÓY–Ykéå|…þŽ×œ–w^kíö²$4$ƒþלvŽ„€”Ð8ö¯}dn‘ÐBúg»ÈiÒCHß$òœ&¡ I„ô­¢ÍiREHß!œ&¡ a„ô}¢ÊiÒFHß-’œ&¡ y„ô#6ÏiŽ€~І9MBÀAÒÛ$§Ih8Bz•À9MBÀ¡ÒkËé²,Ih8BÚ9]–eUU$4 §`9ãï¼,F¹à˜¨¤ñTO“ÐpX„´KÎsš„€##¤s˜ÓtŠÀÁÒî9Éi:Å„´+sš„(BÚŸ‡sš„BÚ£rš„,i¿îÊipöîÆœ&¡ïÒ!ü˜Ó$4à#B:orZ:Ïó÷ˆ!Χ9½$´Ö:ü-bFHõ.§IhÀ7éЖœ&¡ßã¨Êm¼¾¾’Ѐïý?`uüÐð«ÎIEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/next.png0000644000175000017500000000217611234335462020126 0ustar aronaron‰PNG  IHDR#Yi†&PLTE„Œ!Œ!)”)1œ1BœBJ¥JR­Rc­ckµk„½„ŒÆŒ”Δ¥Î¥­Ö­µÞµÆÞÆÎçÎÖïÖçïçï÷ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1£`ábKGDˆHIDATxÚ½‘á à „Uâ\³¶&†{ÿW]«ÝØŸ2!BrwA~Ÿp)#Õ€6î¯L£è2ó»²è”ÅD@•nöR²ÌŒ¥ÅQK%+÷uKe›hÜ݇ YA=õììqfn ŸWRÓ™±[Pßz¯ 2ëÑñ4æµ±˜¨y¯,Ǭ¿ü×:l&ÕXDzìCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturebcb022e8ade53bb4f94fb0f70d7c0a8cuœktEXtPage35x15+0+0~FòIEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/tip.png0000644000175000017500000000070111234335462017734 0ustar aronaron‰PNG  IHDR*Þ bKGDª#2ÛIDATxÚu’»à @!+xŒ¬’6¥K—¬àR+hJ·”–TaK >ßžþRh~j?ïg0qF@”Ÿøƒð!¢ÊòeH,î…0܆x˜”0‘&p „^—µªJéÄ5y»=ôJØ % P<†*ÄŸ{Œ®”¨…Š–×Âj÷ #û7±^ñóŸÍL~Ù!=™ ä&Ṳ; ‘&rgߊFâm‰¬Í©×Pý•¬Ö;Ùä óot6BöJäqC ìXduÀê³Ýi]}OLð4+|) -íCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatureee9d877396ce267aeb0179d35f81b2ac3ú'tEXtPage25x24+0+0¾ñ ¯IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/note.png0000644000175000017500000000075211234335462020113 0ustar aronaron‰PNG  IHDRÅb$bKGDª#2IDATxÚe’!’Ã0 E}¾……K C ÿtAQCACQAÁ+g“4m¥ÉŒãçoKß.ã Ÿqþ•c ¢üô D«Ô="¼ú²s ˆÇ%‚äd¼ÇœH ô1Ÿ›à²ÿy%ØM8ÓöfÈK ¢wª¬Öµ>i6g-NpÖ‹˜Y‡tL#÷ßŸÛ a–Žb;UÍ#2ÇØV} °Ô£rßVŠx¬]ÛzTîT÷1úºÜO HËè4Ý]o žíÕzÌÎ§Ïæ™gç"Ó’NþåHl¶ó§‹U÷‹Äuýœß¯–Ñä9¾<†t‘,×tÓß_‰)2Håž•÷d úkBCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature3bd747c5e45807006b090dd3e7a26c44Ó“útEXtPage24x24+0+0r[ 1IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/up.png0000644000175000017500000000212711234335462017570 0ustar aronaron‰PNG  IHDR#Yi†&PLTE„Œ!Œ!)”)1œ1BœBc­ckµk„½„ŒÆŒ”ΔµÞµÆÞÆÎçÎÖïÖçïçï÷ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²»™~bKGDˆHfIDATxÚ•KÀ mëAîÙÖI+¤oÁ†É@^P?á'#H];á°<ùR‘Í[æPeéâ0œ2&t<*§Ï¬‹7Sm¤Ô&Ji»Gš¾ ËËß=φKa1{Þäg´ ¦ưCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignature2772383288e9cce11a512e2a8adf37b0k ´tEXtPage35x15+0+0~FòIEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/toc-plus.png0000644000175000017500000000041011234335462020703 0ustar aronaron‰PNG  IHDR Èä)‹bKGDª#2#IDATxÚchÿ`À¥ÿ#óðò@ÈC"Ô£™j?RJl²d™:4CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatureab17802e1ddae3211b1ce6bc3b08aec7{ú¦( tEXtPage15x9+0+07vð¸IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/caution.png0000644000175000017500000000234211234335462020605 0ustar aronaron‰PNG  IHDRשÍÊPLTE!!11BBZZcckkss{{„„„„sŒŒŒŒsŒŒŒ””””s””{œœœœsœœ{œœ”œœœ¥¥¥¥c¥¥œ¥¥¥µµµµZµµcµµµ½½½½cÎÎÎÎÎÖÖÖÖÎÖÖÖÞÞÞÞ1ÞÞ9ÞÞBçççç1çç9çççïïïïï÷÷÷÷÷÷÷÷1÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_§ä\bKGDˆHñIDATxÚu’ÛŽ‚@ †ñÀ®bÌ®ÊIc¹APÛ`bxÿ³sBEíU§_çïOh¿<Îô`Ó'€á1û§wpŽÜä õW–Èt:%suá&³w,ÀHêéȯøf Øþ“Èü‚—²59 ævÀ:€Ç\^ F;`çªHãJ'Ê8‰ƒ71€›íZJ²Æ+ïçb²2B‘¢8·ÀŸ›¤Q§$×wŠéRKÕ ´v)ÎnR˜Áp¯t¤ß} Ì²ŽÅîéŸVb¢Tšz·Dç ±·vã@Ïí=”rPºþ—§¥duõ—Ÿvz{Nël;—a*CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec70387830aa4ecd5a4a32a852283b3d6øP¶tEXtPage24x24+0+0r[ 1IEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/images/blank.png0000644000175000017500000000056611234335462020240 0ustar aronaron‰PNG  IHDR€€L\öœgAMA± üa-IDATxœíÑA À0À¿çMF4 z×;3'ÎÓ¿kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À`fýHfIEND®B`‚libxml2-2.9.1+dfsg1/doc/tutorial/apf.html0000644000175000017500000000560511234335462016631 0ustar aronaronF. Code for Add Attribute Example

    F. Code for Add Attribute Example

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <libxml/xmlmemory.h>
    #include <libxml/parser.h>
    
    
    xmlDocPtr
    parseDoc(char *docname, char *uri) {
    
    	xmlDocPtr doc;
    	xmlNodePtr cur;
    	xmlNodePtr newnode;
    	xmlAttrPtr newattr;
    
    	doc = xmlParseFile(docname);
    	
    	if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return (NULL);
    	}
    	
    	cur = xmlDocGetRootElement(doc);
    	
    	if (cur == NULL) {
    		fprintf(stderr,"empty document\n");
    		xmlFreeDoc(doc);
    		return (NULL);
    	}
    	
    	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    		fprintf(stderr,"document of the wrong type, root node != story");
    		xmlFreeDoc(doc);
    		return (NULL);
    	}
    	
    	newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
    	newattr = xmlNewProp (newnode, "uri", uri);
    	return(doc);
    }
    
    int
    main(int argc, char **argv) {
    
    	char *docname;
    	char *uri;
    	xmlDocPtr doc;
    
    	if (argc <= 2) {
    		printf("Usage: %s docname, uri\n", argv[0]);
    		return(0);
    	}
    
    	docname = argv[1];
    	uri = argv[2];
    	doc = parseDoc (docname, uri);
    	if (doc != NULL) {
    		xmlSaveFormatFile (docname, doc, 1);
    		xmlFreeDoc(doc);
    	}
    	return (1);
    }
    
    

    libxml2-2.9.1+dfsg1/doc/tutorial/apa.html0000644000175000017500000000410211234335462016613 0ustar aronaronA. Compilation

    A. Compilation

    Libxml includes a script, xml2-config, that can be used to generate flags for compilation and linking of programs written with the library. For pre-processor and compiler flags, use xml2-config --cflags. For library linking flags, use xml2-config --libs. Other options are available using xml2-config --help.

    libxml2-2.9.1+dfsg1/doc/tutorial/includexpath.c0000644000175000017500000000272311234335462020027 0ustar aronaron #include xmlDocPtr getdoc (char *docname) { xmlDocPtr doc; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return NULL; } return doc; } xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath){ xmlXPathContextPtr context; xmlXPathObjectPtr result; context = xmlXPathNewContext(doc); if (context == NULL) { printf("Error in xmlXPathNewContext\n"); return NULL; } result = xmlXPathEvalExpression(xpath, context); xmlXPathFreeContext(context); if (result == NULL) { printf("Error in xmlXPathEvalExpression\n"); return NULL; } if(xmlXPathNodeSetIsEmpty(result->nodesetval)){ xmlXPathFreeObject(result); printf("No result\n"); return NULL; } return result; } int main(int argc, char **argv) { char *docname; xmlDocPtr doc; xmlChar *xpath = (xmlChar*) "//keyword"; xmlNodeSetPtr nodeset; xmlXPathObjectPtr result; int i; xmlChar *keyword; if (argc <= 1) { printf("Usage: %s docname\n", argv[0]); return(0); } docname = argv[1]; doc = getdoc(docname); result = getnodeset (doc, xpath); if (result) { nodeset = result->nodesetval; for (i=0; i < nodeset->nodeNr; i++) { keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1); printf("keyword: %s\n", keyword); xmlFree(keyword); } xmlXPathFreeObject (result); } xmlFreeDoc(doc); xmlCleanupParser(); return (1); } ]]>libxml2-2.9.1+dfsg1/doc/tutorial/includeaddattribute.c0000644000175000017500000000216011234335462021352 0ustar aronaron #include #include #include #include xmlDocPtr parseDoc(char *docname, char *uri) { xmlDocPtr doc; xmlNodePtr cur; xmlNodePtr newnode; xmlAttrPtr newattr; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return (NULL); } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr,"empty document\n"); xmlFreeDoc(doc); return (NULL); } if (xmlStrcmp(cur->name, (const xmlChar *) "story")) { fprintf(stderr,"document of the wrong type, root node != story"); xmlFreeDoc(doc); return (NULL); } newnode = xmlNewTextChild (cur, NULL, "reference", NULL); newattr = xmlNewProp (newnode, "uri", uri); return(doc); } int main(int argc, char **argv) { char *docname; char *uri; xmlDocPtr doc; if (argc <= 2) { printf("Usage: %s docname, uri\n", argv[0]); return(0); } docname = argv[1]; uri = argv[2]; doc = parseDoc (docname, uri); if (doc != NULL) { xmlSaveFormatFile (docname, doc, 1); xmlFreeDoc(doc); } return (1); } ]]> libxml2-2.9.1+dfsg1/doc/tutorial/ar01s05.html0000644000175000017500000001637611234335462017165 0ustar aronaronUsing XPath to Retrieve Element Content

    Using XPath to Retrieve Element Content

    In addition to walking the document tree to find an element, Libxml2 includes support for use of XPath expressions to retrieve sets of nodes that match a specified criteria. Full documentation of the XPath API is here.

    XPath allows searching through a document for nodes that match specified criteria. In the example below we search through a document for the contents of all keyword elements.

    [Note]Note

    A full discussion of XPath is beyond the scope of this document. For details on its use, see the XPath specification.

    Full code for this example is at Appendix D, Code for XPath Example.

    Using XPath requires setting up an xmlXPathContext and then supplying the XPath expression and the context to the xmlXPathEvalExpression function. The function returns an xmlXPathObjectPtr, which includes the set of nodes satisfying the XPath expression.

    	xmlXPathObjectPtr
    	getnodeset (xmlDocPtr doc, xmlChar *xpath){
    	
    	1xmlXPathContextPtr context;
    	xmlXPathObjectPtr result;
    
    	2context = xmlXPathNewContext(doc);
    	3result = xmlXPathEvalExpression(xpath, context);
    	4if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
    		xmlXPathFreeObject(result);
                    printf("No result\n");
    		return NULL;
          

    1

    First we declare our variables.

    2

    Initialize the context variable.

    3

    Apply the XPath expression.

    4

    Check the result and free the memory allocated to result if no result is found.

    The xmlPathObjectPtr returned by the function contains a set of nodes and other information needed to iterate through the set and act on the results. For this example, our functions returns the xmlXPathObjectPtr. We use it to print the contents of keyword nodes in our document. The node set object includes the number of elements in the set (nodeNr) and an array of nodes (nodeTab):

    	1for (i=0; i < nodeset->nodeNr; i++) {
    	2keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
    		printf("keyword: %s\n", keyword);
    	        xmlFree(keyword);
    	}
          

    1

    The value of nodeset->Nr holds the number of elements in the node set. Here we use it to iterate through the array.

    2

    Here we print the contents of each of the nodes returned.

    [Note]Note

    Note that we are printing the child node of the node that is returned, because the contents of the keyword element are a child text node.

    libxml2-2.9.1+dfsg1/doc/tutorial/apc.html0000644000175000017500000000602611234335462016624 0ustar aronaronC. Code for Keyword Example

    C. Code for Keyword Example

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <libxml/xmlmemory.h>
    #include <libxml/parser.h>
    
    void
    parseStory (xmlDocPtr doc, xmlNodePtr cur) {
    
    	xmlChar *key;
    	cur = cur->xmlChildrenNode;
    	while (cur != NULL) {
    	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
    		    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
    		    printf("keyword: %s\n", key);
    		    xmlFree(key);
     	    }
    	cur = cur->next;
    	}
        return;
    }
    
    static void
    parseDoc(char *docname) {
    
    	xmlDocPtr doc;
    	xmlNodePtr cur;
    
    	doc = xmlParseFile(docname);
    	
    	if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return;
    	}
    	
    	cur = xmlDocGetRootElement(doc);
    	
    	if (cur == NULL) {
    		fprintf(stderr,"empty document\n");
    		xmlFreeDoc(doc);
    		return;
    	}
    	
    	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    		fprintf(stderr,"document of the wrong type, root node != story");
    		xmlFreeDoc(doc);
    		return;
    	}
    	
    	cur = cur->xmlChildrenNode;
    	while (cur != NULL) {
    		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
    			parseStory (doc, cur);
    		}
    		 
    	cur = cur->next;
    	}
    	
    	xmlFreeDoc(doc);
    	return;
    }
    
    int
    main(int argc, char **argv) {
    
    	char *docname;
    		
    	if (argc <= 1) {
    		printf("Usage: %s docname\n", argv[0]);
    		return(0);
    	}
    
    	docname = argv[1];
    	parseDoc (docname);
    
    	return (1);
    }
    
    

    libxml2-2.9.1+dfsg1/doc/tutorial/ar01s09.html0000644000175000017500000001666311234335462017170 0ustar aronaronEncoding Conversion

    Encoding Conversion

    Data encoding compatibility problems are one of the most common difficulties encountered by programmers new to XML in general and libxml in particular. Thinking through the design of your application in light of this issue will help avoid difficulties later. Internally, libxml stores and manipulates data in the UTF-8 format. Data used by your program in other formats, such as the commonly used ISO-8859-1 encoding, must be converted to UTF-8 before passing it to libxml functions. If you want your program's output in an encoding other than UTF-8, you also must convert it.

    Libxml uses iconv if it is available to convert data. Without iconv, only UTF-8, UTF-16 and ISO-8859-1 can be used as external formats. With iconv, any format can be used provided iconv is able to convert it to and from UTF-8. Currently iconv supports about 150 different character formats with ability to convert from any to any. While the actual number of supported formats varies between implementations, every iconv implementation is almost guaranteed to support every format anyone has ever heard of.

    [Warning]Warning

    A common mistake is to use different formats for the internal data in different parts of one's code. The most common case is an application that assumes ISO-8859-1 to be the internal data format, combined with libxml, which assumes UTF-8 to be the internal data format. The result is an application that treats internal data differently, depending on which code section is executing. The one or the other part of code will then, naturally, misinterpret the data.

    This example constructs a simple document, then adds content provided at the command line to the document's root element and outputs the results to stdout in the proper encoding. For this example, we use ISO-8859-1 encoding. The encoding of the string input at the command line is converted from ISO-8859-1 to UTF-8. Full code: Appendix H, Code for Encoding Conversion Example

    The conversion, encapsulated in the example code in the convert function, uses libxml's xmlFindCharEncodingHandler function:

    	1xmlCharEncodingHandlerPtr handler;
            2size = (int)strlen(in)+1; 
            out_size = size*2-1; 
            out = malloc((size_t)out_size); 
    
    …
    	3handler = xmlFindCharEncodingHandler(encoding);
    …
    	4handler->input(out, &out_size, in, &temp);
    …	
    	5xmlSaveFormatFileEnc("-", doc, encoding, 1);
          

    1

    handler is declared as a pointer to an xmlCharEncodingHandler function.

    2

    The xmlCharEncodingHandler function needs to be given the size of the input and output strings, which are calculated here for strings in and out.

    3

    xmlFindCharEncodingHandler takes as its argument the data's initial encoding and searches libxml's built-in set of conversion handlers, returning a pointer to the function or NULL if none is found.

    4

    The conversion function identified by handler requires as its arguments pointers to the input and output strings, along with the length of each. The lengths must be determined separately by the application.

    5

    To output in a specified encoding rather than UTF-8, we use xmlSaveFormatFileEnc, specifying the encoding.

    libxml2-2.9.1+dfsg1/doc/tutorial/ape.html0000644000175000017500000000603011234335462016621 0ustar aronaronE. Code for Add Keyword Example

    E. Code for Add Keyword Example

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <libxml/xmlmemory.h>
    #include <libxml/parser.h>
    
    void
    parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
    
    	xmlNewTextChild (cur, NULL, "keyword", keyword);
        return;
    }
    
    xmlDocPtr
    parseDoc(char *docname, char *keyword) {
    
    	xmlDocPtr doc;
    	xmlNodePtr cur;
    
    	doc = xmlParseFile(docname);
    	
    	if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return (NULL);
    	}
    	
    	cur = xmlDocGetRootElement(doc);
    	
    	if (cur == NULL) {
    		fprintf(stderr,"empty document\n");
    		xmlFreeDoc(doc);
    		return (NULL);
    	}
    	
    	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    		fprintf(stderr,"document of the wrong type, root node != story");
    		xmlFreeDoc(doc);
    		return (NULL);
    	}
    	
    	cur = cur->xmlChildrenNode;
    	while (cur != NULL) {
    		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
    			parseStory (doc, cur, keyword);
    		}
    		 
    	cur = cur->next;
    	}
    	return(doc);
    }
    
    int
    main(int argc, char **argv) {
    
    	char *docname;
    	char *keyword;
    	xmlDocPtr doc;
    
    	if (argc <= 2) {
    		printf("Usage: %s docname, keyword\n", argv[0]);
    		return(0);
    	}
    
    	docname = argv[1];
    	keyword = argv[2];
    	doc = parseDoc (docname, keyword);
    	if (doc != NULL) {
    		xmlSaveFormatFile (docname, doc, 0);
    		xmlFreeDoc(doc);
    	}
    	
    	return (1);
    }
    
    

    libxml2-2.9.1+dfsg1/doc/tutorial/apd.html0000644000175000017500000000624011234335462016623 0ustar aronaronD. Code for XPath Example

    D. Code for XPath Example

    #include <libxml/parser.h>
    #include <libxml/xpath.h>
    
    xmlDocPtr
    getdoc (char *docname) {
    	xmlDocPtr doc;
    	doc = xmlParseFile(docname);
    	
    	if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return NULL;
    	}
    
    	return doc;
    }
    
    xmlXPathObjectPtr
    getnodeset (xmlDocPtr doc, xmlChar *xpath){
    	
    	xmlXPathContextPtr context;
    	xmlXPathObjectPtr result;
    
    	context = xmlXPathNewContext(doc);
    	if (context == NULL) {
    		printf("Error in xmlXPathNewContext\n");
    		return NULL;
    	}
    	result = xmlXPathEvalExpression(xpath, context);
    	xmlXPathFreeContext(context);
    	if (result == NULL) {
    		printf("Error in xmlXPathEvalExpression\n");
    		return NULL;
    	}
    	if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
    		xmlXPathFreeObject(result);
                    printf("No result\n");
    		return NULL;
    	}
    	return result;
    }
    int
    main(int argc, char **argv) {
    
    	char *docname;
    	xmlDocPtr doc;
    	xmlChar *xpath = (xmlChar*) "//keyword";
    	xmlNodeSetPtr nodeset;
    	xmlXPathObjectPtr result;
    	int i;
    	xmlChar *keyword;
    		
    	if (argc <= 1) {
    		printf("Usage: %s docname\n", argv[0]);
    		return(0);
    	}
    
    	docname = argv[1];
    	doc = getdoc(docname);
    	result = getnodeset (doc, xpath);
    	if (result) {
    		nodeset = result->nodesetval;
    		for (i=0; i < nodeset->nodeNr; i++) {
    			keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
    		printf("keyword: %s\n", keyword);
    		xmlFree(keyword);
    		}
    		xmlXPathFreeObject (result);
    	}
    	xmlFreeDoc(doc);
    	xmlCleanupParser();
    	return (1);
    }
    

    libxml2-2.9.1+dfsg1/doc/tutorial/includeconvert.c0000644000175000017500000000342011234335462020356 0ustar aronaron #include unsigned char* convert (unsigned char *in, char *encoding) { unsigned char *out; int ret,size,out_size,temp; xmlCharEncodingHandlerPtr handler; size = (int)strlen(in)+1; out_size = size*2-1; out = malloc((size_t)out_size); if (out) { handler = xmlFindCharEncodingHandler(encoding); if (!handler) { free(out); out = NULL; } } if (out) { temp=size-1; ret = handler->input(out, &out_size, in, &temp); if (ret || temp-size+1) { if (ret) { printf("conversion wasn't successful.\n"); } else { printf("conversion wasn't successful. converted: %i octets.\n",temp); } free(out); out = NULL; } else { out = realloc(out,out_size+1); out[out_size]=0; /*null terminating out*/ } } else { printf("no mem\n"); } return (out); } int main(int argc, char **argv) { unsigned char *content, *out; xmlDocPtr doc; xmlNodePtr rootnode; char *encoding = "ISO-8859-1"; if (argc <= 1) { printf("Usage: %s content\n", argv[0]); return(0); } content = argv[1]; out = convert(content, encoding); doc = xmlNewDoc ("1.0"); rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out); xmlDocSetRootElement(doc, rootnode); xmlSaveFormatFileEnc("-", doc, encoding, 1); return (1); } ]]> libxml2-2.9.1+dfsg1/doc/tutorial/ar01s08.html0000644000175000017500000000746611234335462017170 0ustar aronaronRetrieving Attributes

    Retrieving Attributes

    Retrieving the value of an attribute is similar to the previous example in which we retrieved a node's text contents. In this case we'll extract the value of the URI we added in the previous section. Full code: Appendix G, Code for Retrieving Attribute Value Example.

    The initial steps for this example are similar to the previous ones: parse the doc, find the element you are interested in, then enter a function to carry out the specific task required. In this case, we call getReference:

    void
    getReference (xmlDocPtr doc, xmlNodePtr cur) {
    
    	xmlChar *uri;
    	cur = cur->xmlChildrenNode;
    	while (cur != NULL) {
    	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {
    		   1 uri = xmlGetProp(cur, "uri");
    		    printf("uri: %s\n", uri);
    		    xmlFree(uri);
    	    }
    	    cur = cur->next;
    	}
    	return;
    }
          

    1

    The key function is xmlGetProp, which returns an xmlChar containing the attribute's value. In this case, we just print it out.

    [Note]Note

    If you are using a DTD that declares a fixed or default value for the attribute, this function will retrieve it.

    libxml2-2.9.1+dfsg1/doc/tutorial/ix01.html0000644000175000017500000000476111234335462016646 0ustar aronaronIndex

    Index

    A

    attribute
    retrieving value, Retrieving Attributes
    writing, Writing Attribute

    C

    compiler flags, Compilation

    E

    element
    retrieving content, Retrieving Element Content
    writing content, Writing element content
    encoding, Parsing the file, Encoding Conversion

    X

    xmlChar, Data Types
    xmlDoc, Data Types
    xmlNodePtr, Data Types
    libxml2-2.9.1+dfsg1/doc/tutorial/includekeyword.c0000644000175000017500000000250711234335462020367 0ustar aronaron #include #include #include #include void parseStory (xmlDocPtr doc, xmlNodePtr cur) { xmlChar *key; cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) { key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); printf("keyword: %s\n", key); xmlFree(key); } cur = cur->next; } return; } static void parseDoc(char *docname) { xmlDocPtr doc; xmlNodePtr cur; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return; } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr,"empty document\n"); xmlFreeDoc(doc); return; } if (xmlStrcmp(cur->name, (const xmlChar *) "story")) { fprintf(stderr,"document of the wrong type, root node != story"); xmlFreeDoc(doc); return; } cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){ parseStory (doc, cur); } cur = cur->next; } xmlFreeDoc(doc); return; } int main(int argc, char **argv) { char *docname; if (argc <= 1) { printf("Usage: %s docname\n", argv[0]); return(0); } docname = argv[1]; parseDoc (docname); return (1); } ]]> libxml2-2.9.1+dfsg1/doc/tutorial/includeaddkeyword.c0000644000175000017500000000245011234335462021035 0ustar aronaron #include #include #include #include void parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) { xmlNewTextChild (cur, NULL, "keyword", keyword); return; } xmlDocPtr parseDoc(char *docname, char *keyword) { xmlDocPtr doc; xmlNodePtr cur; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return (NULL); } cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr,"empty document\n"); xmlFreeDoc(doc); return (NULL); } if (xmlStrcmp(cur->name, (const xmlChar *) "story")) { fprintf(stderr,"document of the wrong type, root node != story"); xmlFreeDoc(doc); return (NULL); } cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){ parseStory (doc, cur, keyword); } cur = cur->next; } return(doc); } int main(int argc, char **argv) { char *docname; char *keyword; xmlDocPtr doc; if (argc <= 2) { printf("Usage: %s docname, keyword\n", argv[0]); return(0); } docname = argv[1]; keyword = argv[2]; doc = parseDoc (docname, keyword); if (doc != NULL) { xmlSaveFormatFile (docname, doc, 0); xmlFreeDoc(doc); } return (1); } ]]> libxml2-2.9.1+dfsg1/doc/tutorial/apb.html0000644000175000017500000000375211234335462016626 0ustar aronaronB. Sample Document

    B. Sample Document

    <?xml version="1.0"?>
    <story>
      <storyinfo>
        <author>John Fleck</author>
        <datewritten>June 2, 2002</datewritten>
        <keyword>example keyword</keyword>
      </storyinfo>
      <body>
        <headline>This is the headline</headline>
        <para>This is the body text.</para>
      </body>
    </story>
    
    libxml2-2.9.1+dfsg1/doc/tutorial/ar01s06.html0000644000175000017500000000741111234335462017154 0ustar aronaronWriting element content

    Writing element content

    Writing element content uses many of the same steps we used above — parsing the document and walking the tree. We parse the document, then traverse the tree to find the place we want to insert our element. For this example, we want to again find the "storyinfo" element and this time insert a keyword. Then we'll write the file to disk. Full code: Appendix E, Code for Add Keyword Example

    The main difference in this example is in parseStory:

    void
    parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
    
    	1 xmlNewTextChild (cur, NULL, "keyword", keyword);
        return;
    }
          

    1

    The xmlNewTextChild function adds a new child element at the current node pointer's location in the tree, specified by cur.

    Once the node has been added, we would like to write the document to file. Is you want the element to have a namespace, you can add it here as well. In our case, the namespace is NULL.

    	xmlSaveFormatFile (docname, doc, 1);
          

    The first parameter is the name of the file to be written. You'll notice it is the same as the file we just read. In this case, we just write over the old file. The second parameter is a pointer to the xmlDoc structure. Setting the third parameter equal to one ensures indenting on output.

    libxml2-2.9.1+dfsg1/doc/tutorial/ar01s03.html0000644000175000017500000001312611234335462017151 0ustar aronaronParsing the file

    Parsing the file

    Parsing the file requires only the name of the file and a single function call, plus error checking. Full code: Appendix C, Code for Keyword Example

            1 xmlDocPtr doc;
    	2 xmlNodePtr cur;
    
    	3 doc = xmlParseFile(docname);
    	
    	4 if (doc == NULL ) {
    		fprintf(stderr,"Document not parsed successfully. \n");
    		return;
    	}
    
    	5 cur = xmlDocGetRootElement(doc);
    	
    	6 if (cur == NULL) {
    		fprintf(stderr,"empty document\n");
    		xmlFreeDoc(doc);
    		return;
    	}
    	
    	7 if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    		fprintf(stderr,"document of the wrong type, root node != story");
    		xmlFreeDoc(doc);
    		return;
    	}
    
        

    1

    Declare the pointer that will point to your parsed document.

    2

    Declare a node pointer (you'll need this in order to interact with individual nodes).

    4

    Check to see that the document was successfully parsed. If it was not, libxml will at this point register an error and stop.

    [Note]Note

    One common example of an error at this point is improper handling of encoding. The XML standard requires documents stored with an encoding other than UTF-8 or UTF-16 to contain an explicit declaration of their encoding. If the declaration is there, libxml will automatically perform the necessary conversion to UTF-8 for you. More information on XML's encoding requirements is contained in the standard.

    5

    Retrieve the document's root element.

    6

    Check to make sure the document actually contains something.

    7

    In our case, we need to make sure the document is the right type. "story" is the root type of the documents used in this tutorial.

    libxml2-2.9.1+dfsg1/doc/APIchunk12.html0000644000175000017500000025371512134171042016024 0ustar aronaron API Alphabetic Index c-c for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index c-c for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter c:

    c14n
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    cache
    xmlXPathContextSetCache
    cached
    xmlXPathContextSetCache
    caching:
    xmlXPathContextSetCache
    calculated
    xmlStrncatNew
    calculates
    xmlUTF8Size
    calling
    _xmlXPathContext
    xmlBuildRelativeURI
    xmlC14NDocDumpMemory
    xmlCheckFilename
    xmlCleanupParser
    xmlCleanupThreads
    xmlTextReaderCurrentDoc
    xmlXPathAddValues
    xmlXPathDivValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathSubValues
    xmlXPathValueFlipSign
    calls
    xlinkNodeDetectFunc
    xmlSchemaSAXPlug
    xmlXPathAxisFunc
    came
    xmlPopInput
    cannot
    xmlParseAttribute
    xmlTextReaderReadOuterXml
    xmlXPathRegisterNs
    canonic
    xmlCanonicPath
    canonical
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlGetCharEncodingName
    xmlSchemaGetCanonValue
    canonicalization
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    canonicalized
    xmlNormalizeWindowsPath
    canonization
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    canonized
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    canot
    xmlModuleOpen
    xmlModuleSymbol
    capable
    xmlCheckUTF8
    caracters
    xmlOutputBufferWriteEscape
    cardinality
    xmlExpParse
    carried
    xmlBufGetNodeContent
    xmlNewDocProp
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewProp
    xmlNodeBufGetContent
    xmlNodeGetContent
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    xmlSetNsProp
    xmlSetProp
    xmlUnsetNsProp
    xmlUnsetProp
    carries
    xlinkIsLink
    carrying
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkSimpleLinkFunk
    xmlIsID
    xmlIsRef
    xmlNewGlobalNs
    xmlNewNs
    case-ignoring
    xmlStrcasestr
    cases
    XML_SKIP_IDS
    xmlC14NExecute
    xmlParseElementContentDecl
    xmlScanName
    cast
    BAD_CAST
    CAST_TO_BOOLEAN
    CAST_TO_NUMBER
    CAST_TO_STRING
    xmlXPathConvertFunc
    casting
    XML_CAST_FPTR
    cat
    xmlShellCat
    catalogs
    xmlCatalogAddLocal
    xmlCatalogCleanup
    xmlCatalogFreeLocal
    xmlCatalogGetDefaults
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCatalogSetDebug
    xmlCatalogSetDefaults
    xmlLoadCatalogs
    category
    xmlUCSIsCat
    cause
    xmlShellPrintXPathError
    caution
    _xmlURI
    cdata-section-
    xmlStreamPushNode
    xmlStreamWantsAnyNode
    ceiling
    xmlXPathCeilingFunction
    certainly
    xmlTextReaderGetRemainder
    chained
    xmlFreeNsList
    change
    LIBXML2_NEW_BUFFER
    htmlSetMetaEncoding
    xmlCtxtResetLastError
    xmlNanoFTPCwd
    xmlParseSDDecl
    xmlResetLastError
    xmlSchemaCollapseString
    xmlSchemaWhiteSpaceReplace
    xmlSubstituteEntitiesDefault
    xmlSwitchEncoding
    xmlSwitchInputEncoding
    xmlSwitchToEncoding
    changed
    xmlNodeSetBase
    xmlNodeSetLang
    xmlNodeSetName
    xmlNodeSetSpacePreserve
    xmlTextReaderSetParserProp
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    changes
    xmlRegisterHTTPPostCallbacks
    xmlTextReaderClose
    changing
    xmlSubstituteEntitiesDefault
    xmlTextReaderSetParserProp
    channel
    xmlFileClose
    xmlFileRead
    xmlIOFTPClose
    xmlIOFTPOpen
    xmlIOFTPRead
    xmlIOHTTPClose
    xmlIOHTTPOpen
    xmlIOHTTPRead
    xmlOutputBufferClose
    xmlOutputBufferFlush
    xmlShellPrintXPathError
    characters
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    xmlCreatePushParserCtxt
    xmlKeepBlanksDefault
    xmlParseAttValue
    xmlStrPrintf
    xmlStrVPrintf
    xmlURIEscapeStr
    xmlUTF8Strlen
    xmlUTF8Strsize
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXPathIdFunction
    xmlXPathNormalizeFunction
    xmlXPathStringLengthFunction
    xmlXPathSubstringFunction
    xmlXPathTranslateFunction
    charencoding
    xmlGetCharEncodingName
    chars??
    xmlTextWriterWriteRawLen
    charset
    xmlAllocParserInputBuffer
    xmlCreateIOParserCtxt
    xmlIOParseDTD
    xmlNewIOInputStream
    xmlOutputBufferCreateIO
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    checked
    XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    _xmlEntity
    xmlNodeGetBase
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    xmlParseAttValue
    xmlParseAttributeType
    xmlSetNsProp
    checking
    xlinkIsLink
    xmlBufferWriteQuotedString
    xmlBuildURI
    xmlExpParse
    xmlMemFree
    xmlUTF8Strlen
    checkings
    xmlExpParse
    xmlValidateOneElement
    checks
    XML_SCHEMAS_ATTRGROUP_MARKED
    XML_SCHEMAS_TYPE_MARKED
    htmlAutoCloseTag
    htmlIsAutoClosed
    htmlNodeStatus
    xmlCheckFilename
    xmlCheckHTTPInput
    xmlCheckUTF8
    xmlNanoFTPInit
    xmlNanoHTTPInit
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlReconciliateNs
    xmlURIEscape
    xmlValidateAttributeDecl
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlXPathNodeSetContains
    child-
    _xmlAttr
    _xmlDoc
    _xmlDtd
    _xmlNode
    childrens
    _xmlEntity
    childs
    _xmlNode
    xmlIsMixedElement
    xmlValidGetValidElements
    choice
    xmlExpNewOr
    xmlExpParse
    xmlParseElementChildrenContentDecl
    choices
    xmlParseElementMixedContentDecl
    choices:
    xmlParseNotationDecl
    chunk
    docbParseChunk
    htmlParseChunk
    xmlEntityReferenceFunc
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseChunk
    xmlParseEntity
    xmlParseExternalEntity
    xmlParseInNodeContext
    xmlSAXParseEntity
    circular
    XML_SCHEMAS_ATTRGROUP_MARKED
    XML_SCHEMAS_ELEM_CIRCULAR
    XML_SCHEMAS_TYPE_MARKED
    clean
    xmlCleanupParser
    cleanly
    xmlCheckHTTPInput
    cleans
    xmlCleanupParser
    xmlNanoFTPScanProxy
    xmlNanoHTTPScanProxy
    cleanup
    xmlCleanupGlobals
    xmlCleanupParser
    xmlCleanupThreads
    xmlNanoFTPCleanup
    clear
    xmlListMerge
    clears
    xmlCleanupInputCallbacks
    xmlCleanupOutputCallbacks
    client
    xmlKeepBlanksDefault
    clone
    xmlDOMWrapCloneNode
    cloned
    xmlDOMWrapCloneNode
    close
    htmlAutoCloseTag
    htmlCtxtReadIO
    htmlIsAutoClosed
    htmlReadIO
    xmlCharEncCloseFunc
    xmlCreateIOParserCtxt
    xmlCtxtReadIO
    xmlInputCloseCallback
    xmlModuleClose
    xmlOutputBufferClose
    xmlOutputBufferCreateIO
    xmlOutputCloseCallback
    xmlParserInputBufferCreateIO
    xmlReadIO
    xmlReaderForIO
    xmlReaderNewIO
    xmlSaveToIO
    xmlTextReaderClose
    closed
    xmlCtxtReadFd
    xmlModuleClose
    xmlNewTextWriter
    xmlReadFd
    xmlReaderForFd
    xmlReaderNewFd
    xmlTextWriterEndDocument
    closes
    xmlNanoHTTPClose
    xmlNanoHTTPSave
    closest
    xmlNextElementSibling
    xmlPreviousElementSibling
    xmlXPathCeilingFunction
    xmlXPathFloorFunction
    xmlXPathRoundFunction
    closing
    htmlInitAutoClose
    xmlNanoFTPFreeCtxt
    xmlParseElementChildrenContentDecl
    xmlParseStartTag
    cncerning
    xmlDebugDumpDocumentHead
    codes
    xmlCheckLanguageID
    coding
    xmlSAXDefaultVersion
    collapse
    XML_SCHEMAS_FACET_COLLAPSE
    XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE
    collect
    DEBUG_MEMORY
    xmlIOHTTPOpenW
    collected
    xmlGcMemGet
    xmlGcMemSetup
    colon
    xmlLoadCatalogs
    column
    _xmlError
    getColumnNumber
    xmlSAX2GetColumnNumber
    xmlTextReaderGetParserColumnNumber
    com
    getSystemId
    xmlBuildRelativeURI
    xmlSAX2GetSystemId
    combining
    IS_COMBINING_CH
    come
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    coment
    xmlTextWriterEndComment
    comes
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    coming
    xmlXIncludeProcessNode
    command
    ftpDataCallback
    ftpListCallback
    xmlNanoFTPCheckResponse
    xmlNanoFTPGetResponse
    xmlNanoFTPQuit
    xmlShellDu
    commandline
    xmlShell
    commands
    xmlShellPwd
    comment
    HTML_COMMENT_NODE
    comment
    commentSAXFunc
    xmlNewComment
    xmlNewDocComment
    xmlParseComment
    xmlTextWriterStartComment
    xmlTextWriterWriteComment
    xmlTextWriterWriteFormatComment
    xmlTextWriterWriteVFormatComment
    xmlXPathIsNodeType
    comment-
    xmlStreamPushNode
    xmlStreamWantsAnyNode
    comments
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlDocGetRootElement
    xmlDocSetRootElement
    xmlParseComment
    commodity
    xmlKeepBlanksDefault
    common
    _xmlDoc
    _xmlDtd
    _xmlNode
    comp
    xmlFreePattern
    xmlFreePatternList
    xmlXPathFreeCompExpr
    compare
    xmlListDataCompare
    xmlUTF8Charcmp
    xmlXPathCompareValues
    compared
    xmlXPathCompareValues
    compares
    xmlUTF8Charcmp
    comparing
    xmlXPathCompareValues
    comparison
    xmlHashScan3
    xmlHashScanFull3
    xmlListCreate
    xmlParseCharEncoding
    xmlStrcasecmp
    xmlStrcmp
    xmlStrncasecmp
    xmlStrncmp
    xmlXPathCompareValues
    comparisons
    xmlTextReaderConstString
    xmlXPathSubstringFunction
    compatibility
    LIBXML_LEGACY_ENABLED
    htmlParseElement
    xmlChildrenNode
    xmlCopyChar
    xmlEncodeEntities
    xmlKeepBlanksDefault
    xmlParseCharData
    xmlParseComment
    xmlParseNamespace
    xmlParseQuotedString
    xmlRootNode
    compatible
    LIBXML_TEST_VERSION
    xmlShellPwd
    compilation
    LIBXML_VERSION_EXTRA
    XML_XPATH_CHECKNS
    _xmlXPathContext
    xmlPatterncompile
    xmlXPathCompile
    xmlXPathCtxtCompile
    compile
    xmlPatterncompile
    compile-time
    docbCreateFileParserCtxt
    docbParseFile
    docbSAXParseFile
    htmlCreateFileParserCtxt
    htmlParseFile
    htmlSAXParseFile
    xmlCreateEntityParserCtxt
    xmlCreateFileParserCtxt
    xmlCreateURLParserCtxt
    xmlOutputBufferCreateFilename
    xmlParseFile
    xmlParserInputBufferCreateFilename
    xmlRecoverFile
    xmlSAXParseFile
    xmlSAXParseFileWithData
    compiled-in
    xmlCleanupInputCallbacks
    xmlCleanupOutputCallbacks
    xmlPopInputCallbacks
    xmlRegisterDefaultInputCallbacks
    xmlRegisterDefaultOutputCallbacks
    compiling
    xmlRelaxNGNewDocParserCtxt
    complement
    xmlXPathStringEvalNumber
    complete
    XML_COMPLETE_ATTRS
    XML_SCHEMAS_WILDCARD_COMPLETE
    _xmlParserCtxt
    xmlACatalogResolve
    xmlACatalogResolveURI
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCatalogResolve
    xmlCatalogResolveURI
    completed
    xmlValidateDocumentFinal
    completely
    xmlGetUTF8Char
    xmlNodeGetBase
    complex
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
    _xmlSchemaType
    complexType
    XML_SCHEMAS_TYPE_ABSTRACT
    XML_SCHEMAS_TYPE_BLOCK_DEFAULT
    XML_SCHEMAS_TYPE_BLOCK_EXTENSION
    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION
    XML_SCHEMAS_TYPE_FINAL_EXTENSION
    XML_SCHEMAS_TYPE_FINAL_RESTRICTION
    XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD
    complicated
    xmlBuildRelativeURI
    component
    _xmlSchemaType
    components
    _xmlSchema
    compound
    xmlXPathFreeNodeSet
    xmlXPtrFreeLocationSet
    compress
    xmlNewTextWriterDoc
    xmlNewTextWriterFilename
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlNewTextWriterTree
    compressed
    _xmlParserInputBuffer
    docbCreateFileParserCtxt
    docbParseFile
    docbSAXParseFile
    htmlCreateFileParserCtxt
    htmlParseFile
    htmlSAXParseFile
    xmlCreateEntityParserCtxt
    xmlCreateFileParserCtxt
    xmlCreateURLParserCtxt
    xmlOutputBufferCreateFilename
    xmlParseFile
    xmlParserInputBufferCreateFilename
    xmlRecoverFile
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXUserParseFile
    compression
    _xmlDoc
    xmlC14NDocSave
    xmlGetCompressMode
    xmlGetDocCompressMode
    xmlIOHTTPOpenW
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlOutputBufferCreateFilename
    xmlSaveFile
    xmlSaveFormatFile
    xmlSetCompressMode
    xmlSetDocCompressMode
    comprising
    xmlXPathIntersection
    computation
    xmlXPathOrderDocElems
    compute
    xmlUTF8Strlen
    computed
    XML_SCHEMAS_TYPE_FACETSNEEDVALUE
    _xmlEntity
    xmlByteConsumed
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidatePredefinedType
    xmlSchemaValueAppend
    xmlSchemaValueGetAsBoolean
    xmlSchemaValueGetAsString
    xmlSchemaValueGetNext
    xmlTextReaderByteConsumed
    computes
    xmlSchemaCheckFacet
    concat
    xmlXPathConcatFunction
    concatenated
    xmlStrcat
    concatenation
    xmlXPathConcatFunction
    condition
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    conditionalSect
    xmlParseExternalSubset
    configured
    DEBUG_MEMORY
    DEBUG_MEMORY_LOCATION
    LIBXML_C14N_ENABLED
    LIBXML_CATALOG_ENABLED
    LIBXML_DEBUG_ENABLED
    LIBXML_DEBUG_RUNTIME
    LIBXML_DOCB_ENABLED
    LIBXML_FTP_ENABLED
    LIBXML_HTML_ENABLED
    LIBXML_HTTP_ENABLED
    LIBXML_OUTPUT_ENABLED
    LIBXML_PATTERN_ENABLED
    LIBXML_PUSH_ENABLED
    LIBXML_READER_ENABLED
    LIBXML_SAX1_ENABLED
    LIBXML_THREAD_ENABLED
    LIBXML_TREE_ENABLED
    LIBXML_VALID_ENABLED
    LIBXML_WRITER_ENABLED
    LIBXML_XINCLUDE_ENABLED
    LIBXML_XPATH_ENABLED
    LIBXML_XPTR_ENABLED
    WITHOUT_TRIO
    WITH_TRIO
    conforming
    xmlRegexpCompile
    conforms
    xmlCheckLanguageID
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidatePredefinedType
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateQName
    conjunction
    xmlSchemaIsBuiltInTypeFacet
    connection
    xmlNanoFTPClose
    xmlNanoFTPCloseConnection
    xmlNanoFTPConnect
    xmlNanoFTPConnectTo
    xmlNanoFTPFreeCtxt
    xmlNanoFTPGetConnection
    xmlNanoFTPGetSocket
    xmlNanoFTPRead
    xmlNanoFTPUpdateURL
    xmlNanoHTTPClose
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlNanoHTTPRead
    connector
    xmlParseElementChildrenContentDecl
    cononical
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    consequent
    _xmlError
    consideration
    xmlBuildRelativeURI
    considered
    xmlHashScan3
    xmlHashScanFull3
    xmlParserInputBufferRead
    xmlXPathSubstringFunction
    consist
    xmlXPathNextAncestor
    const
    xmlModuleOpen
    xmlModuleSymbol
    constant
    XML_SAX2_MAGIC
    xmlByteConsumed
    constraint
    _xmlSchemaAttribute
    _xmlSchemaElement
    _xmlSchemaWildcard
    _xmlSchemaWildcardNs
    xmlParseEntityRef
    xmlValidateNotationDecl
    constraints
    XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    xmlParseAttributeType
    xmlParseDefaultDecl
    xmlValidGetValidElements
    construct
    xmlParseElementChildrenContentDecl
    construction
    xmlCanonicPath
    xmlPathToURI
    constructs
    xmlExpParse
    xmlParseNamespace
    consumed
    UTF8ToHtml
    UTF8Toisolat1
    _xmlParserInput
    _xmlParserInputBuffer
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlGetUTF8Char
    xmlParserInputBufferRead
    xmlSchemaNewNOTATIONValue
    xmlSchemaNewQNameValue
    xmlSchemaNewStringValue
    consuming
    xmlExpExpDerive
    xmlScanName
    contain
    xmlNewTextChild
    xmlParseAttribute
    xmlParseEntityRef
    xmlParsePEReference
    xmlParseSDDecl
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRelaxNGNewMemParserCtxt
    xmlRelaxNGNewParserCtxt
    xmlSchemaNewMemParserCtxt
    xmlSchemaNewParserCtxt
    xmlSchematronNewMemParserCtxt
    xmlSchematronNewParserCtxt
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    xmlXPathTrailing
    xmlXPathTrailingSorted
    contained
    xmlBufferDetach
    xmlGetUTF8Char
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    xmlStrlen
    xmlXPathDistinct
    xmlXPathDistinctSorted
    contains
    XML_SCHEMAS_ATTRGROUP_HAS_REFS
    _xmlEntity
    xmlCurrentChar
    xmlParseEntityRef
    xmlParsePEReference
    xmlParserHandlePEReference
    xmlTextReaderMoveToElement
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    xmlXPathContainsFunction
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    xmlXPathNodeSetContains
    xmlXPathSubstringFunction
    xmlXPtrNewContext
    content:
    xmlParseContent
    xmlXPathEqualValues
    xmlXPathNotEqualValues
    contentType
    xmlNanoHTTPFetch
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    contents
    xmlDictFree
    xmlHashFree
    xmlLineNumbersDefault
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlSetupParserForBuffer
    xmlTextReaderExpand
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlTextReaderReadString
    xmlTextWriterWriteDTDExternalEntityContents
    contentspec
    xmlParseElementContentDecl
    xmlParseElementDecl
    context?
    _xmlXPathContext
    contexts
    _xmlDOMWrapCtxt
    contextual
    xmlRelaxNGGetParserErrors
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetParserStructuredErrors
    xmlSchemaGetParserErrors
    xmlSchemaSetParserErrors
    continuing
    xmlXPathSubstringFunction
    contraint
    _xmlSchemaElement
    contrary
    xmlNodeListGetRawString
    xmlXPathFreeNodeSetList
    contrast
    xmlNodeAddContent
    xmlNodeAddContentLen
    control
    _xmlXPathContext
    resolveEntity
    resolveEntitySAXFunc
    xmlNanoFTPClose
    xmlNanoFTPConnect
    xmlNanoFTPConnectTo
    xmlSAX2ResolveEntity
    conveniently
    xmlCurrentChar
    conversion
    _uconv_t
    _xmlXPathType
    xmlCharEncOutFunc
    xmlParseEncodingDecl
    xmlXPathConvertFunc
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    conversions
    _xmlOutputBuffer
    _xmlParserInputBuffer
    convert
    UTF8ToHtml
    UTF8Toisolat1
    attribute
    attributeSAXFunc
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlBuildRelativeURI
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlEncodeEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlXPathAddValues
    xmlXPathDivValues
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathSubValues
    xmlXPathValueFlipSign
    converted
    xmlCatalogConvert
    xmlConvertSGMLCatalog
    xmlXPathCompareValues
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    xmlXPathIdFunction
    xmlXPathNormalizeFunction
    xmlXPathStringFunction
    xmlXPathStringLengthFunction
    converter
    xmlAllocOutputBuffer
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    converting
    xmlSaveFileEnc
    xmlXPathEvalPredicate
    xmlXPathEvaluatePredicateResult
    converts
    xmlXPathBooleanFunction
    xmlXPathStringFunction
    cope
    xmlCheckLanguageID
    copied
    xmlBufferCreateStatic
    xmlCopyDoc
    xmlGetFeaturesList
    xmlSchemaCopyValue
    xmlXPathNodeSetMerge
    copier
    xmlHashCopy
    copying
    xmlParserInputBufferGrow
    correct
    xmlCheckLanguageID
    correctly
    xmlURIEscape
    correponding
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    correspond
    xmlIsXHTML
    xmlParseEntity
    xmlSAXParseEntity
    corresponding
    xmlGetDocEntity
    xmlGetDtdEntity
    xmlGetParameterEntity
    xmlOutputBufferCreateFilenameFunc
    xmlParserInputBufferCreateFilenameFunc
    xmlSetProp
    xmlXPathTranslateFunction
    cost
    xmlByteConsumed
    costly
    XML_MAX_NAMELEN
    xmlByteConsumed
    could
    xmlByteConsumed
    xmlCheckLanguageID
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlModuleClose
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlTextReaderByteConsumed
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    xmlValidateDtd
    count
    _xmlEntity
    ftpListCallback
    xmlChildElementCount
    xmlExpRef
    xmlLsCountNode
    xmlSaveDoc
    xmlSaveTree
    xmlSchematronValidateDoc
    xmlTextReaderAttributeCount
    xmlXPathCountFunction
    counter
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounter
    xmlAutomataNewCounterTrans
    xmlDictReference
    counterparts
    xmlEncodeEntitiesReentrant
    course
    xmlTextReaderNormalization
    cover
    xmlSearchNs
    crash
    xmlCleanupParser
    xmlCleanupThreads
    create
    xmlBufferCreate
    xmlBufferCreateSize
    xmlBufferCreateStatic
    xmlCatalogIsEmpty
    xmlCreateEntitiesTable
    xmlCreateEnumeration
    xmlNewCatalog
    xmlNewDtd
    xmlNewNs
    creates
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlCreateURI
    xmlStrncatNew
    xmlXPathContextSetCache
    creating
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    creation
    xmlIOHTTPOpenW
    xmlNewNs
    xmlRegisterNodeDefault
    cross
    xmlSearchNs
    crossed
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    cshema
    XML_SCHEMAS_FINAL_DEFAULT_LIST
    ctrio
    xmlXPathIsInf
    xmlXPathIsNaN
    ctxt
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    ctxt-
    docbFreeParserCtxt
    htmlFreeParserCtxt
    xmlFreeParserCtxt
    xmlPopInput
    xmlValidCtxtNormalizeAttributeValue
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    cur
    xmlXPathAxisFunc
    curent
    xmlC14NIsVisibleCallback
    currently
    XML_SCHEMAS_INCLUDING_CONVERT_NS
    xmlCheckLanguageID
    xmlGcMemGet
    xmlMemBlocks
    xmlMemGet
    xmlMemUsed
    xmlOutputBufferCreateFilename
    xmlOutputBufferGetContent
    xmlOutputBufferGetSize
    xmlSchemaValidateFile
    xmlXPathContextSetCache
    custom
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlSaveSetAttrEscape
    xmlSaveSetEscape

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/xmlreader.html0000644000175000017500000004725311234335462016210 0ustar aronaron Libxml2 XmlTextReader Interface tutorial

    Libxml2 XmlTextReader Interface tutorial

    This document describes the use of the XmlTextReader streaming API added to libxml2 in version 2.5.0 . This API is closely modeled after the XmlTextReader and XmlReader classes of the C# language.

    This tutorial will present the key points of this API, and working examples using both C and the Python bindings:

    Table of content:

    Introduction: why a new API

    Libxml2 main API is tree based, where the parsing operation results in a document loaded completely in memory, and expose it as a tree of nodes all availble at the same time. This is very simple and quite powerful, but has the major limitation that the size of the document that can be hamdled is limited by the size of the memory available. Libxml2 also provide a SAX based API, but that version was designed upon one of the early expat version of SAX, SAX is also not formally defined for C. SAX basically work by registering callbacks which are called directly by the parser as it progresses through the document streams. The problem is that this programming model is relatively complex, not well standardized, cannot provide validation directly, makes entity, namespace and base processing relatively hard.

    The XmlTextReader API from C# provides a far simpler programming model. The API acts as a cursor going forward on the document stream and stopping at each node in the way. The user's code keeps control of the progress and simply calls a Read() function repeatedly to progress to each node in sequence in document order. There is direct support for namespaces, xml:base, entity handling and adding DTD validation on top of it was relatively simple. This API is really close to the DOM Core specification This provides a far more standard, easy to use and powerful API than the existing SAX. Moreover integrating extension features based on the tree seems relatively easy.

    In a nutshell the XmlTextReader API provides a simpler, more standard and more extensible interface to handle large documents than the existing SAX version.

    Walking a simple tree

    Basically the XmlTextReader API is a forward only tree walking interface. The basic steps are:

    1. prepare a reader context operating on some input
    2. run a loop iterating over all nodes in the document
    3. free up the reader context

    Here is a basic C sample doing this:

    #include <libxml/xmlreader.h>
    
    void processNode(xmlTextReaderPtr reader) {
        /* handling of a node in the tree */
    }
    
    int streamFile(char *filename) {
        xmlTextReaderPtr reader;
        int ret;
    
        reader = xmlNewTextReaderFilename(filename);
        if (reader != NULL) {
            ret = xmlTextReaderRead(reader);
            while (ret == 1) {
                processNode(reader);
                ret = xmlTextReaderRead(reader);
            }
            xmlFreeTextReader(reader);
            if (ret != 0) {
                printf("%s : failed to parse\n", filename);
            }
        } else {
            printf("Unable to open %s\n", filename);
        }
    }

    A few things to notice:

    • the include file needed : libxml/xmlreader.h
    • the creation of the reader using a filename
    • the repeated call to xmlTextReaderRead() and how any return value different from 1 should stop the loop
    • that a negative return means a parsing error
    • how xmlFreeTextReader() should be used to free up the resources used by the reader.

    Here is similar code in python for exactly the same processing:

    import libxml2
    
    def processNode(reader):
        pass
    
    def streamFile(filename):
        try:
            reader = libxml2.newTextReaderFilename(filename)
        except:
            print "unable to open %s" % (filename)
            return
    
        ret = reader.Read()
        while ret == 1:
            processNode(reader)
            ret = reader.Read()
    
        if ret != 0:
            print "%s : failed to parse" % (filename)

    The only things worth adding are that the xmlTextReader is abstracted as a class like in C# with the same method names (but the properties are currently accessed with methods) and that one doesn't need to free the reader at the end of the processing. It will get garbage collected once all references have disapeared.

    Extracting information for the current node

    So far the example code did not indicate how information was extracted from the reader. It was abstrated as a call to the processNode() routine, with the reader as the argument. At each invocation, the parser is stopped on a given node and the reader can be used to query those node properties. Each Property is available at the C level as a function taking a single xmlTextReaderPtr argument whose name is xmlTextReaderProperty , if the return type is an xmlChar * string then it must be deallocated with xmlFree() to avoid leaks. For the Python interface, there is a Property method to the reader class that can be called on the instance. The list of the properties is based on the C# XmlTextReader class set of properties and methods:

    • NodeType: The node type, 1 for start element, 15 for end of element, 2 for attributes, 3 for text nodes, 4 for CData sections, 5 for entity references, 6 for entity declarations, 7 for PIs, 8 for comments, 9 for the document nodes, 10 for DTD/Doctype nodes, 11 for document fragment and 12 for notation nodes.
    • Name: the qualified name of the node, equal to (Prefix:)LocalName.
    • LocalName: the local name of the node.
    • Prefix: a shorthand reference to the namespace associated with the node.
    • NamespaceUri: the URI defining the namespace associated with the node.
    • BaseUri: the base URI of the node. See the XML Base W3C specification.
    • Depth: the depth of the node in the tree, starts at 0 for the root node.
    • HasAttributes: whether the node has attributes.
    • HasValue: whether the node can have a text value.
    • Value: provides the text value of the node if present.
    • IsDefault: whether an Attribute node was generated from the default value defined in the DTD or schema (unsupported yet).
    • XmlLang: the xml:lang scope within which the node resides.
    • IsEmptyElement: check if the current node is empty, this is a bit bizarre in the sense that <a/> will be considered empty while <a></a> will not.
    • AttributeCount: provides the number of attributes of the current node.

    Let's look first at a small example to get this in practice by redefining the processNode() function in the Python example:

    def processNode(reader):
        print "%d %d %s %d" % (reader.Depth(), reader.NodeType(),
                               reader.Name(), reader.IsEmptyElement())

    and look at the result of calling streamFile("tst.xml") for various content of the XML test file.

    For the minimal document "<doc/>" we get:

    0 1 doc 1

    Only one node is found, its depth is 0, type 1 indicate an element start, of name "doc" and it is empty. Trying now with "<doc></doc>" instead leads to:

    0 1 doc 0
    0 15 doc 0

    The document root node is not flagged as empty anymore and both a start and an end of element are detected. The following document shows how character data are reported:

    <doc><a/><b>some text</b>
    <c/></doc>

    We modifying the processNode() function to also report the node Value:

    def processNode(reader):
        print "%d %d %s %d %s" % (reader.Depth(), reader.NodeType(),
                                  reader.Name(), reader.IsEmptyElement(),
                                  reader.Value())

    The result of the test is:

    0 1 doc 0 None
    1 1 a 1 None
    1 1 b 0 None
    2 3 #text 0 some text
    1 15 b 0 None
    1 3 #text 0
    
    1 1 c 1 None
    0 15 doc 0 None

    There are a few things to note:

    • the increase of the depth value (first row) as children nodes are explored
    • the text node child of the b element, of type 3 and its content
    • the text node containing the line return between elements b and c
    • that elements have the Value None (or NULL in C)

    The equivalent routine for processNode() as used by xmllint --stream --debug is the following and can be found in the xmllint.c module in the source distribution:

    static void processNode(xmlTextReaderPtr reader) {
        xmlChar *name, *value;
    
        name = xmlTextReaderName(reader);
        if (name == NULL)
            name = xmlStrdup(BAD_CAST "--");
        value = xmlTextReaderValue(reader);
    
        printf("%d %d %s %d",
                xmlTextReaderDepth(reader),
                xmlTextReaderNodeType(reader),
                name,
                xmlTextReaderIsEmptyElement(reader));
        xmlFree(name);
        if (value == NULL)
            printf("\n");
        else {
            printf(" %s\n", value);
            xmlFree(value);
        }
    }

    Extracting information for the attributes

    The previous examples don't indicate how attributes are processed. The simple test "<doc a="b"/>" provides the following result:

    0 1 doc 1 None

    This proves that attribute nodes are not traversed by default. The HasAttributes property allow to detect their presence. To check their content the API has special instructions. Basically two kinds of operations are possible:

    1. to move the reader to the attribute nodes of the current element, in that case the cursor is positionned on the attribute node
    2. to directly query the element node for the attribute value

    In both case the attribute can be designed either by its position in the list of attribute (MoveToAttributeNo or GetAttributeNo) or by their name (and namespace):

    • GetAttributeNo(no): provides the value of the attribute with the specified index no relative to the containing element.
    • GetAttribute(name): provides the value of the attribute with the specified qualified name.
    • GetAttributeNs(localName, namespaceURI): provides the value of the attribute with the specified local name and namespace URI.
    • MoveToAttributeNo(no): moves the position of the current instance to the attribute with the specified index relative to the containing element.
    • MoveToAttribute(name): moves the position of the current instance to the attribute with the specified qualified name.
    • MoveToAttributeNs(localName, namespaceURI): moves the position of the current instance to the attribute with the specified local name and namespace URI.
    • MoveToFirstAttribute: moves the position of the current instance to the first attribute associated with the current node.
    • MoveToNextAttribute: moves the position of the current instance to the next attribute associated with the current node.
    • MoveToElement: moves the position of the current instance to the node that contains the current Attribute node.

    After modifying the processNode() function to show attributes:

    def processNode(reader):
        print "%d %d %s %d %s" % (reader.Depth(), reader.NodeType(),
                                  reader.Name(), reader.IsEmptyElement(),
                                  reader.Value())
        if reader.NodeType() == 1: # Element
            while reader.MoveToNextAttribute():
                print "-- %d %d (%s) [%s]" % (reader.Depth(), reader.NodeType(),
                                              reader.Name(),reader.Value())

    The output for the same input document reflects the attribute:

    0 1 doc 1 None
    -- 1 2 (a) [b]

    There are a couple of things to note on the attribute processing:

    • Their depth is the one of the carrying element plus one.
    • Namespace declarations are seen as attributes, as in DOM.

    Validating a document

    Libxml2 implementation adds some extra features on top of the XmlTextReader API. The main one is the ability to DTD validate the parsed document progressively. This is simply the activation of the associated feature of the parser used by the reader structure. There are a few options available defined as the enum xmlParserProperties in the libxml/xmlreader.h header file:

    • XML_PARSER_LOADDTD: force loading the DTD (without validating)
    • XML_PARSER_DEFAULTATTRS: force attribute defaulting (this also imply loading the DTD)
    • XML_PARSER_VALIDATE: activate DTD validation (this also imply loading the DTD)
    • XML_PARSER_SUBST_ENTITIES: substitute entities on the fly, entity reference nodes are not generated and are replaced by their expanded content.
    • more settings might be added, those were the one available at the 2.5.0 release...

    The GetParserProp() and SetParserProp() methods can then be used to get and set the values of those parser properties of the reader. For example

    def parseAndValidate(file):
        reader = libxml2.newTextReaderFilename(file)
        reader.SetParserProp(libxml2.PARSER_VALIDATE, 1)
        ret = reader.Read()
        while ret == 1:
            ret = reader.Read()
        if ret != 0:
            print "Error parsing and validating %s" % (file)

    This routine will parse and validate the file. Error messages can be captured by registering an error handler. See python/tests/reader2.py for more complete Python examples. At the C level the equivalent call to cativate the validation feature is just:

    ret = xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1)

    and a return value of 0 indicates success.

    Entities substitution

    By default the xmlReader will report entities as such and not replace them with their content. This default behaviour can however be overriden using:

    reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)

    Relax-NG Validation

    Introduced in version 2.5.7

    Libxml2 can now validate the document being read using the xmlReader using Relax-NG schemas. While the Relax NG validator can't always work in a streamable mode, only subsets which cannot be reduced to regular expressions need to have their subtree expanded for validation. In practice it means that, unless the schemas for the top level element content is not expressable as a regexp, only chunk of the document needs to be parsed while validating.

    The steps to do so are:

    • create a reader working on a document as usual
    • before any call to read associate it to a Relax NG schemas, either the preparsed schemas or the URL to the schemas to use
    • errors will be reported the usual way, and the validity status can be obtained using the IsValid() interface of the reader like for DTDs.

    Example, assuming the reader has already being created and that the schema string contains the Relax-NG schemas:

    rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
    rngs = rngp.relaxNGParse()
    reader.RelaxNGSetSchema(rngs)
    ret = reader.Read()
    while ret == 1:
    ret = reader.Read()
    if ret != 0:
    print "Error parsing the document"
    if reader.IsValid() != 1:
    print "Document failed to validate"

    See reader6.py in the sources or documentation for a complete example.

    Mixing the reader and tree or XPath operations

    Introduced in version 2.5.7

    While the reader is a streaming interface, its underlying implementation is based on the DOM builder of libxml2. As a result it is relatively simple to mix operations based on both models under some constraints. To do so the reader has an Expand() operation allowing to grow the subtree under the current node. It returns a pointer to a standard node which can be manipulated in the usual ways. The node will get all its ancestors and the full subtree available. Usual operations like XPath queries can be used on that reduced view of the document. Here is an example extracted from reader5.py in the sources which extract and prints the bibliography for the "Dragon" compiler book from the XML 1.0 recommendation:

    f = open('../../test/valid/REC-xml-19980210.xml')
    input = libxml2.inputBuffer(f)
    reader = input.newTextReader("REC")
    res=""
    while reader.Read():
        while reader.Name() == 'bibl':
            node = reader.Expand()            # expand the subtree
            if node.xpathEval("@id = 'Aho'"): # use XPath on it
                res = res + node.serialize()
            if reader.Next() != 1:            # skip the subtree
                break;

    Note, however that the node instance returned by the Expand() call is only valid until the next Read() operation. The Expand() operation does not affects the Read() ones, however usually once processed the full subtree is not useful anymore, and the Next() operation allows to skip it completely and process to the successor or return 0 if the document end is reached.

    Daniel Veillard

    $Id$

    libxml2-2.9.1+dfsg1/doc/ChangeLog.xsl0000644000175000017500000001053412113312340015671 0ustar aronaron libxml2 API Menu

    ChangeLog last entries of

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk11.html0000644000175000017500000010066612134171042016017 0ustar aronaron API Alphabetic Index b-b for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index b-b for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter b:

    back
    xmlBufferDetach
    xmlChildElementCount
    xmlEntityReferenceFunc
    xmlFirstElementChild
    xmlKeepBlanksDefault
    xmlLastElementChild
    xmlNanoFTPGet
    xmlNanoFTPList
    xmlNextElementSibling
    xmlPreviousElementSibling
    xmlRelaxNGDump
    xmlSetEntityReferenceFunc
    bad
    XML_MAX_LOOKUP_LIMIT
    badly
    xmlParseExternalID
    bahaviour
    xmlTextReaderNormalization
    balanced
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseInNodeContext
    bar
    xmlXPathTranslateFunction
    base64
    xmlTextWriterWriteBase64
    based
    xmlGetCompressMode
    xmlGetDocCompressMode
    xmlGetNodePath
    xmlNewEntityInputStream
    xmlNewInputFromFile
    xmlNewStringInputStream
    xmlParseURI
    xmlParseURIReference
    xmlRelaxNGNewValidCtxt
    xmlSchemaNewStringValue
    xmlSchemaNewValidCtxt
    xmlSchemaSAXPlug
    xmlSchemaSAXUnplug
    xmlSchemaValidateStream
    xmlSchematronNewValidCtxt
    xmlSetCompressMode
    xmlSetDocCompressMode
    xmlStrcat
    xmlStrdup
    xmlStrsub
    xmlURIEscape
    basically
    getSystemId
    xmlIsMixedElement
    xmlSAX2GetSystemId
    xmlValidateAttributeDecl
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidateRoot
    basis
    xmlSubstituteEntitiesDefault
    bear
    xmlParseAttributeType
    becomes
    xmlAddAttributeDecl
    before
    htmlInitAutoClose
    xmlBuildRelativeURI
    xmlCatalogAdd
    xmlCleanupParser
    xmlCleanupThreads
    xmlCurrentChar
    xmlGcMemSetup
    xmlInitParser
    xmlMemSetup
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetParserProp
    xmlTextReaderSetSchema
    xmlValidGetValidElements
    xmlXPathNextPreceding
    xmlXPathStringFunction
    beginning
    xmlBufShrink
    xmlBufferAddHead
    xmlBufferShrink
    xmlByteConsumed
    xmlListInsert
    xmlListPushFront
    xmlStringCurrentChar
    xmlTextReaderByteConsumed
    xmlValidGetValidElements
    begins
    _xmlParserNodeInfo
    behaves
    IS_LETTER_CH
    behavior
    htmlSAXParseDoc
    xmlCurrentChar
    xmlKeepBlanksDefault
    xmlSubstituteEntitiesDefault
    behaviour
    XML_MAX_LOOKUP_LIMIT
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    resolveEntity
    resolveEntitySAXFunc
    xmlBufNodeDump
    xmlBufShrink
    xmlElemDump
    xmlFreeNode
    xmlFreeNodeList
    xmlModuleOpen
    xmlModuleSymbol
    xmlNodeDump
    xmlNodeDumpOutput
    xmlNodeGetSpacePreserve
    xmlNodeSetSpacePreserve
    xmlSAX2ResolveEntity
    xmlTextReaderSetParserProp
    xmlUTF8Strsize
    below
    _xmlParserCtxt
    xmlCheckLanguageID
    xmlParseExternalID
    better
    resolveEntity
    resolveEntitySAXFunc
    xmlNormalizeWindowsPath
    xmlSAX2ResolveEntity
    xmlSAXDefaultVersion
    xmlSAXUserParseMemory
    between
    _uconv_t
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlCatalogSetDefaultPrefer
    xmlMemDisplayLast
    xmlParseQuotedString
    xmlXPathDifference
    beyond
    xmlXPathStringFunction
    binary
    xmlCharInRange
    xmlEncodeEntities
    xmlParseNamespace
    xmlParseQuotedString
    xmlTextWriterWriteBase64
    xmlTextWriterWriteBinHex
    bindings
    _xmlSchema
    bit
    xmlStrEqual
    bits
    xmlGetLineNo
    blanks
    xmlKeepBlanksDefault
    xmlSkipBlankChars
    bloc
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    blockDefault
    XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION
    XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION
    XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION
    blocked
    xmlGcMemSetup
    xmlMemSetup
    blocking
    xmlNanoFTPRead
    xmlNanoHTTPRead
    blocks
    IS_CHAR
    XML_SAX2_MAGIC
    initdocbDefaultSAXHandler
    inithtmlDefaultSAXHandler
    initxmlDefaultSAXHandler
    xmlMemBlocks
    xmlMemDisplay
    xmlMemoryDump
    body
    _xmlParserCtxt
    book1
    xmlBuildRelativeURI
    bool
    xmlBoolToText
    both
    xmlBufferFree
    xmlNanoFTPClose
    xmlNodeGetBase
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    xmlParseStartTag
    xmlStrEqual
    xmlXPathCompareValues
    xmlXPathIntersection
    bound
    xmlExpNewRange
    boundaries
    _xmlParserCtxt
    xmlSearchNs
    boundary
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_LOOKUP_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    bracket
    xmlParseCharData
    branch
    xmlDOMWrapCloneNode
    xmlDOMWrapRemoveNode
    xmlSchemaValidateOneElement
    break
    _xmlError
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlLineNumbersDefault
    breaking
    xmlEncodeEntities
    breaks
    xmlCurrentChar
    broke
    XML_CAST_FPTR
    broken
    xmlGetThreadId
    xmlParseBalancedChunkMemoryRecover
    xmlTextReaderNormalization
    buf
    xmlSaveFileTo
    xmlSaveFormatFileTo
    buffered
    xmlAllocOutputBuffer
    xmlAllocParserInputBuffer
    xmlFreeParserInputBuffer
    xmlOutputBufferClose
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    xmlOutputBufferCreateIO
    xmlOutputBufferFlush
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    xmlParserInputBufferGrow
    xmlParserInputBufferPush
    xmlParserInputBufferRead
    xmlTextReaderGetRemainder
    buffers
    LIBXML2_NEW_BUFFER
    xmlBufferDetach
    builded
    XML_SCHEMAS_ATTRGROUP_GLOBAL
    XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED
    building
    XML_MAX_TEXT_LENGTH
    _xmlParserCtxt
    docbSAXParseDoc
    docbSAXParseFile
    htmlSAXParseFile
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    xmlBuildURI
    xmlSAX2IgnorableWhitespace
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlShellPwd
    builds
    xmlRegexpCompile
    built
    _xmlParserCtxt
    xmlCleanupParser
    xmlParseAttributeType
    xmlParseEnumeratedType
    xmlParseEnumerationType
    xmlParseNotationType
    xmlParseURI
    xmlParseURIRaw
    xmlRelaxNGParse
    xmlSchemaGetBuiltInType
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlSchemaParse
    xmlSchematronParse
    xmlTextReaderNextSibling
    built-in
    _xmlSchemaType
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaGetBuiltInType
    xmlSchemaIsBuiltInTypeFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    builtin
    XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE
    initGenericErrorDefaultFunc
    bunch
    xmlParseNamespace
    bypass
    xmlParseCatalogFile

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/catalog.gif0000644000175000017500000001373111234335462015432 0ustar aronaronGIF87aR÷ø°ÐÈ€ÌøøøüøLîíÿÿ¿¿uÀ”@(è+Ü@(0îÛÿ¿(AÒ4fïÿ¿ÿ>ÿîÿÿÿ¿(LÒíÿ¿(uO+À”@@¬(xÚÒ@Dƒîÿà¿0PÚØ\A¶ÿ¶^u?ªÀ @(ø+Ú`\ ïî¬ÿÿ¿¿o\„íÿ@¿È„ ×ü›B0øàÚ\pîÿ¿ÿ™ ÿ[B™u[À¬B@(Ðt+¢íÿ@B¿¥ï+Žÿ¿ 2”`…îþÿ@¿È6n×àB0¼äÚîòÿÿ\€+‚” È+ðÿ@ ¿ Ϧ„BfÔnïÃÿ¿@Ÿ äxòÿB¿Ðä½¢ò ÿ€Ð+w@\¼ðî¿¿tu ïÀ`ÿ@¿@(¼ÒNܼ¸¿¿`’ð«ÿ ¿\¬(ðï+ÿÿ¿¿@€È+íÿ¿?ð„ÿ¿@a¡È¸¾×@( +`@@ðÜ€­ûR€+€+T€ð+ÿX€äð+òÿÿ¿¿\ ¿ ›€¸+f`@ üíÿ¿Räò(Òøïí,Rþ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_^€óçУKŸNÝ9óëq«kßN½6wë%¿þÀN>ªx“ç;Wº¾¼{íÆ_š)¥]Iè¦"꓌Êi_¢ª–*£¥Ž)©þ§îå"¬4¾*i«¥-Ik¬xéºå@»r”¥§8ËkÛc²·¬ˆ_>{,‚)«ÒfD¦µ…™í´pmûm¯Û6[-·þ9.¸m¥™£cïk.Bèæåäºì®g½ä6„/Ex²H˜Àæ ïCwïAÿNTèÂöÛ°Áf=̯„Ï ‘†á&Œ0ÅŒeÊñ[#34qD°–<–ʃ|íF,‡³¿k;óT ëòËå¼áÍ×ìQPÒÉ;ˆžÏ62ݳÐ$Íç“Ôú%mbKTó”5zPçùÝÒÜÙ„´ÕŠýuxgÓ4¶Ck(ÞÛÝ Õ6ÙYÍmÜx=“þÝOJ÷ÀŠøß"®¶á„£Š¸L|û—x‡‹ÇÔ¸âî÷M“ó•yåMm®—çÌ^ιæ‘ËYúèžîè½¢N9k¬ÛjÜ'Åî:Q¶Oýví]«åÀ/üð\¼Pî·…<|ï|ðÆ÷9…ÏW}ÔÉN½õÕ¯kûò˜sÏý¸àg¯5‚â[O~ïg5Ÿþóë›Wùj¾ÿHßË'¹ý݇*ÿüâßýŽÆ>É Ñs˜÷-úýozÙY ñXÀÕ0D`ÛÜ'Áëð©‹`=’üÁ'ƒ(ÄàÚ88B ‚Z"añüÇ*Ì]0…(L ¿d<¾0;þä¡g6Q…ë*€ ÀÂñ‡ ¢ Ÿx8µÝðˆG¼Ø·¸ÄWñp†„"ɤØBBqXLc!ÂÅ6ºX_¤¢}GF'š‘ˆrº¢Óè$7vq „£ï8G}ÕQ‚rd\÷ÈȾI‰ ÙbµâHÈBJè L¤ä^¢ÇF6rM4ˆ$FIzíŽ^̉›ª0)À3Ñ•5Ì“'g©Â…R £¤×M)€^úò—À€8˜­¥ÍP¬|Ÿ¸‚ÉL_³‚%¤å,ÉÔF@ÞR—e¬V3·éÌjG‡Û™ú²Ùnr3ZÐì™4=É¥7Bòš²£6ÍyÎæðFo6þçöÆ™I†Ñ³ž¡;cE p·u~—Õ´&<×ÄñmëŸÛä1gç1N:Íqj¨ú QfJ4¢ÌåÆ ÊH‰T¡y¥?;ÚLcÑF‡h«( ™•Γ¥Át©@'âÇ‘’Ts"èêpêр¦^C*W&Z;¥‹¨95ªš.J$ôx?êÔ  LÉ©kU˜5ˆÁŒ«¿ôêT-RU….XYåãVÑÚKµ¦F¬VÄëSÈZB}Jt­«T«8P¡ä͉+ËØÀÚ5WzÅ_ó ‹-°ÂìÞ¨jØÃöôUŠÍbLYNÇjÖM“Zj«æ•ÿHɦ¥¥þëcYØÎúñ¤¥ ­É€øö·À ÙÙÂiµ}E.þ~"(9G¸Ðý-qM+¯XFä¶\4™nqØÀèzWº7E«q­¤\üE–=$ŠY_õÝïF«¸§Ý$O?ëÓíf0[½m¯{c+Þøö©¼Mm_Ýr´ÞRéw¿É‚ouwêìÔ¾÷=Ú½+QËî¸- €Ù-çN8º¦î…ñø·þÂîÙ‡)œ`ãJ=ÆYbl²ØÀ+†î°,üb7¸³é¤n¥•ß7Ä\ý¨ d5ã­Ø8`F.’¡ªdÛ²­AFq-UeàN™¨UÎÌy­Bc€¥Óÿ}ç x~¥8?±ZF`§~}×ꇕɴÞ}®çïûúcÜ‚í÷ùò7kâ6zÆo¦"~¬å‡5¸~åÒznch·€ýç€î·–7FHg–&= e3Íáj5¦ È5°#€úàwzúGRžVSs²€aÆa)h¨×‚ØT0ƒ Wh€'ò #*—¶ K˜,U¦"Px„#Òjå1+Xu>ˆs@8i2H€ö*³†N†ÎB†fh%…cX*bˆfºò†fȆe(‡t($WØu¿Òe„ÀGxð'‚oödt8ˆ—6†K†þb‡¸Ò„n8‡u‡ƒ(‡…Kü§:Zb^w(u!¸h†ÖMh€`8,Hˆ.e‡Ÿè„(ˆ“ŠuTz¸ué‡n ã…'¨ˆŽ8L_x‹£ø‰¸HІ˜Š¢øˆ5Õƒ¯¡\øÅ‡o×…EP½h‹#Škè‹q8ŠsxŠx†ÁȆêR‰®¨…ª…ŒÉ8„ µŒ 6…Òhxdh»è+ÎxÒȋٸ/–#Æøj§Œ€¨ˆ↩Rˆ‚ˆºXÙØ*² ŒÎ²0™èpÞá*zû„œ¸` )Šoˆf¨X‘‰†¹*¨ˆÐ(ŒQH…ï²ã÷R‰€·‰¢–t-ó4Èçþˆ.™!·\£òó(޹EŽ=v7+ç9øŒöR“) 0à(z²X-´˜«ˆŽC‰«%2ÉgB3ƒe’¦¯cQ™RGyy,i_Xy’O •ç0SÉ~˜,KI•øg–?òW_©4äg•ì4–dÙ:¹Ñ•º7—tyzÎb~x©3 —Y×—“7z5¥}+ò–†‰{þ’– w)M~)z©|é —¹2éT~ZÕ3y3š¸S˜Yš6ˆŒ£IšrRl¸G3²w©`Nk C»±™ç²t\·u´y›ùvbY&h€¢JW–šy–»Ù@È©t–Ås:™0çhÎ[MãW(þ“™¹Éœ©€8ywÚ4”ÉPAŠ#rUc5žÃ8S½‘Z *Ñ9vìI‰Ó¹1%C_&žö‰›ï—!‰–’IfüÉŠŠ‰Ÿ(×E¶TÚ“4)#qùõIi ú~YÉYB¥ž ú0×ðypŠ1ZžÚ+X¦¡NVoƒlŠ{Ö ¢¢ìƒT‰† Ê¢þùŸ¸s/+º48 œ ruJ‚Ú¢Ê#S!ú9ÛxhzuM ×Z˜£:*9‚b6¥ 7fD¤2“€GФ•×\çb&`Jxx§ 6ªaãESŠ$52F‘,g7Ùå¥B§á"àC0ìè%zŠnÓ¥þxJ—=Úž| zÞ"”Ô—?™ãr…JiEÃa{v8©¿g{<±¦+s¨ý ”Æé–ÌÇ™°c¡9©«¦£!d}Çc‰ÞרêdÍ~Æc“,¸7Ϋœ*©­VÓ™%¨‰ì0¼šœB1«cW«Çz“Äšš¹zä™…÷yªQzqÁºªÐú¡ c78é©Ê#oËʬüážÜŠ€“Ū/ ª)e­$jæ*„ÛšT$y‘Æ4rˆØ\³¯F34öd«TyEñ«èÇx# ÒR“† +…Ò°úÚ‘É®¯úqÃê*—8Û‡Î*¬ù:±IX’þ:²û 2’'þY'ƒ±Œº'pz°ÙŠqâú£öвÙ²#Û²<Ë‘‡H…;ûèÉ;[¨Z¨å¢Dñ±8w³ló¬ÍŸ<ÛœS«‘2©^S±Ak´{èœfÚ´K[³;*ªéZµi¶èY…B›šj‹¯m{¶\{4ìæ´Ko5¯ŠJ·ÕZ¶C ·~›¶h«¤Zë¶f ³8 žÜ­ë™jŠkUxk6\È·[¢h[¢¿Y´l[¸ic¸&#·sÓ¸{ezœ+›G ‹š"Kµ}‹¹V[cê2¸­Ë™çõ,£+ z{k§ûàSºîÚy¦‹-°»º–™¯§'›$µ‹¨0ŽKÚ>¹ë›Ø*¶ ú¼Þ)¹¬þ{½”;›Äë.Á;¼ 5»ˆË<Í»¡Ô[› Ã»8¾!k½Ù;¹~ú¢ÿڽ훹qkfÉ*÷k·å+²ƒŠ¾F™¿ë»°Àk¼ÌŽ*#¸¬½²û§?™•@ûw Á,¥|]Òû¿lšÓÛ³ÂK±±‰ó«ºîË"$ Â0éÀÌ­ûëº)Œ¡šþk¹-ÜŠ9{¯;›¼²¯ƒ«Ã¬¼–°ô)Äâ;ŸX6lE¤TW°ìZõœ•3Ï)Ã@ ° ÓÂÖIÄ•…Ä]{¹ô¸šÐ±D^|š¾á¶3¼¸`¼Ä ÃLì¡ZlIiÁ´ ùžS ÇrÁÆ[²$‹¼{ÆÆZ“þ/lÇo!Ç6deú½µ¸|/Å‚Ìxœ¸UÄc¼ {'D|»Œh²©¨N™“ÉŠ¬*uŒ™œ„¬& lO‹ Â+ü©¨õƤ\ʦ|Áᇩ¶²Ê”Ê`2ʇ+ËvñÈ`“±‘–Ëôú)FÜ˾\§,tœ€Ä\ÌSÂËïšÌ}̘(=q*“&ì‚JË>IÍÕlÍO£•úÎÈÍð"Í„ Îá¼Éò¥öÙ”Ïl!ãÍËÎ~!ÎiÎF%Ï \É¢ÎXˆÏ{±Ìõ»Í‘üÏçŒÎ|&ÐMÐz¡ÏÓì³N‰†‰¬ÍÚš mÏ ÑùLËøkJA ¼Ýɨ1Çœþmý-š²;X$ÍÏ ^ÅÑ^·Ò€!Ñ,<ÀfNl›ÕK2}­8ýË:í»í2ÔñZÔtqÔôç;6 zLMN=™Õy7ÕƒÑÒb J}ÒZU=p)ŠÕ`Öb Ò–!ºfÔhÖj,æñÕÐüÖ9×|×´mMÏv]\}xœÒÍÚׇÁ©i|Ø{ýyâùÃ|MØ~-gˆÙ\7ÐÉØºì؆1J–í•ê{˜Ç™ØH‰ÙTýzsÙÙ|›u¢­b¬5&É7tMG«ÍÚcm”‘É‚M©³ÝwPÛryÛ]ìÇ7·Û¼í¸î ã¹¹ÀÄ]LKò×! ܺþ›Ú—ÔÜ¿ÖNxÝW†»ËM:Ö½"_ÝH›Ür ÚüÝísÇí£Û½ÓÂ-Ûè=0gâÛ6XÝALÝèß Ãpô}ÈíMÅ­¬Øú½ßW¶Þr ÕæÔžÞq–ÝÊV1±× ÞÐ?æà¶ý¥®u˜<áºÇFþÛ仯ßÇáŽlÞáûùÆ“$NáQÛ¾À7³â*ÝâéBcã? ‘4Þ«6-µeà·f³ nËb÷ã.^[hØ–Ýãäƒ:»“ý͉ åQ.åú¬¸N°‘‚å7®%Ùd^æ‡Íâ] 樲+fÞæn>Æh>wj.+ô£ã-×s®9u¾áþN~ÏyNç3ËÜœ÷瀮;ù=脞åczèF—èó³ç {ŽÞ/†é²7éè–‹˜Ž ~ÞVÝé®éÊÉé¢Î”¤¾éd}ê£^鎹¬Þ|Ÿîݰë™îê´NŒ¶.ë©^è9¹ë¼Žë4œëÀì‹®ë¥^ì·~ìÈÞ¡ÊÞêÌÞìTúìžÞë¿>íÔ£ÖäõšíÕ.ì‘ ‚Þí®}-7kçã”Ûî.œîLºîò ßîNîœÜè•5ïïîæÞdøžïÑnï)Úï¾^îX–ïïçûyðzïõLŸ ¿æO#À†îoQŸÎ—}ñ_ïuÁŸä ÿ_`Òò"ïñ䥴&ÏíÿN^¥ÝÝ+/ÔjçWä1¯ ³¾%DÆÅ7O9¯ánÞó$¯ïBOíÑjñEoIGßçIï(KßôéþôPïíR?õFÿóVìUŸõžõ\¿ë^ÿõ±öbêd_ö~öhéÄŠôkŸ=mÏôo#q?÷¶~™no÷·cÚº«÷wÿæfî÷Zøˆ-ø†øˆŸøŠ¿øŒßøŽÿøù’?ù”_ù–ù˜Ÿùš¿ùœßùžÿù ú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®_;libxml2-2.9.1+dfsg1/doc/APIchunk28.html0000644000175000017500000016077012134171042016031 0ustar aronaron API Alphabetic Index x-x for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index x-x for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter x:

    x00B7
    IS_EXTENDER
    x02D0
    IS_EXTENDER
    x02D1
    IS_EXTENDER
    x0387
    IS_EXTENDER
    x0640
    IS_EXTENDER
    x0E46
    IS_EXTENDER
    x0EC6
    IS_EXTENDER
    x10000-
    IS_CHAR
    x10FFFF
    IS_CHAR
    x20
    IS_BLANK
    IS_BYTE_CHAR
    IS_PUBIDCHAR
    xmlParseAttValue
    xmlParseName
    xmlParseNmtoken
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    x20-
    IS_CHAR
    x3005
    IS_EXTENDER
    x3007
    IS_IDEOGRAPHIC
    x3021-
    IS_IDEOGRAPHIC
    x3029
    IS_IDEOGRAPHIC
    x3031-
    IS_EXTENDER
    x3035
    IS_EXTENDER
    x309D-
    IS_EXTENDER
    x309E
    IS_EXTENDER
    x30FC-
    IS_EXTENDER
    x30FE
    IS_EXTENDER
    x4E00-
    IS_IDEOGRAPHIC
    x9FA5
    IS_IDEOGRAPHIC
    xD7FF
    IS_CHAR
    xE000-
    IS_CHAR
    xFFFD
    IS_CHAR
    xlink
    xlinkGetDefaultDetect
    xlinkGetDefaultHandler
    xlinkSetDefaultDetect
    xlinkSetDefaultHandler
    xlinkHandlerPtr
    xlinkGetDefaultHandler
    xlinkType
    xlinkIsLink
    xml-c14n
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xml-exc-c14n
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xml-name
    xmlParseNamespace
    xml:
    XML_XML_NAMESPACE
    xml:base
    xmlNodeSetBase
    xml:id
    XML_XML_ID
    xml:lang
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xmlNodeGetLang
    xmlNodeSetLang
    xmlTextReaderConstXmlLang
    xmlTextReaderXmlLang
    xmlXPathLangFunction
    xml:space
    _xmlParserCtxt
    xmlNodeGetSpacePreserve
    xmlNodeSetSpacePreserve
    xmlAddDocEntity
    xmlNewEntity
    xmlAttr
    attribute
    attributeSAXFunc
    xmlAttrPtr
    xmlCopyProp
    xmlCopyPropList
    xmlGetID
    xmlAttributePtr
    xmlGetDtdAttrDesc
    xmlGetDtdQAttrDesc
    xmlAttributeTablePtr
    xmlCopyAttributeTable
    xmlBufNodeDump
    xmlNodeDump
    xmlBufPtr
    xmlBufGetNodeContent
    xmlBuffer
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    xmlNodeDump
    xmlOutputBufferCreateBuffer
    xmlBufferPtr
    xmlNewTextWriterMemory
    xmlOutputBufferCreateBuffer
    xmlBufferShrink
    xmlBufShrink
    xmlBuildURI
    xmlBuildRelativeURI
    xmlBytesConsumed
    xmlTextReaderByteConsumed
    xmlCatalogAllow
    xmlCatalogGetDefaults
    xmlCatalogPtr
    xmlNewCatalog
    xmlCatalogResolvePublic
    xmlCatalogGetPublic
    xmlCatalogResolveSystem
    xmlCatalogGetSystem
    xmlCharEncoding
    _xmlDoc
    _xmlParserCtxt
    xmlGetCharEncodingHandler
    xmlCharEncodingHandler
    xmlNewCharEncodingHandler
    xmlCharEncodingHandlerPtr
    xmlNewCharEncodingHandler
    xmlRegisterCharEncodingHandler
    xmlCharEncodingInputFunc
    xmlNewCharEncodingHandler
    xmlCharEncodingOutputFunc
    xmlNewCharEncodingHandler
    xmlChars
    _xmlParserInput
    xmlBufferWriteCHAR
    xmlCleanupParser
    xmlCleanupParser
    xmlCleanupThreads
    xmlCleanupThreads
    xmlCopyDocElementContent
    xmlCopyElementContent
    xmlCreateIntSubset
    xmlNewDtd
    xmlDOMWrapCtxtPtr
    xmlDOMWrapNewCtxt
    xmlDefaultSAXLocator
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlSAX2SetDocumentLocator
    xmlDoc
    _xmlNs
    xmlDocCopyNodeList
    xmlCopyNodeList
    xmlDocNewPI
    xmlNewPI
    xmlDocProperties
    _xmlDoc
    xmlDocPtr
    xmlCopyDoc
    xmlNewTextWriterDoc
    xmlNewTextWriterTree
    xmlTextReaderCurrentDoc
    xmlDtdPtr
    xmlCopyDtd
    xmlIOParseDTD
    xmlParseDTD
    xmlSAXParseDTD
    xmlElementContentPtr
    xmlCopyDocElementContent
    xmlCopyElementContent
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlElementPtr
    xmlGetDtdElementDesc
    xmlGetDtdQElementDesc
    xmlElementTablePtr
    xmlCopyElementTable
    xmlEncodeEntities
    xmlEncodeEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeEntitiesReentrant
    xmlEncodeEntities
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlEncodeSpecialChars
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlEntitiesTablePtr
    xmlCopyEntitiesTable
    xmlCreateEntitiesTable
    xmlEntityPtr
    getEntity
    getEntitySAXFunc
    getParameterEntity
    getParameterEntitySAXFunc
    xmlNewEntityInputStream
    xmlParseEntityRef
    xmlSAX2GetEntity
    xmlSAX2GetParameterEntity
    xmlEnumerationPtr
    xmlCopyEnumeration
    xmlCreateEnumeration
    xmlExpFree
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlExpRef
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlExternalEntityLoader
    xmlGetExternalEntityLoader
    xmlFileOpen_real
    xmlFileOpen
    xmlFree
    xmlC14NDocDumpMemory
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemory
    xmlDocDumpMemoryEnc
    xmlGetNoNsProp
    xmlGetNsProp
    xmlGetProp
    xmlNodeGetBase
    xmlNodeGetContent
    xmlNodeGetLang
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlTextReaderValue
    xmlXPathCastToString
    xmlFreeDoc
    xmlTextReaderCurrentDoc
    xmlFreeDocElementContent
    xmlFreeElementContent
    xmlFreeMutex
    xmlFreeMutex
    xmlFreeNode
    xmlUnlinkNode
    xmlFreeStreamCtxt
    xmlPatternGetStreamCtxt
    xmlGetGlobalState
    xmlGetGlobalState
    xmlGetNoNsProp
    xmlGetProp
    xmlGetNsProp
    xmlGetProp
    xmlGetProp
    xmlGetNoNsProp
    xmlGetThreadId
    xmlGetThreadId
    xmlHashTablePtr
    xmlHashCreate
    xmlHashCreateDict
    xmlIDPtr
    xmlAddID
    xmlIndentTreeOutput
    xmlBufNodeDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocFormatDump
    xmlNodeDump
    xmlNodeDumpOutput
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlInitParser
    htmlInitAutoClose
    xmlCleanupParser
    xmlInitThreads
    xmlInitThreads
    xmlInitializeCatalog
    xmlCatalogAdd
    xmlInitializeGlobalState
    xmlInitializeGlobalState
    xmlInputCloseCallback
    xmlRegisterInputCallbacks
    xmlInputMatchCallback
    xmlRegisterInputCallbacks
    xmlInputOpenCallback
    xmlRegisterInputCallbacks
    xmlInputReadCallback
    xmlRegisterInputCallbacks
    xmlIsBaseCharQ
    xmlIsBaseChar
    xmlIsBaseChar_ch
    xmlIsBaseChar
    xmlIsBlankNode
    xmlKeepBlanksDefault
    xmlIsBlankQ
    xmlIsBlank
    xmlIsBlank_ch
    xmlIsBlank
    xmlIsCharQ
    xmlIsChar
    xmlIsChar_ch
    xmlIsChar
    xmlIsCombiningQ
    xmlIsCombining
    xmlIsDigitQ
    xmlIsDigit
    xmlIsDigit_ch
    xmlIsDigit
    xmlIsExtenderQ
    xmlIsExtender
    xmlIsExtender_ch
    xmlIsExtender
    xmlIsIdeographicQ
    xmlIsIdeographic
    xmlIsMainThread
    xmlIsMainThread
    xmlIsPubidCharQ
    xmlIsPubidChar
    xmlIsPubidChar_ch
    xmlIsPubidChar
    xmlKeepBlanksDefault
    xmlBufNodeDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocFormatDump
    xmlNodeDump
    xmlNodeDumpOutput
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlListWalk
    xmlListWalker
    xmlLoadExtDtdDefaultValue
    XML_COMPLETE_ATTRS
    XML_DETECT_IDS
    XML_SKIP_IDS
    xmlLocationSetPtr
    xmlXPtrFreeLocationSet
    xmlXPtrLocationSetCreate
    xmlLockLibrary
    xmlLockLibrary
    xmlModuleOption
    xmlModuleOpen
    xmlMutexLock
    xmlMutexLock
    xmlMutexUnlock
    xmlMutexUnlock
    xmlNanoFTPGet
    ftpDataCallback
    xmlNanoFTPList
    ftpListCallback
    xmlNewChild
    xmlNewTextChild
    xmlNewDocElementContent
    xmlNewElementContent
    xmlNewDocRawNode
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewMutex
    xmlNewMutex
    xmlNewNode
    xmlNewNodeEatName
    xmlNewTextChild
    xmlNewChild
    xmlNewTextChild
    xmlNewTextWriter
    xmlNewTextWriter
    xmlNewTextWriterDoc
    xmlNewTextWriterFilename
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlNewTextWriterTree
    xmlNodeListGetString
    xmlNodeListGetRawString
    xmlNodePtr
    xmlCopyNode
    xmlCopyNodeList
    xmlDocCopyNode
    xmlDocCopyNodeList
    xmlDocGetRootElement
    xmlNewTextWriterTree
    xmlTextReaderCurrentNode
    xmlTextReaderPreserve
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddUnique
    xmlXPathNodeSetCreate
    xmlXPathNodeSetDel
    xmlXPathNodeSetItem
    xmlXPtrBuildNodeList
    xmlNodeSetContent
    xmlNodeAddContent
    xmlNodeSetContentLen
    xmlNodeAddContentLen
    xmlNodeSetPtr
    xmlXPathFreeNodeSet
    xmlXPathNodeSetCreate
    xmlNodeType
    xmlTextReaderNodeType
    xmlNotationPtr
    xmlGetDtdNotationDesc
    xmlNotationTablePtr
    xmlCopyNotationTable
    xmlNs
    xmlDOMWrapAcquireNsFunction
    xmlNsPtr
    _xmlDOMWrapCtxt
    getNamespace
    xmlCopyNamespace
    xmlCopyNamespaceList
    xmlDOMWrapAcquireNsFunction
    xmlGetNsList
    xmlOutputBuffer
    LIBXML2_NEW_BUFFER
    xmlOutputBufferClose
    xmlSaveFileTo
    xmlSaveFormatFileTo
    xmlOutputBufferPtr
    xmlNewTextWriter
    xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferGetContent
    xmlOutputBufferGetSize
    xmlOutputCloseCallback
    xmlRegisterOutputCallbacks
    xmlOutputMatchCallback
    xmlRegisterOutputCallbacks
    xmlOutputOpenCallback
    xmlRegisterOutputCallbacks
    xmlOutputWriteCallback
    xmlRegisterOutputCallbacks
    xmlParseAttValue
    xmlParseDefaultDecl
    xmlParseChunk
    xmlCreatePushParserCtxt
    xmlParseElementContentDecl
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlParseElementDecl
    xmlParseElementContentDecl
    xmlParseExternalID
    xmlParseNotationDecl
    xmlParseFile
    xmlParseCatalogFile
    xmlParseNamespace:
    xmlParseNamespace
    xmlParseURI
    xmlURIEscape
    xmlParserCtxt
    XML_CTXT_FINISH_DTD_0
    XML_CTXT_FINISH_DTD_1
    xmlParserCtxtPtr
    xmlNewParserCtxt
    xmlNewTextWriterPushParser
    xmlParserError
    _xmlError
    xmlParserErrors
    docbParseChunk
    htmlParseChunk
    xmlParseChunk
    xmlParserFindNodeInfoIndex
    xmlParserFindNodeInfoIndex
    xmlParserHandleReference
    xmlScanName
    xmlParserInputBuffer
    LIBXML2_NEW_BUFFER
    xmlParserInputBufferPtr
    xmlNewTextReader
    xmlParserInputBufferCreateFilenameFunc
    xmlTextReaderGetRemainder
    xmlTextReaderSetup
    xmlParserInputPtr
    resolveEntity
    resolveEntitySAXFunc
    xmlFreeInputStream
    xmlLoadExternalEntity
    xmlNoNetExternalEntityLoader
    xmlParserPrintFileContext
    xmlParserPrintFileInfo
    xmlSAX2ResolveEntity
    xmlParserNodeInfo
    xmlParserFindNodeInfo
    xmlParserProperties
    xmlTextReaderGetParserProp
    xmlTextReaderSetParserProp
    xmlPattern
    LIBXML_PATTERN_ENABLED
    xmlPatternFlags
    xmlPatterncompile
    xmlPatternGetStreamCtxt
    xmlPatternStreamable
    xmlPatterncompile
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlPopInput:
    xmlPopInput
    xmlPushInput:
    xmlPushInput
    xmlRFreeMutex
    xmlFreeRMutex
    xmlRMutexLock
    xmlRMutexLock
    xmlRMutexUnlock
    xmlRMutexUnlock
    xmlRNewMutex
    xmlNewRMutex
    xmlReader
    LIBXML_READER_ENABLED
    xmlRefPtr
    xmlAddRef
    xmlRelaxNGParserFlag
    xmlRelaxParserSetFlag
    xmlRelaxNGValidatePushElement
    xmlRelaxNGValidateFullElement
    xmlSAX2Attribute
    attribute
    xmlSAX2AttributeDecl
    attributeDecl
    xmlSAX2CDataBlock
    cdataBlock
    xmlSAX2Characters
    characters
    xmlSAX2IgnorableWhitespace
    xmlSAX2Comment
    comment
    xmlSAX2Comment
    xmlSAX2ElementDecl
    elementDecl
    xmlSAX2EndDocument
    endDocument
    xmlSAX2EndElement
    endElement
    xmlSAX2EntityDecl
    entityDecl
    xmlSAX2ExternalSubset
    externalSubset
    xmlSAX2GetColumnNumber
    getColumnNumber
    xmlSAX2GetEntity
    getEntity
    xmlSAX2GetLineNumber
    getLineNumber
    xmlSAX2GetParameterEntity
    getParameterEntity
    xmlSAX2GetPublicId
    getPublicId
    xmlSAX2GetSystemId
    getSystemId
    xmlSAX2HasExternalSubset
    hasExternalSubset
    xmlSAX2HasInternalSubset
    hasInternalSubset
    xmlSAX2IgnorableWhitespace
    ignorableWhitespace
    xmlKeepBlanksDefault
    xmlSAX2InitDefaultSAXHandler
    initxmlDefaultSAXHandler
    xmlSAX2InitDocbDefaultSAXHandler
    initdocbDefaultSAXHandler
    xmlSAX2InitHtmlDefaultSAXHandler
    inithtmlDefaultSAXHandler
    xmlSAX2InternalSubset
    internalSubset
    xmlSAX2IsStandalone
    isStandalone
    xmlSAX2NotationDecl
    notationDecl
    xmlSAX2ProcessingInstruction
    processingInstruction
    xmlSAX2Reference
    reference
    xmlSAX2Reference
    xmlSAX2ResolveEntity
    resolveEntity
    xmlSAX2ResolveEntity
    xmlSAX2StartDocument
    startDocument
    xmlSAX2StartElement
    startElement
    xmlSAX2UnparsedEntityDecl
    unparsedEntityDecl
    xmlSAXHandlerPtr
    xmlSchemaSAXPlug
    xmlSAXVersion
    xmlSAXDefaultVersion
    xmlSaveOptions
    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO
    xmlSchemaSAXPlug
    xmlSchemaSAXUnplug
    xmlSchemaValType
    xmlSchemaGetValType
    xmlSchemaValidOption
    xmlSchemaSetValidOptions
    xmlSchematronValidOptions
    xmlSchematronNewValidCtxt
    xmlSetExternalEntityLoader
    resolveEntity
    resolveEntitySAXFunc
    xmlSAX2ResolveEntity
    xmlSnprintfElementContent
    xmlSprintfElementContent
    xmlStrcmp
    xmlStrEqual
    xmlStrdup
    xmlNewNode
    xmlStreamPush
    xmlStreamPushNode
    xmlStringDecodeEntities
    xmlDecodeEntities
    xmlStringGetNodeList
    xmlParseAttValue
    xmlStrncat
    xmlStrncatNew
    xmlStrncmp
    xmlUTF8Charcmp
    xmlTextReader
    xmlNewTextReader
    xmlNewTextReaderFilename
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewFile
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlReaderNewWalker
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    xmlTextReaderCurrentDoc
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    xmlTextReaderLocatorPtr
    xmlTextReaderLocatorBaseURI
    xmlTextReaderLocatorLineNumber
    xmlTextReaderRead
    xmlTextReaderExpand
    xmlTextWriterStartDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTD
    xmlTextWriterWriteDocType
    xmlTextWriterWritePI
    xmlTextWriterWriteProcessingInstruction
    xmlURI
    xmlCreateURI
    xmlFreeURI
    xmlPrintURI
    xmlSaveUri
    xmlURIEscapeStr
    xmlURIEscape
    xmlURIFromPath
    xmlNormalizeWindowsPath
    xmlURIPtr
    xmlParseURI
    xmlParseURIRaw
    xmlUnlinkNode
    xmlDocSetRootElement
    xmlFreeNode
    xmlUnlockLibrary
    xmlUnlockLibrary
    xmlValidCtxtPtr
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    xmlValidGetValidElements
    xmlValidGetValidElements
    xmlValidateAttributeDecl
    xmlParseDefaultDecl
    xmlValidateAttributeValue
    xmlParseAttributeType
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlWriter
    LIBXML_WRITER_ENABLED
    xmlXPathCheckError
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    xmlXPathCompExprPtr
    xmlXPathCompile
    xmlXPathCtxtCompile
    xmlXPathContext
    xmlXPathFreeContext
    xmlXPathNewContext
    xmlXPtrNewContext
    xmlXPathError
    err
    xmlXPathEvalPredicate
    xmlXPtrEvalRangePredicate
    xmlXPathFreeObject
    xmlXPathFreeNodeSetList
    xmlXPathFunction
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS
    xmlXPathNodeTrailingSorted
    xmlXPathNodeTrailing
    xmlXPathObject
    xmlXPathContextSetCache
    xmlXPathObjectPtr
    xmlXPathCompiledEval
    xmlXPathEval
    xmlXPathEvalExpression
    xmlXPathFreeNodeSetList
    xmlXPathFreeObject
    xmlXPathNewBoolean
    xmlXPathNewCString
    xmlXPathNewFloat
    xmlXPathNewNodeSet
    xmlXPathNewNodeSetList
    xmlXPathNewString
    xmlXPathNewValueTree
    xmlXPathNodeEval
    xmlXPathWrapNodeSet
    xmlXPtrEval
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetCreate
    xmlXPtrLocationSetDel
    xmlXPtrNewCollapsedRange
    xmlXPtrNewLocationSetNodeSet
    xmlXPtrNewLocationSetNodes
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints
    xmlXPtrWrapLocationSet
    xmlXPathParserContext
    xmlXPathFreeParserContext
    xmlXPathNewParserContext
    xmlXPathTrailingSorted
    xmlXPathTrailing
    xmlns
    xmlNamespaceParseNSDef
    xmlns:???
    xmlParseAttribute
    xmltextReader
    xmlReaderForDoc
    xmlReaderForFd
    xmlReaderForIO
    xmlReaderForMemory
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlReaderNewWalker
    xmlReaderWalker
    xpath
    xmlShellPrintXPathError
    xmlShellPrintXPathResult
    xpointer
    XINCLUDE_PARSE_XPOINTER

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk18.html0000644000175000017500000012337412134171042016027 0ustar aronaron API Alphabetic Index j-l for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index j-l for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter j:

    just
    _xmlDOMWrapCtxt
    htmlSetMetaEncoding
    inputPop
    namePop
    nodePop
    valuePop
    xmlCleanupParser
    xmlCleanupThreads
    xmlCopyEnumeration
    xmlCreateEntitiesTable
    xmlCreateEnumeration
    xmlDOMWrapAdoptNode
    xmlHandleEntity
    xmlNanoFTPInit
    xmlNanoHTTPInit
    xmlSnprintfElementContent
    xmlTextReaderByteConsumed
    xmlXPathNewContext
    xmlXPathNewParserContext
    xmlXPathNextSelf
    xmlXPtrNewContext

    Letter k:

    keep
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlGetBufferAllocationScheme
    xmlParseURIRaw
    xmlParserInputGrow
    xmlSubstituteEntitiesDefault
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    xmlXPathNextNamespace
    keeps
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    kept
    _xmlParserCtxt
    _xmlXPathContext
    htmlAutoCloseTag
    htmlIsAutoClosed
    htmlParseElement
    xmlKeepBlanksDefault
    xmlXPathOrderDocElems
    keyword
    xmlParseDefaultDecl
    kill
    xmlCheckVersion
    kind
    _xmlSchemaAttributeGroup
    _xmlSchemaElement
    _xmlSchemaFacet
    _xmlSchemaNotation
    _xmlSchemaType
    _xmlSchemaWildcard
    know
    BAD_CAST
    xmlDOMWrapCloneNode
    knowledge
    htmlAttrAllowed
    known
    _xmlParserInput
    xmlAllocParserInputBuffer
    xmlCreateIOParserCtxt
    xmlIOParseDTD
    xmlNewIOInputStream
    xmlOutputBufferCreateIO
    xmlParseCharEncoding
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic

    Letter l:

    label
    _xmlParserCtxt
    labeled
    xmlParseCtxtExternalEntity
    xmlParseExtParsedEnt
    xmlParseExternalEntity
    lack
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlReallocLoc
    lang
    xmlNodeGetLang
    xmlXPathLangFunction
    langtag
    xmlCheckLanguageID
    language
    xmlCheckLanguageID
    xmlNodeGetLang
    xmlNodeSetLang
    xmlXPathLangFunction
    languages
    xmlExpExpDerive
    xmlExpGetStart
    xmlExpSubsume
    large
    _xmlParserCtxt
    _xmlParserInput
    xmlGetBufferAllocationScheme
    largest
    xmlXPathFloorFunction
    later
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlKeepBlanksDefault
    xmlNewEntity
    xmlParseAttValue
    latest
    xmlNanoHTTPReturnCode
    layer
    xmlChildrenNode
    xmlInitMemory
    xmlNanoFTPCleanup
    xmlNanoFTPInit
    xmlNanoHTTPCleanup
    xmlNanoHTTPInit
    xmlRootNode
    xmlSaveFileTo
    xmlSaveFormatFileTo
    xmlSchemaSAXPlug
    xmlSchemaSAXUnplug
    leading
    xmlParseAttValue
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlParseNotationType
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNormalizeFunction
    xmlXPathStringFunction
    leak
    xmlCleanupParser
    xmlCleanupThreads
    least
    xmlDetectCharEncoding
    xmlXPathStringFunction
    led
    xmlInitializeDict
    left
    xmlExpNewOr
    xmlExpNewSeq
    xmlMemDisplayLast
    xmlTextReaderGetRemainder
    legacy
    htmlNodeStatus
    len
    xmlBufferAdd
    xmlBufferAddHead
    xmlCharStrndup
    xmlDecodeEntities
    xmlExpStringDerive
    xmlGetFeaturesList
    xmlGetUTF8Char
    xmlNewDocTextLen
    xmlNewTextLen
    xmlSplitQName3
    xmlStrncat
    xmlStrncatNew
    xmlStrndup
    xmlUTF8Strndup
    xmlUTF8Strsize
    length-1
    xmlXPathNodeSetItem
    less
    xmlExpExpDerive
    xmlSaveToFilename
    xmlXPathCeilingFunction
    xmlXPathCompareValues
    xmlXPathSubstringFunction
    less-than
    xmlNewTextChild
    level
    XML_SCHEMAS_ELEM_TOPLEVEL
    _xmlDoc
    xmlBufNodeDump
    xmlC14NDocSave
    xmlCatalogSetDebug
    xmlCleanupMemory
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlNodeDump
    xmlNodeDumpOutput
    xmlParseVersionNum
    xmlShellPwd
    xmlStreamPop
    xmlXPathDebugDumpCompExpr
    xmlXPathDebugDumpObject
    lexical
    xmlParseDefaultDecl
    xmlSchemaGetCanonValue
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    xmlSchemaValidatePredefinedType
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateQName
    lib
    xmlCheckVersion
    libc
    DEBUG_MEMORY
    libraries
    LIBXML_MODULE_EXTENSION
    xmlCleanupParser
    xmlCleanupThreads
    xmlRelaxNGInitTypes
    library
    _xmlError
    _xmlSchema
    xmlCleanupMemory
    xmlCleanupParser
    xmlCleanupThreads
    xmlDictCleanup
    xmlHasFeature
    xmlInitThreads
    xmlInitializeGlobalState
    xmlLockLibrary
    xmlModuleFree
    xmlModuleOpen
    xmlOutputBufferCreateFilename
    xmlParseNamespace
    xmlRelaxNGCleanupTypes
    xmlSAXDefaultVersion
    xmlSchemaCleanupTypes
    xmlSchemaFreeValue
    xmlSchemaGetPredefinedType
    xmlSchemaInitTypes
    xmlUnlockLibrary
    libs
    xmlKeepBlanksDefault
    libxml
    DEBUG_MEMORY
    LIBXML_TEST_VERSION
    _xmlParserCtxt
    xmlC14NDocSave
    xmlGcMemSetup
    xmlMemSetup
    xmlRegisterHTTPPostCallbacks
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    xmlShellPrintXPathError
    xmlXPathNodeSetFreeNs
    libxml1
    xmlChildrenNode
    xmlRootNode
    libxml2
    xmlCleanupParser
    xmlCleanupThreads
    xmlFreeMutex
    xmlInitThreads
    xmlLockLibrary
    xmlMutexLock
    xmlMutexUnlock
    xmlNewMutex
    xmlRMutexLock
    xmlRMutexUnlock
    xmlUnlockLibrary
    lifetime
    xmlBufferCreateStatic
    xmlExpCtxtNbCons
    like
    IS_CHAR_CH
    IS_DIGIT_CH
    IS_EXTENDER_CH
    IS_LETTER_CH
    LIBXML_ATTR_FORMAT
    LIBXML_DOTTED_VERSION
    LIBXML_TREE_ENABLED
    xmlCharEncOutFunc
    xmlLoadSGMLSuperCatalog
    xmlNanoFTPScanProxy
    xmlNanoHTTPScanProxy
    xmlParseCatalogFile
    xmlShellList
    xmlTextReaderNormalization
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    likely
    xmlGetThreadId
    limit
    XML_MAX_NAME_LENGTH
    _xmlXPathParserContext
    xmlCharEncFirstLine
    xmlDecodeEntities
    xmlDictSetLimit
    xmlPatternMaxDepth
    limitation
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    xmlGetLineNo
    limited
    _htmlElemDesc
    xmlNodeDump
    linear
    htmlEntityLookup
    htmlEntityValueLookup
    xmlExpExpDerive
    lines
    xmlGetLineNo
    linked
    _xmlSchemaAttributeLink
    _xmlSchemaFacetLink
    _xmlSchemaTypeLink
    linking
    xlinkIsLink
    links
    ftpListCallback
    listing
    xmlNanoFTPList
    xmlShellList
    lists
    XML_COMPLETE_ATTRS
    _xmlXPathContext
    literal
    xmlCurrentChar
    xmlParseAttValue
    xmlParsePubidLiteral
    xmlParserHandlePEReference
    load
    xmlLoadExternalEntity
    xmlNanoHTTPFetch
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlNoNetExternalEntityLoader
    xmlParseCtxtExternalEntity
    xmlParseExternalEntity
    xmlShell
    xmlShellLoad
    loaded
    _xmlParserCtxt
    loader
    resolveEntity
    resolveEntitySAXFunc
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlNoNetExternalEntityLoader
    xmlSAX2ResolveEntity
    loaders
    xmlExternalEntityLoader
    loading
    resolveEntity
    resolveEntitySAXFunc
    xmlIsID
    xmlSAX2ResolveEntity
    xmlShellLoad
    loads
    xmlShellLoad
    loadsubset
    XML_COMPLETE_ATTRS
    XML_DETECT_IDS
    XML_SKIP_IDS
    local-name
    xmlXPathLocalNameFunction
    localname
    startElementNsSAX2Func
    xmlSAX2StartElementNs
    xmlStrQEqual
    location
    htmlParseEntityRef
    xmlGetFeature
    xmlNanoHTTPFetch
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlRelaxNGNewParserCtxt
    xmlSchemaNewParserCtxt
    xmlSchematronNewParserCtxt
    xmlSetFeature
    xmlUTF8Strloc
    xmlXPtrLocationSetAdd
    locations
    _xmlLocationSet
    locator
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xmlCanonicPath
    xmlPathToURI
    xmlSAX2SetDocumentLocator
    xmlSchemaValidateSetLocator
    xmlSchemaValidityLocatorFunc
    xmlTextReaderErrorFunc
    xmlTextReaderLocatorBaseURI
    xmlTextReaderLocatorLineNumber
    locators
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    lock
    xmlLockLibrary
    xmlMutexLock
    xmlNewRMutex
    xmlRMutexLock
    xmlUnlockLibrary
    logging
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlMemStrdupLoc
    xmlMemoryStrdup
    xmlReallocLoc
    long
    IS_BASECHAR
    IS_COMBINING
    IS_DIGIT
    xmlDetectCharEncoding
    xmlParserFindNodeInfoIndex
    xmlSchemaGetFacetValueAsULong
    longer
    XML_MAX_NAMELEN
    xmlCheckUTF8
    xmlXPathTranslateFunction
    look-ahead
    _xmlParserCtxt
    lookahead
    xmlParserInputGrow
    xmlParserInputRead
    looked
    _xmlNodeSet
    xmlPatternFromRoot
    looks
    xmlGetNoNsProp
    xmlGetNsProp
    xmlGetProp
    xmlHasNsProp
    xmlHasProp
    lookups
    XML_DETECT_IDS
    xmlParseCatalogFile
    loop
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    loops
    _xmlParserCtxt
    lossless
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    lower
    xmlExpNewRange
    lowercase
    htmlTagLookup
    xmlIsRef

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk24.html0000644000175000017500000027021112134171042016015 0ustar aronaron API Alphabetic Index s-s for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index s-s for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter s:

    s390
    XML_CAST_FPTR
    safe
    BAD_CAST
    xmlInitializeCatalog
    xmlLoadCatalog
    xmlLoadCatalogs
    safety
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    same
    HTML_COMMENT_NODE
    HTML_ENTITY_REF_NODE
    HTML_PI_NODE
    HTML_PRESERVE_NODE
    HTML_TEXT_NODE
    IS_BLANK_CH
    checkNamespace
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlParseMarkupDecl
    xmlParseStartTag
    xmlReplaceNode
    xmlStrEqual
    xmlStrncatNew
    xmlURIUnescapeString
    xmlXPathCmpNodes
    xmlXPathIdFunction
    xmlXPathLangFunction
    xmlXPathNextAncestorOrSelf
    xmlXPathNextFollowing
    xmlXPathNextPreceding
    xmlXPathNormalizeFunction
    xmlXPathSetContextNode
    save
    htmlNodeDumpFileFormat
    xmlGcMemGet
    xmlMemGet
    xmlNanoHTTPFetch
    xmlSaveTree
    xmlShell
    xmlShellSave
    saved
    _htmlElemDesc
    xmlNanoHTTPFetch
    xmlNanoHTTPSave
    xmlSaveFormatFileEnc
    saves
    xmlNanoFTPRead
    xmlNanoHTTPRead
    xmlNanoHTTPSave
    xmlShellWrite
    saving
    LIBXML_OUTPUT_ENABLED
    LIBXML_WRITER_ENABLED
    xmlKeepBlanksDefault
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    xmlOutputBufferCreateIO
    xmlSaveClose
    xmlSaveDoc
    xmlSaveFlush
    xmlSaveSetAttrEscape
    xmlSaveSetEscape
    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO
    xmlSaveTree
    sax
    docbSAXParseDoc
    docbSAXParseFile
    htmlSAXParseDoc
    htmlSAXParseFile
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    say
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    says
    xmlParseComment
    scan
    htmlEntityLookup
    htmlEntityValueLookup
    xmlXPathStringEvalNumber
    scanner
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlHashScanner
    xmlHashScannerFull
    scanning
    xmlHashScanner
    xmlHashScannerFull
    scannner
    xmlHashScanner
    xmlHashScannerFull
    schemas
    xmlRelaxNGNewDocParserCtxt
    xmlRelaxNGNewMemParserCtxt
    xmlSchemaGetFacetValueAsULong
    xmlSchemaGetValType
    xmlSchemaNewMemParserCtxt
    xmlSchemaValidateDoc
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateFile
    xmlSchemaValidateStream
    xmlSchemaValidityLocatorFunc
    xmlSchematronNewMemParserCtxt
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    schematron
    xmlSchematronValidateDoc
    scheme
    _xmlURI
    xmlBufferSetAllocationScheme
    xmlGetBufferAllocationScheme
    schemes
    xmlParseCharEncoding
    scope
    _xmlXPathContext
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlSetNsProp
    xmlSetProp
    xmlTextReaderConstXmlLang
    xmlTextReaderLookupNamespace
    xmlTextReaderXmlLang
    scoping
    xmlNewGlobalNs
    script
    htmlIsScriptAttribute
    xmlCheckLanguageID
    search
    XML_SCHEMAS_ELEM_CIRCULAR
    _xmlXPathAxis
    xmlCharInRange
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlListReverseSearch
    xmlListSearch
    xmlSearchNs
    xmlStrcasestr
    xmlStrchr
    xmlStrstr
    searched
    xmlDictCreateSub
    section
    HTML_PRESERVE_NODE
    xmlBuildURI
    xmlCatalogSetDefaultPrefer
    xmlParseCharData
    xmlParseCharEncoding
    xmlTextWriterEndCDATA
    xmlTextWriterStartCDATA
    sections
    xmlKeepBlanksDefault
    xmlNodeGetBase
    seems
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlScanName
    xmlValidateNotationDecl
    selected
    xmlCheckLanguageID
    selection
    LIBXML_PATTERN_ENABLED
    selects
    xmlXPathIdFunction
    self
    xmlXPathNextSelf
    semantic
    xmlAutomataNewNegTrans
    xmlXPathNodeSetFreeNs
    semantics
    xmlXPathContextSetCache
    sense
    xmlCreateEntitiesTable
    separated
    xmlLoadCatalogs
    separately
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlValidateAttributeDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    seq
    xmlParseElementChildrenContentDecl
    sequence
    _xmlSchemaFacet
    _xmlSchemaType
    xmlCharEncOutFunc
    xmlClearNodeInfoSeq
    xmlCurrentChar
    xmlExpNewSeq
    xmlExpParse
    xmlGetUTF8Char
    xmlInitNodeInfoSeq
    xmlParseAttValue
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseInNodeContext
    xmlParserAddNodeInfo
    xmlParserFindNodeInfoIndex
    xmlUTF8Strlen
    xmlUTF8Strsize
    xmlUTF8Strsub
    xmlXPathIdFunction
    sequences
    xmlCheckUTF8
    xmlExpParse
    xmlParseAttValue
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXPathNormalizeFunction
    sequqnce
    xmlExpIsNillable
    serialization
    LIBXML_OUTPUT_ENABLED
    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO
    xmlShellCat
    xmlShellWrite
    xmlValidatePopElement
    xmlValidatePushElement
    serialized
    xmlTextReaderReadOuterXml
    serializing
    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO
    server
    _xmlURI
    xmlNanoFTPCheckResponse
    xmlNanoFTPCloseConnection
    xmlNanoFTPConnectTo
    xmlNanoFTPCwd
    xmlNanoFTPDele
    xmlNanoFTPGet
    xmlNanoFTPGetConnection
    xmlNanoFTPGetResponse
    xmlNanoFTPGetSocket
    xmlNanoFTPList
    xmlNanoFTPQuit
    set:difference
    xmlXPathDifference
    set:distinct
    xmlXPathDistinct
    xmlXPathDistinctSorted
    set:has-same-node
    xmlXPathHasSameNodes
    set:intersection
    xmlXPathIntersection
    set:leading
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    set:trailing
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathTrailing
    xmlXPathTrailingSorted
    sets
    initxmlDefaultSAXHandler
    xmlGetUTF8Char
    xmlSAX2InitDefaultSAXHandler
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlXPathDifference
    xmlXPathIntersection
    setting
    xmlSetGenericErrorFunc
    xmlXPathContextSetCache
    setups
    xmlParseEncodingDecl
    severity
    xmlTextReaderErrorFunc
    sgmlsource
    getSystemId
    xmlSAX2GetSystemId
    shadowed
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    shall
    _xmlParserCtxt
    shared
    LIBXML_MODULE_EXTENSION
    xmlCatalogAdd
    xmlModuleFree
    xmlModuleOpen
    shares
    xmlXPathHasSameNodes
    shell
    DEBUG_MEMORY
    xmlShell
    xmlShellBase
    xmlShellCat
    xmlShellCmd
    xmlShellDir
    xmlShellDu
    xmlShellList
    xmlShellLoad
    xmlShellPwd
    xmlShellReadlineFunc
    xmlShellSave
    xmlShellValidate
    xmlShellWrite
    shorten
    xmlDebugDumpString
    shortest
    xmlCheckLanguageID
    shorthand
    xmlTextReaderConstPrefix
    xmlTextReaderPrefix
    show
    LIBXML_VERSION_EXTRA
    xlinkExtendedLinkFunk
    xmlMemDisplay
    xmlMemShow
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlShellDu
    shown
    ftpListCallback
    sibling
    _xmlAttr
    _xmlAttribute
    _xmlDoc
    _xmlDtd
    _xmlElement
    _xmlEntity
    _xmlNode
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlNextElementSibling
    xmlPreviousElementSibling
    xmlSchemaValueAppend
    xmlSchemaValueGetNext
    xmlXPathNextPrecedingSibling
    siblings
    xmlAddSibling
    xmlFreeNodeList
    xmlFreePropList
    xmlXPathNextFollowingSibling
    xmlXPathNextPrecedingSibling
    sign
    xmlXPathStringFunction
    signal
    ATTRIBUTE_UNUSED
    _xmlParserCtxt
    signature
    xmlShellCmd
    xmlShellReadlineFunc
    signs
    xmlNewTextChild
    similar
    xmlGetNoNsProp
    xmlNewNs
    xmlShell
    xmlShellPwd
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    xmlXPathNodeSetGetLength
    xmlXPathNodeSetItem
    simple
    XML_SCHEMAS_TYPE_ABSTRACT
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
    _xmlSchemaType
    xlinkSimpleLinkFunk
    xmlAttrSerializeTxtContent
    xmlFreeMutex
    xmlHashScanner
    xmlIsRef
    xmlMutexLock
    xmlMutexUnlock
    xmlNewMutex
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaNewStringValue
    xmlSchemaValidateListSimpleTypeFacet
    simpleType
    XML_SCHEMAS_TYPE_FINAL_DEFAULT
    XML_SCHEMAS_TYPE_FINAL_LIST
    XML_SCHEMAS_TYPE_FINAL_RESTRICTION
    XML_SCHEMAS_TYPE_FINAL_UNION
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    XML_SCHEMAS_TYPE_VARIETY_ATOMIC
    XML_SCHEMAS_TYPE_VARIETY_LIST
    XML_SCHEMAS_TYPE_VARIETY_UNION
    simply
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    since
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    xmlBuildRelativeURI
    xmlChildElementCount
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlFirstElementChild
    xmlLastElementChild
    xmlNextElementSibling
    xmlParseExternalID
    xmlPreviousElementSibling
    xmlRelaxNGNewDocParserCtxt
    xmlSchemaValidateSetLocator
    single
    IS_DIGIT_CH
    XML_MAX_TEXT_LENGTH
    xmlCurrentChar
    xmlParseAttValue
    xmlParseElementMixedContentDecl
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlValidateAttributeDecl
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlXPathNewNodeSet
    xmlXPathNormalizeFunction
    xmlXPtrNewCollapsedRange
    xmlXPtrNewLocationSetNodes
    single-byte
    IS_CHAR_CH
    IS_EXTENDER_CH
    IS_PUBIDCHAR_CH
    singleton
    xmlCheckLanguageID
    site1
    xmlBuildRelativeURI
    site2
    xmlBuildRelativeURI
    size_t
    xmlBufShrink
    sizes
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    skip
    xmlSkipBlankChars
    skipped
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlSkipBlankChars
    slot
    xmlXPathContextSetCache
    slots
    xmlXPathContextSetCache
    small
    xmlGetBufferAllocationScheme
    smaller
    xmlURIUnescapeString
    smallest
    xmlXPathCeilingFunction
    socket
    INVALID_SOCKET
    xmlCheckFilename
    xmlNanoFTPGetSocket
    sockets
    INVALID_SOCKET
    SOCKET
    software
    LIBXML_TEST_VERSION
    xmlTextReaderNodeType
    solution
    xmlNormalizeWindowsPath
    some
    XML_SKIP_IDS
    characters
    charactersSAXFunc
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    xmlBuildRelativeURI
    xmlCleanupParser
    xmlCleanupThreads
    xmlGcMemSetup
    xmlGetThreadId
    xmlHandleEntity
    xmlMemSetup
    xmlParseAttributeType
    xmlParseBalancedChunkMemoryRecover
    xmlParserInputDeallocate
    xmlRelaxNGValidatePushCData
    xmlSAX2Characters
    xmlSAX2IgnorableWhitespace
    xmlTextReaderSetParserProp
    xmlValidatePushCData
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    somehow
    xmlNodeDump
    sometimes
    xmlCheckLanguageID
    xmlCleanupParser
    xmlCleanupThreads
    xmlExpExpDerive
    somewhat
    xmlCheckLanguageID
    xmlCleanupParser
    sorted
    xmlParserAddNodeInfo
    xmlParserFindNodeInfoIndex
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathTrailing
    xmlXPathTrailingSorted
    sounds
    xmlCheckLanguageID
    source
    _xmlXPathContext
    htmlCtxtReadIO
    htmlGetMetaEncoding
    htmlReadIO
    xlinkExtendedLinkFunk
    xmlCheckFilename
    xmlCopyError
    xmlCtxtReadIO
    xmlNewTextReader
    xmlParserInputBufferCreateFilenameFunc
    xmlReadIO
    xmlReaderForIO
    xmlReaderNewIO
    sourceDoc
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    sourceforge
    xmlXPathIsInf
    xmlXPathIsNaN
    spaces
    _xmlParserCtxt
    htmlDocContentDumpFormatOutput
    htmlDocContentDumpOutput
    htmlDocDumpMemoryFormat
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    htmlSaveFileEnc
    htmlSaveFileFormat
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocFormatDump
    xmlKeepBlanksDefault
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlSaveFormatFileTo
    xmlSchemaCollapseString
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateQName
    span
    xmlCurrentChar
    xmlStringCurrentChar
    spec
    xmlCatalogSetDefaultPrefer
    xmlChildElementCount
    xmlFirstElementChild
    xmlLastElementChild
    xmlNextElementSibling
    xmlParseComment
    xmlPreviousElementSibling
    spec:
    IS_BASECHAR
    IS_BLANK
    IS_BYTE_CHAR
    IS_CHAR
    IS_COMBINING
    IS_DIGIT
    IS_EXTENDER
    IS_IDEOGRAPHIC
    IS_LETTER
    IS_PUBIDCHAR
    special
    XML_SKIP_IDS
    XML_XML_ID
    XML_XML_NAMESPACE
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlTextWriterWriteRawLen
    specialized
    _xmlDOMWrapCtxt
    xmlGcMemGet
    xmlGcMemSetup
    specific
    XML_CATALOG_PI
    _xmlValidCtxt
    _xmlXPathContext
    xmlNoNetExternalEntityLoader
    xmlParseNamespace
    xmlSchemaIsBuiltInTypeFacet
    specification
    XML_XML_NAMESPACE
    xmlGetThreadId
    xmlTextReaderNormalization
    specifications
    xmlParseSDDecl
    specify
    XML_SCHEMAS_TYPE_BLOCK_DEFAULT
    xmlTextReaderLookupNamespace
    xmlTextReaderStandalone
    specifying
    xmlMallocAtomicLoc
    xmlMallocLoc
    xmlMemMalloc
    xmlMemRealloc
    xmlReallocLoc
    speed
    xmlXPathOrderDocElems
    speedup
    xmlTextReaderConstString
    split
    xmlXPathIdFunction
    stacked
    _xmlXPathParserContext
    xmlPushInput
    stage
    XML_SCHEMAS_TYPE_FIXUP_1
    stamps
    xmlXPathOrderDocElems
    standalone
    _xmlDoc
    _xmlParserCtxt
    _xmlParserInput
    isStandalone
    xmlCurrentChar
    xmlParseSDDecl
    xmlSAX2IsStandalone
    xmlTextReaderStandalone
    standalone=
    _xmlDoc
    xmlParseEntityRef
    xmlParsePEReference
    xmlParseSDDecl
    xmlParserHandlePEReference
    standalone?
    isStandaloneSAXFunc
    standard
    docbParseDocument
    htmlParseDocument
    xmlKeepBlanksDefault
    xmlParseDocument
    xmlXPathSubstringFunction
    start
    _htmlElemDesc
    startDocument
    startDocumentSAXFunc
    startElementNsSAX2Func
    xmlByteConsumed
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlExpGetStart
    xmlParseStartTag
    xmlRelaxNGValidatePushElement
    xmlSAX2StartDocument
    xmlSAX2StartElementNs
    xmlSplitQName3
    xmlTextReaderByteConsumed
    xmlValidatePushElement
    xmlXPtrNewLocationSetNodes
    xmlXPtrNewRange
    start-tag
    xmlParseElement
    xmlParseStartTag
    started
    xmlTextWriterWriteDTDExternalEntity
    starting
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlByteConsumed
    xmlNewCharRef
    xmlNewTextWriterTree
    xmlSaveTree
    xmlSchemaValidateOneElement
    xmlXPathOrderDocElems
    xmlXPathSubstringFunction
    xmlXPtrNewCollapsedRange
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints
    starts
    xmlXPathStartsWithFunction
    starts-with
    xmlXPathStartsWithFunction
    startup
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlInitializeCatalog
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlSAX2SetDocumentLocator
    stashed
    xmlNanoHTTPAuthHeader
    stat
    xmlCheckFilename
    stateful
    xmlCharEncodingOutputFunc
    states
    _xmlValidCtxt
    static
    xmlXPathOrderDocElems
    status
    xmlTextReaderIsValid
    xmlTextReaderStandalone
    stderr
    xmlSetGenericErrorFunc
    stdin
    xmlParserInputBufferCreateFilename
    stdout
    htmlSaveFile
    xmlOutputBufferCreateFilename
    xmlSaveFile
    xmlSaveFormatFile
    xmlShell
    step
    xmlExpStringDerive
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlValidateDocumentFinal
    xmlValidateDtdFinal
    steps
    xmlNormalizeURIPath
    xmlValidateDocumentFinal
    still
    xmlCheckLanguageID
    xmlCleanupParser
    xmlCleanupThreads
    xmlModuleFree
    xmlNoNetExternalEntityLoader
    xmlParseNamespace
    xmlReconciliateNs
    stop
    xmlListWalker
    stops
    xmlTextReaderGetRemainder
    storage
    xmlUTF8Strsize
    store
    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    htmlParseEntityRef
    isolat1ToUTF8
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlExpGetLanguage
    xmlExpGetStart
    xmlGetFeature
    xmlGetLineNo
    xmlInputReadCallback
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlParseAttribute
    xmlParseEntityValue
    xmlValidGetPotentialChildren
    xmlValidGetValidElements
    stored
    xmlParseElementContentDecl
    xmlParserInputBufferGrow
    xmlParserInputBufferPush
    xmlParserInputBufferRead
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    xmlXPathOrderDocElems
    stores
    xmlBufNodeDump
    str
    htmlParseEntityRef
    xmlBufferAdd
    strcasecmp
    xmlStrcasecmp
    strcat
    xmlStrcat
    strchr
    xmlStrchr
    strcmp
    xmlStrcmp
    strdup
    xmlCharStrdup
    xmlGcMemGet
    xmlGcMemSetup
    xmlMemGet
    xmlMemSetup
    xmlMemStrdupLoc
    xmlMemoryStrdup
    xmlStrdup
    xmlStrdupFunc
    streamable
    xmlPatternStreamable
    xmlSchemaValidateFile
    streaming
    xmlPatternGetStreamCtxt
    xmlStreamWantsAnyNode
    streams
    _xmlParserCtxt
    xmlSkipBlankChars
    strict
    XML_SCHEMAS_ANYATTR_STRICT
    XML_SCHEMAS_ANY_STRICT
    xmlParseExternalID
    xmlXPathCompareValues
    string--that
    xmlNormalizeURIPath
    string-length
    xmlXPathStringLengthFunction
    string?
    xmlXPathNormalizeFunction
    xmlXPathStringLengthFunction
    stringi
    xmlXPathSubstringAfterFunction
    strings
    _xmlParserCtxt
    xmlDictCreateSub
    xmlDictGetUsage
    xmlExpGetLanguage
    xmlExpGetStart
    xmlExpParse
    xmlGetBufferAllocationScheme
    xmlGetFeaturesList
    xmlPatterncompile
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRegexpCompile
    xmlStrEqual
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlStrncatNew
    stripping
    xmlXPathNormalizeFunction
    strncasecmp
    xmlStrncasecmp
    strncat
    xmlStrncat
    strncmp
    xmlStrncmp
    strndup
    xmlCharStrndup
    xmlStrndup
    xmlUTF8Strndup
    strstr
    xmlStrcasestr
    xmlStrstr
    struct
    xmlFreeMutex
    xmlFreeURI
    xmlNewMutex
    xmlParserFindNodeInfo
    xmlSchemaGetBuiltInType
    xmlSchemaNewNOTATIONValue
    xmlSchemaNewQNameValue
    xmlSchemaNewStringValue
    structured
    xmlRelaxNGSetValidStructuredErrors
    xmlSchemaSetParserStructuredErrors
    xmlSchemaSetValidStructuredErrors
    xmlSchematronSetValidStructuredErrors
    xmlSetStructuredErrorFunc
    structures
    xmlFreeDoc
    xmlFreeNs
    xmlFreeNsList
    xmlLoadACatalog
    xmlNewRMutex
    xmlNodeDump
    xmlRegFreeExecCtxt
    struture
    xmlRelaxNGParse
    xmlSchemaParse
    xmlSchematronParse
    stuff
    _xmlXPathContext
    xmlParseNamespace
    style
    xmlSAXDefaultVersion
    sub
    xmlExpExpDerive
    sub-elements
    _htmlElemDesc
    subelement
    _htmlElemDesc
    htmlDefaultSubelement
    xmlNewDocElementContent
    xmlNewElementContent
    subelements
    _htmlElemDesc
    subexpression
    xmlExpExpDerive
    xmlExpSubsume
    subexpressions
    xmlExpParse
    subject
    xmlParseSDDecl
    sublanguage
    xmlXPathLangFunction
    submits
    xmlRegisterHTTPPostCallbacks
    subsequent
    xmlIOHTTPOpenW
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    subset?
    hasExternalSubsetSAXFunc
    subsets
    xmlGetParameterEntity
    xmlValidateDtdFinal
    substituion
    XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION
    substitute
    xmlDOMWrapRemoveNode
    substituted
    XML_SUBSTITUTE_BOTH
    XML_SUBSTITUTE_NONE
    XML_SUBSTITUTE_PEREF
    XML_SUBSTITUTE_REF
    xmlBufGetNodeContent
    xmlNodeBufGetContent
    xmlNodeGetContent
    xmlParseEntityValue
    substituting
    xmlSubstituteEntitiesDefault
    substitutionGroup
    XML_SCHEMAS_ELEM_INTERNAL_RESOLVED
    substitutions
    XML_SCHEMAS_ELEM_BLOCK_EXTENSION
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    substitutions:
    XML_SCHEMAS_ELEM_BLOCK_RESTRICTION
    XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION
    substring
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlStrsub
    xmlUTF8Strsub
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    xmlXPathSubstringFunction
    substring-after
    xmlXPathSubstringAfterFunction
    substring-before
    xmlXPathSubstringBeforeFunction
    subtag
    xmlCheckLanguageID
    subtags
    xmlCheckLanguageID
    subtraction
    xmlXPathSubValues
    subtree
    attribute
    attributeSAXFunc
    xmlFreeDocElementContent
    xmlFreeElementContent
    xmlReconciliateNs
    xmlRelaxNGValidateFullElement
    xmlSaveTree
    xmlSchemaValidateOneElement
    xmlShellDu
    xmlShellWrite
    xmlTextReaderExpand
    xmlTextReaderNext
    xmlTextReaderNextSibling
    xmlValidateElement
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    succeed
    xmlNewTextWriter
    succeeded
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapReconcileNamespaces
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlParseBalancedChunkMemoryRecover
    xmlSchemaValueAppend
    xmlXPathCompareValues
    xmlXPathContextSetCache
    succeeds
    xmlCheckFilename
    xmlNewTextWriterPushParser
    successful
    xmlACatalogAdd
    xmlACatalogRemove
    xmlBufferAdd
    xmlBufferAddHead
    xmlBufferCCat
    xmlBufferCat
    xmlCatalogAdd
    xmlCatalogConvert
    xmlCatalogRemove
    xmlConvertSGMLCatalog
    xmlGetLineNo
    xmlListPushBack
    xmlListPushFront
    xmlSaveSetAttrEscape
    xmlSaveSetEscape
    xmlTextReaderSetParserProp
    xmlUnsetNsProp
    xmlUnsetProp
    xmlXPathSetContextNode
    successfully
    xmlTextReaderNext
    xmlTextReaderNextSibling
    xmlTextReaderRead
    succession
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    successive
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    sucessors
    xmlCheckLanguageID
    such
    xmlNewTextChild
    xmlParseEntityRef
    xmlSetProp
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    xmlXPathLangFunction
    xmlXPathNodeSetFreeNs
    xmlXPathRoundFunction
    suffix
    LIBXML_MODULE_EXTENSION
    suggested
    _htmlElemDesc
    suitable
    xmlNewIOInputStream
    xmlOutputBufferCreateFilenameFunc
    xmlParserInputBufferCreateFilenameFunc
    xmlRegexpCompile
    sum
    xmlXPathSubstringFunction
    xmlXPathSumFunction
    super
    xmlLoadSGMLSuperCatalog
    super-strict
    xmlCheckUTF8
    supplied
    xmlGetRefs
    supported
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapRemoveNode
    xmlInitCharEncodingHandlers
    xmlNanoFTPGetConnection
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlTextReaderNormalization
    supposed
    xmlIsMixedElement
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlStrcat
    xmlStrdup
    sure
    xmlDictCleanup
    xmlSaveClose
    xmlSaveFlush
    xmlURIEscape
    xmlXPathNodeSetAddUnique
    surprising
    xmlRegisterCharEncodingHandler
    surrogate
    IS_CHAR
    switch
    xmlKeepBlanksDefault
    xmlParseReference
    xmlPushInput
    symbol
    xmlModuleSymbol
    synchronizing
    xmlNewMutex
    xmlNewRMutex
    syntax
    xmlParseAttributeType
    systematically
    xmlIsID

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk29.html0000644000175000017500000003214512134171042016024 0ustar aronaron API Alphabetic Index y-z for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index y-z for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter y:

    year
    ftpListCallback
    yes
    _xmlDoc
    xmlInputMatchCallback
    xmlIsBlankNode
    xmlIsMixedElement
    xmlNodeIsText
    xmlOutputMatchCallback
    xmlParseEntityRef
    xmlParsePEReference
    xmlParseSDDecl
    xmlParserHandlePEReference
    xmlRegexpIsDeterminist
    xmlTextWriterStartDocument
    yet
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlModuleOpen
    xmlSaveDoc
    xmlSaveTree
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidateCtxt
    you
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewTextChild
    xmlSchemaGetBuiltInType
    xmlSearchNs
    your
    xmlCleanupParser
    xmlCleanupThreads

    Letter z:

    zero
    docbEncodeEntities
    docbParseChunk
    htmlCtxtReadDoc
    htmlEncodeEntities
    htmlParseChunk
    htmlReadDoc
    xmlBufferCCat
    xmlBufferCat
    xmlByteConsumed
    xmlCopyDoc
    xmlCtxtReadDoc
    xmlDocDumpMemory
    xmlHasFeature
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseChunk
    xmlReadDoc
    xmlReaderForDoc
    xmlReaderNewDoc
    xmlStrdupFunc
    xmlStrsub
    xmlXPathBooleanFunction
    xmlXPathStringFunction
    zero-based
    xmlTextReaderGetAttributeNo
    xmlTextReaderMoveToAttributeNo
    zeros
    xmlXPathStringFunction
    zlib
    _xmlDoc
    xmlC14NDocSave

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/library.html0000644000175000017500000003515412124524425015664 0ustar aronaron The parser interfaces
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    The parser interfaces

    Developer Menu
    API Indexes
    Related links

    This section is directly intended to help programmers getting bootstrapped using the XML tollkit from the C language. It is not intended to be extensive. I hope the automatically generated documents will provide the completeness required, but as a separate set of documents. The interfaces of the XML parser are by principle low level, Those interested in a higher level API should look at DOM.

    The parser interfaces for XML are separated from the HTML parser interfaces. Let's have a look at how the XML parser can be called:

    Invoking the parser : the pull method

    Usually, the first thing to do is to read an XML input. The parser accepts documents either from in-memory strings or from files. The functions are defined in "parser.h":

    xmlDocPtr xmlParseMemory(char *buffer, int size);

    Parse a null-terminated string containing the document.

    xmlDocPtr xmlParseFile(const char *filename);

    Parse an XML document contained in a (possibly compressed) file.

    The parser returns a pointer to the document structure (or NULL in case of failure).

    Invoking the parser: the push method

    In order for the application to keep the control when the document is being fetched (which is common for GUI based programs) libxml2 provides a push interface, too, as of version 1.8.3. Here are the interface functions:

    xmlParserCtxtPtr xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax,
                                             void *user_data,
                                             const char *chunk,
                                             int size,
                                             const char *filename);
    int              xmlParseChunk          (xmlParserCtxtPtr ctxt,
                                             const char *chunk,
                                             int size,
                                             int terminate);

    and here is a simple example showing how to use the interface:

                FILE *f;
    
                f = fopen(filename, "r");
                if (f != NULL) {
                    int res, size = 1024;
                    char chars[1024];
                    xmlParserCtxtPtr ctxt;
    
                    res = fread(chars, 1, 4, f);
                    if (res > 0) {
                        ctxt = xmlCreatePushParserCtxt(NULL, NULL,
                                    chars, res, filename);
                        while ((res = fread(chars, 1, size, f)) > 0) {
                            xmlParseChunk(ctxt, chars, res, 0);
                        }
                        xmlParseChunk(ctxt, chars, 0, 1);
                        doc = ctxt->myDoc;
                        xmlFreeParserCtxt(ctxt);
                    }
                }

    The HTML parser embedded into libxml2 also has a push interface; the functions are just prefixed by "html" rather than "xml".

    Invoking the parser: the SAX interface

    The tree-building interface makes the parser memory-hungry, first loading the document in memory and then building the tree itself. Reading a document without building the tree is possible using the SAX interfaces (see SAX.h and James Henstridge's documentation). Note also that the push interface can be limited to SAX: just use the two first arguments of xmlCreatePushParserCtxt().

    Building a tree from scratch

    The other way to get an XML tree in memory is by building it. Basically there is a set of functions dedicated to building new elements. (These are also described in <libxml/tree.h>.) For example, here is a piece of code that produces the XML document used in the previous examples:

        #include <libxml/tree.h>
        xmlDocPtr doc;
        xmlNodePtr tree, subtree;
    
        doc = xmlNewDoc("1.0");
        doc->children = xmlNewDocNode(doc, NULL, "EXAMPLE", NULL);
        xmlSetProp(doc->children, "prop1", "gnome is great");
        xmlSetProp(doc->children, "prop2", "& linux too");
        tree = xmlNewChild(doc->children, NULL, "head", NULL);
        subtree = xmlNewChild(tree, NULL, "title", "Welcome to Gnome");
        tree = xmlNewChild(doc->children, NULL, "chapter", NULL);
        subtree = xmlNewChild(tree, NULL, "title", "The Linux adventure");
        subtree = xmlNewChild(tree, NULL, "p", "bla bla bla ...");
        subtree = xmlNewChild(tree, NULL, "image", NULL);
        xmlSetProp(subtree, "href", "linus.gif");

    Not really rocket science ...

    Traversing the tree

    Basically by including "tree.h" your code has access to the internal structure of all the elements of the tree. The names should be somewhat simple like parent, children, next, prev, properties, etc... For example, still with the previous example:

    doc->children->children->children

    points to the title element,

    doc->children->children->next->children->children

    points to the text node containing the chapter title "The Linux adventure".

    NOTE: XML allows PIs and comments to be present before the document root, so doc->children may point to an element which is not the document Root Element; a function xmlDocGetRootElement() was added for this purpose.

    Modifying the tree

    Functions are provided for reading and writing the document content. Here is an excerpt from the tree API:

    xmlAttrPtr xmlSetProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value);

    This sets (or changes) an attribute carried by an ELEMENT node. The value can be NULL.

    const xmlChar *xmlGetProp(xmlNodePtr node, const xmlChar *name);

    This function returns a pointer to new copy of the property content. Note that the user must deallocate the result.

    Two functions are provided for reading and writing the text associated with elements:

    xmlNodePtr xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value);

    This function takes an "external" string and converts it to one text node or possibly to a list of entity and text nodes. All non-predefined entity references like &Gnome; will be stored internally as entity nodes, hence the result of the function may not be a single node.

    xmlChar *xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int inLine);

    This function is the inverse of xmlStringGetNodeList(). It generates a new string containing the content of the text and entity nodes. Note the extra argument inLine. If this argument is set to 1, the function will expand entity references. For example, instead of returning the &Gnome; XML encoding in the string, it will substitute it with its value (say, "GNU Network Object Model Environment").

    Saving a tree

    Basically 3 options are possible:

    void xmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size);

    Returns a buffer into which the document has been saved.

    extern void xmlDocDump(FILE *f, xmlDocPtr doc);

    Dumps a document to an open file descriptor.

    int xmlSaveFile(const char *filename, xmlDocPtr cur);

    Saves the document to a file. In this case, the compression interface is triggered if it has been turned on.

    Compression

    The library transparently handles compression when doing file-based accesses. The level of compression on saves can be turned on either globally or individually for one file:

    int xmlGetDocCompressMode (xmlDocPtr doc);

    Gets the document compression ratio (0-9).

    void xmlSetDocCompressMode (xmlDocPtr doc, int mode);

    Sets the document compression ratio.

    int xmlGetCompressMode(void);

    Gets the default compression ratio.

    void xmlSetCompressMode(int mode);

    Sets the default compression ratio.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/FAQ.html0000644000175000017500000005111112124524424014615 0ustar aronaron FAQ
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    FAQ

    Main Menu
    Related links

    Table of Contents:

    License(s)

    1. Licensing Terms for libxml

      libxml2 is released under the MIT License; see the file Copyright in the distribution for the precise wording

    2. Can I embed libxml2 in a proprietary application ?

      Yes. The MIT License allows you to keep proprietary the changes you made to libxml, but it would be graceful to send-back bug fixes and improvements as patches for possible incorporation in the main development tree.

    Installation

    1. Do Not Use libxml1, use libxml2
    2. Where can I get libxml ?

      The original distribution comes from xmlsoft.org or gnome.org

      Most Linux and BSD distributions include libxml, this is probably the safer way for end-users to use libxml.

      David Doolin provides precompiled Windows versions at http://www.ce.berkeley.edu/~doolin/code/libxmlwin32/

    3. I see libxml and libxml2 releases, which one should I install ?
      • If you are not constrained by backward compatibility issues with existing applications, install libxml2 only
      • If you are not doing development, you can safely install both. Usually the packages libxml and libxml2 are compatible (this is not the case for development packages).
      • If you are a developer and your system provides separate packaging for shared libraries and the development components, it is possible to install libxml and libxml2, and also libxml-devel and libxml2-devel too for libxml2 >= 2.3.0
      • If you are developing a new application, please develop against libxml2(-devel)
    4. I can't install the libxml package, it conflicts with libxml0

      You probably have an old libxml0 package used to provide the shared library for libxml.so.0, you can probably safely remove it. The libxml packages provided on xmlsoft.org provide libxml.so.0

    5. I can't install the libxml(2) RPM package due to failed dependencies

      The most generic solution is to re-fetch the latest src.rpm , and rebuild it locally with

      rpm --rebuild libxml(2)-xxx.src.rpm.

      If everything goes well it will generate two binary rpm packages (one providing the shared libs and xmllint, and the other one, the -devel package, providing includes, static libraries and scripts needed to build applications with libxml(2)) that you can install locally.

    Compilation

    1. What is the process to compile libxml2 ?

      As most UNIX libraries libxml2 follows the "standard":

      gunzip -c xxx.tar.gz | tar xvf -

      cd libxml-xxxx

      ./configure --help

      to see the options, then the compilation/installation proper

      ./configure [possible options]

      make

      make install

      At that point you may have to rerun ldconfig or a similar utility to update your list of installed shared libs.

    2. What other libraries are needed to compile/install libxml2 ?

      Libxml2 does not require any other library, the normal C ANSI API should be sufficient (please report any violation to this rule you may find).

      However if found at configuration time libxml2 will detect and use the following libs:

      • libz : a highly portable and available widely compression library.
      • iconv: a powerful character encoding conversion library. It is included by default in recent glibc libraries, so it doesn't need to be installed specifically on Linux. It now seems a part of the official UNIX specification. Here is one implementation of the library which source can be found here.
    3. Make check fails on some platforms

      Sometimes the regression tests' results don't completely match the value produced by the parser, and the makefile uses diff to print the delta. On some platforms the diff return breaks the compilation process; if the diff is small this is probably not a serious problem.

      Sometimes (especially on Solaris) make checks fail due to limitations in make. Try using GNU-make instead.

    4. I use the SVN version and there is no configure script

      The configure script (and other Makefiles) are generated. Use the autogen.sh script to regenerate the configure script and Makefiles, like:

      ./autogen.sh --prefix=/usr --disable-shared

    5. I have troubles when running make tests with gcc-3.0

      It seems the initial release of gcc-3.0 has a problem with the optimizer which miscompiles the URI module. Please use another compiler.

    Developer corner

    1. Troubles compiling or linking programs using libxml2

      Usually the problem comes from the fact that the compiler doesn't get the right compilation or linking flags. There is a small shell script xml2-config which is installed as part of libxml2 usual install process which provides those flags. Use

      xml2-config --cflags

      to get the compilation flags and

      xml2-config --libs

      to get the linker flags. Usually this is done directly from the Makefile as:

      CFLAGS=`xml2-config --cflags`

      LIBS=`xml2-config --libs`

    2. I want to install my own copy of libxml2 in my home directory and link my programs against it, but it doesn't work

      There are many different ways to accomplish this. Here is one way to do this under Linux. Suppose your home directory is /home/user. Then:

      • Create a subdirectory, let's call it myxml
      • unpack the libxml2 distribution into that subdirectory
      • chdir into the unpacked distribution (/home/user/myxml/libxml2 )
      • configure the library using the "--prefix" switch, specifying an installation subdirectory in /home/user/myxml, e.g.

        ./configure --prefix /home/user/myxml/xmlinst {other configuration options}

      • now run make followed by make install
      • At this point, the installation subdirectory contains the complete "private" include files, library files and binary program files (e.g. xmllint), located in

        /home/user/myxml/xmlinst/lib, /home/user/myxml/xmlinst/include and /home/user/myxml/xmlinst/bin

        respectively.
      • In order to use this "private" library, you should first add it to the beginning of your default PATH (so that your own private program files such as xmllint will be used instead of the normal system ones). To do this, the Bash command would be

        export PATH=/home/user/myxml/xmlinst/bin:$PATH

      • Now suppose you have a program test1.c that you would like to compile with your "private" library. Simply compile it using the command

        gcc `xml2-config --cflags --libs` -o test test.c

        Note that, because your PATH has been set with /home/user/myxml/xmlinst/bin at the beginning, the xml2-config program which you just installed will be used instead of the system default one, and this will automatically get the correct libraries linked with your program.
    3. xmlDocDump() generates output on one line.

      Libxml2 will not invent spaces in the content of a document since all spaces in the content of a document are significant. If you build a tree from the API and want indentation:

      1. the correct way is to generate those yourself too.
      2. the dangerous way is to ask libxml2 to add those blanks to your content modifying the content of your document in the process. The result may not be what you expect. There is NO way to guarantee that such a modification won't affect other parts of the content of your document. See xmlKeepBlanksDefault () and xmlSaveFormatFile ()
    4. Extra nodes in the document:

      For an XML file as below:

      <?xml version="1.0"?>
      <PLAN xmlns="http://www.argus.ca/autotest/1.0/">
      <NODE CommFlag="0"/>
      <NODE CommFlag="1"/>
      </PLAN>

      after parsing it with the function pxmlDoc=xmlParseFile(...);

      I want to the get the content of the first node (node with the CommFlag="0")

      so I did it as following;

      xmlNodePtr pnode;
      pnode=pxmlDoc->children->children;

      but it does not work. If I change it to

      pnode=pxmlDoc->children->children->next;

      then it works. Can someone explain it to me.

      In XML all characters in the content of the document are significant including blanks and formatting line breaks.

      The extra nodes you are wondering about are just that, text nodes with the formatting spaces which are part of the document but that people tend to forget. There is a function xmlKeepBlanksDefault () to remove those at parse time, but that's an heuristic, and its use should be limited to cases where you are certain there is no mixed-content in the document.

    5. I get compilation errors of existing code like when accessing root or child fields of nodes.

      You are compiling code developed for libxml version 1 and using a libxml2 development environment. Either switch back to libxml v1 devel or even better fix the code to compile with libxml2 (or both) by following the instructions.

    6. I get compilation errors about non existing xmlRootNode or xmlChildrenNode fields.

      The source code you are using has been upgraded to be able to compile with both libxml and libxml2, but you need to install a more recent version: libxml(-devel) >= 1.8.8 or libxml2(-devel) >= 2.1.0

    7. Random crashes in threaded applications

      Read and follow all advices on the thread safety page, and make 100% sure you never call xmlCleanupParser() while the library or an XML document might still be in use by another thread.

    8. The example provided in the web page does not compile.

      It's hard to maintain the documentation in sync with the code <grin/> ...

      Check the previous points 1/ and 2/ raised before, and please send patches.

    9. Where can I get more examples and information than provided on the web page?

      Ideally a libxml2 book would be nice. I have no such plan ... But you can:

      • check more deeply the existing generated doc
      • have a look at the set of examples.
      • look for examples of use for libxml2 function using the Gnome code or by asking on Google.
      • Browse the libxml2 source , I try to write code as clean and documented as possible, so looking at it may be helpful. In particular the code of xmllint.c and of the various testXXX.c test programs should provide good examples of how to do things with the library.
    10. What about C++ ?

      libxml2 is written in pure C in order to allow easy reuse on a number of platforms, including embedded systems. I don't intend to convert to C++.

      There is however a C++ wrapper which may fulfill your needs:

    11. How to validate a document a posteriori ?

      It is possible to validate documents which had not been validated at initial parsing time or documents which have been built from scratch using the API. Use the xmlValidateDtd() function. It is also possible to simply add a DTD to an existing document:

      xmlDocPtr doc; /* your existing document */
      xmlDtdPtr dtd = xmlParseDTD(NULL, filename_of_dtd); /* parse the DTD */
      
              dtd->name = xmlStrDup((xmlChar*)"root_name"); /* use the given root */
      
              doc->intSubset = dtd;
              if (doc->children == NULL) xmlAddChild((xmlNodePtr)doc, (xmlNodePtr)dtd);
              else xmlAddPrevSibling(doc->children, (xmlNodePtr)dtd);
                
    12. So what is this funky "xmlChar" used all the time?

      It is a null terminated sequence of utf-8 characters. And only utf-8! You need to convert strings encoded in different ways to utf-8 before passing them to the API. This can be accomplished with the iconv library for instance.

    13. etc ...

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/namespaces.html0000644000175000017500000002022112124524425016324 0ustar aronaron Namespaces
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Namespaces

    Main Menu
    Related links

    The libxml2 library implements XML namespaces support by recognizing namespace constructs in the input, and does namespace lookup automatically when building the DOM tree. A namespace declaration is associated with an in-memory structure and all elements or attributes within that namespace point to it. Hence testing the namespace is a simple and fast equality operation at the user level.

    I suggest that people using libxml2 use a namespace, and declare it in the root element of their document as the default namespace. Then they don't need to use the prefix in the content but we will have a basis for future semantic refinement and merging of data from different sources. This doesn't increase the size of the XML output significantly, but significantly increases its value in the long-term. Example:

    <mydoc xmlns="http://mydoc.example.org/schemas/">
       <elem1>...</elem1>
       <elem2>...</elem2>
    </mydoc>

    The namespace value has to be an absolute URL, but the URL doesn't have to point to any existing resource on the Web. It will bind all the element and attributes with that URL. I suggest to use an URL within a domain you control, and that the URL should contain some kind of version information if possible. For example, "http://www.gnome.org/gnumeric/1.0/" is a good namespace scheme.

    Then when you load a file, make sure that a namespace carrying the version-independent prefix is installed on the root element of your document, and if the version information don't match something you know, warn the user and be liberal in what you accept as the input. Also do *not* try to base namespace checking on the prefix value. <foo:text> may be exactly the same as <bar:text> in another document. What really matters is the URI associated with the element or the attribute, not the prefix string (which is just a shortcut for the full URI). In libxml, element and attributes have an ns field pointing to an xmlNs structure detailing the namespace prefix and its URI.

    @@Interfaces@@

    xmlNodePtr node;
    if(!strncmp(node->name,"mytag",5)
      && node->ns
      && !strcmp(node->ns->href,"http://www.mysite.com/myns/1.0")) {
      ...
    }

    Usually people object to using namespaces together with validity checking. I will try to make sure that using namespaces won't break validity checking, so even if you plan to use or currently are using validation I strongly suggest adding namespaces to your document. A default namespace scheme xmlns="http://...." should not break validity even on less flexible parsers. Using namespaces to mix and differentiate content coming from multiple DTDs will certainly break current validation schemes. To check such documents one needs to use schema-validation, which is supported in libxml2 as well. See relagx-ng and w3c-schema.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/Makefile.am0000644000175000017500000002454512126245407015372 0ustar aronaron## Process this file with automake to produce Makefile.in SUBDIRS = . devhelp examples # The top-level SGML file. DOC_MAIN_XML_FILE=gnome-xml.xml # The directory containing the source code (if it contains documentation). DOC_SOURCE_DIR=.. # A file in win32 depends upon one of the doc files WIN32_DIR=$(top_srcdir)/win32 PAGES= architecture.html bugs.html contribs.html docs.html DOM.html \ downloads.html entities.html example.html help.html index.html \ interface.html intro.html library.html namespaces.html news.html \ tree.html xmldtd.html XMLinfo.html XSLT.html APIPAGES=APIconstructors.html APIfiles.html APIfunctions.html \ APIsymbols.html APIchunk0.html if REBUILD_DOCS EXTRA_DIST_wc = xmlcatalog_man.xml $(wildcard tutorial/*.html) \ $(wildcard tutorial/*.c) $(wildcard tutorial/*.pdf) \ $(wildcard tutorial/images/*.png) \ $(wildcard tutorial/images/callouts/*.png) $(wildcard API*.html) \ $(wildcard *.1) $(wildcard *.xsl) $(wildcard *.html) \ $(wildcard *.gif) w3c.png $(wildcard html/*.html) \ $(wildcard html/*.png) libxml2-api.xml index.py search.php \ apibuild.py libxml2.xsa xmllint.xml xmlcatalog_man.xml \ README.docs symbols.xml endif # Expanded form of EXTRA_DIST_wc # EXTRA_DIST = \ APIchunk0.html \ APIchunk1.html \ APIchunk2.html \ APIchunk3.html \ APIchunk4.html \ APIchunk5.html \ APIchunk6.html \ APIchunk7.html \ APIchunk8.html \ APIchunk9.html \ APIchunk10.html \ APIchunk11.html \ APIchunk12.html \ APIchunk13.html \ APIchunk14.html \ APIchunk15.html \ APIchunk16.html \ APIchunk17.html \ APIchunk18.html \ APIchunk19.html \ APIchunk20.html \ APIchunk21.html \ APIchunk22.html \ APIchunk23.html \ APIchunk24.html \ APIchunk25.html \ APIchunk26.html \ APIchunk27.html \ APIchunk28.html \ APIchunk29.html \ APIconstructors.html \ APIfiles.html \ APIfunctions.html \ APIsymbols.html \ ChangeLog.xsl \ DOM.gif \ DOM.html \ FAQ.html \ Libxml2-Logo-180x168.gif \ Libxml2-Logo-90x34.gif \ README.docs \ XMLinfo.html \ XSLT.html \ api.xsl \ apibuild.py \ architecture.html \ bugs.html \ catalog.gif \ catalog.html \ checkapisym.xsl \ contribs.html \ docs.html \ downloads.html \ elfgcchack.xsl \ encoding.html \ entities.html \ example.html \ guidelines.html \ help.html \ html/book1.html \ html/home.png \ html/index.html \ html/left.png \ html/libxml-DOCBparser.html \ html/libxml-HTMLparser.html \ html/libxml-HTMLtree.html \ html/libxml-SAX.html \ html/libxml-SAX2.html \ html/libxml-c14n.html \ html/libxml-catalog.html \ html/libxml-chvalid.html \ html/libxml-debugXML.html \ html/libxml-dict.html \ html/libxml-encoding.html \ html/libxml-entities.html \ html/libxml-globals.html \ html/libxml-hash.html \ html/libxml-lib.html \ html/libxml-list.html \ html/libxml-nanoftp.html \ html/libxml-nanohttp.html \ html/libxml-parser.html \ html/libxml-parserInternals.html \ html/libxml-pattern.html \ html/libxml-relaxng.html \ html/libxml-schemasInternals.html \ html/libxml-schematron.html \ html/libxml-threads.html \ html/libxml-tree.html \ html/libxml-uri.html \ html/libxml-valid.html \ html/libxml-xinclude.html \ html/libxml-xlink.html \ html/libxml-xmlIO.html \ html/libxml-xmlautomata.html \ html/libxml-xmlerror.html \ html/libxml-xmlexports.html \ html/libxml-xmlmemory.html \ html/libxml-xmlmodule.html \ html/libxml-xmlreader.html \ html/libxml-xmlregexp.html \ html/libxml-xmlsave.html \ html/libxml-xmlschemas.html \ html/libxml-xmlschemastypes.html \ html/libxml-xmlstring.html \ html/libxml-xmlunicode.html \ html/libxml-xmlversion.html \ html/libxml-xmlwriter.html \ html/libxml-xpath.html \ html/libxml-xpathInternals.html \ html/libxml-xpointer.html \ html/libxml-xzlib.html \ html/right.png \ html/up.png \ index.html \ index.py \ interface.html \ intro.html \ library.html \ libxml.gif \ libxml2-api.xml \ libxml2.xsa \ namespaces.html \ newapi.xsl \ news.html \ news.xsl \ python.html \ redhat.gif \ search.php \ searches.html \ searches.xsl \ site.xsl \ smallfootonly.gif \ structure.gif \ symbols.xml \ syms.xsl \ threads.html \ tree.html \ tutorial/apa.html \ tutorial/apb.html \ tutorial/apc.html \ tutorial/apd.html \ tutorial/ape.html \ tutorial/apf.html \ tutorial/apg.html \ tutorial/aph.html \ tutorial/api.html \ tutorial/ar01s02.html \ tutorial/ar01s03.html \ tutorial/ar01s04.html \ tutorial/ar01s05.html \ tutorial/ar01s06.html \ tutorial/ar01s07.html \ tutorial/ar01s08.html \ tutorial/ar01s09.html \ tutorial/images/blank.png \ tutorial/images/callouts/1.png \ tutorial/images/callouts/10.png \ tutorial/images/callouts/2.png \ tutorial/images/callouts/3.png \ tutorial/images/callouts/4.png \ tutorial/images/callouts/5.png \ tutorial/images/callouts/6.png \ tutorial/images/callouts/7.png \ tutorial/images/callouts/8.png \ tutorial/images/callouts/9.png \ tutorial/images/caution.png \ tutorial/images/draft.png \ tutorial/images/home.png \ tutorial/images/important.png \ tutorial/images/next.png \ tutorial/images/note.png \ tutorial/images/prev.png \ tutorial/images/tip.png \ tutorial/images/toc-blank.png \ tutorial/images/toc-minus.png \ tutorial/images/toc-plus.png \ tutorial/images/up.png \ tutorial/images/warning.png \ tutorial/includeaddattribute.c \ tutorial/includeaddkeyword.c \ tutorial/includeconvert.c \ tutorial/includegetattribute.c \ tutorial/includekeyword.c \ tutorial/includexpath.c \ tutorial/index.html \ tutorial/ix01.html \ tutorial/xmltutorial.pdf \ upgrade.html \ w3c.png \ wiki.xsl \ xml.html \ xmlcatalog.1 \ xmlcatalog_man.html \ xmlcatalog_man.xml \ xmldtd.html \ xmlio.html \ xmllint.1 \ xmllint.html \ xmllint.xml \ xmlmem.html \ xmlreader.html \ xsa.xsl man_MANS = xmllint.1 xmlcatalog.1 if REBUILD_DOCS docs: web $(top_builddir)/NEWS libxml2.xsa $(man_MANS) api: libxml2-api.xml libxml2-refs.xml $(APIPAGES) $(srcdir)/html/index.html $(WIN32_DIR)/libxml2.def.src ../elfgcchack.h $(srcdir)/site.xsl web: $(PAGES) ../elfgcchack.h: $(srcdir)/elfgcchack.xsl $(srcdir)/libxml2-api.xml -@(if [ -x $(XSLTPROC) ] ; then \ echo "Rebuilding the elfgcchack.h header" ; \ $(XSLTPROC) --nonet $(srcdir)/elfgcchack.xsl $(srcdir)/libxml2-api.xml > elfgcchack.h ; \ if [ "`diff -q elfgcchack.h ../elfgcchack.h`" ] ; then \ echo "updating ../elfgcchack.h"; \ cp elfgcchack.h ../elfgcchack.h; \ fi ; rm -f elfgcchack.h ; fi ); $(PAGES): xml.html $(srcdir)/site.xsl -@(if [ -x $(XSLTPROC) ] ; then \ echo "Rebuilding the HTML Web pages from xml.html" ; \ $(XSLTPROC) --nonet --html --path $(srcdir) $(srcdir)/site.xsl $(srcdir)/xml.html > index.html ; fi ); -@(if [ -x $(XMLLINT) ] ; then \ echo "Validating the HTML Web pages" ; \ $(XMLLINT) --nonet --valid --noout $(PAGES) ; fi ); $(top_builddir)/NEWS: $(srcdir)/news.xsl $(srcdir)/news.html -@(if [ -x $(XSLTPROC) ] ; then \ $(XSLTPROC) --nonet $(srcdir)/news.xsl $(srcdir)/news.html > $(top_builddir)/NEWS ; fi ); libxml2.xsa: $(srcdir)/xsa.xsl $(srcdir)/news.html -@(if [ -x $(XSLTPROC) ] ; then \ echo "Rebuilding the NEWS file" ; \ $(XSLTPROC) --nonet $(srcdir)/xsa.xsl $(srcdir)/news.html > libxml2.xsa ; fi ); $(APIPAGES): libxml2-api.xml libxml2-refs.xml $(srcdir)/site.xsl $(srcdir)/api.xsl -@(if [ -x $(XSLTPROC) ] ; then \ echo "Rebuilding the HTML API pages from libxml2-refs.xml" ; \ $(XSLTPROC) --nonet --html $(srcdir)/api.xsl \ $(srcdir)/xml.html ; fi ); -@(if [ -x $(XMLLINT) ] ; then \ echo "Validating the HTML API pages" ; \ $(XMLLINT) --nonet --valid --noout API*.html ; fi ); $(srcdir)/html/index.html: libxml2-api.xml $(srcdir)/newapi.xsl -@(if [ -x $(XSLTPROC) ] ; then \ echo "Rebuilding the HTML pages from the XML API" ; \ $(XSLTPROC) --nonet $(srcdir)/newapi.xsl $(srcdir)/libxml2-api.xml ; fi ) -@(if [ -x $(XMLLINT) ] ; then \ echo "Validating the resulting XHTML pages" ; \ $(XMLLINT) --nonet --valid --noout html/*.html ; fi ); wiki: libxml2-api.xml $(srcdir)/wiki.xsl -@(if [ -x $(XSLTPROC) ] ; then \ echo "Rebuilding the wiki HTML pages from the XML API" ; \ $(XSLTPROC) --nonet $(srcdir)/wiki.xsl $(srcdir)/libxml2-api.xml; fi ) $(WIN32_DIR)/libxml2.def.src: libxml2-api.xml -@(if [ -x $(XSLTPROC) ] ; then \ $(XSLTPROC) -o $(WIN32_DIR)/libxml2.def.src \ --nonet $(WIN32_DIR)/defgen.xsl libxml2-api.xml ; fi ) source_file_deps = \ $(filter-out %/xmlversion.h, $(wildcard $(top_srcdir)/include/libxml/*.h)) \ $(top_srcdir)/include/libxml/xmlversion.h.in \ $(wildcard $(top_srcdir)/*.c) libxml2-api.xml libxml2-refs.xml ../libxml2.syms: apibuild.py symbols.xml syms.xsl checkapisym.xsl $(source_file_deps) test -f $(top_srcdir)/include/libxml/xmlversion.h (cd $(srcdir) && ./apibuild.py) ($(XSLTPROC) $(srcdir)/checkapisym.xsl $(srcdir)/libxml2-api.xml) ($(XSLTPROC) -o ../libxml2.syms $(srcdir)/syms.xsl $(srcdir)/symbols.xml) -@(cd .. ; $(MAKE) rebuild_testapi) xmllint.1: xmllint.xml -@($(XSLTPROC) --nonet xmllint.xml) xmlcatalog.1: xmlcatalog_man.xml -@($(XSLTPROC) --nonet xmlcatalog_man.xml) check-extra-dist: for f in $(EXTRA_DIST_wc) ; do echo $$f; done | sort -u >tmp.EXTRA_DIST_wc for f in $(EXTRA_DIST) ; do echo $$f; done | sort >tmp.EXTRA_DIST diff -u tmp.EXTRA_DIST_wc tmp.EXTRA_DIST rm -f tmp.EXTRA_DIST_wc tmp.EXTRA_DIST endif clean-local: rm -f *~ *.bak *.hierarchy *.signals *-unused.txt maintainer-clean-local: clean-local rm -rf libxml-decl-list.txt libxml-decl.txt rebuild: api docs install-data-local: $(MKDIR_P) $(DESTDIR)$(HTML_DIR) -$(INSTALL) -m 0644 $(srcdir)/xml.html $(srcdir)/encoding.html $(srcdir)/FAQ.html $(srcdir)/structure.gif $(srcdir)/DOM.gif $(srcdir)/smallfootonly.gif $(srcdir)/redhat.gif $(srcdir)/libxml.gif $(srcdir)/w3c.png $(srcdir)/Libxml2-Logo-180x168.gif $(srcdir)/Libxml2-Logo-90x34.gif $(DESTDIR)$(HTML_DIR) $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/html -$(INSTALL) -m 0644 $(srcdir)/html/*.html $(DESTDIR)$(HTML_DIR)/html -$(INSTALL) -m 0644 $(srcdir)/html/*.png $(DESTDIR)$(HTML_DIR)/html $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/tutorial -$(INSTALL) -m 0644 $(srcdir)/tutorial/*.* \ $(DESTDIR)$(HTML_DIR)/tutorial $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/tutorial/images -$(INSTALL) -m 0644 $(srcdir)/tutorial/images/*.* \ $(DESTDIR)$(HTML_DIR)/tutorial/images $(MKDIR_P) $(DESTDIR)$(HTML_DIR)/tutorial/images/callouts -$(INSTALL) -m 0644 $(srcdir)/tutorial/images/callouts/*.* \ $(DESTDIR)$(HTML_DIR)/tutorial/images/callouts .PHONY: docs api web wiki rebuild libxml2-2.9.1+dfsg1/doc/APIchunk9.html0000644000175000017500000007003212134171042015737 0ustar aronaron API Alphabetic Index V-X for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index V-X for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter V:

    Valid
    xmlValidateOneElement
    Validate
    XML_SCHEMAS_ANY_LAX
    xmlRelaxNGValidateDoc
    xmlRelaxNGValidateFullElement
    xmlSchemaValidateDoc
    xmlSchemaValidateOneElement
    xmlSchemaValidateStream
    xmlSchematronValidateDoc
    xmlShellValidate
    xmlValidateAttributeValue
    xmlValidateNameValue
    xmlValidateNamesValue
    xmlValidateNmtokenValue
    xmlValidateNmtokensValue
    xmlValidateNotationUse
    Validity
    xmlParseAttributeType
    Value
    xmlParseAttribute
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    xmlXPathNewValueTree
    Values
    xmlCatalogSetDefaultPrefer
    xmlParseAttribute
    xmlParseAttributeType
    xmlParseDefaultDecl
    xmlParseEnumerationType
    xmlParseNotationType
    xmlValidateAttributeValue
    Variable
    xmlXPathVariableLookup
    xmlXPathVariableLookupNS
    VariationSelectors
    xmlUCSIsVariationSelectors
    VariationSelectorsSupplement
    xmlUCSIsVariationSelectorsSupplement
    VersionInfo
    xmlParseVersionInfo
    xmlParseXMLDecl
    VersionInfo?
    xmlParseTextDecl
    VersionNum
    xmlParseVersionInfo
    xmlParseVersionNum

    Letter W:

    W3C
    xmlChildElementCount
    xmlFirstElementChild
    xmlLastElementChild
    xmlNextElementSibling
    xmlPreviousElementSibling
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    WARNING:
    xmlCleanupParser
    xmlCleanupThreads
    xmlSchemaGetCanonValue
    xmlSchemaNewStringValue
    WFC:
    xmlParseAttribute
    xmlParseCharRef
    xmlParseDefaultDecl
    xmlParseElement
    xmlParseEntityRef
    xmlParseMarkupDecl
    xmlParsePEReference
    xmlParseStartTag
    xmlParserHandlePEReference
    xmlParserHandleReference
    WWW-Authenticate
    xmlNanoHTTPAuthHeader
    WXS
    _xmlSchemaElement
    Walk
    xmlListReverseWalk
    xmlListWalk
    Warning
    xmlSaveFileTo
    xmlSaveFormatFileTo
    Was
    _xmlParserInput
    Well
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseEntity
    xmlParseInNodeContext
    xmlRecoverDoc
    xmlRecoverFile
    xmlRecoverMemory
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    What
    _xmlError
    notationDecl
    notationDeclSAXFunc
    unparsedEntityDecl
    unparsedEntityDeclSAXFunc
    xmlDOMWrapCloneNode
    xmlSAX2NotationDecl
    xmlSAX2UnparsedEntityDecl
    When
    xmlHandleEntity
    xmlXPathCompareValues
    xmlXPathIdFunction
    Wherever
    xmlCurrentChar
    Whitespace
    xmlXPathNormalizeFunction
    Will
    xmlSaveFile
    xmlSaveFormatFile
    With
    xmlParseAttribute
    xmlParseEndTag
    xmlParseStartTag
    Workaround
    xmlSchemaValidateSetFilename
    Working
    xmlParseNamespace
    Wrap
    xmlXPathWrapNodeSet
    xmlXPtrWrapLocationSet
    Wrapper
    xmlFileOpen
    Wraps
    xmlXPathWrapCString
    xmlXPathWrapExternal
    xmlXPathWrapString
    Writes
    xmlTextWriterFullEndElement

    Letter X:

    XHTML
    xmlIsXHTML
    XInclude
    LIBXML_XINCLUDE_ENABLED
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    xmlDOMWrapCloneNode
    xmlXIncludeFreeContext
    xmlXIncludeNewContext
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    xmlXIncludeSetFlags
    XInclude?
    xmlDOMWrapCloneNode
    XLINK_TYPE_NONE
    xlinkIsLink
    XML-1
    xmlDetectCharEncoding
    xmlValidateAttributeDecl
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidateRoot
    XML-Schema
    xmlSchemaGetValidErrors
    XMLDecl
    xmlParseXMLDecl
    XMLDecl?
    xmlParseDocument
    XMLSchema
    xmlSchemaGetPredefinedType
    XML_ATTRIBUTE_DECL
    _xmlAttribute
    XML_ATTRIBUTE_ENUMERATION
    xmlParseEnumeratedType
    XML_ATTRIBUTE_FIXED
    xmlParseDefaultDecl
    XML_ATTRIBUTE_IMPLIED
    xmlParseDefaultDecl
    XML_ATTRIBUTE_NODE
    _xmlAttr
    XML_ATTRIBUTE_NONE
    xmlParseDefaultDecl
    XML_ATTRIBUTE_NOTATION
    xmlParseEnumeratedType
    XML_ATTRIBUTE_REQUIRED
    xmlParseDefaultDecl
    XML_BUFFER_ALLOC_DOUBLEIT
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    XML_BUFFER_ALLOC_EXACT
    xmlGetBufferAllocationScheme
    xmlSetBufferAllocationScheme
    XML_BUFFER_ALLOC_HYBRID
    xmlGetBufferAllocationScheme
    XML_CAST_FPTR
    XML_CAST_FPTR
    XML_CATA_PREFER_PUBLIC
    xmlCatalogSetDefaultPrefer
    XML_CATA_PREFER_SYSTEM
    xmlCatalogSetDefaultPrefer
    XML_CHAR_ENCODING_
    xmlDetectCharEncoding
    xmlParseCharEncoding
    XML_CHAR_ENCODING_NONE
    xmlParseCharEncoding
    xmlParserInputBufferCreateFilename
    XML_DOCUMENT_NODE
    _xmlDoc
    XML_DTD_NODE
    _xmlDtd
    XML_ELEMENT_DECL
    _xmlElement
    XML_ELEMENT_TYPE_xxx
    xmlParseElementContentDecl
    XML_ENTITY_DECL
    _xmlEntity
    XML_ERR_OK
    xmlParseInNodeContext
    XML_PARSE_BIG_LINES
    xmlGetLineNo
    XML_PARSE_HUGE
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    XML_SCHEMAS_ELEM_GLOBAL
    XML_SCHEMAS_ELEM_TOPLEVEL
    XML_SCHEMAS_FACET_PRESERVE
    _xmlSchemaFacet
    XML_SCHEMAS_STRING
    xmlSchemaNewStringValue
    XML_SUBSTITUTE_PEREF
    xmlDecodeEntities
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    XML_SUBSTITUTE_REF
    xmlDecodeEntities
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    XML_xxx_yyy_ENTITY
    xmlAddDocEntity
    xmlAddDtdEntity
    xmlNewEntity
    XMl-Schema
    xmlSchemaGetParserErrors
    XPATH
    xmlXPathFreeCompExpr
    XPATH_INVALID_ARITY
    xmlXPathSetArityError
    XPATH_INVALID_TYPE
    xmlXPathSetTypeError
    XPointer
    LIBXML_XPTR_ENABLED
    _xmlXPathContext
    _xmlXPathParserContext
    xmlXPtrBuildNodeList
    xmlXPtrEval
    xmlXPtrEvalRangePredicate
    xmlXPtrNewContext
    xmlXPtrRangeToFunction
    XSD
    xmlAutomataNewNegTrans
    xmlSchemaValidityErrorFunc
    xmlSchemaValidityWarningFunc
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    XSLT
    _xmlNode
    _xmlXPathContext
    xmlFreePattern
    xmlFreePatternList
    xmlXPathNewValueTree
    xmlXPathStackIsNodeSet
    Xinclude
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    Xml
    xmlTextReaderNodeType
    XmlNodeType
    xmlTextReaderNodeType

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk4.html0000644000175000017500000010653412134171042015741 0ustar aronaron API Alphabetic Index J-N for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index J-N for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter J:

    Jan
    _htmlElemDesc
    Java
    xmlCheckUTF8

    Letter K:

    Kanbun
    xmlUCSIsKanbun
    KangxiRadicals
    xmlUCSIsKangxiRadicals
    Kannada
    xmlUCSIsKannada
    Katakana
    xmlUCSIsKatakana
    KatakanaPhoneticExtensions
    xmlUCSIsKatakanaPhoneticExtensions
    Khmer
    xmlUCSIsKhmer
    KhmerSymbols
    xmlUCSIsKhmerSymbols

    Letter L:

    Langcode
    xmlCheckLanguageID
    LanguageID
    xmlCheckLanguageID
    Lao
    xmlUCSIsLao
    Last
    _xmlEntity
    Latin
    UTF8Toisolat1
    isolat1ToUTF8
    Latin-1Supplement
    xmlUCSIsLatin1Supplement
    LatinExtended-A
    xmlUCSIsLatinExtendedA
    LatinExtended-B
    xmlUCSIsLatinExtendedB
    LatinExtendedAdditional
    xmlUCSIsLatinExtendedAdditional
    Legal
    xmlParseCharRef
    xmlParseDefaultDecl
    xmlValidateAttributeDecl
    Length
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemoryEnc
    Letter
    IS_LETTER
    xmlIsLetter
    xmlNamespaceParseNCName
    xmlParseName
    xmlScanName
    xmlXPathParseNCName
    xmlXPathParseName
    LetterlikeSymbols
    xmlUCSIsLetterlikeSymbols
    Like
    xmlXPathOrderDocElems
    Limbu
    xmlUCSIsLimbu
    LinearBIdeograms
    xmlUCSIsLinearBIdeograms
    LinearBSyllabary
    xmlUCSIsLinearBSyllabary
    List
    _xmlElement
    _xmlParserCtxt
    Literal
    xmlParseSystemLiteral
    Load
    xmlIOParseDTD
    xmlLoadACatalog
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlLoadExternalEntity
    xmlLoadSGMLSuperCatalog
    xmlParseDTD
    xmlSAXParseDTD
    Local
    _xmlOutputBuffer
    _xmlParserInputBuffer
    _xmlSchemaType
    LocalPart
    xmlNamespaceParseQName
    xmlSplitQName
    xmlSplitQName2
    Location
    xmlXPathEval
    xmlXPathNodeEval
    xmlXPtrEval
    xmlXPtrEvalRangePredicate
    LocationSet
    xmlXPtrFreeLocationSet
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetDel
    xmlXPtrLocationSetMerge
    xmlXPtrLocationSetRemove
    xmlXPtrNewLocationSetNodeSet
    xmlXPtrNewLocationSetNodes
    xmlXPtrWrapLocationSet
    Locator
    setDocumentLocator
    setDocumentLocatorSAXFunc
    xmlSAX2SetDocumentLocator
    Lookup
    htmlEntityLookup
    htmlEntityValueLookup
    htmlTagLookup
    xmlGetEncodingAlias
    xmlModuleSymbol
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaGetPredefinedType
    Loose
    _htmlElemDesc
    LowSurrogates
    xmlUCSIsLowSurrogates
    Lzma
    LIBXML_LZMA_ENABLED

    Letter M:

    META
    htmlSetMetaEncoding
    MODIFIER
    _htmlElemDesc
    MULT
    _xmlElementContent
    MUST
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlTextReaderNormalization
    Makes
    xmlAutomataSetFinalState
    Malayalam
    xmlUCSIsMalayalam
    Maps
    xmlChildrenNode
    xmlRootNode
    Marks
    XML_SCHEMAS_ATTRGROUP_MARKED
    XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE
    XML_SCHEMAS_TYPE_MARKED
    Markup
    xmlParseExternalSubset
    xmlParseMarkupDecl
    Match
    xmlParseElement
    MathematicalAlphanumericSymbols
    xmlUCSIsMathematicalAlphanumericSymbols
    MathematicalOperators
    xmlUCSIsMathematicalOperators
    Max
    _xmlParserCtxt
    _xmlValidCtxt
    Maximum
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_LOOKUP_LIMIT
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    May
    xmlURIEscape
    Memory
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemoryEnc
    Merge
    xmlTextMerge
    Merges
    xmlXPathNodeSetMerge
    xmlXPtrLocationSetMerge
    Meta
    htmlGetMetaEncoding
    htmlSetMetaEncoding
    Method
    xmlTextReaderGetRemainder
    Mime-Type
    xmlNanoHTTPMimeType
    Minimal
    xmlExpParse
    Misc
    xmlParseDocument
    xmlParseMisc
    MiscellaneousMathematicalSymbols-A
    xmlUCSIsMiscellaneousMathematicalSymbolsA
    MiscellaneousMathematicalSymbols-B
    xmlUCSIsMiscellaneousMathematicalSymbolsB
    MiscellaneousSymbols
    xmlUCSIsMiscellaneousSymbols
    MiscellaneousSymbolsandArrows
    xmlUCSIsMiscellaneousSymbolsandArrows
    MiscellaneousTechnical
    xmlUCSIsMiscellaneousTechnical
    Mixed
    xmlIsMixedElement
    xmlParseElementChildrenContentDecl
    xmlParseElementContentDecl
    xmlParseElementMixedContentDecl
    Mongolian
    xmlUCSIsMongolian
    More
    xmlXPathSubstringFunction
    Move
    xmlListCopy
    Moves
    xmlTextReaderMoveToAttribute
    xmlTextReaderMoveToAttributeNo
    xmlTextReaderMoveToAttributeNs
    xmlTextReaderMoveToElement
    xmlTextReaderMoveToFirstAttribute
    xmlTextReaderMoveToNextAttribute
    xmlTextReaderRead
    MusicalSymbols
    xmlUCSIsMusicalSymbols
    Myanmar
    xmlUCSIsMyanmar

    Letter N:

    NAME
    xmlParseDTD
    xmlSAXParseDTD
    NCName
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlSplitQName
    xmlSplitQName2
    xmlValidateNCName
    xmlXPathParseNCName
    NCNameChar
    xmlNamespaceParseNCName
    xmlXPathParseNCName
    NDATA
    xmlParseEntityDecl
    NDataDecl
    xmlParseEntityDecl
    NDataDecl?
    xmlParseEntityDecl
    NMTOKEN
    xmlParseAttributeType
    xmlValidateAttributeValue
    NMTOKENS
    xmlParseAttributeType
    xmlValidateAttributeValue
    NMToken
    xmlValidateNMToken
    NOTATION
    xmlParseEnumeratedType
    xmlParseNotationType
    xmlSchemaGetCanonValue
    xmlSchemaNewNOTATIONValue
    xmlValidateDtdFinal
    NOTE
    xmlBufShrink
    xmlCtxtReadFd
    xmlParseExternalID
    xmlParseNotationDecl
    xmlReadFd
    xmlReaderForFd
    xmlReaderNewFd
    NOTE:
    _xmlParserInput
    htmlSetMetaEncoding
    xmlCheckLanguageID
    xmlDOMWrapAdoptNode
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    xmlGetProp
    xmlInitCharEncodingHandlers
    xmlModuleOpen
    xmlModuleSymbol
    xmlNewChild
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewTextChild
    xmlNewTextWriter
    xmlNewTextWriterPushParser
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlParseExternalID
    xmlParsePEReference
    xmlParserHandlePEReference
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlTextReaderCurrentDoc
    NRK
    _htmlElemDesc
    NSDef
    xmlNamespaceParseNSDef
    NaN
    xmlXPathBooleanFunction
    xmlXPathIsNaN
    xmlXPathStringFunction
    NameChar
    xmlParseName
    xmlParseNmtoken
    xmlScanName
    xmlXPathParseName
    Names
    xmlParseAttributeType
    xmlParseName
    xmlScanName
    xmlValidateAttributeValue
    xmlValidateNamesValue
    Namespace
    XML_XML_NAMESPACE
    _xmlElementContent
    xmlNewGlobalNs
    xmlNewNs
    xmlXPathNodeSetFreeNs
    xmlXPtrBuildNodeList
    Nanespace
    _xmlParserCtxt
    Needed
    xmlScanName
    Nesting
    xmlParseElementChildrenContentDecl
    xmlParseElementMixedContentDecl
    xmlParseMarkupDecl
    New
    _htmlElemDesc
    Nmtoken
    xmlParseAttributeType
    xmlParseEnumerationType
    xmlParseNmtoken
    xmlValidateAttributeValue
    xmlValidateNmtokenValue
    Nmtokens
    xmlParseAttributeType
    xmlParseNmtoken
    xmlValidateAttributeValue
    xmlValidateNmtokensValue
    Node
    _xmlParserCtxt
    _xmlValidCtxt
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlXPathNewNodeSet
    NodeInfo
    _xmlParserCtxt
    NodeList
    xmlXPathNodeSetGetLength
    xmlXPathNodeSetItem
    NodePtr
    xmlXPathNewNodeSet
    xmlXPathNewValueTree
    xmlXPathWrapNodeSet
    xmlXPtrNewLocationSetNodes
    NodeSet
    xmlXPathFreeNodeSet
    xmlXPathNewNodeSet
    xmlXPathNewNodeSetList
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetAddUnique
    xmlXPathNodeSetDel
    xmlXPathNodeSetMerge
    xmlXPathNodeSetRemove
    NodeSetList
    xmlXPathFreeNodeSetList
    NodeType
    xmlXPathIsNodeType
    Nodeset
    xmlXPathNewNodeSetList
    xmlXPathWrapNodeSet
    Non-static
    xmlIOHTTPOpenW
    Normalization
    xmlNormalizeURIPath
    Normalization:
    xmlParseAttValue
    Not
    _xmlSchemaElement
    NotaNumber
    xmlXPathIsNaN
    Notation
    _xmlNotation
    xmlParseEntityDecl
    xmlParseNotationType
    xmlValidateNotationUse
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    NotationDecl
    xmlParseMarkupDecl
    xmlParseNotationDecl
    NotationType
    xmlParseEnumeratedType
    xmlParseNotationType
    Note:
    fatalErrorSAXFunc
    xmlBuildRelativeURI
    xmlCharEncodingOutputFunc
    xmlGetDtdEntity
    xmlParseAttValue
    xmlParseNotationType
    xmlRelaxNGNewDocParserCtxt
    xmlUTF8Strsub
    Number
    _xmlParserCtxt
    xmlXPathStringEvalNumber
    xmlXPathStringFunction
    NumberForms
    xmlUCSIsNumberForms

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/syms.xsl0000644000175000017500000000560612113312342015043 0ustar aronaron # # Officially exported symbols, for which header # file definitions are installed in /usr/include/libxml2 # # Automatically generated from symbols.xml and syms.xsl # # Versions here are *fixed* to match the libxml2 version # at which the symbol was introduced. This ensures that # a new client app requiring symbol foo() can't accidentally # run with old libxml2.so not providing foo() - the global # soname version info can't enforce this since we never # change the soname # LIBXML2_ { global: # } LIBXML2_ ; # ; removed in Failed to find definition in libxml2-api.xml: ; # variable # libxml2-2.9.1+dfsg1/doc/APIchunk8.html0000644000175000017500000007302112134171042015737 0ustar aronaron API Alphabetic Index T-U for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index T-U for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter T:

    TEXT
    xmlAddChild
    xmlAddChildList
    xmlAddPrevSibling
    xmlAddSibling
    xmlBufGetNodeContent
    xmlNewTextChild
    xmlNodeBufGetContent
    xmlNodeGetContent
    TEXTs
    xmlNewChild
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    TODO
    xmlParseElementChildrenContentDecl
    xmlParseSDDecl
    TODO:
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    htmlEntityLookup
    htmlEntityValueLookup
    htmlNodeDumpFileFormat
    xmlDOMWrapCloneNode
    xmlDecodeEntities
    xmlEncodeEntities
    xmlModuleOpen
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlOutputBufferCreateFilename
    xmlParseNamespace
    xmlParseQuotedString
    xmlParserHandleReference
    xmlParserInputBufferGrow
    xmlSaveDoc
    xmlSaveTree
    xmlScanName
    xmlSchemaGetCanonValue
    xmlTextWriterWriteRawLen
    xmlXPathNextAttribute
    TRUE
    xmlTextWriterStartDTDEntity
    xmlTextWriterWriteDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTDInternalEntity
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteVFormatDTDInternalEntity
    Tagalog
    xmlUCSIsTagalog
    Tagbanwa
    xmlUCSIsTagbanwa
    Tags
    xmlUCSIsTags
    TaiLe
    xmlUCSIsTaiLe
    TaiXuanJingSymbols
    xmlUCSIsTaiXuanJingSymbols
    Take
    UTF8ToHtml
    UTF8Toisolat1
    docbEncodeEntities
    htmlEncodeEntities
    isolat1ToUTF8
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    Takes
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    Tamil
    xmlUCSIsTamil
    Telugu
    xmlUCSIsTelugu
    Test
    xmlPatternMatch
    Text
    xmlNodeIsText
    xmlTextReaderReadAttributeValue
    xmlTextReaderReadString
    TextDecl
    xmlParseTextDecl
    TextDecl?
    xmlParseCtxtExternalEntity
    xmlParseEntity
    xmlParseExtParsedEnt
    xmlParseExternalEntity
    xmlSAXParseEntity
    Thaana
    xmlUCSIsThaana
    Thai
    xmlUCSIsThai
    That
    xmlAutomataNewAllTrans
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    Then
    xmlValidateOneElement
    There
    xmlExpParse
    xmlXPathContextSetCache
    Those
    _xmlParserCtxt
    Thus:
    xmlXPathSubstringFunction
    Tibetan
    xmlUCSIsTibetan
    Token
    xmlParseAttributeType
    xmlValidateAttributeValue
    xmlValidateNmtokenValue
    xmlValidateNmtokensValue
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    TokenizedType
    xmlParseAttributeType
    Traversal
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextAttribute
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    Tree
    xmlXPathNewValueTree
    Tree:-
    xmlParseNamespace
    Trickery:
    xmlScanName
    Tries
    xmlNanoFTPConnect
    xmlNanoFTPConnectTo
    xmlNanoFTPCwd
    xmlNanoFTPDele
    True
    xmlBoolToText
    Try
    xmlACatalogResolvePublic
    xmlACatalogResolveSystem
    xmlCatalogGetPublic
    xmlCatalogGetSystem
    xmlCatalogResolvePublic
    xmlCatalogResolveSystem
    xmlGetLineNo
    xmlIsXHTML
    xmlNanoFTPGetConnection
    xmlValidateAttributeDecl
    xmlValidateDocument
    xmlValidateDtd
    xmlValidateElement
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidateRoot
    Type
    _xmlSchemaType
    xmlParseAttribute
    xmlParseAttributeType
    xmlParseDocTypeDecl
    xmlParseElement
    xmlParseElementDecl
    xmlSchemaFreeType
    xmlValidateElementDecl
    xmlValidateOneAttribute
    xmlValidateOneNamespace
    xmlValidateRoot
    Types
    xmlGetBufferAllocationScheme
    xmlParseElementMixedContentDecl
    xmlSetBufferAllocationScheme
    xmlValidateElementDecl

    Letter U:

    UCS4
    xmlUTF8Charcmp
    UNICODE
    _htmlEntityDesc
    c
    UNIX
    xmlShell
    UNUSED:
    ignorableWhitespace
    ignorableWhitespaceSAXFunc
    xmlSAX2IgnorableWhitespace
    URI-reference
    xmlParseURI
    xmlParseURIRaw
    xmlParseURIReference
    URN
    globalNamespace
    namespaceDecl
    USER
    xmlNanoFTPProxy
    UTF-16
    _uconv_t
    UTF16
    xmlCharEncOutFunc
    UTF4
    xmlDetectCharEncoding
    UTF8
    _xmlBuffer
    p
    xmlCharEncOutFunc
    xmlGetUTF8Char
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlSplitQName
    xmlUTF8Charcmp
    xmlUTF8Size
    xmlUTF8Strlen
    xmlUTF8Strloc
    xmlUTF8Strndup
    xmlUTF8Strpos
    xmlUTF8Strsize
    Ugaritic
    xmlUCSIsUgaritic
    Unescaping
    xmlURIUnescapeString
    Unicode
    IS_CHAR
    LIBXML_UNICODE_ENABLED
    UnifiedCanadianAboriginalSyllabics
    xmlUCSIsUnifiedCanadianAboriginalSyllabics
    Unique
    xmlParseElementDecl
    xmlParseStartTag
    xmlValidateElementDecl
    xmlXPathIdFunction
    Unix
    xmlShellList
    Unlink
    xmlRemoveProp
    xmlReplaceNode
    xmlUnlinkNode
    Unlinks
    xmlDOMWrapRemoveNode
    Unplug
    xmlSchemaSAXUnplug
    Unregisters
    xmlCleanupEncodingAliases
    xmlDelEncodingAlias
    Update
    xmlNanoFTPUpdateURL
    Upgrade
    xmlKeepBlanksDefault
    Use
    XML_COMPLETE_ATTRS
    XML_DETECT_IDS
    _xmlDOMWrapCtxt
    _xmlParserCtxt
    xmlCopyNodeList
    xmlGetProp
    xmlIsBaseChar
    xmlIsBlank
    xmlIsChar
    xmlIsCombining
    xmlIsDigit
    xmlIsExtender
    xmlIsIdeographic
    xmlIsPubidChar
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewNodeEatName
    xmlNewPI
    xmlNewTextChild
    xmlPatternGetStreamCtxt
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetSchema
    xmlXPathContextSetCache
    Used
    XML_SCHEMAS_ANY_LAX
    XML_SCHEMAS_ANY_STRICT
    XML_SCHEMAS_ATTR_USE_PROHIBITED
    XML_SKIP_IDS
    _xmlSchemaType
    xmlCatalogGetDefaults
    xmlCatalogSetDebug
    xmlCatalogSetDefaults
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseExternalEntity
    xmlScanName
    User
    xmlSAXParseFileWithData
    xmlSAXParseMemoryWithData
    UserCode
    xmlCheckLanguageID
    Uses
    xmlNewNode
    xmlURIEscape

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/README.docs0000644000175000017500000000116411234335462015135 0ustar aronaron XML toolkit from the GNOME project Full documentation is available on-line at http://xmlsoft.org/ This code is released under the MIT Licence see the Copyright file. To report bugs, follow the instructions at: http://xmlsoft.org/bugs.html A mailing-list xml@gnome.org is available, to subscribe: http://mail.gnome.org/mailman/listinfo/xml The list archive is at: http://mail.gnome.org/archives/xml/ All technical answers asked privately will be automatically answered on the list and archived for public access unless pricacy is explicitely required and justified. Daniel Veillard $Id$ libxml2-2.9.1+dfsg1/doc/contribs.html0000644000175000017500000001677312124524424016050 0ustar aronaron Contributions
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Contributions

    Main Menu
    Related links

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/APIchunk23.html0000644000175000017500000017420012134171042016015 0ustar aronaron API Alphabetic Index q-r for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    API Alphabetic Index q-r for libxml2

    Developer Menu
    API Indexes
    Related links

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Letter q:

    qualified
    XML_SCHEMAS_QUALIF_ATTR
    XML_SCHEMAS_QUALIF_ELEM
    xmlGetDtdQAttrDesc
    xmlNamespaceParseQName
    xmlSplitQName
    xmlSplitQName2
    xmlSplitQName3
    xmlTextReaderConstName
    xmlTextReaderGetAttribute
    xmlTextReaderMoveToAttribute
    xmlTextReaderName
    xmlValidatePopElement
    xmlValidatePushElement
    xmlXPathParseNCName
    query
    _xmlURI
    quot
    xmlParseEntityRef
    xmlParseSDDecl
    xmlParserHandleReference
    quotation
    xmlTextReaderQuoteChar
    quote
    docbEncodeEntities
    htmlEncodeEntities
    xmlBufferWriteQuotedString
    xmlTextWriterSetQuoteChar
    quoted
    xmlBufferWriteQuotedString
    quotes
    xmlParseQuotedString
    quoting
    xmlTextWriterSetQuoteChar

    Letter r:

    raise
    XP_ERROR
    XP_ERROR0
    raised
    _xmlError
    xmlCheckHTTPInput
    xmlNanoFTPUpdateURL
    xmlStructuredErrorFunc
    xmlXPathCheckError
    range
    IS_BYTE_CHAR
    xmlAutomataNewCounterTrans
    xmlBufferAdd
    xmlBufferAddHead
    xmlCharInRange
    xmlExpNewRange
    xmlTextReaderNormalization
    xmlXPathNodeSetItem
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetDel
    xmlXPtrLocationSetRemove
    xmlXPtrNewCollapsedRange
    xmlXPtrNewLocationSetNodes
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints
    range-to
    xmlXPtrRangeToFunction
    ranges
    _xmlChRangeGroup
    xmlXPtrFreeLocationSet
    xmlXPtrLocationSetMerge
    rangesets
    xmlXPtrLocationSetMerge
    rather
    xmlTextReaderIsNamespaceDecl
    ratio
    xmlGetDocCompressMode
    xmlSetCompressMode
    xmlSetDocCompressMode
    ration
    xmlOutputBufferCreateFilename
    raw
    _xmlParserInputBuffer
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlParseCDSect
    xmlParserInputBufferGrow
    xmlTextWriterWriteFormatRaw
    xmlTextWriterWriteRaw
    xmlTextWriterWriteVFormatRaw
    re-entrant
    xmlLockLibrary
    xmlNewRMutex
    xmlUnlockLibrary
    reachable
    xmlPatternMaxDepth
    xmlPatternMinDepth
    reached
    xmlRegExecPushString
    xmlRegExecPushString2
    read-only
    xmlDictCreateSub
    readable
    xmlStrEqual
    reader-
    xmlTextReaderGetRemainder
    reading
    xmlSchemaValidateStream
    xmlShell
    ready
    INPUT_CHUNK
    xmlAutomataCompile
    realloc
    _xmlBuffer
    xmlGcMemGet
    xmlGcMemSetup
    xmlMemGet
    xmlMemRealloc
    xmlMemSetup
    xmlReallocFunc
    xmlReallocLoc
    reallocated
    xmlReallocFunc
    xmlStrncat
    really
    HTML_COMMENT_NODE
    HTML_ENTITY_REF_NODE
    HTML_PI_NODE
    HTML_PRESERVE_NODE
    HTML_TEXT_NODE
    htmlEntityLookup
    htmlEntityValueLookup
    xmlBuildRelativeURI
    xmlCreateEntitiesTable
    reasonable
    xmlBuildRelativeURI
    receive
    xmlExpDump
    received
    ftpDataCallback
    xmlNanoHTTPReturnCode
    receives
    xmlParseExternalID
    receiving
    characters
    ignorableWhitespace
    xmlParseExternalID
    xmlSAX2Characters
    xmlSAX2IgnorableWhitespace
    xmlValidGetValidElements
    reclaim
    xmlCleanupParser
    xmlFreeMutex
    xmlFreeRMutex
    recognized
    xmlParseCharEncoding
    recommendation
    xmlDetectCharEncoding
    recommendation:
    xmlValidateAttributeDecl
    xmlValidateElementDecl
    xmlValidateNotationDecl
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidateRoot
    recomputed
    xmlBufferAdd
    xmlBufferAddHead
    xmlDictExists
    xmlDictLookup
    reconciliate
    xmlReconciliateNs
    record
    xmlACatalogAdd
    xmlCatalogAdd
    xmlParserAddNodeInfo
    xmlParserFindNodeInfoIndex
    recover
    xmlParseBalancedChunkMemoryRecover
    recovery
    _xmlParserCtxt
    xmlSAXParseDoc
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    recurse
    xmlLoadACatalog
    xmlLoadCatalog
    xmlSearchNs
    xmlValidateRoot
    recursive
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    htmlParseElement
    xmlBufNodeDump
    xmlCopyDoc
    xmlCopyEnumeration
    xmlCopyNode
    xmlCopyNodeList
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlDocCopyNode
    xmlDocCopyNodeList
    xmlElemDump
    xmlFreeEnumeration
    xmlFreeNode
    xmlFreeNodeList
    xmlNewRMutex
    xmlNodeDump
    xmlNodeDumpOutput
    xmlParseElement
    xmlParsePEReference
    xmlParserHandlePEReference
    recursively
    xmlLoadACatalog
    xmlParseAttValue
    redeclared
    xmlReconciliateNs
    redefined
    XML_SCHEMAS_ATTRGROUP_REDEFINED
    XML_SCHEMAS_TYPE_REDEFINED
    redefinition
    xmlErrMemory
    redir
    xmlNanoHTTPMethodRedir
    redirected
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpenRedir
    xmlNanoHTTPRedir
    redirection
    xmlCheckHTTPInput
    xmlNanoHTTPRedir
    reentrant
    htmlInitAutoClose
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlFreeRMutex
    xmlInitParser
    xmlNewRMutex
    xmlRMutexLock
    xmlRMutexUnlock
    ref
    XML_SCHEMAS_ATTR_INTERNAL_RESOLVED
    XML_SCHEMAS_ELEM_INTERNAL_RESOLVED
    _xmlEntity
    xmlAddRef
    xmlFreeRefTable
    xmlNewCharRef
    referenced
    xmlLinkGetData
    xmlParseAttValue
    referencing
    xmlGetDocEntity
    xmlGetDtdEntity
    xmlGetParameterEntity
    referred
    xmlParseAttribute
    xmlParseCharRef
    refs
    _xmlDoc
    _xmlParserCtxt
    refuse
    xmlNewNs
    regex
    _xmlSchemaFacet
    regexp
    _xmlElement
    xmlAutomataCompile
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRegFreeRegexp
    xmlRegNewExecCtxt
    xmlRegexpPrint
    regexps
    xmlExpParse
    region
    xmlCheckLanguageID
    register
    xmlXPathRegisterVariableLookup
    registered
    xmlCheckLanguageID
    xmlCtxtGetLastError
    xmlCtxtResetLastError
    xmlFindCharEncodingHandler
    xmlGetCharEncodingHandler
    xmlGetLastError
    xmlPopInputCallbacks
    xmlRegisterInputCallbacks
    xmlRegisterOutputCallbacks
    xmlResetLastError
    xmlSearchNs
    xmlTextReaderGetErrorHandler
    xmlXPathRegisteredFuncsCleanup
    xmlXPathRegisteredNsCleanup
    xmlXPathRegisteredVariablesCleanup
    registers
    xmlInitCharEncodingHandlers
    xmlNewCharEncodingHandler
    registration
    XML_SKIP_IDS
    xmlOutputBufferCreateFilenameDefault
    xmlParserInputBufferCreateFilenameDefault
    xmlRegisterNodeDefault
    xmlRegisterNodeFunc
    regular
    LIBXML_REGEXP_ENABLED
    xmlRegExecCallbacks
    xmlRegFreeExecCtxt
    xmlRegNewExecCtxt
    xmlRegexpCompile
    xmlRegexpExec
    xmlRegexpIsDeterminist
    xmlRegexpPrint
    xmlTextReaderIsNamespaceDecl
    reinitialize
    xmlClearNodeInfoSeq
    xmlClearParserCtxt
    related
    LIBXML_UNICODE_ENABLED
    htmlTagLookup
    xmlCleanupParser
    xmlCleanupThreads
    xmlInitThreads
    xmlNanoHTTPClose
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    relationships
    _htmlElemDesc
    relative
    xmlBuildRelativeURI
    xmlByteConsumed
    xmlTextReaderByteConsumed
    xmlTextReaderGetAttributeNo
    xmlTextReaderMoveToAttributeNo
    xmlUTF8Strloc
    xmlUTF8Strsub
    relative-ref
    xmlParseURIRaw
    xmlParseURIReference
    relativeURI
    xmlParseURI
    release
    xmlClearNodeInfoSeq
    xmlClearParserCtxt
    xmlDecodeEntities
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlUnlockLibrary
    releases
    xmlTextReaderClose
    reliable
    xmlSaveToFilename
    rely
    xmlParseNamespace
    remainder
    xmlTextReaderGetRemainder
    remaining
    xmlCreatePushParserCtxt
    xmlValidityErrorFunc
    xmlValidityWarningFunc
    remapped
    xmlCharEncOutFunc
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    remote
    xmlNanoFTPCwd
    removal
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    remove
    xmlACatalogRemove
    xmlBufShrink
    xmlBufferShrink
    xmlCatalogRemove
    xmlDecodeEntities
    xmlDocSetRootElement
    xmlEncodeEntities
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlParseNamespace
    xmlParserInputBufferGrow
    xmlXPathNodeSetRemove
    xmlXPtrLocationSetRemove
    removed
    inputPop
    namePop
    nodePop
    valuePop
    xmlACatalogRemove
    xmlBufShrink
    xmlBufferShrink
    xmlCatalogRemove
    xmlCheckLanguageID
    xmlDOMWrapRemoveNode
    xmlFreeDocElementContent
    xmlFreeElementContent
    xmlHandleEntity
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlNewGlobalNs
    xmlParseNamespace
    xmlParseQuotedString
    xmlXPathTranslateFunction
    removes
    xmlParserInputShrink
    removing
    xmlLoadSGMLSuperCatalog
    rename
    _xmlError
    repeat
    xmlXPathAxisFunc
    repeated
    xmlExpNewRange
    repetition
    xmlExpNewRange
    replace
    XML_SCHEMAS_FACET_REPLACE
    XML_SCHEMAS_TYPE_WHITESPACE_REPLACE
    _xmlParserCtxt
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlValidGetValidElements
    replaced
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    xmlNewTextChild
    xmlSchemaSAXPlug
    xmlXPathTranslateFunction
    replacement
    xmlACatalogAdd
    xmlCatalogAdd
    xmlEntityReferenceFunc
    xmlParseAttValue
    xmlParseAttribute
    xmlParseElementChildrenContentDecl
    xmlParseMarkupDecl
    replaces
    DEBUG_MEMORY
    replacing
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlParseAttValue
    xmlValidCtxtNormalizeAttributeValue
    xmlValidNormalizeAttributeValue
    xmlXPathNormalizeFunction
    reporting
    INPUT_CHUNK
    _xmlXPathContext
    xmlSchemaValidateSetFilename
    xmlStructuredErrorFunc
    reports
    docbCreatePushParserCtxt
    htmlCreatePushParserCtxt
    xmlCleanupParser
    xmlCleanupThreads
    xmlCreatePushParserCtxt
    repr
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    representation
    _htmlElemDesc
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    representations
    xmlNewTextChild
    xmlSchemaGetCanonValue
    represented
    xmlParseCharData
    xmlXPathStringFunction
    represented:
    _htmlElemDesc
    representing
    xmlMemBlocks
    xmlMemUsed
    request
    xmlIOHTTPOpenW
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlNanoHTTPReturnCode
    requested
    xmlDOMWrapAcquireNsFunction
    xmlExternalEntityLoader
    xmlHasFeature
    xmlIsID
    xmlMallocFunc
    xmlParserInputBufferCreateFilenameFunc
    xmlReallocFunc
    requests
    xmlRegisterHTTPPostCallbacks
    required
    XML_SCHEMAS_ATTR_USE_REQUIRED
    htmlRequiredAttrs
    xmlCatalogSetDebug
    xmlSchemaCollapseString
    xmlSchemaWhiteSpaceReplace
    xmlXPathStringFunction
    requires
    _htmlElemDesc
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlRelaxNGValidatePushElement
    requred
    xmlC14NDocSave
    reserved
    xmlCheckLanguageID
    xmlNewTextChild
    xmlURIEscapeStr
    reset
    initGenericErrorDefaultFunc
    xmlBufferDetach
    xmlCtxtReadFd
    xmlNodeSetBase
    xmlNodeSetName
    xmlNodeSetSpacePreserve
    xmlReadFd
    xmlReaderForFd
    xmlReaderNewFd
    xmlSetGenericErrorFunc
    xmlSetNsProp
    xmlSetProp
    xmlSetStructuredErrorFunc
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    resides
    xmlTextReaderConstXmlLang
    xmlTextReaderXmlLang
    resize
    xmlBufferResize
    resolution
    resolveEntity
    resolveEntitySAXFunc
    xmlACatalogResolve
    xmlACatalogResolveURI
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCatalogResolve
    xmlCatalogResolveURI
    xmlCatalogSetDefaultPrefer
    xmlNoNetExternalEntityLoader
    xmlSAX2ResolveEntity
    resolveEntity
    resolveEntity
    resolveEntitySAXFunc
    resolved
    XML_SCHEMAS_ATTR_INTERNAL_RESOLVED
    XML_SCHEMAS_ELEM_INTERNAL_RESOLVED
    xmlTextReaderLookupNamespace
    resolver
    xmlGetExternalEntityLoader
    xmlSetExternalEntityLoader
    resources
    xmlClearParserCtxt
    xmlFreeMutex
    xmlFreeRMutex
    xmlFreeTextReader
    xmlFreeTextWriter
    xmlOutputBufferClose
    xmlRelaxNGFreeParserCtxt
    xmlRelaxNGFreeValidCtxt
    xmlSchemaFreeParserCtxt
    xmlSchemaFreeValidCtxt
    xmlSchematronFreeParserCtxt
    xmlSchematronFreeValidCtxt
    xmlTextReaderClose
    xmlXIncludeSetFlags
    resp
    xmlNodeSetContent
    xmlNodeSetContentLen
    respect
    xmlExpStringDerive
    respecting
    xmlValidGetValidElements
    responsability
    xmlNewEntity
    response
    xmlNanoFTPCheckResponse
    xmlNanoFTPGetResponse
    xmlNanoHTTPContentLength
    responsible
    xmlC14NDocDumpMemory
    xmlCanonicPath
    xmlPathToURI
    restored
    xmlSchemaSAXUnplug
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetStructuredErrorHandler
    xmlXPathNodeEval
    restrict
    xmlParseExternalID
    restriction
    XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION
    XML_SCHEMAS_ELEM_BLOCK_RESTRICTION
    XML_SCHEMAS_ELEM_FINAL_RESTRICTION
    XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION
    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
    XML_SCHEMAS_TYPE_FINAL_RESTRICTION
    results
    xmlXPathEqualValues
    xmlXPathNotEqualValues
    retValue
    xmlSchemaGetCanonValue
    retrieve
    xmlGetGlobalState
    xmlNanoFTPGet
    xmlNanoFTPGetSocket
    retrieved
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3
    retry
    xmlValidGetValidElements
    returning
    xmlXPathStringFunction
    reusal
    _xmlXPathContext
    reuse
    xmlReconciliateNs
    xmlRegExecPushString
    xmlRegExecPushString2
    reused
    xmlXPathContextSetCache
    reuses
    htmlCtxtReadDoc
    htmlCtxtReadFd
    htmlCtxtReadFile
    htmlCtxtReadIO
    htmlCtxtReadMemory
    xmlCtxtReadDoc
    xmlCtxtReadFd
    xmlCtxtReadFile
    xmlCtxtReadIO
    xmlCtxtReadMemory
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewFile
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlReaderNewWalker
    reusing
    xmlXIncludeProcessNode
    reverse
    xmlListReverseSearch
    xmlListReverseWalk
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    rewrite
    xmlTextReaderGetRemainder
    rfc
    xmlCheckLanguageID
    rfc-editor
    xmlCheckLanguageID
    rfc5646
    xmlCheckLanguageID
    right
    xmlAutomataNewCounterTrans
    xmlCheckFilename
    xmlCheckLanguageID
    xmlExpNewOr
    xmlExpNewSeq
    xmlParseCharData
    xmlSetListDoc
    xmlSetTreeDoc
    role
    xlinkSimpleLinkFunk
    roles
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    rollback
    xmlScanName
    root
    externalSubset
    externalSubsetSAXFunc
    internalSubset
    internalSubsetSAXFunc
    xmlDocGetRootElement
    xmlDocSetRootElement
    xmlParseDocTypeDecl
    xmlParseNamespace
    xmlPatternFromRoot
    xmlSAX2ExternalSubset
    xmlSAX2InternalSubset
    xmlShellPwd
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlValidateRoot
    xmlXPathNewValueTree
    xmlXPathRoot
    round
    xmlXPathRoundFunction
    routines
    docbSAXParseDoc
    docbSAXParseFile
    htmlSAXParseFile
    xmlGcMemSetup
    xmlMemSetup
    xmlParserHandleReference
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlSAXUserParseFile
    xmlSAXUserParseMemory
    rule
    xmlParseEntityRef
    xmlParseStartTag
    rules
    XML_CAST_FPTR
    XML_SCHEMAS_ANYATTR_STRICT
    XML_SCHEMAS_ANY_STRICT
    xmlXPathSubstringFunction
    run
    _xmlParserCtxt
    xmlByteConsumed
    running
    xmlKeepBlanksDefault
    runtime
    LIBXML_DEBUG_RUNTIME
    XML_MAX_NAMELEN
    XML_MAX_NAME_LENGTH
    xmlMemDisplayLast

    A-B C-C D-E F-I J-N O-P Q-R S-S T-U V-X Y-a b-b c-c d-d e-e f-f g-h i-i j-l m-m n-n o-o p-p q-r s-s t-t u-v w-w x-x y-z

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/search.php0000644000175000017500000004531012113312341015271 0ustar aronaron Search the documentation on XMLSoft.org
    Gnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C library for Gnome

    Search engine

    Main Menu
    API Indexes
    Related links
    Search the documentation on XMLSoft.org"; } if ($scope == NULL) $scope = "any"; $scope = ltrim ($scope); if ($scope == "") $scope = "any"; ?>

    The search service indexes the libxml2 and libxslt APIs and documentation as well as the xml@gnome.org and xslt@gnome.org mailing-list archives. To use it simply provide a set of keywords:

    $rb) ? -1 : 1; } if (($query) && (strlen($query) <= 50)) { $link = mysql_connect ("localhost", "nobody"); if (!$link) { echo "

    Could not connect to the database: ", mysql_error(); } else { mysql_select_db("xmlsoft", $link); $list = explode (" ", $query); $results = array(); $number = 0; for ($number = 0;$number < count($list);$number++) { $word = $list[$number]; if (($scope == 'any') || ($scope == 'XML') || ($scope == 'API') || ($scope == 'XMLAPI')) { list($result, $j) = queryWord($word); if ($j > 0) { for ($i = 0; $i < $j; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $type = mysql_result($result, $i, 2); $module = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); if (array_key_exists($name, $results)) { list($r,$t,$m,$d,$w,$u) = $results[$name]; $results[$name] = array(($r + $relevance) * 2, $t,$m,$d,$w,$u); } else { $id = $name; $m = strtolower($module); $url = "html/libxml-$module.html#$id"; $results[$name] = array($relevance,$type, $module, $desc, $name, $url); } } mysql_free_result($result); } } if (($scope == 'any') || ($scope == 'XSLT') || ($scope == 'API') || ($scope == 'XSLTAPI')) { list($result, $j) = XSLTqueryWord($word); if ($j > 0) { for ($i = 0; $i < $j; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $type = mysql_result($result, $i, 2); $module = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); if (array_key_exists($name, $results)) { list($r,$t,$m,$d,$w,$u) = $results[$name]; $results[$name] = array(($r + $relevance) * 2, $t,$m,$d,$w,$u); } else { $id = $name; $m = strtolower($module); $url = "XSLT/html/libxslt-$module.html#$id"; $results[$name] = array($relevance,$type, $module, $desc, $name, $url); } } mysql_free_result($result); } } if (($scope == 'any') || ($scope == 'XML') || ($scope == 'DOCS') || ($scope == 'XMLDOC')) { list($result, $k) = queryHTMLWord($word); if ($k > 0) { for ($i = 0; $i < $k; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $id = mysql_result($result, $i, 2); $module = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); if (strncmp($module, "libxml-", 7) == 0) $url = "html/$module"; if ($id != "") { $url = $url + "#$id"; } $results["$name _html_ $number _ $i"] = array($relevance, "XML docs", $module, $desc, $name, $url); } mysql_free_result($result); } } if (($scope == 'any') || ($scope == 'XSLT') || ($scope == 'DOCS') || ($scope == 'XSLTDOC')) { list($result, $k) = XSLTqueryHTMLWord($word); if ($k > 0) { for ($i = 0; $i < $k; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $id = mysql_result($result, $i, 2); $module = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); $url = "XSLT/$module"; if ($id != "") { $url = $url + "#$id"; } $results["$name xslthtml $number _ $i "] = array($relevance, "XSLT docs", $module, $desc, $name, $url); } mysql_free_result($result); } } if (($scope == 'any') || ($scope == 'XML') || ($scope == 'LISTS') || ($scope == 'XMLLIST')) { list($result, $j) = queryArchiveWord($word); if ($j > 0) { for ($i = 0; $i < $j; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $type = mysql_result($result, $i, 2); $url = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); if (array_key_exists($url, $results)) { list($r,$t,$m,$d,$w,$u) = $results[$url]; $results[$name] = array(($r + $relevance) * 2, $t,$m,$d,$w,$u); } else { $id = $name; $m = strtolower($module); $u = str_replace( "http://mail.gnome.org/archives/xml/", "", $url); $results[$url] = array($relevance,$type, $u, $desc, $name, $url); } } mysql_free_result($result); } } if (($scope == 'any') || ($scope == 'XSLT') || ($scope == 'LISTS') || ($scope == 'XSLTLIST')) { list($result, $j) = XSLTqueryArchiveWord($word); if ($j > 0) { for ($i = 0; $i < $j; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $type = mysql_result($result, $i, 2); $url = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); if (array_key_exists($url, $results)) { list($r,$t,$m,$d,$w,$u) = $results[$url]; $results[$name] = array(($r + $relevance) * 2, $t,$m,$d,$w,$u); } else { $id = $name; $m = strtolower($module); $u = str_replace( "http://mail.gnome.org/archives/xslt/", "", $url); $results[$url] = array($relevance,$type, $u, $desc, $name, $url); } } mysql_free_result($result); } } } if ((count($results) == 0) && (count($list) == 1)) { $word = $list[0]; if (($scope == 'any') || ($scope == 'XML') || ($scope == 'API') || ($scope == 'XMLAPI')) { list($result, $j) = queryWord("xml$word"); if ($j > 0) { for ($i = 0; $i < $j; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $type = mysql_result($result, $i, 2); $module = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); if (array_key_exists($name, $results)) { list($r,$t,$m,$d,$w,$u) = $results[$name]; $results[$name] = array(($r + $relevance) * 2, $t,$m,$d,$w,$u); } else { $id = $name; $m = strtolower($module); $url = "html/libxml-$module.html#$id"; $results[$name] = array($relevance,$type, $module, $desc, $name, $url); } } mysql_free_result($result); } } if (($scope == 'any') || ($scope == 'XSLT') || ($scope == 'API') || ($scope == 'XSLTAPI')) { list($result, $j) = XSLTqueryWord("xslt$word"); if ($j > 0) { for ($i = 0; $i < $j; $i++) { $relevance = mysql_result($result, $i, 0); $name = mysql_result($result, $i, 1); $type = mysql_result($result, $i, 2); $module = mysql_result($result, $i, 3); $desc = mysql_result($result, $i, 4); if (array_key_exists($name, $results)) { list($r,$t,$m,$d,$w,$u) = $results[$name]; $results[$name] = array(($r + $relevance) * 2, $t,$m,$d,$w,$u); } else { $id = $name; $m = strtolower($module); $url = "XSLT/html/libxslt-$module.html#$id"; $results[$name] = array($relevance,$type, $module, $desc, $name, $url); } } mysql_free_result($result); } } } mysql_close($link); $nb = count($results); echo "

    Found $nb results for query $query

    \n"; usort($results, "resSort"); if ($nb > 0) { printf("\n"); printf("\n"); $i = 0; while (list ($name, $val) = each ($results)) { list($r,$t,$m,$d,$s,$u) = $val; $m = str_replace("<", "<", $m); $s = str_replace("<", "<", $s); $d = str_replace("<", "<", $d); echo ""; $i = $i + 1; if ($i > 75) break; } printf("
    QualitySymbolTypemoduleDescription
    $r$s$t$m$d
    \n"); } } } ?>
    libxml2-2.9.1+dfsg1/doc/DOM.gif0000644000175000017500000000613611234335462014440 0ustar aronaronGIF89a”ñðÿÿÿ!ù,”ñþŒ©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇòL×öçúÎ÷þ ‡Ä¢ñˆL*—̦ó J§ÔªõŠÍj·Ü®÷ ‹Çä²ùŒN«×ì¶û ËçôºýŽÏGü>ø§'(Ðt8¨èUhä·(¹ÕØèc9™)UY‰à÷xøéøèx€™ ªÙÊäyúGKk‹:›*:šÈÀêJÚûSº&¬{Šª«lˆ¼Ìœ¼ð <;ÍsÌ¦Ê º›ú¼zk›\]m½7N3›Ö½.¯L¾\_Oýž<ùÝïß³bÞ ™;è€Ý¾œx!Ëʽ^ÒÄ%Ôg& EþRùÞCÈãBädÕšXÎ8ƒ¦v±SFãÀƒå•úæÈo7ñ™ W$¶ )/Ör\CaM:u©oÛN 2™á2gÑYQ–FA9µ]Ô~)sm- ’«/°Š,± £jÓasÅá·"\mcí;ÓnZ¼¶¬EÜ»£*Ê >«ç±ä¸H‹%}ÈÔ#Ô¤–[" šÈ×Ф߸-Ú˜§Ô¬ÓDn ;¶ìÙ´kÛ¾;·îݼ{ûþ <¸ðáÄ‹?Ž<9q¦Ì›;=ºôéÔ¥’©Ž=»öíÜ;÷xkú x7ãk”ç&^ÐùëÕ´¯ò õéõÄq?cý<ùþ[ô¿¾ÿ­0 !ÞQ` Æt  žð # Öa rqáj±abñá|ö‰H‚e¼`$N NHGˆtXM Ðåâ5,ÎQ#ÖÄÓŒÝ#1ô ¢YñD– Aú3"‘*È2£U+eÞr,™‹Ÿ5sËYf¶&[JDɈ™?e…ÁP„QùÙ˜ð™ É“qþu–Š!½iUžbêù B¢°&(hùÙ[Iú¹TXBñèEf%#¢:¾cä›õY’DmS“;œ–((“&¸YQ–ZÁŸT Ö%¦SšõN(Ú¦R¯yªT˜ê Ö‰%~…P«¾Jþ’¬ÈT‘«ÍHé’]EK ZùÕgœ:ÝÅž°"t¢±Ÿ8g³¬ÄšêŸ6E¤hªž9Ä‚²Ø:«jT%ø`¤å~a.Š­ ›ÙÎ Xµ|Bkí‘ «ób¾Þr8›s«•b\b+ð© k¶V8•ŒzÙD몊 ®¾<œE»÷Ãã*}¬®½…™œåÆu4ó¿€YR-=yˆ2ˆ•Îñ³¯ o7>®Ds®/¶1µ… ¶U¦NUí°“Ž‚™OÌîš8°;˜vMKÓû>©_'„1ÖŒu’–ÙQjÍ_ƒývœ.ÓòjʶÚo o«¥†±÷±y^K¯ßÈÚúAàÁ ÎàÁ^þ^oâT“™óå£ÝCOë²±£®öÀqC™(çWÈ\N²2¯p—ÌXår‹>h«ÝíÞ:~VÆá¸üðåBðJBžØã¹?ù;Æï!|—ñ<Õ?PÞõ AÈ*õ@c¨z÷g+þ Þ.Zø¸/ß8]Íß‹¾ú@R•>Öi×¥ÞYÿÉÐË «½ï"}Kûç?ý Åû·®ÀÀБ¤~0Ñ:¨«§Að€l“\0x­¶mnØë îÎuAý…Žâ 3¸§õ~`‰ Ù·½†oîP²ÞbÃñ ±„€#—ýø¡©Ðu ß sXA(¾ˆ†,Ÿþ”½~Ë…QLà¨;+ΰkatâ¢#)¦Ž€íQ¢÷`8<3Jo‚€Sc±èA1F®v’Òâ÷ÎhdzQã½ú’ùµÃ2–é‰^tÚ ˆ3CÊpf â/‰Æ:6òŽ6ëã!%´¬*ʇ›äÜ6Éž¯Äæ<‘¸¿ïpQ–=¬—#Ç©Ëašsö¬àxÖ©ÃnýŸ“¤™<þ JO9þœXŒf;õ¹Ð~Ò¢Ï!EoÉ¡î)³¢–„A7ÊP Æ~Ó´eDw‰Î{b¦¤28)KßùMì%‘‡ª,g=c QbRÁ¦U]™S¤W:­3¢Ò‘lé6ßv?žªt¥ýéDuZÕ¨îs«‡‰Y¥øPÌ4ѧÍX9 ©±–ÕÞœkC¡rU>1D"5ëZ)Vg’u•gíe]«IÕ_v…­0ýT:T¹–®…%M´³´Q I]ÚêÌc?»+ÐF¡¥)Fy9ËÁöÓ®©…g13‹:¬Âöu­-goK[åu­!,k;ú[Õv«Ïáí^GþXPI””­¬a+û̱7Y/ímr{jÝ‹6wµÎÝîa‹—æ÷“½.5—ËΤw½Ýý®¢J Òr¨ÊÍ.skÕ|N7±£Õ*y)Ç]þõU¦öM/] zN¥"¼M5¯KGi`Ã"xÂn]ðpÞ6X»øf‚3L]Ͱ!Fïi:‚¬ó£ÿÂ-G á«Wœ&±N«»á¯ZxÃ÷nSjãÅ^8»:Ö0_}»ÊKsÅKmq\J`GØ»JÖ(ˆo,b ™«R–ñç›(Ç<·›ÕË»f‹f]‘Y͹m³ƒ…ÙemÜ´aâ-âÏD«[1Ë–Íi.sŸgúþç=_® ./‡}ŒS*ϹÐ%rŽý`˹¨`vòŒsiáã Ê®K«¢5$Y بo’ ­ãÇæ2Ÿ Fò¨­|jJo™§šž§íO6Ë÷ÓÍœê‡cíkFc™ÁG~ó ¥Rç$HÅJþ§ÏëèbÓ׃۱^¨—ÜaR [ȵŽì­±KÌý&´¦‹®4°™}en[Ú /N'I¡3îüÉZÔßÕvº¹ÚmTßÛ¿Äj“7o*Ö˜6õ«õ=ë–öÛˆÿÖJ=ÌëKØØÈ6´ókÚézÝèŽx/'íŠ× ·IËMpwäùÞÄ€ƒ*i€;å–¸»³Läþ}+|Ó w²¸V÷Þœâ<·x¤ ìåš·7zÙ~öÑ[îâ—×7Î2ï¸wß]Õ²œãúöÅ¥ÝcŸù¹îÜú¹ŸÐî(ƒ}ÊÙ.Ö)ËoŸÝR÷Ú“ñ¬£|ÔN溎 øÀ×ýëû¹õpļѻ&UÉKírW×Ûí‰nzÜ›¼DSÝá{·¼))¿sÌãRówŸôÌÉþyö.~Ø“¯'é ÏvDcW?×#¡SÙø'’¢›çfç«G¿ˆÕBî=î[âãÞCÑ~¿Ë|Á9ßȰÇ{Û9F¹‡Yf“C³|Åt™í¸ôÀûñ©˜é†%,q^šÜî)KèŒþ—ßú²?ÿ± ®ög±?I½§zÞÖss,'ÄxÛÇešƒ035VWHÅG~ØwzôÇDø†€qÇ8nóHÛ‚~—'€G€ ÕG,‚H‚g¦kòWç±?ò' xp¾gPÓzãçQ=c3•±mmd1Õgz8¾¤W¸s80ºö{¨s]7€%è;t¶@ê—€í·(T÷ñ31öƒ@híÓ7ˤ‚…C…Cy5V§Ë6]h?ýEg C)E3†h~oå‚2Ø„ÛV<²)mˆBœÕ#Š.цwȆ†Ç_—vÂu¶&…1÷‚«ã„†Ve”{ÀBÆ`r™Xþt²‰KäCu#yÁ‰®ñ‰¸ŠrŠ©f¸µà¢1M’‡¤øˆGèO¨’q¹w<£ˆDx,s¨r'‰³Ø‹—’ƒü·(KÈ…Î³Šæã‹ 8‡)?ºX%¼¨‰ÆIwÑÊxicîñŒXãY\ó@ô6Œ0HáÈûÇ6ADHŒ×˜¥#9í¨bªø¦øŒÀh‹åˆmž˜ò±Èˆ1 Search statistics for 20040408
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    Search statistics for 20040408

    Main Menu
    Related links

    weekly statistics:

    416435 total words, 9875 uniq words.

    Top 50 queries:


    libxml2 11812 times.
    libxml 10170 times.
    xpath 6172 times.
    schema 5798 times.
    xmllint 5472 times.
    XML 5435 times.
    xmlParseFile 4219 times.
    php 3935 times.
    DTD 3270 times.
    encoding 3101 times.
    xmlGetProp 3084 times.
    xsltproc 3074 times.
    download 2971 times.
    xmlNodeListGetString 2917 times.
    python 2789 times.
    SAX 2621 times.
    xmlParseMemory 2472 times.
    perl 2385 times.
    iconv 2318 times.
    error 2298 times.
    html 2255 times.
    xmlChar 2136 times.
    libxslt 2055 times.
    c++ 2020 times.
    xmlNodePtr 1928 times.
    windows 1918 times.
    to 1891 times.
    node 1860 times.
    xmlFree 1854 times.
    example 1784 times.
    install 1763 times.
    parser 1715 times.
    xmlNewDoc 1695 times.
    namespace 1693 times.
    xmlStrcmp 1564 times.
    xmlnode 1558 times.
    parse 1517 times.
    memory 1484 times.
    dom 1457 times.
    XInclude 1444 times.
    entity 1423 times.
    xmlSaveFormatFile 1390 times.
    xslt 1361 times.
    attribute 1360 times.
    xmlDocPtr 1350 times.
    xsd 1319 times.
    xmlDocGetRootElement 1285 times.
    validate 1270 times.
    validation 1234 times.
    tutorial 1140 times.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/api.xsl0000644000175000017500000003712312113312340014616 0ustar aronaron

    Type :

    Letter :

    Module :

    Letter :

    Generating API Constructors List of constructors for

    Daniel Veillard

    Generating API List of synbols per file List of Symbols per Module for

    Daniel Veillard

    Generating API Functions by Type List of function manipulating types in

    Daniel Veillard

    Generating API Alphabetic list Alphabetic List of Symbols in

    Daniel Veillard

    API Alphabetic Index for

    Daniel Veillard

    Generating API Index Generating API Cross References
    libxml2-2.9.1+dfsg1/doc/index.py0000755000175000017500000010021411234335462015006 0ustar aronaron#!/usr/bin/python -u # # imports the API description and fills up a database with # name relevance to modules, functions or web pages # # Operation needed: # ================= # # install mysqld, the python wrappers for mysql and libxml2, start mysqld # Change the root passwd of mysql: # mysqladmin -u root password new_password # Create the new database xmlsoft # mysqladmin -p create xmlsoft # Create a database user 'veillard' and give him passord access # change veillard and abcde with the right user name and passwd # mysql -p # password: # mysql> GRANT ALL PRIVILEGES ON xmlsoft TO veillard@localhost # IDENTIFIED BY 'abcde' WITH GRANT OPTION; # # As the user check the access: # mysql -p xmlsoft # Enter password: # Welcome to the MySQL monitor.... # mysql> use xmlsoft # Database changed # mysql> quit # Bye # # Then run the script in the doc subdir, it will create the symbols and # word tables and populate them with informations extracted from # the libxml2-api.xml API description, and make then accessible read-only # by nobody@loaclhost the user expected to be Apache's one # # On the Apache configuration, make sure you have php support enabled # import MySQLdb import libxml2 import sys import string import os # # We are not interested in parsing errors here # def callback(ctx, str): return libxml2.registerErrorHandler(callback, None) # # The dictionnary of tables required and the SQL command needed # to create them # TABLES={ "symbols" : """CREATE TABLE symbols ( name varchar(255) BINARY NOT NULL, module varchar(255) BINARY NOT NULL, type varchar(25) NOT NULL, descr varchar(255), UNIQUE KEY name (name), KEY module (module))""", "words" : """CREATE TABLE words ( name varchar(50) BINARY NOT NULL, symbol varchar(255) BINARY NOT NULL, relevance int, KEY name (name), KEY symbol (symbol), UNIQUE KEY ID (name, symbol))""", "wordsHTML" : """CREATE TABLE wordsHTML ( name varchar(50) BINARY NOT NULL, resource varchar(255) BINARY NOT NULL, section varchar(255), id varchar(50), relevance int, KEY name (name), KEY resource (resource), UNIQUE KEY ref (name, resource))""", "wordsArchive" : """CREATE TABLE wordsArchive ( name varchar(50) BINARY NOT NULL, ID int(11) NOT NULL, relevance int, KEY name (name), UNIQUE KEY ref (name, ID))""", "pages" : """CREATE TABLE pages ( resource varchar(255) BINARY NOT NULL, title varchar(255) BINARY NOT NULL, UNIQUE KEY name (resource))""", "archives" : """CREATE TABLE archives ( ID int(11) NOT NULL auto_increment, resource varchar(255) BINARY NOT NULL, title varchar(255) BINARY NOT NULL, UNIQUE KEY id (ID,resource(255)), INDEX (ID), INDEX (resource))""", "Queries" : """CREATE TABLE Queries ( ID int(11) NOT NULL auto_increment, Value varchar(50) NOT NULL, Count int(11) NOT NULL, UNIQUE KEY id (ID,Value(35)), INDEX (ID))""", "AllQueries" : """CREATE TABLE AllQueries ( ID int(11) NOT NULL auto_increment, Value varchar(50) NOT NULL, Count int(11) NOT NULL, UNIQUE KEY id (ID,Value(35)), INDEX (ID))""", } # # The XML API description file to parse # API="libxml2-api.xml" DB=None ######################################################################### # # # MySQL database interfaces # # # ######################################################################### def createTable(db, name): global TABLES if db == None: return -1 if name == None: return -1 c = db.cursor() ret = c.execute("DROP TABLE IF EXISTS %s" % (name)) if ret == 1: print "Removed table %s" % (name) print "Creating table %s" % (name) try: ret = c.execute(TABLES[name]) except: print "Failed to create table %s" % (name) return -1 return ret def checkTables(db, verbose = 1): global TABLES if db == None: return -1 c = db.cursor() nbtables = c.execute("show tables") if verbose: print "Found %d tables" % (nbtables) tables = {} i = 0 while i < nbtables: l = c.fetchone() name = l[0] tables[name] = {} i = i + 1 for table in TABLES.keys(): if not tables.has_key(table): print "table %s missing" % (table) createTable(db, table) try: ret = c.execute("SELECT count(*) from %s" % table); row = c.fetchone() if verbose: print "Table %s contains %d records" % (table, row[0]) except: print "Troubles with table %s : repairing" % (table) ret = c.execute("repair table %s" % table); print "repairing returned %d" % (ret) ret = c.execute("SELECT count(*) from %s" % table); row = c.fetchone() print "Table %s contains %d records" % (table, row[0]) if verbose: print "checkTables finished" # make sure apache can access the tables read-only try: ret = c.execute("GRANT SELECT ON xmlsoft.* TO nobody@localhost") ret = c.execute("GRANT INSERT,SELECT,UPDATE ON xmlsoft.Queries TO nobody@localhost") except: pass return 0 def openMySQL(db="xmlsoft", passwd=None, verbose = 1): global DB if passwd == None: try: passwd = os.environ["MySQL_PASS"] except: print "No password available, set environment MySQL_PASS" sys.exit(1) DB = MySQLdb.connect(passwd=passwd, db=db) if DB == None: return -1 ret = checkTables(DB, verbose) return ret def updateWord(name, symbol, relevance): global DB if DB == None: openMySQL() if DB == None: return -1 if name == None: return -1 if symbol == None: return -1 c = DB.cursor() try: ret = c.execute( """INSERT INTO words (name, symbol, relevance) VALUES ('%s','%s', %d)""" % (name, symbol, relevance)) except: try: ret = c.execute( """UPDATE words SET relevance = %d where name = '%s' and symbol = '%s'""" % (relevance, name, symbol)) except: print "Update word (%s, %s, %s) failed command" % (name, symbol, relevance) print "UPDATE words SET relevance = %d where name = '%s' and symbol = '%s'" % (relevance, name, symbol) print sys.exc_type, sys.exc_value return -1 return ret def updateSymbol(name, module, type, desc): global DB updateWord(name, name, 50) if DB == None: openMySQL() if DB == None: return -1 if name == None: return -1 if module == None: return -1 if type == None: return -1 try: desc = string.replace(desc, "'", " ") l = string.split(desc, ".") desc = l[0] desc = desc[0:99] except: desc = "" c = DB.cursor() try: ret = c.execute( """INSERT INTO symbols (name, module, type, descr) VALUES ('%s','%s', '%s', '%s')""" % (name, module, type, desc)) except: try: ret = c.execute( """UPDATE symbols SET module='%s', type='%s', descr='%s' where name='%s'""" % (module, type, desc, name)) except: print "Update symbol (%s, %s, %s) failed command" % (name, module, type) print """UPDATE symbols SET module='%s', type='%s', descr='%s' where name='%s'""" % (module, type, desc, name) print sys.exc_type, sys.exc_value return -1 return ret def addFunction(name, module, desc = ""): return updateSymbol(name, module, 'function', desc) def addMacro(name, module, desc = ""): return updateSymbol(name, module, 'macro', desc) def addEnum(name, module, desc = ""): return updateSymbol(name, module, 'enum', desc) def addStruct(name, module, desc = ""): return updateSymbol(name, module, 'struct', desc) def addConst(name, module, desc = ""): return updateSymbol(name, module, 'const', desc) def addType(name, module, desc = ""): return updateSymbol(name, module, 'type', desc) def addFunctype(name, module, desc = ""): return updateSymbol(name, module, 'functype', desc) def addPage(resource, title): global DB if DB == None: openMySQL() if DB == None: return -1 if resource == None: return -1 c = DB.cursor() try: ret = c.execute( """INSERT INTO pages (resource, title) VALUES ('%s','%s')""" % (resource, title)) except: try: ret = c.execute( """UPDATE pages SET title='%s' WHERE resource='%s'""" % (title, resource)) except: print "Update symbol (%s, %s, %s) failed command" % (name, module, type) print """UPDATE pages SET title='%s' WHERE resource='%s'""" % (title, resource) print sys.exc_type, sys.exc_value return -1 return ret def updateWordHTML(name, resource, desc, id, relevance): global DB if DB == None: openMySQL() if DB == None: return -1 if name == None: return -1 if resource == None: return -1 if id == None: id = "" if desc == None: desc = "" else: try: desc = string.replace(desc, "'", " ") desc = desc[0:99] except: desc = "" c = DB.cursor() try: ret = c.execute( """INSERT INTO wordsHTML (name, resource, section, id, relevance) VALUES ('%s','%s', '%s', '%s', '%d')""" % (name, resource, desc, id, relevance)) except: try: ret = c.execute( """UPDATE wordsHTML SET section='%s', id='%s', relevance='%d' where name='%s' and resource='%s'""" % (desc, id, relevance, name, resource)) except: print "Update symbol (%s, %s, %d) failed command" % (name, resource, relevance) print """UPDATE wordsHTML SET section='%s', id='%s', relevance='%d' where name='%s' and resource='%s'""" % (desc, id, relevance, name, resource) print sys.exc_type, sys.exc_value return -1 return ret def checkXMLMsgArchive(url): global DB if DB == None: openMySQL() if DB == None: return -1 if url == None: return -1 c = DB.cursor() try: ret = c.execute( """SELECT ID FROM archives WHERE resource='%s'""" % (url)) row = c.fetchone() if row == None: return -1 except: return -1 return row[0] def addXMLMsgArchive(url, title): global DB if DB == None: openMySQL() if DB == None: return -1 if url == None: return -1 if title == None: title = "" else: title = string.replace(title, "'", " ") title = title[0:99] c = DB.cursor() try: cmd = """INSERT INTO archives (resource, title) VALUES ('%s','%s')""" % (url, title) ret = c.execute(cmd) cmd = """SELECT ID FROM archives WHERE resource='%s'""" % (url) ret = c.execute(cmd) row = c.fetchone() if row == None: print "addXMLMsgArchive failed to get the ID: %s" % (url) return -1 except: print "addXMLMsgArchive failed command: %s" % (cmd) return -1 return((int)(row[0])) def updateWordArchive(name, id, relevance): global DB if DB == None: openMySQL() if DB == None: return -1 if name == None: return -1 if id == None: return -1 c = DB.cursor() try: ret = c.execute( """INSERT INTO wordsArchive (name, id, relevance) VALUES ('%s', '%d', '%d')""" % (name, id, relevance)) except: try: ret = c.execute( """UPDATE wordsArchive SET relevance='%d' where name='%s' and ID='%d'""" % (relevance, name, id)) except: print "Update word archive (%s, %d, %d) failed command" % (name, id, relevance) print """UPDATE wordsArchive SET relevance='%d' where name='%s' and ID='%d'""" % (relevance, name, id) print sys.exc_type, sys.exc_value return -1 return ret ######################################################################### # # # Word dictionnary and analysis routines # # # ######################################################################### # # top 100 english word without the one len < 3 + own set # dropWords = { 'the':0, 'this':0, 'can':0, 'man':0, 'had':0, 'him':0, 'only':0, 'and':0, 'not':0, 'been':0, 'other':0, 'even':0, 'are':0, 'was':0, 'new':0, 'most':0, 'but':0, 'when':0, 'some':0, 'made':0, 'from':0, 'who':0, 'could':0, 'after':0, 'that':0, 'will':0, 'time':0, 'also':0, 'have':0, 'more':0, 'these':0, 'did':0, 'was':0, 'two':0, 'many':0, 'they':0, 'may':0, 'before':0, 'for':0, 'which':0, 'out':0, 'then':0, 'must':0, 'one':0, 'through':0, 'with':0, 'you':0, 'said':0, 'first':0, 'back':0, 'were':0, 'what':0, 'any':0, 'years':0, 'his':0, 'her':0, 'where':0, 'all':0, 'its':0, 'now':0, 'much':0, 'she':0, 'about':0, 'such':0, 'your':0, 'there':0, 'into':0, 'like':0, 'may':0, 'would':0, 'than':0, 'our':0, 'well':0, 'their':0, 'them':0, 'over':0, 'down':0, 'net':0, 'www':0, 'bad':0, 'Okay':0, 'bin':0, 'cur':0, } wordsDict = {} wordsDictHTML = {} wordsDictArchive = {} def cleanupWordsString(str): str = string.replace(str, ".", " ") str = string.replace(str, "!", " ") str = string.replace(str, "?", " ") str = string.replace(str, ",", " ") str = string.replace(str, "'", " ") str = string.replace(str, '"', " ") str = string.replace(str, ";", " ") str = string.replace(str, "(", " ") str = string.replace(str, ")", " ") str = string.replace(str, "{", " ") str = string.replace(str, "}", " ") str = string.replace(str, "<", " ") str = string.replace(str, ">", " ") str = string.replace(str, "=", " ") str = string.replace(str, "/", " ") str = string.replace(str, "*", " ") str = string.replace(str, ":", " ") str = string.replace(str, "#", " ") str = string.replace(str, "\\", " ") str = string.replace(str, "\n", " ") str = string.replace(str, "\r", " ") str = string.replace(str, "\xc2", " ") str = string.replace(str, "\xa0", " ") return str def cleanupDescrString(str): str = string.replace(str, "'", " ") str = string.replace(str, "\n", " ") str = string.replace(str, "\r", " ") str = string.replace(str, "\xc2", " ") str = string.replace(str, "\xa0", " ") l = string.split(str) str = string.join(str) return str def splitIdentifier(str): ret = [] while str != "": cur = string.lower(str[0]) str = str[1:] if ((cur < 'a') or (cur > 'z')): continue while (str != "") and (str[0] >= 'A') and (str[0] <= 'Z'): cur = cur + string.lower(str[0]) str = str[1:] while (str != "") and (str[0] >= 'a') and (str[0] <= 'z'): cur = cur + str[0] str = str[1:] while (str != "") and (str[0] >= '0') and (str[0] <= '9'): str = str[1:] ret.append(cur) return ret def addWord(word, module, symbol, relevance): global wordsDict if word == None or len(word) < 3: return -1 if module == None or symbol == None: return -1 if dropWords.has_key(word): return 0 if ord(word[0]) > 0x80: return 0 if wordsDict.has_key(word): d = wordsDict[word] if d == None: return 0 if len(d) > 500: wordsDict[word] = None return 0 try: relevance = relevance + d[(module, symbol)] except: pass else: wordsDict[word] = {} wordsDict[word][(module, symbol)] = relevance return relevance def addString(str, module, symbol, relevance): if str == None or len(str) < 3: return -1 ret = 0 str = cleanupWordsString(str) l = string.split(str) for word in l: if len(word) > 2: ret = ret + addWord(word, module, symbol, 5) return ret def addWordHTML(word, resource, id, section, relevance): global wordsDictHTML if word == None or len(word) < 3: return -1 if resource == None or section == None: return -1 if dropWords.has_key(word): return 0 if ord(word[0]) > 0x80: return 0 section = cleanupDescrString(section) if wordsDictHTML.has_key(word): d = wordsDictHTML[word] if d == None: print "skipped %s" % (word) return 0 try: (r,i,s) = d[resource] if i != None: id = i if s != None: section = s relevance = relevance + r except: pass else: wordsDictHTML[word] = {} d = wordsDictHTML[word]; d[resource] = (relevance, id, section) return relevance def addStringHTML(str, resource, id, section, relevance): if str == None or len(str) < 3: return -1 ret = 0 str = cleanupWordsString(str) l = string.split(str) for word in l: if len(word) > 2: try: r = addWordHTML(word, resource, id, section, relevance) if r < 0: print "addWordHTML failed: %s %s" % (word, resource) ret = ret + r except: print "addWordHTML failed: %s %s %d" % (word, resource, relevance) print sys.exc_type, sys.exc_value return ret def addWordArchive(word, id, relevance): global wordsDictArchive if word == None or len(word) < 3: return -1 if id == None or id == -1: return -1 if dropWords.has_key(word): return 0 if ord(word[0]) > 0x80: return 0 if wordsDictArchive.has_key(word): d = wordsDictArchive[word] if d == None: print "skipped %s" % (word) return 0 try: r = d[id] relevance = relevance + r except: pass else: wordsDictArchive[word] = {} d = wordsDictArchive[word]; d[id] = relevance return relevance def addStringArchive(str, id, relevance): if str == None or len(str) < 3: return -1 ret = 0 str = cleanupWordsString(str) l = string.split(str) for word in l: i = len(word) if i > 2: try: r = addWordArchive(word, id, relevance) if r < 0: print "addWordArchive failed: %s %s" % (word, id) else: ret = ret + r except: print "addWordArchive failed: %s %s %d" % (word, id, relevance) print sys.exc_type, sys.exc_value return ret ######################################################################### # # # XML API description analysis # # # ######################################################################### def loadAPI(filename): doc = libxml2.parseFile(filename) print "loaded %s" % (filename) return doc def foundExport(file, symbol): if file == None: return 0 if symbol == None: return 0 addFunction(symbol, file) l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) return 1 def analyzeAPIFile(top): count = 0 name = top.prop("name") cur = top.children while cur != None: if cur.type == 'text': cur = cur.next continue if cur.name == "exports": count = count + foundExport(name, cur.prop("symbol")) else: print "unexpected element %s in API doc " % (name) cur = cur.next return count def analyzeAPIFiles(top): count = 0 cur = top.children while cur != None: if cur.type == 'text': cur = cur.next continue if cur.name == "file": count = count + analyzeAPIFile(cur) else: print "unexpected element %s in API doc " % (cur.name) cur = cur.next return count def analyzeAPIEnum(top): file = top.prop("file") if file == None: return 0 symbol = top.prop("name") if symbol == None: return 0 addEnum(symbol, file) l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) return 1 def analyzeAPIConst(top): file = top.prop("file") if file == None: return 0 symbol = top.prop("name") if symbol == None: return 0 addConst(symbol, file) l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) return 1 def analyzeAPIType(top): file = top.prop("file") if file == None: return 0 symbol = top.prop("name") if symbol == None: return 0 addType(symbol, file) l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) return 1 def analyzeAPIFunctype(top): file = top.prop("file") if file == None: return 0 symbol = top.prop("name") if symbol == None: return 0 addFunctype(symbol, file) l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) return 1 def analyzeAPIStruct(top): file = top.prop("file") if file == None: return 0 symbol = top.prop("name") if symbol == None: return 0 addStruct(symbol, file) l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) info = top.prop("info") if info != None: info = string.replace(info, "'", " ") info = string.strip(info) l = string.split(info) for word in l: if len(word) > 2: addWord(word, file, symbol, 5) return 1 def analyzeAPIMacro(top): file = top.prop("file") if file == None: return 0 symbol = top.prop("name") if symbol == None: return 0 symbol = string.replace(symbol, "'", " ") symbol = string.strip(symbol) info = None cur = top.children while cur != None: if cur.type == 'text': cur = cur.next continue if cur.name == "info": info = cur.content break cur = cur.next l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) if info == None: addMacro(symbol, file) print "Macro %s description has no " % (symbol) return 0 info = string.replace(info, "'", " ") info = string.strip(info) addMacro(symbol, file, info) l = string.split(info) for word in l: if len(word) > 2: addWord(word, file, symbol, 5) return 1 def analyzeAPIFunction(top): file = top.prop("file") if file == None: return 0 symbol = top.prop("name") if symbol == None: return 0 symbol = string.replace(symbol, "'", " ") symbol = string.strip(symbol) info = None cur = top.children while cur != None: if cur.type == 'text': cur = cur.next continue if cur.name == "info": info = cur.content elif cur.name == "return": rinfo = cur.prop("info") if rinfo != None: rinfo = string.replace(rinfo, "'", " ") rinfo = string.strip(rinfo) addString(rinfo, file, symbol, 7) elif cur.name == "arg": ainfo = cur.prop("info") if ainfo != None: ainfo = string.replace(ainfo, "'", " ") ainfo = string.strip(ainfo) addString(ainfo, file, symbol, 5) name = cur.prop("name") if name != None: name = string.replace(name, "'", " ") name = string.strip(name) addWord(name, file, symbol, 7) cur = cur.next if info == None: print "Function %s description has no " % (symbol) addFunction(symbol, file, "") else: info = string.replace(info, "'", " ") info = string.strip(info) addFunction(symbol, file, info) addString(info, file, symbol, 5) l = splitIdentifier(symbol) for word in l: addWord(word, file, symbol, 10) return 1 def analyzeAPISymbols(top): count = 0 cur = top.children while cur != None: if cur.type == 'text': cur = cur.next continue if cur.name == "macro": count = count + analyzeAPIMacro(cur) elif cur.name == "function": count = count + analyzeAPIFunction(cur) elif cur.name == "const": count = count + analyzeAPIConst(cur) elif cur.name == "typedef": count = count + analyzeAPIType(cur) elif cur.name == "struct": count = count + analyzeAPIStruct(cur) elif cur.name == "enum": count = count + analyzeAPIEnum(cur) elif cur.name == "functype": count = count + analyzeAPIFunctype(cur) else: print "unexpected element %s in API doc " % (cur.name) cur = cur.next return count def analyzeAPI(doc): count = 0 if doc == None: return -1 root = doc.getRootElement() if root.name != "api": print "Unexpected root name" return -1 cur = root.children while cur != None: if cur.type == 'text': cur = cur.next continue if cur.name == "files": pass # count = count + analyzeAPIFiles(cur) elif cur.name == "symbols": count = count + analyzeAPISymbols(cur) else: print "unexpected element %s in API doc" % (cur.name) cur = cur.next return count ######################################################################### # # # Web pages parsing and analysis # # # ######################################################################### import glob def analyzeHTMLText(doc, resource, p, section, id): words = 0 try: content = p.content words = words + addStringHTML(content, resource, id, section, 5) except: return -1 return words def analyzeHTMLPara(doc, resource, p, section, id): words = 0 try: content = p.content words = words + addStringHTML(content, resource, id, section, 5) except: return -1 return words def analyzeHTMLPre(doc, resource, p, section, id): words = 0 try: content = p.content words = words + addStringHTML(content, resource, id, section, 5) except: return -1 return words def analyzeHTML(doc, resource, p, section, id): words = 0 try: content = p.content words = words + addStringHTML(content, resource, id, section, 5) except: return -1 return words def analyzeHTML(doc, resource): para = 0; ctxt = doc.xpathNewContext() try: res = ctxt.xpathEval("//head/title") title = res[0].content except: title = "Page %s" % (resource) addPage(resource, title) try: items = ctxt.xpathEval("//h1 | //h2 | //h3 | //text()") section = title id = "" for item in items: if item.name == 'h1' or item.name == 'h2' or item.name == 'h3': section = item.content if item.prop("id"): id = item.prop("id") elif item.prop("name"): id = item.prop("name") elif item.type == 'text': analyzeHTMLText(doc, resource, item, section, id) para = para + 1 elif item.name == 'p': analyzeHTMLPara(doc, resource, item, section, id) para = para + 1 elif item.name == 'pre': analyzeHTMLPre(doc, resource, item, section, id) para = para + 1 else: print "Page %s, unexpected %s element" % (resource, item.name) except: print "Page %s: problem analyzing" % (resource) print sys.exc_type, sys.exc_value return para def analyzeHTMLPages(): ret = 0 HTMLfiles = glob.glob("*.html") + glob.glob("tutorial/*.html") for html in HTMLfiles: if html[0:3] == "API": continue if html == "xml.html": continue try: doc = libxml2.parseFile(html) except: doc = libxml2.htmlParseFile(html, None) try: res = analyzeHTML(doc, html) print "Parsed %s : %d paragraphs" % (html, res) ret = ret + 1 except: print "could not parse %s" % (html) return ret ######################################################################### # # # Mail archives parsing and analysis # # # ######################################################################### import time def getXMLDateArchive(t = None): if t == None: t = time.time() T = time.gmtime(t) month = time.strftime("%B", T) year = T[0] url = "http://mail.gnome.org/archives/xml/%d-%s/date.html" % (year, month) return url def scanXMLMsgArchive(url, title, force = 0): if url == None or title == None: return 0 ID = checkXMLMsgArchive(url) if force == 0 and ID != -1: return 0 if ID == -1: ID = addXMLMsgArchive(url, title) if ID == -1: return 0 try: print "Loading %s" % (url) doc = libxml2.htmlParseFile(url, None); except: doc = None if doc == None: print "Failed to parse %s" % (url) return 0 addStringArchive(title, ID, 20) ctxt = doc.xpathNewContext() texts = ctxt.xpathEval("//pre//text()") for text in texts: addStringArchive(text.content, ID, 5) return 1 def scanXMLDateArchive(t = None, force = 0): global wordsDictArchive wordsDictArchive = {} url = getXMLDateArchive(t) print "loading %s" % (url) try: doc = libxml2.htmlParseFile(url, None); except: doc = None if doc == None: print "Failed to parse %s" % (url) return -1 ctxt = doc.xpathNewContext() anchors = ctxt.xpathEval("//a[@href]") links = 0 newmsg = 0 for anchor in anchors: href = anchor.prop("href") if href == None or href[0:3] != "msg": continue try: links = links + 1 msg = libxml2.buildURI(href, url) title = anchor.content if title != None and title[0:4] == 'Re: ': title = title[4:] if title != None and title[0:6] == '[xml] ': title = title[6:] newmsg = newmsg + scanXMLMsgArchive(msg, title, force) except: pass return newmsg ######################################################################### # # # Main code: open the DB, the API XML and analyze it # # # ######################################################################### def analyzeArchives(t = None, force = 0): global wordsDictArchive ret = scanXMLDateArchive(t, force) print "Indexed %d words in %d archive pages" % (len(wordsDictArchive), ret) i = 0 skipped = 0 for word in wordsDictArchive.keys(): refs = wordsDictArchive[word] if refs == None: skipped = skipped + 1 continue; for id in refs.keys(): relevance = refs[id] updateWordArchive(word, id, relevance) i = i + 1 print "Found %d associations in HTML pages" % (i) def analyzeHTMLTop(): global wordsDictHTML ret = analyzeHTMLPages() print "Indexed %d words in %d HTML pages" % (len(wordsDictHTML), ret) i = 0 skipped = 0 for word in wordsDictHTML.keys(): refs = wordsDictHTML[word] if refs == None: skipped = skipped + 1 continue; for resource in refs.keys(): (relevance, id, section) = refs[resource] updateWordHTML(word, resource, section, id, relevance) i = i + 1 print "Found %d associations in HTML pages" % (i) def analyzeAPITop(): global wordsDict global API try: doc = loadAPI(API) ret = analyzeAPI(doc) print "Analyzed %d blocs" % (ret) doc.freeDoc() except: print "Failed to parse and analyze %s" % (API) print sys.exc_type, sys.exc_value sys.exit(1) print "Indexed %d words" % (len(wordsDict)) i = 0 skipped = 0 for word in wordsDict.keys(): refs = wordsDict[word] if refs == None: skipped = skipped + 1 continue; for (module, symbol) in refs.keys(): updateWord(word, symbol, refs[(module, symbol)]) i = i + 1 print "Found %d associations, skipped %d words" % (i, skipped) def usage(): print "Usage index.py [--force] [--archive] [--archive-year year] [--archive-month month] [--API] [--docs]" sys.exit(1) def main(): try: openMySQL() except: print "Failed to open the database" print sys.exc_type, sys.exc_value sys.exit(1) args = sys.argv[1:] force = 0 if args: i = 0 while i < len(args): if args[i] == '--force': force = 1 elif args[i] == '--archive': analyzeArchives(None, force) elif args[i] == '--archive-year': i = i + 1; year = args[i] months = ["January" , "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; for month in months: try: str = "%s-%s" % (year, month) T = time.strptime(str, "%Y-%B") t = time.mktime(T) + 3600 * 24 * 10; analyzeArchives(t, force) except: print "Failed to index month archive:" print sys.exc_type, sys.exc_value elif args[i] == '--archive-month': i = i + 1; month = args[i] try: T = time.strptime(month, "%Y-%B") t = time.mktime(T) + 3600 * 24 * 10; analyzeArchives(t, force) except: print "Failed to index month archive:" print sys.exc_type, sys.exc_value elif args[i] == '--API': analyzeAPITop() elif args[i] == '--docs': analyzeHTMLTop() else: usage() i = i + 1 else: usage() if __name__ == "__main__": main() libxml2-2.9.1+dfsg1/doc/XSLT.html0000644000175000017500000001321712124524424015005 0ustar aronaron XSLT
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    XSLT

    Main Menu
    Related links

    Check the separate libxslt page

    XSL Transformations, is a language for transforming XML documents into other XML documents (or HTML/textual output).

    A separate library called libxslt is available implementing XSLT-1.0 for libxml2. This module "libxslt" too can be found in the Gnome SVN base.

    You can check the progresses on the libxslt Changelog.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/downloads.html0000644000175000017500000002010412124524424016176 0ustar aronaron Downloads
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Downloads

    Main Menu
    Related links

    The latest versions of libxml2 can be found on the xmlsoft.org server ( FTP and rsync are available), there are also mirrors (France and Antonin Sprinzl also provide a mirror in Austria). (NOTE that you need both the libxml(2) and libxml(2)-devel packages installed to compile applications using libxml if using RPMs.)

    You can find all the history of libxml(2) and libxslt releases in the old directory. The precompiled Windows binaries made by Igor Zlatovic are available in the win32 directory.

    Binary ports:

    If you know other supported binary ports, please contact me.

    Snapshot:

    Contributions:

    I do accept external contributions, especially if compiling on another platform, get in touch with the list to upload the package, wrappers for various languages have been provided, and can be found in the bindings section

    Libxml2 is also available from GIT:

    • See libxml2 Git web. To checkout a local tree use:

      git clone git://git.gnome.org/libxml2
    • The libxslt module is also present there.

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/searches.xsl0000644000175000017500000000716312113312341015644 0ustar aronaron

    weekly statistics:

    total words, uniq words.

    Top queries:


    times.
    Search statistics for

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/news.xsl0000644000175000017500000000207412113312341015017 0ustar aronaron NEWS file for libxml2 Note that this is automatically generated from the news webpage at: http://xmlsoft.org/news.html : - at libxml2-2.9.1+dfsg1/doc/APIfiles.html0000644000175000017500000120105512134171042015642 0ustar aronaron List of Symbols per Module for libxml2
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    List of Symbols per Module for libxml2

    Developer Menu
    API Indexes
    Related links

    Module DOCBparser:

    docbCreateFileParserCtxt
    docbCreatePushParserCtxt
    docbDocPtr
    docbEncodeEntities
    docbFreeParserCtxt
    docbParseChunk
    docbParseDoc
    docbParseDocument
    docbParseFile
    docbParserCtxt
    docbParserCtxtPtr
    docbParserInput
    docbParserInputPtr
    docbSAXHandler
    docbSAXHandlerPtr
    docbSAXParseDoc
    docbSAXParseFile

    Module HTMLparser:

    HTML_DEPRECATED
    HTML_INVALID
    HTML_NA
    HTML_PARSE_COMPACT
    HTML_PARSE_IGNORE_ENC
    HTML_PARSE_NOBLANKS
    HTML_PARSE_NODEFDTD
    HTML_PARSE_NOERROR
    HTML_PARSE_NOIMPLIED
    HTML_PARSE_NONET
    HTML_PARSE_NOWARNING
    HTML_PARSE_PEDANTIC
    HTML_PARSE_RECOVER
    HTML_REQUIRED
    HTML_VALID
    UTF8ToHtml
    _htmlElemDesc
    _htmlEntityDesc
    htmlAttrAllowed
    htmlAutoCloseTag
    htmlCreateMemoryParserCtxt
    htmlCreatePushParserCtxt
    htmlCtxtReadDoc
    htmlCtxtReadFd
    htmlCtxtReadFile
    htmlCtxtReadIO
    htmlCtxtReadMemory
    htmlCtxtReset
    htmlCtxtUseOptions
    htmlDefaultSubelement
    htmlDocPtr
    htmlElemDesc
    htmlElemDescPtr
    htmlElementAllowedHere
    htmlElementAllowedHereDesc
    htmlElementStatusHere
    htmlEncodeEntities
    htmlEntityDesc
    htmlEntityDescPtr
    htmlEntityLookup
    htmlEntityValueLookup
    htmlFreeParserCtxt
    htmlHandleOmittedElem
    htmlIsAutoClosed
    htmlIsScriptAttribute
    htmlNewParserCtxt
    htmlNodePtr
    htmlNodeStatus
    htmlParseCharRef
    htmlParseChunk
    htmlParseDoc
    htmlParseDocument
    htmlParseElement
    htmlParseEntityRef
    htmlParseFile
    htmlParserCtxt
    htmlParserCtxtPtr
    htmlParserInput
    htmlParserInputPtr
    htmlParserNodeInfo
    htmlParserOption
    htmlReadDoc
    htmlReadFd
    htmlReadFile
    htmlReadIO
    htmlReadMemory
    htmlRequiredAttrs
    htmlSAXHandler
    htmlSAXHandlerPtr
    htmlSAXParseDoc
    htmlSAXParseFile
    htmlStatus
    htmlTagLookup

    Module HTMLtree:

    HTML_COMMENT_NODE
    HTML_ENTITY_REF_NODE
    HTML_PI_NODE
    HTML_PRESERVE_NODE
    HTML_TEXT_NODE
    htmlDocContentDumpFormatOutput
    htmlDocContentDumpOutput
    htmlDocDump
    htmlDocDumpMemory
    htmlDocDumpMemoryFormat
    htmlGetMetaEncoding
    htmlIsBooleanAttr
    htmlNewDoc
    htmlNewDocNoDtD
    htmlNodeDump
    htmlNodeDumpFile
    htmlNodeDumpFileFormat
    htmlNodeDumpFormatOutput
    htmlNodeDumpOutput
    htmlSaveFile
    htmlSaveFileEnc
    htmlSaveFileFormat
    htmlSetMetaEncoding

    Module SAX:

    attribute
    attributeDecl
    cdataBlock
    characters
    checkNamespace
    comment
    elementDecl
    endDocument
    endElement
    entityDecl
    externalSubset
    getColumnNumber
    getEntity
    getLineNumber
    getNamespace
    getParameterEntity
    getPublicId
    getSystemId
    globalNamespace
    hasExternalSubset
    hasInternalSubset
    ignorableWhitespace
    initdocbDefaultSAXHandler
    inithtmlDefaultSAXHandler
    initxmlDefaultSAXHandler
    internalSubset
    isStandalone
    namespaceDecl
    notationDecl
    processingInstruction
    reference
    resolveEntity
    setDocumentLocator
    setNamespace
    startDocument
    startElement
    unparsedEntityDecl

    Module SAX2:

    docbDefaultSAXHandlerInit
    htmlDefaultSAXHandlerInit
    xmlDefaultSAXHandlerInit
    xmlSAX2AttributeDecl
    xmlSAX2CDataBlock
    xmlSAX2Characters
    xmlSAX2Comment
    xmlSAX2ElementDecl
    xmlSAX2EndDocument
    xmlSAX2EndElement
    xmlSAX2EndElementNs
    xmlSAX2EntityDecl
    xmlSAX2ExternalSubset
    xmlSAX2GetColumnNumber
    xmlSAX2GetEntity
    xmlSAX2GetLineNumber
    xmlSAX2GetParameterEntity
    xmlSAX2GetPublicId
    xmlSAX2GetSystemId
    xmlSAX2HasExternalSubset
    xmlSAX2HasInternalSubset
    xmlSAX2IgnorableWhitespace
    xmlSAX2InitDefaultSAXHandler
    xmlSAX2InitDocbDefaultSAXHandler
    xmlSAX2InitHtmlDefaultSAXHandler
    xmlSAX2InternalSubset
    xmlSAX2IsStandalone
    xmlSAX2NotationDecl
    xmlSAX2ProcessingInstruction
    xmlSAX2Reference
    xmlSAX2ResolveEntity
    xmlSAX2SetDocumentLocator
    xmlSAX2StartDocument
    xmlSAX2StartElement
    xmlSAX2StartElementNs
    xmlSAX2UnparsedEntityDecl
    xmlSAXDefaultVersion
    xmlSAXVersion

    Module c14n:

    XML_C14N_1_0
    XML_C14N_1_1
    XML_C14N_EXCLUSIVE_1_0
    xmlC14NDocDumpMemory
    xmlC14NDocSave
    xmlC14NDocSaveTo
    xmlC14NExecute
    xmlC14NIsVisibleCallback
    xmlC14NMode

    Module catalog:

    XML_CATALOGS_NAMESPACE
    XML_CATALOG_PI
    XML_CATA_ALLOW_ALL
    XML_CATA_ALLOW_DOCUMENT
    XML_CATA_ALLOW_GLOBAL
    XML_CATA_ALLOW_NONE
    XML_CATA_PREFER_NONE
    XML_CATA_PREFER_PUBLIC
    XML_CATA_PREFER_SYSTEM
    xmlACatalogAdd
    xmlACatalogDump
    xmlACatalogRemove
    xmlACatalogResolve
    xmlACatalogResolvePublic
    xmlACatalogResolveSystem
    xmlACatalogResolveURI
    xmlCatalog
    xmlCatalogAdd
    xmlCatalogAddLocal
    xmlCatalogAllow
    xmlCatalogCleanup
    xmlCatalogConvert
    xmlCatalogDump
    xmlCatalogFreeLocal
    xmlCatalogGetDefaults
    xmlCatalogGetPublic
    xmlCatalogGetSystem
    xmlCatalogIsEmpty
    xmlCatalogLocalResolve
    xmlCatalogLocalResolveURI
    xmlCatalogPrefer
    xmlCatalogPtr
    xmlCatalogRemove
    xmlCatalogResolve
    xmlCatalogResolvePublic
    xmlCatalogResolveSystem
    xmlCatalogResolveURI
    xmlCatalogSetDebug
    xmlCatalogSetDefaultPrefer
    xmlCatalogSetDefaults
    xmlConvertSGMLCatalog
    xmlFreeCatalog
    xmlInitializeCatalog
    xmlLoadACatalog
    xmlLoadCatalog
    xmlLoadCatalogs
    xmlLoadSGMLSuperCatalog
    xmlNewCatalog
    xmlParseCatalogFile

    Module chvalid:

    _xmlChLRange
    _xmlChRangeGroup
    _xmlChSRange
    xmlChLRange
    xmlChLRangePtr
    xmlChRangeGroup
    xmlChRangeGroupPtr
    xmlChSRange
    xmlChSRangePtr
    xmlCharInRange
    xmlIsBaseChar
    xmlIsBaseCharGroup
    xmlIsBaseCharQ
    xmlIsBaseChar_ch
    xmlIsBlank
    xmlIsBlankQ
    xmlIsBlank_ch
    xmlIsChar
    xmlIsCharGroup
    xmlIsCharQ
    xmlIsChar_ch
    xmlIsCombining
    xmlIsCombiningGroup
    xmlIsCombiningQ
    xmlIsDigit
    xmlIsDigitGroup
    xmlIsDigitQ
    xmlIsDigit_ch
    xmlIsExtender
    xmlIsExtenderGroup
    xmlIsExtenderQ
    xmlIsExtender_ch
    xmlIsIdeographic
    xmlIsIdeographicGroup
    xmlIsIdeographicQ
    xmlIsPubidChar
    xmlIsPubidCharQ
    xmlIsPubidChar_ch
    xmlIsPubidChar_tab

    Module debugXML:

    _xmlShellCtxt
    xmlBoolToText
    xmlDebugCheckDocument
    xmlDebugDumpAttr
    xmlDebugDumpAttrList
    xmlDebugDumpDTD
    xmlDebugDumpDocument
    xmlDebugDumpDocumentHead
    xmlDebugDumpEntities
    xmlDebugDumpNode
    xmlDebugDumpNodeList
    xmlDebugDumpOneNode
    xmlDebugDumpString
    xmlLsCountNode
    xmlLsOneNode
    xmlShell
    xmlShellBase
    xmlShellCat
    xmlShellCmd
    xmlShellCtxt
    xmlShellCtxtPtr
    xmlShellDir
    xmlShellDu
    xmlShellList
    xmlShellLoad
    xmlShellPrintNode
    xmlShellPrintXPathError
    xmlShellPrintXPathResult
    xmlShellPwd
    xmlShellReadlineFunc
    xmlShellSave
    xmlShellValidate
    xmlShellWrite

    Module dict:

    xmlDict
    xmlDictCleanup
    xmlDictCreate
    xmlDictCreateSub
    xmlDictExists
    xmlDictFree
    xmlDictGetUsage
    xmlDictLookup
    xmlDictOwns
    xmlDictPtr
    xmlDictQLookup
    xmlDictReference
    xmlDictSetLimit
    xmlDictSize
    xmlInitializeDict

    Module encoding:

    UTF8Toisolat1
    XML_CHAR_ENCODING_2022_JP
    XML_CHAR_ENCODING_8859_1
    XML_CHAR_ENCODING_8859_2
    XML_CHAR_ENCODING_8859_3
    XML_CHAR_ENCODING_8859_4
    XML_CHAR_ENCODING_8859_5
    XML_CHAR_ENCODING_8859_6
    XML_CHAR_ENCODING_8859_7
    XML_CHAR_ENCODING_8859_8
    XML_CHAR_ENCODING_8859_9
    XML_CHAR_ENCODING_ASCII
    XML_CHAR_ENCODING_EBCDIC
    XML_CHAR_ENCODING_ERROR
    XML_CHAR_ENCODING_EUC_JP
    XML_CHAR_ENCODING_NONE
    XML_CHAR_ENCODING_SHIFT_JIS
    XML_CHAR_ENCODING_UCS2
    XML_CHAR_ENCODING_UCS4BE
    XML_CHAR_ENCODING_UCS4LE
    XML_CHAR_ENCODING_UCS4_2143
    XML_CHAR_ENCODING_UCS4_3412
    XML_CHAR_ENCODING_UTF16BE
    XML_CHAR_ENCODING_UTF16LE
    XML_CHAR_ENCODING_UTF8
    _uconv_t
    _xmlCharEncodingHandler
    isolat1ToUTF8
    uconv_t
    xmlAddEncodingAlias
    xmlCharEncCloseFunc
    xmlCharEncFirstLine
    xmlCharEncInFunc
    xmlCharEncOutFunc
    xmlCharEncoding
    xmlCharEncodingHandler
    xmlCharEncodingHandlerPtr
    xmlCharEncodingInputFunc
    xmlCharEncodingOutputFunc
    xmlCleanupCharEncodingHandlers
    xmlCleanupEncodingAliases
    xmlDelEncodingAlias
    xmlDetectCharEncoding
    xmlFindCharEncodingHandler
    xmlGetCharEncodingHandler
    xmlGetCharEncodingName
    xmlGetEncodingAlias
    xmlInitCharEncodingHandlers
    xmlNewCharEncodingHandler
    xmlParseCharEncoding
    xmlRegisterCharEncodingHandler

    Module entities:

    XML_EXTERNAL_GENERAL_PARSED_ENTITY
    XML_EXTERNAL_GENERAL_UNPARSED_ENTITY
    XML_EXTERNAL_PARAMETER_ENTITY
    XML_INTERNAL_GENERAL_ENTITY
    XML_INTERNAL_PARAMETER_ENTITY
    XML_INTERNAL_PREDEFINED_ENTITY
    _xmlEntity
    xmlAddDocEntity
    xmlAddDtdEntity
    xmlCleanupPredefinedEntities
    xmlCopyEntitiesTable
    xmlCreateEntitiesTable
    xmlDumpEntitiesTable
    xmlDumpEntityDecl
    xmlEncodeEntities
    xmlEncodeEntitiesReentrant
    xmlEncodeSpecialChars
    xmlEntitiesTable
    xmlEntitiesTablePtr
    xmlEntityType
    xmlFreeEntitiesTable
    xmlGetDocEntity
    xmlGetDtdEntity
    xmlGetParameterEntity
    xmlGetPredefinedEntity
    xmlInitializePredefinedEntities
    xmlNewEntity

    Module globals:

    _xmlGlobalState
    docbDefaultSAXHandler
    htmlDefaultSAXHandler
    oldXMLWDcompatibility
    xmlBufferAllocScheme
    xmlCleanupGlobals
    xmlDefaultBufferSize
    xmlDefaultSAXHandler
    xmlDefaultSAXLocator
    xmlDeregisterNodeDefault
    xmlDeregisterNodeDefaultValue
    xmlDeregisterNodeFunc
    xmlDoValidityCheckingDefaultValue
    xmlFree
    xmlGenericError
    xmlGenericErrorContext
    xmlGetWarningsDefaultValue
    xmlGlobalState
    xmlGlobalStatePtr
    xmlIndentTreeOutput
    xmlInitGlobals
    xmlInitializeGlobalState
    xmlKeepBlanksDefaultValue
    xmlLastError
    xmlLineNumbersDefaultValue
    xmlLoadExtDtdDefaultValue
    xmlMalloc
    xmlMallocAtomic
    xmlMemStrdup
    xmlOutputBufferCreateFilenameDefault
    xmlOutputBufferCreateFilenameFunc
    xmlOutputBufferCreateFilenameValue
    xmlParserDebugEntities
    xmlParserInputBufferCreateFilenameDefault
    xmlParserInputBufferCreateFilenameFunc
    xmlParserInputBufferCreateFilenameValue
    xmlParserVersion
    xmlPedanticParserDefaultValue
    xmlRealloc
    xmlRegisterNodeDefault
    xmlRegisterNodeDefaultValue
    xmlRegisterNodeFunc
    xmlSaveNoEmptyTags
    xmlStructuredError
    xmlStructuredErrorContext
    xmlSubstituteEntitiesDefaultValue
    xmlThrDefBufferAllocScheme
    xmlThrDefDefaultBufferSize
    xmlThrDefDeregisterNodeDefault
    xmlThrDefDoValidityCheckingDefaultValue
    xmlThrDefGetWarningsDefaultValue
    xmlThrDefIndentTreeOutput
    xmlThrDefKeepBlanksDefaultValue
    xmlThrDefLineNumbersDefaultValue
    xmlThrDefLoadExtDtdDefaultValue
    xmlThrDefOutputBufferCreateFilenameDefault
    xmlThrDefParserDebugEntities
    xmlThrDefParserInputBufferCreateFilenameDefault
    xmlThrDefPedanticParserDefaultValue
    xmlThrDefRegisterNodeDefault
    xmlThrDefSaveNoEmptyTags
    xmlThrDefSetGenericErrorFunc
    xmlThrDefSetStructuredErrorFunc
    xmlThrDefSubstituteEntitiesDefaultValue
    xmlThrDefTreeIndentString
    xmlTreeIndentString

    Module hash:

    XML_CAST_FPTR
    xmlHashAddEntry
    xmlHashAddEntry2
    xmlHashAddEntry3
    xmlHashCopier
    xmlHashCopy
    xmlHashCreate
    xmlHashCreateDict
    xmlHashDeallocator
    xmlHashFree
    xmlHashLookup
    xmlHashLookup2
    xmlHashLookup3
    xmlHashQLookup
    xmlHashQLookup2
    xmlHashQLookup3
    xmlHashRemoveEntry
    xmlHashRemoveEntry2
    xmlHashRemoveEntry3
    xmlHashScan
    xmlHashScan3
    xmlHashScanFull
    xmlHashScanFull3
    xmlHashScanner
    xmlHashScannerFull
    xmlHashSize
    xmlHashTable
    xmlHashTablePtr
    xmlHashUpdateEntry
    xmlHashUpdateEntry2
    xmlHashUpdateEntry3

    Module list:

    xmlLink
    xmlLinkGetData
    xmlLinkPtr
    xmlList
    xmlListAppend
    xmlListClear
    xmlListCopy
    xmlListCreate
    xmlListDataCompare
    xmlListDeallocator
    xmlListDelete
    xmlListDup
    xmlListEmpty
    xmlListEnd
    xmlListFront
    xmlListInsert
    xmlListMerge
    xmlListPopBack
    xmlListPopFront
    xmlListPtr
    xmlListPushBack
    xmlListPushFront
    xmlListRemoveAll
    xmlListRemoveFirst
    xmlListRemoveLast
    xmlListReverse
    xmlListReverseSearch
    xmlListReverseWalk
    xmlListSearch
    xmlListSize
    xmlListSort
    xmlListWalk
    xmlListWalker

    Module nanoftp:

    INVALID_SOCKET
    SOCKET
    ftpDataCallback
    ftpListCallback
    xmlNanoFTPCheckResponse
    xmlNanoFTPCleanup
    xmlNanoFTPClose
    xmlNanoFTPCloseConnection
    xmlNanoFTPConnect
    xmlNanoFTPConnectTo
    xmlNanoFTPCwd
    xmlNanoFTPDele
    xmlNanoFTPFreeCtxt
    xmlNanoFTPGet
    xmlNanoFTPGetConnection
    xmlNanoFTPGetResponse
    xmlNanoFTPGetSocket
    xmlNanoFTPInit
    xmlNanoFTPList
    xmlNanoFTPNewCtxt
    xmlNanoFTPOpen
    xmlNanoFTPProxy
    xmlNanoFTPQuit
    xmlNanoFTPRead
    xmlNanoFTPScanProxy
    xmlNanoFTPUpdateURL

    Module nanohttp:

    xmlNanoHTTPAuthHeader
    xmlNanoHTTPCleanup
    xmlNanoHTTPClose
    xmlNanoHTTPContentLength
    xmlNanoHTTPEncoding
    xmlNanoHTTPFetch
    xmlNanoHTTPInit
    xmlNanoHTTPMethod
    xmlNanoHTTPMethodRedir
    xmlNanoHTTPMimeType
    xmlNanoHTTPOpen
    xmlNanoHTTPOpenRedir
    xmlNanoHTTPRead
    xmlNanoHTTPRedir
    xmlNanoHTTPReturnCode
    xmlNanoHTTPSave
    xmlNanoHTTPScanProxy

    Module parser:

    XML_COMPLETE_ATTRS
    XML_DEFAULT_VERSION
    XML_DETECT_IDS
    XML_PARSER_ATTRIBUTE_VALUE
    XML_PARSER_CDATA_SECTION
    XML_PARSER_COMMENT
    XML_PARSER_CONTENT
    XML_PARSER_DTD
    XML_PARSER_END_TAG
    XML_PARSER_ENTITY_DECL
    XML_PARSER_ENTITY_VALUE
    XML_PARSER_EOF
    XML_PARSER_EPILOG
    XML_PARSER_IGNORE
    XML_PARSER_MISC
    XML_PARSER_PI
    XML_PARSER_PROLOG
    XML_PARSER_PUBLIC_LITERAL
    XML_PARSER_START
    XML_PARSER_START_TAG
    XML_PARSER_SYSTEM_LITERAL
    XML_PARSE_BIG_LINES
    XML_PARSE_COMPACT
    XML_PARSE_DOM
    XML_PARSE_DTDATTR
    XML_PARSE_DTDLOAD
    XML_PARSE_DTDVALID
    XML_PARSE_HUGE
    XML_PARSE_IGNORE_ENC
    XML_PARSE_NOBASEFIX
    XML_PARSE_NOBLANKS
    XML_PARSE_NOCDATA
    XML_PARSE_NODICT
    XML_PARSE_NOENT
    XML_PARSE_NOERROR
    XML_PARSE_NONET
    XML_PARSE_NOWARNING
    XML_PARSE_NOXINCNODE
    XML_PARSE_NSCLEAN
    XML_PARSE_OLD10
    XML_PARSE_OLDSAX
    XML_PARSE_PEDANTIC
    XML_PARSE_PUSH_DOM
    XML_PARSE_PUSH_SAX
    XML_PARSE_READER
    XML_PARSE_RECOVER
    XML_PARSE_SAX
    XML_PARSE_SAX1
    XML_PARSE_UNKNOWN
    XML_PARSE_XINCLUDE
    XML_SAX2_MAGIC
    XML_SKIP_IDS
    XML_WITH_AUTOMATA
    XML_WITH_C14N
    XML_WITH_CATALOG
    XML_WITH_DEBUG
    XML_WITH_DEBUG_MEM
    XML_WITH_DEBUG_RUN
    XML_WITH_EXPR
    XML_WITH_FTP
    XML_WITH_HTML
    XML_WITH_HTTP
    XML_WITH_ICONV
    XML_WITH_ICU
    XML_WITH_ISO8859X
    XML_WITH_LEGACY
    XML_WITH_LZMA
    XML_WITH_MODULES
    XML_WITH_NONE
    XML_WITH_OUTPUT
    XML_WITH_PATTERN
    XML_WITH_PUSH
    XML_WITH_READER
    XML_WITH_REGEXP
    XML_WITH_SAX1
    XML_WITH_SCHEMAS
    XML_WITH_SCHEMATRON
    XML_WITH_THREAD
    XML_WITH_TREE
    XML_WITH_UNICODE
    XML_WITH_VALID
    XML_WITH_WRITER
    XML_WITH_XINCLUDE
    XML_WITH_XPATH
    XML_WITH_XPTR
    XML_WITH_ZLIB
    _xmlParserCtxt
    _xmlParserInput
    _xmlParserNodeInfo
    _xmlParserNodeInfoSeq
    _xmlSAXHandler
    _xmlSAXHandlerV1
    _xmlSAXLocator
    attributeDeclSAXFunc
    attributeSAXFunc
    cdataBlockSAXFunc
    charactersSAXFunc
    commentSAXFunc
    elementDeclSAXFunc
    endDocumentSAXFunc
    endElementNsSAX2Func
    endElementSAXFunc
    entityDeclSAXFunc
    errorSAXFunc
    externalSubsetSAXFunc
    fatalErrorSAXFunc
    getEntitySAXFunc
    getParameterEntitySAXFunc
    hasExternalSubsetSAXFunc
    hasInternalSubsetSAXFunc
    ignorableWhitespaceSAXFunc
    internalSubsetSAXFunc
    isStandaloneSAXFunc
    notationDeclSAXFunc
    processingInstructionSAXFunc
    referenceSAXFunc
    resolveEntitySAXFunc
    setDocumentLocatorSAXFunc
    startDocumentSAXFunc
    startElementNsSAX2Func
    startElementSAXFunc
    unparsedEntityDeclSAXFunc
    warningSAXFunc
    xmlByteConsumed
    xmlCleanupParser
    xmlClearNodeInfoSeq
    xmlClearParserCtxt
    xmlCreateDocParserCtxt
    xmlCreateIOParserCtxt
    xmlCreatePushParserCtxt
    xmlCtxtReadDoc
    xmlCtxtReadFd
    xmlCtxtReadFile
    xmlCtxtReadIO
    xmlCtxtReadMemory
    xmlCtxtReset
    xmlCtxtResetPush
    xmlCtxtUseOptions
    xmlExternalEntityLoader
    xmlFeature
    xmlFreeParserCtxt
    xmlGetExternalEntityLoader
    xmlGetFeature
    xmlGetFeaturesList
    xmlHasFeature
    xmlIOParseDTD
    xmlInitNodeInfoSeq
    xmlInitParser
    xmlInitParserCtxt
    xmlKeepBlanksDefault
    xmlLineNumbersDefault
    xmlLoadExternalEntity
    xmlNewIOInputStream
    xmlNewParserCtxt
    xmlParseBalancedChunkMemory
    xmlParseBalancedChunkMemoryRecover
    xmlParseChunk
    xmlParseCtxtExternalEntity
    xmlParseDTD
    xmlParseDoc
    xmlParseDocument
    xmlParseEntity
    xmlParseExtParsedEnt
    xmlParseExternalEntity
    xmlParseFile
    xmlParseInNodeContext
    xmlParseMemory
    xmlParserAddNodeInfo
    xmlParserFindNodeInfo
    xmlParserFindNodeInfoIndex
    xmlParserInputDeallocate
    xmlParserInputGrow
    xmlParserInputRead
    xmlParserInputState
    xmlParserMode
    xmlParserNodeInfo
    xmlParserNodeInfoPtr
    xmlParserNodeInfoSeq
    xmlParserNodeInfoSeqPtr
    xmlParserOption
    xmlPedanticParserDefault
    xmlReadDoc
    xmlReadFd
    xmlReadFile
    xmlReadIO
    xmlReadMemory
    xmlRecoverDoc
    xmlRecoverFile
    xmlRecoverMemory
    xmlSAXHandlerV1
    xmlSAXHandlerV1Ptr
    xmlSAXParseDTD
    xmlSAXParseDoc
    xmlSAXParseEntity
    xmlSAXParseFile
    xmlSAXParseFileWithData
    xmlSAXParseMemory
    xmlSAXParseMemoryWithData
    xmlSAXUserParseFile
    xmlSAXUserParseMemory
    xmlSetExternalEntityLoader
    xmlSetFeature
    xmlSetupParserForBuffer
    xmlStopParser
    xmlSubstituteEntitiesDefault

    Module parserInternals:

    INPUT_CHUNK
    IS_ASCII_DIGIT
    IS_ASCII_LETTER
    IS_BASECHAR
    IS_BLANK
    IS_BLANK_CH
    IS_BYTE_CHAR
    IS_CHAR
    IS_CHAR_CH
    IS_COMBINING
    IS_COMBINING_CH
    IS_DIGIT
    IS_DIGIT_CH
    IS_EXTENDER
    IS_EXTENDER_CH
    IS_IDEOGRAPHIC
    IS_LETTER
    IS_LETTER_CH
    IS_PUBIDCHAR
    IS_PUBIDCHAR_CH
    MOVETO_ENDTAG
    MOVETO_STARTTAG
    SKIP_EOL
    XML_MAX_DICTIONARY_LIMIT
    XML_MAX_LOOKUP_LIMIT
    XML_MAX_NAMELEN
    XML_MAX_NAME_LENGTH
    XML_MAX_TEXT_LENGTH
    XML_SUBSTITUTE_BOTH
    XML_SUBSTITUTE_NONE
    XML_SUBSTITUTE_PEREF
    XML_SUBSTITUTE_REF
    htmlCreateFileParserCtxt
    htmlInitAutoClose
    inputPop
    inputPush
    namePop
    namePush
    nodePop
    nodePush
    xmlCheckLanguageID
    xmlCopyChar
    xmlCopyCharMultiByte
    xmlCreateEntityParserCtxt
    xmlCreateFileParserCtxt
    xmlCreateMemoryParserCtxt
    xmlCreateURLParserCtxt
    xmlCurrentChar
    xmlDecodeEntities
    xmlEntityReferenceFunc
    xmlErrMemory
    xmlFreeInputStream
    xmlHandleEntity
    xmlIsLetter
    xmlNamespaceParseNCName
    xmlNamespaceParseNSDef
    xmlNamespaceParseQName
    xmlNewEntityInputStream
    xmlNewInputFromFile
    xmlNewInputStream
    xmlNewStringInputStream
    xmlNextChar
    xmlParseAttValue
    xmlParseAttribute
    xmlParseAttributeListDecl
    xmlParseAttributeType
    xmlParseCDSect
    xmlParseCharData
    xmlParseCharRef
    xmlParseComment
    xmlParseContent
    xmlParseDefaultDecl
    xmlParseDocTypeDecl
    xmlParseElement
    xmlParseElementChildrenContentDecl
    xmlParseElementContentDecl
    xmlParseElementDecl
    xmlParseElementMixedContentDecl
    xmlParseEncName
    xmlParseEncodingDecl
    xmlParseEndTag
    xmlParseEntityDecl
    xmlParseEntityRef
    xmlParseEntityValue
    xmlParseEnumeratedType
    xmlParseEnumerationType
    xmlParseExternalID
    xmlParseExternalSubset
    xmlParseMarkupDecl
    xmlParseMisc
    xmlParseName
    xmlParseNamespace
    xmlParseNmtoken
    xmlParseNotationDecl
    xmlParseNotationType
    xmlParsePEReference
    xmlParsePI
    xmlParsePITarget
    xmlParsePubidLiteral
    xmlParseQuotedString
    xmlParseReference
    xmlParseSDDecl
    xmlParseStartTag
    xmlParseSystemLiteral
    xmlParseTextDecl
    xmlParseVersionInfo
    xmlParseVersionNum
    xmlParseXMLDecl
    xmlParserHandlePEReference
    xmlParserHandleReference
    xmlParserInputShrink
    xmlParserMaxDepth
    xmlPopInput
    xmlPushInput
    xmlScanName
    xmlSetEntityReferenceFunc
    xmlSkipBlankChars
    xmlSplitQName
    xmlStringComment
    xmlStringCurrentChar
    xmlStringDecodeEntities
    xmlStringLenDecodeEntities
    xmlStringText
    xmlStringTextNoenc
    xmlSwitchEncoding
    xmlSwitchInputEncoding
    xmlSwitchToEncoding

    Module pattern:

    XML_PATTERN_DEFAULT
    XML_PATTERN_XPATH
    XML_PATTERN_XSFIELD
    XML_PATTERN_XSSEL
    xmlFreePattern
    xmlFreePatternList
    xmlFreeStreamCtxt
    xmlPattern
    xmlPatternFlags
    xmlPatternFromRoot
    xmlPatternGetStreamCtxt
    xmlPatternMatch
    xmlPatternMaxDepth
    xmlPatternMinDepth
    xmlPatternPtr
    xmlPatternStreamable
    xmlPatterncompile
    xmlStreamCtxt
    xmlStreamCtxtPtr
    xmlStreamPop
    xmlStreamPush
    xmlStreamPushAttr
    xmlStreamPushNode
    xmlStreamWantsAnyNode

    Module relaxng:

    XML_RELAXNGP_CRNG
    XML_RELAXNGP_FREE_DOC
    XML_RELAXNGP_NONE
    XML_RELAXNG_ERR_ATTREXTRANS
    XML_RELAXNG_ERR_ATTRNAME
    XML_RELAXNG_ERR_ATTRNONS
    XML_RELAXNG_ERR_ATTRVALID
    XML_RELAXNG_ERR_ATTRWRONGNS
    XML_RELAXNG_ERR_CONTENTVALID
    XML_RELAXNG_ERR_DATAELEM
    XML_RELAXNG_ERR_DATATYPE
    XML_RELAXNG_ERR_DUPID
    XML_RELAXNG_ERR_ELEMEXTRANS
    XML_RELAXNG_ERR_ELEMNAME
    XML_RELAXNG_ERR_ELEMNONS
    XML_RELAXNG_ERR_ELEMNOTEMPTY
    XML_RELAXNG_ERR_ELEMWRONG
    XML_RELAXNG_ERR_ELEMWRONGNS
    XML_RELAXNG_ERR_EXTRACONTENT
    XML_RELAXNG_ERR_EXTRADATA
    XML_RELAXNG_ERR_INTEREXTRA
    XML_RELAXNG_ERR_INTERNAL
    XML_RELAXNG_ERR_INTERNODATA
    XML_RELAXNG_ERR_INTERSEQ
    XML_RELAXNG_ERR_INVALIDATTR
    XML_RELAXNG_ERR_LACKDATA
    XML_RELAXNG_ERR_LIST
    XML_RELAXNG_ERR_LISTELEM
    XML_RELAXNG_ERR_LISTEMPTY
    XML_RELAXNG_ERR_LISTEXTRA
    XML_RELAXNG_ERR_MEMORY
    XML_RELAXNG_ERR_NODEFINE
    XML_RELAXNG_ERR_NOELEM
    XML_RELAXNG_ERR_NOGRAMMAR
    XML_RELAXNG_ERR_NOSTATE
    XML_RELAXNG_ERR_NOTELEM
    XML_RELAXNG_ERR_TEXTWRONG
    XML_RELAXNG_ERR_TYPE
    XML_RELAXNG_ERR_TYPECMP
    XML_RELAXNG_ERR_TYPEVAL
    XML_RELAXNG_ERR_VALELEM
    XML_RELAXNG_ERR_VALUE
    XML_RELAXNG_OK
    xmlRelaxNG
    xmlRelaxNGCleanupTypes
    xmlRelaxNGDump
    xmlRelaxNGDumpTree
    xmlRelaxNGFree
    xmlRelaxNGFreeParserCtxt
    xmlRelaxNGFreeValidCtxt
    xmlRelaxNGGetParserErrors
    xmlRelaxNGGetValidErrors
    xmlRelaxNGInitTypes
    xmlRelaxNGNewDocParserCtxt
    xmlRelaxNGNewMemParserCtxt
    xmlRelaxNGNewParserCtxt
    xmlRelaxNGNewValidCtxt
    xmlRelaxNGParse
    xmlRelaxNGParserCtxt
    xmlRelaxNGParserCtxtPtr
    xmlRelaxNGParserFlag
    xmlRelaxNGPtr
    xmlRelaxNGSetParserErrors
    xmlRelaxNGSetParserStructuredErrors
    xmlRelaxNGSetValidErrors
    xmlRelaxNGSetValidStructuredErrors
    xmlRelaxNGValidCtxt
    xmlRelaxNGValidCtxtPtr
    xmlRelaxNGValidErr
    xmlRelaxNGValidateDoc
    xmlRelaxNGValidateFullElement
    xmlRelaxNGValidatePopElement
    xmlRelaxNGValidatePushCData
    xmlRelaxNGValidatePushElement
    xmlRelaxNGValidityErrorFunc
    xmlRelaxNGValidityWarningFunc
    xmlRelaxParserSetFlag

    Module schemasInternals:

    XML_SCHEMAS_ANYATTR_LAX
    XML_SCHEMAS_ANYATTR_SKIP
    XML_SCHEMAS_ANYATTR_STRICT
    XML_SCHEMAS_ANYSIMPLETYPE
    XML_SCHEMAS_ANYTYPE
    XML_SCHEMAS_ANYURI
    XML_SCHEMAS_ANY_LAX
    XML_SCHEMAS_ANY_SKIP
    XML_SCHEMAS_ANY_STRICT
    XML_SCHEMAS_ATTRGROUP_GLOBAL
    XML_SCHEMAS_ATTRGROUP_HAS_REFS
    XML_SCHEMAS_ATTRGROUP_MARKED
    XML_SCHEMAS_ATTRGROUP_REDEFINED
    XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED
    XML_SCHEMAS_ATTR_FIXED
    XML_SCHEMAS_ATTR_GLOBAL
    XML_SCHEMAS_ATTR_INTERNAL_RESOLVED
    XML_SCHEMAS_ATTR_NSDEFAULT
    XML_SCHEMAS_ATTR_USE_OPTIONAL
    XML_SCHEMAS_ATTR_USE_PROHIBITED
    XML_SCHEMAS_ATTR_USE_REQUIRED
    XML_SCHEMAS_BASE64BINARY
    XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION
    XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION
    XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION
    XML_SCHEMAS_BOOLEAN
    XML_SCHEMAS_BYTE
    XML_SCHEMAS_DATE
    XML_SCHEMAS_DATETIME
    XML_SCHEMAS_DECIMAL
    XML_SCHEMAS_DOUBLE
    XML_SCHEMAS_DURATION
    XML_SCHEMAS_ELEM_ABSTRACT
    XML_SCHEMAS_ELEM_BLOCK_ABSENT
    XML_SCHEMAS_ELEM_BLOCK_EXTENSION
    XML_SCHEMAS_ELEM_BLOCK_RESTRICTION
    XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION
    XML_SCHEMAS_ELEM_CIRCULAR
    XML_SCHEMAS_ELEM_DEFAULT
    XML_SCHEMAS_ELEM_FINAL_ABSENT
    XML_SCHEMAS_ELEM_FINAL_EXTENSION
    XML_SCHEMAS_ELEM_FINAL_RESTRICTION
    XML_SCHEMAS_ELEM_FIXED
    XML_SCHEMAS_ELEM_GLOBAL
    XML_SCHEMAS_ELEM_INTERNAL_CHECKED
    XML_SCHEMAS_ELEM_INTERNAL_RESOLVED
    XML_SCHEMAS_ELEM_NILLABLE
    XML_SCHEMAS_ELEM_NSDEFAULT
    XML_SCHEMAS_ELEM_REF
    XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD
    XML_SCHEMAS_ELEM_TOPLEVEL
    XML_SCHEMAS_ENTITIES
    XML_SCHEMAS_ENTITY
    XML_SCHEMAS_FACET_COLLAPSE
    XML_SCHEMAS_FACET_PRESERVE
    XML_SCHEMAS_FACET_REPLACE
    XML_SCHEMAS_FACET_UNKNOWN
    XML_SCHEMAS_FINAL_DEFAULT_EXTENSION
    XML_SCHEMAS_FINAL_DEFAULT_LIST
    XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION
    XML_SCHEMAS_FINAL_DEFAULT_UNION
    XML_SCHEMAS_FLOAT
    XML_SCHEMAS_GDAY
    XML_SCHEMAS_GMONTH
    XML_SCHEMAS_GMONTHDAY
    XML_SCHEMAS_GYEAR
    XML_SCHEMAS_GYEARMONTH
    XML_SCHEMAS_HEXBINARY
    XML_SCHEMAS_ID
    XML_SCHEMAS_IDREF
    XML_SCHEMAS_IDREFS
    XML_SCHEMAS_INCLUDING_CONVERT_NS
    XML_SCHEMAS_INT
    XML_SCHEMAS_INTEGER
    XML_SCHEMAS_LANGUAGE
    XML_SCHEMAS_LONG
    XML_SCHEMAS_NAME
    XML_SCHEMAS_NCNAME
    XML_SCHEMAS_NINTEGER
    XML_SCHEMAS_NMTOKEN
    XML_SCHEMAS_NMTOKENS
    XML_SCHEMAS_NNINTEGER
    XML_SCHEMAS_NORMSTRING
    XML_SCHEMAS_NOTATION
    XML_SCHEMAS_NPINTEGER
    XML_SCHEMAS_PINTEGER
    XML_SCHEMAS_QNAME
    XML_SCHEMAS_QUALIF_ATTR
    XML_SCHEMAS_QUALIF_ELEM
    XML_SCHEMAS_SHORT
    XML_SCHEMAS_STRING
    XML_SCHEMAS_TIME
    XML_SCHEMAS_TOKEN
    XML_SCHEMAS_TYPE_ABSTRACT
    XML_SCHEMAS_TYPE_BLOCK_DEFAULT
    XML_SCHEMAS_TYPE_BLOCK_EXTENSION
    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION
    XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION
    XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION
    XML_SCHEMAS_TYPE_FACETSNEEDVALUE
    XML_SCHEMAS_TYPE_FINAL_DEFAULT
    XML_SCHEMAS_TYPE_FINAL_EXTENSION
    XML_SCHEMAS_TYPE_FINAL_LIST
    XML_SCHEMAS_TYPE_FINAL_RESTRICTION
    XML_SCHEMAS_TYPE_FINAL_UNION
    XML_SCHEMAS_TYPE_FIXUP_1
    XML_SCHEMAS_TYPE_GLOBAL
    XML_SCHEMAS_TYPE_HAS_FACETS
    XML_SCHEMAS_TYPE_INTERNAL_INVALID
    XML_SCHEMAS_TYPE_INTERNAL_RESOLVED
    XML_SCHEMAS_TYPE_MARKED
    XML_SCHEMAS_TYPE_MIXED
    XML_SCHEMAS_TYPE_NORMVALUENEEDED
    XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD
    XML_SCHEMAS_TYPE_REDEFINED
    XML_SCHEMAS_TYPE_VARIETY_ABSENT
    XML_SCHEMAS_TYPE_VARIETY_ATOMIC
    XML_SCHEMAS_TYPE_VARIETY_LIST
    XML_SCHEMAS_TYPE_VARIETY_UNION
    XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE
    XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE
    XML_SCHEMAS_TYPE_WHITESPACE_REPLACE
    XML_SCHEMAS_UBYTE
    XML_SCHEMAS_UINT
    XML_SCHEMAS_ULONG
    XML_SCHEMAS_UNKNOWN
    XML_SCHEMAS_USHORT
    XML_SCHEMAS_WILDCARD_COMPLETE
    XML_SCHEMA_CONTENT_ANY
    XML_SCHEMA_CONTENT_BASIC
    XML_SCHEMA_CONTENT_ELEMENTS
    XML_SCHEMA_CONTENT_EMPTY
    XML_SCHEMA_CONTENT_MIXED
    XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS
    XML_SCHEMA_CONTENT_SIMPLE
    XML_SCHEMA_CONTENT_UNKNOWN
    XML_SCHEMA_EXTRA_ATTR_USE_PROHIB
    XML_SCHEMA_EXTRA_QNAMEREF
    XML_SCHEMA_FACET_ENUMERATION
    XML_SCHEMA_FACET_FRACTIONDIGITS
    XML_SCHEMA_FACET_LENGTH
    XML_SCHEMA_FACET_MAXEXCLUSIVE
    XML_SCHEMA_FACET_MAXINCLUSIVE
    XML_SCHEMA_FACET_MAXLENGTH
    XML_SCHEMA_FACET_MINEXCLUSIVE
    XML_SCHEMA_FACET_MININCLUSIVE
    XML_SCHEMA_FACET_MINLENGTH
    XML_SCHEMA_FACET_PATTERN
    XML_SCHEMA_FACET_TOTALDIGITS
    XML_SCHEMA_FACET_WHITESPACE
    XML_SCHEMA_TYPE_ALL
    XML_SCHEMA_TYPE_ANY
    XML_SCHEMA_TYPE_ANY_ATTRIBUTE
    XML_SCHEMA_TYPE_ATTRIBUTE
    XML_SCHEMA_TYPE_ATTRIBUTEGROUP
    XML_SCHEMA_TYPE_ATTRIBUTE_USE
    XML_SCHEMA_TYPE_BASIC
    XML_SCHEMA_TYPE_CHOICE
    XML_SCHEMA_TYPE_COMPLEX
    XML_SCHEMA_TYPE_COMPLEX_CONTENT
    XML_SCHEMA_TYPE_ELEMENT
    XML_SCHEMA_TYPE_EXTENSION
    XML_SCHEMA_TYPE_FACET
    XML_SCHEMA_TYPE_GROUP
    XML_SCHEMA_TYPE_IDC_KEY
    XML_SCHEMA_TYPE_IDC_KEYREF
    XML_SCHEMA_TYPE_IDC_UNIQUE
    XML_SCHEMA_TYPE_LIST
    XML_SCHEMA_TYPE_NOTATION
    XML_SCHEMA_TYPE_PARTICLE
    XML_SCHEMA_TYPE_RESTRICTION
    XML_SCHEMA_TYPE_SEQUENCE
    XML_SCHEMA_TYPE_SIMPLE
    XML_SCHEMA_TYPE_SIMPLE_CONTENT
    XML_SCHEMA_TYPE_UNION
    XML_SCHEMA_TYPE_UR
    _xmlSchema
    _xmlSchemaAnnot
    _xmlSchemaAttribute
    _xmlSchemaAttributeGroup
    _xmlSchemaAttributeLink
    _xmlSchemaElement
    _xmlSchemaFacet
    _xmlSchemaFacetLink
    _xmlSchemaNotation
    _xmlSchemaType
    _xmlSchemaTypeLink
    _xmlSchemaWildcard
    _xmlSchemaWildcardNs
    xmlSchemaAnnot
    xmlSchemaAnnotPtr
    xmlSchemaAttribute
    xmlSchemaAttributeGroup
    xmlSchemaAttributeGroupPtr
    xmlSchemaAttributeLink
    xmlSchemaAttributeLinkPtr
    xmlSchemaAttributePtr
    xmlSchemaContentType
    xmlSchemaElement
    xmlSchemaElementPtr
    xmlSchemaFacet
    xmlSchemaFacetLink
    xmlSchemaFacetLinkPtr
    xmlSchemaFacetPtr
    xmlSchemaFreeType
    xmlSchemaFreeWildcard
    xmlSchemaNotation
    xmlSchemaNotationPtr
    xmlSchemaType
    xmlSchemaTypeLink
    xmlSchemaTypeLinkPtr
    xmlSchemaTypePtr
    xmlSchemaTypeType
    xmlSchemaVal
    xmlSchemaValPtr
    xmlSchemaValType
    xmlSchemaWildcard
    xmlSchemaWildcardNs
    xmlSchemaWildcardNsPtr
    xmlSchemaWildcardPtr

    Module schematron:

    XML_SCHEMATRON_OUT_BUFFER
    XML_SCHEMATRON_OUT_ERROR
    XML_SCHEMATRON_OUT_FILE
    XML_SCHEMATRON_OUT_IO
    XML_SCHEMATRON_OUT_QUIET
    XML_SCHEMATRON_OUT_TEXT
    XML_SCHEMATRON_OUT_XML
    xmlSchematron
    xmlSchematronFree
    xmlSchematronFreeParserCtxt
    xmlSchematronFreeValidCtxt
    xmlSchematronNewDocParserCtxt
    xmlSchematronNewMemParserCtxt
    xmlSchematronNewParserCtxt
    xmlSchematronNewValidCtxt
    xmlSchematronParse
    xmlSchematronParserCtxt
    xmlSchematronParserCtxtPtr
    xmlSchematronPtr
    xmlSchematronSetValidStructuredErrors
    xmlSchematronValidCtxt
    xmlSchematronValidCtxtPtr
    xmlSchematronValidOptions
    xmlSchematronValidateDoc
    xmlSchematronValidityErrorFunc
    xmlSchematronValidityWarningFunc

    Module threads:

    xmlCleanupThreads
    xmlDllMain
    xmlFreeMutex
    xmlFreeRMutex
    xmlGetGlobalState
    xmlGetThreadId
    xmlInitThreads
    xmlIsMainThread
    xmlLockLibrary
    xmlMutex
    xmlMutexLock
    xmlMutexPtr
    xmlMutexUnlock
    xmlNewMutex
    xmlNewRMutex
    xmlRMutex
    xmlRMutexLock
    xmlRMutexPtr
    xmlRMutexUnlock
    xmlUnlockLibrary

    Module tree:

    BASE_BUFFER_SIZE
    LIBXML2_NEW_BUFFER
    XML_ATTRIBUTE_CDATA
    XML_ATTRIBUTE_DECL
    XML_ATTRIBUTE_ENTITIES
    XML_ATTRIBUTE_ENTITY
    XML_ATTRIBUTE_ENUMERATION
    XML_ATTRIBUTE_FIXED
    XML_ATTRIBUTE_ID
    XML_ATTRIBUTE_IDREF
    XML_ATTRIBUTE_IDREFS
    XML_ATTRIBUTE_IMPLIED
    XML_ATTRIBUTE_NMTOKEN
    XML_ATTRIBUTE_NMTOKENS
    XML_ATTRIBUTE_NODE
    XML_ATTRIBUTE_NONE
    XML_ATTRIBUTE_NOTATION
    XML_ATTRIBUTE_REQUIRED
    XML_BUFFER_ALLOC_DOUBLEIT
    XML_BUFFER_ALLOC_EXACT
    XML_BUFFER_ALLOC_HYBRID
    XML_BUFFER_ALLOC_IMMUTABLE
    XML_BUFFER_ALLOC_IO
    XML_CDATA_SECTION_NODE
    XML_COMMENT_NODE
    XML_DOCB_DOCUMENT_NODE
    XML_DOCUMENT_FRAG_NODE
    XML_DOCUMENT_NODE
    XML_DOCUMENT_TYPE_NODE
    XML_DOC_DTDVALID
    XML_DOC_HTML
    XML_DOC_INTERNAL
    XML_DOC_NSVALID
    XML_DOC_OLD10
    XML_DOC_USERBUILT
    XML_DOC_WELLFORMED
    XML_DOC_XINCLUDE
    XML_DTD_NODE
    XML_ELEMENT_CONTENT_ELEMENT
    XML_ELEMENT_CONTENT_MULT
    XML_ELEMENT_CONTENT_ONCE
    XML_ELEMENT_CONTENT_OPT
    XML_ELEMENT_CONTENT_OR
    XML_ELEMENT_CONTENT_PCDATA
    XML_ELEMENT_CONTENT_PLUS
    XML_ELEMENT_CONTENT_SEQ
    XML_ELEMENT_DECL
    XML_ELEMENT_NODE
    XML_ELEMENT_TYPE_ANY
    XML_ELEMENT_TYPE_ELEMENT
    XML_ELEMENT_TYPE_EMPTY
    XML_ELEMENT_TYPE_MIXED
    XML_ELEMENT_TYPE_UNDEFINED
    XML_ENTITY_DECL
    XML_ENTITY_NODE
    XML_ENTITY_REF_NODE
    XML_GET_CONTENT
    XML_GET_LINE
    XML_HTML_DOCUMENT_NODE
    XML_LOCAL_NAMESPACE
    XML_NAMESPACE_DECL
    XML_NOTATION_NODE
    XML_PI_NODE
    XML_TEXT_NODE
    XML_XINCLUDE_END
    XML_XINCLUDE_START
    XML_XML_ID
    XML_XML_NAMESPACE
    _xmlAttr
    _xmlAttribute
    _xmlBuffer
    _xmlDOMWrapCtxt
    _xmlDoc
    _xmlDtd
    _xmlElement
    _xmlElementContent
    _xmlEnumeration
    _xmlID
    _xmlNode
    _xmlNotation
    _xmlNs
    _xmlRef
    xmlAddChild
    xmlAddChildList
    xmlAddNextSibling
    xmlAddPrevSibling
    xmlAddSibling
    xmlAttr
    xmlAttrPtr
    xmlAttrSerializeTxtContent
    xmlAttribute
    xmlAttributeDefault
    xmlAttributePtr
    xmlAttributeType
    xmlBuf
    xmlBufContent
    xmlBufEnd
    xmlBufGetNodeContent
    xmlBufNodeDump
    xmlBufPtr
    xmlBufShrink
    xmlBufUse
    xmlBuffer
    xmlBufferAdd
    xmlBufferAddHead
    xmlBufferAllocationScheme
    xmlBufferCCat
    xmlBufferCat
    xmlBufferContent
    xmlBufferCreate
    xmlBufferCreateSize
    xmlBufferCreateStatic
    xmlBufferDetach
    xmlBufferDump
    xmlBufferEmpty
    xmlBufferFree
    xmlBufferGrow
    xmlBufferLength
    xmlBufferPtr
    xmlBufferResize
    xmlBufferSetAllocationScheme
    xmlBufferShrink
    xmlBufferWriteCHAR
    xmlBufferWriteChar
    xmlBufferWriteQuotedString
    xmlBuildQName
    xmlChildElementCount
    xmlChildrenNode
    xmlCopyDoc
    xmlCopyDtd
    xmlCopyNamespace
    xmlCopyNamespaceList
    xmlCopyNode
    xmlCopyNodeList
    xmlCopyProp
    xmlCopyPropList
    xmlCreateIntSubset
    xmlDOMWrapAcquireNsFunction
    xmlDOMWrapAdoptNode
    xmlDOMWrapCloneNode
    xmlDOMWrapCtxt
    xmlDOMWrapCtxtPtr
    xmlDOMWrapFreeCtxt
    xmlDOMWrapNewCtxt
    xmlDOMWrapReconcileNamespaces
    xmlDOMWrapRemoveNode
    xmlDoc
    xmlDocCopyNode
    xmlDocCopyNodeList
    xmlDocDump
    xmlDocDumpFormatMemory
    xmlDocDumpFormatMemoryEnc
    xmlDocDumpMemory
    xmlDocDumpMemoryEnc
    xmlDocFormatDump
    xmlDocGetRootElement
    xmlDocProperties
    xmlDocPtr
    xmlDocSetRootElement
    xmlDtd
    xmlDtdPtr
    xmlElemDump
    xmlElement
    xmlElementContent
    xmlElementContentOccur
    xmlElementContentPtr
    xmlElementContentType
    xmlElementPtr
    xmlElementType
    xmlElementTypeVal
    xmlEntity
    xmlEntityPtr
    xmlEnumeration
    xmlEnumerationPtr
    xmlFirstElementChild
    xmlFreeDoc
    xmlFreeDtd
    xmlFreeNode
    xmlFreeNodeList
    xmlFreeNs
    xmlFreeNsList
    xmlFreeProp
    xmlFreePropList
    xmlGetBufferAllocationScheme
    xmlGetCompressMode
    xmlGetDocCompressMode
    xmlGetIntSubset
    xmlGetLastChild
    xmlGetLineNo
    xmlGetNoNsProp
    xmlGetNodePath
    xmlGetNsList
    xmlGetNsProp
    xmlGetProp
    xmlHasNsProp
    xmlHasProp
    xmlID
    xmlIDPtr
    xmlIsBlankNode
    xmlIsXHTML
    xmlLastElementChild
    xmlNewCDataBlock
    xmlNewCharRef
    xmlNewChild
    xmlNewComment
    xmlNewDoc
    xmlNewDocComment
    xmlNewDocFragment
    xmlNewDocNode
    xmlNewDocNodeEatName
    xmlNewDocPI
    xmlNewDocProp
    xmlNewDocRawNode
    xmlNewDocText
    xmlNewDocTextLen
    xmlNewDtd
    xmlNewGlobalNs
    xmlNewNode
    xmlNewNodeEatName
    xmlNewNs
    xmlNewNsProp
    xmlNewNsPropEatName
    xmlNewPI
    xmlNewProp
    xmlNewReference
    xmlNewText
    xmlNewTextChild
    xmlNewTextLen
    xmlNextElementSibling
    xmlNode
    xmlNodeAddContent
    xmlNodeAddContentLen
    xmlNodeBufGetContent
    xmlNodeDump
    xmlNodeDumpOutput
    xmlNodeGetBase
    xmlNodeGetContent
    xmlNodeGetLang
    xmlNodeGetSpacePreserve
    xmlNodeIsText
    xmlNodeListGetRawString
    xmlNodeListGetString
    xmlNodePtr
    xmlNodeSetBase
    xmlNodeSetContent
    xmlNodeSetContentLen
    xmlNodeSetLang
    xmlNodeSetName
    xmlNodeSetSpacePreserve
    xmlNotation
    xmlNotationPtr
    xmlNs
    xmlNsPtr
    xmlNsType
    xmlOutputBuffer
    xmlOutputBufferPtr
    xmlParserCtxt
    xmlParserCtxtPtr
    xmlParserInput
    xmlParserInputBuffer
    xmlParserInputBufferPtr
    xmlParserInputPtr
    xmlPreviousElementSibling
    xmlReconciliateNs
    xmlRef
    xmlRefPtr
    xmlRemoveProp
    xmlReplaceNode
    xmlRootNode
    xmlSAXHandler
    xmlSAXHandlerPtr
    xmlSAXLocator
    xmlSAXLocatorPtr
    xmlSaveFile
    xmlSaveFileEnc
    xmlSaveFileTo
    xmlSaveFormatFile
    xmlSaveFormatFileEnc
    xmlSaveFormatFileTo
    xmlSearchNs
    xmlSearchNsByHref
    xmlSetBufferAllocationScheme
    xmlSetCompressMode
    xmlSetDocCompressMode
    xmlSetListDoc
    xmlSetNs
    xmlSetNsProp
    xmlSetProp
    xmlSetTreeDoc
    xmlSplitQName2
    xmlSplitQName3
    xmlStringGetNodeList
    xmlStringLenGetNodeList
    xmlTextConcat
    xmlTextMerge
    xmlUnlinkNode
    xmlUnsetNsProp
    xmlUnsetProp
    xmlValidateNCName
    xmlValidateNMToken
    xmlValidateName
    xmlValidateQName

    Module uri:

    _xmlURI
    xmlBuildRelativeURI
    xmlBuildURI
    xmlCanonicPath
    xmlCreateURI
    xmlFreeURI
    xmlNormalizeURIPath
    xmlParseURI
    xmlParseURIRaw
    xmlParseURIReference
    xmlPathToURI
    xmlPrintURI
    xmlSaveUri
    xmlURI
    xmlURIEscape
    xmlURIEscapeStr
    xmlURIPtr
    xmlURIUnescapeString

    Module valid:

    XML_CTXT_FINISH_DTD_0
    XML_CTXT_FINISH_DTD_1
    _xmlValidCtxt
    xmlAddAttributeDecl
    xmlAddElementDecl
    xmlAddID
    xmlAddNotationDecl
    xmlAddRef
    xmlAttributeTable
    xmlAttributeTablePtr
    xmlCopyAttributeTable
    xmlCopyDocElementContent
    xmlCopyElementContent
    xmlCopyElementTable
    xmlCopyEnumeration
    xmlCopyNotationTable
    xmlCreateEnumeration
    xmlDumpAttributeDecl
    xmlDumpAttributeTable
    xmlDumpElementDecl
    xmlDumpElementTable
    xmlDumpNotationDecl
    xmlDumpNotationTable
    xmlElementTable
    xmlElementTablePtr
    xmlFreeAttributeTable
    xmlFreeDocElementContent
    xmlFreeElementContent
    xmlFreeElementTable
    xmlFreeEnumeration
    xmlFreeIDTable
    xmlFreeNotationTable
    xmlFreeRefTable
    xmlFreeValidCtxt
    xmlGetDtdAttrDesc
    xmlGetDtdElementDesc
    xmlGetDtdNotationDesc
    xmlGetDtdQAttrDesc
    xmlGetDtdQElementDesc
    xmlGetID
    xmlGetRefs
    xmlIDTable
    xmlIDTablePtr
    xmlIsID
    xmlIsMixedElement
    xmlIsRef
    xmlNewDocElementContent
    xmlNewElementContent
    xmlNewValidCtxt
    xmlNotationTable
    xmlNotationTablePtr
    xmlRefTable
    xmlRefTablePtr
    xmlRemoveID
    xmlRemoveRef
    xmlSnprintfElementContent
    xmlSprintfElementContent
    xmlValidBuildContentModel
    xmlValidCtxt
    xmlValidCtxtNormalizeAttributeValue
    xmlValidCtxtPtr
    xmlValidGetPotentialChildren
    xmlValidGetValidElements
    xmlValidNormalizeAttributeValue
    xmlValidState
    xmlValidStatePtr
    xmlValidateAttributeDecl
    xmlValidateAttributeValue
    xmlValidateDocument
    xmlValidateDocumentFinal
    xmlValidateDtd
    xmlValidateDtdFinal
    xmlValidateElement
    xmlValidateElementDecl
    xmlValidateNameValue
    xmlValidateNamesValue
    xmlValidateNmtokenValue
    xmlValidateNmtokensValue
    xmlValidateNotationDecl
    xmlValidateNotationUse
    xmlValidateOneAttribute
    xmlValidateOneElement
    xmlValidateOneNamespace
    xmlValidatePopElement
    xmlValidatePushCData
    xmlValidatePushElement
    xmlValidateRoot
    xmlValidityErrorFunc
    xmlValidityWarningFunc

    Module xinclude:

    XINCLUDE_FALLBACK
    XINCLUDE_HREF
    XINCLUDE_NODE
    XINCLUDE_NS
    XINCLUDE_OLD_NS
    XINCLUDE_PARSE
    XINCLUDE_PARSE_ENCODING
    XINCLUDE_PARSE_TEXT
    XINCLUDE_PARSE_XML
    XINCLUDE_PARSE_XPOINTER
    xmlXIncludeCtxt
    xmlXIncludeCtxtPtr
    xmlXIncludeFreeContext
    xmlXIncludeNewContext
    xmlXIncludeProcess
    xmlXIncludeProcessFlags
    xmlXIncludeProcessFlagsData
    xmlXIncludeProcessNode
    xmlXIncludeProcessTree
    xmlXIncludeProcessTreeFlags
    xmlXIncludeProcessTreeFlagsData
    xmlXIncludeSetFlags

    Module xlink:

    XLINK_ACTUATE_AUTO
    XLINK_ACTUATE_NONE
    XLINK_ACTUATE_ONREQUEST
    XLINK_SHOW_EMBED
    XLINK_SHOW_NEW
    XLINK_SHOW_NONE
    XLINK_SHOW_REPLACE
    XLINK_TYPE_EXTENDED
    XLINK_TYPE_EXTENDED_SET
    XLINK_TYPE_NONE
    XLINK_TYPE_SIMPLE
    _xlinkHandler
    xlinkActuate
    xlinkExtendedLinkFunk
    xlinkExtendedLinkSetFunk
    xlinkGetDefaultDetect
    xlinkGetDefaultHandler
    xlinkHRef
    xlinkHandler
    xlinkHandlerPtr
    xlinkIsLink
    xlinkNodeDetectFunc
    xlinkRole
    xlinkSetDefaultDetect
    xlinkSetDefaultHandler
    xlinkShow
    xlinkSimpleLinkFunk
    xlinkTitle
    xlinkType

    Module xmlIO:

    _xmlOutputBuffer
    _xmlParserInputBuffer
    xmlAllocOutputBuffer
    xmlAllocParserInputBuffer
    xmlCheckFilename
    xmlCheckHTTPInput
    xmlCleanupInputCallbacks
    xmlCleanupOutputCallbacks
    xmlFileClose
    xmlFileMatch
    xmlFileOpen
    xmlFileRead
    xmlFreeParserInputBuffer
    xmlIOFTPClose
    xmlIOFTPMatch
    xmlIOFTPOpen
    xmlIOFTPRead
    xmlIOHTTPClose
    xmlIOHTTPMatch
    xmlIOHTTPOpen
    xmlIOHTTPOpenW
    xmlIOHTTPRead
    xmlInputCloseCallback
    xmlInputMatchCallback
    xmlInputOpenCallback
    xmlInputReadCallback
    xmlNoNetExternalEntityLoader
    xmlNormalizeWindowsPath
    xmlOutputBufferClose
    xmlOutputBufferCreateBuffer
    xmlOutputBufferCreateFd
    xmlOutputBufferCreateFile
    xmlOutputBufferCreateFilename
    xmlOutputBufferCreateIO
    xmlOutputBufferFlush
    xmlOutputBufferGetContent
    xmlOutputBufferGetSize
    xmlOutputBufferWrite
    xmlOutputBufferWriteEscape
    xmlOutputBufferWriteString
    xmlOutputCloseCallback
    xmlOutputMatchCallback
    xmlOutputOpenCallback
    xmlOutputWriteCallback
    xmlParserGetDirectory
    xmlParserInputBufferCreateFd
    xmlParserInputBufferCreateFile
    xmlParserInputBufferCreateFilename
    xmlParserInputBufferCreateIO
    xmlParserInputBufferCreateMem
    xmlParserInputBufferCreateStatic
    xmlParserInputBufferGrow
    xmlParserInputBufferPush
    xmlParserInputBufferRead
    xmlPopInputCallbacks
    xmlRegisterDefaultInputCallbacks
    xmlRegisterDefaultOutputCallbacks
    xmlRegisterHTTPPostCallbacks
    xmlRegisterInputCallbacks
    xmlRegisterOutputCallbacks

    Module xmlautomata:

    xmlAutomata
    xmlAutomataCompile
    xmlAutomataGetInitState
    xmlAutomataIsDeterminist
    xmlAutomataNewAllTrans
    xmlAutomataNewCountTrans
    xmlAutomataNewCountTrans2
    xmlAutomataNewCountedTrans
    xmlAutomataNewCounter
    xmlAutomataNewCounterTrans
    xmlAutomataNewEpsilon
    xmlAutomataNewNegTrans
    xmlAutomataNewOnceTrans
    xmlAutomataNewOnceTrans2
    xmlAutomataNewState
    xmlAutomataNewTransition
    xmlAutomataNewTransition2
    xmlAutomataPtr
    xmlAutomataSetFinalState
    xmlAutomataState
    xmlAutomataStatePtr
    xmlFreeAutomata
    xmlNewAutomata

    Module xmlerror:

    XML_BUF_OVERFLOW
    XML_C14N_CREATE_CTXT
    XML_C14N_CREATE_STACK
    XML_C14N_INVALID_NODE
    XML_C14N_RELATIVE_NAMESPACE
    XML_C14N_REQUIRES_UTF8
    XML_C14N_UNKNOW_NODE
    XML_CATALOG_ENTRY_BROKEN
    XML_CATALOG_MISSING_ATTR
    XML_CATALOG_NOT_CATALOG
    XML_CATALOG_PREFER_VALUE
    XML_CATALOG_RECURSION
    XML_CHECK_ENTITY_TYPE
    XML_CHECK_FOUND_ATTRIBUTE
    XML_CHECK_FOUND_CDATA
    XML_CHECK_FOUND_COMMENT
    XML_CHECK_FOUND_DOCTYPE
    XML_CHECK_FOUND_ELEMENT
    XML_CHECK_FOUND_ENTITY
    XML_CHECK_FOUND_ENTITYREF
    XML_CHECK_FOUND_FRAGMENT
    XML_CHECK_FOUND_NOTATION
    XML_CHECK_FOUND_PI
    XML_CHECK_FOUND_TEXT
    XML_CHECK_NAME_NOT_NULL
    XML_CHECK_NOT_ATTR
    XML_CHECK_NOT_ATTR_DECL
    XML_CHECK_NOT_DTD
    XML_CHECK_NOT_ELEM_DECL
    XML_CHECK_NOT_ENTITY_DECL
    XML_CHECK_NOT_NCNAME
    XML_CHECK_NOT_NS_DECL
    XML_CHECK_NOT_UTF8
    XML_CHECK_NO_DICT
    XML_CHECK_NO_DOC
    XML_CHECK_NO_ELEM
    XML_CHECK_NO_HREF
    XML_CHECK_NO_NAME
    XML_CHECK_NO_NEXT
    XML_CHECK_NO_PARENT
    XML_CHECK_NO_PREV
    XML_CHECK_NS_ANCESTOR
    XML_CHECK_NS_SCOPE
    XML_CHECK_OUTSIDE_DICT
    XML_CHECK_UNKNOWN_NODE
    XML_CHECK_WRONG_DOC
    XML_CHECK_WRONG_NAME
    XML_CHECK_WRONG_NEXT
    XML_CHECK_WRONG_PARENT
    XML_CHECK_WRONG_PREV
    XML_DTD_ATTRIBUTE_DEFAULT
    XML_DTD_ATTRIBUTE_REDEFINED
    XML_DTD_ATTRIBUTE_VALUE
    XML_DTD_CONTENT_ERROR
    XML_DTD_CONTENT_MODEL
    XML_DTD_CONTENT_NOT_DETERMINIST
    XML_DTD_DIFFERENT_PREFIX
    XML_DTD_DUP_TOKEN
    XML_DTD_ELEM_DEFAULT_NAMESPACE
    XML_DTD_ELEM_NAMESPACE
    XML_DTD_ELEM_REDEFINED
    XML_DTD_EMPTY_NOTATION
    XML_DTD_ENTITY_TYPE
    XML_DTD_ID_FIXED
    XML_DTD_ID_REDEFINED
    XML_DTD_ID_SUBSET
    XML_DTD_INVALID_CHILD
    XML_DTD_INVALID_DEFAULT
    XML_DTD_LOAD_ERROR
    XML_DTD_MISSING_ATTRIBUTE
    XML_DTD_MIXED_CORRUPT
    XML_DTD_MULTIPLE_ID
    XML_DTD_NOTATION_REDEFINED
    XML_DTD_NOTATION_VALUE
    XML_DTD_NOT_EMPTY
    XML_DTD_NOT_PCDATA
    XML_DTD_NOT_STANDALONE
    XML_DTD_NO_DOC
    XML_DTD_NO_DTD
    XML_DTD_NO_ELEM_NAME
    XML_DTD_NO_PREFIX
    XML_DTD_NO_ROOT
    XML_DTD_ROOT_NAME
    XML_DTD_STANDALONE_DEFAULTED
    XML_DTD_STANDALONE_WHITE_SPACE
    XML_DTD_UNKNOWN_ATTRIBUTE
    XML_DTD_UNKNOWN_ELEM
    XML_DTD_UNKNOWN_ENTITY
    XML_DTD_UNKNOWN_ID
    XML_DTD_UNKNOWN_NOTATION
    XML_DTD_XMLID_TYPE
    XML_DTD_XMLID_VALUE
    XML_ERR_ATTLIST_NOT_FINISHED
    XML_ERR_ATTLIST_NOT_STARTED
    XML_ERR_ATTRIBUTE_NOT_FINISHED
    XML_ERR_ATTRIBUTE_NOT_STARTED
    XML_ERR_ATTRIBUTE_REDEFINED
    XML_ERR_ATTRIBUTE_WITHOUT_VALUE
    XML_ERR_CDATA_NOT_FINISHED
    XML_ERR_CHARREF_AT_EOF
    XML_ERR_CHARREF_IN_DTD
    XML_ERR_CHARREF_IN_EPILOG
    XML_ERR_CHARREF_IN_PROLOG
    XML_ERR_COMMENT_NOT_FINISHED
    XML_ERR_CONDSEC_INVALID
    XML_ERR_CONDSEC_INVALID_KEYWORD
    XML_ERR_CONDSEC_NOT_FINISHED
    XML_ERR_CONDSEC_NOT_STARTED
    XML_ERR_DOCTYPE_NOT_FINISHED
    XML_ERR_DOCUMENT_EMPTY
    XML_ERR_DOCUMENT_END
    XML_ERR_DOCUMENT_START
    XML_ERR_ELEMCONTENT_NOT_FINISHED
    XML_ERR_ELEMCONTENT_NOT_STARTED
    XML_ERR_ENCODING_NAME
    XML_ERR_ENTITYREF_AT_EOF
    XML_ERR_ENTITYREF_IN_DTD
    XML_ERR_ENTITYREF_IN_EPILOG
    XML_ERR_ENTITYREF_IN_PROLOG
    XML_ERR_ENTITYREF_NO_NAME
    XML_ERR_ENTITYREF_SEMICOL_MISSING
    XML_ERR_ENTITY_BOUNDARY
    XML_ERR_ENTITY_CHAR_ERROR
    XML_ERR_ENTITY_IS_EXTERNAL
    XML_ERR_ENTITY_IS_PARAMETER
    XML_ERR_ENTITY_LOOP
    XML_ERR_ENTITY_NOT_FINISHED
    XML_ERR_ENTITY_NOT_STARTED
    XML_ERR_ENTITY_PE_INTERNAL
    XML_ERR_ENTITY_PROCESSING
    XML_ERR_EQUAL_REQUIRED
    XML_ERR_ERROR
    XML_ERR_EXTRA_CONTENT
    XML_ERR_EXT_ENTITY_STANDALONE
    XML_ERR_EXT_SUBSET_NOT_FINISHED
    XML_ERR_FATAL
    XML_ERR_GT_REQUIRED
    XML_ERR_HYPHEN_IN_COMMENT
    XML_ERR_INTERNAL_ERROR
    XML_ERR_INVALID_CHAR
    XML_ERR_INVALID_CHARREF
    XML_ERR_INVALID_DEC_CHARREF
    XML_ERR_INVALID_ENCODING
    XML_ERR_INVALID_HEX_CHARREF
    XML_ERR_INVALID_URI
    XML_ERR_LITERAL_NOT_FINISHED
    XML_ERR_LITERAL_NOT_STARTED
    XML_ERR_LTSLASH_REQUIRED
    XML_ERR_LT_IN_ATTRIBUTE
    XML_ERR_LT_REQUIRED
    XML_ERR_MISPLACED_CDATA_END
    XML_ERR_MISSING_ENCODING
    XML_ERR_MIXED_NOT_FINISHED
    XML_ERR_MIXED_NOT_STARTED
    XML_ERR_NAME_REQUIRED
    XML_ERR_NAME_TOO_LONG
    XML_ERR_NMTOKEN_REQUIRED
    XML_ERR_NONE
    XML_ERR_NOTATION_NOT_FINISHED
    XML_ERR_NOTATION_NOT_STARTED
    XML_ERR_NOTATION_PROCESSING
    XML_ERR_NOT_STANDALONE
    XML_ERR_NOT_WELL_BALANCED
    XML_ERR_NO_DTD
    XML_ERR_NO_MEMORY
    XML_ERR_NS_DECL_ERROR
    XML_ERR_OK
    XML_ERR_PCDATA_REQUIRED
    XML_ERR_PEREF_AT_EOF
    XML_ERR_PEREF_IN_EPILOG
    XML_ERR_PEREF_IN_INT_SUBSET
    XML_ERR_PEREF_IN_PROLOG
    XML_ERR_PEREF_NO_NAME
    XML_ERR_PEREF_SEMICOL_MISSING
    XML_ERR_PI_NOT_FINISHED
    XML_ERR_PI_NOT_STARTED
    XML_ERR_PUBID_REQUIRED
    XML_ERR_RESERVED_XML_NAME
    XML_ERR_SEPARATOR_REQUIRED
    XML_ERR_SPACE_REQUIRED
    XML_ERR_STANDALONE_VALUE
    XML_ERR_STRING_NOT_CLOSED
    XML_ERR_STRING_NOT_STARTED
    XML_ERR_TAG_NAME_MISMATCH
    XML_ERR_TAG_NOT_FINISHED
    XML_ERR_UNDECLARED_ENTITY
    XML_ERR_UNKNOWN_ENCODING
    XML_ERR_UNKNOWN_VERSION
    XML_ERR_UNPARSED_ENTITY
    XML_ERR_UNSUPPORTED_ENCODING
    XML_ERR_URI_FRAGMENT
    XML_ERR_URI_REQUIRED
    XML_ERR_USER_STOP
    XML_ERR_VALUE_REQUIRED
    XML_ERR_VERSION_MISMATCH
    XML_ERR_VERSION_MISSING
    XML_ERR_WARNING
    XML_ERR_XMLDECL_NOT_FINISHED
    XML_ERR_XMLDECL_NOT_STARTED
    XML_FROM_BUFFER
    XML_FROM_C14N
    XML_FROM_CATALOG
    XML_FROM_CHECK
    XML_FROM_DATATYPE
    XML_FROM_DTD
    XML_FROM_FTP
    XML_FROM_HTML
    XML_FROM_HTTP
    XML_FROM_I18N
    XML_FROM_IO
    XML_FROM_MEMORY
    XML_FROM_MODULE
    XML_FROM_NAMESPACE
    XML_FROM_NONE
    XML_FROM_OUTPUT
    XML_FROM_PARSER
    XML_FROM_REGEXP
    XML_FROM_RELAXNGP
    XML_FROM_RELAXNGV
    XML_FROM_SCHEMASP
    XML_FROM_SCHEMASV
    XML_FROM_SCHEMATRONV
    XML_FROM_TREE
    XML_FROM_URI
    XML_FROM_VALID
    XML_FROM_WRITER
    XML_FROM_XINCLUDE
    XML_FROM_XPATH
    XML_FROM_XPOINTER
    XML_FROM_XSLT
    XML_FTP_ACCNT
    XML_FTP_EPSV_ANSWER
    XML_FTP_PASV_ANSWER
    XML_FTP_URL_SYNTAX
    XML_HTML_STRUCURE_ERROR
    XML_HTML_UNKNOWN_TAG
    XML_HTTP_UNKNOWN_HOST
    XML_HTTP_URL_SYNTAX
    XML_HTTP_USE_IP
    XML_I18N_CONV_FAILED
    XML_I18N_EXCESS_HANDLER
    XML_I18N_NO_HANDLER
    XML_I18N_NO_NAME
    XML_I18N_NO_OUTPUT
    XML_IO_BUFFER_FULL
    XML_IO_EACCES
    XML_IO_EADDRINUSE
    XML_IO_EAFNOSUPPORT
    XML_IO_EAGAIN
    XML_IO_EALREADY
    XML_IO_EBADF
    XML_IO_EBADMSG
    XML_IO_EBUSY
    XML_IO_ECANCELED
    XML_IO_ECHILD
    XML_IO_ECONNREFUSED
    XML_IO_EDEADLK
    XML_IO_EDOM
    XML_IO_EEXIST
    XML_IO_EFAULT
    XML_IO_EFBIG
    XML_IO_EINPROGRESS
    XML_IO_EINTR
    XML_IO_EINVAL
    XML_IO_EIO
    XML_IO_EISCONN
    XML_IO_EISDIR
    XML_IO_EMFILE
    XML_IO_EMLINK
    XML_IO_EMSGSIZE
    XML_IO_ENAMETOOLONG
    XML_IO_ENCODER
    XML_IO_ENETUNREACH
    XML_IO_ENFILE
    XML_IO_ENODEV
    XML_IO_ENOENT
    XML_IO_ENOEXEC
    XML_IO_ENOLCK
    XML_IO_ENOMEM
    XML_IO_ENOSPC
    XML_IO_ENOSYS
    XML_IO_ENOTDIR
    XML_IO_ENOTEMPTY
    XML_IO_ENOTSOCK
    XML_IO_ENOTSUP
    XML_IO_ENOTTY
    XML_IO_ENXIO
    XML_IO_EPERM
    XML_IO_EPIPE
    XML_IO_ERANGE
    XML_IO_EROFS
    XML_IO_ESPIPE
    XML_IO_ESRCH
    XML_IO_ETIMEDOUT
    XML_IO_EXDEV
    XML_IO_FLUSH
    XML_IO_LOAD_ERROR
    XML_IO_NETWORK_ATTEMPT
    XML_IO_NO_INPUT
    XML_IO_UNKNOWN
    XML_IO_WRITE
    XML_MODULE_CLOSE
    XML_MODULE_OPEN
    XML_NS_ERR_ATTRIBUTE_REDEFINED
    XML_NS_ERR_COLON
    XML_NS_ERR_EMPTY
    XML_NS_ERR_QNAME
    XML_NS_ERR_UNDEFINED_NAMESPACE
    XML_NS_ERR_XML_NAMESPACE
    XML_REGEXP_COMPILE_ERROR
    XML_RNGP_ANYNAME_ATTR_ANCESTOR
    XML_RNGP_ATTRIBUTE_CHILDREN
    XML_RNGP_ATTRIBUTE_CONTENT
    XML_RNGP_ATTRIBUTE_EMPTY
    XML_RNGP_ATTRIBUTE_NOOP
    XML_RNGP_ATTR_CONFLICT
    XML_RNGP_CHOICE_CONTENT
    XML_RNGP_CHOICE_EMPTY
    XML_RNGP_CREATE_FAILURE
    XML_RNGP_DATA_CONTENT
    XML_RNGP_DEFINE_CREATE_FAILED
    XML_RNGP_DEFINE_EMPTY
    XML_RNGP_DEFINE_MISSING
    XML_RNGP_DEFINE_NAME_MISSING
    XML_RNGP_DEF_CHOICE_AND_INTERLEAVE
    XML_RNGP_ELEMENT_CONTENT
    XML_RNGP_ELEMENT_EMPTY
    XML_RNGP_ELEMENT_NAME
    XML_RNGP_ELEMENT_NO_CONTENT
    XML_RNGP_ELEM_CONTENT_EMPTY
    XML_RNGP_ELEM_CONTENT_ERROR
    XML_RNGP_ELEM_TEXT_CONFLICT
    XML_RNGP_EMPTY
    XML_RNGP_EMPTY_CONSTRUCT
    XML_RNGP_EMPTY_CONTENT
    XML_RNGP_EMPTY_NOT_EMPTY
    XML_RNGP_ERROR_TYPE_LIB
    XML_RNGP_EXCEPT_EMPTY
    XML_RNGP_EXCEPT_MISSING
    XML_RNGP_EXCEPT_MULTIPLE
    XML_RNGP_EXCEPT_NO_CONTENT
    XML_RNGP_EXTERNALREF_EMTPY
    XML_RNGP_EXTERNALREF_RECURSE
    XML_RNGP_EXTERNAL_REF_FAILURE
    XML_RNGP_FORBIDDEN_ATTRIBUTE
    XML_RNGP_FOREIGN_ELEMENT
    XML_RNGP_GRAMMAR_CONTENT
    XML_RNGP_GRAMMAR_EMPTY
    XML_RNGP_GRAMMAR_MISSING
    XML_RNGP_GRAMMAR_NO_START
    XML_RNGP_GROUP_ATTR_CONFLICT
    XML_RNGP_HREF_ERROR
    XML_RNGP_INCLUDE_EMPTY
    XML_RNGP_INCLUDE_FAILURE
    XML_RNGP_INCLUDE_RECURSE
    XML_RNGP_INTERLEAVE_ADD
    XML_RNGP_INTERLEAVE_CREATE_FAILED
    XML_RNGP_INTERLEAVE_EMPTY
    XML_RNGP_INTERLEAVE_NO_CONTENT
    XML_RNGP_INVALID_DEFINE_NAME
    XML_RNGP_INVALID_URI
    XML_RNGP_INVALID_VALUE
    XML_RNGP_MISSING_HREF
    XML_RNGP_NAME_MISSING
    XML_RNGP_NEED_COMBINE
    XML_RNGP_NOTALLOWED_NOT_EMPTY
    XML_RNGP_NSNAME_ATTR_ANCESTOR
    XML_RNGP_NSNAME_NO_NS
    XML_RNGP_PARAM_FORBIDDEN
    XML_RNGP_PARAM_NAME_MISSING
    XML_RNGP_PARENTREF_CREATE_FAILED
    XML_RNGP_PARENTREF_NAME_INVALID
    XML_RNGP_PARENTREF_NOT_EMPTY
    XML_RNGP_PARENTREF_NO_NAME
    XML_RNGP_PARENTREF_NO_PARENT
    XML_RNGP_PARSE_ERROR
    XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME
    XML_RNGP_PAT_ATTR_ATTR
    XML_RNGP_PAT_ATTR_ELEM
    XML_RNGP_PAT_DATA_EXCEPT_ATTR
    XML_RNGP_PAT_DATA_EXCEPT_ELEM
    XML_RNGP_PAT_DATA_EXCEPT_EMPTY
    XML_RNGP_PAT_DATA_EXCEPT_GROUP
    XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE
    XML_RNGP_PAT_DATA_EXCEPT_LIST
    XML_RNGP_PAT_DATA_EXCEPT_ONEMORE
    XML_RNGP_PAT_DATA_EXCEPT_REF
    XML_RNGP_PAT_DATA_EXCEPT_TEXT
    XML_RNGP_PAT_LIST_ATTR
    XML_RNGP_PAT_LIST_ELEM
    XML_RNGP_PAT_LIST_INTERLEAVE
    XML_RNGP_PAT_LIST_LIST
    XML_RNGP_PAT_LIST_REF
    XML_RNGP_PAT_LIST_TEXT
    XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME
    XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME
    XML_RNGP_PAT_ONEMORE_GROUP_ATTR
    XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR
    XML_RNGP_PAT_START_ATTR
    XML_RNGP_PAT_START_DATA
    XML_RNGP_PAT_START_EMPTY
    XML_RNGP_PAT_START_GROUP
    XML_RNGP_PAT_START_INTERLEAVE
    XML_RNGP_PAT_START_LIST
    XML_RNGP_PAT_START_ONEMORE
    XML_RNGP_PAT_START_TEXT
    XML_RNGP_PAT_START_VALUE
    XML_RNGP_PREFIX_UNDEFINED
    XML_RNGP_REF_CREATE_FAILED
    XML_RNGP_REF_CYCLE
    XML_RNGP_REF_NAME_INVALID
    XML_RNGP_REF_NOT_EMPTY
    XML_RNGP_REF_NO_DEF
    XML_RNGP_REF_NO_NAME
    XML_RNGP_START_CHOICE_AND_INTERLEAVE
    XML_RNGP_START_CONTENT
    XML_RNGP_START_EMPTY
    XML_RNGP_START_MISSING
    XML_RNGP_TEXT_EXPECTED
    XML_RNGP_TEXT_HAS_CHILD
    XML_RNGP_TYPE_MISSING
    XML_RNGP_TYPE_NOT_FOUND
    XML_RNGP_TYPE_VALUE
    XML_RNGP_UNKNOWN_ATTRIBUTE
    XML_RNGP_UNKNOWN_COMBINE
    XML_RNGP_UNKNOWN_CONSTRUCT
    XML_RNGP_UNKNOWN_TYPE_LIB
    XML_RNGP_URI_FRAGMENT
    XML_RNGP_URI_NOT_ABSOLUTE
    XML_RNGP_VALUE_EMPTY
    XML_RNGP_VALUE_NO_CONTENT
    XML_RNGP_XMLNS_NAME
    XML_RNGP_XML_NS
    XML_SAVE_CHAR_INVALID
    XML_SAVE_NOT_UTF8
    XML_SAVE_NO_DOCTYPE
    XML_SAVE_UNKNOWN_ENCODING
    XML_SCHEMAP_AG_PROPS_CORRECT
    XML_SCHEMAP_ATTRFORMDEFAULT_VALUE
    XML_SCHEMAP_ATTRGRP_NONAME_NOREF
    XML_SCHEMAP_ATTR_NONAME_NOREF
    XML_SCHEMAP_AU_PROPS_CORRECT
    XML_SCHEMAP_AU_PROPS_CORRECT_2
    XML_SCHEMAP_A_PROPS_CORRECT_2
    XML_SCHEMAP_A_PROPS_CORRECT_3
    XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF
    XML_SCHEMAP_COS_ALL_LIMITED
    XML_SCHEMAP_COS_CT_EXTENDS_1_1
    XML_SCHEMAP_COS_CT_EXTENDS_1_2
    XML_SCHEMAP_COS_CT_EXTENDS_1_3
    XML_SCHEMAP_COS_ST_DERIVED_OK_2_1
    XML_SCHEMAP_COS_ST_DERIVED_OK_2_2
    XML_SCHEMAP_COS_ST_RESTRICTS_1_1
    XML_SCHEMAP_COS_ST_RESTRICTS_1_2
    XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1
    XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2
    XML_SCHEMAP_COS_ST_RESTRICTS_2_1
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4
    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5
    XML_SCHEMAP_COS_ST_RESTRICTS_3_1
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4
    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5
    XML_SCHEMAP_COS_VALID_DEFAULT_1
    XML_SCHEMAP_COS_VALID_DEFAULT_2_1
    XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1
    XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2
    XML_SCHEMAP_CT_PROPS_CORRECT_1
    XML_SCHEMAP_CT_PROPS_CORRECT_2
    XML_SCHEMAP_CT_PROPS_CORRECT_3
    XML_SCHEMAP_CT_PROPS_CORRECT_4
    XML_SCHEMAP_CT_PROPS_CORRECT_5
    XML_SCHEMAP_CVC_SIMPLE_TYPE
    XML_SCHEMAP_C_PROPS_CORRECT
    XML_SCHEMAP_DEF_AND_PREFIX
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2
    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3
    XML_SCHEMAP_ELEMFORMDEFAULT_VALUE
    XML_SCHEMAP_ELEM_DEFAULT_FIXED
    XML_SCHEMAP_ELEM_NONAME_NOREF
    XML_SCHEMAP_EXTENSION_NO_BASE
    XML_SCHEMAP_E_PROPS_CORRECT_2
    XML_SCHEMAP_E_PROPS_CORRECT_3
    XML_SCHEMAP_E_PROPS_CORRECT_4
    XML_SCHEMAP_E_PROPS_CORRECT_5
    XML_SCHEMAP_E_PROPS_CORRECT_6
    XML_SCHEMAP_FACET_NO_VALUE
    XML_SCHEMAP_FAILED_BUILD_IMPORT
    XML_SCHEMAP_FAILED_LOAD
    XML_SCHEMAP_FAILED_PARSE
    XML_SCHEMAP_GROUP_NONAME_NOREF
    XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI
    XML_SCHEMAP_IMPORT_REDEFINE_NSNAME
    XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI
    XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI
    XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI
    XML_SCHEMAP_INTERNAL
    XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE
    XML_SCHEMAP_INVALID_ATTR_COMBINATION
    XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION
    XML_SCHEMAP_INVALID_ATTR_NAME
    XML_SCHEMAP_INVALID_ATTR_USE
    XML_SCHEMAP_INVALID_BOOLEAN
    XML_SCHEMAP_INVALID_ENUM
    XML_SCHEMAP_INVALID_FACET
    XML_SCHEMAP_INVALID_FACET_VALUE
    XML_SCHEMAP_INVALID_MAXOCCURS
    XML_SCHEMAP_INVALID_MINOCCURS
    XML_SCHEMAP_INVALID_REF_AND_SUBTYPE
    XML_SCHEMAP_INVALID_WHITE_SPACE
    XML_SCHEMAP_MG_PROPS_CORRECT_1
    XML_SCHEMAP_MG_PROPS_CORRECT_2
    XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD
    XML_SCHEMAP_NOATTR_NOREF
    XML_SCHEMAP_NOROOT
    XML_SCHEMAP_NOTATION_NO_NAME
    XML_SCHEMAP_NOTHING_TO_PARSE
    XML_SCHEMAP_NOTYPE_NOREF
    XML_SCHEMAP_NOT_DETERMINISTIC
    XML_SCHEMAP_NOT_SCHEMA
    XML_SCHEMAP_NO_XMLNS
    XML_SCHEMAP_NO_XSI
    XML_SCHEMAP_PREFIX_UNDEFINED
    XML_SCHEMAP_P_PROPS_CORRECT_1
    XML_SCHEMAP_P_PROPS_CORRECT_2_1
    XML_SCHEMAP_P_PROPS_CORRECT_2_2
    XML_SCHEMAP_RECURSIVE
    XML_SCHEMAP_REDEFINED_ATTR
    XML_SCHEMAP_REDEFINED_ATTRGROUP
    XML_SCHEMAP_REDEFINED_ELEMENT
    XML_SCHEMAP_REDEFINED_GROUP
    XML_SCHEMAP_REDEFINED_NOTATION
    XML_SCHEMAP_REDEFINED_TYPE
    XML_SCHEMAP_REF_AND_CONTENT
    XML_SCHEMAP_REF_AND_SUBTYPE
    XML_SCHEMAP_REGEXP_INVALID
    XML_SCHEMAP_RESTRICTION_NONAME_NOREF
    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE
    XML_SCHEMAP_S4S_ATTR_MISSING
    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED
    XML_SCHEMAP_S4S_ELEM_MISSING
    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED
    XML_SCHEMAP_SIMPLETYPE_NONAME
    XML_SCHEMAP_SRC_ATTRIBUTE_1
    XML_SCHEMAP_SRC_ATTRIBUTE_2
    XML_SCHEMAP_SRC_ATTRIBUTE_3_1
    XML_SCHEMAP_SRC_ATTRIBUTE_3_2
    XML_SCHEMAP_SRC_ATTRIBUTE_4
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2
    XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3
    XML_SCHEMAP_SRC_CT_1
    XML_SCHEMAP_SRC_ELEMENT_1
    XML_SCHEMAP_SRC_ELEMENT_2_1
    XML_SCHEMAP_SRC_ELEMENT_2_2
    XML_SCHEMAP_SRC_ELEMENT_3
    XML_SCHEMAP_SRC_IMPORT
    XML_SCHEMAP_SRC_IMPORT_1_1
    XML_SCHEMAP_SRC_IMPORT_1_2
    XML_SCHEMAP_SRC_IMPORT_2
    XML_SCHEMAP_SRC_IMPORT_2_1
    XML_SCHEMAP_SRC_IMPORT_2_2
    XML_SCHEMAP_SRC_IMPORT_3_1
    XML_SCHEMAP_SRC_IMPORT_3_2
    XML_SCHEMAP_SRC_INCLUDE
    XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE
    XML_SCHEMAP_SRC_REDEFINE
    XML_SCHEMAP_SRC_RESOLVE
    XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE
    XML_SCHEMAP_SRC_SIMPLE_TYPE_1
    XML_SCHEMAP_SRC_SIMPLE_TYPE_2
    XML_SCHEMAP_SRC_SIMPLE_TYPE_3
    XML_SCHEMAP_SRC_SIMPLE_TYPE_4
    XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES
    XML_SCHEMAP_ST_PROPS_CORRECT_1
    XML_SCHEMAP_ST_PROPS_CORRECT_2
    XML_SCHEMAP_ST_PROPS_CORRECT_3
    XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE
    XML_SCHEMAP_TYPE_AND_SUBTYPE
    XML_SCHEMAP_UNION_NOT_EXPRESSIBLE
    XML_SCHEMAP_UNKNOWN_ALL_CHILD
    XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD
    XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD
    XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP
    XML_SCHEMAP_UNKNOWN_ATTR_CHILD
    XML_SCHEMAP_UNKNOWN_BASE_TYPE
    XML_SCHEMAP_UNKNOWN_CHOICE_CHILD
    XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD
    XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD
    XML_SCHEMAP_UNKNOWN_ELEM_CHILD
    XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD
    XML_SCHEMAP_UNKNOWN_FACET_CHILD
    XML_SCHEMAP_UNKNOWN_FACET_TYPE
    XML_SCHEMAP_UNKNOWN_GROUP_CHILD
    XML_SCHEMAP_UNKNOWN_IMPORT_CHILD
    XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD
    XML_SCHEMAP_UNKNOWN_LIST_CHILD
    XML_SCHEMAP_UNKNOWN_MEMBER_TYPE
    XML_SCHEMAP_UNKNOWN_NOTATION_CHILD
    XML_SCHEMAP_UNKNOWN_PREFIX
    XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD
    XML_SCHEMAP_UNKNOWN_REF
    XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD
    XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD
    XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD
    XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD
    XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD
    XML_SCHEMAP_UNKNOWN_TYPE
    XML_SCHEMAP_UNKNOWN_UNION_CHILD
    XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH
    XML_SCHEMAP_WARN_ATTR_REDECL_PROH
    XML_SCHEMAP_WARN_SKIP_SCHEMA
    XML_SCHEMAP_WARN_UNLOCATED_SCHEMA
    XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER
    XML_SCHEMATRONV_ASSERT
    XML_SCHEMATRONV_REPORT
    XML_SCHEMAV_ATTRINVALID
    XML_SCHEMAV_ATTRUNKNOWN
    XML_SCHEMAV_CONSTRUCT
    XML_SCHEMAV_CVC_ATTRIBUTE_1
    XML_SCHEMAV_CVC_ATTRIBUTE_2
    XML_SCHEMAV_CVC_ATTRIBUTE_3
    XML_SCHEMAV_CVC_ATTRIBUTE_4
    XML_SCHEMAV_CVC_AU
    XML_SCHEMAV_CVC_COMPLEX_TYPE_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3
    XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2
    XML_SCHEMAV_CVC_COMPLEX_TYPE_4
    XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1
    XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2
    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3
    XML_SCHEMAV_CVC_ELT_1
    XML_SCHEMAV_CVC_ELT_2
    XML_SCHEMAV_CVC_ELT_3_1
    XML_SCHEMAV_CVC_ELT_3_2_1
    XML_SCHEMAV_CVC_ELT_3_2_2
    XML_SCHEMAV_CVC_ELT_4_1
    XML_SCHEMAV_CVC_ELT_4_2
    XML_SCHEMAV_CVC_ELT_4_3
    XML_SCHEMAV_CVC_ELT_5_1_1
    XML_SCHEMAV_CVC_ELT_5_1_2
    XML_SCHEMAV_CVC_ELT_5_2_1
    XML_SCHEMAV_CVC_ELT_5_2_2_1
    XML_SCHEMAV_CVC_ELT_5_2_2_2_1
    XML_SCHEMAV_CVC_ELT_5_2_2_2_2
    XML_SCHEMAV_CVC_ELT_6
    XML_SCHEMAV_CVC_ELT_7
    XML_SCHEMAV_CVC_ENUMERATION_VALID
    XML_SCHEMAV_CVC_FACET_VALID
    XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID
    XML_SCHEMAV_CVC_IDC
    XML_SCHEMAV_CVC_LENGTH_VALID
    XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID
    XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID
    XML_SCHEMAV_CVC_MAXLENGTH_VALID
    XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID
    XML_SCHEMAV_CVC_MININCLUSIVE_VALID
    XML_SCHEMAV_CVC_MINLENGTH_VALID
    XML_SCHEMAV_CVC_PATTERN_VALID
    XML_SCHEMAV_CVC_TOTALDIGITS_VALID
    XML_SCHEMAV_CVC_TYPE_1
    XML_SCHEMAV_CVC_TYPE_2
    XML_SCHEMAV_CVC_TYPE_3_1_1
    XML_SCHEMAV_CVC_TYPE_3_1_2
    XML_SCHEMAV_CVC_WILDCARD
    XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING
    XML_SCHEMAV_ELEMCONT
    XML_SCHEMAV_ELEMENT_CONTENT
    XML_SCHEMAV_EXTRACONTENT
    XML_SCHEMAV_FACET
    XML_SCHEMAV_HAVEDEFAULT
    XML_SCHEMAV_INTERNAL
    XML_SCHEMAV_INVALIDATTR
    XML_SCHEMAV_INVALIDELEM
    XML_SCHEMAV_ISABSTRACT
    XML_SCHEMAV_MISC
    XML_SCHEMAV_MISSING
    XML_SCHEMAV_NOROLLBACK
    XML_SCHEMAV_NOROOT
    XML_SCHEMAV_NOTDETERMINIST
    XML_SCHEMAV_NOTEMPTY
    XML_SCHEMAV_NOTNILLABLE
    XML_SCHEMAV_NOTSIMPLE
    XML_SCHEMAV_NOTTOPLEVEL
    XML_SCHEMAV_NOTYPE
    XML_SCHEMAV_UNDECLAREDELEM
    XML_SCHEMAV_VALUE
    XML_SCHEMAV_WRONGELEM
    XML_TREE_INVALID_DEC
    XML_TREE_INVALID_HEX
    XML_TREE_NOT_UTF8
    XML_TREE_UNTERMINATED_ENTITY
    XML_WAR_CATALOG_PI
    XML_WAR_ENTITY_REDEFINED
    XML_WAR_LANG_VALUE
    XML_WAR_NS_COLUMN
    XML_WAR_NS_URI
    XML_WAR_NS_URI_RELATIVE
    XML_WAR_SPACE_VALUE
    XML_WAR_UNDECLARED_ENTITY
    XML_WAR_UNKNOWN_VERSION
    XML_XINCLUDE_BUILD_FAILED
    XML_XINCLUDE_DEPRECATED_NS
    XML_XINCLUDE_ENTITY_DEF_MISMATCH
    XML_XINCLUDE_FALLBACKS_IN_INCLUDE
    XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE
    XML_XINCLUDE_FRAGMENT_ID
    XML_XINCLUDE_HREF_URI
    XML_XINCLUDE_INCLUDE_IN_INCLUDE
    XML_XINCLUDE_INVALID_CHAR
    XML_XINCLUDE_MULTIPLE_ROOT
    XML_XINCLUDE_NO_FALLBACK
    XML_XINCLUDE_NO_HREF
    XML_XINCLUDE_PARSE_VALUE
    XML_XINCLUDE_RECURSION
    XML_XINCLUDE_TEXT_DOCUMENT
    XML_XINCLUDE_TEXT_FRAGMENT
    XML_XINCLUDE_UNKNOWN_ENCODING
    XML_XINCLUDE_XPTR_FAILED
    XML_XINCLUDE_XPTR_RESULT
    XML_XPATH_ENCODING_ERROR
    XML_XPATH_EXPRESSION_OK
    XML_XPATH_EXPR_ERROR
    XML_XPATH_INVALID_ARITY
    XML_XPATH_INVALID_CHAR_ERROR
    XML_XPATH_INVALID_CTXT_POSITION
    XML_XPATH_INVALID_CTXT_SIZE
    XML_XPATH_INVALID_OPERAND
    XML_XPATH_INVALID_PREDICATE_ERROR
    XML_XPATH_INVALID_TYPE
    XML_XPATH_MEMORY_ERROR
    XML_XPATH_NUMBER_ERROR
    XML_XPATH_START_LITERAL_ERROR
    XML_XPATH_UNCLOSED_ERROR
    XML_XPATH_UNDEF_PREFIX_ERROR
    XML_XPATH_UNDEF_VARIABLE_ERROR
    XML_XPATH_UNFINISHED_LITERAL_ERROR
    XML_XPATH_UNKNOWN_FUNC_ERROR
    XML_XPATH_VARIABLE_REF_ERROR
    XML_XPTR_CHILDSEQ_START
    XML_XPTR_EVAL_FAILED
    XML_XPTR_EXTRA_OBJECTS
    XML_XPTR_RESOURCE_ERROR
    XML_XPTR_SUB_RESOURCE_ERROR
    XML_XPTR_SYNTAX_ERROR
    XML_XPTR_UNKNOWN_SCHEME
    _xmlError
    initGenericErrorDefaultFunc
    xmlCopyError
    xmlCtxtGetLastError
    xmlCtxtResetLastError
    xmlError
    xmlErrorDomain
    xmlErrorLevel
    xmlErrorPtr
    xmlGenericErrorFunc
    xmlGetLastError
    xmlParserError
    xmlParserErrors
    xmlParserPrintFileContext
    xmlParserPrintFileInfo
    xmlParserValidityError
    xmlParserValidityWarning
    xmlParserWarning
    xmlResetError
    xmlResetLastError
    xmlSetGenericErrorFunc
    xmlSetStructuredErrorFunc
    xmlStructuredErrorFunc

    Module xmlexports:

    LIBXML_DLL_IMPORT
    XMLCALL
    XMLCDECL
    XMLPUBFUN
    XMLPUBVAR
    _REENTRANT

    Module xmlmemory:

    DEBUG_MEMORY
    xmlCleanupMemory
    xmlFreeFunc
    xmlGcMemGet
    xmlGcMemSetup
    xmlInitMemory
    xmlMalloc
    xmlMallocAtomic
    xmlMallocAtomicLoc
    xmlMallocFunc
    xmlMallocLoc
    xmlMemBlocks
    xmlMemDisplay
    xmlMemDisplayLast
    xmlMemFree
    xmlMemGet
    xmlMemMalloc
    xmlMemRealloc
    xmlMemSetup
    xmlMemShow
    xmlMemStrdup
    xmlMemStrdupLoc
    xmlMemUsed
    xmlMemoryDump
    xmlMemoryStrdup
    xmlRealloc
    xmlReallocFunc
    xmlReallocLoc
    xmlStrdupFunc

    Module xmlmodule:

    XML_MODULE_LAZY
    XML_MODULE_LOCAL
    xmlModule
    xmlModuleClose
    xmlModuleFree
    xmlModuleOpen
    xmlModuleOption
    xmlModulePtr
    xmlModuleSymbol

    Module xmlreader:

    XML_PARSER_DEFAULTATTRS
    XML_PARSER_LOADDTD
    XML_PARSER_SEVERITY_ERROR
    XML_PARSER_SEVERITY_VALIDITY_ERROR
    XML_PARSER_SEVERITY_VALIDITY_WARNING
    XML_PARSER_SEVERITY_WARNING
    XML_PARSER_SUBST_ENTITIES
    XML_PARSER_VALIDATE
    XML_READER_TYPE_ATTRIBUTE
    XML_READER_TYPE_CDATA
    XML_READER_TYPE_COMMENT
    XML_READER_TYPE_DOCUMENT
    XML_READER_TYPE_DOCUMENT_FRAGMENT
    XML_READER_TYPE_DOCUMENT_TYPE
    XML_READER_TYPE_ELEMENT
    XML_READER_TYPE_END_ELEMENT
    XML_READER_TYPE_END_ENTITY
    XML_READER_TYPE_ENTITY
    XML_READER_TYPE_ENTITY_REFERENCE
    XML_READER_TYPE_NONE
    XML_READER_TYPE_NOTATION
    XML_READER_TYPE_PROCESSING_INSTRUCTION
    XML_READER_TYPE_SIGNIFICANT_WHITESPACE
    XML_READER_TYPE_TEXT
    XML_READER_TYPE_WHITESPACE
    XML_READER_TYPE_XML_DECLARATION
    XML_TEXTREADER_MODE_CLOSED
    XML_TEXTREADER_MODE_EOF
    XML_TEXTREADER_MODE_ERROR
    XML_TEXTREADER_MODE_INITIAL
    XML_TEXTREADER_MODE_INTERACTIVE
    XML_TEXTREADER_MODE_READING
    xmlFreeTextReader
    xmlNewTextReader
    xmlNewTextReaderFilename
    xmlParserProperties
    xmlParserSeverities
    xmlReaderForDoc
    xmlReaderForFd
    xmlReaderForFile
    xmlReaderForIO
    xmlReaderForMemory
    xmlReaderNewDoc
    xmlReaderNewFd
    xmlReaderNewFile
    xmlReaderNewIO
    xmlReaderNewMemory
    xmlReaderNewWalker
    xmlReaderTypes
    xmlReaderWalker
    xmlTextReader
    xmlTextReaderAttributeCount
    xmlTextReaderBaseUri
    xmlTextReaderByteConsumed
    xmlTextReaderClose
    xmlTextReaderConstBaseUri
    xmlTextReaderConstEncoding
    xmlTextReaderConstLocalName
    xmlTextReaderConstName
    xmlTextReaderConstNamespaceUri
    xmlTextReaderConstPrefix
    xmlTextReaderConstString
    xmlTextReaderConstValue
    xmlTextReaderConstXmlLang
    xmlTextReaderConstXmlVersion
    xmlTextReaderCurrentDoc
    xmlTextReaderCurrentNode
    xmlTextReaderDepth
    xmlTextReaderErrorFunc
    xmlTextReaderExpand
    xmlTextReaderGetAttribute
    xmlTextReaderGetAttributeNo
    xmlTextReaderGetAttributeNs
    xmlTextReaderGetErrorHandler
    xmlTextReaderGetParserColumnNumber
    xmlTextReaderGetParserLineNumber
    xmlTextReaderGetParserProp
    xmlTextReaderGetRemainder
    xmlTextReaderHasAttributes
    xmlTextReaderHasValue
    xmlTextReaderIsDefault
    xmlTextReaderIsEmptyElement
    xmlTextReaderIsNamespaceDecl
    xmlTextReaderIsValid
    xmlTextReaderLocalName
    xmlTextReaderLocatorBaseURI
    xmlTextReaderLocatorLineNumber
    xmlTextReaderLocatorPtr
    xmlTextReaderLookupNamespace
    xmlTextReaderMode
    xmlTextReaderMoveToAttribute
    xmlTextReaderMoveToAttributeNo
    xmlTextReaderMoveToAttributeNs
    xmlTextReaderMoveToElement
    xmlTextReaderMoveToFirstAttribute
    xmlTextReaderMoveToNextAttribute
    xmlTextReaderName
    xmlTextReaderNamespaceUri
    xmlTextReaderNext
    xmlTextReaderNextSibling
    xmlTextReaderNodeType
    xmlTextReaderNormalization
    xmlTextReaderPrefix
    xmlTextReaderPreserve
    xmlTextReaderPreservePattern
    xmlTextReaderPtr
    xmlTextReaderQuoteChar
    xmlTextReaderRead
    xmlTextReaderReadAttributeValue
    xmlTextReaderReadInnerXml
    xmlTextReaderReadOuterXml
    xmlTextReaderReadState
    xmlTextReaderReadString
    xmlTextReaderRelaxNGSetSchema
    xmlTextReaderRelaxNGValidate
    xmlTextReaderRelaxNGValidateCtxt
    xmlTextReaderSchemaValidate
    xmlTextReaderSchemaValidateCtxt
    xmlTextReaderSetErrorHandler
    xmlTextReaderSetParserProp
    xmlTextReaderSetSchema
    xmlTextReaderSetStructuredErrorHandler
    xmlTextReaderSetup
    xmlTextReaderStandalone
    xmlTextReaderValue
    xmlTextReaderXmlLang

    Module xmlregexp:

    XML_EXP_ATOM
    XML_EXP_COUNT
    XML_EXP_EMPTY
    XML_EXP_FORBID
    XML_EXP_OR
    XML_EXP_SEQ
    emptyExp
    forbiddenExp
    xmlExpCtxt
    xmlExpCtxtNbCons
    xmlExpCtxtNbNodes
    xmlExpCtxtPtr
    xmlExpDump
    xmlExpExpDerive
    xmlExpFree
    xmlExpFreeCtxt
    xmlExpGetLanguage
    xmlExpGetStart
    xmlExpIsNillable
    xmlExpMaxToken
    xmlExpNewAtom
    xmlExpNewCtxt
    xmlExpNewOr
    xmlExpNewRange
    xmlExpNewSeq
    xmlExpNode
    xmlExpNodePtr
    xmlExpNodeType
    xmlExpParse
    xmlExpRef
    xmlExpStringDerive
    xmlExpSubsume
    xmlRegExecCallbacks
    xmlRegExecCtxt
    xmlRegExecCtxtPtr
    xmlRegExecErrInfo
    xmlRegExecNextValues
    xmlRegExecPushString
    xmlRegExecPushString2
    xmlRegFreeExecCtxt
    xmlRegFreeRegexp
    xmlRegNewExecCtxt
    xmlRegexp
    xmlRegexpCompile
    xmlRegexpExec
    xmlRegexpIsDeterminist
    xmlRegexpPrint
    xmlRegexpPtr

    Module xmlsave:

    XML_SAVE_AS_HTML
    XML_SAVE_AS_XML
    XML_SAVE_FORMAT
    XML_SAVE_NO_DECL
    XML_SAVE_NO_EMPTY
    XML_SAVE_NO_XHTML
    XML_SAVE_WSNONSIG
    XML_SAVE_XHTML
    xmlSaveClose
    xmlSaveCtxt
    xmlSaveCtxtPtr
    xmlSaveDoc
    xmlSaveFlush
    xmlSaveOption
    xmlSaveSetAttrEscape
    xmlSaveSetEscape
    xmlSaveToBuffer
    xmlSaveToFd
    xmlSaveToFilename
    xmlSaveToIO
    xmlSaveTree

    Module xmlschemas:

    XML_SCHEMAS_ERR_
    XML_SCHEMAS_ERR_ATTRINVALID
    XML_SCHEMAS_ERR_ATTRUNKNOWN
    XML_SCHEMAS_ERR_CONSTRUCT
    XML_SCHEMAS_ERR_ELEMCONT
    XML_SCHEMAS_ERR_EXTRACONTENT
    XML_SCHEMAS_ERR_FACET
    XML_SCHEMAS_ERR_HAVEDEFAULT
    XML_SCHEMAS_ERR_INTERNAL
    XML_SCHEMAS_ERR_INVALIDATTR
    XML_SCHEMAS_ERR_INVALIDELEM
    XML_SCHEMAS_ERR_ISABSTRACT
    XML_SCHEMAS_ERR_MISSING
    XML_SCHEMAS_ERR_NOROLLBACK
    XML_SCHEMAS_ERR_NOROOT
    XML_SCHEMAS_ERR_NOTDETERMINIST
    XML_SCHEMAS_ERR_NOTEMPTY
    XML_SCHEMAS_ERR_NOTNILLABLE
    XML_SCHEMAS_ERR_NOTSIMPLE
    XML_SCHEMAS_ERR_NOTTOPLEVEL
    XML_SCHEMAS_ERR_NOTYPE
    XML_SCHEMAS_ERR_OK
    XML_SCHEMAS_ERR_UNDECLAREDELEM
    XML_SCHEMAS_ERR_VALUE
    XML_SCHEMAS_ERR_WRONGELEM
    XML_SCHEMAS_ERR_XXX
    XML_SCHEMA_VAL_VC_I_CREATE
    xmlSchema
    xmlSchemaDump
    xmlSchemaFree
    xmlSchemaFreeParserCtxt
    xmlSchemaFreeValidCtxt
    xmlSchemaGetParserErrors
    xmlSchemaGetValidErrors
    xmlSchemaIsValid
    xmlSchemaNewDocParserCtxt
    xmlSchemaNewMemParserCtxt
    xmlSchemaNewParserCtxt
    xmlSchemaNewValidCtxt
    xmlSchemaParse
    xmlSchemaParserCtxt
    xmlSchemaParserCtxtPtr
    xmlSchemaPtr
    xmlSchemaSAXPlug
    xmlSchemaSAXPlugPtr
    xmlSchemaSAXPlugStruct
    xmlSchemaSAXUnplug
    xmlSchemaSetParserErrors
    xmlSchemaSetParserStructuredErrors
    xmlSchemaSetValidErrors
    xmlSchemaSetValidOptions
    xmlSchemaSetValidStructuredErrors
    xmlSchemaValidCtxt
    xmlSchemaValidCtxtGetOptions
    xmlSchemaValidCtxtGetParserCtxt
    xmlSchemaValidCtxtPtr
    xmlSchemaValidError
    xmlSchemaValidOption
    xmlSchemaValidateDoc
    xmlSchemaValidateFile
    xmlSchemaValidateOneElement
    xmlSchemaValidateSetFilename
    xmlSchemaValidateSetLocator
    xmlSchemaValidateStream
    xmlSchemaValidityErrorFunc
    xmlSchemaValidityLocatorFunc
    xmlSchemaValidityWarningFunc

    Module xmlschemastypes:

    XML_SCHEMA_WHITESPACE_COLLAPSE
    XML_SCHEMA_WHITESPACE_PRESERVE
    XML_SCHEMA_WHITESPACE_REPLACE
    XML_SCHEMA_WHITESPACE_UNKNOWN
    xmlSchemaCheckFacet
    xmlSchemaCleanupTypes
    xmlSchemaCollapseString
    xmlSchemaCompareValues
    xmlSchemaCompareValuesWhtsp
    xmlSchemaCopyValue
    xmlSchemaFreeFacet
    xmlSchemaFreeValue
    xmlSchemaGetBuiltInListSimpleTypeItemType
    xmlSchemaGetBuiltInType
    xmlSchemaGetCanonValue
    xmlSchemaGetCanonValueWhtsp
    xmlSchemaGetFacetValueAsULong
    xmlSchemaGetPredefinedType
    xmlSchemaGetValType
    xmlSchemaInitTypes
    xmlSchemaIsBuiltInTypeFacet
    xmlSchemaNewFacet
    xmlSchemaNewNOTATIONValue
    xmlSchemaNewQNameValue
    xmlSchemaNewStringValue
    xmlSchemaValPredefTypeNode
    xmlSchemaValPredefTypeNodeNoNorm
    xmlSchemaValidateFacet
    xmlSchemaValidateFacetWhtsp
    xmlSchemaValidateLengthFacet
    xmlSchemaValidateLengthFacetWhtsp
    xmlSchemaValidateListSimpleTypeFacet
    xmlSchemaValidatePredefinedType
    xmlSchemaValueAppend
    xmlSchemaValueGetAsBoolean
    xmlSchemaValueGetAsString
    xmlSchemaValueGetNext
    xmlSchemaWhiteSpaceReplace
    xmlSchemaWhitespaceValueType

    Module xmlstring:

    BAD_CAST
    xmlChar
    xmlCharStrdup
    xmlCharStrndup
    xmlCheckUTF8
    xmlGetUTF8Char
    xmlStrEqual
    xmlStrPrintf
    xmlStrQEqual
    xmlStrVPrintf
    xmlStrcasecmp
    xmlStrcasestr
    xmlStrcat
    xmlStrchr
    xmlStrcmp
    xmlStrdup
    xmlStrlen
    xmlStrncasecmp
    xmlStrncat
    xmlStrncatNew
    xmlStrncmp
    xmlStrndup
    xmlStrstr
    xmlStrsub
    xmlUTF8Charcmp
    xmlUTF8Size
    xmlUTF8Strlen
    xmlUTF8Strloc
    xmlUTF8Strndup
    xmlUTF8Strpos
    xmlUTF8Strsize
    xmlUTF8Strsub

    Module xmlunicode:

    xmlUCSIsAegeanNumbers
    xmlUCSIsAlphabeticPresentationForms
    xmlUCSIsArabic
    xmlUCSIsArabicPresentationFormsA
    xmlUCSIsArabicPresentationFormsB
    xmlUCSIsArmenian
    xmlUCSIsArrows
    xmlUCSIsBasicLatin
    xmlUCSIsBengali
    xmlUCSIsBlock
    xmlUCSIsBlockElements
    xmlUCSIsBopomofo
    xmlUCSIsBopomofoExtended
    xmlUCSIsBoxDrawing
    xmlUCSIsBraillePatterns
    xmlUCSIsBuhid
    xmlUCSIsByzantineMusicalSymbols
    xmlUCSIsCJKCompatibility
    xmlUCSIsCJKCompatibilityForms
    xmlUCSIsCJKCompatibilityIdeographs
    xmlUCSIsCJKCompatibilityIdeographsSupplement
    xmlUCSIsCJKRadicalsSupplement
    xmlUCSIsCJKSymbolsandPunctuation
    xmlUCSIsCJKUnifiedIdeographs
    xmlUCSIsCJKUnifiedIdeographsExtensionA
    xmlUCSIsCJKUnifiedIdeographsExtensionB
    xmlUCSIsCat
    xmlUCSIsCatC
    xmlUCSIsCatCc
    xmlUCSIsCatCf
    xmlUCSIsCatCo
    xmlUCSIsCatCs
    xmlUCSIsCatL
    xmlUCSIsCatLl
    xmlUCSIsCatLm
    xmlUCSIsCatLo
    xmlUCSIsCatLt
    xmlUCSIsCatLu
    xmlUCSIsCatM
    xmlUCSIsCatMc
    xmlUCSIsCatMe
    xmlUCSIsCatMn
    xmlUCSIsCatN
    xmlUCSIsCatNd
    xmlUCSIsCatNl
    xmlUCSIsCatNo
    xmlUCSIsCatP
    xmlUCSIsCatPc
    xmlUCSIsCatPd
    xmlUCSIsCatPe
    xmlUCSIsCatPf
    xmlUCSIsCatPi
    xmlUCSIsCatPo
    xmlUCSIsCatPs
    xmlUCSIsCatS
    xmlUCSIsCatSc
    xmlUCSIsCatSk
    xmlUCSIsCatSm
    xmlUCSIsCatSo
    xmlUCSIsCatZ
    xmlUCSIsCatZl
    xmlUCSIsCatZp
    xmlUCSIsCatZs
    xmlUCSIsCherokee
    xmlUCSIsCombiningDiacriticalMarks
    xmlUCSIsCombiningDiacriticalMarksforSymbols
    xmlUCSIsCombiningHalfMarks
    xmlUCSIsCombiningMarksforSymbols
    xmlUCSIsControlPictures
    xmlUCSIsCurrencySymbols
    xmlUCSIsCypriotSyllabary
    xmlUCSIsCyrillic
    xmlUCSIsCyrillicSupplement
    xmlUCSIsDeseret
    xmlUCSIsDevanagari
    xmlUCSIsDingbats
    xmlUCSIsEnclosedAlphanumerics
    xmlUCSIsEnclosedCJKLettersandMonths
    xmlUCSIsEthiopic
    xmlUCSIsGeneralPunctuation
    xmlUCSIsGeometricShapes
    xmlUCSIsGeorgian
    xmlUCSIsGothic
    xmlUCSIsGreek
    xmlUCSIsGreekExtended
    xmlUCSIsGreekandCoptic
    xmlUCSIsGujarati
    xmlUCSIsGurmukhi
    xmlUCSIsHalfwidthandFullwidthForms
    xmlUCSIsHangulCompatibilityJamo
    xmlUCSIsHangulJamo
    xmlUCSIsHangulSyllables
    xmlUCSIsHanunoo
    xmlUCSIsHebrew
    xmlUCSIsHighPrivateUseSurrogates
    xmlUCSIsHighSurrogates
    xmlUCSIsHiragana
    xmlUCSIsIPAExtensions
    xmlUCSIsIdeographicDescriptionCharacters
    xmlUCSIsKanbun
    xmlUCSIsKangxiRadicals
    xmlUCSIsKannada
    xmlUCSIsKatakana
    xmlUCSIsKatakanaPhoneticExtensions
    xmlUCSIsKhmer
    xmlUCSIsKhmerSymbols
    xmlUCSIsLao
    xmlUCSIsLatin1Supplement
    xmlUCSIsLatinExtendedA
    xmlUCSIsLatinExtendedAdditional
    xmlUCSIsLatinExtendedB
    xmlUCSIsLetterlikeSymbols
    xmlUCSIsLimbu
    xmlUCSIsLinearBIdeograms
    xmlUCSIsLinearBSyllabary
    xmlUCSIsLowSurrogates
    xmlUCSIsMalayalam
    xmlUCSIsMathematicalAlphanumericSymbols
    xmlUCSIsMathematicalOperators
    xmlUCSIsMiscellaneousMathematicalSymbolsA
    xmlUCSIsMiscellaneousMathematicalSymbolsB
    xmlUCSIsMiscellaneousSymbols
    xmlUCSIsMiscellaneousSymbolsandArrows
    xmlUCSIsMiscellaneousTechnical
    xmlUCSIsMongolian
    xmlUCSIsMusicalSymbols
    xmlUCSIsMyanmar
    xmlUCSIsNumberForms
    xmlUCSIsOgham
    xmlUCSIsOldItalic
    xmlUCSIsOpticalCharacterRecognition
    xmlUCSIsOriya
    xmlUCSIsOsmanya
    xmlUCSIsPhoneticExtensions
    xmlUCSIsPrivateUse
    xmlUCSIsPrivateUseArea
    xmlUCSIsRunic
    xmlUCSIsShavian
    xmlUCSIsSinhala
    xmlUCSIsSmallFormVariants
    xmlUCSIsSpacingModifierLetters
    xmlUCSIsSpecials
    xmlUCSIsSuperscriptsandSubscripts
    xmlUCSIsSupplementalArrowsA
    xmlUCSIsSupplementalArrowsB
    xmlUCSIsSupplementalMathematicalOperators
    xmlUCSIsSupplementaryPrivateUseAreaA
    xmlUCSIsSupplementaryPrivateUseAreaB
    xmlUCSIsSyriac
    xmlUCSIsTagalog
    xmlUCSIsTagbanwa
    xmlUCSIsTags
    xmlUCSIsTaiLe
    xmlUCSIsTaiXuanJingSymbols
    xmlUCSIsTamil
    xmlUCSIsTelugu
    xmlUCSIsThaana
    xmlUCSIsThai
    xmlUCSIsTibetan
    xmlUCSIsUgaritic
    xmlUCSIsUnifiedCanadianAboriginalSyllabics
    xmlUCSIsVariationSelectors
    xmlUCSIsVariationSelectorsSupplement
    xmlUCSIsYiRadicals
    xmlUCSIsYiSyllables
    xmlUCSIsYijingHexagramSymbols

    Module xmlversion:

    ATTRIBUTE_UNUSED
    DEBUG_MEMORY_LOCATION
    LIBXML_ATTR_ALLOC_SIZE
    LIBXML_ATTR_FORMAT
    LIBXML_AUTOMATA_ENABLED
    LIBXML_C14N_ENABLED
    LIBXML_CATALOG_ENABLED
    LIBXML_DEBUG_ENABLED
    LIBXML_DEBUG_RUNTIME
    LIBXML_DOCB_ENABLED
    LIBXML_DOTTED_VERSION
    LIBXML_EXPR_ENABLED
    LIBXML_FTP_ENABLED
    LIBXML_HTML_ENABLED
    LIBXML_HTTP_ENABLED
    LIBXML_ICONV_ENABLED
    LIBXML_ICU_ENABLED
    LIBXML_ISO8859X_ENABLED
    LIBXML_LEGACY_ENABLED
    LIBXML_LZMA_ENABLED
    LIBXML_MODULES_ENABLED
    LIBXML_MODULE_EXTENSION
    LIBXML_OUTPUT_ENABLED
    LIBXML_PATTERN_ENABLED
    LIBXML_PUSH_ENABLED
    LIBXML_READER_ENABLED
    LIBXML_REGEXP_ENABLED
    LIBXML_SAX1_ENABLED
    LIBXML_SCHEMAS_ENABLED
    LIBXML_SCHEMATRON_ENABLED
    LIBXML_TEST_VERSION
    LIBXML_THREAD_ALLOC_ENABLED
    LIBXML_THREAD_ENABLED
    LIBXML_TREE_ENABLED
    LIBXML_UNICODE_ENABLED
    LIBXML_VALID_ENABLED
    LIBXML_VERSION
    LIBXML_VERSION_EXTRA
    LIBXML_VERSION_STRING
    LIBXML_WRITER_ENABLED
    LIBXML_XINCLUDE_ENABLED
    LIBXML_XPATH_ENABLED
    LIBXML_XPTR_ENABLED
    LIBXML_ZLIB_ENABLED
    WITHOUT_TRIO
    WITH_TRIO
    xmlCheckVersion

    Module xmlwriter:

    xmlFreeTextWriter
    xmlNewTextWriter
    xmlNewTextWriterDoc
    xmlNewTextWriterFilename
    xmlNewTextWriterMemory
    xmlNewTextWriterPushParser
    xmlNewTextWriterTree
    xmlTextWriter
    xmlTextWriterEndAttribute
    xmlTextWriterEndCDATA
    xmlTextWriterEndComment
    xmlTextWriterEndDTD
    xmlTextWriterEndDTDAttlist
    xmlTextWriterEndDTDElement
    xmlTextWriterEndDTDEntity
    xmlTextWriterEndDocument
    xmlTextWriterEndElement
    xmlTextWriterEndPI
    xmlTextWriterFlush
    xmlTextWriterFullEndElement
    xmlTextWriterPtr
    xmlTextWriterSetIndent
    xmlTextWriterSetIndentString
    xmlTextWriterSetQuoteChar
    xmlTextWriterStartAttribute
    xmlTextWriterStartAttributeNS
    xmlTextWriterStartCDATA
    xmlTextWriterStartComment
    xmlTextWriterStartDTD
    xmlTextWriterStartDTDAttlist
    xmlTextWriterStartDTDElement
    xmlTextWriterStartDTDEntity
    xmlTextWriterStartDocument
    xmlTextWriterStartElement
    xmlTextWriterStartElementNS
    xmlTextWriterStartPI
    xmlTextWriterWriteAttribute
    xmlTextWriterWriteAttributeNS
    xmlTextWriterWriteBase64
    xmlTextWriterWriteBinHex
    xmlTextWriterWriteCDATA
    xmlTextWriterWriteComment
    xmlTextWriterWriteDTD
    xmlTextWriterWriteDTDAttlist
    xmlTextWriterWriteDTDElement
    xmlTextWriterWriteDTDEntity
    xmlTextWriterWriteDTDExternalEntity
    xmlTextWriterWriteDTDExternalEntityContents
    xmlTextWriterWriteDTDInternalEntity
    xmlTextWriterWriteDTDNotation
    xmlTextWriterWriteDocType
    xmlTextWriterWriteElement
    xmlTextWriterWriteElementNS
    xmlTextWriterWriteFormatAttribute
    xmlTextWriterWriteFormatAttributeNS
    xmlTextWriterWriteFormatCDATA
    xmlTextWriterWriteFormatComment
    xmlTextWriterWriteFormatDTD
    xmlTextWriterWriteFormatDTDAttlist
    xmlTextWriterWriteFormatDTDElement
    xmlTextWriterWriteFormatDTDInternalEntity
    xmlTextWriterWriteFormatElement
    xmlTextWriterWriteFormatElementNS
    xmlTextWriterWriteFormatPI
    xmlTextWriterWriteFormatRaw
    xmlTextWriterWriteFormatString
    xmlTextWriterWritePI
    xmlTextWriterWriteProcessingInstruction
    xmlTextWriterWriteRaw
    xmlTextWriterWriteRawLen
    xmlTextWriterWriteString
    xmlTextWriterWriteVFormatAttribute
    xmlTextWriterWriteVFormatAttributeNS
    xmlTextWriterWriteVFormatCDATA
    xmlTextWriterWriteVFormatComment
    xmlTextWriterWriteVFormatDTD
    xmlTextWriterWriteVFormatDTDAttlist
    xmlTextWriterWriteVFormatDTDElement
    xmlTextWriterWriteVFormatDTDInternalEntity
    xmlTextWriterWriteVFormatElement
    xmlTextWriterWriteVFormatElementNS
    xmlTextWriterWriteVFormatPI
    xmlTextWriterWriteVFormatRaw
    xmlTextWriterWriteVFormatString

    Module xpath:

    XML_XPATH_CHECKNS
    XML_XPATH_NOVAR
    XPATH_BOOLEAN
    XPATH_ENCODING_ERROR
    XPATH_EXPRESSION_OK
    XPATH_EXPR_ERROR
    XPATH_FORBID_VARIABLE_ERROR
    XPATH_INVALID_ARITY
    XPATH_INVALID_CHAR_ERROR
    XPATH_INVALID_CTXT
    XPATH_INVALID_CTXT_POSITION
    XPATH_INVALID_CTXT_SIZE
    XPATH_INVALID_OPERAND
    XPATH_INVALID_PREDICATE_ERROR
    XPATH_INVALID_TYPE
    XPATH_LOCATIONSET
    XPATH_MEMORY_ERROR
    XPATH_NODESET
    XPATH_NUMBER
    XPATH_NUMBER_ERROR
    XPATH_POINT
    XPATH_RANGE
    XPATH_STACK_ERROR
    XPATH_START_LITERAL_ERROR
    XPATH_STRING
    XPATH_UNCLOSED_ERROR
    XPATH_UNDEFINED
    XPATH_UNDEF_PREFIX_ERROR
    XPATH_UNDEF_VARIABLE_ERROR
    XPATH_UNFINISHED_LITERAL_ERROR
    XPATH_UNKNOWN_FUNC_ERROR
    XPATH_USERS
    XPATH_VARIABLE_REF_ERROR
    XPATH_XSLT_TREE
    XPTR_RESOURCE_ERROR
    XPTR_SUB_RESOURCE_ERROR
    XPTR_SYNTAX_ERROR
    _xmlNodeSet
    _xmlXPathAxis
    _xmlXPathContext
    _xmlXPathFunct
    _xmlXPathObject
    _xmlXPathParserContext
    _xmlXPathType
    _xmlXPathVariable
    xmlNodeSet
    xmlNodeSetPtr
    xmlXPathAxis
    xmlXPathAxisFunc
    xmlXPathAxisPtr
    xmlXPathCastBooleanToNumber
    xmlXPathCastBooleanToString
    xmlXPathCastNodeSetToBoolean
    xmlXPathCastNodeSetToNumber
    xmlXPathCastNodeSetToString
    xmlXPathCastNodeToNumber
    xmlXPathCastNodeToString
    xmlXPathCastNumberToBoolean
    xmlXPathCastNumberToString
    xmlXPathCastStringToBoolean
    xmlXPathCastStringToNumber
    xmlXPathCastToBoolean
    xmlXPathCastToNumber
    xmlXPathCastToString
    xmlXPathCmpNodes
    xmlXPathCompExpr
    xmlXPathCompExprPtr
    xmlXPathCompile
    xmlXPathCompiledEval
    xmlXPathCompiledEvalToBoolean
    xmlXPathContext
    xmlXPathContextPtr
    xmlXPathContextSetCache
    xmlXPathConvertBoolean
    xmlXPathConvertFunc
    xmlXPathConvertNumber
    xmlXPathConvertString
    xmlXPathCtxtCompile
    xmlXPathError
    xmlXPathEval
    xmlXPathEvalExpression
    xmlXPathEvalFunc
    xmlXPathEvalPredicate
    xmlXPathFreeCompExpr
    xmlXPathFreeContext
    xmlXPathFreeNodeSet
    xmlXPathFreeNodeSetList
    xmlXPathFreeObject
    xmlXPathFuncLookupFunc
    xmlXPathFuncPtr
    xmlXPathFunct
    xmlXPathFunction
    xmlXPathInit
    xmlXPathIsInf
    xmlXPathIsNaN
    xmlXPathNAN
    xmlXPathNINF
    xmlXPathNewContext
    xmlXPathNodeEval
    xmlXPathNodeSetCreate
    xmlXPathNodeSetGetLength
    xmlXPathNodeSetIsEmpty
    xmlXPathNodeSetItem
    xmlXPathObject
    xmlXPathObjectCopy
    xmlXPathObjectPtr
    xmlXPathObjectType
    xmlXPathOrderDocElems
    xmlXPathPINF
    xmlXPathParserContext
    xmlXPathParserContextPtr
    xmlXPathSetContextNode
    xmlXPathType
    xmlXPathTypePtr
    xmlXPathVariable
    xmlXPathVariableLookupFunc
    xmlXPathVariablePtr

    Module xpathInternals:

    CAST_TO_BOOLEAN
    CAST_TO_NUMBER
    CAST_TO_STRING
    CHECK_ARITY
    CHECK_ERROR
    CHECK_ERROR0
    CHECK_TYPE
    CHECK_TYPE0
    XP_ERROR
    XP_ERROR0
    valuePop
    valuePush
    xmlXPathAddValues
    xmlXPathBooleanFunction
    xmlXPathCeilingFunction
    xmlXPathCheckError
    xmlXPathCompareValues
    xmlXPathConcatFunction
    xmlXPathContainsFunction
    xmlXPathCountFunction
    xmlXPathDebugDumpCompExpr
    xmlXPathDebugDumpObject
    xmlXPathDifference
    xmlXPathDistinct
    xmlXPathDistinctSorted
    xmlXPathDivValues
    xmlXPathEmptyNodeSet
    xmlXPathEqualValues
    xmlXPathErr
    xmlXPathEvalExpr
    xmlXPathEvaluatePredicateResult
    xmlXPathFalseFunction
    xmlXPathFloorFunction
    xmlXPathFreeParserContext
    xmlXPathFunctionLookup
    xmlXPathFunctionLookupNS
    xmlXPathGetContextNode
    xmlXPathGetDocument
    xmlXPathGetError
    xmlXPathHasSameNodes
    xmlXPathIdFunction
    xmlXPathIntersection
    xmlXPathIsNodeType
    xmlXPathLangFunction
    xmlXPathLastFunction
    xmlXPathLeading
    xmlXPathLeadingSorted
    xmlXPathLocalNameFunction
    xmlXPathModValues
    xmlXPathMultValues
    xmlXPathNamespaceURIFunction
    xmlXPathNewBoolean
    xmlXPathNewCString
    xmlXPathNewFloat
    xmlXPathNewNodeSet
    xmlXPathNewNodeSetList
    xmlXPathNewParserContext
    xmlXPathNewString
    xmlXPathNewValueTree
    xmlXPathNextAncestor
    xmlXPathNextAncestorOrSelf
    xmlXPathNextAttribute
    xmlXPathNextChild
    xmlXPathNextDescendant
    xmlXPathNextDescendantOrSelf
    xmlXPathNextFollowing
    xmlXPathNextFollowingSibling
    xmlXPathNextNamespace
    xmlXPathNextParent
    xmlXPathNextPreceding
    xmlXPathNextPrecedingSibling
    xmlXPathNextSelf
    xmlXPathNodeLeading
    xmlXPathNodeLeadingSorted
    xmlXPathNodeSetAdd
    xmlXPathNodeSetAddNs
    xmlXPathNodeSetAddUnique
    xmlXPathNodeSetContains
    xmlXPathNodeSetDel
    xmlXPathNodeSetFreeNs
    xmlXPathNodeSetMerge
    xmlXPathNodeSetRemove
    xmlXPathNodeSetSort
    xmlXPathNodeTrailing
    xmlXPathNodeTrailingSorted
    xmlXPathNormalizeFunction
    xmlXPathNotEqualValues
    xmlXPathNotFunction
    xmlXPathNsLookup
    xmlXPathNumberFunction
    xmlXPathParseNCName
    xmlXPathParseName
    xmlXPathPopBoolean
    xmlXPathPopExternal
    xmlXPathPopNodeSet
    xmlXPathPopNumber
    xmlXPathPopString
    xmlXPathPositionFunction
    xmlXPathRegisterAllFunctions
    xmlXPathRegisterFunc
    xmlXPathRegisterFuncLookup
    xmlXPathRegisterFuncNS
    xmlXPathRegisterNs
    xmlXPathRegisterVariable
    xmlXPathRegisterVariableLookup
    xmlXPathRegisterVariableNS
    xmlXPathRegisteredFuncsCleanup
    xmlXPathRegisteredNsCleanup
    xmlXPathRegisteredVariablesCleanup
    xmlXPathReturnBoolean
    xmlXPathReturnEmptyNodeSet
    xmlXPathReturnEmptyString
    xmlXPathReturnExternal
    xmlXPathReturnFalse
    xmlXPathReturnNodeSet
    xmlXPathReturnNumber
    xmlXPathReturnString
    xmlXPathReturnTrue
    xmlXPathRoot
    xmlXPathRoundFunction
    xmlXPathSetArityError
    xmlXPathSetError
    xmlXPathSetTypeError
    xmlXPathStackIsExternal
    xmlXPathStackIsNodeSet
    xmlXPathStartsWithFunction
    xmlXPathStringEvalNumber
    xmlXPathStringFunction
    xmlXPathStringLengthFunction
    xmlXPathSubValues
    xmlXPathSubstringAfterFunction
    xmlXPathSubstringBeforeFunction
    xmlXPathSubstringFunction
    xmlXPathSumFunction
    xmlXPathTrailing
    xmlXPathTrailingSorted
    xmlXPathTranslateFunction
    xmlXPathTrueFunction
    xmlXPathValueFlipSign
    xmlXPathVariableLookup
    xmlXPathVariableLookupNS
    xmlXPathWrapCString
    xmlXPathWrapExternal
    xmlXPathWrapNodeSet
    xmlXPathWrapString
    xmlXPatherror

    Module xpointer:

    _xmlLocationSet
    xmlLocationSet
    xmlLocationSetPtr
    xmlXPtrBuildNodeList
    xmlXPtrEval
    xmlXPtrEvalRangePredicate
    xmlXPtrFreeLocationSet
    xmlXPtrLocationSetAdd
    xmlXPtrLocationSetCreate
    xmlXPtrLocationSetDel
    xmlXPtrLocationSetMerge
    xmlXPtrLocationSetRemove
    xmlXPtrNewCollapsedRange
    xmlXPtrNewContext
    xmlXPtrNewLocationSetNodeSet
    xmlXPtrNewLocationSetNodes
    xmlXPtrNewRange
    xmlXPtrNewRangeNodeObject
    xmlXPtrNewRangeNodePoint
    xmlXPtrNewRangeNodes
    xmlXPtrNewRangePointNode
    xmlXPtrNewRangePoints
    xmlXPtrRangeToFunction
    xmlXPtrWrapLocationSet

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/news.html0000644000175000017500000037302712124524425015200 0ustar aronaron Releases
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Releases

    Main Menu
    Related links

    The change log describes the recents commits to the GIT code base.

    Here is the list of public releases:

    2.9.0: Sep 11 2012

    • Features:
      A few new API entry points,
      More resilient push parser mode,
      A lot of portability improvement,
      Faster XPath evaluation
    • Documentation:
      xml2-config.1 markup error (Christian Weisgerber),
      libxml(3) manpage typo fix (John Bradshaw),
      More cleanups to the documentation part of libxml2 (Daniel Richard G)
    • Portability:
      Bug 676544 - fails to build with --without-sax1 (Akira TAGOH),
      fix builds not having stdint.h (Rob Richards),
      GetProcAddressA is available only on WinCE (Daniel Veillard),
      More updates and cleanups on autotools and Makefiles (Daniel Richard G),
      More changes for Win32 compilation (Eric Zurcher),
      Basic changes for Win32 builds of release 2.9.0: compile buf.c (Eric Zurcher),
      Bundles all generated files for python into the distribution (Daniel Richard G),
      Fix compiler warnings of wincecompat.c (Patrick Gansterer),
      Fix non __GNUC__ build (Patrick Gansterer),
      Fix windows unicode build (Patrick Gansterer),
      clean redefinition of {v}snprintf in C-source (Roumen Petrov),
      use xmlBuf... if DEBUG_INPUT is defined (Roumen Petrov),
      fix runtests to use pthreads support for various Unix platforms (Daniel Richard G),
      Various "make distcheck" and portability fixups 2nd part (Daniel Richard G),
      Various "make distcheck" and portability fixups (Daniel Richard G),
      Fix compilation on older Visual Studio (Daniel Veillard)
    • Bug Fixes:
      Change the XPath code to percolate allocation errors (Daniel Veillard),
      Fix reuse of xmlInitParser (Daniel Veillard),
      Fix potential crash on entities errors (Daniel Veillard),
      initialize var (Rob Richards),
      Fix the XPath arity check to also check the XPath stack limits (Daniel Veillard),
      Fix problem with specific and generic error handlers (Pietro Cerutti),
      Avoid a potential infinite recursion (Daniel Veillard),
      Fix an XSD error when generating internal automata (Daniel Veillard),
      Patch for xinclude of text using multibyte characters (Vitaly Ostanin),
      Fix a segfault on XSD validation on pattern error (Daniel Veillard),
      Fix missing xmlsave.h module which was ignored in recent builds (Daniel Veillard),
      Add a missing element check (Daniel Veillard),
      Adding various checks on node type though the API (Daniel Veillard),
      Namespace nodes can't be unlinked with xmlUnlinkNode (Daniel Veillard),
      Fix make dist to include new private header files (Daniel Veillard),
      More fixups on the push parser behaviour (Daniel Veillard),
      Strengthen behaviour of the push parser in problematic situations (Daniel Veillard),
      Enforce XML_PARSER_EOF state handling through the parser (Daniel Veillard),
      Fixup limits parser (Daniel Veillard),
      Do not fetch external parsed entities (Daniel Veillard),
      Fix an error in previous commit (Aron Xu),
      Fix entities local buffers size problems (Daniel Veillard),
      Fix parser local buffers size problems (Daniel Veillard),
      Fix a failure to report xmlreader parsing failures (Daniel Veillard)
    • Improvements:
      Keep libxml2.syms when running "make distclean" (Daniel Veillard),
      Allow to set the quoting character of an xmlWriter (Csaba Raduly),
      Keep non-significant blanks node in HTML parser (Daniel Veillard),
      Add a forbidden variable error number and message to XPath (Daniel Veillard),
      Support long path names on WNT (Michael Stahl),
      Improve HTML escaping of attribute on output (Daniel Veillard),
      Handle ICU_LIBS as LIBADD, not LDFLAGS to prevent linking errors (Arfrever Frehtes Taifersar Arahesis),
      Switching XPath node sorting to Timsort (Vojtech Fried),
      Optimizing '//' in XPath expressions (Nick Wellnhofer),
      Expose xmlBufShrink in the public tree API (Daniel Veillard),
      Visible HTML elements close the head tag (Conrad Irwin),
      Fix file and line report for XSD SAX and reader streaming validation (Daniel Veillard),
      Fix const qualifyer to definition of xmlBufferDetach (Daniel Veillard),
      minimize use of HAVE_CONFIG_H (Roumen Petrov),
      fixup regression in Various "make distcheck" and portability fixups (Roumen Petrov),
      Add support for big line numbers in error reporting (Daniel Veillard),
      Avoid using xmlBuffer for serialization (Daniel Veillard),
      Improve compatibility between xmlBuf and xmlBuffer (Daniel Veillard),
      Provide new accessors for xmlOutputBuffer (Daniel Veillard),
      Improvements for old buffer compatibility (Daniel Veillard),
      Expand the limit test program (Daniel Veillard),
      Improve error reporting on parser errors (Daniel Veillard),
      Implement some default limits in the XPath module (Daniel Veillard),
      Introduce some default parser limits (Daniel Veillard),
      Cleanups and new limit APIs for dictionaries (Daniel Veillard),
      Fixup for buf.c (Daniel Veillard),
      Cleanup URI module memory allocation code (Daniel Veillard),
      Extend testlimits (Daniel Veillard),
      More avoid quadratic behaviour (Daniel Veillard),
      Impose a reasonable limit on PI size (Daniel Veillard),
      first version of testlimits new test (Daniel Veillard),
      Avoid quadratic behaviour in some push parsing cases (Daniel Veillard),
      Impose a reasonable limit on comment size (Daniel Veillard),
      Impose a reasonable limit on attribute size (Daniel Veillard),
      Harden the buffer code and make it more compatible (Daniel Veillard),
      More cleanups for input/buffers code (Daniel Veillard),
      Cleanup function xmlBufResetInput(),
      to set input from Buffer (Daniel Veillard) Swicth the test program for characters to new input buffers (Daniel Veillard),
      Convert the HTML tree module to the new buffers (Daniel Veillard),
      Convert of the HTML parser to new input buffers (Daniel Veillard),
      Convert the writer to new output buffer and save APIs (Daniel Veillard),
      Convert XMLReader to the new input buffers (Daniel Veillard),
      New saving functions using xmlBuf and conversion (Daniel Veillard),
      Provide new xmlBuf based saving functions (Daniel Veillard),
      Convert XInclude to the new input buffers (Daniel Veillard),
      Convert catalog code to the new input buffers (Daniel Veillard),
      Convert C14N to the new Input buffer (Daniel Veillard),
      Convert xmlIO.c to the new input and output buffers (Daniel Veillard),
      Convert XML parser to the new input buffers (Daniel Veillard),
      Incompatible change to the Input and Output buffers (Daniel Veillard),
      Adding new encoding function to deal with the new structures (Daniel Veillard),
      Convert XPath to xmlBuf (Daniel Veillard),
      Adding a new buf module for buffers (Daniel Veillard),
      Memory error within SAX2 reuse common framework (Daniel Veillard),
      Fix xmllint --xpath node initialization (Daniel Veillard)
    • Cleanups:
      Various cleanups to avoid compiler warnings (Daniel Veillard),
      Big space and tab cleanup (Daniel Veillard),
      Followup to LibXML2 docs/examples cleanup patch (Daniel Veillard),
      Second round of cleanups for LibXML2 docs/examples (Daniel Richard),
      Remove all .cvsignore as they are not used anymore (Daniel Veillard),
      Fix a Timsort function helper comment (Daniel Veillard),
      Small cleanup for valgrind target (Daniel Veillard),
      Patch for portability of latin characters in C files (Daniel Veillard),
      Cleanup some of the parser code (Daniel Veillard),
      Fix a variable name in comment (Daniel Veillard),
      Regenerated testapi.c (Daniel Veillard),
      Regenerating docs and API files (Daniel Veillard),
      Small cleanup of unused variables in test (Daniel Veillard),
      Expand .gitignore with more files (Daniel Veillard)

    2.8.0: May 23 2012

    • Features: add lzma compression support (Anders F Bjorklund)
    • Documentation: xmlcatalog: Add uri and delegateURI to possible add types in man page. (Ville Skyttä), Update README.tests (Daniel Veillard), URI handling code is not OOM resilient (Daniel Veillard), Fix an error in comment (Daniel Veillard), Fixed bug #617016 (Daniel Mustieles), Fixed two typos in the README document (Daniel Neel), add generated html files (Anders F Bjorklund), Clarify the need to use xmlFreeNode after xmlUnlinkNode (Daniel Veillard), Improve documentation a bit (Daniel Veillard), Updated URL for lxml python bindings (Daniel Veillard)
    • Portability: Restore code for Windows compilation (Daniel Veillard), Remove git error message during configure (Christian Dywan), xmllint: Build fix for endTimer if !defined(HAVE_GETTIMEOFDAY) (Patrick R. Gansterer), remove a bashism in confgure.in (John Hein), undef ERROR if already defined (Patrick R. Gansterer), Fix library problems with mingw-w64 (Michael Cronenworth), fix windows build. ifdef addition from bug 666491 makes no sense (Rob Richards), prefer native threads on win32 (Sam Thursfield), Allow to compile with Visual Studio 2010 (Thomas Lemm), Fix mingw's snprintf configure check (Andoni Morales), fixed a 64bit big endian issue (Marcus Meissner), Fix portability failure if netdb.h lacks NO_ADDRESS (Daniel Veillard), Fix windows build from lzma addition (Rob Richards), autogen: Only check for libtoolize (Colin Walters), Fix the Windows build files (Patrick von Reth), 634846 Remove a linking option breaking Windows VC10 (Daniel Veillard), 599241 fix an initialization problem on Win64 (Andrew W. Nosenko), fix win build (Rob Richards)
    • Bug fixes: Part for rand_r checking missing (Daniel Veillard), Cleanup on randomization (Daniel Veillard), Fix undefined reference in python module (Pacho Ramos), Fix a race in xmlNewInputStream (Daniel Veillard), Fix weird streaming RelaxNG errors (Noam), Fix various bugs in new code raised by the API checking (Daniel Veillard), Fix various problems with "make dist" (Daniel Veillard), Fix a memory leak in the xzlib code (Daniel Veillard), HTML parser error with <noscript> in the <head> (Denis Pauk), XSD: optional element in complex type extension (Remi Gacogne), Fix html serialization error and htmlSetMetaEncoding() (Daniel Veillard), Fix a wrong return value in previous patch (Daniel Veillard), Fix an uninitialized variable use (Daniel Veillard), Fix a compilation problem with --minimum (Brandon Slack), Remove redundant and ungarded include of resolv.h (Daniel Veillard), xinclude with parse="text" does not use the entity loader (Shaun McCance), Allow to parse 1 byte HTML files (Denis Pauk), Patch that fixes the skipping of the HTML_PARSE_NOIMPLIED flag (Martin Schröder), Avoid memory leak if xmlParserInputBufferCreateIO fails (Lin Yi-Li), Prevent an infinite loop when dumping a node with encoding problems (Timothy Elliott), xmlParseNodeInContext problems with an empty document (Tim Elliott), HTML element position is not detected propperly (Pavel Andrejs), Fix an off by one pointer access (Jüri Aedla), Try to fix a problem with entities in SAX mode (Daniel Veillard), Fix a crash with xmllint --path on empty results (Daniel Veillard), Fixed bug #667946 (Daniel Mustieles), Fix a logic error in Schemas Component Constraints (Ryan Sleevi), Fix a wrong enum type use in Schemas Types (Nico Weber), Fix SAX2 builder in case of undefined attributes namespace (Daniel Veillard), Fix SAX2 builder in case of undefined element namespaces (Daniel Veillard), fix reference to STDOUT_FILENO on MSVC (Tay Ray Chuan), fix a pair of possible out of array char references (Daniel Veillard), Fix an allocation error when copying entities (Daniel Veillard), Make sure the parser returns when getting a Stop order (Chris Evans), Fix some potential problems on reallocation failures(parser.c) (Xia Xinfeng), Fix a schema type duration comparison overflow (Daniel Veillard), Fix an unimplemented part in RNG value validation (Daniel Veillard), Fix missing error status in XPath evaluation (Daniel Veillard), Hardening of XPath evaluation (Daniel Veillard), Fix an off by one error in encoding (Daniel Veillard), Fix RELAX NG include bug #655288 (Shaun McCance), Fix XSD validation bug #630130 (Toyoda Eizi), Fix some potential problems on reallocation failures (Chris Evans), __xmlRaiseError: fix use of the structured callback channel (Dmitry V. Levin), __xmlRaiseError: fix the structured callback channel's data initialization (Dmitry V. Levin), Fix memory corruption when xmlParseBalancedChunkMemoryInternal is called from xmlParseBalancedChunk (Rob Richards), Small fix for previous commit (Daniel Veillard), Fix a potential freeing error in XPath (Daniel Veillard), Fix a potential memory access error (Daniel Veillard), Reactivate the shared library versionning script (Daniel Veillard)
    • Improvements: use mingw C99 compatible functions {v}snprintf instead those from MSVC runtime (Roumen Petrov), New symbols added for the next release (Daniel Veillard), xmlTextReader bails too quickly on error (Andy Lutomirski), Use a hybrid allocation scheme in xmlNodeSetContent (Conrad Irwin), Use buffers when constructing string node lists. (Conrad Irwin), Add HTML parser support for HTML5 meta charset encoding declaration (Denis Pauk), wrong message for double hyphen in comment XML error (Bryan Henderson), Fix "make tst" to grab lzma lib too (Daniel Veillard), Add "whereis" command to xmllint shell (Ryan), Improve xmllint shell (Ryan), add function xmlTextReaderRelaxNGValidateCtxt() (Noam Postavsky), Add --system support to autogen.sh (Daniel Veillard), Add hash randomization to hash and dict structures (Daniel Veillard), included xzlib in dist (Anders F Bjorklund), move xz/lzma helpers to separate included files (Anders F Bjorklund), add generated devhelp files (Anders F Bjorklund), add XML_WITH_LZMA to api (Anders F Bjorklund), autogen.sh: Honor NOCONFIGURE environment variable (Colin Walters), Improve the error report on undefined REFs (Daniel Veillard), Add exception for new W3C PI xml-model (Daniel Veillard), Add options to ignore the internal encoding (Daniel Veillard), testapi: use the right type for the check (Stefan Kost), various: handle return values of write calls (Stefan Kost), testWriter: xmlTextWriterWriteFormatElement wants an int instead of a long int (Stefan Kost), runxmlconf: update to latest testsuite version (Stefan Kost), configure: add -Wno-long-long to CFLAGS (Stefan Kost), configure: support silent automake rules if possible (Stefan Kost), xmlmemory: add a cast as size_t has no portable printf modifier (Stefan Kost), __xmlRaiseError: remove redundant schannel initialization (Dmitry V. Levin), __xmlRaiseError: do cheap code check early (Dmitry V. Levin)
    • Cleanups: Cleanups before 2.8.0-rc2 (Daniel Veillard), Avoid an extra operation (Daniel Veillard), Remove vestigial de-ANSI-fication support. (Javier Jardón), autogen.sh: Fix typo (Javier Jardón), Do not use unsigned but unsigned int (Daniel Veillard), Remove two references to u_short (Daniel Veillard), Fix -Wempty-body warning from clang (Nico Weber), Cleanups of lzma support (Daniel Veillard), Augment the list of ignored files (Daniel Veillard), python: remove unused variable (Stefan Kost), python: flag two unused args (Stefan Kost), configure: acconfig.h is deprecated since autoconf-2.50 (Stefan Kost), xpath: remove unused variable (Stefan Kost)

    2.7.8: Nov 4 2010

    • Features: 480323 add code to plug in ICU converters by default (Giuseppe Iuculano), Add xmlSaveOption XML_SAVE_WSNONSIG (Adam Spragg)
    • Documentation: Fix devhelp documentation installation (Mike Hommey), Fix web site encoding problems (Daniel Veillard), Fix a couple of typo in HTML parser error messages (Michael Day), Forgot to update the news page for 0.7.7 (Daniel Veillard)
    • Portability: 607273 Fix python detection on MSys/Windows (LRN), 614087 Fix Socket API usage to allow Windows64 compilation (Ozkan Sezer), Fix compilation with Clang (Koop Mast), Fix Win32 build (Rob Richards)
    • Bug Fixes: 595789 fix a remaining potential Solaris problem (Daniel Veillard), 617468 fix progressive HTML parsing with style using "'" (Denis Pauk), 616478 Fix xmllint shell write command (Gwenn Kahz), 614005 Possible erroneous HTML parsing on unterminated script (Pierre Belzile), 627987 Fix XSD IDC errors in imported schemas (Jim Panetta), 629325 XPath rounding errors first cleanup (Phil Shafer), 630140 fix iso995x encoding error (Daniel Veillard), make sure htmlCtxtReset do reset the disableSAX field (Daniel Veillard), Fix a change of semantic on XPath preceding and following axis (Daniel Veillard), Fix a potential segfault due to weak symbols on pthreads (Mike Hommey), Fix a leak in XPath compilation (Daniel Veillard), Fix the semantic of XPath axis for namespace/attribute context nodes (Daniel Veillard), Avoid a descriptor leak in catalog loading code (Carlo Bramini), Fix a small bug in XPath evaluation code (Marius Wachtler), Fix handling of XML-1.0 XML namespace declaration (Daniel Veillard), Fix errors in XSD double validation check (Csaba Raduly), Fix handling of apos in URIs (Daniel Veillard), xmlTextReaderReadOuterXml should handle DTD (Rob Richards), Autogen.sh needs to create m4 directory (Rob Richards)
    • Improvements: 606592 update language ID parser to RFC 5646 (Daniel Veillard), Sort python generated stubs (Mike Hommey), Add an HTML parser option to avoid a default doctype (Daniel Veillard)
    • Cleanups: 618831 don't ship generated files in git (Adrian Bunk), Switch from the obsolete mkinstalldirs to AC_PROG_MKDIR_P (Adrian Bunk), Various cleanups on encoding handling (Daniel Veillard), Fix xmllint to use format=1 for default formatting (Adam Spragg), Force _xmlSaveCtxt.format to be 0 or 1 (Adam Spragg), Cleanup encoding pointer comparison (Nikolay Sivov), Small code cleanup on previous patch (Daniel Veillard)

    2.7.7: Mar 15 2010

    • Improvements: Adding a --xpath option to xmllint (Daniel Veillard), Make HTML parser non-recursive (Eugene Pimenov)
    • Portability: relaxng.c: cast to allow compilation with sun studio 11 (Ben Walton), Fix build failure on Sparc solaris (Roumen Petrov), use autoreconf in autogen.sh (Daniel Veillard), Fix build with mingw (Roumen Petrov), Upgrade some of the configure and autogen (Daniel Veillard), Fix relaxNG tests in runtest for Windows runtest.c: initialize ret (Rob Richards), Fix a const warning in xmlNodeSetBase (Martin Trappel), Fix python generator to not use deprecated xmllib (Daniel Veillard), Update some automake files (Daniel Veillard), 598785 Fix nanohttp on Windows (spadix)
    • Bug Fixes: libxml violates the zlib interface and crashes (Mark Adler), Fix broken escape behaviour in regexp ranges (Daniel Veillard), Fix missing win32 libraries in libxml-2.0.pc (Volker Grabsch), Fix detection of python linker flags (Daniel Macks), fix build error in libxml2/python (Paul Smith), ChunkParser: Incorrect decoding of small xml files (Raul Hudea), htmlCheckEncoding doesn't update input-end after shrink (Eugene Pimenov), Fix a missing #ifdef (Daniel Veillard), Fix encoding selection for xmlParseInNodeContext (Daniel Veillard), xmlPreviousElementSibling mistake (François Delyon), 608773 add a missing check in xmlGROW (Daniel Veillard), Fix xmlParseInNodeContext for HTML content (Daniel Veillard), Fix lost namespace when copying node * tree.c: reconcile namespace if not found (Rob Richards), Fix some missing commas in HTML element lists (Eugene Pimenov), Correct variable type to unsigned (Nikolay Sivov), Recognize ID attribute in HTML without DOCTYPE (Daniel Veillard), Fix memory leak in xmlXPathEvalExpression() (Martin), Fix an init bug in global.c (Kai Henning), Fix xmlNodeSetBase() comment (Daniel Veillard), Fix broken escape behaviour in regexp ranges (Daniel Veillard), Don't give default HTML boolean attribute values in parser (Daniel Veillard), xmlCtxtResetLastError should reset ctxt-errNo (Daniel Veillard)
    • Cleanups: Cleanup a couple of weirdness in HTML parser (Eugene Pimenov)

    2.7.6: Oct 6 2009

    • Bug Fixes: Restore thread support in default configuration (Andrew W. Nosenko), URI with no path parsing problem (Daniel Veillard), Minor patch for conditional defines in threads.c (Eric Zurcher)

    2.7.5: Sep 24 2009

    • Bug Fixes: Restore behavior of --with-threads without argument (Andrew W. Nosenko), Fix memory leak when doc is NULL (Rob Richards), 595792 fixing a RelaxNG bug introduced in 2.7.4 (Daniel Veillard), Fix a Relaxng bug raised by libvirt test suite (Daniel Veillard), Fix a parsing problem with little data at startup (Daniel Veillard), link python module with python library (Frederic Crozat), 594874 Forgot an fclose in xmllint (Daniel Veillard)
    • Cleanup: Adding symbols.xml to EXTRA_DIST (Daniel Veillard)

    2.7.4: Sep 10 2009

    • Improvements: Switch to GIT (GNOME), Add symbol versioning to libxml2 shared libs (Daniel Veillard)
    • Portability: 593857 try to work around thread pbm MinGW 4.4 (Daniel Veillard), 594250 rename ATTRIBUTE_ALLOC_SIZE to avoid clashes (Daniel Veillard), Fix Windows build * relaxng.c: fix windows build (Rob Richards), Fix the globals.h to use XMLPUBFUN (Paul Smith), Problem with extern extern in header (Daniel Veillard), Add -lnetwork for compiling on Haiku (Scott McCreary), Runtest portability patch for Solaris (Tim Rice), Small patch to accomodate the Haiku OS (Scott McCreary), 584605 package VxWorks folder in the distribution (Daniel Veillard), 574017 Realloc too expensive on most platform (Daniel Veillard), Fix windows build (Rob Richards), 545579 doesn't compile without schema support (Daniel Veillard), xmllint use xmlGetNodePath when not compiled in (Daniel Veillard), Try to avoid __imp__xmlFree link trouble on msys (Daniel Veillard), Allow to select the threading system on Windows (LRN), Fix Solaris binary links, cleanups (Daniel Veillard), Bug 571059 – MSVC doesn't work with the bakefile (Intron), fix ATTRIBUTE_PRINTF header clash (Belgabor and Mike Hommey), fixes for Borland/CodeGear/Embarcadero compilers (Eric Zurcher)
    • Documentation: 544910 typo: "renciliateNs" (Leonid Evdokimov), Add VxWorks to list of OSes (Daniel Veillard), Regenerate the documentation and update for git (Daniel Veillard), 560524 ¿ xmlTextReaderLocalName description (Daniel Veillard), Added sponsoring by AOE media for the server (Daniel Veillard), updated URLs for GNOME (Vincent Lefevre), more warnings about xmlCleanupThreads and xmlCleanupParser (Daniel Veillard)
    • Bug fixes: 594514 memory leaks - duplicate initialization (MOD), Wrong block opening in htmlNodeDumpOutputInternal (Daniel Veillard), 492317 Fix Relax-NG validation problems (Daniel Veillard), 558452 fight with reg test and error report (Daniel Veillard), 558452 RNG compilation of optional multiple child (Daniel Veillard), 579746 XSD validation not correct / nilable groups (Daniel Veillard), 502960 provide namespace stack when parsing entity (Daniel Veillard), 566012 part 2 fix regresion tests and push mode (Daniel Veillard), 566012 autodetected encoding and encoding conflict (Daniel Veillard), 584220 xpointer(/) and xinclude problems (Daniel Veillard), 587663 Incorrect Attribute-Value Normalization (Daniel Veillard), 444994 HTML chunked failure for attribute with <> (Daniel Veillard), Fix end of buffer char being split in XML parser (Daniel Veillard), Non ASCII character may be split at buffer end (Adiel Mittmann), 440226 Add xmlXIncludeProcessTreeFlagsData API (Stefan Behnel), 572129 speed up parsing of large HTML text nodes (Markus Kull), Fix HTML parsing with 0 character in CDATA (Daniel Veillard), Fix SetGenericErrorFunc and SetStructured clash (Wang Lam), 566012 Incomplete EBCDIC parsing support (Martin Kogler), 541335 HTML avoid creating 2 head or 2 body element (Daniel Veillard), 541237 error correcting missing end tags in HTML (Daniel Veillard), 583439 missing line numbers in push mode (Daniel Veillard), 587867 xmllint --html --xmlout serializing as HTML (Daniel Veillard), 559501 avoid select and use poll for nanohttp (Raphael Prevost), 559410 - Regexp bug on (...)? constructs (Daniel Veillard), Fix a small problem on previous HTML parser patch (Daniel Veillard), 592430 - HTML parser runs into endless loop (Daniel Veillard), 447899 potential double free in xmlFreeTextReader (Daniel Veillard), 446613 small validation bug mixed content with NS (Daniel Veillard), Fix the problem of revalidating a doc with RNG (Daniel Veillard), Fix xmlKeepBlanksDefault to not break indent (Nick Wellnhofer), 512131 refs from externalRef part need to be added (Daniel Veillard), 512131 crash in xmlRelaxNGValidateFullElement (Daniel Veillard), 588441 allow '.' in HTML Names even if invalid (Daniel Veillard), 582913 Fix htmlSetMetaEncoding() to be nicer (Daniel Veillard), 579317 Try to find the HTML encoding information (Daniel Veillard), 575875 don't output charset=html (Daniel Veillard), 571271 fix semantic of xsd:all with minOccurs=0 (Daniel Veillard), 570702 fix a bug in regexp determinism checking (Daniel Veillard), 567619 xmlValidateNotationUse missing param test (Daniel Veillard), 574393 ¿ utf-8 filename magic for compressed files (Hans Breuer), Fix a couple of problems in the parser (Daniel Veillard), 585505 ¿ Document ids and refs populated by XSD (Wayne Jensen), 582906 XSD validating multiple imports of the same schema (Jason Childs), Bug 582887 ¿ problems validating complex schemas (Jason Childs), Bug 579729 ¿ fix XSD schemas parsing crash (Miroslav Bajtos), 576368 ¿ htmlChunkParser with special attributes (Jiri Netolicky), Bug 565747 ¿ relax anyURI data character checking (Vincent Lefevre), Preserve attributes of include start on tree copy (Petr Pajas), Skip silently unrecognized XPointer schemes (Jakub Wilk), Fix leak on SAX1, xmllint --sax1 option and debug (Daniel Veillard), potential NULL dereference on non-glibc (Jim Meyering), Fix an XSD validation crash (Daniel Veillard), Fix a regression in streaming entities support (Daniel Veillard), Fix a couple of ABI issues with C14N 1.1 (Aleksey Sanin), Aleksey Sanin support for c14n 1.1 (Aleksey Sanin), reader bug fix with entities (Daniel Veillard), use options from current parser ctxt for external entities (Rob Richards), 581612 use %s to printf strings (Christian Persch), 584605 change the threading initialization sequence (Igor Novoseltsev), 580705 keep line numbers in HTML parser (Aaron Patterson), 581803 broken HTML table attributes init (Roland Steiner), do not set error code in xmlNsWarn (Rob Richards), 564217 fix structured error handling problems, reuse options from current parser for entities (Rob Richards), xmlXPathRegisterNs should not allow enpty prefixes (Daniel Veillard), add a missing check in xmlAddSibling (Kris Breuker), avoid leaks on errors (Jinmei Tatuya)
    • Cleanup: Chasing dead assignments reported by clang-scan (Daniel Veillard), A few more safety cleanup raised by scan (Daniel Veillard), Fixing assorted potential problems raised by scan (Daniel Veillard), Potential uninitialized arguments raised by scan (Daniel Veillard), Fix a bunch of scan 'dead increments' and cleanup (Daniel Veillard), Remove a pedantic warning (Daniel Veillard), 555833 always use rm -f in uninstall-local (Daniel Veillard), 542394 xmlRegisterOutputCallbacks MAX_INPUT_CALLBACK (Daniel Veillard), Autoregenerate libxml2.syms automated checkings (Daniel Veillard), Make xmlRecoverDoc const (Martin Trappel) (Daniel Veillard), Both args of xmlStrcasestr are const (Daniel Veillard), hide the nbParse* variables used for debugging (Mike Hommey), 570806 changed include of config.h (William M. Brack), cleanups and error reports when xmlTextWriterVSprintf fails (Jinmei Tatuya)

    2.7.3: Jan 18 2009

    • Build fix: fix build when HTML support is not included.
    • Bug fixes: avoid memory overflow in gigantic text nodes, indentation problem on the writed (Rob Richards), xmlAddChildList pointer problem (Rob Richards and Kevin Milburn), xmlAddChild problem with attribute (Rob Richards and Kris Breuker), avoid a memory leak in an edge case (Daniel Zimmermann), deallocate some pthread data (Alex Ott).
    • Improvements: configure option to avoid rebuilding docs (Adrian Bunk), limit text nodes to 10MB max by default, add element traversal APIs, add a parser option to enable pre 2.7 SAX behavior (Rob Richards), add gcc malloc checking (Marcus Meissner), add gcc printf like functions parameters checking (Marcus Meissner).

    2.7.2: Oct 3 2008

    • Portability fix: fix solaris compilation problem, fix compilation if XPath is not configured in
    • Bug fixes: nasty entity bug introduced in 2.7.0, restore old behaviour when saving an HTML doc with an xml dump function, HTML UTF-8 parsing bug, fix reader custom error handlers (Riccardo Scussat)
    • Improvement: xmlSave options for more flexibility to save as XML/HTML/XHTML, handle leading BOM in HTML documents

    2.7.1: Sep 1 2008

    • Portability fix: Borland C fix (Moritz Both)
    • Bug fixes: python serialization wrappers, XPath QName corner case handking and leaks (Martin)
    • Improvement: extend the xmlSave to handle HTML documents and trees
    • Cleanup: python serialization wrappers

    2.7.0: Aug 30 2008

    • Documentation: switch ChangeLog to UTF-8, improve mutithreads and xmlParserCleanup docs
    • Portability fixes: Older Win32 platforms (Rob Richards), MSVC porting fix (Rob Richards), Mac OS X regression tests (Sven Herzberg), non GNUCC builds (Rob Richards), compilation on Haiku (Andreas Färber)
    • Bug fixes: various realloc problems (Ashwin), potential double-free (Ashwin), regexp crash, icrash with invalid whitespace facets (Rob Richards), pattern fix when streaming (William Brack), various XML parsing and validation fixes based on the W3C regression tests, reader tree skipping function fix (Ashwin), Schemas regexps escaping fix (Volker Grabsch), handling of entity push errors (Ashwin), fix a slowdown when encoder cant serialize characters on output
    • Code cleanup: compilation fix without the reader, without the output (Robert Schwebel), python whitespace (Martin), many space/tabs cleanups, serious cleanup of the entity handling code
    • Improvement: switch parser to XML-1.0 5th edition, add parsing flags for old versions, switch URI parsing to RFC 3986, add xmlSchemaValidCtxtGetParserCtxt (Holger Kaelberer), new hashing functions for dictionnaries (based on Stefan Behnel work), improve handling of misplaced html/head/body in HTML parser, better regression test tools and code coverage display, better algorithms to detect various versions of the billion laughts attacks, make arbitrary parser limits avoidable as a parser option

    2.6.32: Apr 8 2008

    • Documentation: returning heap memory to kernel (Wolfram Sang), trying to clarify xmlCleanupParser() use, xmlXPathContext improvement (Jack Jansen), improve the *Recover* functions documentation, XmlNodeType doc link fix (Martijn Arts)
    • Bug fixes: internal subset memory leak (Ashwin), avoid problem with paths starting with // (Petr Sumbera), streaming XSD validation callback patches (Ashwin), fix redirection on port other than 80 (William Brack), SAX2 leak (Ashwin), XInclude fragment of own document (Chris Ryan), regexp bug with '.' (Andrew Tosh), flush the writer at the end of the document (Alfred Mickautsch), output I/O bug fix (William Brack), writer CDATA output after a text node (Alex Khesin), UTF-16 encoding detection (William Brack), fix handling of empty CDATA nodes for Safari team, python binding problem with namespace nodes, improve HTML parsing (Arnold Hendriks), regexp automata build bug, memory leak fix (Vasily Chekalkin), XSD test crash, weird system parameter entity parsing problem, allow save to file:///X:/ windows paths, various attribute normalisation problems, externalSubsetSplit fix (Ashwin), attribute redefinition in the DTD (Ashwin), fix in char ref parsing check (Alex Khesin), many out of memory handling fixes (Ashwin), XPath out of memory handling fixes (Alvaro Herrera), various realloc problems (Ashwin), UCS4 encoding conversion buffer size (Christian Fruth), problems with EatName functions on memory errors, BOM handling in external parsed entities (Mark Rowe)
    • Code cleanup: fix build under VS 2008 (David Wimsey), remove useless mutex in xmlDict (Florent Guilian), Mingw32 compilation fix (Carlo Bramini), Win and MacOS EOL cleanups (Florent Guiliani), iconv need a const detection (Roumen Petrov), simplify xmlSetProp (Julien Charbon), cross compilation fixes for Mingw (Roumen Petrov), SCO Openserver build fix (Florent Guiliani), iconv uses const on Win32 (Rob Richards), duplicate code removal (Ashwin), missing malloc test and error reports (Ashwin), VMS makefile fix (Tycho Hilhorst)
    • improvements: better plug of schematron in the normal error handling (Tobias Minich)

    2.6.31: Jan 11 2008

    • Security fix: missing of checks in UTF-8 parsing
    • Bug fixes: regexp bug, dump attribute from XHTML document, fix xmlFree(NULL) to not crash in debug mode, Schematron parsing crash (Rob Richards), global lock free on Windows (Marc-Antoine Ruel), XSD crash due to double free (Rob Richards), indentation fix in xmlTextWriterFullEndElement (Felipe Pena), error in attribute type parsing if attribute redeclared, avoid crash in hash list scanner if deleting elements, column counter bug fix (Christian Schmidt), HTML embed element saving fix (Stefan Behnel), avoid -L/usr/lib output from xml2-config (Fred Crozat), avoid an xmllint crash (Stefan Kost), don't stop HTML parsing on out of range chars.
    • Code cleanup: fix open() call third argument, regexp cut'n paste copy error, unused variable in __xmlGlobalInitMutexLock (Hannes Eder), some make distcheck realted fixes (John Carr)
    • Improvements: HTTP Header: includes port number (William Brack), testURI --debug option,

    2.6.30: Aug 23 2007

    • Portability: Solaris crash on error handling, windows path fixes (Roland Schwarz and Rob Richards), mingw build (Roland Schwarz)
    • Bugfixes: xmlXPathNodeSetSort problem (William Brack), leak when reusing a writer for a new document (Dodji Seketeli), Schemas xsi:nil handling patch (Frank Gross), relative URI build problem (Patrik Fimml), crash in xmlDocFormatDump, invalid char in comment detection bug, fix disparity with xmlSAXUserParseMemory, automata generation for complex regexp counts problems, Schemas IDC import problems (Frank Gross), xpath predicate evailation error handling (William Brack)

    2.6.29: Jun 12 2007

    • Portability: patches from Andreas Stricke for WinCEi, fix compilation warnings (William Brack), avoid warnings on Apple OS/X (Wendy Doyle and Mark Rowe), Windows compilation and threading improvements (Rob Richards), compilation against old Python versions, new GNU tar changes (Ryan Hill)
    • Documentation: xmlURIUnescapeString comment,
    • Bugfixes: xmlBufferAdd problem (Richard Jones), 'make valgrind' flag fix (Richard Jones), regexp interpretation of \, htmlCreateDocParserCtxt (Jean-Daniel Dupas), configure.in typo (Bjorn Reese), entity content failure, xmlListAppend() fix (Georges-André Silber), XPath number serialization (William Brack), nanohttp gzipped stream fix (William Brack and Alex Cornejo), xmlCharEncFirstLine typo (Mark Rowe), uri bug (François Delyon), XPath string value of PI nodes (William Brack), XPath node set sorting bugs (William Brack), avoid outputting namespace decl dups in the writer (Rob Richards), xmlCtxtReset bug, UTF-8 encoding error handling, recustion on next in catalogs, fix a Relax-NG crash, workaround wrong file: URIs, htmlNodeDumpFormatOutput on attributes, invalid character in attribute detection bug, big comments before internal subset streaming bug, HTML parsing of attributes with : in the name, IDness of name in HTML (Dagfinn I. MannsÃ¥ker)
    • Improvement: keep URI query parts in raw form (Richard Jones), embed tag support in HTML (Michael Day)

    2.6.28: Apr 17 2007

    • Documentation: comment fixes (Markus Keim), xpath comments fixes too (James Dennett)
    • Bug fixes: XPath bug (William Brack), HTML parser autoclose stack usage (Usamah Malik), various regexp bug fixes (DV and William), path conversion on Windows (Igor Zlatkovic), htmlCtxtReset fix (Michael Day), XPath principal node of axis bug, HTML serialization of some codepoint (Steven Rainwater), user data propagation in XInclude (Michael Day), standalone and XML decl detection (Michael Day), Python id ouptut for some id, fix the big python string memory leak, URI parsing fixes (Stéphane Bidoul and William), long comments parsing bug (William), concurrent threads initialization (Ted Phelps), invalid char in text XInclude (William), XPath memory leak (William), tab in python problems (Andreas Hanke), XPath node comparison error (Oleg Paraschenko), cleanup patch for reader (Julien Reichel), XML Schemas attribute group (William), HTML parsing problem (William), fix char 0x2d in regexps (William), regexp quantifier range with min occurs of 0 (William), HTML script/style parsing (Mike Day)
    • Improvement: make xmlTextReaderSetup() public
    • Compilation and postability: fix a missing include problem (William), __ss_familly on AIX again (Björn Wiberg), compilation without zlib (Michael Day), catalog patch for Win32 (Christian Ehrlicher), Windows CE fixes (Andreas Stricke)
    • Various CVS to SVN infrastructure changes

    2.6.27: Oct 25 2006

    • Portability fixes: file names on windows (Roland Schwingel, Emelyanov Alexey), windows compile fixup (Rob Richards), AIX iconv() is apparently case sensitive
    • improvements: Python XPath types mapping (Nic Ferrier), XPath optimization (Kasimier), add xmlXPathCompiledEvalToBoolean (Kasimier), Python node equality and comparison (Andreas Pakulat), xmlXPathCollectAndTest improvememt (Kasimier), expose if library was compiled with zlib support (Andrew Nosenko), cache for xmlSchemaIDCMatcher structs (Kasimier), xmlTextConcat should work with comments and PIs (Rob Richards), export htmlNewParserCtxt needed by Michael Day, refactoring of catalog entity loaders (Michael Day), add XPointer support to python bindings (Ross Reedstrom, Brian West and Stefan Anca), try to sort out most file path to URI conversions and xmlPathToUri, add --html --memory case to xmllint
    • building fix: fix --with-minimum (Felipe Contreras), VMS fix, const'ification of HTML parser structures (Matthias Clasen), portability fix (Emelyanov Alexey), wget autodetection (Peter Breitenlohner), remove the build path recorded in the python shared module, separate library flags for shared and static builds (Mikhail Zabaluev), fix --with-minimum --with-sax1 builds, fix --with-minimum --with-schemas builds
    • bug fix: xmlGetNodePath fix (Kasimier), xmlDOMWrapAdoptNode and attribute (Kasimier), crash when using the recover mode, xmlXPathEvalExpr problem (Kasimier), xmlXPathCompExprAdd bug (Kasimier), missing destry in xmlFreeRMutex (Andrew Nosenko), XML Schemas fixes (Kasimier), warning on entities processing, XHTML script and style serialization (Kasimier), python generator for long types, bug in xmlSchemaClearValidCtxt (Bertrand Fritsch), xmlSchemaXPathEvaluate allocation bug (Marton Illes), error message end of line (Rob Richards), fix attribute serialization in writer (Rob Richards), PHP4 DTD validation crasher, parser safety patch (Ben Darnell), _private context propagation when parsing entities (with Michael Day), fix entities behaviour when using SAX, URI to file path fix (Mikhail Zabaluev), disapearing validity context, arg error in SAX callback (Mike Hommey), fix mixed-content autodetect when using --noblanks, fix xmlIOParseDTD error handling, fix bug in xmlSplitQName on special Names, fix Relax-NG element content validation bug, fix xmlReconciliateNs bug, fix potential attribute XML parsing bug, fix line/column accounting in XML parser, chunking bug in the HTML parser on script, try to detect obviously buggy HTML meta encoding indications, bugs with encoding BOM and xmlSaveDoc, HTML entities in attributes parsing, HTML minimized attribute values, htmlReadDoc and htmlReadIO were broken, error handling bug in xmlXPathEvalExpression (Olaf Walkowiak), fix a problem in htmlCtxtUseOptions, xmlNewInputFromFile could leak (Marius Konitzer), bug on misformed SSD regexps (Christopher Boumenot)
    • documentation: warning about XML_PARSE_COMPACT (Kasimier Buchcik), fix xmlXPathCastToString documentation, improve man pages for xmllitn and xmlcatalog (Daniel Leidert), fixed comments of a few functions

    2.6.26: Jun 6 2006

    • portability fixes: Python detection (Joseph Sacco), compilation error(William Brack and Graham Bennett), LynxOS patch (Olli Savia)
    • bug fixes: encoding buffer problem, mix of code and data in xmlIO.c(Kjartan Maraas), entities in XSD validation (Kasimier Buchcik), variousXSD validation fixes (Kasimier), memory leak in pattern (Rob Richards andKasimier), attribute with colon in name (Rob Richards), XPath leak inerror reporting (Aleksey Sanin), XInclude text include of selfdocument.
    • improvements: Xpath optimizations (Kasimier), XPath object cache(Kasimier)

    2.6.25: Jun 6 2006:

    Do not use or package 2.6.25

    2.6.24: Apr 28 2006

    • Portability fixes: configure on Windows, testapi compile on windows (Kasimier Buchcik, venkat naidu), Borland C++ 6 compile (Eric Zurcher), HP-UX compiler workaround (Rick Jones), xml2-config bugfix, gcc-4.1 cleanups, Python detection scheme (Joseph Sacco), UTF-8 file paths on Windows (Roland Schwingel).
    • Improvements: xmlDOMWrapReconcileNamespaces xmlDOMWrapCloneNode (Kasimier Buchcik), XML catalog debugging (Rick Jones), update to Unicode 4.01.
    • Bug fixes: xmlParseChunk() problem in 2.6.23, xmlParseInNodeContext() on HTML docs, URI behaviour on Windows (Rob Richards), comment streaming bug, xmlParseComment (with William Brack), regexp bug fixes (DV & Youri Golovanov), xmlGetNodePath on text/CDATA (Kasimier), one Relax-NG interleave bug, xmllint --path and --valid, XSD bugfixes (Kasimier), remove debug left in Python bindings (Nic Ferrier), xmlCatalogAdd bug (Martin Cole), xmlSetProp fixes (Rob Richards), HTML IDness (Rob Richards), a large number of cleanups and small fixes based on Coverity reports, bug in character ranges, Unicode tables const (Aivars Kalvans), schemas fix (Stefan Kost), xmlRelaxNGParse error deallocation, xmlSchemaAddSchemaDoc error deallocation, error handling on unallowed code point, ixmllint --nonet to never reach the net (Gary Coady), line break in writer after end PI (Jason Viers).
    • Documentation: man pages updates and cleanups (Daniel Leidert).
    • New features: Relax NG structure error handlers.

    2.6.23: Jan 5 2006

    • portability fixes: Windows (Rob Richards), getaddrinfo on Windows (Kolja Nowak, Rob Richards), icc warnings (Kjartan Maraas), --with-minimum compilation fixes (William Brack), error case handling fix on Solaris (Albert Chin), don't use 'list' as parameter name reported by Samuel Diaz Garcia, more old Unices portability fixes (Albert Chin), MinGW compilation (Mark Junker), HP-UX compiler warnings (Rick Jones),
    • code cleanup: xmlReportError (Adrian Mouat), remove xmlBufferClose (Geert Jansen), unreachable code (Oleksandr Kononenko), refactoring parsing code (Bjorn Reese)
    • bug fixes: xmlBuildRelativeURI and empty path (William Brack), combinatory explosion and performances in regexp code, leak in xmlTextReaderReadString(), xmlStringLenDecodeEntities problem (Massimo Morara), Identity Constraints bugs and a segfault (Kasimier Buchcik), XPath pattern based evaluation bugs (DV & Kasimier), xmlSchemaContentModelDump() memory leak (Kasimier), potential leak in xmlSchemaCheckCSelectorXPath(), xmlTextWriterVSprintf() misuse of vsnprintf (William Brack), XHTML serialization fix (Rob Richards), CRLF split problem (William), issues with non-namespaced attributes in xmlAddChild() xmlAddNextSibling() and xmlAddPrevSibling() (Rob Richards), HTML parsing of script, Python must not output to stdout (Nic Ferrier), exclusive C14N namespace visibility (Aleksey Sanin), XSD dataype totalDigits bug (Kasimier Buchcik), error handling when writing to an xmlBuffer (Rob Richards), runtest schemas error not reported (Hisashi Fujinaka), signed/unsigned problem in date/time code (Albert Chin), fix XSI driven XSD validation (Kasimier), parsing of xs:decimal (Kasimier), fix DTD writer output (Rob Richards), leak in xmlTextReaderReadInnerXml (Gary Coady), regexp bug affecting schemas (Kasimier), configuration of runtime debugging (Kasimier), xmlNodeBufGetContent bug on entity refs (Oleksandr Kononenko), xmlRegExecPushString2 bug (Sreeni Nair), compilation and build fixes (Michael Day), removed dependancies on xmlSchemaValidError (Kasimier), bug with <xml:foo/>, more XPath pattern based evaluation fixes (Kasimier)
    • improvements: XSD Schemas redefinitions/restrictions (Kasimier Buchcik), node copy checks and fix for attribute (Rob Richards), counted transition bug in regexps, ctxt->standalone = -2 to indicate no standalone attribute was found, add xmlSchemaSetParserStructuredErrors() (Kasimier Buchcik), add xmlTextReaderSchemaValidateCtxt() to API (Kasimier), handle gzipped HTTP resources (Gary Coady), add htmlDocDumpMemoryFormat. (Rob Richards),
    • documentation: typo (Michael Day), libxml man page (Albert Chin), save function to XML buffer (Geert Jansen), small doc fix (Aron Stansvik),

    2.6.22: Sep 12 2005

    • build fixes: compile without schematron (Stéphane Bidoul)
    • bug fixes: xmlDebugDumpNode on namespace node (Oleg Paraschenko)i, CDATA push parser bug, xmlElemDump problem with XHTML1 doc, XML_FEATURE_xxx clash with expat headers renamed XML_WITH_xxx, fix some output formatting for meta element (Rob Richards), script and style XHTML1 serialization (David Madore), Attribute derivation fixups in XSD (Kasimier Buchcik), better IDC error reports (Kasimier Buchcik)
    • improvements: add XML_SAVE_NO_EMPTY xmlSaveOption (Rob Richards), add XML_SAVE_NO_XHTML xmlSaveOption, XML Schemas improvements preparing for derive (Kasimier Buchcik).
    • documentation: generation of gtk-doc like docs, integration with devhelp.

    2.6.21: Sep 4 2005

    • build fixes: Cygwin portability fixes (Gerrit P. Haase), calling convention problems on Windows (Marcus Boerger), cleanups based on Linus' sparse tool, update of win32/configure.js (Rob Richards), remove warnings on Windows(Marcus Boerger), compilation without SAX1, detection of the Python binary, use $GCC inestad of $CC = 'gcc' (Andrew W. Nosenko), compilation/link with threads and old gcc, compile problem by C370 on Z/OS,
    • bug fixes: http_proxy environments (Peter Breitenlohner), HTML UTF-8 bug (Jiri Netolicky), XPath NaN compare bug (William Brack), htmlParseScript potential bug, Schemas regexp handling of spaces, Base64 Schemas comparisons NIST passes, automata build error xsd:all, xmlGetNodePath for namespaced attributes (Alexander Pohoyda), xmlSchemas foreign namespaces handling, XML Schemas facet comparison (Kupriyanov Anatolij), xmlSchemaPSimpleTypeErr error report (Kasimier Buchcik), xml: namespace ahndling in Schemas (Kasimier), empty model group in Schemas (Kasimier), wilcard in Schemas (Kasimier), URI composition (William), xs:anyType in Schemas (Kasimier), Python resolver emmitting error messages directly, Python xmlAttr.parent (Jakub Piotr Clapa), trying to fix the file path/URI conversion, xmlTextReaderGetAttribute fix (Rob Richards), xmlSchemaFreeAnnot memleak (Kasimier), HTML UTF-8 serialization, streaming XPath, Schemas determinism detection problem, XInclude bug, Schemas context type (Dean Hill), validation fix (Derek Poon), xmlTextReaderGetAttribute[Ns] namespaces (Rob Richards), Schemas type fix (Kuba Nowakowski), UTF-8 parser bug, error in encoding handling, xmlGetLineNo fixes, bug on entities handling, entity name extraction in error handling with XInclude, text nodes in HTML body tags (Gary Coady), xml:id and IDness at the treee level fixes, XPath streaming patterns bugs.
    • improvements: structured interfaces for schemas and RNG error reports (Marcus Boerger), optimization of the char data inner loop parsing (thanks to Behdad Esfahbod for the idea), schematron validation though not finished yet, xmlSaveOption to omit XML declaration, keyref match error reports (Kasimier), formal expression handling code not plugged yet, more lax mode for the HTML parser, parser XML_PARSE_COMPACT option for text nodes allocation.
    • documentation: xmllint man page had --nonet duplicated

    2.6.20: Jul 10 2005

    • build fixes: Windows build (Rob Richards), Mingw compilation (Igor Zlatkovic), Windows Makefile (Igor), gcc warnings (Kasimier and andriy@google.com), use gcc weak references to pthread to avoid the pthread dependancy on Linux, compilation problem (Steve Nairn), compiling of subset (Morten Welinder), IPv6/ss_family compilation (William Brack), compilation when disabling parts of the library, standalone test distribution.
    • bug fixes: bug in lang(), memory cleanup on errors (William Brack), HTTP query strings (Aron Stansvik), memory leak in DTD (William), integer overflow in XPath (William), nanoftp buffer size, pattern "." apth fixup (Kasimier), leak in tree reported by Malcolm Rowe, replaceNode patch (Brent Hendricks), CDATA with NULL content (Mark Vakoc), xml:base fixup on XInclude (William), pattern fixes (William), attribute bug in exclusive c14n (Aleksey Sanin), xml:space and xml:lang with SAX2 (Rob Richards), namespace trouble in complex parsing (Malcolm Rowe), XSD type QNames fixes (Kasimier), XPath streaming fixups (William), RelaxNG bug (Rob Richards), Schemas for Schemas fixes (Kasimier), removal of ID (Rob Richards), a small RelaxNG leak, HTML parsing in push mode bug (James Bursa), failure to detect UTF-8 parsing bugs in CDATA sections, areBlanks() heuristic failure, duplicate attributes in DTD bug (William).
    • improvements: lot of work on Schemas by Kasimier Buchcik both on conformance and streaming, Schemas validation messages (Kasimier Buchcik, Matthew Burgess), namespace removal at the python level (Brent Hendricks), Update to new Schemas regression tests from W3C/Nist (Kasimier), xmlSchemaValidateFile() (Kasimier), implementation of xmlTextReaderReadInnerXml and xmlTextReaderReadOuterXml (James Wert), standalone test framework and programs, new DOM import APIs xmlDOMWrapReconcileNamespaces() xmlDOMWrapAdoptNode() and xmlDOMWrapRemoveNode(), extension of xmllint capabilities for SAX and Schemas regression tests, xmlStopParser() available in pull mode too, ienhancement to xmllint --shell namespaces support, Windows port of the standalone testing tools (Kasimier and William), xmlSchemaValidateStream() xmlSchemaSAXPlug() and xmlSchemaSAXUnplug() SAX Schemas APIs, Schemas xmlReader support.

    2.6.19: Apr 02 2005

    • build fixes: drop .la from RPMs, --with-minimum build fix (William Brack), use XML_SOCKLEN_T instead of SOCKLEN_T because it breaks with AIX 5.3 compiler, fixed elfgcchack.h generation and PLT reduction code on Linux/ELF/gcc4
    • bug fixes: schemas type decimal fixups (William Brack), xmmlint return code (Gerry Murphy), small schemas fixes (Matthew Burgess and GUY Fabrice), workaround "DAV:" namespace brokeness in c14n (Aleksey Sanin), segfault in Schemas (Kasimier Buchcik), Schemas attribute validation (Kasimier), Prop related functions and xmlNewNodeEatName (Rob Richards), HTML serialization of name attribute on a elements, Python error handlers leaks and improvement (Brent Hendricks), uninitialized variable in encoding code, Relax-NG validation bug, potential crash if gnorableWhitespace is NULL, xmlSAXParseDoc and xmlParseDoc signatures, switched back to assuming UTF-8 in case no encoding is given at serialization time
    • improvements: lot of work on Schemas by Kasimier Buchcik on facets checking and also mixed handling.

    2.6.18: Mar 13 2005

    • build fixes: warnings (Peter Breitenlohner), testapi.c generation, Bakefile support (Francesco Montorsi), Windows compilation (Joel Reed), some gcc4 fixes, HP-UX portability fixes (Rick Jones).
    • bug fixes: xmlSchemaElementDump namespace (Kasimier Buchcik), push and xmlreader stopping on non-fatal errors, thread support for dictionnaries reference counting (Gary Coady), internal subset and push problem, URL saved in xmlCopyDoc, various schemas bug fixes (Kasimier), Python paths fixup (Stephane Bidoul), xmlGetNodePath and namespaces, xmlSetNsProp fix (Mike Hommey), warning should not count as error (William Brack), xmlCreatePushParser empty chunk, XInclude parser flags (William), cleanup FTP and HTTP code to reuse the uri parsing and IPv6 (William), xmlTextWriterStartAttributeNS fix (Rob Richards), XMLLINT_INDENT being empty (William), xmlWriter bugs (Rob Richards), multithreading on Windows (Rich Salz), xmlSearchNsByHref fix (Kasimier), Python binding leak (Brent Hendricks), aliasing bug exposed by gcc4 on s390, xmlTextReaderNext bug (Rob Richards), Schemas decimal type fixes (William Brack), xmlByteConsumed static buffer (Ben Maurer).
    • improvement: speedup parsing comments and DTDs, dictionnary support for hash tables, Schemas Identity constraints (Kasimier), streaming XPath subset, xmlTextReaderReadString added (Bjorn Reese), Schemas canonical values handling (Kasimier), add xmlTextReaderByteConsumed (Aron Stansvik),
    • Documentation: Wiki support (Joel Reed)

    2.6.17: Jan 16 2005

    • build fixes: Windows, warnings removal (William Brack), maintainer-clean dependency(William), build in a different directory (William), fixing --with-minimum configure build (William), BeOS build (Marcin Konicki), Python-2.4 detection (William), compilation on AIX (Dan McNichol)
    • bug fixes: xmlTextReaderHasAttributes (Rob Richards), xmlCtxtReadFile() to use the catalog(s), loop on output (William Brack), XPath memory leak, ID deallocation problem (Steve Shepard), debugDumpNode crash (William), warning not using error callback (William), xmlStopParser bug (William), UTF-16 with BOM on DTDs (William), namespace bug on empty elements in push mode (Rob Richards), line and col computations fixups (Aleksey Sanin), xmlURIEscape fix (William), xmlXPathErr on bad range (William), patterns with too many steps, bug in RNG choice optimization, line number sometimes missing.
    • improvements: XSD Schemas (Kasimier Buchcik), python generator (William), xmlUTF8Strpos speedup (William), unicode Python strings (William), XSD error reports (Kasimier Buchcik), Python __str__ call serialize().
    • new APIs: added xmlDictExists(), GetLineNumber and GetColumnNumber for the xmlReader (Aleksey Sanin), Dynamic Shared Libraries APIs (mostly Joel Reed), error extraction API from regexps, new XMLSave option for format (Phil Shafer)
    • documentation: site improvement (John Fleck), FAQ entries (William).

    2.6.16: Nov 10 2004

    • general hardening and bug fixing crossing all the API based on new automated regression testing
    • build fix: IPv6 build and test on AIX (Dodji Seketeli)
    • bug fixes: problem with XML::Libxml reported by Petr Pajas, encoding conversion functions return values, UTF-8 bug affecting XPath reported by Markus Bertheau, catalog problem with NULL entries (William Brack)
    • documentation: fix to xmllint man page, some API function descritpion were updated.
    • improvements: DTD validation APIs provided at the Python level (Brent Hendricks)

    2.6.15: Oct 27 2004

    • security fixes on the nanoftp and nanohttp modules
    • build fixes: xmllint detection bug in configure, building outside the source tree (Thomas Fitzsimmons)
    • bug fixes: HTML parser on broken ASCII chars in names (William), Python paths (Malcolm Tredinnick), xmlHasNsProp and default namespace (William), saving to python file objects (Malcolm Tredinnick), DTD lookup fix (Malcolm), save back <group> in catalogs (William), tree build fixes (DV and Rob Richards), Schemas memory bug, structured error handler on Python 64bits, thread local memory deallocation, memory leak reported by Volker Roth, xmlValidateDtd in the presence of an internal subset, entities and _private problem (William), xmlBuildRelativeURI error (William).
    • improvements: better XInclude error reports (William), tree debugging module and tests, convenience functions at the Reader API (Graham Bennett), add support for PI in the HTML parser.

    2.6.14: Sep 29 2004

    • build fixes: configure paths for xmllint and xsltproc, compilation without HTML parser, compilation warning cleanups (William Brack & Malcolm Tredinnick), VMS makefile update (Craig Berry),
    • bug fixes: xmlGetUTF8Char (William Brack), QName properties (Kasimier Buchcik), XInclude testing, Notation serialization, UTF8ToISO8859x transcoding (Mark Itzcovitz), lots of XML Schemas cleanup and fixes (Kasimier), ChangeLog cleanup (Stepan Kasal), memory fixes (Mark Vakoc), handling of failed realloc(), out of bound array adressing in Schemas date handling, Python space/tabs cleanups (Malcolm Tredinnick), NMTOKENS E20 validation fix (Malcolm),
    • improvements: added W3C XML Schemas testsuite (Kasimier Buchcik), add xmlSchemaValidateOneElement (Kasimier), Python exception hierearchy (Malcolm Tredinnick), Python libxml2 driver improvement (Malcolm Tredinnick), Schemas support for xsi:schemaLocation, xsi:noNamespaceSchemaLocation, xsi:type (Kasimier Buchcik)

    2.6.13: Aug 31 2004

    • build fixes: Windows and zlib (Igor Zlatkovic), -O flag with gcc, Solaris compiler warning, fixing RPM BuildRequires,
    • fixes: DTD loading on Windows (Igor), Schemas error reports APIs (Kasimier Buchcik), Schemas validation crash, xmlCheckUTF8 (William Brack and Julius Mittenzwei), Schemas facet check (Kasimier), default namespace problem (William), Schemas hexbinary empty values, encoding error could genrate a serialization loop.
    • Improvements: Schemas validity improvements (Kasimier), added --path and --load-trace options to xmllint
    • documentation: tutorial update (John Fleck)

    2.6.12: Aug 22 2004

    • build fixes: fix --with-minimum, elfgcchack.h fixes (Peter Breitenlohner), perl path lookup (William), diff on Solaris (Albert Chin), some 64bits cleanups.
    • Python: avoid a warning with 2.3 (William Brack), tab and space mixes (William), wrapper generator fixes (William), Cygwin support (Gerrit P. Haase), node wrapper fix (Marc-Antoine Parent), XML Schemas support (Torkel Lyng)
    • Schemas: a lot of bug fixes and improvements from Kasimier Buchcik
    • fixes: RVT fixes (William), XPath context resets bug (William), memory debug (Steve Hay), catalog white space handling (Peter Breitenlohner), xmlReader state after attribute reading (William), structured error handler (William), XInclude generated xml:base fixup (William), Windows memory reallocation problem (Steve Hay), Out of Memory conditions handling (William and Olivier Andrieu), htmlNewDoc() charset bug, htmlReadMemory init (William), a posteriori validation DTD base (William), notations serialization missing, xmlGetNodePath (Dodji), xmlCheckUTF8 (Diego Tartara), missing line numbers on entity (William)
    • improvements: DocBook catalog build scrip (William), xmlcatalog tool (Albert Chin), xmllint --c14n option, no_proxy environment (Mike Hommey), xmlParseInNodeContext() addition, extend xmllint --shell, allow XInclude to not generate start/end nodes, extend xmllint --version to include CVS tag (William)
    • documentation: web pages fixes, validity API docs fixes (William) schemas API fix (Eric Haszlakiewicz), xmllint man page (John Fleck)

    2.6.11: July 5 2004

    • Schemas: a lot of changes and improvements by Kasimier Buchcik for attributes, namespaces and simple types.
    • build fixes: --with-minimum (William Brack), some gcc cleanup (William), --with-thread-alloc (William)
    • portability: Windows binary package change (Igor Zlatkovic), Catalog path on Windows
    • documentation: update to the tutorial (John Fleck), xmllint return code (John Fleck), man pages (Ville Skytta),
    • bug fixes: C14N bug serializing namespaces (Aleksey Sanin), testSAX properly initialize the library (William), empty node set in XPath (William), xmlSchemas errors (William), invalid charref problem pointed by Morus Walter, XInclude xml:base generation (William), Relax-NG bug with div processing (William), XPointer and xml:base problem(William), Reader and entities, xmllint return code for schemas (William), reader streaming problem (Steve Ball), DTD serialization problem (William), libxml.m4 fixes (Mike Hommey), do not provide destructors as methods on Python classes, xmlReader buffer bug, Python bindings memory interfaces improvement (with Stéphane Bidoul), Fixed the push parser to be back to synchronous behaviour.
    • improvement: custom per-thread I/O enhancement (Rob Richards), register namespace in debug shell (Stefano Debenedetti), Python based regression test for non-Unix users (William), dynamically increase the number of XPath extension functions in Python and fix a memory leak (Marc-Antoine Parent and William)
    • performance: hack done with Arjan van de Ven to reduce ELF footprint and generated code on Linux, plus use gcc runtime profiling to optimize the code generated in the RPM packages.

    2.6.10: May 17 2004

    • Web page generated for ChangeLog
    • build fixes: --without-html problems, make check without make all
    • portability: problem with xpath.c on Windows (MSC and Borland), memcmp vs. strncmp on Solaris, XPath tests on Windows (Mark Vakoc), C++ do not use "list" as parameter name, make tests work with Python 1.5 (Ed Davis),
    • improvements: made xmlTextReaderMode public, small buffers resizing (Morten Welinder), add --maxmem option to xmllint, add xmlPopInputCallback() for Matt Sergeant, refactoring of serialization escaping, added escaping customization
    • bugfixes: xsd:extension (Taihei Goi), assorted regexp bugs (William Brack), xmlReader end of stream problem, node deregistration with reader, URI escaping and filemanes, XHTML1 formatting (Nick Wellnhofer), regexp transition reduction (William), various XSD Schemas fixes (Kasimier Buchcik), XInclude fallback problem (William), weird problems with DTD (William), structured error handler callback context (William), reverse xmlEncodeSpecialChars() behaviour back to escaping '"'

    2.6.9: Apr 18 2004

    • implement xml:id Working Draft, relaxed XPath id() checking
    • bugfixes: xmlCtxtReset (Brent Hendricks), line number and CDATA (Dave Beckett), Relax-NG compilation (William Brack), Regexp patches (with William), xmlUriEscape (Mark Vakoc), a Relax-NG notAllowed problem (with William), Relax-NG name classes compares (William), XInclude duplicate fallback (William), external DTD encoding detection (William), a DTD validation bug (William), xmlReader Close() fix, recusive extention schemas
    • improvements: use xmlRead* APIs in test tools (Mark Vakoc), indenting save optimization, better handle IIS broken HTTP redirect behaviour (Ian Hummel), HTML parser frameset (James Bursa), libxml2-python RPM dependancy, XML Schemas union support (Kasimier Buchcik), warning removal clanup (William), keep ChangeLog compressed when installing from RPMs
    • documentation: examples and xmlDocDumpMemory docs (John Fleck), new example (load, xpath, modify, save), xmlCatalogDump() comments,
    • Windows: Borland C++ builder (Eric Zurcher), work around Microsoft compiler NaN handling bug (Mark Vakoc)

    2.6.8: Mar 23 2004

    • First step of the cleanup of the serialization code and APIs
    • XML Schemas: mixed content (Adam Dickmeiss), QName handling fixes (Adam Dickmeiss), anyURI for "" (John Belmonte)
    • Python: Canonicalization C14N support added (Anthony Carrico)
    • xmlDocCopyNode() extension (William)
    • Relax-NG: fix when processing XInclude results (William), external reference in interleave (William), missing error on <choice> failure (William), memory leak in schemas datatype facets.
    • xmlWriter: patch for better DTD support (Alfred Mickautsch)
    • bug fixes: xmlXPathLangFunction memory leak (Mike Hommey and William Brack), no ID errors if using HTML_PARSE_NOERROR, xmlcatalog fallbacks to URI on SYSTEM lookup failure, XInclude parse flags inheritance (William), XInclude and XPointer fixes for entities (William), XML parser bug reported by Holger Rauch, nanohttp fd leak (William), regexps char groups '-' handling (William), dictionnary reference counting problems, do not close stderr.
    • performance patches from Petr Pajas
    • Documentation fixes: XML_CATALOG_FILES in man pages (Mike Hommey)
    • compilation and portability fixes: --without-valid, catalog cleanups (Peter Breitenlohner), MingW patch (Roland Schwingel), cross-compilation to Windows (Christophe de Vienne), --with-html-dir fixup (Julio Merino Vidal), Windows build (Eric Zurcher)

    2.6.7: Feb 23 2004

    • documentation: tutorial updates (John Fleck), benchmark results
    • xmlWriter: updates and fixes (Alfred Mickautsch, Lucas Brasilino)
    • XPath optimization (Petr Pajas)
    • DTD ID handling optimization
    • bugfixes: xpath number with > 19 fractional (William Brack), push mode with unescaped '>' characters, fix xmllint --stream --timing, fix xmllint --memory --stream memory usage, xmlAttrSerializeTxtContent handling NULL, trying to fix Relax-NG/Perl interface.
    • python: 2.3 compatibility, whitespace fixes (Malcolm Tredinnick)
    • Added relaxng option to xmllint --shell

    2.6.6: Feb 12 2004

    • nanohttp and nanoftp: buffer overflow error on URI parsing (Igor and William) reported by Yuuichi Teranishi
    • bugfixes: make test and path issues, xmlWriter attribute serialization (William Brack), xmlWriter indentation (William), schemas validation (Eric Haszlakiewicz), XInclude dictionnaries issues (William and Oleg Paraschenko), XInclude empty fallback (William), HTML warnings (William), XPointer in XInclude (William), Python namespace serialization, isolat1ToUTF8 bound error (Alfred Mickautsch), output of parameter entities in internal subset (William), internal subset bug in push mode, <xs:all> fix (Alexey Sarytchev)
    • Build: fix for automake-1.8 (Alexander Winston), warnings removal (Philip Ludlam), SOCKLEN_T detection fixes (Daniel Richard), fix --with-minimum configuration.
    • XInclude: allow the 2001 namespace without warning.
    • Documentation: missing example/index.html (John Fleck), version dependancies (John Fleck)
    • reader API: structured error reporting (Steve Ball)
    • Windows compilation: mingw, msys (Mikhail Grushinskiy), function prototype (Cameron Johnson), MSVC6 compiler warnings, _WINSOCKAPI_ patch
    • Parsers: added xmlByteConsumed(ctxt) API to get the byte offest in input.

    2.6.5: Jan 25 2004

    • Bugfixes: dictionnaries for schemas (William Brack), regexp segfault (William), xs:all problem (William), a number of XPointer bugfixes (William), xmllint error go to stderr, DTD validation problem with namespace, memory leak (William), SAX1 cleanup and minimal options fixes (Mark Vadoc), parser context reset on error (Shaun McCance), XPath union evaluation problem (William) , xmlReallocLoc with NULL (Aleksey Sanin), XML Schemas double free (Steve Ball), XInclude with no href, argument callbacks order for XPath callbacks (Frederic Peters)
    • Documentation: python scripts (William Brack), xslt stylesheets (John Fleck), doc (Sven Zimmerman), I/O example.
    • Python bindings: fixes (William), enum support (Stéphane Bidoul), structured error reporting (Stéphane Bidoul)
    • XInclude: various fixes for conformance, problem related to dictionnary references (William & me), recursion (William)
    • xmlWriter: indentation (Lucas Brasilino), memory leaks (Alfred Mickautsch),
    • xmlSchemas: normalizedString datatype (John Belmonte)
    • code cleanup for strings functions (William)
    • Windows: compiler patches (Mark Vakoc)
    • Parser optimizations, a few new XPath and dictionnary APIs for future XSLT optimizations.

    2.6.4: Dec 24 2003

    • Windows build fixes (Igor Zlatkovic)
    • Some serious XInclude problems reported by Oleg Paraschenko and
    • Unix and Makefile packaging fixes (me, William Brack,
    • Documentation improvements (John Fleck, William Brack), example fix (Lucas Brasilino)
    • bugfixes: xmlTextReaderExpand() with xmlReaderWalker, XPath handling of NULL strings (William Brack) , API building reader or parser from filedescriptor should not close it, changed XPath sorting to be stable again (William Brack), xmlGetNodePath() generating '(null)' (William Brack), DTD validation and namespace bug (William Brack), XML Schemas double inclusion behaviour

    2.6.3: Dec 10 2003

    • documentation updates and cleanup (DV, William Brack, John Fleck)
    • added a repository of examples, examples from Aleksey Sanin, Dodji Seketeli, Alfred Mickautsch
    • Windows updates: Mark Vakoc, Igor Zlatkovic, Eric Zurcher, Mingw (Kenneth Haley)
    • Unicode range checking (William Brack)
    • code cleanup (William Brack)
    • Python bindings: doc (John Fleck), bug fixes
    • UTF-16 cleanup and BOM issues (William Brack)
    • bug fixes: ID and xmlReader validation, XPath (William Brack), xmlWriter (Alfred Mickautsch), hash.h inclusion problem, HTML parser (James Bursa), attribute defaulting and validation, some serialization cleanups, XML_GET_LINE macro, memory debug when using threads (William Brack), serialization of attributes and entities content, xmlWriter (Daniel Schulman)
    • XInclude bugfix, new APIs and update to the last version including the namespace change.
    • XML Schemas improvements: include (Robert Stepanek), import and namespace handling, fixed the regression tests troubles, added examples based on Eric van der Vlist book, regexp fixes
    • preliminary pattern support for streaming (needed for schemas constraints), added xmlTextReaderPreservePattern() to collect subdocument when streaming.
    • various fixes in the structured error handling

    2.6.2: Nov 4 2003

    • XPath context unregistration fixes
    • text node coalescing fixes (Mark Lilback)
    • API to screate a W3C Schemas from an existing document (Steve Ball)
    • BeOS patches (Marcin 'Shard' Konicki)
    • xmlStrVPrintf function added (Aleksey Sanin)
    • compilation fixes (Mark Vakoc)
    • stdin parsing fix (William Brack)
    • a posteriori DTD validation fixes
    • xmlReader bug fixes: Walker fixes, python bindings
    • fixed xmlStopParser() to really stop the parser and errors
    • always generate line numbers when using the new xmlReadxxx functions
    • added XInclude support to the xmlReader interface
    • implemented XML_PARSE_NONET parser option
    • DocBook XSLT processing bug fixed
    • HTML serialization for <p> elements (William Brack and me)
    • XPointer failure in XInclude are now handled as resource errors
    • fixed xmllint --html to use the HTML serializer on output (added --xmlout to implement the previous behaviour of saving it using the XML serializer)

    2.6.1: Oct 28 2003

    • Mostly bugfixes after the big 2.6.0 changes
    • Unix compilation patches: libxml.m4 (Patrick Welche), warnings cleanup (William Brack)
    • Windows compilation patches (Joachim Bauch, Stephane Bidoul, Igor Zlatkovic)
    • xmlWriter bugfix (Alfred Mickautsch)
    • chvalid.[ch]: couple of fixes from Stephane Bidoul
    • context reset: error state reset, push parser reset (Graham Bennett)
    • context reuse: generate errors if file is not readable
    • defaulted attributes for element coming from internal entities (Stephane Bidoul)
    • Python: tab and spaces mix (William Brack)
    • Error handler could crash in DTD validation in 2.6.0
    • xmlReader: do not use the document or element _private field
    • testSAX.c: avoid a problem with some PIs (Massimo Morara)
    • general bug fixes: mandatory encoding in text decl, serializing Document Fragment nodes, xmlSearchNs 2.6.0 problem (Kasimier Buchcik), XPath errors not reported, slow HTML parsing of large documents.

    2.6.0: Oct 20 2003

    • Major revision release: should be API and ABI compatible but got a lot of change
    • Increased the library modularity, far more options can be stripped out, a --with-minimum configuration will weight around 160KBytes
    • Use per parser and per document dictionnary, allocate names and small text nodes from the dictionnary
    • Switch to a SAX2 like parser rewrote most of the XML parser core, provides namespace resolution and defaulted attributes, minimize memory allocations and copies, namespace checking and specific error handling, immutable buffers, make predefined entities static structures, etc...
    • rewrote all the error handling in the library, all errors can be intercepted at a structured level, with precise information available.
    • New simpler and more generic XML and HTML parser APIs, allowing to easilly modify the parsing options and reuse parser context for multiple consecutive documents.
    • Similar new APIs for the xmlReader, for options and reuse, provided new functions to access content as const strings, use them for Python bindings
    • a lot of other smaller API improvements: xmlStrPrintf (Aleksey Sanin), Walker i.e. reader on a document tree based on Alfred Mickautsch code, make room in nodes for line numbers, reference counting and future PSVI extensions, generation of character ranges to be checked with faster algorithm (William), xmlParserMaxDepth (Crutcher Dunnavant), buffer access
    • New xmlWriter API provided by Alfred Mickautsch
    • Schemas: base64 support by Anthony Carrico
    • Parser<->HTTP integration fix, proper processing of the Mime-Type and charset information if available.
    • Relax-NG: bug fixes including the one reported by Martijn Faassen and zeroOrMore, better error reporting.
    • Python bindings (Stéphane Bidoul), never use stdout for errors output
    • Portability: all the headers have macros for export and calling convention definitions (Igor Zlatkovic), VMS update (Craig A. Berry), Windows: threads (Jesse Pelton), Borland compiler (Eric Zurcher, Igor), Mingw (Igor), typos (Mark Vakoc), beta version (Stephane Bidoul), warning cleanups on AIX and MIPS compilers (William Brack), BeOS (Marcin 'Shard' Konicki)
    • Documentation fixes and README (William Brack), search fix (William), tutorial updates (John Fleck), namespace docs (Stefan Kost)
    • Bug fixes: xmlCleanupParser (Dave Beckett), threading uninitialized mutexes, HTML doctype lowercase, SAX/IO (William), compression detection and restore (William), attribute declaration in DTDs (William), namespace on attribute in HTML output (William), input filename (Rob Richards), namespace DTD validation, xmlReplaceNode (Chris Ryland), I/O callbacks (Markus Keim), CDATA serialization (Shaun McCance), xmlReader (Peter Derr), high codepoint charref like &#x10FFFF;, buffer access in push mode (Justin Fletcher), TLS threads on Windows (Jesse Pelton), XPath bug (William), xmlCleanupParser (Marc Liyanage), CDATA output (William), HTTP error handling.
    • xmllint options: --dtdvalidfpi for Tobias Reif, --sax1 for compat testing, --nodict for building without tree dictionnary, --nocdata to replace CDATA by text, --nsclean to remove surperfluous namespace declarations
    • added xml2-config --libtool-libs option from Kevin P. Fleming
    • a lot of profiling and tuning of the code, speedup patch for xmlSearchNs() by Luca Padovani. The xmlReader should do far less allocation and it speed should get closer to SAX. Chris Anderson worked on speeding and cleaning up repetitive checking code.
    • cleanup of "make tests"
    • libxml-2.0-uninstalled.pc from Malcolm Tredinnick
    • deactivated the broken docBook SGML parser code and plugged the XML parser instead.

    2.5.11: Sep 9 2003

    A bugfix only release:

    • risk of crash in Relax-NG
    • risk of crash when using multithreaded programs

    2.5.10: Aug 15 2003

    A bugfixes only release

    • Windows Makefiles (William Brack)
    • UTF-16 support fixes (Mark Itzcovitz)
    • Makefile and portability (William Brack) automake, Linux alpha, Mingw on Windows (Mikhail Grushinskiy)
    • HTML parser (Oliver Stoeneberg)
    • XInclude performance problem reported by Kevin Ruscoe
    • XML parser performance problem reported by Grant Goodale
    • xmlSAXParseDTD() bug fix from Malcolm Tredinnick
    • and a couple other cleanup

    2.5.9: Aug 9 2003

    • bugfixes: IPv6 portability, xmlHasNsProp (Markus Keim), Windows build (Wiliam Brake, Jesse Pelton, Igor), Schemas (Peter Sobisch), threading (Rob Richards), hexBinary type (), UTF-16 BOM (Dodji Seketeli), xmlReader, Relax-NG schemas compilation, namespace handling, EXSLT (Sean Griffin), HTML parsing problem (William Brack), DTD validation for mixed content + namespaces, HTML serialization, library initialization, progressive HTML parser
    • better interfaces for Relax-NG error handling (Joachim Bauch, )
    • adding xmlXIncludeProcessTree() for XInclud'ing in a subtree
    • doc fixes and improvements (John Fleck)
    • configure flag for -with-fexceptions when embedding in C++
    • couple of new UTF-8 helper functions (William Brack)
    • general encoding cleanup + ISO-8859-x without iconv (Peter Jacobi)
    • xmlTextReader cleanup + enum for node types (Bjorn Reese)
    • general compilation/warning cleanup Solaris/HP-UX/... (William Brack)

    2.5.8: Jul 6 2003

    • bugfixes: XPath, XInclude, file/URI mapping, UTF-16 save (Mark Itzcovitz), UTF-8 checking, URI saving, error printing (William Brack), PI related memleak, compilation without schemas or without xpath (Joerg Schmitz-Linneweber/Garry Pennington), xmlUnlinkNode problem with DTDs, rpm problem on , i86_64, removed a few compilation problems from 2.5.7, xmlIOParseDTD, and xmlSAXParseDTD (Malcolm Tredinnick)
    • portability: DJGPP (MsDos) , OpenVMS (Craig A. Berry)
    • William Brack fixed multithreading lock problems
    • IPv6 patch for FTP and HTTP accesses (Archana Shah/Wipro)
    • Windows fixes (Igor Zlatkovic, Eric Zurcher), threading (Stéphane Bidoul)
    • A few W3C Schemas Structure improvements
    • W3C Schemas Datatype improvements (Charlie Bozeman)
    • Python bindings for thread globals (Stéphane Bidoul), and method/class generator
    • added --nonet option to xmllint
    • documentation improvements (John Fleck)

    2.5.7: Apr 25 2003

    • Relax-NG: Compiling to regexp and streaming validation on top of the xmlReader interface, added to xmllint --stream
    • xmlReader: Expand(), Next() and DOM access glue, bug fixes
    • Support for large files: RGN validated a 4.5GB instance
    • Thread support is now configured in by default
    • Fixes: update of the Trio code (Bjorn), WXS Date and Duration fixes (Charles Bozeman), DTD and namespaces (Brent Hendricks), HTML push parser and zero bytes handling, some missing Windows file path conversions, behaviour of the parser and validator in the presence of "out of memory" error conditions
    • extended the API to be able to plug a garbage collecting memory allocator, added xmlMallocAtomic() and modified the allocations accordingly.
    • Performances: removed excessive malloc() calls, speedup of the push and xmlReader interfaces, removed excessive thread locking
    • Documentation: man page (John Fleck), xmlReader documentation
    • Python: adding binding for xmlCatalogAddLocal (Brent M Hendricks)

    2.5.6: Apr 1 2003

    • Fixed W3C XML Schemas datatype, should be compliant now except for binHex and base64 which are not supported yet.
    • bug fixes: non-ASCII IDs, HTML output, XInclude on large docs and XInclude entities handling, encoding detection on external subsets, XML Schemas bugs and memory leaks, HTML parser (James Bursa)
    • portability: python/trio (Albert Chin), Sun compiler warnings
    • documentation: added --relaxng option to xmllint man page (John)
    • improved error reporting: xml:space, start/end tag mismatches, Relax NG errors

    2.5.5: Mar 24 2003

    • Lot of fixes on the Relax NG implementation. More testing including DocBook and TEI examples.
    • Increased the support for W3C XML Schemas datatype
    • Several bug fixes in the URI handling layer
    • Bug fixes: HTML parser, xmlReader, DTD validation, XPath, encoding conversion, line counting in the parser.
    • Added support for $XMLLINT_INDENT environment variable, FTP delete
    • Fixed the RPM spec file name

    2.5.4: Feb 20 2003

    • Conformance testing and lot of fixes on Relax NG and XInclude implementation
    • Implementation of XPointer element() scheme
    • Bug fixes: XML parser, XInclude entities merge, validity checking on namespaces,

      2 serialization bugs, node info generation problems, a DTD regexp generation problem.

    • Portability: windows updates and path canonicalization (Igor)
    • A few typo fixes (Kjartan Maraas)
    • Python bindings generator fixes (Stephane Bidoul)

    2.5.3: Feb 10 2003

    • RelaxNG and XML Schemas datatypes improvements, and added a first version of RelaxNG Python bindings
    • Fixes: XLink (Sean Chittenden), XInclude (Sean Chittenden), API fix for serializing namespace nodes, encoding conversion bug, XHTML1 serialization
    • Portability fixes: Windows (Igor), AMD 64bits RPM spec file

    2.5.2: Feb 5 2003

    • First implementation of RelaxNG, added --relaxng flag to xmllint
    • Schemas support now compiled in by default.
    • Bug fixes: DTD validation, namespace checking, XInclude and entities, delegateURI in XML Catalogs, HTML parser, XML reader (Stéphane Bidoul), XPath parser and evaluation, UTF8ToUTF8 serialization, XML reader memory consumption, HTML parser, HTML serialization in the presence of namespaces
    • added an HTML API to check elements and attributes.
    • Documentation improvement, PDF for the tutorial (John Fleck), doc patches (Stefan Kost)
    • Portability fixes: NetBSD (Julio Merino), Windows (Igor Zlatkovic)
    • Added python bindings for XPointer, contextual error reporting (Stéphane Bidoul)
    • URI/file escaping problems (Stefano Zacchiroli)

    2.5.1: Jan 8 2003

    • Fixes a memory leak and configuration/compilation problems in 2.5.0
    • documentation updates (John)
    • a couple of XmlTextReader fixes

    2.5.0: Jan 6 2003

    • New XmltextReader interface based on C# API (with help of Stéphane Bidoul)
    • Windows: more exports, including the new API (Igor)
    • XInclude fallback fix
    • Python: bindings for the new API, packaging (Stéphane Bidoul), drv_libxml2.py Python xml.sax driver (Stéphane Bidoul), fixes, speedup and iterators for Python-2.2 (Hannu Krosing)
    • Tutorial fixes (john Fleck and Niraj Tolia) xmllint man update (John)
    • Fix an XML parser bug raised by Vyacheslav Pindyura
    • Fix for VMS serialization (Nigel Hall) and config (Craig A. Berry)
    • Entities handling fixes
    • new API to optionally track node creation and deletion (Lukas Schroeder)
    • Added documentation for the XmltextReader interface and some XML guidelines

    2.4.30: Dec 12 2002

    • 2.4.29 broke the python bindings, rereleasing
    • Improvement/fixes of the XML API generator, and couple of minor code fixes.

    2.4.29: Dec 11 2002

    • Windows fixes (Igor): Windows CE port, pthread linking, python bindings (Stéphane Bidoul), Mingw (Magnus Henoch), and export list updates
    • Fix for prev in python bindings (ERDI Gergo)
    • Fix for entities handling (Marcus Clarke)
    • Refactored the XML and HTML dumps to a single code path, fixed XHTML1 dump
    • Fix for URI parsing when handling URNs with fragment identifiers
    • Fix for HTTP URL escaping problem
    • added an TextXmlReader (C#) like API (work in progress)
    • Rewrote the API in XML generation script, includes a C parser and saves more information needed for C# bindings

    2.4.28: Nov 22 2002

    • a couple of python binding fixes
    • 2 bug fixes in the XML push parser
    • potential memory leak removed (Martin Stoilov)
    • fix to the configure script for Unix (Dimitri Papadopoulos)
    • added encoding support for XInclude parse="text"
    • autodetection of XHTML1 and specific serialization rules added
    • nasty threading bug fixed (William Brack)

    2.4.27: Nov 17 2002

    • fixes for the Python bindings
    • a number of bug fixes: SGML catalogs, xmlParseBalancedChunkMemory(), HTML parser, Schemas (Charles Bozeman), document fragment support (Christian Glahn), xmlReconciliateNs (Brian Stafford), XPointer, xmlFreeNode(), xmlSAXParseMemory (Peter Jones), xmlGetNodePath (Petr Pajas), entities processing
    • added grep to xmllint --shell
    • VMS update patch from Craig A. Berry
    • cleanup of the Windows build with support for more compilers (Igor), better thread support on Windows
    • cleanup of Unix Makefiles and spec file
    • Improvements to the documentation (John Fleck)

    2.4.26: Oct 18 2002

    • Patches for Windows CE port, improvements on Windows paths handling
    • Fixes to the validation code (DTD and Schemas), xmlNodeGetPath() , HTML serialization, Namespace compliance, and a number of small problems

    2.4.25: Sep 26 2002

    • A number of bug fixes: XPath, validation, Python bindings, DOM and tree, xmlI/O, Html
    • Serious rewrite of XInclude
    • Made XML Schemas regexp part of the default build and APIs, small fix and improvement of the regexp core
    • Changed the validation code to reuse XML Schemas regexp APIs
    • Better handling of Windows file paths, improvement of Makefiles (Igor, Daniel Gehriger, Mark Vakoc)
    • Improved the python I/O bindings, the tests, added resolver and regexp APIs
    • New logos from Marc Liyanage
    • Tutorial improvements: John Fleck, Christopher Harris
    • Makefile: Fixes for AMD x86_64 (Mandrake), DESTDIR (Christophe Merlet)
    • removal of all stderr/perror use for error reporting
    • Better error reporting: XPath and DTD validation
    • update of the trio portability layer (Bjorn Reese)

    2.4.24: Aug 22 2002

    • XPath fixes (William), xf:escape-uri() (Wesley Terpstra)
    • Python binding fixes: makefiles (William), generator, rpm build, x86-64 (fcrozat)
    • HTML <style> and boolean attributes serializer fixes
    • C14N improvements by Aleksey
    • doc cleanups: Rick Jones
    • Windows compiler makefile updates: Igor and Elizabeth Barham
    • XInclude: implementation of fallback and xml:base fixup added

    2.4.23: July 6 2002

    • performances patches: Peter Jacobi
    • c14n fixes, testsuite and performances: Aleksey Sanin
    • added xmlDocFormatDump: Chema Celorio
    • new tutorial: John Fleck
    • new hash functions and performances: Sander Vesik, portability fix from Peter Jacobi
    • a number of bug fixes: XPath (William Brack, Richard Jinks), XML and HTML parsers, ID lookup function
    • removal of all remaining sprintf: Aleksey Sanin

    2.4.22: May 27 2002

    • a number of bug fixes: configure scripts, base handling, parser, memory usage, HTML parser, XPath, documentation (Christian Cornelssen), indentation, URI parsing
    • Optimizations for XMLSec, fixing and making public some of the network protocol handlers (Aleksey)
    • performance patch from Gary Pennington
    • Charles Bozeman provided date and time support for XML Schemas datatypes

    2.4.21: Apr 29 2002

    This release is both a bug fix release and also contains the early XML Schemas structures and datatypes code, beware, all interfaces are likely to change, there is huge holes, it is clearly a work in progress and don't even think of putting this code in a production system, it's actually not compiled in by default. The real fixes are:

    • a couple of bugs or limitations introduced in 2.4.20
    • patches for Borland C++ and MSC by Igor
    • some fixes on XPath strings and conformance patches by Richard Jinks
    • patch from Aleksey for the ExcC14N specification
    • OSF/1 bug fix by Bjorn

    2.4.20: Apr 15 2002

    • bug fixes: file descriptor leak, XPath, HTML output, DTD validation
    • XPath conformance testing by Richard Jinks
    • Portability fixes: Solaris, MPE/iX, Windows, OSF/1, python bindings, libxml.m4

    2.4.19: Mar 25 2002

    • bug fixes: half a dozen XPath bugs, Validation, ISO-Latin to UTF8 encoder
    • portability fixes in the HTTP code
    • memory allocation checks using valgrind, and profiling tests
    • revamp of the Windows build and Makefiles

    2.4.18: Mar 18 2002

    • bug fixes: tree, SAX, canonicalization, validation, portability, XPath
    • removed the --with-buffer option it was becoming unmaintainable
    • serious cleanup of the Python makefiles
    • speedup patch to XPath very effective for DocBook stylesheets
    • Fixes for Windows build, cleanup of the documentation

    2.4.17: Mar 8 2002

    • a lot of bug fixes, including "namespace nodes have no parents in XPath"
    • fixed/improved the Python wrappers, added more examples and more regression tests, XPath extension functions can now return node-sets
    • added the XML Canonicalization support from Aleksey Sanin

    2.4.16: Feb 20 2002

    • a lot of bug fixes, most of them were triggered by the XML Testsuite from OASIS and W3C. Compliance has been significantly improved.
    • a couple of portability fixes too.

    2.4.15: Feb 11 2002

    • Fixed the Makefiles, especially the python module ones
    • A few bug fixes and cleanup
    • Includes cleanup

    2.4.14: Feb 8 2002

    • Change of License to the MIT License basically for integration in XFree86 codebase, and removing confusion around the previous dual-licensing
    • added Python bindings, beta software but should already be quite complete
    • a large number of fixes and cleanups, especially for all tree manipulations
    • cleanup of the headers, generation of a reference API definition in XML

    2.4.13: Jan 14 2002

    • update of the documentation: John Fleck and Charlie Bozeman
    • cleanup of timing code from Justin Fletcher
    • fixes for Windows and initial thread support on Win32: Igor and Serguei Narojnyi
    • Cygwin patch from Robert Collins
    • added xmlSetEntityReferenceFunc() for Keith Isdale work on xsldbg

    2.4.12: Dec 7 2001

    • a few bug fixes: thread (Gary Pennington), xmllint (Geert Kloosterman), XML parser (Robin Berjon), XPointer (Danny Jamshy), I/O cleanups (robert)
    • Eric Lavigne contributed project files for MacOS
    • some makefiles cleanups

    2.4.11: Nov 26 2001

    • fixed a couple of errors in the includes, fixed a few bugs, some code cleanups
    • xmllint man pages improvement by Heiko Rupp
    • updated VMS build instructions from John A Fotheringham
    • Windows Makefiles updates from Igor

    2.4.10: Nov 10 2001

    • URI escaping fix (Joel Young)
    • added xmlGetNodePath() (for paths or XPointers generation)
    • Fixes namespace handling problems when using DTD and validation
    • improvements on xmllint: Morus Walter patches for --format and --encode, Stefan Kost and Heiko Rupp improvements on the --shell
    • fixes for xmlcatalog linking pointed by Weiqi Gao
    • fixes to the HTML parser

    2.4.9: Nov 6 2001

    • fixes more catalog bugs
    • avoid a compilation problem, improve xmlGetLineNo()

    2.4.8: Nov 4 2001

    • fixed SGML catalogs broken in previous release, updated xmlcatalog tool
    • fixed a compile errors and some includes troubles.

    2.4.7: Oct 30 2001

    • exported some debugging interfaces
    • serious rewrite of the catalog code
    • integrated Gary Pennington thread safety patch, added configure option and regression tests
    • removed an HTML parser bug
    • fixed a couple of potentially serious validation bugs
    • integrated the SGML DocBook support in xmllint
    • changed the nanoftp anonymous login passwd
    • some I/O cleanup and a couple of interfaces for Perl wrapper
    • general bug fixes
    • updated xmllint man page by John Fleck
    • some VMS and Windows updates

    2.4.6: Oct 10 2001

    • added an updated man pages by John Fleck
    • portability and configure fixes
    • an infinite loop on the HTML parser was removed (William)
    • Windows makefile patches from Igor
    • fixed half a dozen bugs reported for libxml or libxslt
    • updated xmlcatalog to be able to modify SGML super catalogs

    2.4.5: Sep 14 2001

    • Remove a few annoying bugs in 2.4.4
    • forces the HTML serializer to output decimal charrefs since some version of Netscape can't handle hexadecimal ones

    1.8.16: Sep 14 2001

    • maintenance release of the old libxml1 branch, couple of bug and portability fixes

    2.4.4: Sep 12 2001

    • added --convert to xmlcatalog, bug fixes and cleanups of XML Catalog
    • a few bug fixes and some portability changes
    • some documentation cleanups

    2.4.3: Aug 23 2001

    • XML Catalog support see the doc
    • New NaN/Infinity floating point code
    • A few bug fixes

    2.4.2: Aug 15 2001

    • adds xmlLineNumbersDefault() to control line number generation
    • lot of bug fixes
    • the Microsoft MSC projects files should now be up to date
    • inheritance of namespaces from DTD defaulted attributes
    • fixes a serious potential security bug
    • added a --format option to xmllint

    2.4.1: July 24 2001

    • possibility to keep line numbers in the tree
    • some computation NaN fixes
    • extension of the XPath API
    • cleanup for alpha and ia64 targets
    • patch to allow saving through HTTP PUT or POST

    2.4.0: July 10 2001

    • Fixed a few bugs in XPath, validation, and tree handling.
    • Fixed XML Base implementation, added a couple of examples to the regression tests
    • A bit of cleanup

    2.3.14: July 5 2001

    • fixed some entities problems and reduce memory requirement when substituting them
    • lots of improvements in the XPath queries interpreter can be substantially faster
    • Makefiles and configure cleanups
    • Fixes to XPath variable eval, and compare on empty node set
    • HTML tag closing bug fixed
    • Fixed an URI reference computation problem when validating

    2.3.13: June 28 2001

    • 2.3.12 configure.in was broken as well as the push mode XML parser
    • a few more fixes for compilation on Windows MSC by Yon Derek

    1.8.14: June 28 2001

    • Zbigniew Chyla gave a patch to use the old XML parser in push mode
    • Small Makefile fix

    2.3.12: June 26 2001

    • lots of cleanup
    • a couple of validation fix
    • fixed line number counting
    • fixed serious problems in the XInclude processing
    • added support for UTF8 BOM at beginning of entities
    • fixed a strange gcc optimizer bugs in xpath handling of float, gcc-3.0 miscompile uri.c (William), Thomas Leitner provided a fix for the optimizer on Tru64
    • incorporated Yon Derek and Igor Zlatkovic fixes and improvements for compilation on Windows MSC
    • update of libxml-doc.el (Felix Natter)
    • fixed 2 bugs in URI normalization code

    2.3.11: June 17 2001

    • updates to trio, Makefiles and configure should fix some portability problems (alpha)
    • fixed some HTML serialization problems (pre, script, and block/inline handling), added encoding aware APIs, cleanup of this code
    • added xmlHasNsProp()
    • implemented a specific PI for encoding support in the DocBook SGML parser
    • some XPath fixes (-Infinity, / as a function parameter and namespaces node selection)
    • fixed a performance problem and an error in the validation code
    • fixed XInclude routine to implement the recursive behaviour
    • fixed xmlFreeNode problem when libxml is included statically twice
    • added --version to xmllint for bug reports

    2.3.10: June 1 2001

    • fixed the SGML catalog support
    • a number of reported bugs got fixed, in XPath, iconv detection, XInclude processing
    • XPath string function should now handle unicode correctly

    2.3.9: May 19 2001

    Lots of bugfixes, and added a basic SGML catalog support:

    • HTML push bugfix #54891 and another patch from Jonas Borgström
    • some serious speed optimization again
    • some documentation cleanups
    • trying to get better linking on Solaris (-R)
    • XPath API cleanup from Thomas Broyer
    • Validation bug fixed #54631, added a patch from Gary Pennington, fixed xmlValidGetValidElements()
    • Added an INSTALL file
    • Attribute removal added to API: #54433
    • added a basic support for SGML catalogs
    • fixed xmlKeepBlanksDefault(0) API
    • bugfix in xmlNodeGetLang()
    • fixed a small configure portability problem
    • fixed an inversion of SYSTEM and PUBLIC identifier in HTML document

    1.8.13: May 14 2001

    • bugfixes release of the old libxml1 branch used by Gnome

    2.3.8: May 3 2001

    • Integrated an SGML DocBook parser for the Gnome project
    • Fixed a few things in the HTML parser
    • Fixed some XPath bugs raised by XSLT use, tried to fix the floating point portability issue
    • Speed improvement (8M/s for SAX, 3M/s for DOM, 1.5M/s for DOM+validation using the XML REC as input and a 700MHz celeron).
    • incorporated more Windows cleanup
    • added xmlSaveFormatFile()
    • fixed problems in copying nodes with entities references (gdome)
    • removed some troubles surrounding the new validation module

    2.3.7: April 22 2001

    • lots of small bug fixes, corrected XPointer
    • Non deterministic content model validation support
    • added xmlDocCopyNode for gdome2
    • revamped the way the HTML parser handles end of tags
    • XPath: corrections of namespaces support and number formatting
    • Windows: Igor Zlatkovic patches for MSC compilation
    • HTML output fixes from P C Chow and William M. Brack
    • Improved validation speed sensible for DocBook
    • fixed a big bug with ID declared in external parsed entities
    • portability fixes, update of Trio from Bjorn Reese

    2.3.6: April 8 2001

    • Code cleanup using extreme gcc compiler warning options, found and cleared half a dozen potential problem
    • the Eazel team found an XML parser bug
    • cleaned up the user of some of the string formatting function. used the trio library code to provide the one needed when the platform is missing them
    • xpath: removed a memory leak and fixed the predicate evaluation problem, extended the testsuite and cleaned up the result. XPointer seems broken ...

    2.3.5: Mar 23 2001

    • Biggest change is separate parsing and evaluation of XPath expressions, there is some new APIs for this too
    • included a number of bug fixes(XML push parser, 51876, notations, 52299)
    • Fixed some portability issues

    2.3.4: Mar 10 2001

    • Fixed bugs #51860 and #51861
    • Added a global variable xmlDefaultBufferSize to allow default buffer size to be application tunable.
    • Some cleanup in the validation code, still a bug left and this part should probably be rewritten to support ambiguous content model :-\
    • Fix a couple of serious bugs introduced or raised by changes in 2.3.3 parser
    • Fixed another bug in xmlNodeGetContent()
    • Bjorn fixed XPath node collection and Number formatting
    • Fixed a loop reported in the HTML parsing
    • blank space are reported even if the Dtd content model proves that they are formatting spaces, this is for XML conformance

    2.3.3: Mar 1 2001

    • small change in XPath for XSLT
    • documentation cleanups
    • fix in validation by Gary Pennington
    • serious parsing performances improvements

    2.3.2: Feb 24 2001

    • chasing XPath bugs, found a bunch, completed some TODO
    • fixed a Dtd parsing bug
    • fixed a bug in xmlNodeGetContent
    • ID/IDREF support partly rewritten by Gary Pennington

    2.3.1: Feb 15 2001

    • some XPath and HTML bug fixes for XSLT
    • small extension of the hash table interfaces for DOM gdome2 implementation
    • A few bug fixes

    2.3.0: Feb 8 2001 (2.2.12 was on 25 Jan but I didn't kept track)

    • Lots of XPath bug fixes
    • Add a mode with Dtd lookup but without validation error reporting for XSLT
    • Add support for text node without escaping (XSLT)
    • bug fixes for xmlCheckFilename
    • validation code bug fixes from Gary Pennington
    • Patch from Paul D. Smith correcting URI path normalization
    • Patch to allow simultaneous install of libxml-devel and libxml2-devel
    • the example Makefile is now fixed
    • added HTML to the RPM packages
    • tree copying bugfixes
    • updates to Windows makefiles
    • optimization patch from Bjorn Reese

    2.2.11: Jan 4 2001

    • bunch of bug fixes (memory I/O, xpath, ftp/http, ...)
    • added htmlHandleOmittedElem()
    • Applied Bjorn Reese's IPV6 first patch
    • Applied Paul D. Smith patches for validation of XInclude results
    • added XPointer xmlns() new scheme support

    2.2.10: Nov 25 2000

    • Fix the Windows problems of 2.2.8
    • integrate OpenVMS patches
    • better handling of some nasty HTML input
    • Improved the XPointer implementation
    • integrate a number of provided patches

    2.2.9: Nov 25 2000

    • erroneous release :-(

    2.2.8: Nov 13 2000

    • First version of XInclude support
    • Patch in conditional section handling
    • updated MS compiler project
    • fixed some XPath problems
    • added an URI escaping function
    • some other bug fixes

    2.2.7: Oct 31 2000

    • added message redirection
    • XPath improvements (thanks TOM !)
    • xmlIOParseDTD() added
    • various small fixes in the HTML, URI, HTTP and XPointer support
    • some cleanup of the Makefile, autoconf and the distribution content

    2.2.6: Oct 25 2000:

    • Added an hash table module, migrated a number of internal structure to those
    • Fixed a posteriori validation problems
    • HTTP module cleanups
    • HTML parser improvements (tag errors, script/style handling, attribute normalization)
    • coalescing of adjacent text nodes
    • couple of XPath bug fixes, exported the internal API

    2.2.5: Oct 15 2000:

    • XPointer implementation and testsuite
    • Lot of XPath fixes, added variable and functions registration, more tests
    • Portability fixes, lots of enhancements toward an easy Windows build and release
    • Late validation fixes
    • Integrated a lot of contributed patches
    • added memory management docs
    • a performance problem when using large buffer seems fixed

    2.2.4: Oct 1 2000:

    • main XPath problem fixed
    • Integrated portability patches for Windows
    • Serious bug fixes on the URI and HTML code

    2.2.3: Sep 17 2000

    • bug fixes
    • cleanup of entity handling code
    • overall review of all loops in the parsers, all sprintf usage has been checked too
    • Far better handling of larges Dtd. Validating against DocBook XML Dtd works smoothly now.

    1.8.10: Sep 6 2000

    • bug fix release for some Gnome projects

    2.2.2: August 12 2000

    • mostly bug fixes
    • started adding routines to access xml parser context options

    2.2.1: July 21 2000

    • a purely bug fixes release
    • fixed an encoding support problem when parsing from a memory block
    • fixed a DOCTYPE parsing problem
    • removed a bug in the function allowing to override the memory allocation routines

    2.2.0: July 14 2000

    • applied a lot of portability fixes
    • better encoding support/cleanup and saving (content is now always encoded in UTF-8)
    • the HTML parser now correctly handles encodings
    • added xmlHasProp()
    • fixed a serious problem with &#38;
    • propagated the fix to FTP client
    • cleanup, bugfixes, etc ...
    • Added a page about libxml Internationalization support

    1.8.9: July 9 2000

    • fixed the spec the RPMs should be better
    • fixed a serious bug in the FTP implementation, released 1.8.9 to solve rpmfind users problem

    2.1.1: July 1 2000

    • fixes a couple of bugs in the 2.1.0 packaging
    • improvements on the HTML parser

    2.1.0 and 1.8.8: June 29 2000

    • 1.8.8 is mostly a commodity package for upgrading to libxml2 according to new instructions. It fixes a nasty problem about &#38; charref parsing
    • 2.1.0 also ease the upgrade from libxml v1 to the recent version. it also contains numerous fixes and enhancements:
      • added xmlStopParser() to stop parsing
      • improved a lot parsing speed when there is large CDATA blocs
      • includes XPath patches provided by Picdar Technology
      • tried to fix as much as possible DTD validation and namespace related problems
      • output to a given encoding has been added/tested
      • lot of various fixes

    2.0.0: Apr 12 2000

    • First public release of libxml2. If you are using libxml, it's a good idea to check the 1.x to 2.x upgrade instructions. NOTE: while initially scheduled for Apr 3 the release occurred only on Apr 12 due to massive workload.
    • The include are now located under $prefix/include/libxml (instead of $prefix/include/gnome-xml), they also are referenced by
      #include <libxml/xxx.h>

      instead of

      #include "xxx.h"
    • a new URI module for parsing URIs and following strictly RFC 2396
    • the memory allocation routines used by libxml can now be overloaded dynamically by using xmlMemSetup()
    • The previously CVS only tool tester has been renamed xmllint and is now installed as part of the libxml2 package
    • The I/O interface has been revamped. There is now ways to plug in specific I/O modules, either at the URI scheme detection level using xmlRegisterInputCallbacks() or by passing I/O functions when creating a parser context using xmlCreateIOParserCtxt()
    • there is a C preprocessor macro LIBXML_VERSION providing the version number of the libxml module in use
    • a number of optional features of libxml can now be excluded at configure time (FTP/HTTP/HTML/XPath/Debug)

    2.0.0beta: Mar 14 2000

    • This is a first Beta release of libxml version 2
    • It's available only fromxmlsoft.org FTP, it's packaged as libxml2-2.0.0beta and available as tar and RPMs
    • This version is now the head in the Gnome CVS base, the old one is available under the tag LIB_XML_1_X
    • This includes a very large set of changes. From a programmatic point of view applications should not have to be modified too much, check the upgrade page
    • Some interfaces may changes (especially a bit about encoding).
    • the updates includes:
      • fix I18N support. ISO-Latin-x/UTF-8/UTF-16 (nearly) seems correctly handled now
      • Better handling of entities, especially well-formedness checking and proper PEref extensions in external subsets
      • DTD conditional sections
      • Validation now correctly handle entities content
      • change structures to accommodate DOM
    • Serious progress were made toward compliance, here are the result of the test against the OASIS testsuite (except the Japanese tests since I don't support that encoding yet). This URL is rebuilt every couple of hours using the CVS head version.

    1.8.7: Mar 6 2000

    • This is a bug fix release:
    • It is possible to disable the ignorable blanks heuristic used by libxml-1.x, a new function xmlKeepBlanksDefault(0) will allow this. Note that for adherence to XML spec, this behaviour will be disabled by default in 2.x . The same function will allow to keep compatibility for old code.
    • Blanks in <a> </a> constructs are not ignored anymore, avoiding heuristic is really the Right Way :-\
    • The unchecked use of snprintf which was breaking libxml-1.8.6 compilation on some platforms has been fixed
    • nanoftp.c nanohttp.c: Fixed '#' and '?' stripping when processing URIs

    1.8.6: Jan 31 2000

    • added a nanoFTP transport module, debugged until the new version of rpmfind can use it without troubles

    1.8.5: Jan 21 2000

    • adding APIs to parse a well balanced chunk of XML (production [43] content of the XML spec)
    • fixed a hideous bug in xmlGetProp pointed by Rune.Djurhuus@fast.no
    • Jody Goldberg <jgoldberg@home.com> provided another patch trying to solve the zlib checks problems
    • The current state in gnome CVS base is expected to ship as 1.8.5 with gnumeric soon

    1.8.4: Jan 13 2000

    • bug fixes, reintroduced xmlNewGlobalNs(), fixed xmlNewNs()
    • all exit() call should have been removed from libxml
    • fixed a problem with INCLUDE_WINSOCK on WIN32 platform
    • added newDocFragment()

    1.8.3: Jan 5 2000

    • a Push interface for the XML and HTML parsers
    • a shell-like interface to the document tree (try tester --shell :-)
    • lots of bug fixes and improvement added over XMas holidays
    • fixed the DTD parsing code to work with the xhtml DTD
    • added xmlRemoveProp(), xmlRemoveID() and xmlRemoveRef()
    • Fixed bugs in xmlNewNs()
    • External entity loading code has been revamped, now it uses xmlLoadExternalEntity(), some fix on entities processing were added
    • cleaned up WIN32 includes of socket stuff

    1.8.2: Dec 21 1999

    • I got another problem with includes and C++, I hope this issue is fixed for good this time
    • Added a few tree modification functions: xmlReplaceNode, xmlAddPrevSibling, xmlAddNextSibling, xmlNodeSetName and xmlDocSetRootElement
    • Tried to improve the HTML output with help from Chris Lahey

    1.8.1: Dec 18 1999

    • various patches to avoid troubles when using libxml with C++ compilers the "namespace" keyword and C escaping in include files
    • a problem in one of the core macros IS_CHAR was corrected
    • fixed a bug introduced in 1.8.0 breaking default namespace processing, and more specifically the Dia application
    • fixed a posteriori validation (validation after parsing, or by using a Dtd not specified in the original document)
    • fixed a bug in

    1.8.0: Dec 12 1999

    • cleanup, especially memory wise
    • the parser should be more reliable, especially the HTML one, it should not crash, whatever the input !
    • Integrated various patches, especially a speedup improvement for large dataset from Carl Nygard, configure with --with-buffers to enable them.
    • attribute normalization, oops should have been added long ago !
    • attributes defaulted from DTDs should be available, xmlSetProp() now does entities escaping by default.

    1.7.4: Oct 25 1999

    • Lots of HTML improvement
    • Fixed some errors when saving both XML and HTML
    • More examples, the regression tests should now look clean
    • Fixed a bug with contiguous charref

    1.7.3: Sep 29 1999

    • portability problems fixed
    • snprintf was used unconditionally, leading to link problems on system were it's not available, fixed

    1.7.1: Sep 24 1999

    • The basic type for strings manipulated by libxml has been renamed in 1.7.1 from CHAR to xmlChar. The reason is that CHAR was conflicting with a predefined type on Windows. However on non WIN32 environment, compatibility is provided by the way of a #define .
    • Changed another error : the use of a structure field called errno, and leading to troubles on platforms where it's a macro

    1.7.0: Sep 23 1999

    • Added the ability to fetch remote DTD or parsed entities, see the nanohttp module.
    • Added an errno to report errors by another mean than a simple printf like callback
    • Finished ID/IDREF support and checking when validation
    • Serious memory leaks fixed (there is now a memory wrapper module)
    • Improvement of XPath implementation
    • Added an HTML parser front-end

    Daniel Veillard

    libxml2-2.9.1+dfsg1/doc/catalog.html0000644000175000017500000005611712124524424015633 0ustar aronaron Catalog support
    Action against software patentsGnome2 LogoW3C LogoRed Hat Logo
    Made with Libxml2 Logo

    The XML C parser and toolkit of Gnome

    Catalog support

    Main Menu
    Related links

    Table of Content:

    1. General overview
    2. The definition
    3. Using catalogs
    4. Some examples
    5. How to tune catalog usage
    6. How to debug catalog processing
    7. How to create and maintain catalogs
    8. The implementor corner quick review of the API
    9. Other resources

    General overview

    What is a catalog? Basically it's a lookup mechanism used when an entity (a file or a remote resource) references another entity. The catalog lookup is inserted between the moment the reference is recognized by the software (XML parser, stylesheet processing, or even images referenced for inclusion in a rendering) and the time where loading that resource is actually started.

    It is basically used for 3 things:

    • mapping from "logical" names, the public identifiers and a more concrete name usable for download (and URI). For example it can associate the logical name

      "-//OASIS//DTD DocBook XML V4.1.2//EN"

      of the DocBook 4.1.2 XML DTD with the actual URL where it can be downloaded

      http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd

    • remapping from a given URL to another one, like an HTTP indirection saying that

      "http://www.oasis-open.org/committes/tr.xsl"

      should really be looked at

      "http://www.oasis-open.org/committes/entity/stylesheets/base/tr.xsl"

    • providing a local cache mechanism allowing to load the entities associated to public identifiers or remote resources, this is a really important feature for any significant deployment of XML or SGML since it allows to avoid the aleas and delays associated to fetching remote resources.

    The definitions

    Libxml, as of 2.4.3 implements 2 kind of catalogs:

    • the older SGML catalogs, the official spec is SGML Open Technical Resolution TR9401:1997, but is better understood by reading the SP Catalog page from James Clark. This is relatively old and not the preferred mode of operation of libxml.
    • XML Catalogs is far more flexible, more recent, uses an XML syntax and should scale quite better. This is the default option of libxml.

    Using catalog

    In a normal environment libxml2 will by default check the presence of a catalog in /etc/xml/catalog, and assuming it has been correctly populated, the processing is completely transparent to the document user. To take a concrete example, suppose you are authoring a DocBook document, this one starts with the following DOCTYPE definition:

    <?xml version='1.0'?>
    <!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V3.1.4//EN"
              "http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd">

    When validating the document with libxml, the catalog will be automatically consulted to lookup the public identifier "-//Norman Walsh//DTD DocBk XML V3.1.4//EN" and the system identifier "http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd", and if these entities have been installed on your system and the catalogs actually point to them, libxml will fetch them from the local disk.

    Note: Really don't use this DOCTYPE example it's a really old version, but is fine as an example.

    Libxml2 will check the catalog each time that it is requested to load an entity, this includes DTD, external parsed entities, stylesheets, etc ... If your system is correctly configured all the authoring phase and processing should use only local files, even if your document stays portable because it uses the canonical public and system ID, referencing the remote document.

    Some examples:

    Here is a couple of fragments from XML Catalogs used in libxml2 early regression tests in test/catalogs :

    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC 
       "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
       "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
      <public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN"
       uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/>
    ...

    This is the beginning of a catalog for DocBook 4.1.2, XML Catalogs are written in XML, there is a specific namespace for catalog elements "urn:oasis:names:tc:entity:xmlns:xml:catalog". The first entry in this catalog is a public mapping it allows to associate a Public Identifier with an URI.

    ...
        <rewriteSystem systemIdStartString="http://www.oasis-open.org/docbook/"
                       rewritePrefix="file:///usr/share/xml/docbook/"/>
    ...

    A rewriteSystem is a very powerful instruction, it says that any URI starting with a given prefix should be looked at another URI constructed by replacing the prefix with an new one. In effect this acts like a cache system for a full area of the Web. In practice it is extremely useful with a file prefix if you have installed a copy of those resources on your local system.

    ...
    <delegatePublic publicIdStartString="-//OASIS//DTD XML Catalog //"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegatePublic publicIdStartString="-//OASIS//ENTITIES DocBook XML"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegatePublic publicIdStartString="-//OASIS//DTD DocBook XML"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    <delegateURI uriStartString="http://www.oasis-open.org/docbook/"
                    catalog="file:///usr/share/xml/docbook.xml"/>
    ...

    Delegation is the core features which allows to build a tree of catalogs, easier to maintain than a single catalog, based on Public Identifier, System Identifier or URI prefixes it instructs the catalog software to look up entries in another resource. This feature allow to build hierarchies of catalogs, the set of entries presented should be sufficient to redirect the resolution of all DocBook references to the specific catalog in /usr/share/xml/docbook.xml this one in turn could delegate all references for DocBook 4.2.1 to a specific catalog installed at the same time as the DocBook resources on the local machine.

    How to tune catalog usage:

    The user can change the default catalog behaviour by redirecting queries to its own set of catalogs, this can be done by setting the XML_CATALOG_FILES environment variable to a list of catalogs, an empty one should deactivate loading the default /etc/xml/catalog default catalog

    How to debug catalog processing:

    Setting up the XML_DEBUG_CATALOG environment variable will make libxml2 output debugging information for each catalog operations, for example:

    orchis:~/XML -> xmllint --memory --noout test/ent2
    warning: failed to load external entity "title.xml"
    orchis:~/XML -> export XML_DEBUG_CATALOG=
    orchis:~/XML -> xmllint --memory --noout test/ent2
    Failed to parse catalog /etc/xml/catalog
    Failed to parse catalog /etc/xml/catalog
    warning: failed to load external entity "title.xml"
    Catalogs cleanup
    orchis:~/XML -> 

    The test/ent2 references an entity, running the parser from memory makes the base URI unavailable and the the "title.xml" entity cannot be loaded. Setting up the debug environment variable allows to detect that an attempt is made to load the /etc/xml/catalog but since it's not present the resolution fails.

    But the most advanced way to debug XML catalog processing is to use the xmlcatalog command shipped with libxml2, it allows to load catalogs and make resolution queries to see what is going on. This is also used for the regression tests:

    orchis:~/XML -> ./xmlcatalog test/catalogs/docbook.xml \
                       "-//OASIS//DTD DocBook XML V4.1.2//EN"
    http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
    orchis:~/XML -> 

    For debugging what is going on, adding one -v flags increase the verbosity level to indicate the processing done (adding a second flag also indicate what elements are recognized at parsing):

    orchis:~/XML -> ./xmlcatalog -v test/catalogs/docbook.xml \
                       "-//OASIS//DTD DocBook XML V4.1.2//EN"
    Parsing catalog test/catalogs/docbook.xml's content
    Found public match -//OASIS//DTD DocBook XML V4.1.2//EN
    http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
    Catalogs cleanup
    orchis:~/XML -> 

    A shell interface is also available to debug and process multiple queries (and for regression tests):

    orchis:~/XML -> ./xmlcatalog -shell test/catalogs/docbook.xml \
                       "-//OASIS//DTD DocBook XML V4.1.2//EN"
    > help   
    Commands available:
    public PublicID: make a PUBLIC identifier lookup
    system SystemID: make a SYSTEM identifier lookup
    resolve PublicID SystemID: do a full resolver lookup
    add 'type' 'orig' 'replace' : add an entry
    del 'values' : remove values
    dump: print the current catalog state
    debug: increase the verbosity level
    quiet: decrease the verbosity level
    exit:  quit the shell
    > public "-//OASIS//DTD DocBook XML V4.1.2//EN"
    http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
    > quit
    orchis:~/XML -> 

    This should be sufficient for most debugging purpose, this was actually used heavily to debug the XML Catalog implementation itself.

    How to create and maintain catalogs:

    Basically XML Catalogs are XML files, you can either use XML tools to manage them or use xmlcatalog for this. The basic step is to create a catalog the -create option provide this facility:

    orchis:~/XML -> ./xmlcatalog --create tst.xml
    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
             "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/>
    orchis:~/XML -> 

    By default xmlcatalog does not overwrite the original catalog and save the result on the standard output, this can be overridden using the -noout option. The -add command allows to add entries in the catalog:

    orchis:~/XML -> ./xmlcatalog --noout --create --add "public" \
      "-//OASIS//DTD DocBook XML V4.1.2//EN" \
      http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd tst.xml
    orchis:~/XML -> cat tst.xml
    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" \
      "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN"
            uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/>
    </catalog>
    orchis:~/XML -> 

    The -add option will always take 3 parameters even if some of the XML Catalog constructs (like nextCatalog) will have only a single argument, just pass a third empty string, it will be ignored.

    Similarly the -del option remove matching entries from the catalog:

    orchis:~/XML -> ./xmlcatalog --del \
      "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" tst.xml
    <?xml version="1.0"?>
    <!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
        "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/>
    orchis:~/XML -> 

    The catalog is now empty. Note that the matching of -del is exact and would have worked in a similar fashion with the Public ID string.

    This is rudimentary but should be sufficient to manage a not too complex catalog tree of resources.

    The implementor corner quick review of the API:

    First, and like for every other module of libxml, there is an automatically generated API page for catalog support.

    The header for the catalog interfaces should be included as:

    #include <libxml/catalog.h>

    The API is voluntarily kept very simple. First it is not obvious that applications really need access to it since it is the default behaviour of libxml2 (Note: it is possible to completely override libxml2 default catalog by using xmlSetExternalEntityLoader to plug an application specific resolver).

    Basically libxml2 support 2 catalog lists:

    • the default one, global shared by all the application
    • a per-document catalog, this one is built if the document uses the oasis-xml-catalog PIs to specify its own catalog list, it is associated to the parser context and destroyed when the parsing context is destroyed.

    the document one will be used first if it exists.

    Initialization routines:

    xmlInitializeCatalog(), xmlLoadCatalog() and xmlLoadCatalogs() should be used at startup to initialize the catalog, if the catalog should be initialized with specific values xmlLoadCatalog() or xmlLoadCatalogs() should be called before xmlInitializeCatalog() which would otherwise do a default initialization first.

    The xmlCatalogAddLocal() call is used by the parser to grow the document own catalog list if needed.

    Preferences setup:

    The XML Catalog spec requires the possibility to select default preferences between public and system delegation, xmlCatalogSetDefaultPrefer() allows this, xmlCatalogSetDefaults() and xmlCatalogGetDefaults() allow to control if XML Catalogs resolution should be forbidden, allowed for global catalog, for document catalog or both, the default is to allow both.

    And of course xmlCatalogSetDebug() allows to generate debug messages (through the xmlGenericError() mechanism).

    Querying routines:

    xmlCatalogResolve(), xmlCatalogResolveSystem(), xmlCatalogResolvePublic() and xmlCatalogResolveURI() are relatively explicit if you read the XML Catalog specification they correspond to section 7 algorithms, they should also work if you have loaded an SGML catalog with a simplified semantic.

    xmlCatalogLocalResolve() and xmlCatalogLocalResolveURI() are the same but operate on the document catalog list

    Cleanup and Miscellaneous:

    xmlCatalogCleanup() free-up the global catalog, xmlCatalogFreeLocal() is the per-document equivalent.

    xmlCatalogAdd() and xmlCatalogRemove() are used to dynamically modify the first catalog in the global list, and xmlCatalogDump() allows to dump a catalog state, those routines are primarily designed for xmlcatalog, I'm not sure that exposing more complex interfaces (like navigation ones) would be really useful.

    The xmlParseCatalogFile() is a function used to load XML Catalog files, it's similar as xmlParseFile() except it bypass all catalog lookups, it's provided because this functionality may be useful for client tools.

    threaded environments:

    Since the catalog tree is built progressively, some care has been taken to try to avoid troubles in multithreaded environments. The code is now thread safe assuming that the libxml2 library has been compiled with threads support.

    Other resources

    The XML Catalog specification is relatively recent so there isn't much literature to point at:

    • You can find a good rant from Norm Walsh about the need for catalogs, it provides a lot of context information even if I don't agree with everything presented. Norm also wrote a more recent article XML entities and URI resolvers describing them.
    • An old XML catalog proposal from John Cowan
    • The Resource Directory Description Language (RDDL) another catalog system but more oriented toward providing metadata for XML namespaces.
    • the page from the OASIS Technical Committee on Entity Resolution who maintains XML Catalog, you will find pointers to the specification update, some background and pointers to others tools providing XML Catalog support
    • There is a shell script to generate XML Catalogs for DocBook 4.1.2 . If it can write to the /etc/xml/ directory, it will set-up /etc/xml/catalog and /etc/xml/docbook based on the resources found on the system. Otherwise it will just create ~/xmlcatalog and ~/dbkxmlcatalog and doing:

      export XML_CATALOG_FILES=$HOME/xmlcatalog

      should allow to process DocBook documentations without requiring network accesses for the DTD or stylesheets

    • I have uploaded a small tarball containing XML Catalogs for DocBook 4.1.2 which seems to work fine for me too
    • The xmlcatalog manual page

    If you have suggestions for corrections or additions, simply contact me:

    Daniel Veillard

    libxml2-2.9.1+dfsg1/acinclude.m40000644000175000017500000000145412113312340014737 0ustar aronarondnl Like AC_TRY_EVAL but also errors out if the compiler generates dnl _any_ output. Some compilers might issue warnings which we want dnl to catch. AC_DEFUN([AC_TRY_EVAL2], [{ (eval echo configure:__oline__: \"[$]$1\") 1>&AS_MESSAGE_LOG_FD; dnl (eval [$]$1) 2>&AS_MESSAGE_LOG_FD; _out=`eval [$]$1 2>&1` && test "x$_out" = x; }]) dnl Like AC_TRY_COMPILE but calls AC_TRY_EVAL2 instead of AC_TRY_EVAL AC_DEFUN([AC_TRY_COMPILE2], [cat > conftest.$ac_ext <&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD ifelse([$4], , , [ rm -rf conftest* $4 ])dnl fi rm -f conftest*]) libxml2-2.9.1+dfsg1/HTMLparser.c0000644000175000017500000062545212113312340014705 0ustar aronaron/* * HTMLparser.c : an HTML 4.0 non-verifying parser * * See Copyright for the status of this software. * * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_HTML_ENABLED #include #ifdef HAVE_CTYPE_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_ZLIB_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include "buf.h" #include "enc.h" #define HTML_MAX_NAMELEN 1000 #define HTML_PARSER_BIG_BUFFER_SIZE 1000 #define HTML_PARSER_BUFFER_SIZE 100 /* #define DEBUG */ /* #define DEBUG_PUSH */ static int htmlOmittedDefaultValue = 1; xmlChar * htmlDecodeEntities(htmlParserCtxtPtr ctxt, int len, xmlChar end, xmlChar end2, xmlChar end3); static void htmlParseComment(htmlParserCtxtPtr ctxt); /************************************************************************ * * * Some factorized error routines * * * ************************************************************************/ /** * htmlErrMemory: * @ctxt: an HTML parser context * @extra: extra informations * * Handle a redefinition of attribute error */ static void htmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) { ctxt->errNo = XML_ERR_NO_MEMORY; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; } if (extra) __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, NULL, NULL, 0, 0, "Memory allocation failed : %s\n", extra); else __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "Memory allocation failed\n"); } /** * htmlParseErr: * @ctxt: an HTML parser context * @error: the error number * @msg: the error message * @str1: string infor * @str2: string infor * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void htmlParseErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, const xmlChar *str1, const xmlChar *str2) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, str1, str2); if (ctxt != NULL) ctxt->wellFormed = 0; } /** * htmlParseErrInt: * @ctxt: an HTML parser context * @error: the error number * @msg: the error message * @val: integer info * * Handle a fatal parser error, i.e. violating Well-Formedness constraints */ static void htmlParseErrInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, int val) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, val, 0, msg, val); if (ctxt != NULL) ctxt->wellFormed = 0; } /************************************************************************ * * * Parser stacks related functions and macros * * * ************************************************************************/ /** * htmlnamePush: * @ctxt: an HTML parser context * @value: the element name * * Pushes a new element name on top of the name stack * * Returns 0 in case of error, the index in the stack otherwise */ static int htmlnamePush(htmlParserCtxtPtr ctxt, const xmlChar * value) { if ((ctxt->html < 3) && (xmlStrEqual(value, BAD_CAST "head"))) ctxt->html = 3; if ((ctxt->html < 10) && (xmlStrEqual(value, BAD_CAST "body"))) ctxt->html = 10; if (ctxt->nameNr >= ctxt->nameMax) { ctxt->nameMax *= 2; ctxt->nameTab = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, ctxt->nameMax * sizeof(ctxt->nameTab[0])); if (ctxt->nameTab == NULL) { htmlErrMemory(ctxt, NULL); return (0); } } ctxt->nameTab[ctxt->nameNr] = value; ctxt->name = value; return (ctxt->nameNr++); } /** * htmlnamePop: * @ctxt: an HTML parser context * * Pops the top element name from the name stack * * Returns the name just removed */ static const xmlChar * htmlnamePop(htmlParserCtxtPtr ctxt) { const xmlChar *ret; if (ctxt->nameNr <= 0) return (NULL); ctxt->nameNr--; if (ctxt->nameNr < 0) return (NULL); if (ctxt->nameNr > 0) ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; else ctxt->name = NULL; ret = ctxt->nameTab[ctxt->nameNr]; ctxt->nameTab[ctxt->nameNr] = NULL; return (ret); } /** * htmlNodeInfoPush: * @ctxt: an HTML parser context * @value: the node info * * Pushes a new element name on top of the node info stack * * Returns 0 in case of error, the index in the stack otherwise */ static int htmlNodeInfoPush(htmlParserCtxtPtr ctxt, htmlParserNodeInfo *value) { if (ctxt->nodeInfoNr >= ctxt->nodeInfoMax) { if (ctxt->nodeInfoMax == 0) ctxt->nodeInfoMax = 5; ctxt->nodeInfoMax *= 2; ctxt->nodeInfoTab = (htmlParserNodeInfo *) xmlRealloc((htmlParserNodeInfo *)ctxt->nodeInfoTab, ctxt->nodeInfoMax * sizeof(ctxt->nodeInfoTab[0])); if (ctxt->nodeInfoTab == NULL) { htmlErrMemory(ctxt, NULL); return (0); } } ctxt->nodeInfoTab[ctxt->nodeInfoNr] = *value; ctxt->nodeInfo = &ctxt->nodeInfoTab[ctxt->nodeInfoNr]; return (ctxt->nodeInfoNr++); } /** * htmlNodeInfoPop: * @ctxt: an HTML parser context * * Pops the top element name from the node info stack * * Returns 0 in case of error, the pointer to NodeInfo otherwise */ static htmlParserNodeInfo * htmlNodeInfoPop(htmlParserCtxtPtr ctxt) { if (ctxt->nodeInfoNr <= 0) return (NULL); ctxt->nodeInfoNr--; if (ctxt->nodeInfoNr < 0) return (NULL); if (ctxt->nodeInfoNr > 0) ctxt->nodeInfo = &ctxt->nodeInfoTab[ctxt->nodeInfoNr - 1]; else ctxt->nodeInfo = NULL; return &ctxt->nodeInfoTab[ctxt->nodeInfoNr]; } /* * Macros for accessing the content. Those should be used only by the parser, * and not exported. * * Dirty macros, i.e. one need to make assumption on the context to use them * * CUR_PTR return the current pointer to the xmlChar to be parsed. * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled * in ISO-Latin or UTF-8, and the current 16 bit value if compiled * in UNICODE mode. This should be used internally by the parser * only to compare to ASCII values otherwise it would break when * running with UTF-8 encoding. * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only * to compare on ASCII based substring. * UPP(n) returns the n'th next xmlChar converted to uppercase. Same as CUR * it should be used only to compare on ASCII based substring. * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined * strings without newlines within the parser. * * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding * * CURRENT Returns the current char value, with the full decoding of * UTF-8 if we are using this mode. It returns an int. * NEXT Skip to the next character, this does the proper decoding * in UTF-8 mode. It also pop-up unfinished entities on the fly. * NEXTL(l) Skip the current unicode character of l xmlChars long. * COPY(to) copy one char to *to, increment CUR_PTR and to accordingly */ #define UPPER (toupper(*ctxt->input->cur)) #define SKIP(val) ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val) #define NXT(val) ctxt->input->cur[(val)] #define UPP(val) (toupper(ctxt->input->cur[(val)])) #define CUR_PTR ctxt->input->cur #define SHRINK if ((ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ xmlParserInputShrink(ctxt->input) #define GROW if ((ctxt->progressive == 0) && \ (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ xmlParserInputGrow(ctxt->input, INPUT_CHUNK) #define CURRENT ((int) (*ctxt->input->cur)) #define SKIP_BLANKS htmlSkipBlankChars(ctxt) /* Inported from XML */ /* #define CUR (ctxt->token ? ctxt->token : (int) (*ctxt->input->cur)) */ #define CUR ((int) (*ctxt->input->cur)) #define NEXT xmlNextChar(ctxt) #define RAW (ctxt->token ? -1 : (*ctxt->input->cur)) #define NEXTL(l) do { \ if (*(ctxt->input->cur) == '\n') { \ ctxt->input->line++; ctxt->input->col = 1; \ } else ctxt->input->col++; \ ctxt->token = 0; ctxt->input->cur += l; ctxt->nbChars++; \ } while (0) /************ \ if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ if (*ctxt->input->cur == '&') xmlParserHandleReference(ctxt); ************/ #define CUR_CHAR(l) htmlCurrentChar(ctxt, &l) #define CUR_SCHAR(s, l) xmlStringCurrentChar(ctxt, s, &l) #define COPY_BUF(l,b,i,v) \ if (l == 1) b[i++] = (xmlChar) v; \ else i += xmlCopyChar(l,&b[i],v) /** * htmlFindEncoding: * @the HTML parser context * * Ty to find and encoding in the current data available in the input * buffer this is needed to try to switch to the proper encoding when * one face a character error. * That's an heuristic, since it's operating outside of parsing it could * try to use a meta which had been commented out, that's the reason it * should only be used in case of error, not as a default. * * Returns an encoding string or NULL if not found, the string need to * be freed */ static xmlChar * htmlFindEncoding(xmlParserCtxtPtr ctxt) { const xmlChar *start, *cur, *end; if ((ctxt == NULL) || (ctxt->input == NULL) || (ctxt->input->encoding != NULL) || (ctxt->input->buf == NULL) || (ctxt->input->buf->encoder != NULL)) return(NULL); if ((ctxt->input->cur == NULL) || (ctxt->input->end == NULL)) return(NULL); start = ctxt->input->cur; end = ctxt->input->end; /* we also expect the input buffer to be zero terminated */ if (*end != 0) return(NULL); cur = xmlStrcasestr(start, BAD_CAST "HTTP-EQUIV"); if (cur == NULL) return(NULL); cur = xmlStrcasestr(cur, BAD_CAST "CONTENT"); if (cur == NULL) return(NULL); cur = xmlStrcasestr(cur, BAD_CAST "CHARSET="); if (cur == NULL) return(NULL); cur += 8; start = cur; while (((*cur >= 'A') && (*cur <= 'Z')) || ((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= '0') && (*cur <= '9')) || (*cur == '-') || (*cur == '_') || (*cur == ':') || (*cur == '/')) cur++; if (cur == start) return(NULL); return(xmlStrndup(start, cur - start)); } /** * htmlCurrentChar: * @ctxt: the HTML parser context * @len: pointer to the length of the char read * * The current char value, if using UTF-8 this may actually span multiple * bytes in the input buffer. Implement the end of line normalization: * 2.11 End-of-Line Handling * If the encoding is unspecified, in the case we find an ISO-Latin-1 * char, then the encoding converter is plugged in automatically. * * Returns the current char value and its length */ static int htmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { if (ctxt->instate == XML_PARSER_EOF) return(0); if (ctxt->token != 0) { *len = 0; return(ctxt->token); } if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { /* * We are supposed to handle UTF8, check it's valid * From rfc2044: encoding of the Unicode values on UTF-8: * * UCS-4 range (hex.) UTF-8 octet sequence (binary) * 0000 0000-0000 007F 0xxxxxxx * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx * * Check for the 0x110000 limit too */ const unsigned char *cur = ctxt->input->cur; unsigned char c; unsigned int val; c = *cur; if (c & 0x80) { if (cur[1] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if ((cur[1] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xe0) == 0xe0) { if (cur[2] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if ((cur[2] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xf0) == 0xf0) { if (cur[3] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80)) goto encoding_error; /* 4-byte code */ *len = 4; val = (cur[0] & 0x7) << 18; val |= (cur[1] & 0x3f) << 12; val |= (cur[2] & 0x3f) << 6; val |= cur[3] & 0x3f; } else { /* 3-byte code */ *len = 3; val = (cur[0] & 0xf) << 12; val |= (cur[1] & 0x3f) << 6; val |= cur[2] & 0x3f; } } else { /* 2-byte code */ *len = 2; val = (cur[0] & 0x1f) << 6; val |= cur[1] & 0x3f; } if (!IS_CHAR(val)) { htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, "Char 0x%X out of allowed range\n", val); } return(val); } else { if ((*ctxt->input->cur == 0) && (ctxt->input->cur < ctxt->input->end)) { htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, "Char 0x%X out of allowed range\n", 0); *len = 1; return(' '); } /* 1-byte code */ *len = 1; return((int) *ctxt->input->cur); } } /* * Assume it's a fixed length encoding (1) with * a compatible encoding for the ASCII set, since * XML constructs only use < 128 chars */ *len = 1; if ((int) *ctxt->input->cur < 0x80) return((int) *ctxt->input->cur); /* * Humm this is bad, do an automatic flow conversion */ { xmlChar * guess; xmlCharEncodingHandlerPtr handler; guess = htmlFindEncoding(ctxt); if (guess == NULL) { xmlSwitchEncoding(ctxt, XML_CHAR_ENCODING_8859_1); } else { if (ctxt->input->encoding != NULL) xmlFree((xmlChar *) ctxt->input->encoding); ctxt->input->encoding = guess; handler = xmlFindCharEncodingHandler((const char *) guess); if (handler != NULL) { xmlSwitchToEncoding(ctxt, handler); } else { htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, "Unsupported encoding %s", guess, NULL); } } ctxt->charset = XML_CHAR_ENCODING_UTF8; } return(xmlCurrentChar(ctxt, len)); encoding_error: /* * If we detect an UTF8 error that probably mean that the * input encoding didn't get properly advertized in the * declaration header. Report the error and switch the encoding * to ISO-Latin-1 (if you don't like this policy, just declare the * encoding !) */ { char buffer[150]; if (ctxt->input->end - ctxt->input->cur >= 4) { snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", ctxt->input->cur[0], ctxt->input->cur[1], ctxt->input->cur[2], ctxt->input->cur[3]); } else { snprintf(buffer, 149, "Bytes: 0x%02X\n", ctxt->input->cur[0]); } htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, "Input is not proper UTF-8, indicate encoding !\n", BAD_CAST buffer, NULL); } ctxt->charset = XML_CHAR_ENCODING_8859_1; *len = 1; return((int) *ctxt->input->cur); } /** * htmlSkipBlankChars: * @ctxt: the HTML parser context * * skip all blanks character found at that point in the input streams. * * Returns the number of space chars skipped */ static int htmlSkipBlankChars(xmlParserCtxtPtr ctxt) { int res = 0; while (IS_BLANK_CH(*(ctxt->input->cur))) { if ((*ctxt->input->cur == 0) && (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) { xmlPopInput(ctxt); } else { if (*(ctxt->input->cur) == '\n') { ctxt->input->line++; ctxt->input->col = 1; } else ctxt->input->col++; ctxt->input->cur++; ctxt->nbChars++; if (*ctxt->input->cur == 0) xmlParserInputGrow(ctxt->input, INPUT_CHUNK); } res++; } return(res); } /************************************************************************ * * * The list of HTML elements and their properties * * * ************************************************************************/ /* * Start Tag: 1 means the start tag can be ommited * End Tag: 1 means the end tag can be ommited * 2 means it's forbidden (empty elements) * 3 means the tag is stylistic and should be closed easily * Depr: this element is deprecated * DTD: 1 means that this element is valid only in the Loose DTD * 2 means that this element is valid only in the Frameset DTD * * Name,Start Tag,End Tag,Save End,Empty,Deprecated,DTD,inline,Description , subElements , impliedsubelt , Attributes, userdata */ /* Definitions and a couple of vars for HTML Elements */ #define FONTSTYLE "tt", "i", "b", "u", "s", "strike", "big", "small" #define NB_FONTSTYLE 8 #define PHRASE "em", "strong", "dfn", "code", "samp", "kbd", "var", "cite", "abbr", "acronym" #define NB_PHRASE 10 #define SPECIAL "a", "img", "applet", "embed", "object", "font", "basefont", "br", "script", "map", "q", "sub", "sup", "span", "bdo", "iframe" #define NB_SPECIAL 16 #define INLINE FONTSTYLE, PHRASE, SPECIAL, FORMCTRL #define NB_INLINE NB_PCDATA + NB_FONTSTYLE + NB_PHRASE + NB_SPECIAL + NB_FORMCTRL #define BLOCK HEADING, LIST, "pre", "p", "dl", "div", "center", "noscript", "noframes", "blockquote", "form", "isindex", "hr", "table", "fieldset", "address" #define NB_BLOCK NB_HEADING + NB_LIST + 14 #define FORMCTRL "input", "select", "textarea", "label", "button" #define NB_FORMCTRL 5 #define PCDATA #define NB_PCDATA 0 #define HEADING "h1", "h2", "h3", "h4", "h5", "h6" #define NB_HEADING 6 #define LIST "ul", "ol", "dir", "menu" #define NB_LIST 4 #define MODIFIER #define NB_MODIFIER 0 #define FLOW BLOCK,INLINE #define NB_FLOW NB_BLOCK + NB_INLINE #define EMPTY NULL static const char* const html_flow[] = { FLOW, NULL } ; static const char* const html_inline[] = { INLINE, NULL } ; /* placeholders: elts with content but no subelements */ static const char* const html_pcdata[] = { NULL } ; #define html_cdata html_pcdata /* ... and for HTML Attributes */ #define COREATTRS "id", "class", "style", "title" #define NB_COREATTRS 4 #define I18N "lang", "dir" #define NB_I18N 2 #define EVENTS "onclick", "ondblclick", "onmousedown", "onmouseup", "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup" #define NB_EVENTS 9 #define ATTRS COREATTRS,I18N,EVENTS #define NB_ATTRS NB_NB_COREATTRS + NB_I18N + NB_EVENTS #define CELLHALIGN "align", "char", "charoff" #define NB_CELLHALIGN 3 #define CELLVALIGN "valign" #define NB_CELLVALIGN 1 static const char* const html_attrs[] = { ATTRS, NULL } ; static const char* const core_i18n_attrs[] = { COREATTRS, I18N, NULL } ; static const char* const core_attrs[] = { COREATTRS, NULL } ; static const char* const i18n_attrs[] = { I18N, NULL } ; /* Other declarations that should go inline ... */ static const char* const a_attrs[] = { ATTRS, "charset", "type", "name", "href", "hreflang", "rel", "rev", "accesskey", "shape", "coords", "tabindex", "onfocus", "onblur", NULL } ; static const char* const target_attr[] = { "target", NULL } ; static const char* const rows_cols_attr[] = { "rows", "cols", NULL } ; static const char* const alt_attr[] = { "alt", NULL } ; static const char* const src_alt_attrs[] = { "src", "alt", NULL } ; static const char* const href_attrs[] = { "href", NULL } ; static const char* const clear_attrs[] = { "clear", NULL } ; static const char* const inline_p[] = { INLINE, "p", NULL } ; static const char* const flow_param[] = { FLOW, "param", NULL } ; static const char* const applet_attrs[] = { COREATTRS , "codebase", "archive", "alt", "name", "height", "width", "align", "hspace", "vspace", NULL } ; static const char* const area_attrs[] = { "shape", "coords", "href", "nohref", "tabindex", "accesskey", "onfocus", "onblur", NULL } ; static const char* const basefont_attrs[] = { "id", "size", "color", "face", NULL } ; static const char* const quote_attrs[] = { ATTRS, "cite", NULL } ; static const char* const body_contents[] = { FLOW, "ins", "del", NULL } ; static const char* const body_attrs[] = { ATTRS, "onload", "onunload", NULL } ; static const char* const body_depr[] = { "background", "bgcolor", "text", "link", "vlink", "alink", NULL } ; static const char* const button_attrs[] = { ATTRS, "name", "value", "type", "disabled", "tabindex", "accesskey", "onfocus", "onblur", NULL } ; static const char* const col_attrs[] = { ATTRS, "span", "width", CELLHALIGN, CELLVALIGN, NULL } ; static const char* const col_elt[] = { "col", NULL } ; static const char* const edit_attrs[] = { ATTRS, "datetime", "cite", NULL } ; static const char* const compact_attrs[] = { ATTRS, "compact", NULL } ; static const char* const dl_contents[] = { "dt", "dd", NULL } ; static const char* const compact_attr[] = { "compact", NULL } ; static const char* const label_attr[] = { "label", NULL } ; static const char* const fieldset_contents[] = { FLOW, "legend" } ; static const char* const font_attrs[] = { COREATTRS, I18N, "size", "color", "face" , NULL } ; static const char* const form_contents[] = { HEADING, LIST, INLINE, "pre", "p", "div", "center", "noscript", "noframes", "blockquote", "isindex", "hr", "table", "fieldset", "address", NULL } ; static const char* const form_attrs[] = { ATTRS, "method", "enctype", "accept", "name", "onsubmit", "onreset", "accept-charset", NULL } ; static const char* const frame_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "noresize", "scrolling" , NULL } ; static const char* const frameset_attrs[] = { COREATTRS, "rows", "cols", "onload", "onunload", NULL } ; static const char* const frameset_contents[] = { "frameset", "frame", "noframes", NULL } ; static const char* const head_attrs[] = { I18N, "profile", NULL } ; static const char* const head_contents[] = { "title", "isindex", "base", "script", "style", "meta", "link", "object", NULL } ; static const char* const hr_depr[] = { "align", "noshade", "size", "width", NULL } ; static const char* const version_attr[] = { "version", NULL } ; static const char* const html_content[] = { "head", "body", "frameset", NULL } ; static const char* const iframe_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "scrolling", "align", "height", "width", NULL } ; static const char* const img_attrs[] = { ATTRS, "longdesc", "name", "height", "width", "usemap", "ismap", NULL } ; static const char* const embed_attrs[] = { COREATTRS, "align", "alt", "border", "code", "codebase", "frameborder", "height", "hidden", "hspace", "name", "palette", "pluginspace", "pluginurl", "src", "type", "units", "vspace", "width", NULL } ; static const char* const input_attrs[] = { ATTRS, "type", "name", "value", "checked", "disabled", "readonly", "size", "maxlength", "src", "alt", "usemap", "ismap", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", "accept", NULL } ; static const char* const prompt_attrs[] = { COREATTRS, I18N, "prompt", NULL } ; static const char* const label_attrs[] = { ATTRS, "for", "accesskey", "onfocus", "onblur", NULL } ; static const char* const legend_attrs[] = { ATTRS, "accesskey", NULL } ; static const char* const align_attr[] = { "align", NULL } ; static const char* const link_attrs[] = { ATTRS, "charset", "href", "hreflang", "type", "rel", "rev", "media", NULL } ; static const char* const map_contents[] = { BLOCK, "area", NULL } ; static const char* const name_attr[] = { "name", NULL } ; static const char* const action_attr[] = { "action", NULL } ; static const char* const blockli_elt[] = { BLOCK, "li", NULL } ; static const char* const meta_attrs[] = { I18N, "http-equiv", "name", "scheme", "charset", NULL } ; static const char* const content_attr[] = { "content", NULL } ; static const char* const type_attr[] = { "type", NULL } ; static const char* const noframes_content[] = { "body", FLOW MODIFIER, NULL } ; static const char* const object_contents[] = { FLOW, "param", NULL } ; static const char* const object_attrs[] = { ATTRS, "declare", "classid", "codebase", "data", "type", "codetype", "archive", "standby", "height", "width", "usemap", "name", "tabindex", NULL } ; static const char* const object_depr[] = { "align", "border", "hspace", "vspace", NULL } ; static const char* const ol_attrs[] = { "type", "compact", "start", NULL} ; static const char* const option_elt[] = { "option", NULL } ; static const char* const optgroup_attrs[] = { ATTRS, "disabled", NULL } ; static const char* const option_attrs[] = { ATTRS, "disabled", "label", "selected", "value", NULL } ; static const char* const param_attrs[] = { "id", "value", "valuetype", "type", NULL } ; static const char* const width_attr[] = { "width", NULL } ; static const char* const pre_content[] = { PHRASE, "tt", "i", "b", "u", "s", "strike", "a", "br", "script", "map", "q", "span", "bdo", "iframe", NULL } ; static const char* const script_attrs[] = { "charset", "src", "defer", "event", "for", NULL } ; static const char* const language_attr[] = { "language", NULL } ; static const char* const select_content[] = { "optgroup", "option", NULL } ; static const char* const select_attrs[] = { ATTRS, "name", "size", "multiple", "disabled", "tabindex", "onfocus", "onblur", "onchange", NULL } ; static const char* const style_attrs[] = { I18N, "media", "title", NULL } ; static const char* const table_attrs[] = { ATTRS, "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "datapagesize", NULL } ; static const char* const table_depr[] = { "align", "bgcolor", NULL } ; static const char* const table_contents[] = { "caption", "col", "colgroup", "thead", "tfoot", "tbody", "tr", NULL} ; static const char* const tr_elt[] = { "tr", NULL } ; static const char* const talign_attrs[] = { ATTRS, CELLHALIGN, CELLVALIGN, NULL} ; static const char* const th_td_depr[] = { "nowrap", "bgcolor", "width", "height", NULL } ; static const char* const th_td_attr[] = { ATTRS, "abbr", "axis", "headers", "scope", "rowspan", "colspan", CELLHALIGN, CELLVALIGN, NULL } ; static const char* const textarea_attrs[] = { ATTRS, "name", "disabled", "readonly", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", NULL } ; static const char* const tr_contents[] = { "th", "td", NULL } ; static const char* const bgcolor_attr[] = { "bgcolor", NULL } ; static const char* const li_elt[] = { "li", NULL } ; static const char* const ul_depr[] = { "type", "compact", NULL} ; static const char* const dir_attr[] = { "dir", NULL} ; #define DECL (const char**) static const htmlElemDesc html40ElementTable[] = { { "a", 0, 0, 0, 0, 0, 0, 1, "anchor ", DECL html_inline , NULL , DECL a_attrs , DECL target_attr, NULL }, { "abbr", 0, 0, 0, 0, 0, 0, 1, "abbreviated form", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "acronym", 0, 0, 0, 0, 0, 0, 1, "", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "address", 0, 0, 0, 0, 0, 0, 0, "information on author ", DECL inline_p , NULL , DECL html_attrs, NULL, NULL }, { "applet", 0, 0, 0, 0, 1, 1, 2, "java applet ", DECL flow_param , NULL , NULL , DECL applet_attrs, NULL }, { "area", 0, 2, 2, 1, 0, 0, 0, "client-side image map area ", EMPTY , NULL , DECL area_attrs , DECL target_attr, DECL alt_attr }, { "b", 0, 3, 0, 0, 0, 0, 1, "bold text style", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "base", 0, 2, 2, 1, 0, 0, 0, "document base uri ", EMPTY , NULL , NULL , DECL target_attr, DECL href_attrs }, { "basefont", 0, 2, 2, 1, 1, 1, 1, "base font size " , EMPTY , NULL , NULL, DECL basefont_attrs, NULL }, { "bdo", 0, 0, 0, 0, 0, 0, 1, "i18n bidi over-ride ", DECL html_inline , NULL , DECL core_i18n_attrs, NULL, DECL dir_attr }, { "big", 0, 3, 0, 0, 0, 0, 1, "large text style", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "blockquote", 0, 0, 0, 0, 0, 0, 0, "long quotation ", DECL html_flow , NULL , DECL quote_attrs , NULL, NULL }, { "body", 1, 1, 0, 0, 0, 0, 0, "document body ", DECL body_contents , "div" , DECL body_attrs, DECL body_depr, NULL }, { "br", 0, 2, 2, 1, 0, 0, 1, "forced line break ", EMPTY , NULL , DECL core_attrs, DECL clear_attrs , NULL }, { "button", 0, 0, 0, 0, 0, 0, 2, "push button ", DECL html_flow MODIFIER , NULL , DECL button_attrs, NULL, NULL }, { "caption", 0, 0, 0, 0, 0, 0, 0, "table caption ", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "center", 0, 3, 0, 0, 1, 1, 0, "shorthand for div align=center ", DECL html_flow , NULL , NULL, DECL html_attrs, NULL }, { "cite", 0, 0, 0, 0, 0, 0, 1, "citation", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "code", 0, 0, 0, 0, 0, 0, 1, "computer code fragment", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "col", 0, 2, 2, 1, 0, 0, 0, "table column ", EMPTY , NULL , DECL col_attrs , NULL, NULL }, { "colgroup", 0, 1, 0, 0, 0, 0, 0, "table column group ", DECL col_elt , "col" , DECL col_attrs , NULL, NULL }, { "dd", 0, 1, 0, 0, 0, 0, 0, "definition description ", DECL html_flow , NULL , DECL html_attrs, NULL, NULL }, { "del", 0, 0, 0, 0, 0, 0, 2, "deleted text ", DECL html_flow , NULL , DECL edit_attrs , NULL, NULL }, { "dfn", 0, 0, 0, 0, 0, 0, 1, "instance definition", DECL html_inline , NULL , DECL html_attrs, NULL, NULL }, { "dir", 0, 0, 0, 0, 1, 1, 0, "directory list", DECL blockli_elt, "li" , NULL, DECL compact_attrs, NULL }, { "div", 0, 0, 0, 0, 0, 0, 0, "generic language/style container", DECL html_flow, NULL, DECL html_attrs, DECL align_attr, NULL }, { "dl", 0, 0, 0, 0, 0, 0, 0, "definition list ", DECL dl_contents , "dd" , DECL html_attrs, DECL compact_attr, NULL }, { "dt", 0, 1, 0, 0, 0, 0, 0, "definition term ", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "em", 0, 3, 0, 0, 0, 0, 1, "emphasis", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "embed", 0, 1, 0, 0, 1, 1, 1, "generic embedded object ", EMPTY, NULL, DECL embed_attrs, NULL, NULL }, { "fieldset", 0, 0, 0, 0, 0, 0, 0, "form control group ", DECL fieldset_contents , NULL, DECL html_attrs, NULL, NULL }, { "font", 0, 3, 0, 0, 1, 1, 1, "local change to font ", DECL html_inline, NULL, NULL, DECL font_attrs, NULL }, { "form", 0, 0, 0, 0, 0, 0, 0, "interactive form ", DECL form_contents, "fieldset", DECL form_attrs , DECL target_attr, DECL action_attr }, { "frame", 0, 2, 2, 1, 0, 2, 0, "subwindow " , EMPTY, NULL, NULL, DECL frame_attrs, NULL }, { "frameset", 0, 0, 0, 0, 0, 2, 0, "window subdivision" , DECL frameset_contents, "noframes" , NULL , DECL frameset_attrs, NULL }, { "h1", 0, 0, 0, 0, 0, 0, 0, "heading ", DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL }, { "h2", 0, 0, 0, 0, 0, 0, 0, "heading ", DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL }, { "h3", 0, 0, 0, 0, 0, 0, 0, "heading ", DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL }, { "h4", 0, 0, 0, 0, 0, 0, 0, "heading ", DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL }, { "h5", 0, 0, 0, 0, 0, 0, 0, "heading ", DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL }, { "h6", 0, 0, 0, 0, 0, 0, 0, "heading ", DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL }, { "head", 1, 1, 0, 0, 0, 0, 0, "document head ", DECL head_contents, NULL, DECL head_attrs, NULL, NULL }, { "hr", 0, 2, 2, 1, 0, 0, 0, "horizontal rule " , EMPTY, NULL, DECL html_attrs, DECL hr_depr, NULL }, { "html", 1, 1, 0, 0, 0, 0, 0, "document root element ", DECL html_content , NULL , DECL i18n_attrs, DECL version_attr, NULL }, { "i", 0, 3, 0, 0, 0, 0, 1, "italic text style", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "iframe", 0, 0, 0, 0, 0, 1, 2, "inline subwindow ", DECL html_flow, NULL, NULL, DECL iframe_attrs, NULL }, { "img", 0, 2, 2, 1, 0, 0, 1, "embedded image ", EMPTY, NULL, DECL img_attrs, DECL align_attr, DECL src_alt_attrs }, { "input", 0, 2, 2, 1, 0, 0, 1, "form control ", EMPTY, NULL, DECL input_attrs , DECL align_attr, NULL }, { "ins", 0, 0, 0, 0, 0, 0, 2, "inserted text", DECL html_flow, NULL, DECL edit_attrs, NULL, NULL }, { "isindex", 0, 2, 2, 1, 1, 1, 0, "single line prompt ", EMPTY, NULL, NULL, DECL prompt_attrs, NULL }, { "kbd", 0, 0, 0, 0, 0, 0, 1, "text to be entered by the user", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "label", 0, 0, 0, 0, 0, 0, 1, "form field label text ", DECL html_inline MODIFIER, NULL, DECL label_attrs , NULL, NULL }, { "legend", 0, 0, 0, 0, 0, 0, 0, "fieldset legend ", DECL html_inline, NULL, DECL legend_attrs , DECL align_attr, NULL }, { "li", 0, 1, 1, 0, 0, 0, 0, "list item ", DECL html_flow, NULL, DECL html_attrs, NULL, NULL }, { "link", 0, 2, 2, 1, 0, 0, 0, "a media-independent link ", EMPTY, NULL, DECL link_attrs, DECL target_attr, NULL }, { "map", 0, 0, 0, 0, 0, 0, 2, "client-side image map ", DECL map_contents , NULL, DECL html_attrs , NULL, DECL name_attr }, { "menu", 0, 0, 0, 0, 1, 1, 0, "menu list ", DECL blockli_elt , NULL, NULL, DECL compact_attrs, NULL }, { "meta", 0, 2, 2, 1, 0, 0, 0, "generic metainformation ", EMPTY, NULL, DECL meta_attrs , NULL , DECL content_attr }, { "noframes", 0, 0, 0, 0, 0, 2, 0, "alternate content container for non frame-based rendering ", DECL noframes_content, "body" , DECL html_attrs, NULL, NULL }, { "noscript", 0, 0, 0, 0, 0, 0, 0, "alternate content container for non script-based rendering ", DECL html_flow, "div", DECL html_attrs, NULL, NULL }, { "object", 0, 0, 0, 0, 0, 0, 2, "generic embedded object ", DECL object_contents , "div" , DECL object_attrs, DECL object_depr, NULL }, { "ol", 0, 0, 0, 0, 0, 0, 0, "ordered list ", DECL li_elt , "li" , DECL html_attrs, DECL ol_attrs, NULL }, { "optgroup", 0, 0, 0, 0, 0, 0, 0, "option group ", DECL option_elt , "option", DECL optgroup_attrs, NULL, DECL label_attr }, { "option", 0, 1, 0, 0, 0, 0, 0, "selectable choice " , DECL html_pcdata, NULL, DECL option_attrs, NULL, NULL }, { "p", 0, 1, 0, 0, 0, 0, 0, "paragraph ", DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL }, { "param", 0, 2, 2, 1, 0, 0, 0, "named property value ", EMPTY, NULL, DECL param_attrs, NULL, DECL name_attr }, { "pre", 0, 0, 0, 0, 0, 0, 0, "preformatted text ", DECL pre_content, NULL, DECL html_attrs, DECL width_attr, NULL }, { "q", 0, 0, 0, 0, 0, 0, 1, "short inline quotation ", DECL html_inline, NULL, DECL quote_attrs, NULL, NULL }, { "s", 0, 3, 0, 0, 1, 1, 1, "strike-through text style", DECL html_inline, NULL, NULL, DECL html_attrs, NULL }, { "samp", 0, 0, 0, 0, 0, 0, 1, "sample program output, scripts, etc.", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "script", 0, 0, 0, 0, 0, 0, 2, "script statements ", DECL html_cdata, NULL, DECL script_attrs, DECL language_attr, DECL type_attr }, { "select", 0, 0, 0, 0, 0, 0, 1, "option selector ", DECL select_content, NULL, DECL select_attrs, NULL, NULL }, { "small", 0, 3, 0, 0, 0, 0, 1, "small text style", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "span", 0, 0, 0, 0, 0, 0, 1, "generic language/style container ", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "strike", 0, 3, 0, 0, 1, 1, 1, "strike-through text", DECL html_inline, NULL, NULL, DECL html_attrs, NULL }, { "strong", 0, 3, 0, 0, 0, 0, 1, "strong emphasis", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "style", 0, 0, 0, 0, 0, 0, 0, "style info ", DECL html_cdata, NULL, DECL style_attrs, NULL, DECL type_attr }, { "sub", 0, 3, 0, 0, 0, 0, 1, "subscript", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "sup", 0, 3, 0, 0, 0, 0, 1, "superscript ", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "table", 0, 0, 0, 0, 0, 0, 0, "", DECL table_contents , "tr" , DECL table_attrs , DECL table_depr, NULL }, { "tbody", 1, 0, 0, 0, 0, 0, 0, "table body ", DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL }, { "td", 0, 0, 0, 0, 0, 0, 0, "table data cell", DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL }, { "textarea", 0, 0, 0, 0, 0, 0, 1, "multi-line text field ", DECL html_pcdata, NULL, DECL textarea_attrs, NULL, DECL rows_cols_attr }, { "tfoot", 0, 1, 0, 0, 0, 0, 0, "table footer ", DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL }, { "th", 0, 1, 0, 0, 0, 0, 0, "table header cell", DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL }, { "thead", 0, 1, 0, 0, 0, 0, 0, "table header ", DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL }, { "title", 0, 0, 0, 0, 0, 0, 0, "document title ", DECL html_pcdata, NULL, DECL i18n_attrs, NULL, NULL }, { "tr", 0, 0, 0, 0, 0, 0, 0, "table row ", DECL tr_contents , "td" , DECL talign_attrs, DECL bgcolor_attr, NULL }, { "tt", 0, 3, 0, 0, 0, 0, 1, "teletype or monospaced text style", DECL html_inline, NULL, DECL html_attrs, NULL, NULL }, { "u", 0, 3, 0, 0, 1, 1, 1, "underlined text style", DECL html_inline, NULL, NULL, DECL html_attrs, NULL }, { "ul", 0, 0, 0, 0, 0, 0, 0, "unordered list ", DECL li_elt , "li" , DECL html_attrs, DECL ul_depr, NULL }, { "var", 0, 0, 0, 0, 0, 0, 1, "instance of a variable or program argument", DECL html_inline, NULL, DECL html_attrs, NULL, NULL } }; /* * start tags that imply the end of current element */ static const char * const htmlStartClose[] = { "form", "form", "p", "hr", "h1", "h2", "h3", "h4", "h5", "h6", "dl", "ul", "ol", "menu", "dir", "address", "pre", "listing", "xmp", "head", NULL, "head", "p", NULL, "title", "p", NULL, "body", "head", "style", "link", "title", "p", NULL, "frameset", "head", "style", "link", "title", "p", NULL, "li", "p", "h1", "h2", "h3", "h4", "h5", "h6", "dl", "address", "pre", "listing", "xmp", "head", "li", NULL, "hr", "p", "head", NULL, "h1", "p", "head", NULL, "h2", "p", "head", NULL, "h3", "p", "head", NULL, "h4", "p", "head", NULL, "h5", "p", "head", NULL, "h6", "p", "head", NULL, "dir", "p", "head", NULL, "address", "p", "head", "ul", NULL, "pre", "p", "head", "ul", NULL, "listing", "p", "head", NULL, "xmp", "p", "head", NULL, "blockquote", "p", "head", NULL, "dl", "p", "dt", "menu", "dir", "address", "pre", "listing", "xmp", "head", NULL, "dt", "p", "menu", "dir", "address", "pre", "listing", "xmp", "head", "dd", NULL, "dd", "p", "menu", "dir", "address", "pre", "listing", "xmp", "head", "dt", NULL, "ul", "p", "head", "ol", "menu", "dir", "address", "pre", "listing", "xmp", NULL, "ol", "p", "head", "ul", NULL, "menu", "p", "head", "ul", NULL, "p", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", FONTSTYLE, NULL, "div", "p", "head", NULL, "noscript", "p", NULL, "center", "font", "b", "i", "p", "head", NULL, "a", "a", "head", NULL, "caption", "p", NULL, "colgroup", "caption", "colgroup", "col", "p", NULL, "col", "caption", "col", "p", NULL, "table", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", "pre", "listing", "xmp", "a", NULL, "th", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, "td", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, "tr", "th", "td", "tr", "caption", "col", "colgroup", "p", NULL, "thead", "caption", "col", "colgroup", NULL, "tfoot", "th", "td", "tr", "caption", "col", "colgroup", "thead", "tbody", "p", NULL, "tbody", "th", "td", "tr", "caption", "col", "colgroup", "thead", "tfoot", "tbody", "p", NULL, "optgroup", "option", NULL, "option", "option", NULL, "fieldset", "legend", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", "pre", "listing", "xmp", "a", NULL, /* most tags in in FONTSTYLE, PHRASE and SPECIAL should close */ "tt", "head", NULL, "i", "head", NULL, "b", "head", NULL, "u", "head", NULL, "s", "head", NULL, "strike", "head", NULL, "big", "head", NULL, "small", "head", NULL, "em", "head", NULL, "strong", "head", NULL, "dfn", "head", NULL, "code", "head", NULL, "samp", "head", NULL, "kbd", "head", NULL, "var", "head", NULL, "cite", "head", NULL, "abbr", "head", NULL, "acronym", "head", NULL, /* "a" */ "img", "head", NULL, /* "applet" */ /* "embed" */ /* "object" */ "font", "head", NULL, /* "basefont" */ "br", "head", NULL, /* "script" */ "map", "head", NULL, "q", "head", NULL, "sub", "head", NULL, "sup", "head", NULL, "span", "head", NULL, "bdo", "head", NULL, "iframe", "head", NULL, NULL }; /* * The list of HTML elements which are supposed not to have * CDATA content and where a p element will be implied * * TODO: extend that list by reading the HTML SGML DTD on * implied paragraph */ static const char *const htmlNoContentElements[] = { "html", "head", NULL }; /* * The list of HTML attributes which are of content %Script; * NOTE: when adding ones, check htmlIsScriptAttribute() since * it assumes the name starts with 'on' */ static const char *const htmlScriptAttributes[] = { "onclick", "ondblclick", "onmousedown", "onmouseup", "onmouseover", "onmousemove", "onmouseout", "onkeypress", "onkeydown", "onkeyup", "onload", "onunload", "onfocus", "onblur", "onsubmit", "onrest", "onchange", "onselect" }; /* * This table is used by the htmlparser to know what to do with * broken html pages. By assigning different priorities to different * elements the parser can decide how to handle extra endtags. * Endtags are only allowed to close elements with lower or equal * priority. */ typedef struct { const char *name; int priority; } elementPriority; static const elementPriority htmlEndPriority[] = { {"div", 150}, {"td", 160}, {"th", 160}, {"tr", 170}, {"thead", 180}, {"tbody", 180}, {"tfoot", 180}, {"table", 190}, {"head", 200}, {"body", 200}, {"html", 220}, {NULL, 100} /* Default priority */ }; static const char** htmlStartCloseIndex[100]; static int htmlStartCloseIndexinitialized = 0; /************************************************************************ * * * functions to handle HTML specific data * * * ************************************************************************/ /** * htmlInitAutoClose: * * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. * This is not reentrant. Call xmlInitParser() once before processing in * case of use in multithreaded programs. */ void htmlInitAutoClose(void) { int indx, i = 0; if (htmlStartCloseIndexinitialized) return; for (indx = 0;indx < 100;indx ++) htmlStartCloseIndex[indx] = NULL; indx = 0; while ((htmlStartClose[i] != NULL) && (indx < 100 - 1)) { htmlStartCloseIndex[indx++] = (const char**) &htmlStartClose[i]; while (htmlStartClose[i] != NULL) i++; i++; } htmlStartCloseIndexinitialized = 1; } /** * htmlTagLookup: * @tag: The tag name in lowercase * * Lookup the HTML tag in the ElementTable * * Returns the related htmlElemDescPtr or NULL if not found. */ const htmlElemDesc * htmlTagLookup(const xmlChar *tag) { unsigned int i; for (i = 0; i < (sizeof(html40ElementTable) / sizeof(html40ElementTable[0]));i++) { if (!xmlStrcasecmp(tag, BAD_CAST html40ElementTable[i].name)) return((htmlElemDescPtr) &html40ElementTable[i]); } return(NULL); } /** * htmlGetEndPriority: * @name: The name of the element to look up the priority for. * * Return value: The "endtag" priority. **/ static int htmlGetEndPriority (const xmlChar *name) { int i = 0; while ((htmlEndPriority[i].name != NULL) && (!xmlStrEqual((const xmlChar *)htmlEndPriority[i].name, name))) i++; return(htmlEndPriority[i].priority); } /** * htmlCheckAutoClose: * @newtag: The new tag name * @oldtag: The old tag name * * Checks whether the new tag is one of the registered valid tags for * closing old. * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. * * Returns 0 if no, 1 if yes. */ static int htmlCheckAutoClose(const xmlChar * newtag, const xmlChar * oldtag) { int i, indx; const char **closed = NULL; if (htmlStartCloseIndexinitialized == 0) htmlInitAutoClose(); /* inefficient, but not a big deal */ for (indx = 0; indx < 100; indx++) { closed = htmlStartCloseIndex[indx]; if (closed == NULL) return (0); if (xmlStrEqual(BAD_CAST * closed, newtag)) break; } i = closed - htmlStartClose; i++; while (htmlStartClose[i] != NULL) { if (xmlStrEqual(BAD_CAST htmlStartClose[i], oldtag)) { return (1); } i++; } return (0); } /** * htmlAutoCloseOnClose: * @ctxt: an HTML parser context * @newtag: The new tag name * @force: force the tag closure * * The HTML DTD allows an ending tag to implicitly close other tags. */ static void htmlAutoCloseOnClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) { const htmlElemDesc *info; int i, priority; priority = htmlGetEndPriority(newtag); for (i = (ctxt->nameNr - 1); i >= 0; i--) { if (xmlStrEqual(newtag, ctxt->nameTab[i])) break; /* * A missplaced endtag can only close elements with lower * or equal priority, so if we find an element with higher * priority before we find an element with * matching name, we just ignore this endtag */ if (htmlGetEndPriority(ctxt->nameTab[i]) > priority) return; } if (i < 0) return; while (!xmlStrEqual(newtag, ctxt->name)) { info = htmlTagLookup(ctxt->name); if ((info != NULL) && (info->endTag == 3)) { htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, "Opening and ending tag mismatch: %s and %s\n", newtag, ctxt->name); } if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); htmlnamePop(ctxt); } } /** * htmlAutoCloseOnEnd: * @ctxt: an HTML parser context * * Close all remaining tags at the end of the stream */ static void htmlAutoCloseOnEnd(htmlParserCtxtPtr ctxt) { int i; if (ctxt->nameNr == 0) return; for (i = (ctxt->nameNr - 1); i >= 0; i--) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); htmlnamePop(ctxt); } } /** * htmlAutoClose: * @ctxt: an HTML parser context * @newtag: The new tag name or NULL * * The HTML DTD allows a tag to implicitly close other tags. * The list is kept in htmlStartClose array. This function is * called when a new tag has been detected and generates the * appropriates closes if possible/needed. * If newtag is NULL this mean we are at the end of the resource * and we should check */ static void htmlAutoClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) { while ((newtag != NULL) && (ctxt->name != NULL) && (htmlCheckAutoClose(newtag, ctxt->name))) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); htmlnamePop(ctxt); } if (newtag == NULL) { htmlAutoCloseOnEnd(ctxt); return; } while ((newtag == NULL) && (ctxt->name != NULL) && ((xmlStrEqual(ctxt->name, BAD_CAST "head")) || (xmlStrEqual(ctxt->name, BAD_CAST "body")) || (xmlStrEqual(ctxt->name, BAD_CAST "html")))) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, ctxt->name); htmlnamePop(ctxt); } } /** * htmlAutoCloseTag: * @doc: the HTML document * @name: The tag name * @elem: the HTML element * * The HTML DTD allows a tag to implicitly close other tags. * The list is kept in htmlStartClose array. This function checks * if the element or one of it's children would autoclose the * given tag. * * Returns 1 if autoclose, 0 otherwise */ int htmlAutoCloseTag(htmlDocPtr doc, const xmlChar *name, htmlNodePtr elem) { htmlNodePtr child; if (elem == NULL) return(1); if (xmlStrEqual(name, elem->name)) return(0); if (htmlCheckAutoClose(elem->name, name)) return(1); child = elem->children; while (child != NULL) { if (htmlAutoCloseTag(doc, name, child)) return(1); child = child->next; } return(0); } /** * htmlIsAutoClosed: * @doc: the HTML document * @elem: the HTML element * * The HTML DTD allows a tag to implicitly close other tags. * The list is kept in htmlStartClose array. This function checks * if a tag is autoclosed by one of it's child * * Returns 1 if autoclosed, 0 otherwise */ int htmlIsAutoClosed(htmlDocPtr doc, htmlNodePtr elem) { htmlNodePtr child; if (elem == NULL) return(1); child = elem->children; while (child != NULL) { if (htmlAutoCloseTag(doc, elem->name, child)) return(1); child = child->next; } return(0); } /** * htmlCheckImplied: * @ctxt: an HTML parser context * @newtag: The new tag name * * The HTML DTD allows a tag to exists only implicitly * called when a new tag has been detected and generates the * appropriates implicit tags if missing */ static void htmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { int i; if (ctxt->options & HTML_PARSE_NOIMPLIED) return; if (!htmlOmittedDefaultValue) return; if (xmlStrEqual(newtag, BAD_CAST"html")) return; if (ctxt->nameNr <= 0) { htmlnamePush(ctxt, BAD_CAST"html"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"html", NULL); } if ((xmlStrEqual(newtag, BAD_CAST"body")) || (xmlStrEqual(newtag, BAD_CAST"head"))) return; if ((ctxt->nameNr <= 1) && ((xmlStrEqual(newtag, BAD_CAST"script")) || (xmlStrEqual(newtag, BAD_CAST"style")) || (xmlStrEqual(newtag, BAD_CAST"meta")) || (xmlStrEqual(newtag, BAD_CAST"link")) || (xmlStrEqual(newtag, BAD_CAST"title")) || (xmlStrEqual(newtag, BAD_CAST"base")))) { if (ctxt->html >= 3) { /* we already saw or generated an before */ return; } /* * dropped OBJECT ... i you put it first BODY will be * assumed ! */ htmlnamePush(ctxt, BAD_CAST"head"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"head", NULL); } else if ((!xmlStrEqual(newtag, BAD_CAST"noframes")) && (!xmlStrEqual(newtag, BAD_CAST"frame")) && (!xmlStrEqual(newtag, BAD_CAST"frameset"))) { if (ctxt->html >= 10) { /* we already saw or generated a before */ return; } for (i = 0;i < ctxt->nameNr;i++) { if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"body")) { return; } if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"head")) { return; } } htmlnamePush(ctxt, BAD_CAST"body"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"body", NULL); } } /** * htmlCheckParagraph * @ctxt: an HTML parser context * * Check whether a p element need to be implied before inserting * characters in the current element. * * Returns 1 if a paragraph has been inserted, 0 if not and -1 * in case of error. */ static int htmlCheckParagraph(htmlParserCtxtPtr ctxt) { const xmlChar *tag; int i; if (ctxt == NULL) return(-1); tag = ctxt->name; if (tag == NULL) { htmlAutoClose(ctxt, BAD_CAST"p"); htmlCheckImplied(ctxt, BAD_CAST"p"); htmlnamePush(ctxt, BAD_CAST"p"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); return(1); } if (!htmlOmittedDefaultValue) return(0); for (i = 0; htmlNoContentElements[i] != NULL; i++) { if (xmlStrEqual(tag, BAD_CAST htmlNoContentElements[i])) { htmlAutoClose(ctxt, BAD_CAST"p"); htmlCheckImplied(ctxt, BAD_CAST"p"); htmlnamePush(ctxt, BAD_CAST"p"); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); return(1); } } return(0); } /** * htmlIsScriptAttribute: * @name: an attribute name * * Check if an attribute is of content type Script * * Returns 1 is the attribute is a script 0 otherwise */ int htmlIsScriptAttribute(const xmlChar *name) { unsigned int i; if (name == NULL) return(0); /* * all script attributes start with 'on' */ if ((name[0] != 'o') || (name[1] != 'n')) return(0); for (i = 0; i < sizeof(htmlScriptAttributes)/sizeof(htmlScriptAttributes[0]); i++) { if (xmlStrEqual(name, (const xmlChar *) htmlScriptAttributes[i])) return(1); } return(0); } /************************************************************************ * * * The list of HTML predefined entities * * * ************************************************************************/ static const htmlEntityDesc html40EntitiesTable[] = { /* * the 4 absolute ones, plus apostrophe. */ { 34, "quot", "quotation mark = APL quote, U+0022 ISOnum" }, { 38, "amp", "ampersand, U+0026 ISOnum" }, { 39, "apos", "single quote" }, { 60, "lt", "less-than sign, U+003C ISOnum" }, { 62, "gt", "greater-than sign, U+003E ISOnum" }, /* * A bunch still in the 128-255 range * Replacing them depend really on the charset used. */ { 160, "nbsp", "no-break space = non-breaking space, U+00A0 ISOnum" }, { 161, "iexcl","inverted exclamation mark, U+00A1 ISOnum" }, { 162, "cent", "cent sign, U+00A2 ISOnum" }, { 163, "pound","pound sign, U+00A3 ISOnum" }, { 164, "curren","currency sign, U+00A4 ISOnum" }, { 165, "yen", "yen sign = yuan sign, U+00A5 ISOnum" }, { 166, "brvbar","broken bar = broken vertical bar, U+00A6 ISOnum" }, { 167, "sect", "section sign, U+00A7 ISOnum" }, { 168, "uml", "diaeresis = spacing diaeresis, U+00A8 ISOdia" }, { 169, "copy", "copyright sign, U+00A9 ISOnum" }, { 170, "ordf", "feminine ordinal indicator, U+00AA ISOnum" }, { 171, "laquo","left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum" }, { 172, "not", "not sign, U+00AC ISOnum" }, { 173, "shy", "soft hyphen = discretionary hyphen, U+00AD ISOnum" }, { 174, "reg", "registered sign = registered trade mark sign, U+00AE ISOnum" }, { 175, "macr", "macron = spacing macron = overline = APL overbar, U+00AF ISOdia" }, { 176, "deg", "degree sign, U+00B0 ISOnum" }, { 177, "plusmn","plus-minus sign = plus-or-minus sign, U+00B1 ISOnum" }, { 178, "sup2", "superscript two = superscript digit two = squared, U+00B2 ISOnum" }, { 179, "sup3", "superscript three = superscript digit three = cubed, U+00B3 ISOnum" }, { 180, "acute","acute accent = spacing acute, U+00B4 ISOdia" }, { 181, "micro","micro sign, U+00B5 ISOnum" }, { 182, "para", "pilcrow sign = paragraph sign, U+00B6 ISOnum" }, { 183, "middot","middle dot = Georgian comma Greek middle dot, U+00B7 ISOnum" }, { 184, "cedil","cedilla = spacing cedilla, U+00B8 ISOdia" }, { 185, "sup1", "superscript one = superscript digit one, U+00B9 ISOnum" }, { 186, "ordm", "masculine ordinal indicator, U+00BA ISOnum" }, { 187, "raquo","right-pointing double angle quotation mark right pointing guillemet, U+00BB ISOnum" }, { 188, "frac14","vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum" }, { 189, "frac12","vulgar fraction one half = fraction one half, U+00BD ISOnum" }, { 190, "frac34","vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum" }, { 191, "iquest","inverted question mark = turned question mark, U+00BF ISOnum" }, { 192, "Agrave","latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1" }, { 193, "Aacute","latin capital letter A with acute, U+00C1 ISOlat1" }, { 194, "Acirc","latin capital letter A with circumflex, U+00C2 ISOlat1" }, { 195, "Atilde","latin capital letter A with tilde, U+00C3 ISOlat1" }, { 196, "Auml", "latin capital letter A with diaeresis, U+00C4 ISOlat1" }, { 197, "Aring","latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1" }, { 198, "AElig","latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1" }, { 199, "Ccedil","latin capital letter C with cedilla, U+00C7 ISOlat1" }, { 200, "Egrave","latin capital letter E with grave, U+00C8 ISOlat1" }, { 201, "Eacute","latin capital letter E with acute, U+00C9 ISOlat1" }, { 202, "Ecirc","latin capital letter E with circumflex, U+00CA ISOlat1" }, { 203, "Euml", "latin capital letter E with diaeresis, U+00CB ISOlat1" }, { 204, "Igrave","latin capital letter I with grave, U+00CC ISOlat1" }, { 205, "Iacute","latin capital letter I with acute, U+00CD ISOlat1" }, { 206, "Icirc","latin capital letter I with circumflex, U+00CE ISOlat1" }, { 207, "Iuml", "latin capital letter I with diaeresis, U+00CF ISOlat1" }, { 208, "ETH", "latin capital letter ETH, U+00D0 ISOlat1" }, { 209, "Ntilde","latin capital letter N with tilde, U+00D1 ISOlat1" }, { 210, "Ograve","latin capital letter O with grave, U+00D2 ISOlat1" }, { 211, "Oacute","latin capital letter O with acute, U+00D3 ISOlat1" }, { 212, "Ocirc","latin capital letter O with circumflex, U+00D4 ISOlat1" }, { 213, "Otilde","latin capital letter O with tilde, U+00D5 ISOlat1" }, { 214, "Ouml", "latin capital letter O with diaeresis, U+00D6 ISOlat1" }, { 215, "times","multiplication sign, U+00D7 ISOnum" }, { 216, "Oslash","latin capital letter O with stroke latin capital letter O slash, U+00D8 ISOlat1" }, { 217, "Ugrave","latin capital letter U with grave, U+00D9 ISOlat1" }, { 218, "Uacute","latin capital letter U with acute, U+00DA ISOlat1" }, { 219, "Ucirc","latin capital letter U with circumflex, U+00DB ISOlat1" }, { 220, "Uuml", "latin capital letter U with diaeresis, U+00DC ISOlat1" }, { 221, "Yacute","latin capital letter Y with acute, U+00DD ISOlat1" }, { 222, "THORN","latin capital letter THORN, U+00DE ISOlat1" }, { 223, "szlig","latin small letter sharp s = ess-zed, U+00DF ISOlat1" }, { 224, "agrave","latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1" }, { 225, "aacute","latin small letter a with acute, U+00E1 ISOlat1" }, { 226, "acirc","latin small letter a with circumflex, U+00E2 ISOlat1" }, { 227, "atilde","latin small letter a with tilde, U+00E3 ISOlat1" }, { 228, "auml", "latin small letter a with diaeresis, U+00E4 ISOlat1" }, { 229, "aring","latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1" }, { 230, "aelig","latin small letter ae = latin small ligature ae, U+00E6 ISOlat1" }, { 231, "ccedil","latin small letter c with cedilla, U+00E7 ISOlat1" }, { 232, "egrave","latin small letter e with grave, U+00E8 ISOlat1" }, { 233, "eacute","latin small letter e with acute, U+00E9 ISOlat1" }, { 234, "ecirc","latin small letter e with circumflex, U+00EA ISOlat1" }, { 235, "euml", "latin small letter e with diaeresis, U+00EB ISOlat1" }, { 236, "igrave","latin small letter i with grave, U+00EC ISOlat1" }, { 237, "iacute","latin small letter i with acute, U+00ED ISOlat1" }, { 238, "icirc","latin small letter i with circumflex, U+00EE ISOlat1" }, { 239, "iuml", "latin small letter i with diaeresis, U+00EF ISOlat1" }, { 240, "eth", "latin small letter eth, U+00F0 ISOlat1" }, { 241, "ntilde","latin small letter n with tilde, U+00F1 ISOlat1" }, { 242, "ograve","latin small letter o with grave, U+00F2 ISOlat1" }, { 243, "oacute","latin small letter o with acute, U+00F3 ISOlat1" }, { 244, "ocirc","latin small letter o with circumflex, U+00F4 ISOlat1" }, { 245, "otilde","latin small letter o with tilde, U+00F5 ISOlat1" }, { 246, "ouml", "latin small letter o with diaeresis, U+00F6 ISOlat1" }, { 247, "divide","division sign, U+00F7 ISOnum" }, { 248, "oslash","latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1" }, { 249, "ugrave","latin small letter u with grave, U+00F9 ISOlat1" }, { 250, "uacute","latin small letter u with acute, U+00FA ISOlat1" }, { 251, "ucirc","latin small letter u with circumflex, U+00FB ISOlat1" }, { 252, "uuml", "latin small letter u with diaeresis, U+00FC ISOlat1" }, { 253, "yacute","latin small letter y with acute, U+00FD ISOlat1" }, { 254, "thorn","latin small letter thorn with, U+00FE ISOlat1" }, { 255, "yuml", "latin small letter y with diaeresis, U+00FF ISOlat1" }, { 338, "OElig","latin capital ligature OE, U+0152 ISOlat2" }, { 339, "oelig","latin small ligature oe, U+0153 ISOlat2" }, { 352, "Scaron","latin capital letter S with caron, U+0160 ISOlat2" }, { 353, "scaron","latin small letter s with caron, U+0161 ISOlat2" }, { 376, "Yuml", "latin capital letter Y with diaeresis, U+0178 ISOlat2" }, /* * Anything below should really be kept as entities references */ { 402, "fnof", "latin small f with hook = function = florin, U+0192 ISOtech" }, { 710, "circ", "modifier letter circumflex accent, U+02C6 ISOpub" }, { 732, "tilde","small tilde, U+02DC ISOdia" }, { 913, "Alpha","greek capital letter alpha, U+0391" }, { 914, "Beta", "greek capital letter beta, U+0392" }, { 915, "Gamma","greek capital letter gamma, U+0393 ISOgrk3" }, { 916, "Delta","greek capital letter delta, U+0394 ISOgrk3" }, { 917, "Epsilon","greek capital letter epsilon, U+0395" }, { 918, "Zeta", "greek capital letter zeta, U+0396" }, { 919, "Eta", "greek capital letter eta, U+0397" }, { 920, "Theta","greek capital letter theta, U+0398 ISOgrk3" }, { 921, "Iota", "greek capital letter iota, U+0399" }, { 922, "Kappa","greek capital letter kappa, U+039A" }, { 923, "Lambda", "greek capital letter lambda, U+039B ISOgrk3" }, { 924, "Mu", "greek capital letter mu, U+039C" }, { 925, "Nu", "greek capital letter nu, U+039D" }, { 926, "Xi", "greek capital letter xi, U+039E ISOgrk3" }, { 927, "Omicron","greek capital letter omicron, U+039F" }, { 928, "Pi", "greek capital letter pi, U+03A0 ISOgrk3" }, { 929, "Rho", "greek capital letter rho, U+03A1" }, { 931, "Sigma","greek capital letter sigma, U+03A3 ISOgrk3" }, { 932, "Tau", "greek capital letter tau, U+03A4" }, { 933, "Upsilon","greek capital letter upsilon, U+03A5 ISOgrk3" }, { 934, "Phi", "greek capital letter phi, U+03A6 ISOgrk3" }, { 935, "Chi", "greek capital letter chi, U+03A7" }, { 936, "Psi", "greek capital letter psi, U+03A8 ISOgrk3" }, { 937, "Omega","greek capital letter omega, U+03A9 ISOgrk3" }, { 945, "alpha","greek small letter alpha, U+03B1 ISOgrk3" }, { 946, "beta", "greek small letter beta, U+03B2 ISOgrk3" }, { 947, "gamma","greek small letter gamma, U+03B3 ISOgrk3" }, { 948, "delta","greek small letter delta, U+03B4 ISOgrk3" }, { 949, "epsilon","greek small letter epsilon, U+03B5 ISOgrk3" }, { 950, "zeta", "greek small letter zeta, U+03B6 ISOgrk3" }, { 951, "eta", "greek small letter eta, U+03B7 ISOgrk3" }, { 952, "theta","greek small letter theta, U+03B8 ISOgrk3" }, { 953, "iota", "greek small letter iota, U+03B9 ISOgrk3" }, { 954, "kappa","greek small letter kappa, U+03BA ISOgrk3" }, { 955, "lambda","greek small letter lambda, U+03BB ISOgrk3" }, { 956, "mu", "greek small letter mu, U+03BC ISOgrk3" }, { 957, "nu", "greek small letter nu, U+03BD ISOgrk3" }, { 958, "xi", "greek small letter xi, U+03BE ISOgrk3" }, { 959, "omicron","greek small letter omicron, U+03BF NEW" }, { 960, "pi", "greek small letter pi, U+03C0 ISOgrk3" }, { 961, "rho", "greek small letter rho, U+03C1 ISOgrk3" }, { 962, "sigmaf","greek small letter final sigma, U+03C2 ISOgrk3" }, { 963, "sigma","greek small letter sigma, U+03C3 ISOgrk3" }, { 964, "tau", "greek small letter tau, U+03C4 ISOgrk3" }, { 965, "upsilon","greek small letter upsilon, U+03C5 ISOgrk3" }, { 966, "phi", "greek small letter phi, U+03C6 ISOgrk3" }, { 967, "chi", "greek small letter chi, U+03C7 ISOgrk3" }, { 968, "psi", "greek small letter psi, U+03C8 ISOgrk3" }, { 969, "omega","greek small letter omega, U+03C9 ISOgrk3" }, { 977, "thetasym","greek small letter theta symbol, U+03D1 NEW" }, { 978, "upsih","greek upsilon with hook symbol, U+03D2 NEW" }, { 982, "piv", "greek pi symbol, U+03D6 ISOgrk3" }, { 8194, "ensp", "en space, U+2002 ISOpub" }, { 8195, "emsp", "em space, U+2003 ISOpub" }, { 8201, "thinsp","thin space, U+2009 ISOpub" }, { 8204, "zwnj", "zero width non-joiner, U+200C NEW RFC 2070" }, { 8205, "zwj", "zero width joiner, U+200D NEW RFC 2070" }, { 8206, "lrm", "left-to-right mark, U+200E NEW RFC 2070" }, { 8207, "rlm", "right-to-left mark, U+200F NEW RFC 2070" }, { 8211, "ndash","en dash, U+2013 ISOpub" }, { 8212, "mdash","em dash, U+2014 ISOpub" }, { 8216, "lsquo","left single quotation mark, U+2018 ISOnum" }, { 8217, "rsquo","right single quotation mark, U+2019 ISOnum" }, { 8218, "sbquo","single low-9 quotation mark, U+201A NEW" }, { 8220, "ldquo","left double quotation mark, U+201C ISOnum" }, { 8221, "rdquo","right double quotation mark, U+201D ISOnum" }, { 8222, "bdquo","double low-9 quotation mark, U+201E NEW" }, { 8224, "dagger","dagger, U+2020 ISOpub" }, { 8225, "Dagger","double dagger, U+2021 ISOpub" }, { 8226, "bull", "bullet = black small circle, U+2022 ISOpub" }, { 8230, "hellip","horizontal ellipsis = three dot leader, U+2026 ISOpub" }, { 8240, "permil","per mille sign, U+2030 ISOtech" }, { 8242, "prime","prime = minutes = feet, U+2032 ISOtech" }, { 8243, "Prime","double prime = seconds = inches, U+2033 ISOtech" }, { 8249, "lsaquo","single left-pointing angle quotation mark, U+2039 ISO proposed" }, { 8250, "rsaquo","single right-pointing angle quotation mark, U+203A ISO proposed" }, { 8254, "oline","overline = spacing overscore, U+203E NEW" }, { 8260, "frasl","fraction slash, U+2044 NEW" }, { 8364, "euro", "euro sign, U+20AC NEW" }, { 8465, "image","blackletter capital I = imaginary part, U+2111 ISOamso" }, { 8472, "weierp","script capital P = power set = Weierstrass p, U+2118 ISOamso" }, { 8476, "real", "blackletter capital R = real part symbol, U+211C ISOamso" }, { 8482, "trade","trade mark sign, U+2122 ISOnum" }, { 8501, "alefsym","alef symbol = first transfinite cardinal, U+2135 NEW" }, { 8592, "larr", "leftwards arrow, U+2190 ISOnum" }, { 8593, "uarr", "upwards arrow, U+2191 ISOnum" }, { 8594, "rarr", "rightwards arrow, U+2192 ISOnum" }, { 8595, "darr", "downwards arrow, U+2193 ISOnum" }, { 8596, "harr", "left right arrow, U+2194 ISOamsa" }, { 8629, "crarr","downwards arrow with corner leftwards = carriage return, U+21B5 NEW" }, { 8656, "lArr", "leftwards double arrow, U+21D0 ISOtech" }, { 8657, "uArr", "upwards double arrow, U+21D1 ISOamsa" }, { 8658, "rArr", "rightwards double arrow, U+21D2 ISOtech" }, { 8659, "dArr", "downwards double arrow, U+21D3 ISOamsa" }, { 8660, "hArr", "left right double arrow, U+21D4 ISOamsa" }, { 8704, "forall","for all, U+2200 ISOtech" }, { 8706, "part", "partial differential, U+2202 ISOtech" }, { 8707, "exist","there exists, U+2203 ISOtech" }, { 8709, "empty","empty set = null set = diameter, U+2205 ISOamso" }, { 8711, "nabla","nabla = backward difference, U+2207 ISOtech" }, { 8712, "isin", "element of, U+2208 ISOtech" }, { 8713, "notin","not an element of, U+2209 ISOtech" }, { 8715, "ni", "contains as member, U+220B ISOtech" }, { 8719, "prod", "n-ary product = product sign, U+220F ISOamsb" }, { 8721, "sum", "n-ary summation, U+2211 ISOamsb" }, { 8722, "minus","minus sign, U+2212 ISOtech" }, { 8727, "lowast","asterisk operator, U+2217 ISOtech" }, { 8730, "radic","square root = radical sign, U+221A ISOtech" }, { 8733, "prop", "proportional to, U+221D ISOtech" }, { 8734, "infin","infinity, U+221E ISOtech" }, { 8736, "ang", "angle, U+2220 ISOamso" }, { 8743, "and", "logical and = wedge, U+2227 ISOtech" }, { 8744, "or", "logical or = vee, U+2228 ISOtech" }, { 8745, "cap", "intersection = cap, U+2229 ISOtech" }, { 8746, "cup", "union = cup, U+222A ISOtech" }, { 8747, "int", "integral, U+222B ISOtech" }, { 8756, "there4","therefore, U+2234 ISOtech" }, { 8764, "sim", "tilde operator = varies with = similar to, U+223C ISOtech" }, { 8773, "cong", "approximately equal to, U+2245 ISOtech" }, { 8776, "asymp","almost equal to = asymptotic to, U+2248 ISOamsr" }, { 8800, "ne", "not equal to, U+2260 ISOtech" }, { 8801, "equiv","identical to, U+2261 ISOtech" }, { 8804, "le", "less-than or equal to, U+2264 ISOtech" }, { 8805, "ge", "greater-than or equal to, U+2265 ISOtech" }, { 8834, "sub", "subset of, U+2282 ISOtech" }, { 8835, "sup", "superset of, U+2283 ISOtech" }, { 8836, "nsub", "not a subset of, U+2284 ISOamsn" }, { 8838, "sube", "subset of or equal to, U+2286 ISOtech" }, { 8839, "supe", "superset of or equal to, U+2287 ISOtech" }, { 8853, "oplus","circled plus = direct sum, U+2295 ISOamsb" }, { 8855, "otimes","circled times = vector product, U+2297 ISOamsb" }, { 8869, "perp", "up tack = orthogonal to = perpendicular, U+22A5 ISOtech" }, { 8901, "sdot", "dot operator, U+22C5 ISOamsb" }, { 8968, "lceil","left ceiling = apl upstile, U+2308 ISOamsc" }, { 8969, "rceil","right ceiling, U+2309 ISOamsc" }, { 8970, "lfloor","left floor = apl downstile, U+230A ISOamsc" }, { 8971, "rfloor","right floor, U+230B ISOamsc" }, { 9001, "lang", "left-pointing angle bracket = bra, U+2329 ISOtech" }, { 9002, "rang", "right-pointing angle bracket = ket, U+232A ISOtech" }, { 9674, "loz", "lozenge, U+25CA ISOpub" }, { 9824, "spades","black spade suit, U+2660 ISOpub" }, { 9827, "clubs","black club suit = shamrock, U+2663 ISOpub" }, { 9829, "hearts","black heart suit = valentine, U+2665 ISOpub" }, { 9830, "diams","black diamond suit, U+2666 ISOpub" }, }; /************************************************************************ * * * Commodity functions to handle entities * * * ************************************************************************/ /* * Macro used to grow the current buffer. */ #define growBuffer(buffer) { \ xmlChar *tmp; \ buffer##_size *= 2; \ tmp = (xmlChar *) xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \ if (tmp == NULL) { \ htmlErrMemory(ctxt, "growing buffer\n"); \ xmlFree(buffer); \ return(NULL); \ } \ buffer = tmp; \ } /** * htmlEntityLookup: * @name: the entity name * * Lookup the given entity in EntitiesTable * * TODO: the linear scan is really ugly, an hash table is really needed. * * Returns the associated htmlEntityDescPtr if found, NULL otherwise. */ const htmlEntityDesc * htmlEntityLookup(const xmlChar *name) { unsigned int i; for (i = 0;i < (sizeof(html40EntitiesTable)/ sizeof(html40EntitiesTable[0]));i++) { if (xmlStrEqual(name, BAD_CAST html40EntitiesTable[i].name)) { return((htmlEntityDescPtr) &html40EntitiesTable[i]); } } return(NULL); } /** * htmlEntityValueLookup: * @value: the entity's unicode value * * Lookup the given entity in EntitiesTable * * TODO: the linear scan is really ugly, an hash table is really needed. * * Returns the associated htmlEntityDescPtr if found, NULL otherwise. */ const htmlEntityDesc * htmlEntityValueLookup(unsigned int value) { unsigned int i; for (i = 0;i < (sizeof(html40EntitiesTable)/ sizeof(html40EntitiesTable[0]));i++) { if (html40EntitiesTable[i].value >= value) { if (html40EntitiesTable[i].value > value) break; return((htmlEntityDescPtr) &html40EntitiesTable[i]); } } return(NULL); } /** * UTF8ToHtml: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * * Take a block of UTF-8 chars in and try to convert it to an ASCII * plus HTML entities block of chars out. * * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise * The value of @inlen after return is the number of octets consumed * as the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ int UTF8ToHtml(unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { const unsigned char* processed = in; const unsigned char* outend; const unsigned char* outstart = out; const unsigned char* instart = in; const unsigned char* inend; unsigned int c, d; int trailing; if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); if (in == NULL) { /* * initialization nothing to do */ *outlen = 0; *inlen = 0; return(0); } inend = in + (*inlen); outend = out + (*outlen); while (in < inend) { d = *in++; if (d < 0x80) { c= d; trailing= 0; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } else if (d < 0xF8) { c= d & 0x07; trailing= 3; } else { /* no chance for this in Ascii */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } if (inend - in < trailing) { break; } for ( ; trailing; trailing--) { if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break; c <<= 6; c |= d & 0x3F; } /* assertion: c is a single UTF-4 value */ if (c < 0x80) { if (out + 1 >= outend) break; *out++ = c; } else { int len; const htmlEntityDesc * ent; const char *cp; char nbuf[16]; /* * Try to lookup a predefined HTML entity for it */ ent = htmlEntityValueLookup(c); if (ent == NULL) { snprintf(nbuf, sizeof(nbuf), "#%u", c); cp = nbuf; } else cp = ent->name; len = strlen(cp); if (out + 2 + len >= outend) break; *out++ = '&'; memcpy(out, cp, len); out += len; *out++ = ';'; } processed = in; } *outlen = out - outstart; *inlen = processed - instart; return(0); } /** * htmlEncodeEntities: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * @quoteChar: the quote character to escape (' or ") or zero. * * Take a block of UTF-8 chars in and try to convert it to an ASCII * plus HTML entities block of chars out. * * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise * The value of @inlen after return is the number of octets consumed * as the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ int htmlEncodeEntities(unsigned char* out, int *outlen, const unsigned char* in, int *inlen, int quoteChar) { const unsigned char* processed = in; const unsigned char* outend; const unsigned char* outstart = out; const unsigned char* instart = in; const unsigned char* inend; unsigned int c, d; int trailing; if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) return(-1); outend = out + (*outlen); inend = in + (*inlen); while (in < inend) { d = *in++; if (d < 0x80) { c= d; trailing= 0; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } else if (d < 0xF8) { c= d & 0x07; trailing= 3; } else { /* no chance for this in Ascii */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } if (inend - in < trailing) break; while (trailing--) { if (((d= *in++) & 0xC0) != 0x80) { *outlen = out - outstart; *inlen = processed - instart; return(-2); } c <<= 6; c |= d & 0x3F; } /* assertion: c is a single UTF-4 value */ if ((c < 0x80) && (c != (unsigned int) quoteChar) && (c != '&') && (c != '<') && (c != '>')) { if (out >= outend) break; *out++ = c; } else { const htmlEntityDesc * ent; const char *cp; char nbuf[16]; int len; /* * Try to lookup a predefined HTML entity for it */ ent = htmlEntityValueLookup(c); if (ent == NULL) { snprintf(nbuf, sizeof(nbuf), "#%u", c); cp = nbuf; } else cp = ent->name; len = strlen(cp); if (out + 2 + len > outend) break; *out++ = '&'; memcpy(out, cp, len); out += len; *out++ = ';'; } processed = in; } *outlen = out - outstart; *inlen = processed - instart; return(0); } /************************************************************************ * * * Commodity functions to handle streams * * * ************************************************************************/ /** * htmlNewInputStream: * @ctxt: an HTML parser context * * Create a new input stream structure * Returns the new input stream or NULL */ static htmlParserInputPtr htmlNewInputStream(htmlParserCtxtPtr ctxt) { htmlParserInputPtr input; input = (xmlParserInputPtr) xmlMalloc(sizeof(htmlParserInput)); if (input == NULL) { htmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); return(NULL); } memset(input, 0, sizeof(htmlParserInput)); input->filename = NULL; input->directory = NULL; input->base = NULL; input->cur = NULL; input->buf = NULL; input->line = 1; input->col = 1; input->buf = NULL; input->free = NULL; input->version = NULL; input->consumed = 0; input->length = 0; return(input); } /************************************************************************ * * * Commodity functions, cleanup needed ? * * * ************************************************************************/ /* * all tags allowing pc data from the html 4.01 loose dtd * NOTE: it might be more apropriate to integrate this information * into the html40ElementTable array but I don't want to risk any * binary incomptibility */ static const char *allowPCData[] = { "a", "abbr", "acronym", "address", "applet", "b", "bdo", "big", "blockquote", "body", "button", "caption", "center", "cite", "code", "dd", "del", "dfn", "div", "dt", "em", "font", "form", "h1", "h2", "h3", "h4", "h5", "h6", "i", "iframe", "ins", "kbd", "label", "legend", "li", "noframes", "noscript", "object", "p", "pre", "q", "s", "samp", "small", "span", "strike", "strong", "td", "th", "tt", "u", "var" }; /** * areBlanks: * @ctxt: an HTML parser context * @str: a xmlChar * * @len: the size of @str * * Is this a sequence of blank chars that one can ignore ? * * Returns 1 if ignorable 0 otherwise. */ static int areBlanks(htmlParserCtxtPtr ctxt, const xmlChar *str, int len) { unsigned int i; int j; xmlNodePtr lastChild; xmlDtdPtr dtd; for (j = 0;j < len;j++) if (!(IS_BLANK_CH(str[j]))) return(0); if (CUR == 0) return(1); if (CUR != '<') return(0); if (ctxt->name == NULL) return(1); if (xmlStrEqual(ctxt->name, BAD_CAST"html")) return(1); if (xmlStrEqual(ctxt->name, BAD_CAST"head")) return(1); /* Only strip CDATA children of the body tag for strict HTML DTDs */ if (xmlStrEqual(ctxt->name, BAD_CAST "body") && ctxt->myDoc != NULL) { dtd = xmlGetIntSubset(ctxt->myDoc); if (dtd != NULL && dtd->ExternalID != NULL) { if (!xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4.01//EN") || !xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4//EN")) return(1); } } if (ctxt->node == NULL) return(0); lastChild = xmlGetLastChild(ctxt->node); while ((lastChild) && (lastChild->type == XML_COMMENT_NODE)) lastChild = lastChild->prev; if (lastChild == NULL) { if ((ctxt->node->type != XML_ELEMENT_NODE) && (ctxt->node->content != NULL)) return(0); /* keep ws in constructs like ... ... for all tags "b" allowing PCDATA */ for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { if ( xmlStrEqual(ctxt->name, BAD_CAST allowPCData[i]) ) { return(0); } } } else if (xmlNodeIsText(lastChild)) { return(0); } else { /* keep ws in constructs like

    xy z

    for all tags "p" allowing PCDATA */ for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { if ( xmlStrEqual(lastChild->name, BAD_CAST allowPCData[i]) ) { return(0); } } } return(1); } /** * htmlNewDocNoDtD: * @URI: URI for the dtd, or NULL * @ExternalID: the external ID of the DTD, or NULL * * Creates a new HTML document without a DTD node if @URI and @ExternalID * are NULL * * Returns a new document, do not initialize the DTD if not provided */ htmlDocPtr htmlNewDocNoDtD(const xmlChar *URI, const xmlChar *ExternalID) { xmlDocPtr cur; /* * Allocate a new document and fill the fields. */ cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc)); if (cur == NULL) { htmlErrMemory(NULL, "HTML document creation failed\n"); return(NULL); } memset(cur, 0, sizeof(xmlDoc)); cur->type = XML_HTML_DOCUMENT_NODE; cur->version = NULL; cur->intSubset = NULL; cur->doc = cur; cur->name = NULL; cur->children = NULL; cur->extSubset = NULL; cur->oldNs = NULL; cur->encoding = NULL; cur->standalone = 1; cur->compression = 0; cur->ids = NULL; cur->refs = NULL; cur->_private = NULL; cur->charset = XML_CHAR_ENCODING_UTF8; cur->properties = XML_DOC_HTML | XML_DOC_USERBUILT; if ((ExternalID != NULL) || (URI != NULL)) xmlCreateIntSubset(cur, BAD_CAST "html", ExternalID, URI); return(cur); } /** * htmlNewDoc: * @URI: URI for the dtd, or NULL * @ExternalID: the external ID of the DTD, or NULL * * Creates a new HTML document * * Returns a new document */ htmlDocPtr htmlNewDoc(const xmlChar *URI, const xmlChar *ExternalID) { if ((URI == NULL) && (ExternalID == NULL)) return(htmlNewDocNoDtD( BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd", BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN")); return(htmlNewDocNoDtD(URI, ExternalID)); } /************************************************************************ * * * The parser itself * * Relates to http://www.w3.org/TR/html40 * * * ************************************************************************/ /************************************************************************ * * * The parser itself * * * ************************************************************************/ static const xmlChar * htmlParseNameComplex(xmlParserCtxtPtr ctxt); /** * htmlParseHTMLName: * @ctxt: an HTML parser context * * parse an HTML tag or attribute name, note that we convert it to lowercase * since HTML names are not case-sensitive. * * Returns the Tag Name parsed or NULL */ static const xmlChar * htmlParseHTMLName(htmlParserCtxtPtr ctxt) { int i = 0; xmlChar loc[HTML_PARSER_BUFFER_SIZE]; if (!IS_ASCII_LETTER(CUR) && (CUR != '_') && (CUR != ':') && (CUR != '.')) return(NULL); while ((i < HTML_PARSER_BUFFER_SIZE) && ((IS_ASCII_LETTER(CUR)) || (IS_ASCII_DIGIT(CUR)) || (CUR == ':') || (CUR == '-') || (CUR == '_') || (CUR == '.'))) { if ((CUR >= 'A') && (CUR <= 'Z')) loc[i] = CUR + 0x20; else loc[i] = CUR; i++; NEXT; } return(xmlDictLookup(ctxt->dict, loc, i)); } /** * htmlParseHTMLName_nonInvasive: * @ctxt: an HTML parser context * * parse an HTML tag or attribute name, note that we convert it to lowercase * since HTML names are not case-sensitive, this doesn't consume the data * from the stream, it's a look-ahead * * Returns the Tag Name parsed or NULL */ static const xmlChar * htmlParseHTMLName_nonInvasive(htmlParserCtxtPtr ctxt) { int i = 0; xmlChar loc[HTML_PARSER_BUFFER_SIZE]; if (!IS_ASCII_LETTER(NXT(1)) && (NXT(1) != '_') && (NXT(1) != ':')) return(NULL); while ((i < HTML_PARSER_BUFFER_SIZE) && ((IS_ASCII_LETTER(NXT(1+i))) || (IS_ASCII_DIGIT(NXT(1+i))) || (NXT(1+i) == ':') || (NXT(1+i) == '-') || (NXT(1+i) == '_'))) { if ((NXT(1+i) >= 'A') && (NXT(1+i) <= 'Z')) loc[i] = NXT(1+i) + 0x20; else loc[i] = NXT(1+i); i++; } return(xmlDictLookup(ctxt->dict, loc, i)); } /** * htmlParseName: * @ctxt: an HTML parser context * * parse an HTML name, this routine is case sensitive. * * Returns the Name parsed or NULL */ static const xmlChar * htmlParseName(htmlParserCtxtPtr ctxt) { const xmlChar *in; const xmlChar *ret; int count = 0; GROW; /* * Accelerator for simple ASCII names */ in = ctxt->input->cur; if (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || (*in == '_') || (*in == ':')) { in++; while (((*in >= 0x61) && (*in <= 0x7A)) || ((*in >= 0x41) && (*in <= 0x5A)) || ((*in >= 0x30) && (*in <= 0x39)) || (*in == '_') || (*in == '-') || (*in == ':') || (*in == '.')) in++; if ((*in > 0) && (*in < 0x80)) { count = in - ctxt->input->cur; ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); ctxt->input->cur = in; ctxt->nbChars += count; ctxt->input->col += count; return(ret); } } return(htmlParseNameComplex(ctxt)); } static const xmlChar * htmlParseNameComplex(xmlParserCtxtPtr ctxt) { int len = 0, l; int c; int count = 0; /* * Handler for more complex cases */ GROW; c = CUR_CHAR(l); if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ (!IS_LETTER(c) && (c != '_') && (c != ':'))) { return(NULL); } while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ ((IS_LETTER(c)) || (IS_DIGIT(c)) || (c == '.') || (c == '-') || (c == '_') || (c == ':') || (IS_COMBINING(c)) || (IS_EXTENDER(c)))) { if (count++ > 100) { count = 0; GROW; } len += l; NEXTL(l); c = CUR_CHAR(l); } return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); } /** * htmlParseHTMLAttribute: * @ctxt: an HTML parser context * @stop: a char stop value * * parse an HTML attribute value till the stop (quote), if * stop is 0 then it stops at the first space * * Returns the attribute parsed or NULL */ static xmlChar * htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) { xmlChar *buffer = NULL; int buffer_size = 0; xmlChar *out = NULL; const xmlChar *name = NULL; const xmlChar *cur = NULL; const htmlEntityDesc * ent; /* * allocate a translation buffer. */ buffer_size = HTML_PARSER_BUFFER_SIZE; buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); if (buffer == NULL) { htmlErrMemory(ctxt, "buffer allocation failed\n"); return(NULL); } out = buffer; /* * Ok loop until we reach one of the ending chars */ while ((CUR != 0) && (CUR != stop)) { if ((stop == 0) && (CUR == '>')) break; if ((stop == 0) && (IS_BLANK_CH(CUR))) break; if (CUR == '&') { if (NXT(1) == '#') { unsigned int c; int bits; c = htmlParseCharRef(ctxt); if (c < 0x80) { *out++ = c; bits= -6; } else if (c < 0x800) { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } else if (c < 0x10000) { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } else { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } for ( ; bits >= 0; bits-= 6) { *out++ = ((c >> bits) & 0x3F) | 0x80; } if (out - buffer > buffer_size - 100) { int indx = out - buffer; growBuffer(buffer); out = &buffer[indx]; } } else { ent = htmlParseEntityRef(ctxt, &name); if (name == NULL) { *out++ = '&'; if (out - buffer > buffer_size - 100) { int indx = out - buffer; growBuffer(buffer); out = &buffer[indx]; } } else if (ent == NULL) { *out++ = '&'; cur = name; while (*cur != 0) { if (out - buffer > buffer_size - 100) { int indx = out - buffer; growBuffer(buffer); out = &buffer[indx]; } *out++ = *cur++; } } else { unsigned int c; int bits; if (out - buffer > buffer_size - 100) { int indx = out - buffer; growBuffer(buffer); out = &buffer[indx]; } c = ent->value; if (c < 0x80) { *out++ = c; bits= -6; } else if (c < 0x800) { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } else if (c < 0x10000) { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } else { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } for ( ; bits >= 0; bits-= 6) { *out++ = ((c >> bits) & 0x3F) | 0x80; } } } } else { unsigned int c; int bits, l; if (out - buffer > buffer_size - 100) { int indx = out - buffer; growBuffer(buffer); out = &buffer[indx]; } c = CUR_CHAR(l); if (c < 0x80) { *out++ = c; bits= -6; } else if (c < 0x800) { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } else if (c < 0x10000) { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } else { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } for ( ; bits >= 0; bits-= 6) { *out++ = ((c >> bits) & 0x3F) | 0x80; } NEXT; } } *out = 0; return(buffer); } /** * htmlParseEntityRef: * @ctxt: an HTML parser context * @str: location to store the entity name * * parse an HTML ENTITY references * * [68] EntityRef ::= '&' Name ';' * * Returns the associated htmlEntityDescPtr if found, or NULL otherwise, * if non-NULL *str will have to be freed by the caller. */ const htmlEntityDesc * htmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str) { const xmlChar *name; const htmlEntityDesc * ent = NULL; if (str != NULL) *str = NULL; if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); if (CUR == '&') { NEXT; name = htmlParseName(ctxt); if (name == NULL) { htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, "htmlParseEntityRef: no name\n", NULL, NULL); } else { GROW; if (CUR == ';') { if (str != NULL) *str = name; /* * Lookup the entity in the table. */ ent = htmlEntityLookup(name); if (ent != NULL) /* OK that's ugly !!! */ NEXT; } else { htmlParseErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, "htmlParseEntityRef: expecting ';'\n", NULL, NULL); if (str != NULL) *str = name; } } } return(ent); } /** * htmlParseAttValue: * @ctxt: an HTML parser context * * parse a value for an attribute * Note: the parser won't do substitution of entities here, this * will be handled later in xmlStringGetNodeList, unless it was * asked for ctxt->replaceEntities != 0 * * Returns the AttValue parsed or NULL. */ static xmlChar * htmlParseAttValue(htmlParserCtxtPtr ctxt) { xmlChar *ret = NULL; if (CUR == '"') { NEXT; ret = htmlParseHTMLAttribute(ctxt, '"'); if (CUR != '"') { htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, "AttValue: \" expected\n", NULL, NULL); } else NEXT; } else if (CUR == '\'') { NEXT; ret = htmlParseHTMLAttribute(ctxt, '\''); if (CUR != '\'') { htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, "AttValue: ' expected\n", NULL, NULL); } else NEXT; } else { /* * That's an HTMLism, the attribute value may not be quoted */ ret = htmlParseHTMLAttribute(ctxt, 0); if (ret == NULL) { htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, "AttValue: no value found\n", NULL, NULL); } } return(ret); } /** * htmlParseSystemLiteral: * @ctxt: an HTML parser context * * parse an HTML Literal * * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") * * Returns the SystemLiteral parsed or NULL */ static xmlChar * htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { const xmlChar *q; xmlChar *ret = NULL; if (CUR == '"') { NEXT; q = CUR_PTR; while ((IS_CHAR_CH(CUR)) && (CUR != '"')) NEXT; if (!IS_CHAR_CH(CUR)) { htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, "Unfinished SystemLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else if (CUR == '\'') { NEXT; q = CUR_PTR; while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) NEXT; if (!IS_CHAR_CH(CUR)) { htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, "Unfinished SystemLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else { htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, " or ' expected\n", NULL, NULL); } return(ret); } /** * htmlParsePubidLiteral: * @ctxt: an HTML parser context * * parse an HTML public literal * * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" * * Returns the PubidLiteral parsed or NULL. */ static xmlChar * htmlParsePubidLiteral(htmlParserCtxtPtr ctxt) { const xmlChar *q; xmlChar *ret = NULL; /* * Name ::= (Letter | '_') (NameChar)* */ if (CUR == '"') { NEXT; q = CUR_PTR; while (IS_PUBIDCHAR_CH(CUR)) NEXT; if (CUR != '"') { htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, "Unfinished PubidLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else if (CUR == '\'') { NEXT; q = CUR_PTR; while ((IS_PUBIDCHAR_CH(CUR)) && (CUR != '\'')) NEXT; if (CUR != '\'') { htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, "Unfinished PubidLiteral\n", NULL, NULL); } else { ret = xmlStrndup(q, CUR_PTR - q); NEXT; } } else { htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, "PubidLiteral \" or ' expected\n", NULL, NULL); } return(ret); } /** * htmlParseScript: * @ctxt: an HTML parser context * * parse the content of an HTML SCRIPT or STYLE element * http://www.w3.org/TR/html4/sgml/dtd.html#Script * http://www.w3.org/TR/html4/sgml/dtd.html#StyleSheet * http://www.w3.org/TR/html4/types.html#type-script * http://www.w3.org/TR/html4/types.html#h-6.15 * http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2.1 * * Script data ( %Script; in the DTD) can be the content of the SCRIPT * element and the value of intrinsic event attributes. User agents must * not evaluate script data as HTML markup but instead must pass it on as * data to a script engine. * NOTES: * - The content is passed like CDATA * - the attributes for style and scripting "onXXX" are also described * as CDATA but SGML allows entities references in attributes so their * processing is identical as other attributes */ static void htmlParseScript(htmlParserCtxtPtr ctxt) { xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; int nbchar = 0; int cur,l; SHRINK; cur = CUR_CHAR(l); while (IS_CHAR_CH(cur)) { if ((cur == '<') && (NXT(1) == '/')) { /* * One should break here, the specification is clear: * Authors should therefore escape "recovery) { if (xmlStrncasecmp(ctxt->name, ctxt->input->cur+2, xmlStrlen(ctxt->name)) == 0) { break; /* while */ } else { htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, "Element %s embeds close tag\n", ctxt->name, NULL); } } else { if (((NXT(2) >= 'A') && (NXT(2) <= 'Z')) || ((NXT(2) >= 'a') && (NXT(2) <= 'z'))) { break; /* while */ } } } COPY_BUF(l,buf,nbchar,cur); if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { if (ctxt->sax->cdataBlock!= NULL) { /* * Insert as CDATA, which is the same as HTML_PRESERVE_NODE */ ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); } else if (ctxt->sax->characters != NULL) { ctxt->sax->characters(ctxt->userData, buf, nbchar); } nbchar = 0; } GROW; NEXTL(l); cur = CUR_CHAR(l); } if ((!(IS_CHAR_CH(cur))) && (!((cur == 0) && (ctxt->progressive)))) { htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, "Invalid char in CDATA 0x%X\n", cur); if (ctxt->input->cur < ctxt->input->end) { NEXT; } } if ((nbchar != 0) && (ctxt->sax != NULL) && (!ctxt->disableSAX)) { if (ctxt->sax->cdataBlock!= NULL) { /* * Insert as CDATA, which is the same as HTML_PRESERVE_NODE */ ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); } else if (ctxt->sax->characters != NULL) { ctxt->sax->characters(ctxt->userData, buf, nbchar); } } } /** * htmlParseCharData: * @ctxt: an HTML parser context * * parse a CharData section. * if we are within a CDATA section ']]>' marks an end of section. * * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) */ static void htmlParseCharData(htmlParserCtxtPtr ctxt) { xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; int nbchar = 0; int cur, l; int chunk = 0; SHRINK; cur = CUR_CHAR(l); while (((cur != '<') || (ctxt->token == '<')) && ((cur != '&') || (ctxt->token == '&')) && (cur != 0)) { if (!(IS_CHAR(cur))) { htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, "Invalid char in CDATA 0x%X\n", cur); } else { COPY_BUF(l,buf,nbchar,cur); } if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { /* * Ok the segment is to be consumed as chars. */ if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { if (areBlanks(ctxt, buf, nbchar)) { if (ctxt->keepBlanks) { if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, buf, nbchar); } else { if (ctxt->sax->ignorableWhitespace != NULL) ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); } } else { htmlCheckParagraph(ctxt); if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, buf, nbchar); } } nbchar = 0; } NEXTL(l); chunk++; if (chunk > HTML_PARSER_BUFFER_SIZE) { chunk = 0; SHRINK; GROW; } cur = CUR_CHAR(l); if (cur == 0) { SHRINK; GROW; cur = CUR_CHAR(l); } } if (nbchar != 0) { buf[nbchar] = 0; /* * Ok the segment is to be consumed as chars. */ if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { if (areBlanks(ctxt, buf, nbchar)) { if (ctxt->keepBlanks) { if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, buf, nbchar); } else { if (ctxt->sax->ignorableWhitespace != NULL) ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); } } else { htmlCheckParagraph(ctxt); if (ctxt->sax->characters != NULL) ctxt->sax->characters(ctxt->userData, buf, nbchar); } } } else { /* * Loop detection */ if (cur == 0) ctxt->instate = XML_PARSER_EOF; } } /** * htmlParseExternalID: * @ctxt: an HTML parser context * @publicID: a xmlChar** receiving PubidLiteral * * Parse an External ID or a Public ID * * [75] ExternalID ::= 'SYSTEM' S SystemLiteral * | 'PUBLIC' S PubidLiteral S SystemLiteral * * [83] PublicID ::= 'PUBLIC' S PubidLiteral * * Returns the function returns SystemLiteral and in the second * case publicID receives PubidLiteral, is strict is off * it is possible to return NULL and have publicID set. */ static xmlChar * htmlParseExternalID(htmlParserCtxtPtr ctxt, xmlChar **publicID) { xmlChar *URI = NULL; if ((UPPER == 'S') && (UPP(1) == 'Y') && (UPP(2) == 'S') && (UPP(3) == 'T') && (UPP(4) == 'E') && (UPP(5) == 'M')) { SKIP(6); if (!IS_BLANK_CH(CUR)) { htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'SYSTEM'\n", NULL, NULL); } SKIP_BLANKS; URI = htmlParseSystemLiteral(ctxt); if (URI == NULL) { htmlParseErr(ctxt, XML_ERR_URI_REQUIRED, "htmlParseExternalID: SYSTEM, no URI\n", NULL, NULL); } } else if ((UPPER == 'P') && (UPP(1) == 'U') && (UPP(2) == 'B') && (UPP(3) == 'L') && (UPP(4) == 'I') && (UPP(5) == 'C')) { SKIP(6); if (!IS_BLANK_CH(CUR)) { htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, "Space required after 'PUBLIC'\n", NULL, NULL); } SKIP_BLANKS; *publicID = htmlParsePubidLiteral(ctxt); if (*publicID == NULL) { htmlParseErr(ctxt, XML_ERR_PUBID_REQUIRED, "htmlParseExternalID: PUBLIC, no Public Identifier\n", NULL, NULL); } SKIP_BLANKS; if ((CUR == '"') || (CUR == '\'')) { URI = htmlParseSystemLiteral(ctxt); } } return(URI); } /** * xmlParsePI: * @ctxt: an XML parser context * * parse an XML Processing Instruction. * * [16] PI ::= '' Char*)))? '?>' */ static void htmlParsePI(htmlParserCtxtPtr ctxt) { xmlChar *buf = NULL; int len = 0; int size = HTML_PARSER_BUFFER_SIZE; int cur, l; const xmlChar *target; xmlParserInputState state; int count = 0; if ((RAW == '<') && (NXT(1) == '?')) { state = ctxt->instate; ctxt->instate = XML_PARSER_PI; /* * this is a Processing Instruction. */ SKIP(2); SHRINK; /* * Parse the target name and check for special support like * namespace. */ target = htmlParseName(ctxt); if (target != NULL) { if (RAW == '>') { SKIP(1); /* * SAX: PI detected. */ if ((ctxt->sax) && (!ctxt->disableSAX) && (ctxt->sax->processingInstruction != NULL)) ctxt->sax->processingInstruction(ctxt->userData, target, NULL); ctxt->instate = state; return; } buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { htmlErrMemory(ctxt, NULL); ctxt->instate = state; return; } cur = CUR; if (!IS_BLANK(cur)) { htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, "ParsePI: PI %s space expected\n", target, NULL); } SKIP_BLANKS; cur = CUR_CHAR(l); while (IS_CHAR(cur) && (cur != '>')) { if (len + 5 >= size) { xmlChar *tmp; size *= 2; tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); if (tmp == NULL) { htmlErrMemory(ctxt, NULL); xmlFree(buf); ctxt->instate = state; return; } buf = tmp; } count++; if (count > 50) { GROW; count = 0; } COPY_BUF(l,buf,len,cur); NEXTL(l); cur = CUR_CHAR(l); if (cur == 0) { SHRINK; GROW; cur = CUR_CHAR(l); } } buf[len] = 0; if (cur != '>') { htmlParseErr(ctxt, XML_ERR_PI_NOT_FINISHED, "ParsePI: PI %s never end ...\n", target, NULL); } else { SKIP(1); /* * SAX: PI detected. */ if ((ctxt->sax) && (!ctxt->disableSAX) && (ctxt->sax->processingInstruction != NULL)) ctxt->sax->processingInstruction(ctxt->userData, target, buf); } xmlFree(buf); } else { htmlParseErr(ctxt, XML_ERR_PI_NOT_STARTED, "PI is not started correctly", NULL, NULL); } ctxt->instate = state; } } /** * htmlParseComment: * @ctxt: an HTML parser context * * Parse an XML (SGML) comment * * [15] Comment ::= '' */ static void htmlParseComment(htmlParserCtxtPtr ctxt) { xmlChar *buf = NULL; int len; int size = HTML_PARSER_BUFFER_SIZE; int q, ql; int r, rl; int cur, l; xmlParserInputState state; /* * Check that there is a comment right here. */ if ((RAW != '<') || (NXT(1) != '!') || (NXT(2) != '-') || (NXT(3) != '-')) return; state = ctxt->instate; ctxt->instate = XML_PARSER_COMMENT; SHRINK; SKIP(4); buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); if (buf == NULL) { htmlErrMemory(ctxt, "buffer allocation failed\n"); ctxt->instate = state; return; } q = CUR_CHAR(ql); NEXTL(ql); r = CUR_CHAR(rl); NEXTL(rl); cur = CUR_CHAR(l); len = 0; while (IS_CHAR(cur) && ((cur != '>') || (r != '-') || (q != '-'))) { if (len + 5 >= size) { xmlChar *tmp; size *= 2; tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); if (tmp == NULL) { xmlFree(buf); htmlErrMemory(ctxt, "growing buffer failed\n"); ctxt->instate = state; return; } buf = tmp; } COPY_BUF(ql,buf,len,q); q = r; ql = rl; r = cur; rl = l; NEXTL(l); cur = CUR_CHAR(l); if (cur == 0) { SHRINK; GROW; cur = CUR_CHAR(l); } } buf[len] = 0; if (!IS_CHAR(cur)) { htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, "Comment not terminated \n */ base += 2; } } if (ignoreattrval) { if (buf[base] == '"' || buf[base] == '\'') { if (invalue) { if (buf[base] == valdellim) { invalue = 0; continue; } } else { valdellim = buf[base]; invalue = 1; continue; } } else if (invalue) { continue; } } if (incomment) { if (base + 3 > len) return (-1); if ((buf[base] == '-') && (buf[base + 1] == '-') && (buf[base + 2] == '>')) { incomment = 0; base += 2; } continue; } if (buf[base] == first) { if (third != 0) { if ((buf[base + 1] != next) || (buf[base + 2] != third)) continue; } else if (next != 0) { if (buf[base + 1] != next) continue; } ctxt->checkIndex = 0; #ifdef DEBUG_PUSH if (next == 0) xmlGenericError(xmlGenericErrorContext, "HPP: lookup '%c' found at %d\n", first, base); else if (third == 0) xmlGenericError(xmlGenericErrorContext, "HPP: lookup '%c%c' found at %d\n", first, next, base); else xmlGenericError(xmlGenericErrorContext, "HPP: lookup '%c%c%c' found at %d\n", first, next, third, base); #endif return (base - (in->cur - in->base)); } } if ((!incomment) && (!invalue)) ctxt->checkIndex = base; #ifdef DEBUG_PUSH if (next == 0) xmlGenericError(xmlGenericErrorContext, "HPP: lookup '%c' failed\n", first); else if (third == 0) xmlGenericError(xmlGenericErrorContext, "HPP: lookup '%c%c' failed\n", first, next); else xmlGenericError(xmlGenericErrorContext, "HPP: lookup '%c%c%c' failed\n", first, next, third); #endif return (-1); } /** * htmlParseLookupChars: * @ctxt: an HTML parser context * @stop: Array of chars, which stop the lookup. * @stopLen: Length of stop-Array * * Try to find if any char of the stop-Array is available in the input * stream. * This function has a side effect of (possibly) incrementing ctxt->checkIndex * to avoid rescanning sequences of bytes, it DOES change the state of the * parser, do not use liberally. * * Returns the index to the current parsing point if a stopChar * is available, -1 otherwise. */ static int htmlParseLookupChars(htmlParserCtxtPtr ctxt, const xmlChar * stop, int stopLen) { int base, len; htmlParserInputPtr in; const xmlChar *buf; int incomment = 0; int i; in = ctxt->input; if (in == NULL) return (-1); base = in->cur - in->base; if (base < 0) return (-1); if (ctxt->checkIndex > base) base = ctxt->checkIndex; if (in->buf == NULL) { buf = in->base; len = in->length; } else { buf = xmlBufContent(in->buf->buffer); len = xmlBufUse(in->buf->buffer); } for (; base < len; base++) { if (!incomment && (base + 4 < len)) { if ((buf[base] == '<') && (buf[base + 1] == '!') && (buf[base + 2] == '-') && (buf[base + 3] == '-')) { incomment = 1; /* do not increment past */ base += 2; } } if (incomment) { if (base + 3 > len) return (-1); if ((buf[base] == '-') && (buf[base + 1] == '-') && (buf[base + 2] == '>')) { incomment = 0; base += 2; } continue; } for (i = 0; i < stopLen; ++i) { if (buf[base] == stop[i]) { ctxt->checkIndex = 0; return (base - (in->cur - in->base)); } } } ctxt->checkIndex = base; return (-1); } /** * htmlParseTryOrFinish: * @ctxt: an HTML parser context * @terminate: last chunk indicator * * Try to progress on parsing * * Returns zero if no parsing was possible */ static int htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { int ret = 0; htmlParserInputPtr in; int avail = 0; xmlChar cur, next; htmlParserNodeInfo node_info; #ifdef DEBUG_PUSH switch (ctxt->instate) { case XML_PARSER_EOF: xmlGenericError(xmlGenericErrorContext, "HPP: try EOF\n"); break; case XML_PARSER_START: xmlGenericError(xmlGenericErrorContext, "HPP: try START\n"); break; case XML_PARSER_MISC: xmlGenericError(xmlGenericErrorContext, "HPP: try MISC\n");break; case XML_PARSER_COMMENT: xmlGenericError(xmlGenericErrorContext, "HPP: try COMMENT\n");break; case XML_PARSER_PROLOG: xmlGenericError(xmlGenericErrorContext, "HPP: try PROLOG\n");break; case XML_PARSER_START_TAG: xmlGenericError(xmlGenericErrorContext, "HPP: try START_TAG\n");break; case XML_PARSER_CONTENT: xmlGenericError(xmlGenericErrorContext, "HPP: try CONTENT\n");break; case XML_PARSER_CDATA_SECTION: xmlGenericError(xmlGenericErrorContext, "HPP: try CDATA_SECTION\n");break; case XML_PARSER_END_TAG: xmlGenericError(xmlGenericErrorContext, "HPP: try END_TAG\n");break; case XML_PARSER_ENTITY_DECL: xmlGenericError(xmlGenericErrorContext, "HPP: try ENTITY_DECL\n");break; case XML_PARSER_ENTITY_VALUE: xmlGenericError(xmlGenericErrorContext, "HPP: try ENTITY_VALUE\n");break; case XML_PARSER_ATTRIBUTE_VALUE: xmlGenericError(xmlGenericErrorContext, "HPP: try ATTRIBUTE_VALUE\n");break; case XML_PARSER_DTD: xmlGenericError(xmlGenericErrorContext, "HPP: try DTD\n");break; case XML_PARSER_EPILOG: xmlGenericError(xmlGenericErrorContext, "HPP: try EPILOG\n");break; case XML_PARSER_PI: xmlGenericError(xmlGenericErrorContext, "HPP: try PI\n");break; case XML_PARSER_SYSTEM_LITERAL: xmlGenericError(xmlGenericErrorContext, "HPP: try SYSTEM_LITERAL\n");break; } #endif while (1) { in = ctxt->input; if (in == NULL) break; if (in->buf == NULL) avail = in->length - (in->cur - in->base); else avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); if ((avail == 0) && (terminate)) { htmlAutoCloseOnEnd(ctxt); if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { /* * SAX: end of the document processing. */ ctxt->instate = XML_PARSER_EOF; if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) ctxt->sax->endDocument(ctxt->userData); } } if (avail < 1) goto done; cur = in->cur[0]; if (cur == 0) { SKIP(1); continue; } switch (ctxt->instate) { case XML_PARSER_EOF: /* * Document parsing is done ! */ goto done; case XML_PARSER_START: /* * Very first chars read from the document flow. */ cur = in->cur[0]; if (IS_BLANK_CH(cur)) { SKIP_BLANKS; if (in->buf == NULL) avail = in->length - (in->cur - in->base); else avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); } if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) ctxt->sax->startDocument(ctxt->userData); cur = in->cur[0]; next = in->cur[1]; if ((cur == '<') && (next == '!') && (UPP(2) == 'D') && (UPP(3) == 'O') && (UPP(4) == 'C') && (UPP(5) == 'T') && (UPP(6) == 'Y') && (UPP(7) == 'P') && (UPP(8) == 'E')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing internal subset\n"); #endif htmlParseDocTypeDecl(ctxt); ctxt->instate = XML_PARSER_PROLOG; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering PROLOG\n"); #endif } else { ctxt->instate = XML_PARSER_MISC; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering MISC\n"); #endif } break; case XML_PARSER_MISC: SKIP_BLANKS; if (in->buf == NULL) avail = in->length - (in->cur - in->base); else avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); /* * no chars in buffer */ if (avail < 1) goto done; /* * not enouth chars in buffer */ if (avail < 2) { if (!terminate) goto done; else next = ' '; } else { next = in->cur[1]; } cur = in->cur[0]; if ((cur == '<') && (next == '!') && (in->cur[2] == '-') && (in->cur[3] == '-')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing Comment\n"); #endif htmlParseComment(ctxt); ctxt->instate = XML_PARSER_MISC; } else if ((cur == '<') && (next == '?')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing PI\n"); #endif htmlParsePI(ctxt); ctxt->instate = XML_PARSER_MISC; } else if ((cur == '<') && (next == '!') && (UPP(2) == 'D') && (UPP(3) == 'O') && (UPP(4) == 'C') && (UPP(5) == 'T') && (UPP(6) == 'Y') && (UPP(7) == 'P') && (UPP(8) == 'E')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing internal subset\n"); #endif htmlParseDocTypeDecl(ctxt); ctxt->instate = XML_PARSER_PROLOG; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering PROLOG\n"); #endif } else if ((cur == '<') && (next == '!') && (avail < 9)) { goto done; } else { ctxt->instate = XML_PARSER_START_TAG; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering START_TAG\n"); #endif } break; case XML_PARSER_PROLOG: SKIP_BLANKS; if (in->buf == NULL) avail = in->length - (in->cur - in->base); else avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); if (avail < 2) goto done; cur = in->cur[0]; next = in->cur[1]; if ((cur == '<') && (next == '!') && (in->cur[2] == '-') && (in->cur[3] == '-')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing Comment\n"); #endif htmlParseComment(ctxt); ctxt->instate = XML_PARSER_PROLOG; } else if ((cur == '<') && (next == '?')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing PI\n"); #endif htmlParsePI(ctxt); ctxt->instate = XML_PARSER_PROLOG; } else if ((cur == '<') && (next == '!') && (avail < 4)) { goto done; } else { ctxt->instate = XML_PARSER_START_TAG; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering START_TAG\n"); #endif } break; case XML_PARSER_EPILOG: if (in->buf == NULL) avail = in->length - (in->cur - in->base); else avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); if (avail < 1) goto done; cur = in->cur[0]; if (IS_BLANK_CH(cur)) { htmlParseCharData(ctxt); goto done; } if (avail < 2) goto done; next = in->cur[1]; if ((cur == '<') && (next == '!') && (in->cur[2] == '-') && (in->cur[3] == '-')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing Comment\n"); #endif htmlParseComment(ctxt); ctxt->instate = XML_PARSER_EPILOG; } else if ((cur == '<') && (next == '?')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing PI\n"); #endif htmlParsePI(ctxt); ctxt->instate = XML_PARSER_EPILOG; } else if ((cur == '<') && (next == '!') && (avail < 4)) { goto done; } else { ctxt->errNo = XML_ERR_DOCUMENT_END; ctxt->wellFormed = 0; ctxt->instate = XML_PARSER_EOF; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering EOF\n"); #endif if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) ctxt->sax->endDocument(ctxt->userData); goto done; } break; case XML_PARSER_START_TAG: { const xmlChar *name; int failed; const htmlElemDesc * info; /* * no chars in buffer */ if (avail < 1) goto done; /* * not enouth chars in buffer */ if (avail < 2) { if (!terminate) goto done; else next = ' '; } else { next = in->cur[1]; } cur = in->cur[0]; if (cur != '<') { ctxt->instate = XML_PARSER_CONTENT; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; } if (next == '/') { ctxt->instate = XML_PARSER_END_TAG; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering END_TAG\n"); #endif break; } if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; /* Capture start position */ if (ctxt->record_info) { node_info.begin_pos = ctxt->input->consumed + (CUR_PTR - ctxt->input->base); node_info.begin_line = ctxt->input->line; } failed = htmlParseStartTag(ctxt); name = ctxt->name; if ((failed == -1) || (name == NULL)) { if (CUR == '>') NEXT; break; } /* * Lookup the info for that element. */ info = htmlTagLookup(name); if (info == NULL) { htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, "Tag %s invalid\n", name, NULL); } /* * Check for an Empty Element labeled the XML/SGML way */ if ((CUR == '/') && (NXT(1) == '>')) { SKIP(2); if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, name); htmlnamePop(ctxt); ctxt->instate = XML_PARSER_CONTENT; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; } if (CUR == '>') { NEXT; } else { htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, "Couldn't find end of Start Tag %s\n", name, NULL); /* * end of parsing of this node. */ if (xmlStrEqual(name, ctxt->name)) { nodePop(ctxt); htmlnamePop(ctxt); } if (ctxt->record_info) htmlNodeInfoPush(ctxt, &node_info); ctxt->instate = XML_PARSER_CONTENT; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; } /* * Check for an Empty Element from DTD definition */ if ((info != NULL) && (info->empty)) { if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) ctxt->sax->endElement(ctxt->userData, name); htmlnamePop(ctxt); } if (ctxt->record_info) htmlNodeInfoPush(ctxt, &node_info); ctxt->instate = XML_PARSER_CONTENT; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; } case XML_PARSER_CONTENT: { long cons; /* * Handle preparsed entities and charRef */ if (ctxt->token != 0) { xmlChar chr[2] = { 0 , 0 } ; chr[0] = (xmlChar) ctxt->token; htmlCheckParagraph(ctxt); if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) ctxt->sax->characters(ctxt->userData, chr, 1); ctxt->token = 0; ctxt->checkIndex = 0; } if ((avail == 1) && (terminate)) { cur = in->cur[0]; if ((cur != '<') && (cur != '&')) { if (ctxt->sax != NULL) { if (IS_BLANK_CH(cur)) { if (ctxt->keepBlanks) { if (ctxt->sax->characters != NULL) ctxt->sax->characters( ctxt->userData, &cur, 1); } else { if (ctxt->sax->ignorableWhitespace != NULL) ctxt->sax->ignorableWhitespace( ctxt->userData, &cur, 1); } } else { htmlCheckParagraph(ctxt); if (ctxt->sax->characters != NULL) ctxt->sax->characters( ctxt->userData, &cur, 1); } } ctxt->token = 0; ctxt->checkIndex = 0; in->cur++; break; } } if (avail < 2) goto done; cur = in->cur[0]; next = in->cur[1]; cons = ctxt->nbChars; if ((xmlStrEqual(ctxt->name, BAD_CAST"script")) || (xmlStrEqual(ctxt->name, BAD_CAST"style"))) { /* * Handle SCRIPT/STYLE separately */ if (!terminate) { int idx; xmlChar val; idx = htmlParseLookupSequence(ctxt, '<', '/', 0, 0, 0); if (idx < 0) goto done; val = in->cur[idx + 2]; if (val == 0) /* bad cut of input */ goto done; } htmlParseScript(ctxt); if ((cur == '<') && (next == '/')) { ctxt->instate = XML_PARSER_END_TAG; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering END_TAG\n"); #endif break; } } else { /* * Sometimes DOCTYPE arrives in the middle of the document */ if ((cur == '<') && (next == '!') && (UPP(2) == 'D') && (UPP(3) == 'O') && (UPP(4) == 'C') && (UPP(5) == 'T') && (UPP(6) == 'Y') && (UPP(7) == 'P') && (UPP(8) == 'E')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, "Misplaced DOCTYPE declaration\n", BAD_CAST "DOCTYPE" , NULL); htmlParseDocTypeDecl(ctxt); } else if ((cur == '<') && (next == '!') && (in->cur[2] == '-') && (in->cur[3] == '-')) { if ((!terminate) && (htmlParseLookupSequence( ctxt, '-', '-', '>', 1, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing Comment\n"); #endif htmlParseComment(ctxt); ctxt->instate = XML_PARSER_CONTENT; } else if ((cur == '<') && (next == '?')) { if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing PI\n"); #endif htmlParsePI(ctxt); ctxt->instate = XML_PARSER_CONTENT; } else if ((cur == '<') && (next == '!') && (avail < 4)) { goto done; } else if ((cur == '<') && (next == '/')) { ctxt->instate = XML_PARSER_END_TAG; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering END_TAG\n"); #endif break; } else if (cur == '<') { ctxt->instate = XML_PARSER_START_TAG; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering START_TAG\n"); #endif break; } else if (cur == '&') { if ((!terminate) && (htmlParseLookupChars(ctxt, BAD_CAST "; >/", 4) < 0)) goto done; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing Reference\n"); #endif /* TODO: check generation of subtrees if noent !!! */ htmlParseReference(ctxt); } else { /* * check that the text sequence is complete * before handing out the data to the parser * to avoid problems with erroneous end of * data detection. */ if ((!terminate) && (htmlParseLookupChars(ctxt, BAD_CAST "<&", 2) < 0)) goto done; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: Parsing char data\n"); #endif htmlParseCharData(ctxt); } } if (cons == ctxt->nbChars) { if (ctxt->node != NULL) { htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "detected an error in element content\n", NULL, NULL); } NEXT; break; } break; } case XML_PARSER_END_TAG: if (avail < 2) goto done; if ((!terminate) && (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) goto done; htmlParseEndTag(ctxt); if (ctxt->nameNr == 0) { ctxt->instate = XML_PARSER_EPILOG; } else { ctxt->instate = XML_PARSER_CONTENT; } ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_CDATA_SECTION: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == CDATA\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_DTD: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == DTD\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_COMMENT: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == COMMENT\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_PI: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == PI\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_ENTITY_DECL: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == ENTITY_DECL\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_ENTITY_VALUE: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == ENTITY_VALUE\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering DTD\n"); #endif break; case XML_PARSER_ATTRIBUTE_VALUE: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == ATTRIBUTE_VALUE\n", NULL, NULL); ctxt->instate = XML_PARSER_START_TAG; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering START_TAG\n"); #endif break; case XML_PARSER_SYSTEM_LITERAL: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == XML_PARSER_SYSTEM_LITERAL\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_IGNORE: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == XML_PARSER_IGNORE\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; case XML_PARSER_PUBLIC_LITERAL: htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "HPP: internal error, state == XML_PARSER_LITERAL\n", NULL, NULL); ctxt->instate = XML_PARSER_CONTENT; ctxt->checkIndex = 0; #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: entering CONTENT\n"); #endif break; } } done: if ((avail == 0) && (terminate)) { htmlAutoCloseOnEnd(ctxt); if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { /* * SAX: end of the document processing. */ ctxt->instate = XML_PARSER_EOF; if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) ctxt->sax->endDocument(ctxt->userData); } } if ((ctxt->myDoc != NULL) && ((terminate) || (ctxt->instate == XML_PARSER_EOF) || (ctxt->instate == XML_PARSER_EPILOG))) { xmlDtdPtr dtd; dtd = xmlGetIntSubset(ctxt->myDoc); if (dtd == NULL) ctxt->myDoc->intSubset = xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html", BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); } #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: done %d\n", ret); #endif return(ret); } /** * htmlParseChunk: * @ctxt: an HTML parser context * @chunk: an char array * @size: the size in byte of the chunk * @terminate: last chunk indicator * * Parse a Chunk of memory * * Returns zero if no error, the xmlParserErrors otherwise. */ int htmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size, int terminate) { if ((ctxt == NULL) || (ctxt->input == NULL)) { htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, "htmlParseChunk: context error\n", NULL, NULL); return(XML_ERR_INTERNAL_ERROR); } if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && (ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) { size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, ctxt->input); size_t cur = ctxt->input->cur - ctxt->input->base; int res; res = xmlParserInputBufferPush(ctxt->input->buf, size, chunk); if (res < 0) { ctxt->errNo = XML_PARSER_EOF; ctxt->disableSAX = 1; return (XML_PARSER_EOF); } xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); #endif #if 0 if ((terminate) || (ctxt->input->buf->buffer->use > 80)) htmlParseTryOrFinish(ctxt, terminate); #endif } else if (ctxt->instate != XML_PARSER_EOF) { if ((ctxt->input != NULL) && ctxt->input->buf != NULL) { xmlParserInputBufferPtr in = ctxt->input->buf; if ((in->encoder != NULL) && (in->buffer != NULL) && (in->raw != NULL)) { int nbchars; size_t base = xmlBufGetInputBase(in->buffer, ctxt->input); size_t current = ctxt->input->cur - ctxt->input->base; nbchars = xmlCharEncInput(in, terminate); if (nbchars < 0) { htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, "encoder error\n", NULL, NULL); return(XML_ERR_INVALID_ENCODING); } xmlBufSetInputBaseCur(in->buffer, ctxt->input, base, current); } } } htmlParseTryOrFinish(ctxt, terminate); if (terminate) { if ((ctxt->instate != XML_PARSER_EOF) && (ctxt->instate != XML_PARSER_EPILOG) && (ctxt->instate != XML_PARSER_MISC)) { ctxt->errNo = XML_ERR_DOCUMENT_END; ctxt->wellFormed = 0; } if (ctxt->instate != XML_PARSER_EOF) { if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) ctxt->sax->endDocument(ctxt->userData); } ctxt->instate = XML_PARSER_EOF; } return((xmlParserErrors) ctxt->errNo); } /************************************************************************ * * * User entry points * * * ************************************************************************/ /** * htmlCreatePushParserCtxt: * @sax: a SAX handler * @user_data: The user data returned on SAX callbacks * @chunk: a pointer to an array of chars * @size: number of chars in the array * @filename: an optional file name or URI * @enc: an optional encoding * * Create a parser context for using the HTML parser in push mode * The value of @filename is used for fetching external entities * and error/warning reports. * * Returns the new parser context or NULL */ htmlParserCtxtPtr htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, void *user_data, const char *chunk, int size, const char *filename, xmlCharEncoding enc) { htmlParserCtxtPtr ctxt; htmlParserInputPtr inputStream; xmlParserInputBufferPtr buf; xmlInitParser(); buf = xmlAllocParserInputBuffer(enc); if (buf == NULL) return(NULL); ctxt = htmlNewParserCtxt(); if (ctxt == NULL) { xmlFreeParserInputBuffer(buf); return(NULL); } if(enc==XML_CHAR_ENCODING_UTF8 || buf->encoder) ctxt->charset=XML_CHAR_ENCODING_UTF8; if (sax != NULL) { if (ctxt->sax != (xmlSAXHandlerPtr) &htmlDefaultSAXHandler) xmlFree(ctxt->sax); ctxt->sax = (htmlSAXHandlerPtr) xmlMalloc(sizeof(htmlSAXHandler)); if (ctxt->sax == NULL) { xmlFree(buf); xmlFree(ctxt); return(NULL); } memcpy(ctxt->sax, sax, sizeof(htmlSAXHandler)); if (user_data != NULL) ctxt->userData = user_data; } if (filename == NULL) { ctxt->directory = NULL; } else { ctxt->directory = xmlParserGetDirectory(filename); } inputStream = htmlNewInputStream(ctxt); if (inputStream == NULL) { xmlFreeParserCtxt(ctxt); xmlFree(buf); return(NULL); } if (filename == NULL) inputStream->filename = NULL; else inputStream->filename = (char *) xmlCanonicPath((const xmlChar *) filename); inputStream->buf = buf; xmlBufResetInput(buf->buffer, inputStream); inputPush(ctxt, inputStream); if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && (ctxt->input->buf != NULL)) { size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, ctxt->input); size_t cur = ctxt->input->cur - ctxt->input->base; xmlParserInputBufferPush(ctxt->input->buf, size, chunk); xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); #ifdef DEBUG_PUSH xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); #endif } ctxt->progressive = 1; return(ctxt); } #endif /* LIBXML_PUSH_ENABLED */ /** * htmlSAXParseDoc: * @cur: a pointer to an array of xmlChar * @encoding: a free form C string describing the HTML document encoding, or NULL * @sax: the SAX handler block * @userData: if using SAX, this pointer will be provided on callbacks. * * Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks * to handle parse events. If sax is NULL, fallback to the default DOM * behavior and return a tree. * * Returns the resulting document tree unless SAX is NULL or the document is * not well formed. */ htmlDocPtr htmlSAXParseDoc(xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData) { htmlDocPtr ret; htmlParserCtxtPtr ctxt; xmlInitParser(); if (cur == NULL) return(NULL); ctxt = htmlCreateDocParserCtxt(cur, encoding); if (ctxt == NULL) return(NULL); if (sax != NULL) { if (ctxt->sax != NULL) xmlFree (ctxt->sax); ctxt->sax = sax; ctxt->userData = userData; } htmlParseDocument(ctxt); ret = ctxt->myDoc; if (sax != NULL) { ctxt->sax = NULL; ctxt->userData = NULL; } htmlFreeParserCtxt(ctxt); return(ret); } /** * htmlParseDoc: * @cur: a pointer to an array of xmlChar * @encoding: a free form C string describing the HTML document encoding, or NULL * * parse an HTML in-memory document and build a tree. * * Returns the resulting document tree */ htmlDocPtr htmlParseDoc(xmlChar *cur, const char *encoding) { return(htmlSAXParseDoc(cur, encoding, NULL, NULL)); } /** * htmlCreateFileParserCtxt: * @filename: the filename * @encoding: a free form C string describing the HTML document encoding, or NULL * * Create a parser context for a file content. * Automatic support for ZLIB/Compress compressed document is provided * by default if found at compile-time. * * Returns the new parser context or NULL */ htmlParserCtxtPtr htmlCreateFileParserCtxt(const char *filename, const char *encoding) { htmlParserCtxtPtr ctxt; htmlParserInputPtr inputStream; char *canonicFilename; /* htmlCharEncoding enc; */ xmlChar *content, *content_line = (xmlChar *) "charset="; if (filename == NULL) return(NULL); ctxt = htmlNewParserCtxt(); if (ctxt == NULL) { return(NULL); } canonicFilename = (char *) xmlCanonicPath((const xmlChar *) filename); if (canonicFilename == NULL) { #ifdef LIBXML_SAX1_ENABLED if (xmlDefaultSAXHandler.error != NULL) { xmlDefaultSAXHandler.error(NULL, "out of memory\n"); } #endif xmlFreeParserCtxt(ctxt); return(NULL); } inputStream = xmlLoadExternalEntity(canonicFilename, NULL, ctxt); xmlFree(canonicFilename); if (inputStream == NULL) { xmlFreeParserCtxt(ctxt); return(NULL); } inputPush(ctxt, inputStream); /* set encoding */ if (encoding) { content = xmlMallocAtomic (xmlStrlen(content_line) + strlen(encoding) + 1); if (content) { strcpy ((char *)content, (char *)content_line); strcat ((char *)content, (char *)encoding); htmlCheckEncoding (ctxt, content); xmlFree (content); } } return(ctxt); } /** * htmlSAXParseFile: * @filename: the filename * @encoding: a free form C string describing the HTML document encoding, or NULL * @sax: the SAX handler block * @userData: if using SAX, this pointer will be provided on callbacks. * * parse an HTML file and build a tree. Automatic support for ZLIB/Compress * compressed document is provided by default if found at compile-time. * It use the given SAX function block to handle the parsing callback. * If sax is NULL, fallback to the default DOM tree building routines. * * Returns the resulting document tree unless SAX is NULL or the document is * not well formed. */ htmlDocPtr htmlSAXParseFile(const char *filename, const char *encoding, htmlSAXHandlerPtr sax, void *userData) { htmlDocPtr ret; htmlParserCtxtPtr ctxt; htmlSAXHandlerPtr oldsax = NULL; xmlInitParser(); ctxt = htmlCreateFileParserCtxt(filename, encoding); if (ctxt == NULL) return(NULL); if (sax != NULL) { oldsax = ctxt->sax; ctxt->sax = sax; ctxt->userData = userData; } htmlParseDocument(ctxt); ret = ctxt->myDoc; if (sax != NULL) { ctxt->sax = oldsax; ctxt->userData = NULL; } htmlFreeParserCtxt(ctxt); return(ret); } /** * htmlParseFile: * @filename: the filename * @encoding: a free form C string describing the HTML document encoding, or NULL * * parse an HTML file and build a tree. Automatic support for ZLIB/Compress * compressed document is provided by default if found at compile-time. * * Returns the resulting document tree */ htmlDocPtr htmlParseFile(const char *filename, const char *encoding) { return(htmlSAXParseFile(filename, encoding, NULL, NULL)); } /** * htmlHandleOmittedElem: * @val: int 0 or 1 * * Set and return the previous value for handling HTML omitted tags. * * Returns the last value for 0 for no handling, 1 for auto insertion. */ int htmlHandleOmittedElem(int val) { int old = htmlOmittedDefaultValue; htmlOmittedDefaultValue = val; return(old); } /** * htmlElementAllowedHere: * @parent: HTML parent element * @elt: HTML element * * Checks whether an HTML element may be a direct child of a parent element. * Note - doesn't check for deprecated elements * * Returns 1 if allowed; 0 otherwise. */ int htmlElementAllowedHere(const htmlElemDesc* parent, const xmlChar* elt) { const char** p ; if ( ! elt || ! parent || ! parent->subelts ) return 0 ; for ( p = parent->subelts; *p; ++p ) if ( !xmlStrcmp((const xmlChar *)*p, elt) ) return 1 ; return 0 ; } /** * htmlElementStatusHere: * @parent: HTML parent element * @elt: HTML element * * Checks whether an HTML element may be a direct child of a parent element. * and if so whether it is valid or deprecated. * * Returns one of HTML_VALID, HTML_DEPRECATED, HTML_INVALID */ htmlStatus htmlElementStatusHere(const htmlElemDesc* parent, const htmlElemDesc* elt) { if ( ! parent || ! elt ) return HTML_INVALID ; if ( ! htmlElementAllowedHere(parent, (const xmlChar*) elt->name ) ) return HTML_INVALID ; return ( elt->dtd == 0 ) ? HTML_VALID : HTML_DEPRECATED ; } /** * htmlAttrAllowed: * @elt: HTML element * @attr: HTML attribute * @legacy: whether to allow deprecated attributes * * Checks whether an attribute is valid for an element * Has full knowledge of Required and Deprecated attributes * * Returns one of HTML_REQUIRED, HTML_VALID, HTML_DEPRECATED, HTML_INVALID */ htmlStatus htmlAttrAllowed(const htmlElemDesc* elt, const xmlChar* attr, int legacy) { const char** p ; if ( !elt || ! attr ) return HTML_INVALID ; if ( elt->attrs_req ) for ( p = elt->attrs_req; *p; ++p) if ( !xmlStrcmp((const xmlChar*)*p, attr) ) return HTML_REQUIRED ; if ( elt->attrs_opt ) for ( p = elt->attrs_opt; *p; ++p) if ( !xmlStrcmp((const xmlChar*)*p, attr) ) return HTML_VALID ; if ( legacy && elt->attrs_depr ) for ( p = elt->attrs_depr; *p; ++p) if ( !xmlStrcmp((const xmlChar*)*p, attr) ) return HTML_DEPRECATED ; return HTML_INVALID ; } /** * htmlNodeStatus: * @node: an htmlNodePtr in a tree * @legacy: whether to allow deprecated elements (YES is faster here * for Element nodes) * * Checks whether the tree node is valid. Experimental (the author * only uses the HTML enhancements in a SAX parser) * * Return: for Element nodes, a return from htmlElementAllowedHere (if * legacy allowed) or htmlElementStatusHere (otherwise). * for Attribute nodes, a return from htmlAttrAllowed * for other nodes, HTML_NA (no checks performed) */ htmlStatus htmlNodeStatus(const htmlNodePtr node, int legacy) { if ( ! node ) return HTML_INVALID ; switch ( node->type ) { case XML_ELEMENT_NODE: return legacy ? ( htmlElementAllowedHere ( htmlTagLookup(node->parent->name) , node->name ) ? HTML_VALID : HTML_INVALID ) : htmlElementStatusHere( htmlTagLookup(node->parent->name) , htmlTagLookup(node->name) ) ; case XML_ATTRIBUTE_NODE: return htmlAttrAllowed( htmlTagLookup(node->parent->name) , node->name, legacy) ; default: return HTML_NA ; } } /************************************************************************ * * * New set (2.6.0) of simpler and more flexible APIs * * * ************************************************************************/ /** * DICT_FREE: * @str: a string * * Free a string if it is not owned by the "dict" dictionnary in the * current scope */ #define DICT_FREE(str) \ if ((str) && ((!dict) || \ (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ xmlFree((char *)(str)); /** * htmlCtxtReset: * @ctxt: an HTML parser context * * Reset a parser context */ void htmlCtxtReset(htmlParserCtxtPtr ctxt) { xmlParserInputPtr input; xmlDictPtr dict; if (ctxt == NULL) return; xmlInitParser(); dict = ctxt->dict; while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ xmlFreeInputStream(input); } ctxt->inputNr = 0; ctxt->input = NULL; ctxt->spaceNr = 0; if (ctxt->spaceTab != NULL) { ctxt->spaceTab[0] = -1; ctxt->space = &ctxt->spaceTab[0]; } else { ctxt->space = NULL; } ctxt->nodeNr = 0; ctxt->node = NULL; ctxt->nameNr = 0; ctxt->name = NULL; DICT_FREE(ctxt->version); ctxt->version = NULL; DICT_FREE(ctxt->encoding); ctxt->encoding = NULL; DICT_FREE(ctxt->directory); ctxt->directory = NULL; DICT_FREE(ctxt->extSubURI); ctxt->extSubURI = NULL; DICT_FREE(ctxt->extSubSystem); ctxt->extSubSystem = NULL; if (ctxt->myDoc != NULL) xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL; ctxt->standalone = -1; ctxt->hasExternalSubset = 0; ctxt->hasPErefs = 0; ctxt->html = 1; ctxt->external = 0; ctxt->instate = XML_PARSER_START; ctxt->token = 0; ctxt->wellFormed = 1; ctxt->nsWellFormed = 1; ctxt->disableSAX = 0; ctxt->valid = 1; ctxt->vctxt.userData = ctxt; ctxt->vctxt.error = xmlParserValidityError; ctxt->vctxt.warning = xmlParserValidityWarning; ctxt->record_info = 0; ctxt->nbChars = 0; ctxt->checkIndex = 0; ctxt->inSubset = 0; ctxt->errNo = XML_ERR_OK; ctxt->depth = 0; ctxt->charset = XML_CHAR_ENCODING_NONE; ctxt->catalogs = NULL; xmlInitNodeInfoSeq(&ctxt->node_seq); if (ctxt->attsDefault != NULL) { xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); ctxt->attsDefault = NULL; } if (ctxt->attsSpecial != NULL) { xmlHashFree(ctxt->attsSpecial, NULL); ctxt->attsSpecial = NULL; } } /** * htmlCtxtUseOptions: * @ctxt: an HTML parser context * @options: a combination of htmlParserOption(s) * * Applies the options to the parser context * * Returns 0 in case of success, the set of unknown or unimplemented options * in case of error. */ int htmlCtxtUseOptions(htmlParserCtxtPtr ctxt, int options) { if (ctxt == NULL) return(-1); if (options & HTML_PARSE_NOWARNING) { ctxt->sax->warning = NULL; ctxt->vctxt.warning = NULL; options -= XML_PARSE_NOWARNING; ctxt->options |= XML_PARSE_NOWARNING; } if (options & HTML_PARSE_NOERROR) { ctxt->sax->error = NULL; ctxt->vctxt.error = NULL; ctxt->sax->fatalError = NULL; options -= XML_PARSE_NOERROR; ctxt->options |= XML_PARSE_NOERROR; } if (options & HTML_PARSE_PEDANTIC) { ctxt->pedantic = 1; options -= XML_PARSE_PEDANTIC; ctxt->options |= XML_PARSE_PEDANTIC; } else ctxt->pedantic = 0; if (options & XML_PARSE_NOBLANKS) { ctxt->keepBlanks = 0; ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; options -= XML_PARSE_NOBLANKS; ctxt->options |= XML_PARSE_NOBLANKS; } else ctxt->keepBlanks = 1; if (options & HTML_PARSE_RECOVER) { ctxt->recovery = 1; options -= HTML_PARSE_RECOVER; } else ctxt->recovery = 0; if (options & HTML_PARSE_COMPACT) { ctxt->options |= HTML_PARSE_COMPACT; options -= HTML_PARSE_COMPACT; } if (options & XML_PARSE_HUGE) { ctxt->options |= XML_PARSE_HUGE; options -= XML_PARSE_HUGE; } if (options & HTML_PARSE_NODEFDTD) { ctxt->options |= HTML_PARSE_NODEFDTD; options -= HTML_PARSE_NODEFDTD; } if (options & HTML_PARSE_IGNORE_ENC) { ctxt->options |= HTML_PARSE_IGNORE_ENC; options -= HTML_PARSE_IGNORE_ENC; } if (options & HTML_PARSE_NOIMPLIED) { ctxt->options |= HTML_PARSE_NOIMPLIED; options -= HTML_PARSE_NOIMPLIED; } ctxt->dictNames = 0; return (options); } /** * htmlDoRead: * @ctxt: an HTML parser context * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * @reuse: keep the context for reuse * * Common front-end for the htmlRead functions * * Returns the resulting document tree or NULL */ static htmlDocPtr htmlDoRead(htmlParserCtxtPtr ctxt, const char *URL, const char *encoding, int options, int reuse) { htmlDocPtr ret; htmlCtxtUseOptions(ctxt, options); ctxt->html = 1; if (encoding != NULL) { xmlCharEncodingHandlerPtr hdlr; hdlr = xmlFindCharEncodingHandler(encoding); if (hdlr != NULL) { xmlSwitchToEncoding(ctxt, hdlr); if (ctxt->input->encoding != NULL) xmlFree((xmlChar *) ctxt->input->encoding); ctxt->input->encoding = xmlStrdup((xmlChar *)encoding); } } if ((URL != NULL) && (ctxt->input != NULL) && (ctxt->input->filename == NULL)) ctxt->input->filename = (char *) xmlStrdup((const xmlChar *) URL); htmlParseDocument(ctxt); ret = ctxt->myDoc; ctxt->myDoc = NULL; if (!reuse) { if ((ctxt->dictNames) && (ret != NULL) && (ret->dict == ctxt->dict)) ctxt->dict = NULL; xmlFreeParserCtxt(ctxt); } return (ret); } /** * htmlReadDoc: * @cur: a pointer to a zero terminated string * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML in-memory document and build a tree. * * Returns the resulting document tree */ htmlDocPtr htmlReadDoc(const xmlChar * cur, const char *URL, const char *encoding, int options) { htmlParserCtxtPtr ctxt; if (cur == NULL) return (NULL); xmlInitParser(); ctxt = htmlCreateDocParserCtxt(cur, NULL); if (ctxt == NULL) return (NULL); return (htmlDoRead(ctxt, URL, encoding, options, 0)); } /** * htmlReadFile: * @filename: a file or URL * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML file from the filesystem or the network. * * Returns the resulting document tree */ htmlDocPtr htmlReadFile(const char *filename, const char *encoding, int options) { htmlParserCtxtPtr ctxt; xmlInitParser(); ctxt = htmlCreateFileParserCtxt(filename, encoding); if (ctxt == NULL) return (NULL); return (htmlDoRead(ctxt, NULL, NULL, options, 0)); } /** * htmlReadMemory: * @buffer: a pointer to a char array * @size: the size of the array * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML in-memory document and build a tree. * * Returns the resulting document tree */ htmlDocPtr htmlReadMemory(const char *buffer, int size, const char *URL, const char *encoding, int options) { htmlParserCtxtPtr ctxt; xmlInitParser(); ctxt = xmlCreateMemoryParserCtxt(buffer, size); if (ctxt == NULL) return (NULL); htmlDefaultSAXHandlerInit(); if (ctxt->sax != NULL) memcpy(ctxt->sax, &htmlDefaultSAXHandler, sizeof(xmlSAXHandlerV1)); return (htmlDoRead(ctxt, URL, encoding, options, 0)); } /** * htmlReadFd: * @fd: an open file descriptor * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML from a file descriptor and build a tree. * * Returns the resulting document tree */ htmlDocPtr htmlReadFd(int fd, const char *URL, const char *encoding, int options) { htmlParserCtxtPtr ctxt; xmlParserInputBufferPtr input; xmlParserInputPtr stream; if (fd < 0) return (NULL); xmlInitParser(); input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); if (input == NULL) return (NULL); ctxt = xmlNewParserCtxt(); if (ctxt == NULL) { xmlFreeParserInputBuffer(input); return (NULL); } stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); if (stream == NULL) { xmlFreeParserInputBuffer(input); xmlFreeParserCtxt(ctxt); return (NULL); } inputPush(ctxt, stream); return (htmlDoRead(ctxt, URL, encoding, options, 0)); } /** * htmlReadIO: * @ioread: an I/O read function * @ioclose: an I/O close function * @ioctx: an I/O handler * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an HTML document from I/O functions and source and build a tree. * * Returns the resulting document tree */ htmlDocPtr htmlReadIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options) { htmlParserCtxtPtr ctxt; xmlParserInputBufferPtr input; xmlParserInputPtr stream; if (ioread == NULL) return (NULL); xmlInitParser(); input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, XML_CHAR_ENCODING_NONE); if (input == NULL) { if (ioclose != NULL) ioclose(ioctx); return (NULL); } ctxt = htmlNewParserCtxt(); if (ctxt == NULL) { xmlFreeParserInputBuffer(input); return (NULL); } stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); if (stream == NULL) { xmlFreeParserInputBuffer(input); xmlFreeParserCtxt(ctxt); return (NULL); } inputPush(ctxt, stream); return (htmlDoRead(ctxt, URL, encoding, options, 0)); } /** * htmlCtxtReadDoc: * @ctxt: an HTML parser context * @cur: a pointer to a zero terminated string * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML in-memory document and build a tree. * This reuses the existing @ctxt parser context * * Returns the resulting document tree */ htmlDocPtr htmlCtxtReadDoc(htmlParserCtxtPtr ctxt, const xmlChar * cur, const char *URL, const char *encoding, int options) { xmlParserInputPtr stream; if (cur == NULL) return (NULL); if (ctxt == NULL) return (NULL); htmlCtxtReset(ctxt); stream = xmlNewStringInputStream(ctxt, cur); if (stream == NULL) { return (NULL); } inputPush(ctxt, stream); return (htmlDoRead(ctxt, URL, encoding, options, 1)); } /** * htmlCtxtReadFile: * @ctxt: an HTML parser context * @filename: a file or URL * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML file from the filesystem or the network. * This reuses the existing @ctxt parser context * * Returns the resulting document tree */ htmlDocPtr htmlCtxtReadFile(htmlParserCtxtPtr ctxt, const char *filename, const char *encoding, int options) { xmlParserInputPtr stream; if (filename == NULL) return (NULL); if (ctxt == NULL) return (NULL); htmlCtxtReset(ctxt); stream = xmlLoadExternalEntity(filename, NULL, ctxt); if (stream == NULL) { return (NULL); } inputPush(ctxt, stream); return (htmlDoRead(ctxt, NULL, encoding, options, 1)); } /** * htmlCtxtReadMemory: * @ctxt: an HTML parser context * @buffer: a pointer to a char array * @size: the size of the array * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML in-memory document and build a tree. * This reuses the existing @ctxt parser context * * Returns the resulting document tree */ htmlDocPtr htmlCtxtReadMemory(htmlParserCtxtPtr ctxt, const char *buffer, int size, const char *URL, const char *encoding, int options) { xmlParserInputBufferPtr input; xmlParserInputPtr stream; if (ctxt == NULL) return (NULL); if (buffer == NULL) return (NULL); htmlCtxtReset(ctxt); input = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); if (input == NULL) { return(NULL); } stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); if (stream == NULL) { xmlFreeParserInputBuffer(input); return(NULL); } inputPush(ctxt, stream); return (htmlDoRead(ctxt, URL, encoding, options, 1)); } /** * htmlCtxtReadFd: * @ctxt: an HTML parser context * @fd: an open file descriptor * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an XML from a file descriptor and build a tree. * This reuses the existing @ctxt parser context * * Returns the resulting document tree */ htmlDocPtr htmlCtxtReadFd(htmlParserCtxtPtr ctxt, int fd, const char *URL, const char *encoding, int options) { xmlParserInputBufferPtr input; xmlParserInputPtr stream; if (fd < 0) return (NULL); if (ctxt == NULL) return (NULL); htmlCtxtReset(ctxt); input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); if (input == NULL) return (NULL); stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); if (stream == NULL) { xmlFreeParserInputBuffer(input); return (NULL); } inputPush(ctxt, stream); return (htmlDoRead(ctxt, URL, encoding, options, 1)); } /** * htmlCtxtReadIO: * @ctxt: an HTML parser context * @ioread: an I/O read function * @ioclose: an I/O close function * @ioctx: an I/O handler * @URL: the base URL to use for the document * @encoding: the document encoding, or NULL * @options: a combination of htmlParserOption(s) * * parse an HTML document from I/O functions and source and build a tree. * This reuses the existing @ctxt parser context * * Returns the resulting document tree */ htmlDocPtr htmlCtxtReadIO(htmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, const char *URL, const char *encoding, int options) { xmlParserInputBufferPtr input; xmlParserInputPtr stream; if (ioread == NULL) return (NULL); if (ctxt == NULL) return (NULL); htmlCtxtReset(ctxt); input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, XML_CHAR_ENCODING_NONE); if (input == NULL) { if (ioclose != NULL) ioclose(ioctx); return (NULL); } stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); if (stream == NULL) { xmlFreeParserInputBuffer(input); return (NULL); } inputPush(ctxt, stream); return (htmlDoRead(ctxt, URL, encoding, options, 1)); } #define bottom_HTMLparser #include "elfgcchack.h" #endif /* LIBXML_HTML_ENABLED */ libxml2-2.9.1+dfsg1/gentest.py0000755000175000017500000007171612113312342014606 0ustar aronaron#!/usr/bin/python -u # # generate a tester program for the API # import sys import os import string try: import libxml2 except: print "libxml2 python bindings not available, skipping testapi.c generation" sys.exit(0) if len(sys.argv) > 1: srcPref = sys.argv[1] + '/' else: srcPref = '' # # Modules we want to skip in API test # skipped_modules = [ "SAX", "xlink", "threads", "globals", "xmlmemory", "xmlversion", "xmlexports", #deprecated "DOCBparser", ] # # defines for each module # modules_defines = { "HTMLparser": "LIBXML_HTML_ENABLED", "catalog": "LIBXML_CATALOG_ENABLED", "xmlreader": "LIBXML_READER_ENABLED", "relaxng": "LIBXML_SCHEMAS_ENABLED", "schemasInternals": "LIBXML_SCHEMAS_ENABLED", "xmlschemas": "LIBXML_SCHEMAS_ENABLED", "xmlschemastypes": "LIBXML_SCHEMAS_ENABLED", "xpath": "LIBXML_XPATH_ENABLED", "xpathInternals": "LIBXML_XPATH_ENABLED", "xinclude": "LIBXML_XINCLUDE_ENABLED", "xpointer": "LIBXML_XPTR_ENABLED", "xmlregexp" : "LIBXML_REGEXP_ENABLED", "xmlautomata" : "LIBXML_AUTOMATA_ENABLED", "xmlsave" : "LIBXML_OUTPUT_ENABLED", "DOCBparser" : "LIBXML_DOCB_ENABLED", "xmlmodule" : "LIBXML_MODULES_ENABLED", "pattern" : "LIBXML_PATTERN_ENABLED", "schematron" : "LIBXML_SCHEMATRON_ENABLED", } # # defines for specific functions # function_defines = { "htmlDefaultSAXHandlerInit": "LIBXML_HTML_ENABLED", "xmlSAX2EndElement" : "LIBXML_SAX1_ENABLED", "xmlSAX2StartElement" : "LIBXML_SAX1_ENABLED", "xmlSAXDefaultVersion" : "LIBXML_SAX1_ENABLED", "UTF8Toisolat1" : "LIBXML_OUTPUT_ENABLED", "xmlCleanupPredefinedEntities": "LIBXML_LEGACY_ENABLED", "xmlInitializePredefinedEntities": "LIBXML_LEGACY_ENABLED", "xmlSetFeature": "LIBXML_LEGACY_ENABLED", "xmlGetFeature": "LIBXML_LEGACY_ENABLED", "xmlGetFeaturesList": "LIBXML_LEGACY_ENABLED", "xmlIOParseDTD": "LIBXML_VALID_ENABLED", "xmlParseDTD": "LIBXML_VALID_ENABLED", "xmlParseDoc": "LIBXML_SAX1_ENABLED", "xmlParseMemory": "LIBXML_SAX1_ENABLED", "xmlRecoverDoc": "LIBXML_SAX1_ENABLED", "xmlParseFile": "LIBXML_SAX1_ENABLED", "xmlRecoverFile": "LIBXML_SAX1_ENABLED", "xmlRecoverMemory": "LIBXML_SAX1_ENABLED", "xmlSAXParseFileWithData": "LIBXML_SAX1_ENABLED", "xmlSAXParseMemory": "LIBXML_SAX1_ENABLED", "xmlSAXUserParseMemory": "LIBXML_SAX1_ENABLED", "xmlSAXParseDoc": "LIBXML_SAX1_ENABLED", "xmlSAXParseDTD": "LIBXML_SAX1_ENABLED", "xmlSAXUserParseFile": "LIBXML_SAX1_ENABLED", "xmlParseEntity": "LIBXML_SAX1_ENABLED", "xmlParseExternalEntity": "LIBXML_SAX1_ENABLED", "xmlSAXParseMemoryWithData": "LIBXML_SAX1_ENABLED", "xmlParseBalancedChunkMemory": "LIBXML_SAX1_ENABLED", "xmlParseBalancedChunkMemoryRecover": "LIBXML_SAX1_ENABLED", "xmlSetupParserForBuffer": "LIBXML_SAX1_ENABLED", "xmlStopParser": "LIBXML_PUSH_ENABLED", "xmlAttrSerializeTxtContent": "LIBXML_OUTPUT_ENABLED", "xmlSAXParseFile": "LIBXML_SAX1_ENABLED", "xmlSAXParseEntity": "LIBXML_SAX1_ENABLED", "xmlNewTextChild": "LIBXML_TREE_ENABLED", "xmlNewDocRawNode": "LIBXML_TREE_ENABLED", "xmlNewProp": "LIBXML_TREE_ENABLED", "xmlReconciliateNs": "LIBXML_TREE_ENABLED", "xmlValidateNCName": "LIBXML_TREE_ENABLED", "xmlValidateNMToken": "LIBXML_TREE_ENABLED", "xmlValidateName": "LIBXML_TREE_ENABLED", "xmlNewChild": "LIBXML_TREE_ENABLED", "xmlValidateQName": "LIBXML_TREE_ENABLED", "xmlSprintfElementContent": "LIBXML_OUTPUT_ENABLED", "xmlValidGetPotentialChildren" : "LIBXML_VALID_ENABLED", "xmlValidGetValidElements" : "LIBXML_VALID_ENABLED", "docbDefaultSAXHandlerInit" : "LIBXML_DOCB_ENABLED", "xmlTextReaderPreservePattern" : "LIBXML_PATTERN_ENABLED", } # # Some functions really need to be skipped for the tests. # skipped_functions = [ # block on I/O "xmlFdRead", "xmlReadFd", "xmlCtxtReadFd", "htmlFdRead", "htmlReadFd", "htmlCtxtReadFd", "xmlReaderNewFd", "xmlReaderForFd", "xmlIORead", "xmlReadIO", "xmlCtxtReadIO", "htmlIORead", "htmlReadIO", "htmlCtxtReadIO", "xmlReaderNewIO", "xmlBufferDump", "xmlNanoFTPConnect", "xmlNanoFTPConnectTo", "xmlNanoHTTPMethod", "xmlNanoHTTPMethodRedir", # Complex I/O APIs "xmlCreateIOParserCtxt", "xmlParserInputBufferCreateIO", "xmlRegisterInputCallbacks", "xmlReaderForIO", "xmlOutputBufferCreateIO", "xmlRegisterOutputCallbacks", "xmlSaveToIO", "xmlIOHTTPOpenW", # library state cleanup, generate false leak informations and other # troubles, heavillyb tested otherwise. "xmlCleanupParser", "xmlRelaxNGCleanupTypes", "xmlSetListDoc", "xmlSetTreeDoc", "xmlUnlinkNode", # hard to avoid leaks in the tests "xmlStrcat", "xmlStrncat", "xmlCatalogAddLocal", "xmlNewTextWriterDoc", "xmlXPathNewValueTree", "xmlXPathWrapString", # unimplemented "xmlTextReaderReadInnerXml", "xmlTextReaderReadOuterXml", "xmlTextReaderReadString", # destructor "xmlListDelete", "xmlOutputBufferClose", "xmlNanoFTPClose", "xmlNanoHTTPClose", # deprecated "xmlCatalogGetPublic", "xmlCatalogGetSystem", "xmlEncodeEntities", "xmlNewGlobalNs", "xmlHandleEntity", "xmlNamespaceParseNCName", "xmlNamespaceParseNSDef", "xmlNamespaceParseQName", "xmlParseNamespace", "xmlParseQuotedString", "xmlParserHandleReference", "xmlScanName", "xmlDecodeEntities", # allocators "xmlMemFree", # verbosity "xmlCatalogSetDebug", "xmlShellPrintXPathError", "xmlShellPrintNode", # Internal functions, no user space should really call them "xmlParseAttribute", "xmlParseAttributeListDecl", "xmlParseName", "xmlParseNmtoken", "xmlParseEntityValue", "xmlParseAttValue", "xmlParseSystemLiteral", "xmlParsePubidLiteral", "xmlParseCharData", "xmlParseExternalID", "xmlParseComment", "xmlParsePITarget", "xmlParsePI", "xmlParseNotationDecl", "xmlParseEntityDecl", "xmlParseDefaultDecl", "xmlParseNotationType", "xmlParseEnumerationType", "xmlParseEnumeratedType", "xmlParseAttributeType", "xmlParseAttributeListDecl", "xmlParseElementMixedContentDecl", "xmlParseElementChildrenContentDecl", "xmlParseElementContentDecl", "xmlParseElementDecl", "xmlParseMarkupDecl", "xmlParseCharRef", "xmlParseEntityRef", "xmlParseReference", "xmlParsePEReference", "xmlParseDocTypeDecl", "xmlParseAttribute", "xmlParseStartTag", "xmlParseEndTag", "xmlParseCDSect", "xmlParseContent", "xmlParseElement", "xmlParseVersionNum", "xmlParseVersionInfo", "xmlParseEncName", "xmlParseEncodingDecl", "xmlParseSDDecl", "xmlParseXMLDecl", "xmlParseTextDecl", "xmlParseMisc", "xmlParseExternalSubset", "xmlParserHandlePEReference", "xmlSkipBlankChars", ] # # These functions have side effects on the global state # and hence generate errors on memory allocation tests # skipped_memcheck = [ "xmlLoadCatalog", "xmlAddEncodingAlias", "xmlSchemaInitTypes", "xmlNanoFTPProxy", "xmlNanoFTPScanProxy", "xmlNanoHTTPScanProxy", "xmlResetLastError", "xmlCatalogConvert", "xmlCatalogRemove", "xmlLoadCatalogs", "xmlCleanupCharEncodingHandlers", "xmlInitCharEncodingHandlers", "xmlCatalogCleanup", "xmlSchemaGetBuiltInType", "htmlParseFile", "htmlCtxtReadFile", # loads the catalogs "xmlTextReaderSchemaValidate", "xmlSchemaCleanupTypes", # initialize the schemas type system "xmlCatalogResolve", "xmlIOParseDTD" # loads the catalogs ] # # Extra code needed for some test cases # extra_pre_call = { "xmlSAXUserParseFile": """ #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif """, "xmlSAXUserParseMemory": """ #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif """, "xmlParseBalancedChunkMemory": """ #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif """, "xmlParseBalancedChunkMemoryRecover": """ #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif """, "xmlParserInputBufferCreateFd": "if (fd >= 0) fd = -1;", } extra_post_call = { "xmlAddChild": "if (ret_val == NULL) { xmlFreeNode(cur) ; cur = NULL ; }", "xmlAddEntity": "if (ret_val != NULL) { xmlFreeNode(ret_val) ; ret_val = NULL; }", "xmlAddChildList": "if (ret_val == NULL) { xmlFreeNodeList(cur) ; cur = NULL ; }", "xmlAddSibling": "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }", "xmlAddNextSibling": "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }", "xmlAddPrevSibling": "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }", "xmlDocSetRootElement": "if (doc == NULL) { xmlFreeNode(root) ; root = NULL ; }", "xmlReplaceNode": """if (cur != NULL) { xmlUnlinkNode(cur); xmlFreeNode(cur) ; cur = NULL ; } if (old != NULL) { xmlUnlinkNode(old); xmlFreeNode(old) ; old = NULL ; } ret_val = NULL;""", "xmlTextMerge": """if ((first != NULL) && (first->type != XML_TEXT_NODE)) { xmlUnlinkNode(second); xmlFreeNode(second) ; second = NULL ; }""", "xmlBuildQName": """if ((ret_val != NULL) && (ret_val != ncname) && (ret_val != prefix) && (ret_val != memory)) xmlFree(ret_val); ret_val = NULL;""", "xmlNewDocElementContent": """xmlFreeDocElementContent(doc, ret_val); ret_val = NULL;""", "xmlDictReference": "xmlDictFree(dict);", # Functions which deallocates one of their parameters "xmlXPathConvertBoolean": """val = NULL;""", "xmlXPathConvertNumber": """val = NULL;""", "xmlXPathConvertString": """val = NULL;""", "xmlSaveFileTo": """buf = NULL;""", "xmlSaveFormatFileTo": """buf = NULL;""", "xmlIOParseDTD": "input = NULL;", "xmlRemoveProp": "cur = NULL;", "xmlNewNs": "if ((node == NULL) && (ret_val != NULL)) xmlFreeNs(ret_val);", "xmlCopyNamespace": "if (ret_val != NULL) xmlFreeNs(ret_val);", "xmlCopyNamespaceList": "if (ret_val != NULL) xmlFreeNsList(ret_val);", "xmlNewTextWriter": "if (ret_val != NULL) out = NULL;", "xmlNewTextWriterPushParser": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} if (ret_val != NULL) ctxt = NULL;", "xmlNewIOInputStream": "if (ret_val != NULL) input = NULL;", "htmlParseChunk": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}", "htmlParseDocument": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}", "xmlParseDocument": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}", "xmlParseChunk": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}", "xmlParseExtParsedEnt": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}", "xmlDOMWrapAdoptNode": "if ((node != NULL) && (node->parent == NULL)) {xmlUnlinkNode(node);xmlFreeNode(node);node = NULL;}", "xmlBufferSetAllocationScheme": "if ((buf != NULL) && (scheme == XML_BUFFER_ALLOC_IMMUTABLE) && (buf->content != NULL) && (buf->content != static_buf_content)) { xmlFree(buf->content); buf->content = NULL;}" } modules = [] def is_skipped_module(name): for mod in skipped_modules: if mod == name: return 1 return 0 def is_skipped_function(name): for fun in skipped_functions: if fun == name: return 1 # Do not test destructors if string.find(name, 'Free') != -1: return 1 return 0 def is_skipped_memcheck(name): for fun in skipped_memcheck: if fun == name: return 1 return 0 missing_types = {} def add_missing_type(name, func): try: list = missing_types[name] list.append(func) except: missing_types[name] = [func] generated_param_types = [] def add_generated_param_type(name): generated_param_types.append(name) generated_return_types = [] def add_generated_return_type(name): generated_return_types.append(name) missing_functions = {} missing_functions_nr = 0 def add_missing_functions(name, module): global missing_functions_nr missing_functions_nr = missing_functions_nr + 1 try: list = missing_functions[module] list.append(name) except: missing_functions[module] = [name] # # Provide the type generators and destructors for the parameters # def type_convert(str, name, info, module, function, pos): # res = string.replace(str, " ", " ") # res = string.replace(str, " ", " ") # res = string.replace(str, " ", " ") res = string.replace(str, " *", "_ptr") # res = string.replace(str, "*", "_ptr") res = string.replace(res, " ", "_") if res == 'const_char_ptr': if string.find(name, "file") != -1 or \ string.find(name, "uri") != -1 or \ string.find(name, "URI") != -1 or \ string.find(info, "filename") != -1 or \ string.find(info, "URI") != -1 or \ string.find(info, "URL") != -1: if string.find(function, "Save") != -1 or \ string.find(function, "Create") != -1 or \ string.find(function, "Write") != -1 or \ string.find(function, "Fetch") != -1: return('fileoutput') return('filepath') if res == 'void_ptr': if module == 'nanoftp' and name == 'ctx': return('xmlNanoFTPCtxtPtr') if function == 'xmlNanoFTPNewCtxt' or \ function == 'xmlNanoFTPConnectTo' or \ function == 'xmlNanoFTPOpen': return('xmlNanoFTPCtxtPtr') if module == 'nanohttp' and name == 'ctx': return('xmlNanoHTTPCtxtPtr') if function == 'xmlNanoHTTPMethod' or \ function == 'xmlNanoHTTPMethodRedir' or \ function == 'xmlNanoHTTPOpen' or \ function == 'xmlNanoHTTPOpenRedir': return('xmlNanoHTTPCtxtPtr'); if function == 'xmlIOHTTPOpen': return('xmlNanoHTTPCtxtPtr') if string.find(name, "data") != -1: return('userdata') if string.find(name, "user") != -1: return('userdata') if res == 'xmlDoc_ptr': res = 'xmlDocPtr' if res == 'xmlNode_ptr': res = 'xmlNodePtr' if res == 'xmlDict_ptr': res = 'xmlDictPtr' if res == 'xmlNodePtr' and pos != 0: if (function == 'xmlAddChild' and pos == 2) or \ (function == 'xmlAddChildList' and pos == 2) or \ (function == 'xmlAddNextSibling' and pos == 2) or \ (function == 'xmlAddSibling' and pos == 2) or \ (function == 'xmlDocSetRootElement' and pos == 2) or \ (function == 'xmlReplaceNode' and pos == 2) or \ (function == 'xmlTextMerge') or \ (function == 'xmlAddPrevSibling' and pos == 2): return('xmlNodePtr_in'); if res == 'const xmlBufferPtr': res = 'xmlBufferPtr' if res == 'xmlChar_ptr' and name == 'name' and \ string.find(function, "EatName") != -1: return('eaten_name') if res == 'void_ptr*': res = 'void_ptr_ptr' if res == 'char_ptr*': res = 'char_ptr_ptr' if res == 'xmlChar_ptr*': res = 'xmlChar_ptr_ptr' if res == 'const_xmlChar_ptr*': res = 'const_xmlChar_ptr_ptr' if res == 'const_char_ptr*': res = 'const_char_ptr_ptr' if res == 'FILE_ptr' and module == 'debugXML': res = 'debug_FILE_ptr'; if res == 'int' and name == 'options': if module == 'parser' or module == 'xmlreader': res = 'parseroptions' return res known_param_types = [] def is_known_param_type(name, rtype): global test for type in known_param_types: if type == name: return 1 for type in generated_param_types: if type == name: return 1 if name[-3:] == 'Ptr' or name[-4:] == '_ptr': if rtype[0:6] == 'const ': crtype = rtype[6:] else: crtype = rtype define = 0 if modules_defines.has_key(module): test.write("#ifdef %s\n" % (modules_defines[module])) define = 1 test.write(""" #define gen_nb_%s 1 static %s gen_%s(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_%s(int no ATTRIBUTE_UNUSED, %s val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } """ % (name, crtype, name, name, rtype)) if define == 1: test.write("#endif\n\n") add_generated_param_type(name) return 1 return 0 # # Provide the type destructors for the return values # known_return_types = [] def is_known_return_type(name): for type in known_return_types: if type == name: return 1 return 0 # # Copy the beginning of the C test program result # try: input = open("testapi.c", "r") except: input = open(srcPref + "testapi.c", "r") test = open('testapi.c.new', 'w') def compare_and_save(): global test test.close() try: input = open("testapi.c", "r").read() except: input = '' test = open('testapi.c.new', "r").read() if input != test: try: os.system("rm testapi.c; mv testapi.c.new testapi.c") except: os.system("mv testapi.c.new testapi.c") print("Updated testapi.c") else: print("Generated testapi.c is identical") line = input.readline() while line != "": if line == "/* CUT HERE: everything below that line is generated */\n": break; if line[0:15] == "#define gen_nb_": type = string.split(line[15:])[0] known_param_types.append(type) if line[0:19] == "static void desret_": type = string.split(line[19:], '(')[0] known_return_types.append(type) test.write(line) line = input.readline() input.close() if line == "": print "Could not find the CUT marker in testapi.c skipping generation" test.close() sys.exit(0) print("Scanned testapi.c: found %d parameters types and %d return types\n" % ( len(known_param_types), len(known_return_types))) test.write("/* CUT HERE: everything below that line is generated */\n") # # Open the input API description # doc = libxml2.readFile(srcPref + 'doc/libxml2-api.xml', None, 0) if doc == None: print "Failed to load doc/libxml2-api.xml" sys.exit(1) ctxt = doc.xpathNewContext() # # Generate a list of all function parameters and select only # those used in the api tests # argtypes = {} args = ctxt.xpathEval("/api/symbols/function/arg") for arg in args: mod = arg.xpathEval('string(../@file)') func = arg.xpathEval('string(../@name)') if (mod not in skipped_modules) and (func not in skipped_functions): type = arg.xpathEval('string(@type)') if not argtypes.has_key(type): argtypes[type] = func # similarly for return types rettypes = {} rets = ctxt.xpathEval("/api/symbols/function/return") for ret in rets: mod = ret.xpathEval('string(../@file)') func = ret.xpathEval('string(../@name)') if (mod not in skipped_modules) and (func not in skipped_functions): type = ret.xpathEval('string(@type)') if not rettypes.has_key(type): rettypes[type] = func # # Generate constructors and return type handling for all enums # which are used as function parameters # enums = ctxt.xpathEval("/api/symbols/typedef[@type='enum']") for enum in enums: module = enum.xpathEval('string(@file)') name = enum.xpathEval('string(@name)') # # Skip any enums which are not in our filtered lists # if (name == None) or ((name not in argtypes) and (name not in rettypes)): continue; define = 0 if argtypes.has_key(name) and is_known_param_type(name, name) == 0: values = ctxt.xpathEval("/api/symbols/enum[@type='%s']" % name) i = 0 vals = [] for value in values: vname = value.xpathEval('string(@name)') if vname == None: continue; i = i + 1 if i >= 5: break; vals.append(vname) if vals == []: print "Didn't find any value for enum %s" % (name) continue if modules_defines.has_key(module): test.write("#ifdef %s\n" % (modules_defines[module])) define = 1 test.write("#define gen_nb_%s %d\n" % (name, len(vals))) test.write("""static %s gen_%s(int no, int nr ATTRIBUTE_UNUSED) {\n""" % (name, name)) i = 1 for value in vals: test.write(" if (no == %d) return(%s);\n" % (i, value)) i = i + 1 test.write(""" return(0); } static void des_%s(int no ATTRIBUTE_UNUSED, %s val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } """ % (name, name)); known_param_types.append(name) if (is_known_return_type(name) == 0) and (name in rettypes): if define == 0 and modules_defines.has_key(module): test.write("#ifdef %s\n" % (modules_defines[module])) define = 1 test.write("""static void desret_%s(%s val ATTRIBUTE_UNUSED) { } """ % (name, name)) known_return_types.append(name) if define == 1: test.write("#endif\n\n") # # Load the interfaces # headers = ctxt.xpathEval("/api/files/file") for file in headers: name = file.xpathEval('string(@name)') if (name == None) or (name == ''): continue # # Some module may be skipped because they don't really consists # of user callable APIs # if is_skipped_module(name): continue # # do not test deprecated APIs # desc = file.xpathEval('string(description)') if string.find(desc, 'DEPRECATED') != -1: print "Skipping deprecated interface %s" % name continue; test.write("#include \n" % name) modules.append(name) # # Generate the callers signatures # for module in modules: test.write("static int test_%s(void);\n" % module); # # Generate the top caller # test.write(""" /** * testlibxml2: * * Main entry point of the tester for the full libxml2 module, * it calls all the tester entry point for each module. * * Returns the number of error found */ static int testlibxml2(void) { int test_ret = 0; """) for module in modules: test.write(" test_ret += test_%s();\n" % module) test.write(""" printf("Total: %d functions, %d tests, %d errors\\n", function_tests, call_tests, test_ret); return(test_ret); } """) # # How to handle a function # nb_tests = 0 def generate_test(module, node): global test global nb_tests nb_cond = 0 no_gen = 0 name = node.xpathEval('string(@name)') if is_skipped_function(name): return # # check we know how to handle the args and return values # and store the informations for the generation # try: args = node.xpathEval("arg") except: args = [] t_args = [] n = 0 for arg in args: n = n + 1 rtype = arg.xpathEval("string(@type)") if rtype == 'void': break; info = arg.xpathEval("string(@info)") nam = arg.xpathEval("string(@name)") type = type_convert(rtype, nam, info, module, name, n) if is_known_param_type(type, rtype) == 0: add_missing_type(type, name); no_gen = 1 if (type[-3:] == 'Ptr' or type[-4:] == '_ptr') and \ rtype[0:6] == 'const ': crtype = rtype[6:] else: crtype = rtype t_args.append((nam, type, rtype, crtype, info)) try: rets = node.xpathEval("return") except: rets = [] t_ret = None for ret in rets: rtype = ret.xpathEval("string(@type)") info = ret.xpathEval("string(@info)") type = type_convert(rtype, 'return', info, module, name, 0) if rtype == 'void': break if is_known_return_type(type) == 0: add_missing_type(type, name); no_gen = 1 t_ret = (type, rtype, info) break test.write(""" static int test_%s(void) { int test_ret = 0; """ % (name)) if no_gen == 1: add_missing_functions(name, module) test.write(""" /* missing type support */ return(test_ret); } """) return try: conds = node.xpathEval("cond") for cond in conds: test.write("#if %s\n" % (cond.get_content())) nb_cond = nb_cond + 1 except: pass define = 0 if function_defines.has_key(name): test.write("#ifdef %s\n" % (function_defines[name])) define = 1 # Declare the memory usage counter no_mem = is_skipped_memcheck(name) if no_mem == 0: test.write(" int mem_base;\n"); # Declare the return value if t_ret != None: test.write(" %s ret_val;\n" % (t_ret[1])) # Declare the arguments for arg in t_args: (nam, type, rtype, crtype, info) = arg; # add declaration test.write(" %s %s; /* %s */\n" % (crtype, nam, info)) test.write(" int n_%s;\n" % (nam)) test.write("\n") # Cascade loop on of each argument list of values for arg in t_args: (nam, type, rtype, crtype, info) = arg; # test.write(" for (n_%s = 0;n_%s < gen_nb_%s;n_%s++) {\n" % ( nam, nam, type, nam)) # log the memory usage if no_mem == 0: test.write(" mem_base = xmlMemBlocks();\n"); # prepare the call i = 0; for arg in t_args: (nam, type, rtype, crtype, info) = arg; # test.write(" %s = gen_%s(n_%s, %d);\n" % (nam, type, nam, i)) i = i + 1; # do the call, and clanup the result if extra_pre_call.has_key(name): test.write(" %s\n"% (extra_pre_call[name])) if t_ret != None: test.write("\n ret_val = %s(" % (name)) need = 0 for arg in t_args: (nam, type, rtype, crtype, info) = arg if need: test.write(", ") else: need = 1 if rtype != crtype: test.write("(%s)" % rtype) test.write("%s" % nam); test.write(");\n") if extra_post_call.has_key(name): test.write(" %s\n"% (extra_post_call[name])) test.write(" desret_%s(ret_val);\n" % t_ret[0]) else: test.write("\n %s(" % (name)); need = 0; for arg in t_args: (nam, type, rtype, crtype, info) = arg; if need: test.write(", ") else: need = 1 if rtype != crtype: test.write("(%s)" % rtype) test.write("%s" % nam) test.write(");\n") if extra_post_call.has_key(name): test.write(" %s\n"% (extra_post_call[name])) test.write(" call_tests++;\n"); # Free the arguments i = 0; for arg in t_args: (nam, type, rtype, crtype, info) = arg; # This is a hack to prevent generating a destructor for the # 'input' argument in xmlTextReaderSetup. There should be # a better, more generic way to do this! if string.find(info, 'destroy') == -1: test.write(" des_%s(n_%s, " % (type, nam)) if rtype != crtype: test.write("(%s)" % rtype) test.write("%s, %d);\n" % (nam, i)) i = i + 1; test.write(" xmlResetLastError();\n"); # Check the memory usage if no_mem == 0: test.write(""" if (mem_base != xmlMemBlocks()) { printf("Leak of %%d blocks found in %s", xmlMemBlocks() - mem_base); test_ret++; """ % (name)); for arg in t_args: (nam, type, rtype, crtype, info) = arg; test.write(""" printf(" %%d", n_%s);\n""" % (nam)) test.write(""" printf("\\n");\n""") test.write(" }\n") for arg in t_args: test.write(" }\n") test.write(" function_tests++;\n") # # end of conditional # while nb_cond > 0: test.write("#endif\n") nb_cond = nb_cond -1 if define == 1: test.write("#endif\n") nb_tests = nb_tests + 1; test.write(""" return(test_ret); } """) # # Generate all module callers # for module in modules: # gather all the functions exported by that module try: functions = ctxt.xpathEval("/api/symbols/function[@file='%s']" % (module)) except: print "Failed to gather functions from module %s" % (module) continue; # iterate over all functions in the module generating the test i = 0 nb_tests_old = nb_tests for function in functions: i = i + 1 generate_test(module, function); # header test.write("""static int test_%s(void) { int test_ret = 0; if (quiet == 0) printf("Testing %s : %d of %d functions ...\\n"); """ % (module, module, nb_tests - nb_tests_old, i)) # iterate over all functions in the module generating the call for function in functions: name = function.xpathEval('string(@name)') if is_skipped_function(name): continue test.write(" test_ret += test_%s();\n" % (name)) # footer test.write(""" if (test_ret != 0) printf("Module %s: %%d errors\\n", test_ret); return(test_ret); } """ % (module)) # # Generate direct module caller # test.write("""static int test_module(const char *module) { """); for module in modules: test.write(""" if (!strcmp(module, "%s")) return(test_%s());\n""" % ( module, module)) test.write(""" return(0); } """); print "Generated test for %d modules and %d functions" %(len(modules), nb_tests) compare_and_save() missing_list = [] for missing in missing_types.keys(): if missing == 'va_list' or missing == '...': continue; n = len(missing_types[missing]) missing_list.append((n, missing)) def compare_missing(a, b): return b[0] - a[0] missing_list.sort(compare_missing) print "Missing support for %d functions and %d types see missing.lst" % (missing_functions_nr, len(missing_list)) lst = open("missing.lst", "w") lst.write("Missing support for %d types" % (len(missing_list))) lst.write("\n") for miss in missing_list: lst.write("%s: %d :" % (miss[1], miss[0])) i = 0 for n in missing_types[miss[1]]: i = i + 1 if i > 5: lst.write(" ...") break lst.write(" %s" % (n)) lst.write("\n") lst.write("\n") lst.write("\n") lst.write("Missing support per module"); for module in missing_functions.keys(): lst.write("module %s:\n %s\n" % (module, missing_functions[module])) lst.close() libxml2-2.9.1+dfsg1/dbgenattr.pl0000755000175000017500000000241011234335462015066 0ustar aronaron#!/usr/bin/perl $size = shift; if ($size eq "") { die "usage: dbgen.pl [size]\n"; } @firstnames = ("Al", "Bob", "Charles", "David", "Egon", "Farbood", "George", "Hank", "Inki", "James"); @lastnames = ("Aranow", "Barker", "Corsetti", "Dershowitz", "Engleman", "Franklin", "Grice", "Haverford", "Ilvedson", "Jones"); @states = ("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"); print "\n"; print "\n"; print "\n"; for ($i=0; $i<$size; $i++) { $first = $firstnames [$i % 10]; $last = $lastnames [($i / 10) % 10]; $state = $states [($i / 100) % 50]; $zip = 22000 + $i / 5000; printf " \n", $zip; } print "
    \n"; libxml2-2.9.1+dfsg1/SAX.c0000644000175000017500000001263312113312340013346 0ustar aronaron/* * SAX.c : Old SAX v1 handlers to build a tree. * Deprecated except for compatibility * * See Copyright for the status of this software. * * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LIBXML_LEGACY_ENABLED #ifdef LIBXML_SAX1_ENABLED /** * initxmlDefaultSAXHandler: * @hdlr: the SAX handler * @warning: flag if non-zero sets the handler warning procedure * * Initialize the default XML SAX version 1 handler * DEPRECATED: use xmlSAX2InitDefaultSAXHandler() for the new SAX2 blocks */ void initxmlDefaultSAXHandler(xmlSAXHandlerV1 *hdlr, int warning) { if(hdlr->initialized == 1) return; hdlr->internalSubset = xmlSAX2InternalSubset; hdlr->externalSubset = xmlSAX2ExternalSubset; hdlr->isStandalone = xmlSAX2IsStandalone; hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; hdlr->resolveEntity = xmlSAX2ResolveEntity; hdlr->getEntity = xmlSAX2GetEntity; hdlr->getParameterEntity = xmlSAX2GetParameterEntity; hdlr->entityDecl = xmlSAX2EntityDecl; hdlr->attributeDecl = xmlSAX2AttributeDecl; hdlr->elementDecl = xmlSAX2ElementDecl; hdlr->notationDecl = xmlSAX2NotationDecl; hdlr->unparsedEntityDecl = xmlSAX2UnparsedEntityDecl; hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; hdlr->startDocument = xmlSAX2StartDocument; hdlr->endDocument = xmlSAX2EndDocument; hdlr->startElement = xmlSAX2StartElement; hdlr->endElement = xmlSAX2EndElement; hdlr->reference = xmlSAX2Reference; hdlr->characters = xmlSAX2Characters; hdlr->cdataBlock = xmlSAX2CDataBlock; hdlr->ignorableWhitespace = xmlSAX2Characters; hdlr->processingInstruction = xmlSAX2ProcessingInstruction; if (warning == 0) hdlr->warning = NULL; else hdlr->warning = xmlParserWarning; hdlr->error = xmlParserError; hdlr->fatalError = xmlParserError; hdlr->initialized = 1; } #ifdef LIBXML_HTML_ENABLED /** * inithtmlDefaultSAXHandler: * @hdlr: the SAX handler * * Initialize the default HTML SAX version 1 handler * DEPRECATED: use xmlSAX2InitHtmlDefaultSAXHandler() for the new SAX2 blocks */ void inithtmlDefaultSAXHandler(xmlSAXHandlerV1 *hdlr) { if(hdlr->initialized == 1) return; hdlr->internalSubset = xmlSAX2InternalSubset; hdlr->externalSubset = NULL; hdlr->isStandalone = NULL; hdlr->hasInternalSubset = NULL; hdlr->hasExternalSubset = NULL; hdlr->resolveEntity = NULL; hdlr->getEntity = xmlSAX2GetEntity; hdlr->getParameterEntity = NULL; hdlr->entityDecl = NULL; hdlr->attributeDecl = NULL; hdlr->elementDecl = NULL; hdlr->notationDecl = NULL; hdlr->unparsedEntityDecl = NULL; hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; hdlr->startDocument = xmlSAX2StartDocument; hdlr->endDocument = xmlSAX2EndDocument; hdlr->startElement = xmlSAX2StartElement; hdlr->endElement = xmlSAX2EndElement; hdlr->reference = NULL; hdlr->characters = xmlSAX2Characters; hdlr->cdataBlock = xmlSAX2CDataBlock; hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; hdlr->processingInstruction = xmlSAX2ProcessingInstruction; hdlr->comment = xmlSAX2Comment; hdlr->warning = xmlParserWarning; hdlr->error = xmlParserError; hdlr->fatalError = xmlParserError; hdlr->initialized = 1; } #endif /* LIBXML_HTML_ENABLED */ #ifdef LIBXML_DOCB_ENABLED /** * initdocbDefaultSAXHandler: * @hdlr: the SAX handler * * Initialize the default DocBook SAX version 1 handler * DEPRECATED: use xmlSAX2InitDocbDefaultSAXHandler() for the new SAX2 blocks */ void initdocbDefaultSAXHandler(xmlSAXHandlerV1 *hdlr) { if(hdlr->initialized == 1) return; hdlr->internalSubset = xmlSAX2InternalSubset; hdlr->externalSubset = NULL; hdlr->isStandalone = xmlSAX2IsStandalone; hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; hdlr->resolveEntity = xmlSAX2ResolveEntity; hdlr->getEntity = xmlSAX2GetEntity; hdlr->getParameterEntity = NULL; hdlr->entityDecl = xmlSAX2EntityDecl; hdlr->attributeDecl = NULL; hdlr->elementDecl = NULL; hdlr->notationDecl = NULL; hdlr->unparsedEntityDecl = NULL; hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; hdlr->startDocument = xmlSAX2StartDocument; hdlr->endDocument = xmlSAX2EndDocument; hdlr->startElement = xmlSAX2StartElement; hdlr->endElement = xmlSAX2EndElement; hdlr->reference = xmlSAX2Reference; hdlr->characters = xmlSAX2Characters; hdlr->cdataBlock = NULL; hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; hdlr->processingInstruction = NULL; hdlr->comment = xmlSAX2Comment; hdlr->warning = xmlParserWarning; hdlr->error = xmlParserError; hdlr->fatalError = xmlParserError; hdlr->initialized = 1; } #endif /* LIBXML_DOCB_ENABLED */ #endif /* LIBXML_SAX1_ENABLED */ #define bottom_SAX #include "elfgcchack.h" #endif /* LIBXML_LEGACY_ENABLED */ libxml2-2.9.1+dfsg1/trionan.c0000644000175000017500000005505112113312343014371 0ustar aronaron/************************************************************************* * * $Id$ * * Copyright (C) 2001 Bjorn Reese * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. * ************************************************************************ * * Functions to handle special quantities in floating-point numbers * (that is, NaNs and infinity). They provide the capability to detect * and fabricate special quantities. * * Although written to be as portable as possible, it can never be * guaranteed to work on all platforms, as not all hardware supports * special quantities. * * The approach used here (approximately) is to: * * 1. Use C99 functionality when available. * 2. Use IEEE 754 bit-patterns if possible. * 3. Use platform-specific techniques. * ************************************************************************/ /* * TODO: * o Put all the magic into trio_fpclassify_and_signbit(), and use this from * trio_isnan() etc. */ /************************************************************************* * Include files */ #include "triodef.h" #include "trionan.h" #include #include #include #include #if defined(TRIO_PLATFORM_UNIX) # include #endif #if defined(TRIO_COMPILER_DECC) # if defined(__linux__) # include # else # include # endif #endif #include #if defined(TRIO_DOCUMENTATION) # include "doc/doc_nan.h" #endif /** @addtogroup SpecialQuantities @{ */ /************************************************************************* * Definitions */ #define TRIO_TRUE (1 == 1) #define TRIO_FALSE (0 == 1) /* * We must enable IEEE floating-point on Alpha */ #if defined(__alpha) && !defined(_IEEE_FP) # if defined(TRIO_COMPILER_DECC) # if defined(TRIO_PLATFORM_VMS) # error "Must be compiled with option /IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE" # else # if !defined(_CFE) # error "Must be compiled with option -ieee" # endif # endif # elif defined(TRIO_COMPILER_GCC) && (defined(__osf__) || defined(__linux__)) # error "Must be compiled with option -mieee" # endif #endif /* __alpha && ! _IEEE_FP */ /* * In ANSI/IEEE 754-1985 64-bits double format numbers have the * following properties (amoungst others) * * o FLT_RADIX == 2: binary encoding * o DBL_MAX_EXP == 1024: 11 bits exponent, where one bit is used * to indicate special numbers (e.g. NaN and Infinity), so the * maximum exponent is 10 bits wide (2^10 == 1024). * o DBL_MANT_DIG == 53: The mantissa is 52 bits wide, but because * numbers are normalized the initial binary 1 is represented * implicitly (the so-called "hidden bit"), which leaves us with * the ability to represent 53 bits wide mantissa. */ #if (FLT_RADIX == 2) && (DBL_MAX_EXP == 1024) && (DBL_MANT_DIG == 53) # define USE_IEEE_754 #endif /************************************************************************* * Constants */ static TRIO_CONST char rcsid[] = "@(#)$Id$"; #if defined(USE_IEEE_754) /* * Endian-agnostic indexing macro. * * The value of internalEndianMagic, when converted into a 64-bit * integer, becomes 0x0706050403020100 (we could have used a 64-bit * integer value instead of a double, but not all platforms supports * that type). The value is automatically encoded with the correct * endianess by the compiler, which means that we can support any * kind of endianess. The individual bytes are then used as an index * for the IEEE 754 bit-patterns and masks. */ #define TRIO_DOUBLE_INDEX(x) (((unsigned char *)&internalEndianMagic)[7-(x)]) #if (defined(__BORLANDC__) && __BORLANDC__ >= 0x0590) static TRIO_CONST double internalEndianMagic = 7.949928895127362e-275; #else static TRIO_CONST double internalEndianMagic = 7.949928895127363e-275; #endif /* Mask for the exponent */ static TRIO_CONST unsigned char ieee_754_exponent_mask[] = { 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* Mask for the mantissa */ static TRIO_CONST unsigned char ieee_754_mantissa_mask[] = { 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /* Mask for the sign bit */ static TRIO_CONST unsigned char ieee_754_sign_mask[] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* Bit-pattern for negative zero */ static TRIO_CONST unsigned char ieee_754_negzero_array[] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* Bit-pattern for infinity */ static TRIO_CONST unsigned char ieee_754_infinity_array[] = { 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* Bit-pattern for quiet NaN */ static TRIO_CONST unsigned char ieee_754_qnan_array[] = { 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /************************************************************************* * Functions */ /* * trio_make_double */ TRIO_PRIVATE double trio_make_double TRIO_ARGS1((values), TRIO_CONST unsigned char *values) { TRIO_VOLATILE double result; int i; for (i = 0; i < (int)sizeof(double); i++) { ((TRIO_VOLATILE unsigned char *)&result)[TRIO_DOUBLE_INDEX(i)] = values[i]; } return result; } /* * trio_is_special_quantity */ TRIO_PRIVATE int trio_is_special_quantity TRIO_ARGS2((number, has_mantissa), double number, int *has_mantissa) { unsigned int i; unsigned char current; int is_special_quantity = TRIO_TRUE; *has_mantissa = 0; for (i = 0; i < (unsigned int)sizeof(double); i++) { current = ((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)]; is_special_quantity &= ((current & ieee_754_exponent_mask[i]) == ieee_754_exponent_mask[i]); *has_mantissa |= (current & ieee_754_mantissa_mask[i]); } return is_special_quantity; } /* * trio_is_negative */ TRIO_PRIVATE int trio_is_negative TRIO_ARGS1((number), double number) { unsigned int i; int is_negative = TRIO_FALSE; for (i = 0; i < (unsigned int)sizeof(double); i++) { is_negative |= (((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)] & ieee_754_sign_mask[i]); } return is_negative; } #endif /* USE_IEEE_754 */ /** Generate negative zero. @return Floating-point representation of negative zero. */ TRIO_PUBLIC double trio_nzero(TRIO_NOARGS) { #if defined(USE_IEEE_754) return trio_make_double(ieee_754_negzero_array); #else TRIO_VOLATILE double zero = 0.0; return -zero; #endif } /** Generate positive infinity. @return Floating-point representation of positive infinity. */ TRIO_PUBLIC double trio_pinf(TRIO_NOARGS) { /* Cache the result */ static double result = 0.0; if (result == 0.0) { #if defined(INFINITY) && defined(__STDC_IEC_559__) result = (double)INFINITY; #elif defined(USE_IEEE_754) result = trio_make_double(ieee_754_infinity_array); #else /* * If HUGE_VAL is different from DBL_MAX, then HUGE_VAL is used * as infinity. Otherwise we have to resort to an overflow * operation to generate infinity. */ # if defined(TRIO_PLATFORM_UNIX) void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); # endif result = HUGE_VAL; if (HUGE_VAL == DBL_MAX) { /* Force overflow */ result += HUGE_VAL; } # if defined(TRIO_PLATFORM_UNIX) signal(SIGFPE, signal_handler); # endif #endif } return result; } /** Generate negative infinity. @return Floating-point value of negative infinity. */ TRIO_PUBLIC double trio_ninf(TRIO_NOARGS) { static double result = 0.0; if (result == 0.0) { /* * Negative infinity is calculated by negating positive infinity, * which can be done because it is legal to do calculations on * infinity (for example, 1 / infinity == 0). */ result = -trio_pinf(); } return result; } /** Generate NaN. @return Floating-point representation of NaN. */ TRIO_PUBLIC double trio_nan(TRIO_NOARGS) { /* Cache the result */ static double result = 0.0; if (result == 0.0) { #if defined(TRIO_COMPILER_SUPPORTS_C99) result = nan(""); #elif defined(NAN) && defined(__STDC_IEC_559__) result = (double)NAN; #elif defined(USE_IEEE_754) result = trio_make_double(ieee_754_qnan_array); #else /* * There are several ways to generate NaN. The one used here is * to divide infinity by infinity. I would have preferred to add * negative infinity to positive infinity, but that yields wrong * result (infinity) on FreeBSD. * * This may fail if the hardware does not support NaN, or if * the Invalid Operation floating-point exception is unmasked. */ # if defined(TRIO_PLATFORM_UNIX) void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); # endif result = trio_pinf() / trio_pinf(); # if defined(TRIO_PLATFORM_UNIX) signal(SIGFPE, signal_handler); # endif #endif } return result; } /** Check for NaN. @param number An arbitrary floating-point number. @return Boolean value indicating whether or not the number is a NaN. */ TRIO_PUBLIC int trio_isnan TRIO_ARGS1((number), double number) { #if (defined(TRIO_COMPILER_SUPPORTS_C99) && defined(isnan)) \ || defined(TRIO_COMPILER_SUPPORTS_UNIX95) /* * C99 defines isnan() as a macro. UNIX95 defines isnan() as a * function. This function was already present in XPG4, but this * is a bit tricky to detect with compiler defines, so we choose * the conservative approach and only use it for UNIX95. */ return isnan(number); #elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) /* * Microsoft Visual C++ and Borland C++ Builder have an _isnan() * function. */ return _isnan(number) ? TRIO_TRUE : TRIO_FALSE; #elif defined(USE_IEEE_754) /* * Examine IEEE 754 bit-pattern. A NaN must have a special exponent * pattern, and a non-empty mantissa. */ int has_mantissa; int is_special_quantity; is_special_quantity = trio_is_special_quantity(number, &has_mantissa); return (is_special_quantity && has_mantissa); #else /* * Fallback solution */ int status; double integral, fraction; # if defined(TRIO_PLATFORM_UNIX) void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); # endif status = (/* * NaN is the only number which does not compare to itself */ ((TRIO_VOLATILE double)number != (TRIO_VOLATILE double)number) || /* * Fallback solution if NaN compares to NaN */ ((number != 0.0) && (fraction = modf(number, &integral), integral == fraction))); # if defined(TRIO_PLATFORM_UNIX) signal(SIGFPE, signal_handler); # endif return status; #endif } /** Check for infinity. @param number An arbitrary floating-point number. @return 1 if positive infinity, -1 if negative infinity, 0 otherwise. */ TRIO_PUBLIC int trio_isinf TRIO_ARGS1((number), double number) { #if defined(TRIO_COMPILER_DECC) && !defined(__linux__) /* * DECC has an isinf() macro, but it works differently than that * of C99, so we use the fp_class() function instead. */ return ((fp_class(number) == FP_POS_INF) ? 1 : ((fp_class(number) == FP_NEG_INF) ? -1 : 0)); #elif defined(isinf) /* * C99 defines isinf() as a macro. */ return isinf(number) ? ((number > 0.0) ? 1 : -1) : 0; #elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) /* * Microsoft Visual C++ and Borland C++ Builder have an _fpclass() * function that can be used to detect infinity. */ return ((_fpclass(number) == _FPCLASS_PINF) ? 1 : ((_fpclass(number) == _FPCLASS_NINF) ? -1 : 0)); #elif defined(USE_IEEE_754) /* * Examine IEEE 754 bit-pattern. Infinity must have a special exponent * pattern, and an empty mantissa. */ int has_mantissa; int is_special_quantity; is_special_quantity = trio_is_special_quantity(number, &has_mantissa); return (is_special_quantity && !has_mantissa) ? ((number < 0.0) ? -1 : 1) : 0; #else /* * Fallback solution. */ int status; # if defined(TRIO_PLATFORM_UNIX) void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); # endif double infinity = trio_pinf(); status = ((number == infinity) ? 1 : ((number == -infinity) ? -1 : 0)); # if defined(TRIO_PLATFORM_UNIX) signal(SIGFPE, signal_handler); # endif return status; #endif } #if 0 /* Temporary fix - this routine is not used anywhere */ /** Check for finity. @param number An arbitrary floating-point number. @return Boolean value indicating whether or not the number is a finite. */ TRIO_PUBLIC int trio_isfinite TRIO_ARGS1((number), double number) { #if defined(TRIO_COMPILER_SUPPORTS_C99) && defined(isfinite) /* * C99 defines isfinite() as a macro. */ return isfinite(number); #elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) /* * Microsoft Visual C++ and Borland C++ Builder use _finite(). */ return _finite(number); #elif defined(USE_IEEE_754) /* * Examine IEEE 754 bit-pattern. For finity we do not care about the * mantissa. */ int dummy; return (! trio_is_special_quantity(number, &dummy)); #else /* * Fallback solution. */ return ((trio_isinf(number) == 0) && (trio_isnan(number) == 0)); #endif } #endif /* * The sign of NaN is always false */ TRIO_PUBLIC int trio_fpclassify_and_signbit TRIO_ARGS2((number, is_negative), double number, int *is_negative) { #if defined(fpclassify) && defined(signbit) /* * C99 defines fpclassify() and signbit() as a macros */ *is_negative = signbit(number); switch (fpclassify(number)) { case FP_NAN: return TRIO_FP_NAN; case FP_INFINITE: return TRIO_FP_INFINITE; case FP_SUBNORMAL: return TRIO_FP_SUBNORMAL; case FP_ZERO: return TRIO_FP_ZERO; default: return TRIO_FP_NORMAL; } #else # if defined(TRIO_COMPILER_DECC) /* * DECC has an fp_class() function. */ # define TRIO_FPCLASSIFY(n) fp_class(n) # define TRIO_QUIET_NAN FP_QNAN # define TRIO_SIGNALLING_NAN FP_SNAN # define TRIO_POSITIVE_INFINITY FP_POS_INF # define TRIO_NEGATIVE_INFINITY FP_NEG_INF # define TRIO_POSITIVE_SUBNORMAL FP_POS_DENORM # define TRIO_NEGATIVE_SUBNORMAL FP_NEG_DENORM # define TRIO_POSITIVE_ZERO FP_POS_ZERO # define TRIO_NEGATIVE_ZERO FP_NEG_ZERO # define TRIO_POSITIVE_NORMAL FP_POS_NORM # define TRIO_NEGATIVE_NORMAL FP_NEG_NORM # elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) /* * Microsoft Visual C++ and Borland C++ Builder have an _fpclass() * function. */ # define TRIO_FPCLASSIFY(n) _fpclass(n) # define TRIO_QUIET_NAN _FPCLASS_QNAN # define TRIO_SIGNALLING_NAN _FPCLASS_SNAN # define TRIO_POSITIVE_INFINITY _FPCLASS_PINF # define TRIO_NEGATIVE_INFINITY _FPCLASS_NINF # define TRIO_POSITIVE_SUBNORMAL _FPCLASS_PD # define TRIO_NEGATIVE_SUBNORMAL _FPCLASS_ND # define TRIO_POSITIVE_ZERO _FPCLASS_PZ # define TRIO_NEGATIVE_ZERO _FPCLASS_NZ # define TRIO_POSITIVE_NORMAL _FPCLASS_PN # define TRIO_NEGATIVE_NORMAL _FPCLASS_NN # elif defined(FP_PLUS_NORM) /* * HP-UX 9.x and 10.x have an fpclassify() function, that is different * from the C99 fpclassify() macro supported on HP-UX 11.x. * * AIX has class() for C, and _class() for C++, which returns the * same values as the HP-UX fpclassify() function. */ # if defined(TRIO_PLATFORM_AIX) # if defined(__cplusplus) # define TRIO_FPCLASSIFY(n) _class(n) # else # define TRIO_FPCLASSIFY(n) class(n) # endif # else # define TRIO_FPCLASSIFY(n) fpclassify(n) # endif # define TRIO_QUIET_NAN FP_QNAN # define TRIO_SIGNALLING_NAN FP_SNAN # define TRIO_POSITIVE_INFINITY FP_PLUS_INF # define TRIO_NEGATIVE_INFINITY FP_MINUS_INF # define TRIO_POSITIVE_SUBNORMAL FP_PLUS_DENORM # define TRIO_NEGATIVE_SUBNORMAL FP_MINUS_DENORM # define TRIO_POSITIVE_ZERO FP_PLUS_ZERO # define TRIO_NEGATIVE_ZERO FP_MINUS_ZERO # define TRIO_POSITIVE_NORMAL FP_PLUS_NORM # define TRIO_NEGATIVE_NORMAL FP_MINUS_NORM # endif # if defined(TRIO_FPCLASSIFY) switch (TRIO_FPCLASSIFY(number)) { case TRIO_QUIET_NAN: case TRIO_SIGNALLING_NAN: *is_negative = TRIO_FALSE; /* NaN has no sign */ return TRIO_FP_NAN; case TRIO_POSITIVE_INFINITY: *is_negative = TRIO_FALSE; return TRIO_FP_INFINITE; case TRIO_NEGATIVE_INFINITY: *is_negative = TRIO_TRUE; return TRIO_FP_INFINITE; case TRIO_POSITIVE_SUBNORMAL: *is_negative = TRIO_FALSE; return TRIO_FP_SUBNORMAL; case TRIO_NEGATIVE_SUBNORMAL: *is_negative = TRIO_TRUE; return TRIO_FP_SUBNORMAL; case TRIO_POSITIVE_ZERO: *is_negative = TRIO_FALSE; return TRIO_FP_ZERO; case TRIO_NEGATIVE_ZERO: *is_negative = TRIO_TRUE; return TRIO_FP_ZERO; case TRIO_POSITIVE_NORMAL: *is_negative = TRIO_FALSE; return TRIO_FP_NORMAL; case TRIO_NEGATIVE_NORMAL: *is_negative = TRIO_TRUE; return TRIO_FP_NORMAL; default: /* Just in case... */ *is_negative = (number < 0.0); return TRIO_FP_NORMAL; } # else /* * Fallback solution. */ int rc; if (number == 0.0) { /* * In IEEE 754 the sign of zero is ignored in comparisons, so we * have to handle this as a special case by examining the sign bit * directly. */ # if defined(USE_IEEE_754) *is_negative = trio_is_negative(number); # else *is_negative = TRIO_FALSE; /* FIXME */ # endif return TRIO_FP_ZERO; } if (trio_isnan(number)) { *is_negative = TRIO_FALSE; return TRIO_FP_NAN; } if ((rc = trio_isinf(number))) { *is_negative = (rc == -1); return TRIO_FP_INFINITE; } if ((number > 0.0) && (number < DBL_MIN)) { *is_negative = TRIO_FALSE; return TRIO_FP_SUBNORMAL; } if ((number < 0.0) && (number > -DBL_MIN)) { *is_negative = TRIO_TRUE; return TRIO_FP_SUBNORMAL; } *is_negative = (number < 0.0); return TRIO_FP_NORMAL; # endif #endif } /** Examine the sign of a number. @param number An arbitrary floating-point number. @return Boolean value indicating whether or not the number has the sign bit set (i.e. is negative). */ TRIO_PUBLIC int trio_signbit TRIO_ARGS1((number), double number) { int is_negative; (void)trio_fpclassify_and_signbit(number, &is_negative); return is_negative; } #if 0 /* Temporary fix - this routine is not used in libxml */ /** Examine the class of a number. @param number An arbitrary floating-point number. @return Enumerable value indicating the class of @p number */ TRIO_PUBLIC int trio_fpclassify TRIO_ARGS1((number), double number) { int dummy; return trio_fpclassify_and_signbit(number, &dummy); } #endif /** @} SpecialQuantities */ /************************************************************************* * For test purposes. * * Add the following compiler option to include this test code. * * Unix : -DSTANDALONE * VMS : /DEFINE=(STANDALONE) */ #if defined(STANDALONE) # include static TRIO_CONST char * getClassification TRIO_ARGS1((type), int type) { switch (type) { case TRIO_FP_INFINITE: return "FP_INFINITE"; case TRIO_FP_NAN: return "FP_NAN"; case TRIO_FP_NORMAL: return "FP_NORMAL"; case TRIO_FP_SUBNORMAL: return "FP_SUBNORMAL"; case TRIO_FP_ZERO: return "FP_ZERO"; default: return "FP_UNKNOWN"; } } static void print_class TRIO_ARGS2((prefix, number), TRIO_CONST char *prefix, double number) { printf("%-6s: %s %-15s %g\n", prefix, trio_signbit(number) ? "-" : "+", getClassification(TRIO_FPCLASSIFY(number)), number); } int main(TRIO_NOARGS) { double my_nan; double my_pinf; double my_ninf; # if defined(TRIO_PLATFORM_UNIX) void (*signal_handler) TRIO_PROTO((int)); # endif my_nan = trio_nan(); my_pinf = trio_pinf(); my_ninf = trio_ninf(); print_class("Nan", my_nan); print_class("PInf", my_pinf); print_class("NInf", my_ninf); print_class("PZero", 0.0); print_class("NZero", -0.0); print_class("PNorm", 1.0); print_class("NNorm", -1.0); print_class("PSub", 1.01e-307 - 1.00e-307); print_class("NSub", 1.00e-307 - 1.01e-307); printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", my_nan, ((unsigned char *)&my_nan)[0], ((unsigned char *)&my_nan)[1], ((unsigned char *)&my_nan)[2], ((unsigned char *)&my_nan)[3], ((unsigned char *)&my_nan)[4], ((unsigned char *)&my_nan)[5], ((unsigned char *)&my_nan)[6], ((unsigned char *)&my_nan)[7], trio_isnan(my_nan), trio_isinf(my_nan)); printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", my_pinf, ((unsigned char *)&my_pinf)[0], ((unsigned char *)&my_pinf)[1], ((unsigned char *)&my_pinf)[2], ((unsigned char *)&my_pinf)[3], ((unsigned char *)&my_pinf)[4], ((unsigned char *)&my_pinf)[5], ((unsigned char *)&my_pinf)[6], ((unsigned char *)&my_pinf)[7], trio_isnan(my_pinf), trio_isinf(my_pinf)); printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", my_ninf, ((unsigned char *)&my_ninf)[0], ((unsigned char *)&my_ninf)[1], ((unsigned char *)&my_ninf)[2], ((unsigned char *)&my_ninf)[3], ((unsigned char *)&my_ninf)[4], ((unsigned char *)&my_ninf)[5], ((unsigned char *)&my_ninf)[6], ((unsigned char *)&my_ninf)[7], trio_isnan(my_ninf), trio_isinf(my_ninf)); # if defined(TRIO_PLATFORM_UNIX) signal_handler = signal(SIGFPE, SIG_IGN); # endif my_pinf = DBL_MAX + DBL_MAX; my_ninf = -my_pinf; my_nan = my_pinf / my_pinf; # if defined(TRIO_PLATFORM_UNIX) signal(SIGFPE, signal_handler); # endif printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", my_nan, ((unsigned char *)&my_nan)[0], ((unsigned char *)&my_nan)[1], ((unsigned char *)&my_nan)[2], ((unsigned char *)&my_nan)[3], ((unsigned char *)&my_nan)[4], ((unsigned char *)&my_nan)[5], ((unsigned char *)&my_nan)[6], ((unsigned char *)&my_nan)[7], trio_isnan(my_nan), trio_isinf(my_nan)); printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", my_pinf, ((unsigned char *)&my_pinf)[0], ((unsigned char *)&my_pinf)[1], ((unsigned char *)&my_pinf)[2], ((unsigned char *)&my_pinf)[3], ((unsigned char *)&my_pinf)[4], ((unsigned char *)&my_pinf)[5], ((unsigned char *)&my_pinf)[6], ((unsigned char *)&my_pinf)[7], trio_isnan(my_pinf), trio_isinf(my_pinf)); printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", my_ninf, ((unsigned char *)&my_ninf)[0], ((unsigned char *)&my_ninf)[1], ((unsigned char *)&my_ninf)[2], ((unsigned char *)&my_ninf)[3], ((unsigned char *)&my_ninf)[4], ((unsigned char *)&my_ninf)[5], ((unsigned char *)&my_ninf)[6], ((unsigned char *)&my_ninf)[7], trio_isnan(my_ninf), trio_isinf(my_ninf)); return 0; } #endif libxml2-2.9.1+dfsg1/config.h.in0000644000175000017500000002013012134171753014577 0ustar aronaron/* config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_ANSIDECL_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_NAMESER_H /* Whether struct sockaddr::__ss_family exists */ #undef HAVE_BROKEN_SS_FAMILY /* Define to 1 if you have the `class' function. */ #undef HAVE_CLASS /* Define to 1 if you have the header file. */ #undef HAVE_CTYPE_H /* Define to 1 if you have the header file. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Have dlopen based dso */ #undef HAVE_DLOPEN /* Define to 1 if you have the header file. */ #undef HAVE_DL_H /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `finite' function. */ #undef HAVE_FINITE /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the `fpclass' function. */ #undef HAVE_FPCLASS /* Define to 1 if you have the `fprintf' function. */ #undef HAVE_FPRINTF /* Define to 1 if you have the `fp_class' function. */ #undef HAVE_FP_CLASS /* Define to 1 if you have the header file. */ #undef HAVE_FP_CLASS_H /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define if getaddrinfo is there */ #undef HAVE_GETADDRINFO /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define if isinf is there */ #undef HAVE_ISINF /* Define if isnan is there */ #undef HAVE_ISNAN /* Define to 1 if you have the `isnand' function. */ #undef HAVE_ISNAND /* Define if history library is there (-lhistory) */ #undef HAVE_LIBHISTORY /* Have compression library */ #undef HAVE_LIBLZMA /* Define if pthread library is there (-lpthread) */ #undef HAVE_LIBPTHREAD /* Define if readline library is there (-lreadline) */ #undef HAVE_LIBREADLINE /* Have compression library */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `localtime' function. */ #undef HAVE_LOCALTIME /* Define to 1 if you have the header file. */ #undef HAVE_LZMA_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* mmap() is no good without munmap() */ #if defined(HAVE_MMAP) && !defined(HAVE_MUNMAP) # undef /**/ HAVE_MMAP #endif /* Define to 1 if you have the header file. */ #undef HAVE_NAN_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `printf' function. */ #undef HAVE_PRINTF /* Define if is there */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the `rand' function. */ #undef HAVE_RAND /* Define to 1 if you have the `rand_r' function. */ #undef HAVE_RAND_R /* Define to 1 if you have the header file. */ #undef HAVE_RESOLV_H /* Have shl_load based dso */ #undef HAVE_SHLLOAD /* Define to 1 if you have the `signal' function. */ #undef HAVE_SIGNAL /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `sprintf' function. */ #undef HAVE_SPRINTF /* Define to 1 if you have the `srand' function. */ #undef HAVE_SRAND /* Define to 1 if you have the `sscanf' function. */ #undef HAVE_SSCANF /* Define to 1 if you have the `stat' function. */ #undef HAVE_STAT /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strndup' function. */ #undef HAVE_STRNDUP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `time' function. */ #undef HAVE_TIME /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Whether va_copy() is available */ #undef HAVE_VA_COPY /* Define to 1 if you have the `vfprintf' function. */ #undef HAVE_VFPRINTF /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the `vsprintf' function. */ #undef HAVE_VSPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H /* Define to 1 if you have the `_stat' function. */ #undef HAVE__STAT /* Whether __va_copy() is available */ #undef HAVE___VA_COPY /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Support for IPv6 */ #undef SUPPORT_IP6 /* Version number of package */ #undef VERSION /* Determine what socket length (socklen_t) data type is */ #undef XML_SOCKLEN_T /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Using the Win32 Socket implementation */ #undef _WINSOCKAPI_ /* ss_family is not defined here, use __ss_family instead */ #undef ss_family /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t libxml2-2.9.1+dfsg1/globals.c0000644000175000017500000007163612113312342014350 0ustar aronaron/* * globals.c: definition and handling of the set of global variables * of the library * * The bottom of this file is automatically generated by build_glob.py * based on the description file global.data * * See Copyright for the status of this software. * * Gary Pennington * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #ifdef HAVE_STDLIB_H #include #endif #include #include #include #include /* #define DEBUG_GLOBALS */ /* * Helpful Macro */ #ifdef LIBXML_THREAD_ENABLED #define IS_MAIN_THREAD (xmlIsMainThread()) #else #define IS_MAIN_THREAD 1 #endif /* * Mutex to protect "ForNewThreads" variables */ static xmlMutexPtr xmlThrDefMutex = NULL; /** * xmlInitGlobals: * * Additional initialisation for multi-threading */ void xmlInitGlobals(void) { if (xmlThrDefMutex == NULL) xmlThrDefMutex = xmlNewMutex(); } /** * xmlCleanupGlobals: * * Additional cleanup for multi-threading */ void xmlCleanupGlobals(void) { if (xmlThrDefMutex != NULL) { xmlFreeMutex(xmlThrDefMutex); xmlThrDefMutex = NULL; } __xmlGlobalInitMutexDestroy(); } /************************************************************************ * * * All the user accessible global variables of the library * * * ************************************************************************/ /* * Memory allocation routines */ #undef xmlFree #undef xmlMalloc #undef xmlMallocAtomic #undef xmlMemStrdup #undef xmlRealloc #if defined(DEBUG_MEMORY_LOCATION) || defined(DEBUG_MEMORY) xmlFreeFunc xmlFree = (xmlFreeFunc) xmlMemFree; xmlMallocFunc xmlMalloc = (xmlMallocFunc) xmlMemMalloc; xmlMallocFunc xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc; xmlReallocFunc xmlRealloc = (xmlReallocFunc) xmlMemRealloc; xmlStrdupFunc xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup; #else /** * xmlFree: * @mem: an already allocated block of memory * * The variable holding the libxml free() implementation */ xmlFreeFunc xmlFree = (xmlFreeFunc) free; /** * xmlMalloc: * @size: the size requested in bytes * * The variable holding the libxml malloc() implementation * * Returns a pointer to the newly allocated block or NULL in case of error */ xmlMallocFunc xmlMalloc = (xmlMallocFunc) malloc; /** * xmlMallocAtomic: * @size: the size requested in bytes * * The variable holding the libxml malloc() implementation for atomic * data (i.e. blocks not containings pointers), useful when using a * garbage collecting allocator. * * Returns a pointer to the newly allocated block or NULL in case of error */ xmlMallocFunc xmlMallocAtomic = (xmlMallocFunc) malloc; /** * xmlRealloc: * @mem: an already allocated block of memory * @size: the new size requested in bytes * * The variable holding the libxml realloc() implementation * * Returns a pointer to the newly reallocated block or NULL in case of error */ xmlReallocFunc xmlRealloc = (xmlReallocFunc) realloc; /** * xmlMemStrdup: * @str: a zero terminated string * * The variable holding the libxml strdup() implementation * * Returns the copy of the string or NULL in case of error */ xmlStrdupFunc xmlMemStrdup = (xmlStrdupFunc) xmlStrdup; #endif /* DEBUG_MEMORY_LOCATION || DEBUG_MEMORY */ #include #include #include #undef docbDefaultSAXHandler #undef htmlDefaultSAXHandler #undef oldXMLWDcompatibility #undef xmlBufferAllocScheme #undef xmlDefaultBufferSize #undef xmlDefaultSAXHandler #undef xmlDefaultSAXLocator #undef xmlDoValidityCheckingDefaultValue #undef xmlGenericError #undef xmlStructuredError #undef xmlGenericErrorContext #undef xmlStructuredErrorContext #undef xmlGetWarningsDefaultValue #undef xmlIndentTreeOutput #undef xmlTreeIndentString #undef xmlKeepBlanksDefaultValue #undef xmlLineNumbersDefaultValue #undef xmlLoadExtDtdDefaultValue #undef xmlParserDebugEntities #undef xmlParserVersion #undef xmlPedanticParserDefaultValue #undef xmlSaveNoEmptyTags #undef xmlSubstituteEntitiesDefaultValue #undef xmlRegisterNodeDefaultValue #undef xmlDeregisterNodeDefaultValue #undef xmlLastError #undef xmlParserInputBufferCreateFilenameValue #undef xmlOutputBufferCreateFilenameValue /** * xmlParserVersion: * * Constant string describing the internal version of the library */ const char *xmlParserVersion = LIBXML_VERSION_STRING LIBXML_VERSION_EXTRA; /** * xmlBufferAllocScheme: * * Global setting, default allocation policy for buffers, default is * XML_BUFFER_ALLOC_EXACT */ xmlBufferAllocationScheme xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT; static xmlBufferAllocationScheme xmlBufferAllocSchemeThrDef = XML_BUFFER_ALLOC_EXACT; /** * xmlDefaultBufferSize: * * Global setting, default buffer size. Default value is BASE_BUFFER_SIZE */ int xmlDefaultBufferSize = BASE_BUFFER_SIZE; static int xmlDefaultBufferSizeThrDef = BASE_BUFFER_SIZE; /* * Parser defaults */ /** * oldXMLWDcompatibility: * * Global setting, DEPRECATED. */ int oldXMLWDcompatibility = 0; /* DEPRECATED */ /** * xmlParserDebugEntities: * * Global setting, asking the parser to print out debugging informations. * while handling entities. * Disabled by default */ int xmlParserDebugEntities = 0; static int xmlParserDebugEntitiesThrDef = 0; /** * xmlDoValidityCheckingDefaultValue: * * Global setting, indicate that the parser should work in validating mode. * Disabled by default. */ int xmlDoValidityCheckingDefaultValue = 0; static int xmlDoValidityCheckingDefaultValueThrDef = 0; /** * xmlGetWarningsDefaultValue: * * Global setting, indicate that the parser should provide warnings. * Activated by default. */ int xmlGetWarningsDefaultValue = 1; static int xmlGetWarningsDefaultValueThrDef = 1; /** * xmlLoadExtDtdDefaultValue: * * Global setting, indicate that the parser should load DTD while not * validating. * Disabled by default. */ int xmlLoadExtDtdDefaultValue = 0; static int xmlLoadExtDtdDefaultValueThrDef = 0; /** * xmlPedanticParserDefaultValue: * * Global setting, indicate that the parser be pedantic * Disabled by default. */ int xmlPedanticParserDefaultValue = 0; static int xmlPedanticParserDefaultValueThrDef = 0; /** * xmlLineNumbersDefaultValue: * * Global setting, indicate that the parser should store the line number * in the content field of elements in the DOM tree. * Disabled by default since this may not be safe for old classes of * applicaton. */ int xmlLineNumbersDefaultValue = 0; static int xmlLineNumbersDefaultValueThrDef = 0; /** * xmlKeepBlanksDefaultValue: * * Global setting, indicate that the parser should keep all blanks * nodes found in the content * Activated by default, this is actually needed to have the parser * conformant to the XML Recommendation, however the option is kept * for some applications since this was libxml1 default behaviour. */ int xmlKeepBlanksDefaultValue = 1; static int xmlKeepBlanksDefaultValueThrDef = 1; /** * xmlSubstituteEntitiesDefaultValue: * * Global setting, indicate that the parser should not generate entity * references but replace them with the actual content of the entity * Disabled by default, this should be activated when using XPath since * the XPath data model requires entities replacement and the XPath * engine does not handle entities references transparently. */ int xmlSubstituteEntitiesDefaultValue = 0; static int xmlSubstituteEntitiesDefaultValueThrDef = 0; xmlRegisterNodeFunc xmlRegisterNodeDefaultValue = NULL; static xmlRegisterNodeFunc xmlRegisterNodeDefaultValueThrDef = NULL; xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue = NULL; static xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValueThrDef = NULL; xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue = NULL; static xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValueThrDef = NULL; xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue = NULL; static xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValueThrDef = NULL; /* * Error handling */ /* xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc; */ /* Must initialize xmlGenericError in xmlInitParser */ void XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, const char *msg, ...); /** * xmlGenericError: * * Global setting: function used for generic error callbacks */ xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc; static xmlGenericErrorFunc xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; /** * xmlStructuredError: * * Global setting: function used for structured error callbacks */ xmlStructuredErrorFunc xmlStructuredError = NULL; static xmlStructuredErrorFunc xmlStructuredErrorThrDef = NULL; /** * xmlGenericErrorContext: * * Global setting passed to generic error callbacks */ void *xmlGenericErrorContext = NULL; static void *xmlGenericErrorContextThrDef = NULL; /** * xmlStructuredErrorContext: * * Global setting passed to structured error callbacks */ void *xmlStructuredErrorContext = NULL; static void *xmlStructuredErrorContextThrDef = NULL; xmlError xmlLastError; /* * output defaults */ /** * xmlIndentTreeOutput: * * Global setting, asking the serializer to indent the output tree by default * Enabled by default */ int xmlIndentTreeOutput = 1; static int xmlIndentTreeOutputThrDef = 1; /** * xmlTreeIndentString: * * The string used to do one-level indent. By default is equal to " " (two spaces) */ const char *xmlTreeIndentString = " "; static const char *xmlTreeIndentStringThrDef = " "; /** * xmlSaveNoEmptyTags: * * Global setting, asking the serializer to not output empty tags * as but . those two forms are undistinguishable * once parsed. * Disabled by default */ int xmlSaveNoEmptyTags = 0; static int xmlSaveNoEmptyTagsThrDef = 0; #ifdef LIBXML_SAX1_ENABLED /** * xmlDefaultSAXHandler: * * Default SAX version1 handler for XML, builds the DOM tree */ xmlSAXHandlerV1 xmlDefaultSAXHandler = { xmlSAX2InternalSubset, xmlSAX2IsStandalone, xmlSAX2HasInternalSubset, xmlSAX2HasExternalSubset, xmlSAX2ResolveEntity, xmlSAX2GetEntity, xmlSAX2EntityDecl, xmlSAX2NotationDecl, xmlSAX2AttributeDecl, xmlSAX2ElementDecl, xmlSAX2UnparsedEntityDecl, xmlSAX2SetDocumentLocator, xmlSAX2StartDocument, xmlSAX2EndDocument, xmlSAX2StartElement, xmlSAX2EndElement, xmlSAX2Reference, xmlSAX2Characters, xmlSAX2Characters, xmlSAX2ProcessingInstruction, xmlSAX2Comment, xmlParserWarning, xmlParserError, xmlParserError, xmlSAX2GetParameterEntity, xmlSAX2CDataBlock, xmlSAX2ExternalSubset, 0, }; #endif /* LIBXML_SAX1_ENABLED */ /** * xmlDefaultSAXLocator: * * The default SAX Locator * { getPublicId, getSystemId, getLineNumber, getColumnNumber} */ xmlSAXLocator xmlDefaultSAXLocator = { xmlSAX2GetPublicId, xmlSAX2GetSystemId, xmlSAX2GetLineNumber, xmlSAX2GetColumnNumber }; #ifdef LIBXML_HTML_ENABLED /** * htmlDefaultSAXHandler: * * Default old SAX v1 handler for HTML, builds the DOM tree */ xmlSAXHandlerV1 htmlDefaultSAXHandler = { xmlSAX2InternalSubset, NULL, NULL, NULL, NULL, xmlSAX2GetEntity, NULL, NULL, NULL, NULL, NULL, xmlSAX2SetDocumentLocator, xmlSAX2StartDocument, xmlSAX2EndDocument, xmlSAX2StartElement, xmlSAX2EndElement, NULL, xmlSAX2Characters, xmlSAX2IgnorableWhitespace, xmlSAX2ProcessingInstruction, xmlSAX2Comment, xmlParserWarning, xmlParserError, xmlParserError, xmlSAX2GetParameterEntity, xmlSAX2CDataBlock, NULL, 0, }; #endif /* LIBXML_HTML_ENABLED */ #ifdef LIBXML_DOCB_ENABLED /** * docbDefaultSAXHandler: * * Default old SAX v1 handler for SGML DocBook, builds the DOM tree */ xmlSAXHandlerV1 docbDefaultSAXHandler = { xmlSAX2InternalSubset, xmlSAX2IsStandalone, xmlSAX2HasInternalSubset, xmlSAX2HasExternalSubset, xmlSAX2ResolveEntity, xmlSAX2GetEntity, xmlSAX2EntityDecl, NULL, NULL, NULL, NULL, xmlSAX2SetDocumentLocator, xmlSAX2StartDocument, xmlSAX2EndDocument, xmlSAX2StartElement, xmlSAX2EndElement, xmlSAX2Reference, xmlSAX2Characters, xmlSAX2IgnorableWhitespace, NULL, xmlSAX2Comment, xmlParserWarning, xmlParserError, xmlParserError, xmlSAX2GetParameterEntity, NULL, NULL, 0, }; #endif /* LIBXML_DOCB_ENABLED */ /** * xmlInitializeGlobalState: * @gs: a pointer to a newly allocated global state * * xmlInitializeGlobalState() initialize a global state with all the * default values of the library. */ void xmlInitializeGlobalState(xmlGlobalStatePtr gs) { #ifdef DEBUG_GLOBALS fprintf(stderr, "Initializing globals at %lu for thread %d\n", (unsigned long) gs, xmlGetThreadId()); #endif /* * Perform initialization as required by libxml */ if (xmlThrDefMutex == NULL) xmlInitGlobals(); xmlMutexLock(xmlThrDefMutex); #if defined(LIBXML_DOCB_ENABLED) && defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) initdocbDefaultSAXHandler(&gs->docbDefaultSAXHandler); #endif #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) inithtmlDefaultSAXHandler(&gs->htmlDefaultSAXHandler); #endif gs->oldXMLWDcompatibility = 0; gs->xmlBufferAllocScheme = xmlBufferAllocSchemeThrDef; gs->xmlDefaultBufferSize = xmlDefaultBufferSizeThrDef; #if defined(LIBXML_SAX1_ENABLED) && defined(LIBXML_LEGACY_ENABLED) initxmlDefaultSAXHandler(&gs->xmlDefaultSAXHandler, 1); #endif /* LIBXML_SAX1_ENABLED */ gs->xmlDefaultSAXLocator.getPublicId = xmlSAX2GetPublicId; gs->xmlDefaultSAXLocator.getSystemId = xmlSAX2GetSystemId; gs->xmlDefaultSAXLocator.getLineNumber = xmlSAX2GetLineNumber; gs->xmlDefaultSAXLocator.getColumnNumber = xmlSAX2GetColumnNumber; gs->xmlDoValidityCheckingDefaultValue = xmlDoValidityCheckingDefaultValueThrDef; #if defined(DEBUG_MEMORY_LOCATION) | defined(DEBUG_MEMORY) gs->xmlFree = (xmlFreeFunc) xmlMemFree; gs->xmlMalloc = (xmlMallocFunc) xmlMemMalloc; gs->xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc; gs->xmlRealloc = (xmlReallocFunc) xmlMemRealloc; gs->xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup; #else gs->xmlFree = (xmlFreeFunc) free; gs->xmlMalloc = (xmlMallocFunc) malloc; gs->xmlMallocAtomic = (xmlMallocFunc) malloc; gs->xmlRealloc = (xmlReallocFunc) realloc; gs->xmlMemStrdup = (xmlStrdupFunc) xmlStrdup; #endif gs->xmlGetWarningsDefaultValue = xmlGetWarningsDefaultValueThrDef; gs->xmlIndentTreeOutput = xmlIndentTreeOutputThrDef; gs->xmlTreeIndentString = xmlTreeIndentStringThrDef; gs->xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef; gs->xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef; gs->xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef; gs->xmlParserDebugEntities = xmlParserDebugEntitiesThrDef; gs->xmlParserVersion = LIBXML_VERSION_STRING; gs->xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef; gs->xmlSaveNoEmptyTags = xmlSaveNoEmptyTagsThrDef; gs->xmlSubstituteEntitiesDefaultValue = xmlSubstituteEntitiesDefaultValueThrDef; gs->xmlGenericError = xmlGenericErrorThrDef; gs->xmlStructuredError = xmlStructuredErrorThrDef; gs->xmlGenericErrorContext = xmlGenericErrorContextThrDef; gs->xmlStructuredErrorContext = xmlStructuredErrorContextThrDef; gs->xmlRegisterNodeDefaultValue = xmlRegisterNodeDefaultValueThrDef; gs->xmlDeregisterNodeDefaultValue = xmlDeregisterNodeDefaultValueThrDef; gs->xmlParserInputBufferCreateFilenameValue = xmlParserInputBufferCreateFilenameValueThrDef; gs->xmlOutputBufferCreateFilenameValue = xmlOutputBufferCreateFilenameValueThrDef; memset(&gs->xmlLastError, 0, sizeof(xmlError)); xmlMutexUnlock(xmlThrDefMutex); } /** * DOC_DISABLE : we ignore missing doc for the xmlThrDef functions, * those are really internal work */ void xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { xmlMutexLock(xmlThrDefMutex); xmlGenericErrorContextThrDef = ctx; if (handler != NULL) xmlGenericErrorThrDef = handler; else xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; xmlMutexUnlock(xmlThrDefMutex); } void xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { xmlMutexLock(xmlThrDefMutex); xmlStructuredErrorContextThrDef = ctx; xmlStructuredErrorThrDef = handler; xmlMutexUnlock(xmlThrDefMutex); } /** * xmlRegisterNodeDefault: * @func: function pointer to the new RegisterNodeFunc * * Registers a callback for node creation * * Returns the old value of the registration function */ xmlRegisterNodeFunc xmlRegisterNodeDefault(xmlRegisterNodeFunc func) { xmlRegisterNodeFunc old = xmlRegisterNodeDefaultValue; __xmlRegisterCallbacks = 1; xmlRegisterNodeDefaultValue = func; return(old); } xmlRegisterNodeFunc xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func) { xmlRegisterNodeFunc old; xmlMutexLock(xmlThrDefMutex); old = xmlRegisterNodeDefaultValueThrDef; __xmlRegisterCallbacks = 1; xmlRegisterNodeDefaultValueThrDef = func; xmlMutexUnlock(xmlThrDefMutex); return(old); } /** * xmlDeregisterNodeDefault: * @func: function pointer to the new DeregisterNodeFunc * * Registers a callback for node destruction * * Returns the previous value of the deregistration function */ xmlDeregisterNodeFunc xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func) { xmlDeregisterNodeFunc old = xmlDeregisterNodeDefaultValue; __xmlRegisterCallbacks = 1; xmlDeregisterNodeDefaultValue = func; return(old); } xmlDeregisterNodeFunc xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func) { xmlDeregisterNodeFunc old; xmlMutexLock(xmlThrDefMutex); old = xmlDeregisterNodeDefaultValueThrDef; __xmlRegisterCallbacks = 1; xmlDeregisterNodeDefaultValueThrDef = func; xmlMutexUnlock(xmlThrDefMutex); return(old); } xmlParserInputBufferCreateFilenameFunc xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) { xmlParserInputBufferCreateFilenameFunc old; xmlMutexLock(xmlThrDefMutex); old = xmlParserInputBufferCreateFilenameValueThrDef; if (old == NULL) { old = __xmlParserInputBufferCreateFilename; } xmlParserInputBufferCreateFilenameValueThrDef = func; xmlMutexUnlock(xmlThrDefMutex); return(old); } xmlOutputBufferCreateFilenameFunc xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) { xmlOutputBufferCreateFilenameFunc old; xmlMutexLock(xmlThrDefMutex); old = xmlOutputBufferCreateFilenameValueThrDef; #ifdef LIBXML_OUTPUT_ENABLED if (old == NULL) { old = __xmlOutputBufferCreateFilename; } #endif xmlOutputBufferCreateFilenameValueThrDef = func; xmlMutexUnlock(xmlThrDefMutex); return(old); } #ifdef LIBXML_DOCB_ENABLED #undef docbDefaultSAXHandler xmlSAXHandlerV1 * __docbDefaultSAXHandler(void) { if (IS_MAIN_THREAD) return (&docbDefaultSAXHandler); else return (&xmlGetGlobalState()->docbDefaultSAXHandler); } #endif #ifdef LIBXML_HTML_ENABLED #undef htmlDefaultSAXHandler xmlSAXHandlerV1 * __htmlDefaultSAXHandler(void) { if (IS_MAIN_THREAD) return (&htmlDefaultSAXHandler); else return (&xmlGetGlobalState()->htmlDefaultSAXHandler); } #endif #undef xmlLastError xmlError * __xmlLastError(void) { if (IS_MAIN_THREAD) return (&xmlLastError); else return (&xmlGetGlobalState()->xmlLastError); } /* * The following memory routines were apparently lost at some point, * and were re-inserted at this point on June 10, 2004. Hope it's * the right place for them :-) */ #if defined(LIBXML_THREAD_ALLOC_ENABLED) && defined(LIBXML_THREAD_ENABLED) #undef xmlMalloc xmlMallocFunc * __xmlMalloc(void){ if (IS_MAIN_THREAD) return (&xmlMalloc); else return (&xmlGetGlobalState()->xmlMalloc); } #undef xmlMallocAtomic xmlMallocFunc * __xmlMallocAtomic(void){ if (IS_MAIN_THREAD) return (&xmlMallocAtomic); else return (&xmlGetGlobalState()->xmlMallocAtomic); } #undef xmlRealloc xmlReallocFunc * __xmlRealloc(void){ if (IS_MAIN_THREAD) return (&xmlRealloc); else return (&xmlGetGlobalState()->xmlRealloc); } #undef xmlFree xmlFreeFunc * __xmlFree(void){ if (IS_MAIN_THREAD) return (&xmlFree); else return (&xmlGetGlobalState()->xmlFree); } xmlStrdupFunc * __xmlMemStrdup(void){ if (IS_MAIN_THREAD) return (&xmlMemStrdup); else return (&xmlGetGlobalState()->xmlMemStrdup); } #endif /* * Everything starting from the line below is * Automatically generated by build_glob.py. * Do not modify the previous line. */ #undef oldXMLWDcompatibility int * __oldXMLWDcompatibility(void) { if (IS_MAIN_THREAD) return (&oldXMLWDcompatibility); else return (&xmlGetGlobalState()->oldXMLWDcompatibility); } #undef xmlBufferAllocScheme xmlBufferAllocationScheme * __xmlBufferAllocScheme(void) { if (IS_MAIN_THREAD) return (&xmlBufferAllocScheme); else return (&xmlGetGlobalState()->xmlBufferAllocScheme); } xmlBufferAllocationScheme xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v) { xmlBufferAllocationScheme ret; xmlMutexLock(xmlThrDefMutex); ret = xmlBufferAllocSchemeThrDef; xmlBufferAllocSchemeThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlDefaultBufferSize int * __xmlDefaultBufferSize(void) { if (IS_MAIN_THREAD) return (&xmlDefaultBufferSize); else return (&xmlGetGlobalState()->xmlDefaultBufferSize); } int xmlThrDefDefaultBufferSize(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlDefaultBufferSizeThrDef; xmlDefaultBufferSizeThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #ifdef LIBXML_SAX1_ENABLED #undef xmlDefaultSAXHandler xmlSAXHandlerV1 * __xmlDefaultSAXHandler(void) { if (IS_MAIN_THREAD) return (&xmlDefaultSAXHandler); else return (&xmlGetGlobalState()->xmlDefaultSAXHandler); } #endif /* LIBXML_SAX1_ENABLED */ #undef xmlDefaultSAXLocator xmlSAXLocator * __xmlDefaultSAXLocator(void) { if (IS_MAIN_THREAD) return (&xmlDefaultSAXLocator); else return (&xmlGetGlobalState()->xmlDefaultSAXLocator); } #undef xmlDoValidityCheckingDefaultValue int * __xmlDoValidityCheckingDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlDoValidityCheckingDefaultValue); else return (&xmlGetGlobalState()->xmlDoValidityCheckingDefaultValue); } int xmlThrDefDoValidityCheckingDefaultValue(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlDoValidityCheckingDefaultValueThrDef; xmlDoValidityCheckingDefaultValueThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlGenericError xmlGenericErrorFunc * __xmlGenericError(void) { if (IS_MAIN_THREAD) return (&xmlGenericError); else return (&xmlGetGlobalState()->xmlGenericError); } #undef xmlStructuredError xmlStructuredErrorFunc * __xmlStructuredError(void) { if (IS_MAIN_THREAD) return (&xmlStructuredError); else return (&xmlGetGlobalState()->xmlStructuredError); } #undef xmlGenericErrorContext void * * __xmlGenericErrorContext(void) { if (IS_MAIN_THREAD) return (&xmlGenericErrorContext); else return (&xmlGetGlobalState()->xmlGenericErrorContext); } #undef xmlStructuredErrorContext void * * __xmlStructuredErrorContext(void) { if (IS_MAIN_THREAD) return (&xmlStructuredErrorContext); else return (&xmlGetGlobalState()->xmlStructuredErrorContext); } #undef xmlGetWarningsDefaultValue int * __xmlGetWarningsDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlGetWarningsDefaultValue); else return (&xmlGetGlobalState()->xmlGetWarningsDefaultValue); } int xmlThrDefGetWarningsDefaultValue(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlGetWarningsDefaultValueThrDef; xmlGetWarningsDefaultValueThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlIndentTreeOutput int * __xmlIndentTreeOutput(void) { if (IS_MAIN_THREAD) return (&xmlIndentTreeOutput); else return (&xmlGetGlobalState()->xmlIndentTreeOutput); } int xmlThrDefIndentTreeOutput(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlIndentTreeOutputThrDef; xmlIndentTreeOutputThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlTreeIndentString const char * * __xmlTreeIndentString(void) { if (IS_MAIN_THREAD) return (&xmlTreeIndentString); else return (&xmlGetGlobalState()->xmlTreeIndentString); } const char * xmlThrDefTreeIndentString(const char * v) { const char * ret; xmlMutexLock(xmlThrDefMutex); ret = xmlTreeIndentStringThrDef; xmlTreeIndentStringThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlKeepBlanksDefaultValue int * __xmlKeepBlanksDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlKeepBlanksDefaultValue); else return (&xmlGetGlobalState()->xmlKeepBlanksDefaultValue); } int xmlThrDefKeepBlanksDefaultValue(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlKeepBlanksDefaultValueThrDef; xmlKeepBlanksDefaultValueThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlLineNumbersDefaultValue int * __xmlLineNumbersDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlLineNumbersDefaultValue); else return (&xmlGetGlobalState()->xmlLineNumbersDefaultValue); } int xmlThrDefLineNumbersDefaultValue(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlLineNumbersDefaultValueThrDef; xmlLineNumbersDefaultValueThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlLoadExtDtdDefaultValue int * __xmlLoadExtDtdDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlLoadExtDtdDefaultValue); else return (&xmlGetGlobalState()->xmlLoadExtDtdDefaultValue); } int xmlThrDefLoadExtDtdDefaultValue(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlLoadExtDtdDefaultValueThrDef; xmlLoadExtDtdDefaultValueThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlParserDebugEntities int * __xmlParserDebugEntities(void) { if (IS_MAIN_THREAD) return (&xmlParserDebugEntities); else return (&xmlGetGlobalState()->xmlParserDebugEntities); } int xmlThrDefParserDebugEntities(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlParserDebugEntitiesThrDef; xmlParserDebugEntitiesThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlParserVersion const char * * __xmlParserVersion(void) { if (IS_MAIN_THREAD) return (&xmlParserVersion); else return (&xmlGetGlobalState()->xmlParserVersion); } #undef xmlPedanticParserDefaultValue int * __xmlPedanticParserDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlPedanticParserDefaultValue); else return (&xmlGetGlobalState()->xmlPedanticParserDefaultValue); } int xmlThrDefPedanticParserDefaultValue(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlPedanticParserDefaultValueThrDef; xmlPedanticParserDefaultValueThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlSaveNoEmptyTags int * __xmlSaveNoEmptyTags(void) { if (IS_MAIN_THREAD) return (&xmlSaveNoEmptyTags); else return (&xmlGetGlobalState()->xmlSaveNoEmptyTags); } int xmlThrDefSaveNoEmptyTags(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlSaveNoEmptyTagsThrDef; xmlSaveNoEmptyTagsThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlSubstituteEntitiesDefaultValue int * __xmlSubstituteEntitiesDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlSubstituteEntitiesDefaultValue); else return (&xmlGetGlobalState()->xmlSubstituteEntitiesDefaultValue); } int xmlThrDefSubstituteEntitiesDefaultValue(int v) { int ret; xmlMutexLock(xmlThrDefMutex); ret = xmlSubstituteEntitiesDefaultValueThrDef; xmlSubstituteEntitiesDefaultValueThrDef = v; xmlMutexUnlock(xmlThrDefMutex); return ret; } #undef xmlRegisterNodeDefaultValue xmlRegisterNodeFunc * __xmlRegisterNodeDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlRegisterNodeDefaultValue); else return (&xmlGetGlobalState()->xmlRegisterNodeDefaultValue); } #undef xmlDeregisterNodeDefaultValue xmlDeregisterNodeFunc * __xmlDeregisterNodeDefaultValue(void) { if (IS_MAIN_THREAD) return (&xmlDeregisterNodeDefaultValue); else return (&xmlGetGlobalState()->xmlDeregisterNodeDefaultValue); } #undef xmlParserInputBufferCreateFilenameValue xmlParserInputBufferCreateFilenameFunc * __xmlParserInputBufferCreateFilenameValue(void) { if (IS_MAIN_THREAD) return (&xmlParserInputBufferCreateFilenameValue); else return (&xmlGetGlobalState()->xmlParserInputBufferCreateFilenameValue); } #undef xmlOutputBufferCreateFilenameValue xmlOutputBufferCreateFilenameFunc * __xmlOutputBufferCreateFilenameValue(void) { if (IS_MAIN_THREAD) return (&xmlOutputBufferCreateFilenameValue); else return (&xmlGetGlobalState()->xmlOutputBufferCreateFilenameValue); } #define bottom_globals #include "elfgcchack.h" libxml2-2.9.1+dfsg1/enc.h0000644000175000017500000000147412113312342013470 0ustar aronaron/* * Summary: Internal Interfaces for encoding in libxml2 * Description: this module describes a few interfaces which were * addded along with the API changes in 2.9.0 * those are private routines at this point * * Copy: See Copyright for the status of this software. * * Author: Daniel Veillard */ #ifndef __XML_ENC_H__ #define __XML_ENC_H__ #include #ifdef __cplusplus extern "C" { #endif int xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in, int len); int xmlCharEncFirstLineInput(xmlParserInputBufferPtr input, int len); int xmlCharEncInput(xmlParserInputBufferPtr input, int flush); int xmlCharEncOutput(xmlOutputBufferPtr output, int init); #ifdef __cplusplus } #endif #endif /* __XML_ENC_H__ */ libxml2-2.9.1+dfsg1/libxml-2.0-uninstalled.pc.in0000644000175000017500000000045112113312342017601 0ustar aronaronprefix= exec_prefix= libdir=${pcfiledir} includedir=${pcfiledir}/include Name: libXML Version: @VERSION@ Description: libXML library version2. Requires: Libs: -L${libdir} -lxml2 @ICU_LIBS@ @THREAD_LIBS@ @Z_LIBS@ @ICONV_LIBS@ @M_LIBS@ @LIBS@ Cflags: -I${includedir} @XML_INCLUDEDIR@ @XML_CFLAGS@ libxml2-2.9.1+dfsg1/error.c0000644000175000017500000006524212113312342014052 0ustar aronaron/* * error.c: module displaying/handling XML parser errors * * See Copyright for the status of this software. * * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #include #include #include #include #include #include void XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, const char *msg, ...); #define XML_GET_VAR_STR(msg, str) { \ int size, prev_size = -1; \ int chars; \ char *larger; \ va_list ap; \ \ str = (char *) xmlMalloc(150); \ if (str != NULL) { \ \ size = 150; \ \ while (size < 64000) { \ va_start(ap, msg); \ chars = vsnprintf(str, size, msg, ap); \ va_end(ap); \ if ((chars > -1) && (chars < size)) { \ if (prev_size == chars) { \ break; \ } else { \ prev_size = chars; \ } \ } \ if (chars > -1) \ size += chars + 1; \ else \ size += 100; \ if ((larger = (char *) xmlRealloc(str, size)) == NULL) {\ break; \ } \ str = larger; \ }} \ } /************************************************************************ * * * Handling of out of context errors * * * ************************************************************************/ /** * xmlGenericErrorDefaultFunc: * @ctx: an error context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Default handler for out of context error messages. */ void XMLCDECL xmlGenericErrorDefaultFunc(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { va_list args; if (xmlGenericErrorContext == NULL) xmlGenericErrorContext = (void *) stderr; va_start(args, msg); vfprintf((FILE *)xmlGenericErrorContext, msg, args); va_end(args); } /** * initGenericErrorDefaultFunc: * @handler: the handler * * Set or reset (if NULL) the default handler for generic errors * to the builtin error function. */ void initGenericErrorDefaultFunc(xmlGenericErrorFunc * handler) { if (handler == NULL) xmlGenericError = xmlGenericErrorDefaultFunc; else xmlGenericError = (*handler); } /** * xmlSetGenericErrorFunc: * @ctx: the new error handling context * @handler: the new handler function * * Function to reset the handler and the error context for out of * context error messages. * This simply means that @handler will be called for subsequent * error messages while not parsing nor validating. And @ctx will * be passed as first argument to @handler * One can simply force messages to be emitted to another FILE * than * stderr by setting @ctx to this file handle and @handler to NULL. * For multi-threaded applications, this must be set separately for each thread. */ void xmlSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { xmlGenericErrorContext = ctx; if (handler != NULL) xmlGenericError = handler; else xmlGenericError = xmlGenericErrorDefaultFunc; } /** * xmlSetStructuredErrorFunc: * @ctx: the new error handling context * @handler: the new handler function * * Function to reset the handler and the error context for out of * context structured error messages. * This simply means that @handler will be called for subsequent * error messages while not parsing nor validating. And @ctx will * be passed as first argument to @handler * For multi-threaded applications, this must be set separately for each thread. */ void xmlSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { xmlStructuredErrorContext = ctx; xmlStructuredError = handler; } /************************************************************************ * * * Handling of parsing errors * * * ************************************************************************/ /** * xmlParserPrintFileInfo: * @input: an xmlParserInputPtr input * * Displays the associated file and line informations for the current input */ void xmlParserPrintFileInfo(xmlParserInputPtr input) { if (input != NULL) { if (input->filename) xmlGenericError(xmlGenericErrorContext, "%s:%d: ", input->filename, input->line); else xmlGenericError(xmlGenericErrorContext, "Entity: line %d: ", input->line); } } /** * xmlParserPrintFileContext: * @input: an xmlParserInputPtr input * * Displays current context within the input content for error tracking */ static void xmlParserPrintFileContextInternal(xmlParserInputPtr input , xmlGenericErrorFunc channel, void *data ) { const xmlChar *cur, *base; unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */ xmlChar content[81]; /* space for 80 chars + line terminator */ xmlChar *ctnt; if (input == NULL) return; cur = input->cur; base = input->base; /* skip backwards over any end-of-lines */ while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) { cur--; } n = 0; /* search backwards for beginning-of-line (to max buff size) */ while ((n++ < (sizeof(content)-1)) && (cur > base) && (*(cur) != '\n') && (*(cur) != '\r')) cur--; if ((*(cur) == '\n') || (*(cur) == '\r')) cur++; /* calculate the error position in terms of the current position */ col = input->cur - cur; /* search forward for end-of-line (to max buff size) */ n = 0; ctnt = content; /* copy selected text to our buffer */ while ((*cur != 0) && (*(cur) != '\n') && (*(cur) != '\r') && (n < sizeof(content)-1)) { *ctnt++ = *cur++; n++; } *ctnt = 0; /* print out the selected text */ channel(data ,"%s\n", content); /* create blank line with problem pointer */ n = 0; ctnt = content; /* (leave buffer space for pointer + line terminator) */ while ((nfile; line = err->line; code = err->code; domain = err->domain; level = err->level; node = err->node; if (code == XML_ERR_OK) return; if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) name = node->name; /* * Maintain the compatibility with the legacy error handling */ if (ctxt != NULL) { input = ctxt->input; if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { cur = input; input = ctxt->inputTab[ctxt->inputNr - 2]; } if (input != NULL) { if (input->filename) channel(data, "%s:%d: ", input->filename, input->line); else if ((line != 0) && (domain == XML_FROM_PARSER)) channel(data, "Entity: line %d: ", input->line); } } else { if (file != NULL) channel(data, "%s:%d: ", file, line); else if ((line != 0) && ((domain == XML_FROM_PARSER) || (domain == XML_FROM_SCHEMASV)|| (domain == XML_FROM_SCHEMASP)||(domain == XML_FROM_DTD) || (domain == XML_FROM_RELAXNGP)||(domain == XML_FROM_RELAXNGV))) channel(data, "Entity: line %d: ", line); } if (name != NULL) { channel(data, "element %s: ", name); } switch (domain) { case XML_FROM_PARSER: channel(data, "parser "); break; case XML_FROM_NAMESPACE: channel(data, "namespace "); break; case XML_FROM_DTD: case XML_FROM_VALID: channel(data, "validity "); break; case XML_FROM_HTML: channel(data, "HTML parser "); break; case XML_FROM_MEMORY: channel(data, "memory "); break; case XML_FROM_OUTPUT: channel(data, "output "); break; case XML_FROM_IO: channel(data, "I/O "); break; case XML_FROM_XINCLUDE: channel(data, "XInclude "); break; case XML_FROM_XPATH: channel(data, "XPath "); break; case XML_FROM_XPOINTER: channel(data, "parser "); break; case XML_FROM_REGEXP: channel(data, "regexp "); break; case XML_FROM_MODULE: channel(data, "module "); break; case XML_FROM_SCHEMASV: channel(data, "Schemas validity "); break; case XML_FROM_SCHEMASP: channel(data, "Schemas parser "); break; case XML_FROM_RELAXNGP: channel(data, "Relax-NG parser "); break; case XML_FROM_RELAXNGV: channel(data, "Relax-NG validity "); break; case XML_FROM_CATALOG: channel(data, "Catalog "); break; case XML_FROM_C14N: channel(data, "C14N "); break; case XML_FROM_XSLT: channel(data, "XSLT "); break; case XML_FROM_I18N: channel(data, "encoding "); break; case XML_FROM_SCHEMATRONV: channel(data, "schematron "); break; case XML_FROM_BUFFER: channel(data, "internal buffer "); break; case XML_FROM_URI: channel(data, "URI "); break; default: break; } switch (level) { case XML_ERR_NONE: channel(data, ": "); break; case XML_ERR_WARNING: channel(data, "warning : "); break; case XML_ERR_ERROR: channel(data, "error : "); break; case XML_ERR_FATAL: channel(data, "error : "); break; } if (str != NULL) { int len; len = xmlStrlen((const xmlChar *)str); if ((len > 0) && (str[len - 1] != '\n')) channel(data, "%s\n", str); else channel(data, "%s", str); } else { channel(data, "%s\n", "out of memory error"); } if (ctxt != NULL) { xmlParserPrintFileContextInternal(input, channel, data); if (cur != NULL) { if (cur->filename) channel(data, "%s:%d: \n", cur->filename, cur->line); else if ((line != 0) && (domain == XML_FROM_PARSER)) channel(data, "Entity: line %d: \n", cur->line); xmlParserPrintFileContextInternal(cur, channel, data); } } if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) && (err->int1 < 100) && (err->int1 < xmlStrlen((const xmlChar *)err->str1))) { xmlChar buf[150]; int i; channel(data, "%s\n", err->str1); for (i=0;i < err->int1;i++) buf[i] = ' '; buf[i++] = '^'; buf[i] = 0; channel(data, "%s\n", buf); } } /** * __xmlRaiseError: * @schannel: the structured callback channel * @channel: the old callback channel * @data: the callback data * @ctx: the parser context or NULL * @ctx: the parser context or NULL * @domain: the domain for the error * @code: the code for the error * @level: the xmlErrorLevel for the error * @file: the file source of the error (or NULL) * @line: the line of the error or 0 if N/A * @str1: extra string info * @str2: extra string info * @str3: extra string info * @int1: extra int info * @col: column number of the error or 0 if N/A * @msg: the message to display/transmit * @...: extra parameters for the message display * * Update the appropriate global or contextual error structure, * then forward the error message down the parser or generic * error callback handler */ void XMLCDECL __xmlRaiseError(xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel, void *data, void *ctx, void *nod, int domain, int code, xmlErrorLevel level, const char *file, int line, const char *str1, const char *str2, const char *str3, int int1, int col, const char *msg, ...) { xmlParserCtxtPtr ctxt = NULL; xmlNodePtr node = (xmlNodePtr) nod; char *str = NULL; xmlParserInputPtr input = NULL; xmlErrorPtr to = &xmlLastError; xmlNodePtr baseptr = NULL; if (code == XML_ERR_OK) return; if ((xmlGetWarningsDefaultValue == 0) && (level == XML_ERR_WARNING)) return; if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) || (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) || (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) { ctxt = (xmlParserCtxtPtr) ctx; if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC) && (ctxt->sax->serror != NULL)) { schannel = ctxt->sax->serror; data = ctxt->userData; } } /* * Check if structured error handler set */ if (schannel == NULL) { schannel = xmlStructuredError; /* * if user has defined handler, change data ptr to user's choice */ if (schannel != NULL) data = xmlStructuredErrorContext; } /* * Formatting the message */ if (msg == NULL) { str = (char *) xmlStrdup(BAD_CAST "No error message provided"); } else { XML_GET_VAR_STR(msg, str); } /* * specific processing if a parser context is provided */ if (ctxt != NULL) { if (file == NULL) { input = ctxt->input; if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { input = ctxt->inputTab[ctxt->inputNr - 2]; } if (input != NULL) { file = input->filename; line = input->line; col = input->col; } } to = &ctxt->lastError; } else if ((node != NULL) && (file == NULL)) { int i; if ((node->doc != NULL) && (node->doc->URL != NULL)) { baseptr = node; /* file = (const char *) node->doc->URL; */ } for (i = 0; ((i < 10) && (node != NULL) && (node->type != XML_ELEMENT_NODE)); i++) node = node->parent; if ((baseptr == NULL) && (node != NULL) && (node->doc != NULL) && (node->doc->URL != NULL)) baseptr = node; if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) line = node->line; if ((line == 0) || (line == 65535)) line = xmlGetLineNo(node); } /* * Save the information about the error */ xmlResetError(to); to->domain = domain; to->code = code; to->message = str; to->level = level; if (file != NULL) to->file = (char *) xmlStrdup((const xmlChar *) file); else if (baseptr != NULL) { #ifdef LIBXML_XINCLUDE_ENABLED /* * We check if the error is within an XInclude section and, * if so, attempt to print out the href of the XInclude instead * of the usual "base" (doc->URL) for the node (bug 152623). */ xmlNodePtr prev = baseptr; int inclcount = 0; while (prev != NULL) { if (prev->prev == NULL) prev = prev->parent; else { prev = prev->prev; if (prev->type == XML_XINCLUDE_START) { if (--inclcount < 0) break; } else if (prev->type == XML_XINCLUDE_END) inclcount++; } } if (prev != NULL) { if (prev->type == XML_XINCLUDE_START) { prev->type = XML_ELEMENT_NODE; to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); prev->type = XML_XINCLUDE_START; } else { to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); } } else #endif to->file = (char *) xmlStrdup(baseptr->doc->URL); if ((to->file == NULL) && (node != NULL) && (node->doc != NULL)) { to->file = (char *) xmlStrdup(node->doc->URL); } } to->line = line; if (str1 != NULL) to->str1 = (char *) xmlStrdup((const xmlChar *) str1); if (str2 != NULL) to->str2 = (char *) xmlStrdup((const xmlChar *) str2); if (str3 != NULL) to->str3 = (char *) xmlStrdup((const xmlChar *) str3); to->int1 = int1; to->int2 = col; to->node = node; to->ctxt = ctx; if (to != &xmlLastError) xmlCopyError(to,&xmlLastError); if (schannel != NULL) { schannel(data, to); return; } /* * Find the callback channel if channel param is NULL */ if ((ctxt != NULL) && (channel == NULL) && (xmlStructuredError == NULL) && (ctxt->sax != NULL)) { if (level == XML_ERR_WARNING) channel = ctxt->sax->warning; else channel = ctxt->sax->error; data = ctxt->userData; } else if (channel == NULL) { channel = xmlGenericError; if (ctxt != NULL) { data = ctxt; } else { data = xmlGenericErrorContext; } } if (channel == NULL) return; if ((channel == xmlParserError) || (channel == xmlParserWarning) || (channel == xmlParserValidityError) || (channel == xmlParserValidityWarning)) xmlReportError(to, ctxt, str, NULL, NULL); else if ((channel == (xmlGenericErrorFunc) fprintf) || (channel == xmlGenericErrorDefaultFunc)) xmlReportError(to, ctxt, str, channel, data); else channel(data, "%s", str); } /** * __xmlSimpleError: * @domain: where the error comes from * @code: the error code * @node: the context node * @extra: extra informations * * Handle an out of memory condition */ void __xmlSimpleError(int domain, int code, xmlNodePtr node, const char *msg, const char *extra) { if (code == XML_ERR_NO_MEMORY) { if (extra) __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, NULL, NULL, 0, 0, "Memory allocation failed : %s\n", extra); else __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "Memory allocation failed\n"); } else { __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, code, XML_ERR_ERROR, NULL, 0, extra, NULL, NULL, 0, 0, msg, extra); } } /** * xmlParserError: * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Display and format an error messages, gives file, line, position and * extra parameters. */ void XMLCDECL xmlParserError(void *ctx, const char *msg, ...) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlParserInputPtr input = NULL; xmlParserInputPtr cur = NULL; char * str; if (ctxt != NULL) { input = ctxt->input; if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { cur = input; input = ctxt->inputTab[ctxt->inputNr - 2]; } xmlParserPrintFileInfo(input); } xmlGenericError(xmlGenericErrorContext, "error: "); XML_GET_VAR_STR(msg, str); xmlGenericError(xmlGenericErrorContext, "%s", str); if (str != NULL) xmlFree(str); if (ctxt != NULL) { xmlParserPrintFileContext(input); if (cur != NULL) { xmlParserPrintFileInfo(cur); xmlGenericError(xmlGenericErrorContext, "\n"); xmlParserPrintFileContext(cur); } } } /** * xmlParserWarning: * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Display and format a warning messages, gives file, line, position and * extra parameters. */ void XMLCDECL xmlParserWarning(void *ctx, const char *msg, ...) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlParserInputPtr input = NULL; xmlParserInputPtr cur = NULL; char * str; if (ctxt != NULL) { input = ctxt->input; if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { cur = input; input = ctxt->inputTab[ctxt->inputNr - 2]; } xmlParserPrintFileInfo(input); } xmlGenericError(xmlGenericErrorContext, "warning: "); XML_GET_VAR_STR(msg, str); xmlGenericError(xmlGenericErrorContext, "%s", str); if (str != NULL) xmlFree(str); if (ctxt != NULL) { xmlParserPrintFileContext(input); if (cur != NULL) { xmlParserPrintFileInfo(cur); xmlGenericError(xmlGenericErrorContext, "\n"); xmlParserPrintFileContext(cur); } } } /************************************************************************ * * * Handling of validation errors * * * ************************************************************************/ /** * xmlParserValidityError: * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Display and format an validity error messages, gives file, * line, position and extra parameters. */ void XMLCDECL xmlParserValidityError(void *ctx, const char *msg, ...) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlParserInputPtr input = NULL; char * str; int len = xmlStrlen((const xmlChar *) msg); static int had_info = 0; if ((len > 1) && (msg[len - 2] != ':')) { if (ctxt != NULL) { input = ctxt->input; if ((input->filename == NULL) && (ctxt->inputNr > 1)) input = ctxt->inputTab[ctxt->inputNr - 2]; if (had_info == 0) { xmlParserPrintFileInfo(input); } } xmlGenericError(xmlGenericErrorContext, "validity error: "); had_info = 0; } else { had_info = 1; } XML_GET_VAR_STR(msg, str); xmlGenericError(xmlGenericErrorContext, "%s", str); if (str != NULL) xmlFree(str); if ((ctxt != NULL) && (input != NULL)) { xmlParserPrintFileContext(input); } } /** * xmlParserValidityWarning: * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display * * Display and format a validity warning messages, gives file, line, * position and extra parameters. */ void XMLCDECL xmlParserValidityWarning(void *ctx, const char *msg, ...) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlParserInputPtr input = NULL; char * str; int len = xmlStrlen((const xmlChar *) msg); if ((ctxt != NULL) && (len != 0) && (msg[len - 1] != ':')) { input = ctxt->input; if ((input->filename == NULL) && (ctxt->inputNr > 1)) input = ctxt->inputTab[ctxt->inputNr - 2]; xmlParserPrintFileInfo(input); } xmlGenericError(xmlGenericErrorContext, "validity warning: "); XML_GET_VAR_STR(msg, str); xmlGenericError(xmlGenericErrorContext, "%s", str); if (str != NULL) xmlFree(str); if (ctxt != NULL) { xmlParserPrintFileContext(input); } } /************************************************************************ * * * Extended Error Handling * * * ************************************************************************/ /** * xmlGetLastError: * * Get the last global error registered. This is per thread if compiled * with thread support. * * Returns NULL if no error occured or a pointer to the error */ xmlErrorPtr xmlGetLastError(void) { if (xmlLastError.code == XML_ERR_OK) return (NULL); return (&xmlLastError); } /** * xmlResetError: * @err: pointer to the error. * * Cleanup the error. */ void xmlResetError(xmlErrorPtr err) { if (err == NULL) return; if (err->code == XML_ERR_OK) return; if (err->message != NULL) xmlFree(err->message); if (err->file != NULL) xmlFree(err->file); if (err->str1 != NULL) xmlFree(err->str1); if (err->str2 != NULL) xmlFree(err->str2); if (err->str3 != NULL) xmlFree(err->str3); memset(err, 0, sizeof(xmlError)); err->code = XML_ERR_OK; } /** * xmlResetLastError: * * Cleanup the last global error registered. For parsing error * this does not change the well-formedness result. */ void xmlResetLastError(void) { if (xmlLastError.code == XML_ERR_OK) return; xmlResetError(&xmlLastError); } /** * xmlCtxtGetLastError: * @ctx: an XML parser context * * Get the last parsing error registered. * * Returns NULL if no error occured or a pointer to the error */ xmlErrorPtr xmlCtxtGetLastError(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if (ctxt == NULL) return (NULL); if (ctxt->lastError.code == XML_ERR_OK) return (NULL); return (&ctxt->lastError); } /** * xmlCtxtResetLastError: * @ctx: an XML parser context * * Cleanup the last global error registered. For parsing error * this does not change the well-formedness result. */ void xmlCtxtResetLastError(void *ctx) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if (ctxt == NULL) return; ctxt->errNo = XML_ERR_OK; if (ctxt->lastError.code == XML_ERR_OK) return; xmlResetError(&ctxt->lastError); } /** * xmlCopyError: * @from: a source error * @to: a target error * * Save the original error to the new place. * * Returns 0 in case of success and -1 in case of error. */ int xmlCopyError(xmlErrorPtr from, xmlErrorPtr to) { char *message, *file, *str1, *str2, *str3; if ((from == NULL) || (to == NULL)) return(-1); message = (char *) xmlStrdup((xmlChar *) from->message); file = (char *) xmlStrdup ((xmlChar *) from->file); str1 = (char *) xmlStrdup ((xmlChar *) from->str1); str2 = (char *) xmlStrdup ((xmlChar *) from->str2); str3 = (char *) xmlStrdup ((xmlChar *) from->str3); if (to->message != NULL) xmlFree(to->message); if (to->file != NULL) xmlFree(to->file); if (to->str1 != NULL) xmlFree(to->str1); if (to->str2 != NULL) xmlFree(to->str2); if (to->str3 != NULL) xmlFree(to->str3); to->domain = from->domain; to->code = from->code; to->level = from->level; to->line = from->line; to->node = from->node; to->int1 = from->int1; to->int2 = from->int2; to->node = from->node; to->ctxt = from->ctxt; to->message = message; to->file = file; to->str1 = str1; to->str2 = str2; to->str3 = str3; return 0; } #define bottom_error #include "elfgcchack.h" libxml2-2.9.1+dfsg1/AUTHORS0000644000175000017500000000032011234335462013622 0ustar aronaronDaniel Veillard Bjorn Reese William Brack Igor Zlatkovic for the Windows port Aleksey Sanin libxml2-2.9.1+dfsg1/parserInternals.c0000644000175000017500000017130712113312342016075 0ustar aronaron/* * parserInternals.c : Internal routines (and obsolete ones) needed for the * XML and HTML parsers. * * See Copyright for the status of this software. * * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #if defined(WIN32) && !defined (__CYGWIN__) #define XML_DIR_SEP '\\' #else #define XML_DIR_SEP '/' #endif #include #ifdef HAVE_CTYPE_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_ZLIB_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LIBXML_CATALOG_ENABLED #include #endif #include #include #include "buf.h" #include "enc.h" /* * Various global defaults for parsing */ /** * xmlCheckVersion: * @version: the include version number * * check the compiled lib version against the include one. * This can warn or immediately kill the application */ void xmlCheckVersion(int version) { int myversion = (int) LIBXML_VERSION; xmlInitParser(); if ((myversion / 10000) != (version / 10000)) { xmlGenericError(xmlGenericErrorContext, "Fatal: program compiled against libxml %d using libxml %d\n", (version / 10000), (myversion / 10000)); fprintf(stderr, "Fatal: program compiled against libxml %d using libxml %d\n", (version / 10000), (myversion / 10000)); } if ((myversion / 100) < (version / 100)) { xmlGenericError(xmlGenericErrorContext, "Warning: program compiled against libxml %d using older %d\n", (version / 100), (myversion / 100)); } } /************************************************************************ * * * Some factorized error routines * * * ************************************************************************/ /** * xmlErrMemory: * @ctxt: an XML parser context * @extra: extra informations * * Handle a redefinition of attribute error */ void xmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) { ctxt->errNo = XML_ERR_NO_MEMORY; ctxt->instate = XML_PARSER_EOF; ctxt->disableSAX = 1; } if (extra) __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, NULL, NULL, 0, 0, "Memory allocation failed : %s\n", extra); else __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "Memory allocation failed\n"); } /** * __xmlErrEncoding: * @ctxt: an XML parser context * @xmlerr: the error number * @msg: the error message * @str1: an string info * @str2: an string info * * Handle an encoding error */ void __xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr, const char *msg, const xmlChar * str1, const xmlChar * str2) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = xmlerr; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, xmlerr, XML_ERR_FATAL, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, str1, str2); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlErrInternal: * @ctxt: an XML parser context * @msg: the error message * @str: error informations * * Handle an internal error */ static void xmlErrInternal(xmlParserCtxtPtr ctxt, const char *msg, const xmlChar * str) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = XML_ERR_INTERNAL_ERROR; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, NULL, 0, (const char *) str, NULL, NULL, 0, 0, msg, str); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlErrEncodingInt: * @ctxt: an XML parser context * @error: the error number * @msg: the error message * @val: an integer value * * n encoding error */ static void xmlErrEncodingInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg, int val) { if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if (ctxt != NULL) ctxt->errNo = error; __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val); if (ctxt != NULL) { ctxt->wellFormed = 0; if (ctxt->recovery == 0) ctxt->disableSAX = 1; } } /** * xmlIsLetter: * @c: an unicode character (int) * * Check whether the character is allowed by the production * [84] Letter ::= BaseChar | Ideographic * * Returns 0 if not, non-zero otherwise */ int xmlIsLetter(int c) { return(IS_BASECHAR(c) || IS_IDEOGRAPHIC(c)); } /************************************************************************ * * * Input handling functions for progressive parsing * * * ************************************************************************/ /* #define DEBUG_INPUT */ /* #define DEBUG_STACK */ /* #define DEBUG_PUSH */ /* we need to keep enough input to show errors in context */ #define LINE_LEN 80 #ifdef DEBUG_INPUT #define CHECK_BUFFER(in) check_buffer(in) static void check_buffer(xmlParserInputPtr in) { if (in->base != xmlBufContent(in->buf->buffer)) { xmlGenericError(xmlGenericErrorContext, "xmlParserInput: base mismatch problem\n"); } if (in->cur < in->base) { xmlGenericError(xmlGenericErrorContext, "xmlParserInput: cur < base problem\n"); } if (in->cur > in->base + xmlBufUse(in->buf->buffer)) { xmlGenericError(xmlGenericErrorContext, "xmlParserInput: cur > base + use problem\n"); } xmlGenericError(xmlGenericErrorContext,"buffer %x : content %x, cur %d, use %d\n", (int) in, (int) xmlBufContent(in->buf->buffer), in->cur - in->base, xmlBufUse(in->buf->buffer)); } #else #define CHECK_BUFFER(in) #endif /** * xmlParserInputRead: * @in: an XML parser input * @len: an indicative size for the lookahead * * This function was internal and is deprecated. * * Returns -1 as this is an error to use it. */ int xmlParserInputRead(xmlParserInputPtr in ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) { return(-1); } /** * xmlParserInputGrow: * @in: an XML parser input * @len: an indicative size for the lookahead * * This function increase the input for the parser. It tries to * preserve pointers to the input buffer, and keep already read data * * Returns the amount of char read, or -1 in case of error, 0 indicate the * end of this entity */ int xmlParserInputGrow(xmlParserInputPtr in, int len) { size_t ret; size_t indx; const xmlChar *content; if ((in == NULL) || (len < 0)) return(-1); #ifdef DEBUG_INPUT xmlGenericError(xmlGenericErrorContext, "Grow\n"); #endif if (in->buf == NULL) return(-1); if (in->base == NULL) return(-1); if (in->cur == NULL) return(-1); if (in->buf->buffer == NULL) return(-1); CHECK_BUFFER(in); indx = in->cur - in->base; if (xmlBufUse(in->buf->buffer) > (unsigned int) indx + INPUT_CHUNK) { CHECK_BUFFER(in); return(0); } if (in->buf->readcallback != NULL) { ret = xmlParserInputBufferGrow(in->buf, len); } else return(0); /* * NOTE : in->base may be a "dangling" i.e. freed pointer in this * block, but we use it really as an integer to do some * pointer arithmetic. Insure will raise it as a bug but in * that specific case, that's not ! */ content = xmlBufContent(in->buf->buffer); if (in->base != content) { /* * the buffer has been reallocated */ indx = in->cur - in->base; in->base = content; in->cur = &content[indx]; } in->end = xmlBufEnd(in->buf->buffer); CHECK_BUFFER(in); return(ret); } /** * xmlParserInputShrink: * @in: an XML parser input * * This function removes used input for the parser. */ void xmlParserInputShrink(xmlParserInputPtr in) { size_t used; size_t ret; size_t indx; const xmlChar *content; #ifdef DEBUG_INPUT xmlGenericError(xmlGenericErrorContext, "Shrink\n"); #endif if (in == NULL) return; if (in->buf == NULL) return; if (in->base == NULL) return; if (in->cur == NULL) return; if (in->buf->buffer == NULL) return; CHECK_BUFFER(in); used = in->cur - xmlBufContent(in->buf->buffer); /* * Do not shrink on large buffers whose only a tiny fraction * was consumed */ if (used > INPUT_CHUNK) { ret = xmlBufShrink(in->buf->buffer, used - LINE_LEN); if (ret > 0) { in->cur -= ret; in->consumed += ret; } in->end = xmlBufEnd(in->buf->buffer); } CHECK_BUFFER(in); if (xmlBufUse(in->buf->buffer) > INPUT_CHUNK) { return; } xmlParserInputBufferRead(in->buf, 2 * INPUT_CHUNK); content = xmlBufContent(in->buf->buffer); if (in->base != content) { /* * the buffer has been reallocated */ indx = in->cur - in->base; in->base = content; in->cur = &content[indx]; } in->end = xmlBufEnd(in->buf->buffer); CHECK_BUFFER(in); } /************************************************************************ * * * UTF8 character input and related functions * * * ************************************************************************/ /** * xmlNextChar: * @ctxt: the XML parser context * * Skip to the next char input char. */ void xmlNextChar(xmlParserCtxtPtr ctxt) { if ((ctxt == NULL) || (ctxt->instate == XML_PARSER_EOF) || (ctxt->input == NULL)) return; if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { if ((*ctxt->input->cur == 0) && (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0) && (ctxt->instate != XML_PARSER_COMMENT)) { /* * If we are at the end of the current entity and * the context allows it, we pop consumed entities * automatically. * the auto closing should be blocked in other cases */ xmlPopInput(ctxt); } else { const unsigned char *cur; unsigned char c; /* * 2.11 End-of-Line Handling * the literal two-character sequence "#xD#xA" or a standalone * literal #xD, an XML processor must pass to the application * the single character #xA. */ if (*(ctxt->input->cur) == '\n') { ctxt->input->line++; ctxt->input->col = 1; } else ctxt->input->col++; /* * We are supposed to handle UTF8, check it's valid * From rfc2044: encoding of the Unicode values on UTF-8: * * UCS-4 range (hex.) UTF-8 octet sequence (binary) * 0000 0000-0000 007F 0xxxxxxx * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx * * Check for the 0x110000 limit too */ cur = ctxt->input->cur; c = *cur; if (c & 0x80) { if (c == 0xC0) goto encoding_error; if (cur[1] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if ((cur[1] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xe0) == 0xe0) { unsigned int val; if (cur[2] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if ((cur[2] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xf0) == 0xf0) { if (cur[3] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80)) goto encoding_error; /* 4-byte code */ ctxt->input->cur += 4; val = (cur[0] & 0x7) << 18; val |= (cur[1] & 0x3f) << 12; val |= (cur[2] & 0x3f) << 6; val |= cur[3] & 0x3f; } else { /* 3-byte code */ ctxt->input->cur += 3; val = (cur[0] & 0xf) << 12; val |= (cur[1] & 0x3f) << 6; val |= cur[2] & 0x3f; } if (((val > 0xd7ff) && (val < 0xe000)) || ((val > 0xfffd) && (val < 0x10000)) || (val >= 0x110000)) { xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, "Char 0x%X out of allowed range\n", val); } } else /* 2-byte code */ ctxt->input->cur += 2; } else /* 1-byte code */ ctxt->input->cur++; ctxt->nbChars++; if (*ctxt->input->cur == 0) xmlParserInputGrow(ctxt->input, INPUT_CHUNK); } } else { /* * Assume it's a fixed length encoding (1) with * a compatible encoding for the ASCII set, since * XML constructs only use < 128 chars */ if (*(ctxt->input->cur) == '\n') { ctxt->input->line++; ctxt->input->col = 1; } else ctxt->input->col++; ctxt->input->cur++; ctxt->nbChars++; if (*ctxt->input->cur == 0) xmlParserInputGrow(ctxt->input, INPUT_CHUNK); } if ((*ctxt->input->cur == '%') && (!ctxt->html)) xmlParserHandlePEReference(ctxt); if ((*ctxt->input->cur == 0) && (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) xmlPopInput(ctxt); return; encoding_error: /* * If we detect an UTF8 error that probably mean that the * input encoding didn't get properly advertised in the * declaration header. Report the error and switch the encoding * to ISO-Latin-1 (if you don't like this policy, just declare the * encoding !) */ if ((ctxt == NULL) || (ctxt->input == NULL) || (ctxt->input->end - ctxt->input->cur < 4)) { __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, "Input is not proper UTF-8, indicate encoding !\n", NULL, NULL); } else { char buffer[150]; snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", ctxt->input->cur[0], ctxt->input->cur[1], ctxt->input->cur[2], ctxt->input->cur[3]); __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, "Input is not proper UTF-8, indicate encoding !\n%s", BAD_CAST buffer, NULL); } ctxt->charset = XML_CHAR_ENCODING_8859_1; ctxt->input->cur++; return; } /** * xmlCurrentChar: * @ctxt: the XML parser context * @len: pointer to the length of the char read * * The current char value, if using UTF-8 this may actually span multiple * bytes in the input buffer. Implement the end of line normalization: * 2.11 End-of-Line Handling * Wherever an external parsed entity or the literal entity value * of an internal parsed entity contains either the literal two-character * sequence "#xD#xA" or a standalone literal #xD, an XML processor * must pass to the application the single character #xA. * This behavior can conveniently be produced by normalizing all * line breaks to #xA on input, before parsing.) * * Returns the current char value and its length */ int xmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { if ((ctxt == NULL) || (len == NULL) || (ctxt->input == NULL)) return(0); if (ctxt->instate == XML_PARSER_EOF) return(0); if ((*ctxt->input->cur >= 0x20) && (*ctxt->input->cur <= 0x7F)) { *len = 1; return((int) *ctxt->input->cur); } if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { /* * We are supposed to handle UTF8, check it's valid * From rfc2044: encoding of the Unicode values on UTF-8: * * UCS-4 range (hex.) UTF-8 octet sequence (binary) * 0000 0000-0000 007F 0xxxxxxx * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx * * Check for the 0x110000 limit too */ const unsigned char *cur = ctxt->input->cur; unsigned char c; unsigned int val; c = *cur; if (c & 0x80) { if (((c & 0x40) == 0) || (c == 0xC0)) goto encoding_error; if (cur[1] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if ((cur[1] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xe0) == 0xe0) { if (cur[2] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if ((cur[2] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xf0) == 0xf0) { if (cur[3] == 0) { xmlParserInputGrow(ctxt->input, INPUT_CHUNK); cur = ctxt->input->cur; } if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80)) goto encoding_error; /* 4-byte code */ *len = 4; val = (cur[0] & 0x7) << 18; val |= (cur[1] & 0x3f) << 12; val |= (cur[2] & 0x3f) << 6; val |= cur[3] & 0x3f; if (val < 0x10000) goto encoding_error; } else { /* 3-byte code */ *len = 3; val = (cur[0] & 0xf) << 12; val |= (cur[1] & 0x3f) << 6; val |= cur[2] & 0x3f; if (val < 0x800) goto encoding_error; } } else { /* 2-byte code */ *len = 2; val = (cur[0] & 0x1f) << 6; val |= cur[1] & 0x3f; if (val < 0x80) goto encoding_error; } if (!IS_CHAR(val)) { xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, "Char 0x%X out of allowed range\n", val); } return(val); } else { /* 1-byte code */ *len = 1; if (*ctxt->input->cur == 0) xmlParserInputGrow(ctxt->input, INPUT_CHUNK); if ((*ctxt->input->cur == 0) && (ctxt->input->end > ctxt->input->cur)) { xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, "Char 0x0 out of allowed range\n", 0); } if (*ctxt->input->cur == 0xD) { if (ctxt->input->cur[1] == 0xA) { ctxt->nbChars++; ctxt->input->cur++; } return(0xA); } return((int) *ctxt->input->cur); } } /* * Assume it's a fixed length encoding (1) with * a compatible encoding for the ASCII set, since * XML constructs only use < 128 chars */ *len = 1; if (*ctxt->input->cur == 0xD) { if (ctxt->input->cur[1] == 0xA) { ctxt->nbChars++; ctxt->input->cur++; } return(0xA); } return((int) *ctxt->input->cur); encoding_error: /* * An encoding problem may arise from a truncated input buffer * splitting a character in the middle. In that case do not raise * an error but return 0 to endicate an end of stream problem */ if (ctxt->input->end - ctxt->input->cur < 4) { *len = 0; return(0); } /* * If we detect an UTF8 error that probably mean that the * input encoding didn't get properly advertised in the * declaration header. Report the error and switch the encoding * to ISO-Latin-1 (if you don't like this policy, just declare the * encoding !) */ { char buffer[150]; snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", ctxt->input->cur[0], ctxt->input->cur[1], ctxt->input->cur[2], ctxt->input->cur[3]); __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, "Input is not proper UTF-8, indicate encoding !\n%s", BAD_CAST buffer, NULL); } ctxt->charset = XML_CHAR_ENCODING_8859_1; *len = 1; return((int) *ctxt->input->cur); } /** * xmlStringCurrentChar: * @ctxt: the XML parser context * @cur: pointer to the beginning of the char * @len: pointer to the length of the char read * * The current char value, if using UTF-8 this may actually span multiple * bytes in the input buffer. * * Returns the current char value and its length */ int xmlStringCurrentChar(xmlParserCtxtPtr ctxt, const xmlChar * cur, int *len) { if ((len == NULL) || (cur == NULL)) return(0); if ((ctxt == NULL) || (ctxt->charset == XML_CHAR_ENCODING_UTF8)) { /* * We are supposed to handle UTF8, check it's valid * From rfc2044: encoding of the Unicode values on UTF-8: * * UCS-4 range (hex.) UTF-8 octet sequence (binary) * 0000 0000-0000 007F 0xxxxxxx * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx * * Check for the 0x110000 limit too */ unsigned char c; unsigned int val; c = *cur; if (c & 0x80) { if ((cur[1] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xe0) == 0xe0) { if ((cur[2] & 0xc0) != 0x80) goto encoding_error; if ((c & 0xf0) == 0xf0) { if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80)) goto encoding_error; /* 4-byte code */ *len = 4; val = (cur[0] & 0x7) << 18; val |= (cur[1] & 0x3f) << 12; val |= (cur[2] & 0x3f) << 6; val |= cur[3] & 0x3f; } else { /* 3-byte code */ *len = 3; val = (cur[0] & 0xf) << 12; val |= (cur[1] & 0x3f) << 6; val |= cur[2] & 0x3f; } } else { /* 2-byte code */ *len = 2; val = (cur[0] & 0x1f) << 6; val |= cur[1] & 0x3f; } if (!IS_CHAR(val)) { xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, "Char 0x%X out of allowed range\n", val); } return (val); } else { /* 1-byte code */ *len = 1; return ((int) *cur); } } /* * Assume it's a fixed length encoding (1) with * a compatible encoding for the ASCII set, since * XML constructs only use < 128 chars */ *len = 1; return ((int) *cur); encoding_error: /* * An encoding problem may arise from a truncated input buffer * splitting a character in the middle. In that case do not raise * an error but return 0 to endicate an end of stream problem */ if ((ctxt == NULL) || (ctxt->input == NULL) || (ctxt->input->end - ctxt->input->cur < 4)) { *len = 0; return(0); } /* * If we detect an UTF8 error that probably mean that the * input encoding didn't get properly advertised in the * declaration header. Report the error and switch the encoding * to ISO-Latin-1 (if you don't like this policy, just declare the * encoding !) */ { char buffer[150]; snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", ctxt->input->cur[0], ctxt->input->cur[1], ctxt->input->cur[2], ctxt->input->cur[3]); __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, "Input is not proper UTF-8, indicate encoding !\n%s", BAD_CAST buffer, NULL); } *len = 1; return ((int) *cur); } /** * xmlCopyCharMultiByte: * @out: pointer to an array of xmlChar * @val: the char value * * append the char value in the array * * Returns the number of xmlChar written */ int xmlCopyCharMultiByte(xmlChar *out, int val) { if (out == NULL) return(0); /* * We are supposed to handle UTF8, check it's valid * From rfc2044: encoding of the Unicode values on UTF-8: * * UCS-4 range (hex.) UTF-8 octet sequence (binary) * 0000 0000-0000 007F 0xxxxxxx * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx */ if (val >= 0x80) { xmlChar *savedout = out; int bits; if (val < 0x800) { *out++= (val >> 6) | 0xC0; bits= 0; } else if (val < 0x10000) { *out++= (val >> 12) | 0xE0; bits= 6;} else if (val < 0x110000) { *out++= (val >> 18) | 0xF0; bits= 12; } else { xmlErrEncodingInt(NULL, XML_ERR_INVALID_CHAR, "Internal error, xmlCopyCharMultiByte 0x%X out of bound\n", val); return(0); } for ( ; bits >= 0; bits-= 6) *out++= ((val >> bits) & 0x3F) | 0x80 ; return (out - savedout); } *out = (xmlChar) val; return 1; } /** * xmlCopyChar: * @len: Ignored, compatibility * @out: pointer to an array of xmlChar * @val: the char value * * append the char value in the array * * Returns the number of xmlChar written */ int xmlCopyChar(int len ATTRIBUTE_UNUSED, xmlChar *out, int val) { if (out == NULL) return(0); /* the len parameter is ignored */ if (val >= 0x80) { return(xmlCopyCharMultiByte (out, val)); } *out = (xmlChar) val; return 1; } /************************************************************************ * * * Commodity functions to switch encodings * * * ************************************************************************/ static int xmlSwitchToEncodingInt(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler, int len); static int xmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input, xmlCharEncodingHandlerPtr handler, int len); /** * xmlSwitchEncoding: * @ctxt: the parser context * @enc: the encoding value (number) * * change the input functions when discovering the character encoding * of a given entity. * * Returns 0 in case of success, -1 otherwise */ int xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc) { xmlCharEncodingHandlerPtr handler; int len = -1; if (ctxt == NULL) return(-1); switch (enc) { case XML_CHAR_ENCODING_ERROR: __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING, "encoding unknown\n", NULL, NULL); return(-1); case XML_CHAR_ENCODING_NONE: /* let's assume it's UTF-8 without the XML decl */ ctxt->charset = XML_CHAR_ENCODING_UTF8; return(0); case XML_CHAR_ENCODING_UTF8: /* default encoding, no conversion should be needed */ ctxt->charset = XML_CHAR_ENCODING_UTF8; /* * Errata on XML-1.0 June 20 2001 * Specific handling of the Byte Order Mark for * UTF-8 */ if ((ctxt->input != NULL) && (ctxt->input->cur[0] == 0xEF) && (ctxt->input->cur[1] == 0xBB) && (ctxt->input->cur[2] == 0xBF)) { ctxt->input->cur += 3; } return(0); case XML_CHAR_ENCODING_UTF16LE: case XML_CHAR_ENCODING_UTF16BE: /*The raw input characters are encoded *in UTF-16. As we expect this function *to be called after xmlCharEncInFunc, we expect *ctxt->input->cur to contain UTF-8 encoded characters. *So the raw UTF16 Byte Order Mark *has also been converted into *an UTF-8 BOM. Let's skip that BOM. */ if ((ctxt->input != NULL) && (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == 0xEF) && (ctxt->input->cur[1] == 0xBB) && (ctxt->input->cur[2] == 0xBF)) { ctxt->input->cur += 3; } len = 90; break; case XML_CHAR_ENCODING_UCS2: len = 90; break; case XML_CHAR_ENCODING_UCS4BE: case XML_CHAR_ENCODING_UCS4LE: case XML_CHAR_ENCODING_UCS4_2143: case XML_CHAR_ENCODING_UCS4_3412: len = 180; break; case XML_CHAR_ENCODING_EBCDIC: case XML_CHAR_ENCODING_8859_1: case XML_CHAR_ENCODING_8859_2: case XML_CHAR_ENCODING_8859_3: case XML_CHAR_ENCODING_8859_4: case XML_CHAR_ENCODING_8859_5: case XML_CHAR_ENCODING_8859_6: case XML_CHAR_ENCODING_8859_7: case XML_CHAR_ENCODING_8859_8: case XML_CHAR_ENCODING_8859_9: case XML_CHAR_ENCODING_ASCII: case XML_CHAR_ENCODING_2022_JP: case XML_CHAR_ENCODING_SHIFT_JIS: case XML_CHAR_ENCODING_EUC_JP: len = 45; break; } handler = xmlGetCharEncodingHandler(enc); if (handler == NULL) { /* * Default handlers. */ switch (enc) { case XML_CHAR_ENCODING_ASCII: /* default encoding, no conversion should be needed */ ctxt->charset = XML_CHAR_ENCODING_UTF8; return(0); case XML_CHAR_ENCODING_UTF16LE: break; case XML_CHAR_ENCODING_UTF16BE: break; case XML_CHAR_ENCODING_UCS4LE: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "USC4 little endian", NULL); break; case XML_CHAR_ENCODING_UCS4BE: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "USC4 big endian", NULL); break; case XML_CHAR_ENCODING_EBCDIC: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "EBCDIC", NULL); break; case XML_CHAR_ENCODING_UCS4_2143: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "UCS4 2143", NULL); break; case XML_CHAR_ENCODING_UCS4_3412: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "UCS4 3412", NULL); break; case XML_CHAR_ENCODING_UCS2: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "UCS2", NULL); break; case XML_CHAR_ENCODING_8859_1: case XML_CHAR_ENCODING_8859_2: case XML_CHAR_ENCODING_8859_3: case XML_CHAR_ENCODING_8859_4: case XML_CHAR_ENCODING_8859_5: case XML_CHAR_ENCODING_8859_6: case XML_CHAR_ENCODING_8859_7: case XML_CHAR_ENCODING_8859_8: case XML_CHAR_ENCODING_8859_9: /* * We used to keep the internal content in the * document encoding however this turns being unmaintainable * So xmlGetCharEncodingHandler() will return non-null * values for this now. */ if ((ctxt->inputNr == 1) && (ctxt->encoding == NULL) && (ctxt->input != NULL) && (ctxt->input->encoding != NULL)) { ctxt->encoding = xmlStrdup(ctxt->input->encoding); } ctxt->charset = enc; return(0); case XML_CHAR_ENCODING_2022_JP: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "ISO-2022-JP", NULL); break; case XML_CHAR_ENCODING_SHIFT_JIS: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "Shift_JIS", NULL); break; case XML_CHAR_ENCODING_EUC_JP: __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, "encoding not supported %s\n", BAD_CAST "EUC-JP", NULL); break; default: break; } } if (handler == NULL) return(-1); ctxt->charset = XML_CHAR_ENCODING_UTF8; return(xmlSwitchToEncodingInt(ctxt, handler, len)); } /** * xmlSwitchInputEncoding: * @ctxt: the parser context * @input: the input stream * @handler: the encoding handler * @len: the number of bytes to convert for the first line or -1 * * change the input functions when discovering the character encoding * of a given entity. * * Returns 0 in case of success, -1 otherwise */ static int xmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input, xmlCharEncodingHandlerPtr handler, int len) { int nbchars; if (handler == NULL) return (-1); if (input == NULL) return (-1); if (input->buf != NULL) { if (input->buf->encoder != NULL) { /* * Check in case the auto encoding detetection triggered * in already. */ if (input->buf->encoder == handler) return (0); /* * "UTF-16" can be used for both LE and BE if ((!xmlStrncmp(BAD_CAST input->buf->encoder->name, BAD_CAST "UTF-16", 6)) && (!xmlStrncmp(BAD_CAST handler->name, BAD_CAST "UTF-16", 6))) { return(0); } */ /* * Note: this is a bit dangerous, but that's what it * takes to use nearly compatible signature for different * encodings. */ xmlCharEncCloseFunc(input->buf->encoder); input->buf->encoder = handler; return (0); } input->buf->encoder = handler; /* * Is there already some content down the pipe to convert ? */ if (xmlBufIsEmpty(input->buf->buffer) == 0) { int processed; unsigned int use; /* * Specific handling of the Byte Order Mark for * UTF-16 */ if ((handler->name != NULL) && (!strcmp(handler->name, "UTF-16LE") || !strcmp(handler->name, "UTF-16")) && (input->cur[0] == 0xFF) && (input->cur[1] == 0xFE)) { input->cur += 2; } if ((handler->name != NULL) && (!strcmp(handler->name, "UTF-16BE")) && (input->cur[0] == 0xFE) && (input->cur[1] == 0xFF)) { input->cur += 2; } /* * Errata on XML-1.0 June 20 2001 * Specific handling of the Byte Order Mark for * UTF-8 */ if ((handler->name != NULL) && (!strcmp(handler->name, "UTF-8")) && (input->cur[0] == 0xEF) && (input->cur[1] == 0xBB) && (input->cur[2] == 0xBF)) { input->cur += 3; } /* * Shrink the current input buffer. * Move it as the raw buffer and create a new input buffer */ processed = input->cur - input->base; xmlBufShrink(input->buf->buffer, processed); input->buf->raw = input->buf->buffer; input->buf->buffer = xmlBufCreate(); input->buf->rawconsumed = processed; use = xmlBufUse(input->buf->raw); if (ctxt->html) { /* * convert as much as possible of the buffer */ nbchars = xmlCharEncInput(input->buf, 1); } else { /* * convert just enough to get * '' * parsed with the autodetected encoding * into the parser reading buffer. */ nbchars = xmlCharEncFirstLineInput(input->buf, len); } if (nbchars < 0) { xmlErrInternal(ctxt, "switching encoding: encoder error\n", NULL); return (-1); } input->buf->rawconsumed += use - xmlBufUse(input->buf->raw); xmlBufResetInput(input->buf->buffer, input); } return (0); } else if (input->length == 0) { /* * When parsing a static memory array one must know the * size to be able to convert the buffer. */ xmlErrInternal(ctxt, "switching encoding : no input\n", NULL); return (-1); } return (0); } /** * xmlSwitchInputEncoding: * @ctxt: the parser context * @input: the input stream * @handler: the encoding handler * * change the input functions when discovering the character encoding * of a given entity. * * Returns 0 in case of success, -1 otherwise */ int xmlSwitchInputEncoding(xmlParserCtxtPtr ctxt, xmlParserInputPtr input, xmlCharEncodingHandlerPtr handler) { return(xmlSwitchInputEncodingInt(ctxt, input, handler, -1)); } /** * xmlSwitchToEncodingInt: * @ctxt: the parser context * @handler: the encoding handler * @len: the length to convert or -1 * * change the input functions when discovering the character encoding * of a given entity, and convert only @len bytes of the output, this * is needed on auto detect to allows any declared encoding later to * convert the actual content after the xmlDecl * * Returns 0 in case of success, -1 otherwise */ static int xmlSwitchToEncodingInt(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler, int len) { int ret = 0; if (handler != NULL) { if (ctxt->input != NULL) { ret = xmlSwitchInputEncodingInt(ctxt, ctxt->input, handler, len); } else { xmlErrInternal(ctxt, "xmlSwitchToEncoding : no input\n", NULL); return(-1); } /* * The parsing is now done in UTF8 natively */ ctxt->charset = XML_CHAR_ENCODING_UTF8; } else return(-1); return(ret); } /** * xmlSwitchToEncoding: * @ctxt: the parser context * @handler: the encoding handler * * change the input functions when discovering the character encoding * of a given entity. * * Returns 0 in case of success, -1 otherwise */ int xmlSwitchToEncoding(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler) { return (xmlSwitchToEncodingInt(ctxt, handler, -1)); } /************************************************************************ * * * Commodity functions to handle entities processing * * * ************************************************************************/ /** * xmlFreeInputStream: * @input: an xmlParserInputPtr * * Free up an input stream. */ void xmlFreeInputStream(xmlParserInputPtr input) { if (input == NULL) return; if (input->filename != NULL) xmlFree((char *) input->filename); if (input->directory != NULL) xmlFree((char *) input->directory); if (input->encoding != NULL) xmlFree((char *) input->encoding); if (input->version != NULL) xmlFree((char *) input->version); if ((input->free != NULL) && (input->base != NULL)) input->free((xmlChar *) input->base); if (input->buf != NULL) xmlFreeParserInputBuffer(input->buf); xmlFree(input); } /** * xmlNewInputStream: * @ctxt: an XML parser context * * Create a new input stream structure. * * Returns the new input stream or NULL */ xmlParserInputPtr xmlNewInputStream(xmlParserCtxtPtr ctxt) { xmlParserInputPtr input; input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput)); if (input == NULL) { xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); return(NULL); } memset(input, 0, sizeof(xmlParserInput)); input->line = 1; input->col = 1; input->standalone = -1; /* * If the context is NULL the id cannot be initialized, but that * should not happen while parsing which is the situation where * the id is actually needed. */ if (ctxt != NULL) input->id = ctxt->input_id++; return(input); } /** * xmlNewIOInputStream: * @ctxt: an XML parser context * @input: an I/O Input * @enc: the charset encoding if known * * Create a new input stream structure encapsulating the @input into * a stream suitable for the parser. * * Returns the new input stream or NULL */ xmlParserInputPtr xmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input, xmlCharEncoding enc) { xmlParserInputPtr inputStream; if (input == NULL) return(NULL); if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "new input from I/O\n"); inputStream = xmlNewInputStream(ctxt); if (inputStream == NULL) { return(NULL); } inputStream->filename = NULL; inputStream->buf = input; xmlBufResetInput(inputStream->buf->buffer, inputStream); if (enc != XML_CHAR_ENCODING_NONE) { xmlSwitchEncoding(ctxt, enc); } return(inputStream); } /** * xmlNewEntityInputStream: * @ctxt: an XML parser context * @entity: an Entity pointer * * Create a new input stream based on an xmlEntityPtr * * Returns the new input stream or NULL */ xmlParserInputPtr xmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { xmlParserInputPtr input; if (entity == NULL) { xmlErrInternal(ctxt, "xmlNewEntityInputStream entity = NULL\n", NULL); return(NULL); } if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "new input from entity: %s\n", entity->name); if (entity->content == NULL) { switch (entity->etype) { case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: xmlErrInternal(ctxt, "Cannot parse entity %s\n", entity->name); break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: case XML_EXTERNAL_PARAMETER_ENTITY: return(xmlLoadExternalEntity((char *) entity->URI, (char *) entity->ExternalID, ctxt)); case XML_INTERNAL_GENERAL_ENTITY: xmlErrInternal(ctxt, "Internal entity %s without content !\n", entity->name); break; case XML_INTERNAL_PARAMETER_ENTITY: xmlErrInternal(ctxt, "Internal parameter entity %s without content !\n", entity->name); break; case XML_INTERNAL_PREDEFINED_ENTITY: xmlErrInternal(ctxt, "Predefined entity %s without content !\n", entity->name); break; } return(NULL); } input = xmlNewInputStream(ctxt); if (input == NULL) { return(NULL); } if (entity->URI != NULL) input->filename = (char *) xmlStrdup((xmlChar *) entity->URI); input->base = entity->content; input->cur = entity->content; input->length = entity->length; input->end = &entity->content[input->length]; return(input); } /** * xmlNewStringInputStream: * @ctxt: an XML parser context * @buffer: an memory buffer * * Create a new input stream based on a memory buffer. * Returns the new input stream */ xmlParserInputPtr xmlNewStringInputStream(xmlParserCtxtPtr ctxt, const xmlChar *buffer) { xmlParserInputPtr input; if (buffer == NULL) { xmlErrInternal(ctxt, "xmlNewStringInputStream string = NULL\n", NULL); return(NULL); } if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "new fixed input: %.30s\n", buffer); input = xmlNewInputStream(ctxt); if (input == NULL) { xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); return(NULL); } input->base = buffer; input->cur = buffer; input->length = xmlStrlen(buffer); input->end = &buffer[input->length]; return(input); } /** * xmlNewInputFromFile: * @ctxt: an XML parser context * @filename: the filename to use as entity * * Create a new input stream based on a file or an URL. * * Returns the new input stream or NULL in case of error */ xmlParserInputPtr xmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) { xmlParserInputBufferPtr buf; xmlParserInputPtr inputStream; char *directory = NULL; xmlChar *URI = NULL; if (xmlParserDebugEntities) xmlGenericError(xmlGenericErrorContext, "new input from file: %s\n", filename); if (ctxt == NULL) return(NULL); buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); if (buf == NULL) { if (filename == NULL) __xmlLoaderErr(ctxt, "failed to load external entity: NULL filename \n", NULL); else __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", (const char *) filename); return(NULL); } inputStream = xmlNewInputStream(ctxt); if (inputStream == NULL) return(NULL); inputStream->buf = buf; inputStream = xmlCheckHTTPInput(ctxt, inputStream); if (inputStream == NULL) return(NULL); if (inputStream->filename == NULL) URI = xmlStrdup((xmlChar *) filename); else URI = xmlStrdup((xmlChar *) inputStream->filename); directory = xmlParserGetDirectory((const char *) URI); if (inputStream->filename != NULL) xmlFree((char *)inputStream->filename); inputStream->filename = (char *) xmlCanonicPath((const xmlChar *) URI); if (URI != NULL) xmlFree((char *) URI); inputStream->directory = directory; xmlBufResetInput(inputStream->buf->buffer, inputStream); if ((ctxt->directory == NULL) && (directory != NULL)) ctxt->directory = (char *) xmlStrdup((const xmlChar *) directory); return(inputStream); } /************************************************************************ * * * Commodity functions to handle parser contexts * * * ************************************************************************/ /** * xmlInitParserCtxt: * @ctxt: an XML parser context * * Initialize a parser context * * Returns 0 in case of success and -1 in case of error */ int xmlInitParserCtxt(xmlParserCtxtPtr ctxt) { xmlParserInputPtr input; if(ctxt==NULL) { xmlErrInternal(NULL, "Got NULL parser context\n", NULL); return(-1); } xmlDefaultSAXHandlerInit(); if (ctxt->dict == NULL) ctxt->dict = xmlDictCreate(); if (ctxt->dict == NULL) { xmlErrMemory(NULL, "cannot initialize parser context\n"); return(-1); } xmlDictSetLimit(ctxt->dict, XML_MAX_DICTIONARY_LIMIT); if (ctxt->sax == NULL) ctxt->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); if (ctxt->sax == NULL) { xmlErrMemory(NULL, "cannot initialize parser context\n"); return(-1); } else xmlSAXVersion(ctxt->sax, 2); ctxt->maxatts = 0; ctxt->atts = NULL; /* Allocate the Input stack */ if (ctxt->inputTab == NULL) { ctxt->inputTab = (xmlParserInputPtr *) xmlMalloc(5 * sizeof(xmlParserInputPtr)); ctxt->inputMax = 5; } if (ctxt->inputTab == NULL) { xmlErrMemory(NULL, "cannot initialize parser context\n"); ctxt->inputNr = 0; ctxt->inputMax = 0; ctxt->input = NULL; return(-1); } while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ xmlFreeInputStream(input); } ctxt->inputNr = 0; ctxt->input = NULL; ctxt->version = NULL; ctxt->encoding = NULL; ctxt->standalone = -1; ctxt->hasExternalSubset = 0; ctxt->hasPErefs = 0; ctxt->html = 0; ctxt->external = 0; ctxt->instate = XML_PARSER_START; ctxt->token = 0; ctxt->directory = NULL; /* Allocate the Node stack */ if (ctxt->nodeTab == NULL) { ctxt->nodeTab = (xmlNodePtr *) xmlMalloc(10 * sizeof(xmlNodePtr)); ctxt->nodeMax = 10; } if (ctxt->nodeTab == NULL) { xmlErrMemory(NULL, "cannot initialize parser context\n"); ctxt->nodeNr = 0; ctxt->nodeMax = 0; ctxt->node = NULL; ctxt->inputNr = 0; ctxt->inputMax = 0; ctxt->input = NULL; return(-1); } ctxt->nodeNr = 0; ctxt->node = NULL; /* Allocate the Name stack */ if (ctxt->nameTab == NULL) { ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *)); ctxt->nameMax = 10; } if (ctxt->nameTab == NULL) { xmlErrMemory(NULL, "cannot initialize parser context\n"); ctxt->nodeNr = 0; ctxt->nodeMax = 0; ctxt->node = NULL; ctxt->inputNr = 0; ctxt->inputMax = 0; ctxt->input = NULL; ctxt->nameNr = 0; ctxt->nameMax = 0; ctxt->name = NULL; return(-1); } ctxt->nameNr = 0; ctxt->name = NULL; /* Allocate the space stack */ if (ctxt->spaceTab == NULL) { ctxt->spaceTab = (int *) xmlMalloc(10 * sizeof(int)); ctxt->spaceMax = 10; } if (ctxt->spaceTab == NULL) { xmlErrMemory(NULL, "cannot initialize parser context\n"); ctxt->nodeNr = 0; ctxt->nodeMax = 0; ctxt->node = NULL; ctxt->inputNr = 0; ctxt->inputMax = 0; ctxt->input = NULL; ctxt->nameNr = 0; ctxt->nameMax = 0; ctxt->name = NULL; ctxt->spaceNr = 0; ctxt->spaceMax = 0; ctxt->space = NULL; return(-1); } ctxt->spaceNr = 1; ctxt->spaceMax = 10; ctxt->spaceTab[0] = -1; ctxt->space = &ctxt->spaceTab[0]; ctxt->userData = ctxt; ctxt->myDoc = NULL; ctxt->wellFormed = 1; ctxt->nsWellFormed = 1; ctxt->valid = 1; ctxt->loadsubset = xmlLoadExtDtdDefaultValue; ctxt->validate = xmlDoValidityCheckingDefaultValue; ctxt->pedantic = xmlPedanticParserDefaultValue; ctxt->linenumbers = xmlLineNumbersDefaultValue; ctxt->keepBlanks = xmlKeepBlanksDefaultValue; if (ctxt->keepBlanks == 0) ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0; ctxt->vctxt.userData = ctxt; ctxt->vctxt.error = xmlParserValidityError; ctxt->vctxt.warning = xmlParserValidityWarning; if (ctxt->validate) { if (xmlGetWarningsDefaultValue == 0) ctxt->vctxt.warning = NULL; else ctxt->vctxt.warning = xmlParserValidityWarning; ctxt->vctxt.nodeMax = 0; } ctxt->replaceEntities = xmlSubstituteEntitiesDefaultValue; ctxt->record_info = 0; ctxt->nbChars = 0; ctxt->checkIndex = 0; ctxt->inSubset = 0; ctxt->errNo = XML_ERR_OK; ctxt->depth = 0; ctxt->charset = XML_CHAR_ENCODING_UTF8; ctxt->catalogs = NULL; ctxt->nbentities = 0; ctxt->sizeentities = 0; ctxt->sizeentcopy = 0; ctxt->input_id = 1; xmlInitNodeInfoSeq(&ctxt->node_seq); return(0); } /** * xmlFreeParserCtxt: * @ctxt: an XML parser context * * Free all the memory used by a parser context. However the parsed * document in ctxt->myDoc is not freed. */ void xmlFreeParserCtxt(xmlParserCtxtPtr ctxt) { xmlParserInputPtr input; if (ctxt == NULL) return; while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ xmlFreeInputStream(input); } if (ctxt->spaceTab != NULL) xmlFree(ctxt->spaceTab); if (ctxt->nameTab != NULL) xmlFree((xmlChar * *)ctxt->nameTab); if (ctxt->nodeTab != NULL) xmlFree(ctxt->nodeTab); if (ctxt->nodeInfoTab != NULL) xmlFree(ctxt->nodeInfoTab); if (ctxt->inputTab != NULL) xmlFree(ctxt->inputTab); if (ctxt->version != NULL) xmlFree((char *) ctxt->version); if (ctxt->encoding != NULL) xmlFree((char *) ctxt->encoding); if (ctxt->extSubURI != NULL) xmlFree((char *) ctxt->extSubURI); if (ctxt->extSubSystem != NULL) xmlFree((char *) ctxt->extSubSystem); #ifdef LIBXML_SAX1_ENABLED if ((ctxt->sax != NULL) && (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler)) #else if (ctxt->sax != NULL) #endif /* LIBXML_SAX1_ENABLED */ xmlFree(ctxt->sax); if (ctxt->directory != NULL) xmlFree((char *) ctxt->directory); if (ctxt->vctxt.nodeTab != NULL) xmlFree(ctxt->vctxt.nodeTab); if (ctxt->atts != NULL) xmlFree((xmlChar * *)ctxt->atts); if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); if (ctxt->nsTab != NULL) xmlFree((char *) ctxt->nsTab); if (ctxt->pushTab != NULL) xmlFree(ctxt->pushTab); if (ctxt->attallocs != NULL) xmlFree(ctxt->attallocs); if (ctxt->attsDefault != NULL) xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); if (ctxt->attsSpecial != NULL) xmlHashFree(ctxt->attsSpecial, NULL); if (ctxt->freeElems != NULL) { xmlNodePtr cur, next; cur = ctxt->freeElems; while (cur != NULL) { next = cur->next; xmlFree(cur); cur = next; } } if (ctxt->freeAttrs != NULL) { xmlAttrPtr cur, next; cur = ctxt->freeAttrs; while (cur != NULL) { next = cur->next; xmlFree(cur); cur = next; } } /* * cleanup the error strings */ if (ctxt->lastError.message != NULL) xmlFree(ctxt->lastError.message); if (ctxt->lastError.file != NULL) xmlFree(ctxt->lastError.file); if (ctxt->lastError.str1 != NULL) xmlFree(ctxt->lastError.str1); if (ctxt->lastError.str2 != NULL) xmlFree(ctxt->lastError.str2); if (ctxt->lastError.str3 != NULL) xmlFree(ctxt->lastError.str3); #ifdef LIBXML_CATALOG_ENABLED if (ctxt->catalogs != NULL) xmlCatalogFreeLocal(ctxt->catalogs); #endif xmlFree(ctxt); } /** * xmlNewParserCtxt: * * Allocate and initialize a new parser context. * * Returns the xmlParserCtxtPtr or NULL */ xmlParserCtxtPtr xmlNewParserCtxt(void) { xmlParserCtxtPtr ctxt; ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt)); if (ctxt == NULL) { xmlErrMemory(NULL, "cannot allocate parser context\n"); return(NULL); } memset(ctxt, 0, sizeof(xmlParserCtxt)); if (xmlInitParserCtxt(ctxt) < 0) { xmlFreeParserCtxt(ctxt); return(NULL); } return(ctxt); } /************************************************************************ * * * Handling of node informations * * * ************************************************************************/ /** * xmlClearParserCtxt: * @ctxt: an XML parser context * * Clear (release owned resources) and reinitialize a parser context */ void xmlClearParserCtxt(xmlParserCtxtPtr ctxt) { if (ctxt==NULL) return; xmlClearNodeInfoSeq(&ctxt->node_seq); xmlCtxtReset(ctxt); } /** * xmlParserFindNodeInfo: * @ctx: an XML parser context * @node: an XML node within the tree * * Find the parser node info struct for a given node * * Returns an xmlParserNodeInfo block pointer or NULL */ const xmlParserNodeInfo * xmlParserFindNodeInfo(const xmlParserCtxtPtr ctx, const xmlNodePtr node) { unsigned long pos; if ((ctx == NULL) || (node == NULL)) return (NULL); /* Find position where node should be at */ pos = xmlParserFindNodeInfoIndex(&ctx->node_seq, node); if (pos < ctx->node_seq.length && ctx->node_seq.buffer[pos].node == node) return &ctx->node_seq.buffer[pos]; else return NULL; } /** * xmlInitNodeInfoSeq: * @seq: a node info sequence pointer * * -- Initialize (set to initial state) node info sequence */ void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq) { if (seq == NULL) return; seq->length = 0; seq->maximum = 0; seq->buffer = NULL; } /** * xmlClearNodeInfoSeq: * @seq: a node info sequence pointer * * -- Clear (release memory and reinitialize) node * info sequence */ void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq) { if (seq == NULL) return; if (seq->buffer != NULL) xmlFree(seq->buffer); xmlInitNodeInfoSeq(seq); } /** * xmlParserFindNodeInfoIndex: * @seq: a node info sequence pointer * @node: an XML node pointer * * * xmlParserFindNodeInfoIndex : Find the index that the info record for * the given node is or should be at in a sorted sequence * * Returns a long indicating the position of the record */ unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq, const xmlNodePtr node) { unsigned long upper, lower, middle; int found = 0; if ((seq == NULL) || (node == NULL)) return ((unsigned long) -1); /* Do a binary search for the key */ lower = 1; upper = seq->length; middle = 0; while (lower <= upper && !found) { middle = lower + (upper - lower) / 2; if (node == seq->buffer[middle - 1].node) found = 1; else if (node < seq->buffer[middle - 1].node) upper = middle - 1; else lower = middle + 1; } /* Return position */ if (middle == 0 || seq->buffer[middle - 1].node < node) return middle; else return middle - 1; } /** * xmlParserAddNodeInfo: * @ctxt: an XML parser context * @info: a node info sequence pointer * * Insert node info record into the sorted sequence */ void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt, const xmlParserNodeInfoPtr info) { unsigned long pos; if ((ctxt == NULL) || (info == NULL)) return; /* Find pos and check to see if node is already in the sequence */ pos = xmlParserFindNodeInfoIndex(&ctxt->node_seq, (xmlNodePtr) info->node); if ((pos < ctxt->node_seq.length) && (ctxt->node_seq.buffer != NULL) && (ctxt->node_seq.buffer[pos].node == info->node)) { ctxt->node_seq.buffer[pos] = *info; } /* Otherwise, we need to add new node to buffer */ else { if (ctxt->node_seq.length + 1 > ctxt->node_seq.maximum) { xmlParserNodeInfo *tmp_buffer; unsigned int byte_size; if (ctxt->node_seq.maximum == 0) ctxt->node_seq.maximum = 2; byte_size = (sizeof(*ctxt->node_seq.buffer) * (2 * ctxt->node_seq.maximum)); if (ctxt->node_seq.buffer == NULL) tmp_buffer = (xmlParserNodeInfo *) xmlMalloc(byte_size); else tmp_buffer = (xmlParserNodeInfo *) xmlRealloc(ctxt->node_seq.buffer, byte_size); if (tmp_buffer == NULL) { xmlErrMemory(ctxt, "failed to allocate buffer\n"); return; } ctxt->node_seq.buffer = tmp_buffer; ctxt->node_seq.maximum *= 2; } /* If position is not at end, move elements out of the way */ if (pos != ctxt->node_seq.length) { unsigned long i; for (i = ctxt->node_seq.length; i > pos; i--) ctxt->node_seq.buffer[i] = ctxt->node_seq.buffer[i - 1]; } /* Copy element and increase length */ ctxt->node_seq.buffer[pos] = *info; ctxt->node_seq.length++; } } /************************************************************************ * * * Defaults settings * * * ************************************************************************/ /** * xmlPedanticParserDefault: * @val: int 0 or 1 * * Set and return the previous value for enabling pedantic warnings. * * Returns the last value for 0 for no substitution, 1 for substitution. */ int xmlPedanticParserDefault(int val) { int old = xmlPedanticParserDefaultValue; xmlPedanticParserDefaultValue = val; return(old); } /** * xmlLineNumbersDefault: * @val: int 0 or 1 * * Set and return the previous value for enabling line numbers in elements * contents. This may break on old application and is turned off by default. * * Returns the last value for 0 for no substitution, 1 for substitution. */ int xmlLineNumbersDefault(int val) { int old = xmlLineNumbersDefaultValue; xmlLineNumbersDefaultValue = val; return(old); } /** * xmlSubstituteEntitiesDefault: * @val: int 0 or 1 * * Set and return the previous value for default entity support. * Initially the parser always keep entity references instead of substituting * entity values in the output. This function has to be used to change the * default parser behavior * SAX::substituteEntities() has to be used for changing that on a file by * file basis. * * Returns the last value for 0 for no substitution, 1 for substitution. */ int xmlSubstituteEntitiesDefault(int val) { int old = xmlSubstituteEntitiesDefaultValue; xmlSubstituteEntitiesDefaultValue = val; return(old); } /** * xmlKeepBlanksDefault: * @val: int 0 or 1 * * Set and return the previous value for default blanks text nodes support. * The 1.x version of the parser used an heuristic to try to detect * ignorable white spaces. As a result the SAX callback was generating * xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when * using the DOM output text nodes containing those blanks were not generated. * The 2.x and later version will switch to the XML standard way and * ignorableWhitespace() are only generated when running the parser in * validating mode and when the current element doesn't allow CDATA or * mixed content. * This function is provided as a way to force the standard behavior * on 1.X libs and to switch back to the old mode for compatibility when * running 1.X client code on 2.X . Upgrade of 1.X code should be done * by using xmlIsBlankNode() commodity function to detect the "empty" * nodes generated. * This value also affect autogeneration of indentation when saving code * if blanks sections are kept, indentation is not generated. * * Returns the last value for 0 for no substitution, 1 for substitution. */ int xmlKeepBlanksDefault(int val) { int old = xmlKeepBlanksDefaultValue; xmlKeepBlanksDefaultValue = val; if (!val) xmlIndentTreeOutput = 1; return(old); } #define bottom_parserInternals #include "elfgcchack.h" libxml2-2.9.1+dfsg1/check-xsddata-test-suite.py0000755000175000017500000002467212113312340017741 0ustar aronaron#!/usr/bin/python import sys import time import os import string import StringIO sys.path.insert(0, "python") import libxml2 # Memory debug specific libxml2.debugMemory(1) debug = 0 verbose = 0 quiet = 1 # # the testsuite description # CONF=os.path.join(os.path.dirname(__file__), "test/xsdtest/xsdtestsuite.xml") LOG="check-xsddata-test-suite.log" log = open(LOG, "w") nb_schemas_tests = 0 nb_schemas_success = 0 nb_schemas_failed = 0 nb_instances_tests = 0 nb_instances_success = 0 nb_instances_failed = 0 libxml2.lineNumbersDefault(1) # # Error and warnng callbacks # def callback(ctx, str): global log log.write("%s%s" % (ctx, str)) libxml2.registerErrorHandler(callback, "") # # Resolver callback # resources = {} def resolver(URL, ID, ctxt): global resources if resources.has_key(URL): return(StringIO.StringIO(resources[URL])) log.write("Resolver failure: asked %s\n" % (URL)) log.write("resources: %s\n" % (resources)) return None # # handle a valid instance # def handle_valid(node, schema): global log global nb_instances_success global nb_instances_failed instance = node.prop("dtd") if instance == None: instance = "" child = node.children while child != None: if child.type != 'text': instance = instance + child.serialize() child = child.next mem = libxml2.debugMemory(1); try: doc = libxml2.parseDoc(instance) except: doc = None if doc == None: log.write("\nFailed to parse correct instance:\n-----\n") log.write(instance) log.write("\n-----\n") nb_instances_failed = nb_instances_failed + 1 return if debug: print "instance line %d" % (node.lineNo()) try: ctxt = schema.relaxNGNewValidCtxt() ret = doc.relaxNGValidateDoc(ctxt) del ctxt except: ret = -1 doc.freeDoc() if mem != libxml2.debugMemory(1): print "validating instance %d line %d leaks" % ( nb_instances_tests, node.lineNo()) if ret != 0: log.write("\nFailed to validate correct instance:\n-----\n") log.write(instance) log.write("\n-----\n") nb_instances_failed = nb_instances_failed + 1 else: nb_instances_success = nb_instances_success + 1 # # handle an invalid instance # def handle_invalid(node, schema): global log global nb_instances_success global nb_instances_failed instance = node.prop("dtd") if instance == None: instance = "" child = node.children while child != None: if child.type != 'text': instance = instance + child.serialize() child = child.next # mem = libxml2.debugMemory(1); try: doc = libxml2.parseDoc(instance) except: doc = None if doc == None: log.write("\nStrange: failed to parse incorrect instance:\n-----\n") log.write(instance) log.write("\n-----\n") return if debug: print "instance line %d" % (node.lineNo()) try: ctxt = schema.relaxNGNewValidCtxt() ret = doc.relaxNGValidateDoc(ctxt) del ctxt except: ret = -1 doc.freeDoc() # if mem != libxml2.debugMemory(1): # print "validating instance %d line %d leaks" % ( # nb_instances_tests, node.lineNo()) if ret == 0: log.write("\nFailed to detect validation problem in instance:\n-----\n") log.write(instance) log.write("\n-----\n") nb_instances_failed = nb_instances_failed + 1 else: nb_instances_success = nb_instances_success + 1 # # handle an incorrect test # def handle_correct(node): global log global nb_schemas_success global nb_schemas_failed schema = "" child = node.children while child != None: if child.type != 'text': schema = schema + child.serialize() child = child.next try: rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) rngs = rngp.relaxNGParse() except: rngs = None if rngs == None: log.write("\nFailed to compile correct schema:\n-----\n") log.write(schema) log.write("\n-----\n") nb_schemas_failed = nb_schemas_failed + 1 else: nb_schemas_success = nb_schemas_success + 1 return rngs def handle_incorrect(node): global log global nb_schemas_success global nb_schemas_failed schema = "" child = node.children while child != None: if child.type != 'text': schema = schema + child.serialize() child = child.next try: rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) rngs = rngp.relaxNGParse() except: rngs = None if rngs != None: log.write("\nFailed to detect schema error in:\n-----\n") log.write(schema) log.write("\n-----\n") nb_schemas_failed = nb_schemas_failed + 1 else: # log.write("\nSuccess detecting schema error in:\n-----\n") # log.write(schema) # log.write("\n-----\n") nb_schemas_success = nb_schemas_success + 1 return None # # resource handling: keep a dictionary of URL->string mappings # def handle_resource(node, dir): global resources try: name = node.prop('name') except: name = None if name == None or name == '': log.write("resource has no name") return; if dir != None: # name = libxml2.buildURI(name, dir) name = dir + '/' + name res = "" child = node.children while child != None: if child.type != 'text': res = res + child.serialize() child = child.next resources[name] = res # # dir handling: pseudo directory resources # def handle_dir(node, dir): try: name = node.prop('name') except: name = None if name == None or name == '': log.write("resource has no name") return; if dir != None: # name = libxml2.buildURI(name, dir) name = dir + '/' + name dirs = node.xpathEval('dir') for dir in dirs: handle_dir(dir, name) res = node.xpathEval('resource') for r in res: handle_resource(r, name) # # handle a testCase element # def handle_testCase(node): global nb_schemas_tests global nb_instances_tests global resources sections = node.xpathEval('string(section)') log.write("\n ======== test %d line %d section %s ==========\n" % ( nb_schemas_tests, node.lineNo(), sections)) resources = {} if debug: print "test %d line %d" % (nb_schemas_tests, node.lineNo()) dirs = node.xpathEval('dir') for dir in dirs: handle_dir(dir, None) res = node.xpathEval('resource') for r in res: handle_resource(r, None) tsts = node.xpathEval('incorrect') if tsts != []: if len(tsts) != 1: print "warning test line %d has more than one example" %(node.lineNo()) schema = handle_incorrect(tsts[0]) else: tsts = node.xpathEval('correct') if tsts != []: if len(tsts) != 1: print "warning test line %d has more than one example"% (node.lineNo()) schema = handle_correct(tsts[0]) else: print "warning line %d has no nor child" % (node.lineNo()) nb_schemas_tests = nb_schemas_tests + 1; valids = node.xpathEval('valid') invalids = node.xpathEval('invalid') nb_instances_tests = nb_instances_tests + len(valids) + len(invalids) if schema != None: for valid in valids: handle_valid(valid, schema) for invalid in invalids: handle_invalid(invalid, schema) # # handle a testSuite element # def handle_testSuite(node, level = 0): global nb_schemas_tests, nb_schemas_success, nb_schemas_failed global nb_instances_tests, nb_instances_success, nb_instances_failed if verbose and level >= 0: old_schemas_tests = nb_schemas_tests old_schemas_success = nb_schemas_success old_schemas_failed = nb_schemas_failed old_instances_tests = nb_instances_tests old_instances_success = nb_instances_success old_instances_failed = nb_instances_failed docs = node.xpathEval('documentation') authors = node.xpathEval('author') if docs != []: msg = "" for doc in docs: msg = msg + doc.content + " " if authors != []: msg = msg + "written by " for author in authors: msg = msg + author.content + " " if quiet == 0: print msg sections = node.xpathEval('section') if verbose and sections != [] and level <= 0: msg = "" for section in sections: msg = msg + section.content + " " if quiet == 0: print "Tests for section %s" % (msg) for test in node.xpathEval('testCase'): handle_testCase(test) for test in node.xpathEval('testSuite'): handle_testSuite(test, level + 1) if verbose and level >= 0 : if sections != []: msg = "" for section in sections: msg = msg + section.content + " " print "Result of tests for section %s" % (msg) elif docs != []: msg = "" for doc in docs: msg = msg + doc.content + " " print "Result of tests for %s" % (msg) if nb_schemas_tests != old_schemas_tests: print "found %d test schemas: %d success %d failures" % ( nb_schemas_tests - old_schemas_tests, nb_schemas_success - old_schemas_success, nb_schemas_failed - old_schemas_failed) if nb_instances_tests != old_instances_tests: print "found %d test instances: %d success %d failures" % ( nb_instances_tests - old_instances_tests, nb_instances_success - old_instances_success, nb_instances_failed - old_instances_failed) # # Parse the conf file # libxml2.substituteEntitiesDefault(1); testsuite = libxml2.parseFile(CONF) # # Error and warnng callbacks # def callback(ctx, str): global log log.write("%s%s" % (ctx, str)) libxml2.registerErrorHandler(callback, "") libxml2.setEntityLoader(resolver) root = testsuite.getRootElement() if root.name != 'testSuite': print "%s doesn't start with a testSuite element, aborting" % (CONF) sys.exit(1) if quiet == 0: print "Running Relax NG testsuite" handle_testSuite(root) if quiet == 0 or nb_schemas_failed != 0: print "\nTOTAL:\nfound %d test schemas: %d success %d failures" % ( nb_schemas_tests, nb_schemas_success, nb_schemas_failed) if quiet == 0 or nb_instances_failed != 0: print "found %d test instances: %d success %d failures" % ( nb_instances_tests, nb_instances_success, nb_instances_failed) testsuite.freeDoc() # Memory debug specific libxml2.relaxNGCleanupTypes() libxml2.cleanupParser() if libxml2.debugMemory(1) == 0: if quiet == 0: print "OK" else: print "Memory leak %d bytes" % (libxml2.debugMemory(1)) libxml2.dumpMemory() libxml2-2.9.1+dfsg1/xmlschemastypes.c0000644000175000017500000053046712113312344016162 0ustar aronaron/* * schemastypes.c : implementation of the XML Schema Datatypes * definition and validity checking * * See Copyright for the status of this software. * * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_SCHEMAS_ENABLED #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_MATH_H #include #endif #ifdef HAVE_FLOAT_H #include #endif #define DEBUG #ifndef LIBXML_XPATH_ENABLED extern double xmlXPathNAN; extern double xmlXPathPINF; extern double xmlXPathNINF; #endif #define TODO \ xmlGenericError(xmlGenericErrorContext, \ "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); #define XML_SCHEMAS_NAMESPACE_NAME \ (const xmlChar *)"http://www.w3.org/2001/XMLSchema" #define IS_WSP_REPLACE_CH(c) ((((c) == 0x9) || ((c) == 0xa)) || \ ((c) == 0xd)) #define IS_WSP_SPACE_CH(c) ((c) == 0x20) #define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c) /* Date value */ typedef struct _xmlSchemaValDate xmlSchemaValDate; typedef xmlSchemaValDate *xmlSchemaValDatePtr; struct _xmlSchemaValDate { long year; unsigned int mon :4; /* 1 <= mon <= 12 */ unsigned int day :5; /* 1 <= day <= 31 */ unsigned int hour :5; /* 0 <= hour <= 23 */ unsigned int min :6; /* 0 <= min <= 59 */ double sec; unsigned int tz_flag :1; /* is tzo explicitely set? */ signed int tzo :12; /* -1440 <= tzo <= 1440; currently only -840 to +840 are needed */ }; /* Duration value */ typedef struct _xmlSchemaValDuration xmlSchemaValDuration; typedef xmlSchemaValDuration *xmlSchemaValDurationPtr; struct _xmlSchemaValDuration { long mon; /* mon stores years also */ long day; double sec; /* sec stores min and hour also */ }; typedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; typedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; struct _xmlSchemaValDecimal { /* would use long long but not portable */ unsigned long lo; unsigned long mi; unsigned long hi; unsigned int extra; unsigned int sign:1; unsigned int frac:7; unsigned int total:8; }; typedef struct _xmlSchemaValQName xmlSchemaValQName; typedef xmlSchemaValQName *xmlSchemaValQNamePtr; struct _xmlSchemaValQName { xmlChar *name; xmlChar *uri; }; typedef struct _xmlSchemaValHex xmlSchemaValHex; typedef xmlSchemaValHex *xmlSchemaValHexPtr; struct _xmlSchemaValHex { xmlChar *str; unsigned int total; }; typedef struct _xmlSchemaValBase64 xmlSchemaValBase64; typedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr; struct _xmlSchemaValBase64 { xmlChar *str; unsigned int total; }; struct _xmlSchemaVal { xmlSchemaValType type; struct _xmlSchemaVal *next; union { xmlSchemaValDecimal decimal; xmlSchemaValDate date; xmlSchemaValDuration dur; xmlSchemaValQName qname; xmlSchemaValHex hex; xmlSchemaValBase64 base64; float f; double d; int b; xmlChar *str; } value; }; static int xmlSchemaTypesInitialized = 0; static xmlHashTablePtr xmlSchemaTypesBank = NULL; /* * Basic types */ static xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL; /* * Derived types */ static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL; static xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL; /************************************************************************ * * * Datatype error handlers * * * ************************************************************************/ /** * xmlSchemaTypeErrMemory: * @extra: extra informations * * Handle an out of memory condition */ static void xmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra) { __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra); } /************************************************************************ * * * Base types support * * * ************************************************************************/ /** * xmlSchemaNewValue: * @type: the value type * * Allocate a new simple type value * * Returns a pointer to the new value or NULL in case of error */ static xmlSchemaValPtr xmlSchemaNewValue(xmlSchemaValType type) { xmlSchemaValPtr value; value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); if (value == NULL) { return(NULL); } memset(value, 0, sizeof(xmlSchemaVal)); value->type = type; return(value); } static xmlSchemaFacetPtr xmlSchemaNewMinLengthFacet(int value) { xmlSchemaFacetPtr ret; ret = xmlSchemaNewFacet(); if (ret == NULL) { return(NULL); } ret->type = XML_SCHEMA_FACET_MINLENGTH; ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER); ret->val->value.decimal.lo = value; return (ret); } /* * xmlSchemaInitBasicType: * @name: the type name * @type: the value type associated * * Initialize one primitive built-in type */ static xmlSchemaTypePtr xmlSchemaInitBasicType(const char *name, xmlSchemaValType type, xmlSchemaTypePtr baseType) { xmlSchemaTypePtr ret; ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); if (ret == NULL) { xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); return(NULL); } memset(ret, 0, sizeof(xmlSchemaType)); ret->name = (const xmlChar *)name; ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME; ret->type = XML_SCHEMA_TYPE_BASIC; ret->baseType = baseType; ret->contentType = XML_SCHEMA_CONTENT_BASIC; /* * Primitive types. */ switch (type) { case XML_SCHEMAS_STRING: case XML_SCHEMAS_DECIMAL: case XML_SCHEMAS_DATE: case XML_SCHEMAS_DATETIME: case XML_SCHEMAS_TIME: case XML_SCHEMAS_GYEAR: case XML_SCHEMAS_GYEARMONTH: case XML_SCHEMAS_GMONTH: case XML_SCHEMAS_GMONTHDAY: case XML_SCHEMAS_GDAY: case XML_SCHEMAS_DURATION: case XML_SCHEMAS_FLOAT: case XML_SCHEMAS_DOUBLE: case XML_SCHEMAS_BOOLEAN: case XML_SCHEMAS_ANYURI: case XML_SCHEMAS_HEXBINARY: case XML_SCHEMAS_BASE64BINARY: case XML_SCHEMAS_QNAME: case XML_SCHEMAS_NOTATION: ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; break; default: break; } /* * Set variety. */ switch (type) { case XML_SCHEMAS_ANYTYPE: case XML_SCHEMAS_ANYSIMPLETYPE: break; case XML_SCHEMAS_IDREFS: case XML_SCHEMAS_NMTOKENS: case XML_SCHEMAS_ENTITIES: ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; ret->facets = xmlSchemaNewMinLengthFacet(1); ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; break; default: ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; break; } xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, XML_SCHEMAS_NAMESPACE_NAME, ret); ret->builtInType = type; return(ret); } /* * WARNING: Those type reside normally in xmlschemas.c but are * redefined here locally in oder of being able to use them for xs:anyType- * TODO: Remove those definition if we move the types to a header file. * TODO: Always keep those structs up-to-date with the originals. */ #define UNBOUNDED (1 << 30) typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; struct _xmlSchemaTreeItem { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; xmlSchemaTreeItemPtr next; xmlSchemaTreeItemPtr children; }; typedef struct _xmlSchemaParticle xmlSchemaParticle; typedef xmlSchemaParticle *xmlSchemaParticlePtr; struct _xmlSchemaParticle { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; xmlSchemaTreeItemPtr next; xmlSchemaTreeItemPtr children; int minOccurs; int maxOccurs; xmlNodePtr node; }; typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; struct _xmlSchemaModelGroup { xmlSchemaTypeType type; xmlSchemaAnnotPtr annot; xmlSchemaTreeItemPtr next; xmlSchemaTreeItemPtr children; xmlNodePtr node; }; static xmlSchemaParticlePtr xmlSchemaAddParticle(void) { xmlSchemaParticlePtr ret = NULL; ret = (xmlSchemaParticlePtr) xmlMalloc(sizeof(xmlSchemaParticle)); if (ret == NULL) { xmlSchemaTypeErrMemory(NULL, "allocating particle component"); return (NULL); } memset(ret, 0, sizeof(xmlSchemaParticle)); ret->type = XML_SCHEMA_TYPE_PARTICLE; ret->minOccurs = 1; ret->maxOccurs = 1; return (ret); } /* * xmlSchemaInitTypes: * * Initialize the default XML Schemas type library */ void xmlSchemaInitTypes(void) { if (xmlSchemaTypesInitialized != 0) return; xmlSchemaTypesBank = xmlHashCreate(40); /* * 3.4.7 Built-in Complex Type Definition */ xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", XML_SCHEMAS_ANYTYPE, NULL); xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; /* * Init the content type. */ xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; { xmlSchemaParticlePtr particle; xmlSchemaModelGroupPtr sequence; xmlSchemaWildcardPtr wild; /* First particle. */ particle = xmlSchemaAddParticle(); if (particle == NULL) return; xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle; /* Sequence model group. */ sequence = (xmlSchemaModelGroupPtr) xmlMalloc(sizeof(xmlSchemaModelGroup)); if (sequence == NULL) { xmlSchemaTypeErrMemory(NULL, "allocating model group component"); return; } memset(sequence, 0, sizeof(xmlSchemaModelGroup)); sequence->type = XML_SCHEMA_TYPE_SEQUENCE; particle->children = (xmlSchemaTreeItemPtr) sequence; /* Second particle. */ particle = xmlSchemaAddParticle(); if (particle == NULL) return; particle->minOccurs = 0; particle->maxOccurs = UNBOUNDED; sequence->children = (xmlSchemaTreeItemPtr) particle; /* The wildcard */ wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); if (wild == NULL) { xmlSchemaTypeErrMemory(NULL, "allocating wildcard component"); return; } memset(wild, 0, sizeof(xmlSchemaWildcard)); wild->type = XML_SCHEMA_TYPE_ANY; wild->any = 1; wild->processContents = XML_SCHEMAS_ANY_LAX; particle->children = (xmlSchemaTreeItemPtr) wild; /* * Create the attribute wildcard. */ wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); if (wild == NULL) { xmlSchemaTypeErrMemory(NULL, "could not create an attribute " "wildcard on anyType"); return; } memset(wild, 0, sizeof(xmlSchemaWildcard)); wild->any = 1; wild->processContents = XML_SCHEMAS_ANY_LAX; xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; } xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", XML_SCHEMAS_ANYSIMPLETYPE, xmlSchemaTypeAnyTypeDef); /* * primitive datatypes */ xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", XML_SCHEMAS_STRING, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", XML_SCHEMAS_DECIMAL, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", XML_SCHEMAS_DATE, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", XML_SCHEMAS_DATETIME, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", XML_SCHEMAS_TIME, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", XML_SCHEMAS_GYEAR, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", XML_SCHEMAS_GYEARMONTH, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", XML_SCHEMAS_GMONTH, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", XML_SCHEMAS_GMONTHDAY, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", XML_SCHEMAS_GDAY, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", XML_SCHEMAS_DURATION, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", XML_SCHEMAS_FLOAT, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", XML_SCHEMAS_DOUBLE, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", XML_SCHEMAS_BOOLEAN, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", XML_SCHEMAS_ANYURI, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", XML_SCHEMAS_HEXBINARY, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeBase64BinaryDef = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", XML_SCHEMAS_NOTATION, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", XML_SCHEMAS_QNAME, xmlSchemaTypeAnySimpleTypeDef); /* * derived datatypes */ xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", XML_SCHEMAS_INTEGER, xmlSchemaTypeDecimalDef); xmlSchemaTypeNonPositiveIntegerDef = xmlSchemaInitBasicType("nonPositiveInteger", XML_SCHEMAS_NPINTEGER, xmlSchemaTypeIntegerDef); xmlSchemaTypeNegativeIntegerDef = xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, xmlSchemaTypeNonPositiveIntegerDef); xmlSchemaTypeLongDef = xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, xmlSchemaTypeIntegerDef); xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, xmlSchemaTypeLongDef); xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", XML_SCHEMAS_SHORT, xmlSchemaTypeIntDef); xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", XML_SCHEMAS_BYTE, xmlSchemaTypeShortDef); xmlSchemaTypeNonNegativeIntegerDef = xmlSchemaInitBasicType("nonNegativeInteger", XML_SCHEMAS_NNINTEGER, xmlSchemaTypeIntegerDef); xmlSchemaTypeUnsignedLongDef = xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, xmlSchemaTypeNonNegativeIntegerDef); xmlSchemaTypeUnsignedIntDef = xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, xmlSchemaTypeUnsignedLongDef); xmlSchemaTypeUnsignedShortDef = xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, xmlSchemaTypeUnsignedIntDef); xmlSchemaTypeUnsignedByteDef = xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, xmlSchemaTypeUnsignedShortDef); xmlSchemaTypePositiveIntegerDef = xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, xmlSchemaTypeNonNegativeIntegerDef); xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", XML_SCHEMAS_NORMSTRING, xmlSchemaTypeStringDef); xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", XML_SCHEMAS_TOKEN, xmlSchemaTypeNormStringDef); xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", XML_SCHEMAS_LANGUAGE, xmlSchemaTypeTokenDef); xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", XML_SCHEMAS_NAME, xmlSchemaTypeTokenDef); xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", XML_SCHEMAS_NMTOKEN, xmlSchemaTypeTokenDef); xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", XML_SCHEMAS_NCNAME, xmlSchemaTypeNameDef); xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, xmlSchemaTypeNCNameDef); xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", XML_SCHEMAS_IDREF, xmlSchemaTypeNCNameDef); xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", XML_SCHEMAS_ENTITY, xmlSchemaTypeNCNameDef); /* * Derived list types. */ /* ENTITIES */ xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", XML_SCHEMAS_ENTITIES, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef; /* IDREFS */ xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", XML_SCHEMAS_IDREFS, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef; /* NMTOKENS */ xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", XML_SCHEMAS_NMTOKENS, xmlSchemaTypeAnySimpleTypeDef); xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef; xmlSchemaTypesInitialized = 1; } /** * xmlSchemaCleanupTypes: * * Cleanup the default XML Schemas type library */ void xmlSchemaCleanupTypes(void) { if (xmlSchemaTypesInitialized == 0) return; /* * Free xs:anyType. */ { xmlSchemaParticlePtr particle; /* Attribute wildcard. */ xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); /* Content type. */ particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes; /* Wildcard. */ xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) particle->children->children->children); xmlFree((xmlSchemaParticlePtr) particle->children->children); /* Sequence model group. */ xmlFree((xmlSchemaModelGroupPtr) particle->children); xmlFree((xmlSchemaParticlePtr) particle); xmlSchemaTypeAnyTypeDef->subtypes = NULL; } xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); xmlSchemaTypesInitialized = 0; } /** * xmlSchemaIsBuiltInTypeFacet: * @type: the built-in type * @facetType: the facet type * * Evaluates if a specific facet can be * used in conjunction with a type. * * Returns 1 if the facet can be used with the given built-in type, * 0 otherwise and -1 in case the type is not a built-in type. */ int xmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) { if (type == NULL) return (-1); if (type->type != XML_SCHEMA_TYPE_BASIC) return (-1); switch (type->builtInType) { case XML_SCHEMAS_BOOLEAN: if ((facetType == XML_SCHEMA_FACET_PATTERN) || (facetType == XML_SCHEMA_FACET_WHITESPACE)) return (1); else return (0); case XML_SCHEMAS_STRING: case XML_SCHEMAS_NOTATION: case XML_SCHEMAS_QNAME: case XML_SCHEMAS_ANYURI: case XML_SCHEMAS_BASE64BINARY: case XML_SCHEMAS_HEXBINARY: if ((facetType == XML_SCHEMA_FACET_LENGTH) || (facetType == XML_SCHEMA_FACET_MINLENGTH) || (facetType == XML_SCHEMA_FACET_MAXLENGTH) || (facetType == XML_SCHEMA_FACET_PATTERN) || (facetType == XML_SCHEMA_FACET_ENUMERATION) || (facetType == XML_SCHEMA_FACET_WHITESPACE)) return (1); else return (0); case XML_SCHEMAS_DECIMAL: if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || (facetType == XML_SCHEMA_FACET_PATTERN) || (facetType == XML_SCHEMA_FACET_WHITESPACE) || (facetType == XML_SCHEMA_FACET_ENUMERATION) || (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) return (1); else return (0); case XML_SCHEMAS_TIME: case XML_SCHEMAS_GDAY: case XML_SCHEMAS_GMONTH: case XML_SCHEMAS_GMONTHDAY: case XML_SCHEMAS_GYEAR: case XML_SCHEMAS_GYEARMONTH: case XML_SCHEMAS_DATE: case XML_SCHEMAS_DATETIME: case XML_SCHEMAS_DURATION: case XML_SCHEMAS_FLOAT: case XML_SCHEMAS_DOUBLE: if ((facetType == XML_SCHEMA_FACET_PATTERN) || (facetType == XML_SCHEMA_FACET_ENUMERATION) || (facetType == XML_SCHEMA_FACET_WHITESPACE) || (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) return (1); else return (0); default: break; } return (0); } /** * xmlSchemaGetBuiltInType: * @type: the type of the built in type * * Gives you the type struct for a built-in * type by its type id. * * Returns the type if found, NULL otherwise. */ xmlSchemaTypePtr xmlSchemaGetBuiltInType(xmlSchemaValType type) { if (xmlSchemaTypesInitialized == 0) xmlSchemaInitTypes(); switch (type) { case XML_SCHEMAS_ANYSIMPLETYPE: return (xmlSchemaTypeAnySimpleTypeDef); case XML_SCHEMAS_STRING: return (xmlSchemaTypeStringDef); case XML_SCHEMAS_NORMSTRING: return (xmlSchemaTypeNormStringDef); case XML_SCHEMAS_DECIMAL: return (xmlSchemaTypeDecimalDef); case XML_SCHEMAS_TIME: return (xmlSchemaTypeTimeDef); case XML_SCHEMAS_GDAY: return (xmlSchemaTypeGDayDef); case XML_SCHEMAS_GMONTH: return (xmlSchemaTypeGMonthDef); case XML_SCHEMAS_GMONTHDAY: return (xmlSchemaTypeGMonthDayDef); case XML_SCHEMAS_GYEAR: return (xmlSchemaTypeGYearDef); case XML_SCHEMAS_GYEARMONTH: return (xmlSchemaTypeGYearMonthDef); case XML_SCHEMAS_DATE: return (xmlSchemaTypeDateDef); case XML_SCHEMAS_DATETIME: return (xmlSchemaTypeDatetimeDef); case XML_SCHEMAS_DURATION: return (xmlSchemaTypeDurationDef); case XML_SCHEMAS_FLOAT: return (xmlSchemaTypeFloatDef); case XML_SCHEMAS_DOUBLE: return (xmlSchemaTypeDoubleDef); case XML_SCHEMAS_BOOLEAN: return (xmlSchemaTypeBooleanDef); case XML_SCHEMAS_TOKEN: return (xmlSchemaTypeTokenDef); case XML_SCHEMAS_LANGUAGE: return (xmlSchemaTypeLanguageDef); case XML_SCHEMAS_NMTOKEN: return (xmlSchemaTypeNmtokenDef); case XML_SCHEMAS_NMTOKENS: return (xmlSchemaTypeNmtokensDef); case XML_SCHEMAS_NAME: return (xmlSchemaTypeNameDef); case XML_SCHEMAS_QNAME: return (xmlSchemaTypeQNameDef); case XML_SCHEMAS_NCNAME: return (xmlSchemaTypeNCNameDef); case XML_SCHEMAS_ID: return (xmlSchemaTypeIdDef); case XML_SCHEMAS_IDREF: return (xmlSchemaTypeIdrefDef); case XML_SCHEMAS_IDREFS: return (xmlSchemaTypeIdrefsDef); case XML_SCHEMAS_ENTITY: return (xmlSchemaTypeEntityDef); case XML_SCHEMAS_ENTITIES: return (xmlSchemaTypeEntitiesDef); case XML_SCHEMAS_NOTATION: return (xmlSchemaTypeNotationDef); case XML_SCHEMAS_ANYURI: return (xmlSchemaTypeAnyURIDef); case XML_SCHEMAS_INTEGER: return (xmlSchemaTypeIntegerDef); case XML_SCHEMAS_NPINTEGER: return (xmlSchemaTypeNonPositiveIntegerDef); case XML_SCHEMAS_NINTEGER: return (xmlSchemaTypeNegativeIntegerDef); case XML_SCHEMAS_NNINTEGER: return (xmlSchemaTypeNonNegativeIntegerDef); case XML_SCHEMAS_PINTEGER: return (xmlSchemaTypePositiveIntegerDef); case XML_SCHEMAS_INT: return (xmlSchemaTypeIntDef); case XML_SCHEMAS_UINT: return (xmlSchemaTypeUnsignedIntDef); case XML_SCHEMAS_LONG: return (xmlSchemaTypeLongDef); case XML_SCHEMAS_ULONG: return (xmlSchemaTypeUnsignedLongDef); case XML_SCHEMAS_SHORT: return (xmlSchemaTypeShortDef); case XML_SCHEMAS_USHORT: return (xmlSchemaTypeUnsignedShortDef); case XML_SCHEMAS_BYTE: return (xmlSchemaTypeByteDef); case XML_SCHEMAS_UBYTE: return (xmlSchemaTypeUnsignedByteDef); case XML_SCHEMAS_HEXBINARY: return (xmlSchemaTypeHexBinaryDef); case XML_SCHEMAS_BASE64BINARY: return (xmlSchemaTypeBase64BinaryDef); case XML_SCHEMAS_ANYTYPE: return (xmlSchemaTypeAnyTypeDef); default: return (NULL); } } /** * xmlSchemaValueAppend: * @prev: the value * @cur: the value to be appended * * Appends a next sibling to a list of computed values. * * Returns 0 if succeeded and -1 on API errors. */ int xmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) { if ((prev == NULL) || (cur == NULL)) return (-1); prev->next = cur; return (0); } /** * xmlSchemaValueGetNext: * @cur: the value * * Accessor for the next sibling of a list of computed values. * * Returns the next value or NULL if there was none, or on * API errors. */ xmlSchemaValPtr xmlSchemaValueGetNext(xmlSchemaValPtr cur) { if (cur == NULL) return (NULL); return (cur->next); } /** * xmlSchemaValueGetAsString: * @val: the value * * Accessor for the string value of a computed value. * * Returns the string value or NULL if there was none, or on * API errors. */ const xmlChar * xmlSchemaValueGetAsString(xmlSchemaValPtr val) { if (val == NULL) return (NULL); switch (val->type) { case XML_SCHEMAS_STRING: case XML_SCHEMAS_NORMSTRING: case XML_SCHEMAS_ANYSIMPLETYPE: case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_NAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: case XML_SCHEMAS_IDREF: case XML_SCHEMAS_ENTITY: case XML_SCHEMAS_ANYURI: return (BAD_CAST val->value.str); default: break; } return (NULL); } /** * xmlSchemaValueGetAsBoolean: * @val: the value * * Accessor for the boolean value of a computed value. * * Returns 1 if true and 0 if false, or in case of an error. Hmm. */ int xmlSchemaValueGetAsBoolean(xmlSchemaValPtr val) { if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN)) return (0); return (val->value.b); } /** * xmlSchemaNewStringValue: * @type: the value type * @value: the value * * Allocate a new simple type value. The type can be * of XML_SCHEMAS_STRING. * WARNING: This one is intended to be expanded for other * string based types. We need this for anySimpleType as well. * The given value is consumed and freed with the struct. * * Returns a pointer to the new value or NULL in case of error */ xmlSchemaValPtr xmlSchemaNewStringValue(xmlSchemaValType type, const xmlChar *value) { xmlSchemaValPtr val; if (type != XML_SCHEMAS_STRING) return(NULL); val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); if (val == NULL) { return(NULL); } memset(val, 0, sizeof(xmlSchemaVal)); val->type = type; val->value.str = (xmlChar *) value; return(val); } /** * xmlSchemaNewNOTATIONValue: * @name: the notation name * @ns: the notation namespace name or NULL * * Allocate a new NOTATION value. * The given values are consumed and freed with the struct. * * Returns a pointer to the new value or NULL in case of error */ xmlSchemaValPtr xmlSchemaNewNOTATIONValue(const xmlChar *name, const xmlChar *ns) { xmlSchemaValPtr val; val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); if (val == NULL) return (NULL); val->value.qname.name = (xmlChar *)name; if (ns != NULL) val->value.qname.uri = (xmlChar *)ns; return(val); } /** * xmlSchemaNewQNameValue: * @namespaceName: the namespace name * @localName: the local name * * Allocate a new QName value. * The given values are consumed and freed with the struct. * * Returns a pointer to the new value or NULL in case of an error. */ xmlSchemaValPtr xmlSchemaNewQNameValue(const xmlChar *namespaceName, const xmlChar *localName) { xmlSchemaValPtr val; val = xmlSchemaNewValue(XML_SCHEMAS_QNAME); if (val == NULL) return (NULL); val->value.qname.name = (xmlChar *) localName; val->value.qname.uri = (xmlChar *) namespaceName; return(val); } /** * xmlSchemaFreeValue: * @value: the value to free * * Cleanup the default XML Schemas type library */ void xmlSchemaFreeValue(xmlSchemaValPtr value) { xmlSchemaValPtr prev; while (value != NULL) { switch (value->type) { case XML_SCHEMAS_STRING: case XML_SCHEMAS_NORMSTRING: case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_NMTOKENS: case XML_SCHEMAS_NAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: case XML_SCHEMAS_IDREF: case XML_SCHEMAS_IDREFS: case XML_SCHEMAS_ENTITY: case XML_SCHEMAS_ENTITIES: case XML_SCHEMAS_ANYURI: case XML_SCHEMAS_ANYSIMPLETYPE: if (value->value.str != NULL) xmlFree(value->value.str); break; case XML_SCHEMAS_NOTATION: case XML_SCHEMAS_QNAME: if (value->value.qname.uri != NULL) xmlFree(value->value.qname.uri); if (value->value.qname.name != NULL) xmlFree(value->value.qname.name); break; case XML_SCHEMAS_HEXBINARY: if (value->value.hex.str != NULL) xmlFree(value->value.hex.str); break; case XML_SCHEMAS_BASE64BINARY: if (value->value.base64.str != NULL) xmlFree(value->value.base64.str); break; default: break; } prev = value; value = value->next; xmlFree(prev); } } /** * xmlSchemaGetPredefinedType: * @name: the type name * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" * * Lookup a type in the default XML Schemas type library * * Returns the type if found, NULL otherwise */ xmlSchemaTypePtr xmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { if (xmlSchemaTypesInitialized == 0) xmlSchemaInitTypes(); if (name == NULL) return(NULL); return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); } /** * xmlSchemaGetBuiltInListSimpleTypeItemType: * @type: the built-in simple type. * * Lookup function * * Returns the item type of @type as defined by the built-in datatype * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. */ xmlSchemaTypePtr xmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) { if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) return (NULL); switch (type->builtInType) { case XML_SCHEMAS_NMTOKENS: return (xmlSchemaTypeNmtokenDef ); case XML_SCHEMAS_IDREFS: return (xmlSchemaTypeIdrefDef); case XML_SCHEMAS_ENTITIES: return (xmlSchemaTypeEntityDef); default: return (NULL); } } /**************************************************************** * * * Convenience macros and functions * * * ****************************************************************/ #define IS_TZO_CHAR(c) \ ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) #define VALID_YEAR(yr) (yr != 0) #define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) /* VALID_DAY should only be used when month is unknown */ #define VALID_DAY(day) ((day >= 1) && (day <= 31)) #define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) #define VALID_MIN(min) ((min >= 0) && (min <= 59)) #define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) #define VALID_TZO(tzo) ((tzo > -840) && (tzo < 840)) #define IS_LEAP(y) \ (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) static const unsigned int daysInMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static const unsigned int daysInMonthLeap[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; #define MAX_DAYINMONTH(yr,mon) \ (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) #define VALID_MDAY(dt) \ (IS_LEAP(dt->year) ? \ (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ (dt->day <= daysInMonth[dt->mon - 1])) #define VALID_DATE(dt) \ (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) #define VALID_TIME(dt) \ (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) #define VALID_DATETIME(dt) \ (VALID_DATE(dt) && VALID_TIME(dt)) #define SECS_PER_MIN (60) #define SECS_PER_HOUR (60 * SECS_PER_MIN) #define SECS_PER_DAY (24 * SECS_PER_HOUR) static const long dayInYearByMonth[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; static const long dayInLeapYearByMonth[12] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; #define DAY_IN_YEAR(day, month, year) \ ((IS_LEAP(year) ? \ dayInLeapYearByMonth[month - 1] : \ dayInYearByMonth[month - 1]) + day) #ifdef DEBUG #define DEBUG_DATE(dt) \ xmlGenericError(xmlGenericErrorContext, \ "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ dt->type,dt->value.date.year,dt->value.date.mon, \ dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ dt->value.date.sec); \ if (dt->value.date.tz_flag) \ if (dt->value.date.tzo != 0) \ xmlGenericError(xmlGenericErrorContext, \ "%+05d\n",dt->value.date.tzo); \ else \ xmlGenericError(xmlGenericErrorContext, "Z\n"); \ else \ xmlGenericError(xmlGenericErrorContext,"\n") #else #define DEBUG_DATE(dt) #endif /** * _xmlSchemaParseGYear: * @dt: pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:gYear without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * xs:gYear. It is supposed that @dt->year is big enough to contain * the year. * * Returns 0 or the error code */ static int _xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { const xmlChar *cur = *str, *firstChar; int isneg = 0, digcnt = 0; if (((*cur < '0') || (*cur > '9')) && (*cur != '-') && (*cur != '+')) return -1; if (*cur == '-') { isneg = 1; cur++; } firstChar = cur; while ((*cur >= '0') && (*cur <= '9')) { dt->year = dt->year * 10 + (*cur - '0'); cur++; digcnt++; } /* year must be at least 4 digits (CCYY); over 4 * digits cannot have a leading zero. */ if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) return 1; if (isneg) dt->year = - dt->year; if (!VALID_YEAR(dt->year)) return 2; *str = cur; return 0; } /** * PARSE_2_DIGITS: * @num: the integer to fill in * @cur: an #xmlChar * * @invalid: an integer * * Parses a 2-digits integer and updates @num with the value. @cur is * updated to point just after the integer. * In case of error, @invalid is set to %TRUE, values of @num and * @cur are undefined. */ #define PARSE_2_DIGITS(num, cur, invalid) \ if ((cur[0] < '0') || (cur[0] > '9') || \ (cur[1] < '0') || (cur[1] > '9')) \ invalid = 1; \ else \ num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ cur += 2; /** * PARSE_FLOAT: * @num: the double to fill in * @cur: an #xmlChar * * @invalid: an integer * * Parses a float and updates @num with the value. @cur is * updated to point just after the float. The float must have a * 2-digits integer part and may or may not have a decimal part. * In case of error, @invalid is set to %TRUE, values of @num and * @cur are undefined. */ #define PARSE_FLOAT(num, cur, invalid) \ PARSE_2_DIGITS(num, cur, invalid); \ if (!invalid && (*cur == '.')) { \ double mult = 1; \ cur++; \ if ((*cur < '0') || (*cur > '9')) \ invalid = 1; \ while ((*cur >= '0') && (*cur <= '9')) { \ mult /= 10; \ num += (*cur - '0') * mult; \ cur++; \ } \ } /** * _xmlSchemaParseGMonth: * @dt: pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:gMonth without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * xs:gMonth. * * Returns 0 or the error code */ static int _xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { const xmlChar *cur = *str; int ret = 0; unsigned int value = 0; PARSE_2_DIGITS(value, cur, ret); if (ret != 0) return ret; if (!VALID_MONTH(value)) return 2; dt->mon = value; *str = cur; return 0; } /** * _xmlSchemaParseGDay: * @dt: pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:gDay without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * xs:gDay. * * Returns 0 or the error code */ static int _xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { const xmlChar *cur = *str; int ret = 0; unsigned int value = 0; PARSE_2_DIGITS(value, cur, ret); if (ret != 0) return ret; if (!VALID_DAY(value)) return 2; dt->day = value; *str = cur; return 0; } /** * _xmlSchemaParseTime: * @dt: pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:time without time zone and fills in the appropriate * fields of the @dt structure. @str is updated to point just after the * xs:time. * In case of error, values of @dt fields are undefined. * * Returns 0 or the error code */ static int _xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { const xmlChar *cur = *str; int ret = 0; int value = 0; PARSE_2_DIGITS(value, cur, ret); if (ret != 0) return ret; if (*cur != ':') return 1; if (!VALID_HOUR(value)) return 2; cur++; /* the ':' insures this string is xs:time */ dt->hour = value; PARSE_2_DIGITS(value, cur, ret); if (ret != 0) return ret; if (!VALID_MIN(value)) return 2; dt->min = value; if (*cur != ':') return 1; cur++; PARSE_FLOAT(dt->sec, cur, ret); if (ret != 0) return ret; if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo))) return 2; *str = cur; return 0; } /** * _xmlSchemaParseTimeZone: * @dt: pointer to a date structure * @str: pointer to the string to analyze * * Parses a time zone without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * time zone. * * Returns 0 or the error code */ static int _xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { const xmlChar *cur; int ret = 0; if (str == NULL) return -1; cur = *str; switch (*cur) { case 0: dt->tz_flag = 0; dt->tzo = 0; break; case 'Z': dt->tz_flag = 1; dt->tzo = 0; cur++; break; case '+': case '-': { int isneg = 0, tmp = 0; isneg = (*cur == '-'); cur++; PARSE_2_DIGITS(tmp, cur, ret); if (ret != 0) return ret; if (!VALID_HOUR(tmp)) return 2; if (*cur != ':') return 1; cur++; dt->tzo = tmp * 60; PARSE_2_DIGITS(tmp, cur, ret); if (ret != 0) return ret; if (!VALID_MIN(tmp)) return 2; dt->tzo += tmp; if (isneg) dt->tzo = - dt->tzo; if (!VALID_TZO(dt->tzo)) return 2; dt->tz_flag = 1; break; } default: return 1; } *str = cur; return 0; } /** * _xmlSchemaBase64Decode: * @ch: a character * * Converts a base64 encoded character to its base 64 value. * * Returns 0-63 (value), 64 (pad), or -1 (not recognized) */ static int _xmlSchemaBase64Decode (const xmlChar ch) { if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; if ('+' == ch) return 62; if ('/' == ch) return 63; if ('=' == ch) return 64; return -1; } /**************************************************************** * * * XML Schema Dates/Times Datatypes Handling * * * ****************************************************************/ /** * PARSE_DIGITS: * @num: the integer to fill in * @cur: an #xmlChar * * @num_type: an integer flag * * Parses a digits integer and updates @num with the value. @cur is * updated to point just after the integer. * In case of error, @num_type is set to -1, values of @num and * @cur are undefined. */ #define PARSE_DIGITS(num, cur, num_type) \ if ((*cur < '0') || (*cur > '9')) \ num_type = -1; \ else \ while ((*cur >= '0') && (*cur <= '9')) { \ num = num * 10 + (*cur - '0'); \ cur++; \ } /** * PARSE_NUM: * @num: the double to fill in * @cur: an #xmlChar * * @num_type: an integer flag * * Parses a float or integer and updates @num with the value. @cur is * updated to point just after the number. If the number is a float, * then it must have an integer part and a decimal part; @num_type will * be set to 1. If there is no decimal part, @num_type is set to zero. * In case of error, @num_type is set to -1, values of @num and * @cur are undefined. */ #define PARSE_NUM(num, cur, num_type) \ num = 0; \ PARSE_DIGITS(num, cur, num_type); \ if (!num_type && (*cur == '.')) { \ double mult = 1; \ cur++; \ if ((*cur < '0') || (*cur > '9')) \ num_type = -1; \ else \ num_type = 1; \ while ((*cur >= '0') && (*cur <= '9')) { \ mult /= 10; \ num += (*cur - '0') * mult; \ cur++; \ } \ } /** * xmlSchemaValidateDates: * @type: the expected type or XML_SCHEMAS_UNKNOWN * @dateTime: string to analyze * @val: the return computed value * * Check that @dateTime conforms to the lexical space of one of the date types. * if true a value is computed and returned in @val. * * Returns 0 if this validates, a positive error code number otherwise * and -1 in case of internal or API error. */ static int xmlSchemaValidateDates (xmlSchemaValType type, const xmlChar *dateTime, xmlSchemaValPtr *val, int collapse) { xmlSchemaValPtr dt; int ret; const xmlChar *cur = dateTime; #define RETURN_TYPE_IF_VALID(t) \ if (IS_TZO_CHAR(*cur)) { \ ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ if (ret == 0) { \ if (*cur != 0) \ goto error; \ dt->type = t; \ goto done; \ } \ } if (dateTime == NULL) return -1; if (collapse) while IS_WSP_BLANK_CH(*cur) cur++; if ((*cur != '-') && (*cur < '0') && (*cur > '9')) return 1; dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); if (dt == NULL) return -1; if ((cur[0] == '-') && (cur[1] == '-')) { /* * It's an incomplete date (xs:gMonthDay, xs:gMonth or * xs:gDay) */ cur += 2; /* is it an xs:gDay? */ if (*cur == '-') { if (type == XML_SCHEMAS_GMONTH) goto error; ++cur; ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); if (ret != 0) goto error; RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); goto error; } /* * it should be an xs:gMonthDay or xs:gMonth */ ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); if (ret != 0) goto error; /* * a '-' char could indicate this type is xs:gMonthDay or * a negative time zone offset. Check for xs:gMonthDay first. * Also the first three char's of a negative tzo (-MM:SS) can * appear to be a valid day; so even if the day portion * of the xs:gMonthDay verifies, we must insure it was not * a tzo. */ if (*cur == '-') { const xmlChar *rewnd = cur; cur++; ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { /* * we can use the VALID_MDAY macro to validate the month * and day because the leap year test will flag year zero * as a leap year (even though zero is an invalid year). * FUTURE TODO: Zero will become valid in XML Schema 1.1 * probably. */ if (VALID_MDAY((&(dt->value.date)))) { RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); goto error; } } /* * not xs:gMonthDay so rewind and check if just xs:gMonth * with an optional time zone. */ cur = rewnd; } RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); goto error; } /* * It's a right-truncated date or an xs:time. * Try to parse an xs:time then fallback on right-truncated dates. */ if ((*cur >= '0') && (*cur <= '9')) { ret = _xmlSchemaParseTime(&(dt->value.date), &cur); if (ret == 0) { /* it's an xs:time */ RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); } } /* fallback on date parsing */ cur = dateTime; ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); if (ret != 0) goto error; /* is it an xs:gYear? */ RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); if (*cur != '-') goto error; cur++; ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); if (ret != 0) goto error; /* is it an xs:gYearMonth? */ RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); if (*cur != '-') goto error; cur++; ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) goto error; /* is it an xs:date? */ RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); if (*cur != 'T') goto error; cur++; /* it should be an xs:dateTime */ ret = _xmlSchemaParseTime(&(dt->value.date), &cur); if (ret != 0) goto error; ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); if (collapse) while IS_WSP_BLANK_CH(*cur) cur++; if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date)))))) goto error; dt->type = XML_SCHEMAS_DATETIME; done: #if 1 if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) goto error; #else /* * insure the parsed type is equal to or less significant (right * truncated) than the desired type. */ if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { /* time only matches time */ if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) goto error; if ((type == XML_SCHEMAS_DATETIME) && ((dt->type != XML_SCHEMAS_DATE) || (dt->type != XML_SCHEMAS_GYEARMONTH) || (dt->type != XML_SCHEMAS_GYEAR))) goto error; if ((type == XML_SCHEMAS_DATE) && ((dt->type != XML_SCHEMAS_GYEAR) || (dt->type != XML_SCHEMAS_GYEARMONTH))) goto error; if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) goto error; if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) goto error; } #endif if (val != NULL) *val = dt; else xmlSchemaFreeValue(dt); return 0; error: if (dt != NULL) xmlSchemaFreeValue(dt); return 1; } /** * xmlSchemaValidateDuration: * @type: the predefined type * @duration: string to analyze * @val: the return computed value * * Check that @duration conforms to the lexical space of the duration type. * if true a value is computed and returned in @val. * * Returns 0 if this validates, a positive error code number otherwise * and -1 in case of internal or API error. */ static int xmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, const xmlChar *duration, xmlSchemaValPtr *val, int collapse) { const xmlChar *cur = duration; xmlSchemaValPtr dur; int isneg = 0; unsigned int seq = 0; double num; int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; if (duration == NULL) return -1; if (collapse) while IS_WSP_BLANK_CH(*cur) cur++; if (*cur == '-') { isneg = 1; cur++; } /* duration must start with 'P' (after sign) */ if (*cur++ != 'P') return 1; if (*cur == 0) return 1; dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); if (dur == NULL) return -1; while (*cur != 0) { /* input string should be empty or invalid date/time item */ if (seq >= sizeof(desig)) goto error; /* T designator must be present for time items */ if (*cur == 'T') { if (seq <= 3) { seq = 3; cur++; } else return 1; } else if (seq == 3) goto error; /* parse the number portion of the item */ PARSE_NUM(num, cur, num_type); if ((num_type == -1) || (*cur == 0)) goto error; /* update duration based on item type */ while (seq < sizeof(desig)) { if (*cur == desig[seq]) { /* verify numeric type; only seconds can be float */ if ((num_type != 0) && (seq < (sizeof(desig)-1))) goto error; switch (seq) { case 0: dur->value.dur.mon = (long)num * 12; break; case 1: dur->value.dur.mon += (long)num; break; default: /* convert to seconds using multiplier */ dur->value.dur.sec += num * multi[seq]; seq++; break; } break; /* exit loop */ } /* no date designators found? */ if ((++seq == 3) || (seq == 6)) goto error; } cur++; if (collapse) while IS_WSP_BLANK_CH(*cur) cur++; } if (isneg) { dur->value.dur.mon = -dur->value.dur.mon; dur->value.dur.day = -dur->value.dur.day; dur->value.dur.sec = -dur->value.dur.sec; } if (val != NULL) *val = dur; else xmlSchemaFreeValue(dur); return 0; error: if (dur != NULL) xmlSchemaFreeValue(dur); return 1; } /** * xmlSchemaStrip: * @value: a value * * Removes the leading and ending spaces of a string * * Returns the new string or NULL if no change was required. */ static xmlChar * xmlSchemaStrip(const xmlChar *value) { const xmlChar *start = value, *end, *f; if (value == NULL) return(NULL); while ((*start != 0) && (IS_BLANK_CH(*start))) start++; end = start; while (*end != 0) end++; f = end; end--; while ((end > start) && (IS_BLANK_CH(*end))) end--; end++; if ((start == value) && (f == end)) return(NULL); return(xmlStrndup(start, end - start)); } /** * xmlSchemaWhiteSpaceReplace: * @value: a value * * Replaces 0xd, 0x9 and 0xa with a space. * * Returns the new string or NULL if no change was required. */ xmlChar * xmlSchemaWhiteSpaceReplace(const xmlChar *value) { const xmlChar *cur = value; xmlChar *ret = NULL, *mcur; if (value == NULL) return(NULL); while ((*cur != 0) && (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { cur++; } if (*cur == 0) return (NULL); ret = xmlStrdup(value); /* TODO FIXME: I guess gcc will bark at this. */ mcur = (xmlChar *) (ret + (cur - value)); do { if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) *mcur = ' '; mcur++; } while (*mcur != 0); return(ret); } /** * xmlSchemaCollapseString: * @value: a value * * Removes and normalize white spaces in the string * * Returns the new string or NULL if no change was required. */ xmlChar * xmlSchemaCollapseString(const xmlChar *value) { const xmlChar *start = value, *end, *f; xmlChar *g; int col = 0; if (value == NULL) return(NULL); while ((*start != 0) && (IS_BLANK_CH(*start))) start++; end = start; while (*end != 0) { if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { col = end - start; break; } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { col = end - start; break; } end++; } if (col == 0) { f = end; end--; while ((end > start) && (IS_BLANK_CH(*end))) end--; end++; if ((start == value) && (f == end)) return(NULL); return(xmlStrndup(start, end - start)); } start = xmlStrdup(start); if (start == NULL) return(NULL); g = (xmlChar *) (start + col); end = g; while (*end != 0) { if (IS_BLANK_CH(*end)) { end++; while (IS_BLANK_CH(*end)) end++; if (*end != 0) *g++ = ' '; } else *g++ = *end++; } *g = 0; return((xmlChar *) start); } /** * xmlSchemaValAtomicListNode: * @type: the predefined atomic type for a token in the list * @value: the list value to check * @ret: the return computed value * @node: the node containing the value * * Check that a value conforms to the lexical space of the predefined * list type. if true a value is computed and returned in @ret. * * Returns the number of items if this validates, a negative error code * number otherwise */ static int xmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *ret, xmlNodePtr node) { xmlChar *val, *cur, *endval; int nb_values = 0; int tmp = 0; if (value == NULL) { return(-1); } val = xmlStrdup(value); if (val == NULL) { return(-1); } if (ret != NULL) { *ret = NULL; } cur = val; /* * Split the list */ while (IS_BLANK_CH(*cur)) *cur++ = 0; while (*cur != 0) { if (IS_BLANK_CH(*cur)) { *cur = 0; cur++; while (IS_BLANK_CH(*cur)) *cur++ = 0; } else { nb_values++; cur++; while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; } } if (nb_values == 0) { xmlFree(val); return(nb_values); } endval = cur; cur = val; while ((*cur == 0) && (cur != endval)) cur++; while (cur != endval) { tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); if (tmp != 0) break; while (*cur != 0) cur++; while ((*cur == 0) && (cur != endval)) cur++; } /* TODO what return value ? c.f. bug #158628 if (ret != NULL) { TODO } */ xmlFree(val); if (tmp == 0) return(nb_values); return(-1); } /** * xmlSchemaParseUInt: * @str: pointer to the string R/W * @llo: pointer to the low result * @lmi: pointer to the mid result * @lhi: pointer to the high result * * Parse an unsigned long into 3 fields. * * Returns the number of significant digits in the number or * -1 if overflow of the capacity and -2 if it's not a number. */ static int xmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, unsigned long *lmi, unsigned long *lhi) { unsigned long lo = 0, mi = 0, hi = 0; const xmlChar *tmp, *cur = *str; int ret = 0, i = 0; if (!((*cur >= '0') && (*cur <= '9'))) return(-2); while (*cur == '0') { /* ignore leading zeroes */ cur++; } tmp = cur; while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { i++;tmp++;ret++; } if (i > 24) { *str = tmp; return(-1); } while (i > 16) { hi = hi * 10 + (*cur++ - '0'); i--; } while (i > 8) { mi = mi * 10 + (*cur++ - '0'); i--; } while (i > 0) { lo = lo * 10 + (*cur++ - '0'); i--; } *str = cur; *llo = lo; *lmi = mi; *lhi = hi; return(ret); } /** * xmlSchemaValAtomicType: * @type: the predefined type * @value: the value to check * @val: the return computed value * @node: the node containing the value * flags: flags to control the vlidation * * Check that a value conforms to the lexical space of the atomic type. * if true a value is computed and returned in @val. * This checks the value space for list types as well (IDREFS, NMTOKENS). * * Returns 0 if this validates, a positive error code number otherwise * and -1 in case of internal or API error. */ static int xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, xmlSchemaValPtr * val, xmlNodePtr node, int flags, xmlSchemaWhitespaceValueType ws, int normOnTheFly, int applyNorm, int createStringValue) { xmlSchemaValPtr v; xmlChar *norm = NULL; int ret = 0; if (xmlSchemaTypesInitialized == 0) xmlSchemaInitTypes(); if (type == NULL) return (-1); /* * validating a non existant text node is similar to validating * an empty one. */ if (value == NULL) value = BAD_CAST ""; if (val != NULL) *val = NULL; if ((flags == 0) && (value != NULL)) { if ((type->builtInType != XML_SCHEMAS_STRING) && (type->builtInType != XML_SCHEMAS_ANYTYPE) && (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { if (type->builtInType == XML_SCHEMAS_NORMSTRING) norm = xmlSchemaWhiteSpaceReplace(value); else norm = xmlSchemaCollapseString(value); if (norm != NULL) value = norm; } } switch (type->builtInType) { case XML_SCHEMAS_UNKNOWN: goto error; case XML_SCHEMAS_ANYTYPE: case XML_SCHEMAS_ANYSIMPLETYPE: if ((createStringValue) && (val != NULL)) { v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } goto return0; case XML_SCHEMAS_STRING: if (! normOnTheFly) { const xmlChar *cur = value; if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { while (*cur != 0) { if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { goto return1; } else { cur++; } } } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { while (*cur != 0) { if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { goto return1; } else if IS_WSP_SPACE_CH(*cur) { cur++; if IS_WSP_SPACE_CH(*cur) goto return1; } else { cur++; } } } } if (createStringValue && (val != NULL)) { if (applyNorm) { if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) norm = xmlSchemaCollapseString(value); else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) norm = xmlSchemaWhiteSpaceReplace(value); if (norm != NULL) value = norm; } v = xmlSchemaNewValue(XML_SCHEMAS_STRING); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } goto return0; case XML_SCHEMAS_NORMSTRING:{ if (normOnTheFly) { if (applyNorm) { if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) norm = xmlSchemaCollapseString(value); else norm = xmlSchemaWhiteSpaceReplace(value); if (norm != NULL) value = norm; } } else { const xmlChar *cur = value; while (*cur != 0) { if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { goto return1; } else { cur++; } } } if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } goto return0; } case XML_SCHEMAS_DECIMAL:{ const xmlChar *cur = value; unsigned int len, neg, integ, hasLeadingZeroes; xmlChar cval[25]; xmlChar *cptr = cval; if ((cur == NULL) || (*cur == 0)) goto return1; /* * xs:decimal has a whitespace-facet value of 'collapse'. */ if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; /* * First we handle an optional sign. */ neg = 0; if (*cur == '-') { neg = 1; cur++; } else if (*cur == '+') cur++; /* * Disallow: "", "-", "- " */ if (*cur == 0) goto return1; /* * Next we "pre-parse" the number, in preparation for calling * the common routine xmlSchemaParseUInt. We get rid of any * leading zeroes (because we have reserved only 25 chars), * and note the position of a decimal point. */ len = 0; integ = ~0u; hasLeadingZeroes = 0; /* * Skip leading zeroes. */ while (*cur == '0') { cur++; hasLeadingZeroes = 1; } if (*cur != 0) { do { if ((*cur >= '0') && (*cur <= '9')) { *cptr++ = *cur++; len++; } else if (*cur == '.') { cur++; integ = len; do { if ((*cur >= '0') && (*cur <= '9')) { *cptr++ = *cur++; len++; } else break; } while (len < 24); /* * Disallow "." but allow "00." */ if ((len == 0) && (!hasLeadingZeroes)) goto return1; break; } else break; } while (len < 24); } if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; if (*cur != 0) goto return1; /* error if any extraneous chars */ if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); if (v != NULL) { /* * Now evaluate the significant digits of the number */ if (len != 0) { if (integ != ~0u) { /* * Get rid of trailing zeroes in the * fractional part. */ while ((len != integ) && (*(cptr-1) == '0')) { cptr--; len--; } } /* * Terminate the (preparsed) string. */ if (len != 0) { *cptr = 0; cptr = cval; xmlSchemaParseUInt((const xmlChar **)&cptr, &v->value.decimal.lo, &v->value.decimal.mi, &v->value.decimal.hi); } } /* * Set the total digits to 1 if a zero value. */ v->value.decimal.sign = neg; if (len == 0) { /* Speedup for zero values. */ v->value.decimal.total = 1; } else { v->value.decimal.total = len; if (integ == ~0u) v->value.decimal.frac = 0; else v->value.decimal.frac = len - integ; } *val = v; } } goto return0; } case XML_SCHEMAS_TIME: case XML_SCHEMAS_GDAY: case XML_SCHEMAS_GMONTH: case XML_SCHEMAS_GMONTHDAY: case XML_SCHEMAS_GYEAR: case XML_SCHEMAS_GYEARMONTH: case XML_SCHEMAS_DATE: case XML_SCHEMAS_DATETIME: ret = xmlSchemaValidateDates(type->builtInType, value, val, normOnTheFly); break; case XML_SCHEMAS_DURATION: ret = xmlSchemaValidateDuration(type, value, val, normOnTheFly); break; case XML_SCHEMAS_FLOAT: case XML_SCHEMAS_DOUBLE: { const xmlChar *cur = value; int neg = 0; int digits_before = 0; int digits_after = 0; if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { cur += 3; if (*cur != 0) goto return1; if (val != NULL) { if (type == xmlSchemaTypeFloatDef) { v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); if (v != NULL) { v->value.f = (float) xmlXPathNAN; } else { xmlSchemaFreeValue(v); goto error; } } else { v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); if (v != NULL) { v->value.d = xmlXPathNAN; } else { xmlSchemaFreeValue(v); goto error; } } *val = v; } goto return0; } if (*cur == '-') { neg = 1; cur++; } if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { cur += 3; if (*cur != 0) goto return1; if (val != NULL) { if (type == xmlSchemaTypeFloatDef) { v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); if (v != NULL) { if (neg) v->value.f = (float) xmlXPathNINF; else v->value.f = (float) xmlXPathPINF; } else { xmlSchemaFreeValue(v); goto error; } } else { v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); if (v != NULL) { if (neg) v->value.d = xmlXPathNINF; else v->value.d = xmlXPathPINF; } else { xmlSchemaFreeValue(v); goto error; } } *val = v; } goto return0; } if ((neg == 0) && (*cur == '+')) cur++; if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) goto return1; while ((*cur >= '0') && (*cur <= '9')) { cur++; digits_before++; } if (*cur == '.') { cur++; while ((*cur >= '0') && (*cur <= '9')) { cur++; digits_after++; } } if ((digits_before == 0) && (digits_after == 0)) goto return1; if ((*cur == 'e') || (*cur == 'E')) { cur++; if ((*cur == '-') || (*cur == '+')) cur++; while ((*cur >= '0') && (*cur <= '9')) cur++; } if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; if (*cur != 0) goto return1; if (val != NULL) { if (type == xmlSchemaTypeFloatDef) { v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); if (v != NULL) { /* * TODO: sscanf seems not to give the correct * value for extremely high/low values. * E.g. "1E-149" results in zero. */ if (sscanf((const char *) value, "%f", &(v->value.f)) == 1) { *val = v; } else { xmlSchemaFreeValue(v); goto return1; } } else { goto error; } } else { v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); if (v != NULL) { /* * TODO: sscanf seems not to give the correct * value for extremely high/low values. */ if (sscanf((const char *) value, "%lf", &(v->value.d)) == 1) { *val = v; } else { xmlSchemaFreeValue(v); goto return1; } } else { goto error; } } } goto return0; } case XML_SCHEMAS_BOOLEAN:{ const xmlChar *cur = value; if (normOnTheFly) { while IS_WSP_BLANK_CH(*cur) cur++; if (*cur == '0') { ret = 0; cur++; } else if (*cur == '1') { ret = 1; cur++; } else if (*cur == 't') { cur++; if ((*cur++ == 'r') && (*cur++ == 'u') && (*cur++ == 'e')) { ret = 1; } else goto return1; } else if (*cur == 'f') { cur++; if ((*cur++ == 'a') && (*cur++ == 'l') && (*cur++ == 's') && (*cur++ == 'e')) { ret = 0; } else goto return1; } else goto return1; if (*cur != 0) { while IS_WSP_BLANK_CH(*cur) cur++; if (*cur != 0) goto return1; } } else { if ((cur[0] == '0') && (cur[1] == 0)) ret = 0; else if ((cur[0] == '1') && (cur[1] == 0)) ret = 1; else if ((cur[0] == 't') && (cur[1] == 'r') && (cur[2] == 'u') && (cur[3] == 'e') && (cur[4] == 0)) ret = 1; else if ((cur[0] == 'f') && (cur[1] == 'a') && (cur[2] == 'l') && (cur[3] == 's') && (cur[4] == 'e') && (cur[5] == 0)) ret = 0; else goto return1; } if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); if (v != NULL) { v->value.b = ret; *val = v; } else { goto error; } } goto return0; } case XML_SCHEMAS_TOKEN:{ const xmlChar *cur = value; if (! normOnTheFly) { while (*cur != 0) { if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { goto return1; } else if (*cur == ' ') { cur++; if (*cur == 0) goto return1; if (*cur == ' ') goto return1; } else { cur++; } } } if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } goto return0; } case XML_SCHEMAS_LANGUAGE: if (normOnTheFly) { norm = xmlSchemaCollapseString(value); if (norm != NULL) value = norm; } if (xmlCheckLanguageID(value) == 1) { if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } goto return0; } goto return1; case XML_SCHEMAS_NMTOKEN: if (xmlValidateNMToken(value, 1) == 0) { if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } goto return0; } goto return1; case XML_SCHEMAS_NMTOKENS: ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, value, val, node); if (ret > 0) ret = 0; else ret = 1; goto done; case XML_SCHEMAS_NAME: ret = xmlValidateName(value, 1); if ((ret == 0) && (val != NULL) && (value != NULL)) { v = xmlSchemaNewValue(XML_SCHEMAS_NAME); if (v != NULL) { const xmlChar *start = value, *end; while (IS_BLANK_CH(*start)) start++; end = start; while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; v->value.str = xmlStrndup(start, end - start); *val = v; } else { goto error; } } goto done; case XML_SCHEMAS_QNAME:{ const xmlChar *uri = NULL; xmlChar *local = NULL; ret = xmlValidateQName(value, 1); if (ret != 0) goto done; if (node != NULL) { xmlChar *prefix; xmlNsPtr ns; local = xmlSplitQName2(value, &prefix); ns = xmlSearchNs(node->doc, node, prefix); if ((ns == NULL) && (prefix != NULL)) { xmlFree(prefix); if (local != NULL) xmlFree(local); goto return1; } if (ns != NULL) uri = ns->href; if (prefix != NULL) xmlFree(prefix); } if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); if (v == NULL) { if (local != NULL) xmlFree(local); goto error; } if (local != NULL) v->value.qname.name = local; else v->value.qname.name = xmlStrdup(value); if (uri != NULL) v->value.qname.uri = xmlStrdup(uri); *val = v; } else if (local != NULL) xmlFree(local); goto done; } case XML_SCHEMAS_NCNAME: ret = xmlValidateNCName(value, 1); if ((ret == 0) && (val != NULL)) { v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } goto done; case XML_SCHEMAS_ID: ret = xmlValidateNCName(value, 1); if ((ret == 0) && (val != NULL)) { v = xmlSchemaNewValue(XML_SCHEMAS_ID); if (v != NULL) { v->value.str = xmlStrdup(value); *val = v; } else { goto error; } } if ((ret == 0) && (node != NULL) && (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; /* * NOTE: the IDness might have already be declared in the DTD */ if (attr->atype != XML_ATTRIBUTE_ID) { xmlIDPtr res; xmlChar *strip; strip = xmlSchemaStrip(value); if (strip != NULL) { res = xmlAddID(NULL, node->doc, strip, attr); xmlFree(strip); } else res = xmlAddID(NULL, node->doc, value, attr); if (res == NULL) { ret = 2; } else { attr->atype = XML_ATTRIBUTE_ID; } } } goto done; case XML_SCHEMAS_IDREF: ret = xmlValidateNCName(value, 1); if ((ret == 0) && (val != NULL)) { v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); if (v == NULL) goto error; v->value.str = xmlStrdup(value); *val = v; } if ((ret == 0) && (node != NULL) && (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; xmlChar *strip; strip = xmlSchemaStrip(value); if (strip != NULL) { xmlAddRef(NULL, node->doc, strip, attr); xmlFree(strip); } else xmlAddRef(NULL, node->doc, value, attr); attr->atype = XML_ATTRIBUTE_IDREF; } goto done; case XML_SCHEMAS_IDREFS: ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, value, val, node); if (ret < 0) ret = 2; else ret = 0; if ((ret == 0) && (node != NULL) && (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; attr->atype = XML_ATTRIBUTE_IDREFS; } goto done; case XML_SCHEMAS_ENTITY:{ xmlChar *strip; ret = xmlValidateNCName(value, 1); if ((node == NULL) || (node->doc == NULL)) ret = 3; if (ret == 0) { xmlEntityPtr ent; strip = xmlSchemaStrip(value); if (strip != NULL) { ent = xmlGetDocEntity(node->doc, strip); xmlFree(strip); } else { ent = xmlGetDocEntity(node->doc, value); } if ((ent == NULL) || (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) ret = 4; } if ((ret == 0) && (val != NULL)) { TODO; } if ((ret == 0) && (node != NULL) && (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; attr->atype = XML_ATTRIBUTE_ENTITY; } goto done; } case XML_SCHEMAS_ENTITIES: if ((node == NULL) || (node->doc == NULL)) goto return3; ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, value, val, node); if (ret <= 0) ret = 1; else ret = 0; if ((ret == 0) && (node != NULL) && (node->type == XML_ATTRIBUTE_NODE)) { xmlAttrPtr attr = (xmlAttrPtr) node; attr->atype = XML_ATTRIBUTE_ENTITIES; } goto done; case XML_SCHEMAS_NOTATION:{ xmlChar *uri = NULL; xmlChar *local = NULL; ret = xmlValidateQName(value, 1); if ((ret == 0) && (node != NULL)) { xmlChar *prefix; local = xmlSplitQName2(value, &prefix); if (prefix != NULL) { xmlNsPtr ns; ns = xmlSearchNs(node->doc, node, prefix); if (ns == NULL) ret = 1; else if (val != NULL) uri = xmlStrdup(ns->href); } if ((local != NULL) && ((val == NULL) || (ret != 0))) xmlFree(local); if (prefix != NULL) xmlFree(prefix); } if ((node == NULL) || (node->doc == NULL)) ret = 3; if (ret == 0) { ret = xmlValidateNotationUse(NULL, node->doc, value); if (ret == 1) ret = 0; else ret = 1; } if ((ret == 0) && (val != NULL)) { v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); if (v != NULL) { if (local != NULL) v->value.qname.name = local; else v->value.qname.name = xmlStrdup(value); if (uri != NULL) v->value.qname.uri = uri; *val = v; } else { if (local != NULL) xmlFree(local); if (uri != NULL) xmlFree(uri); goto error; } } goto done; } case XML_SCHEMAS_ANYURI:{ if (*value != 0) { xmlURIPtr uri; xmlChar *tmpval, *cur; if (normOnTheFly) { norm = xmlSchemaCollapseString(value); if (norm != NULL) value = norm; } tmpval = xmlStrdup(value); for (cur = tmpval; *cur; ++cur) { if (*cur < 32 || *cur >= 127 || *cur == ' ' || *cur == '<' || *cur == '>' || *cur == '"' || *cur == '{' || *cur == '}' || *cur == '|' || *cur == '\\' || *cur == '^' || *cur == '`' || *cur == '\'') *cur = '_'; } uri = xmlParseURI((const char *) tmpval); xmlFree(tmpval); if (uri == NULL) goto return1; xmlFreeURI(uri); } if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); if (v == NULL) goto error; v->value.str = xmlStrdup(value); *val = v; } goto return0; } case XML_SCHEMAS_HEXBINARY:{ const xmlChar *cur = value, *start; xmlChar *base; int total, i = 0; if (cur == NULL) goto return1; if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; start = cur; while (((*cur >= '0') && (*cur <= '9')) || ((*cur >= 'A') && (*cur <= 'F')) || ((*cur >= 'a') && (*cur <= 'f'))) { i++; cur++; } if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; if (*cur != 0) goto return1; if ((i % 2) != 0) goto return1; if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); if (v == NULL) goto error; /* * Copy only the normalized piece. * CRITICAL TODO: Check this. */ cur = xmlStrndup(start, i); if (cur == NULL) { xmlSchemaTypeErrMemory(node, "allocating hexbin data"); xmlFree(v); goto return1; } total = i / 2; /* number of octets */ base = (xmlChar *) cur; while (i-- > 0) { if (*base >= 'a') *base = *base - ('a' - 'A'); base++; } v->value.hex.str = (xmlChar *) cur; v->value.hex.total = total; *val = v; } goto return0; } case XML_SCHEMAS_BASE64BINARY:{ /* ISSUE: * * Ignore all stray characters? (yes, currently) * Worry about long lines? (no, currently) * * rfc2045.txt: * * "The encoded output stream must be represented in lines of * no more than 76 characters each. All line breaks or other * characters not found in Table 1 must be ignored by decoding * software. In base64 data, characters other than those in * Table 1, line breaks, and other white space probably * indicate a transmission error, about which a warning * message or even a message rejection might be appropriate * under some circumstances." */ const xmlChar *cur = value; xmlChar *base; int total, i = 0, pad = 0; if (cur == NULL) goto return1; for (; *cur; ++cur) { int decc; decc = _xmlSchemaBase64Decode(*cur); if (decc < 0) ; else if (decc < 64) i++; else break; } for (; *cur; ++cur) { int decc; decc = _xmlSchemaBase64Decode(*cur); if (decc < 0) ; else if (decc < 64) goto return1; if (decc == 64) pad++; } /* rfc2045.txt: "Special processing is performed if fewer than * 24 bits are available at the end of the data being encoded. * A full encoding quantum is always completed at the end of a * body. When fewer than 24 input bits are available in an * input group, zero bits are added (on the right) to form an * integral number of 6-bit groups. Padding at the end of the * data is performed using the "=" character. Since all * base64 input is an integral number of octets, only the * following cases can arise: (1) the final quantum of * encoding input is an integral multiple of 24 bits; here, * the final unit of encoded output will be an integral * multiple ofindent: Standard input:701: Warning:old style * assignment ambiguity in "=*". Assuming "= *" 4 characters * with no "=" padding, (2) the final * quantum of encoding input is exactly 8 bits; here, the * final unit of encoded output will be two characters * followed by two "=" padding characters, or (3) the final * quantum of encoding input is exactly 16 bits; here, the * final unit of encoded output will be three characters * followed by one "=" padding character." */ total = 3 * (i / 4); if (pad == 0) { if (i % 4 != 0) goto return1; } else if (pad == 1) { int decc; if (i % 4 != 3) goto return1; for (decc = _xmlSchemaBase64Decode(*cur); (decc < 0) || (decc > 63); decc = _xmlSchemaBase64Decode(*cur)) --cur; /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ /* 00111100 -> 0x3c */ if (decc & ~0x3c) goto return1; total += 2; } else if (pad == 2) { int decc; if (i % 4 != 2) goto return1; for (decc = _xmlSchemaBase64Decode(*cur); (decc < 0) || (decc > 63); decc = _xmlSchemaBase64Decode(*cur)) --cur; /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ /* 00110000 -> 0x30 */ if (decc & ~0x30) goto return1; total += 1; } else goto return1; if (val != NULL) { v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); if (v == NULL) goto error; base = (xmlChar *) xmlMallocAtomic((i + pad + 1) * sizeof(xmlChar)); if (base == NULL) { xmlSchemaTypeErrMemory(node, "allocating base64 data"); xmlFree(v); goto return1; } v->value.base64.str = base; for (cur = value; *cur; ++cur) if (_xmlSchemaBase64Decode(*cur) >= 0) { *base = *cur; ++base; } *base = 0; v->value.base64.total = total; *val = v; } goto return0; } case XML_SCHEMAS_INTEGER: case XML_SCHEMAS_PINTEGER: case XML_SCHEMAS_NPINTEGER: case XML_SCHEMAS_NINTEGER: case XML_SCHEMAS_NNINTEGER:{ const xmlChar *cur = value; unsigned long lo, mi, hi; int sign = 0; if (cur == NULL) goto return1; if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; if (*cur == '-') { sign = 1; cur++; } else if (*cur == '+') cur++; ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); if (ret < 0) goto return1; if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; if (*cur != 0) goto return1; if (type->builtInType == XML_SCHEMAS_NPINTEGER) { if ((sign == 0) && ((hi != 0) || (mi != 0) || (lo != 0))) goto return1; } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { if (sign == 1) goto return1; if ((hi == 0) && (mi == 0) && (lo == 0)) goto return1; } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { if (sign == 0) goto return1; if ((hi == 0) && (mi == 0) && (lo == 0)) goto return1; } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { if ((sign == 1) && ((hi != 0) || (mi != 0) || (lo != 0))) goto return1; } if (val != NULL) { v = xmlSchemaNewValue(type->builtInType); if (v != NULL) { if (ret == 0) ret++; v->value.decimal.lo = lo; v->value.decimal.mi = mi; v->value.decimal.hi = hi; v->value.decimal.sign = sign; v->value.decimal.frac = 0; v->value.decimal.total = ret; *val = v; } } goto return0; } case XML_SCHEMAS_LONG: case XML_SCHEMAS_BYTE: case XML_SCHEMAS_SHORT: case XML_SCHEMAS_INT:{ const xmlChar *cur = value; unsigned long lo, mi, hi; int sign = 0; if (cur == NULL) goto return1; if (*cur == '-') { sign = 1; cur++; } else if (*cur == '+') cur++; ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); if (ret < 0) goto return1; if (*cur != 0) goto return1; if (type->builtInType == XML_SCHEMAS_LONG) { if (hi >= 922) { if (hi > 922) goto return1; if (mi >= 33720368) { if (mi > 33720368) goto return1; if ((sign == 0) && (lo > 54775807)) goto return1; if ((sign == 1) && (lo > 54775808)) goto return1; } } } else if (type->builtInType == XML_SCHEMAS_INT) { if (hi != 0) goto return1; if (mi >= 21) { if (mi > 21) goto return1; if ((sign == 0) && (lo > 47483647)) goto return1; if ((sign == 1) && (lo > 47483648)) goto return1; } } else if (type->builtInType == XML_SCHEMAS_SHORT) { if ((mi != 0) || (hi != 0)) goto return1; if ((sign == 1) && (lo > 32768)) goto return1; if ((sign == 0) && (lo > 32767)) goto return1; } else if (type->builtInType == XML_SCHEMAS_BYTE) { if ((mi != 0) || (hi != 0)) goto return1; if ((sign == 1) && (lo > 128)) goto return1; if ((sign == 0) && (lo > 127)) goto return1; } if (val != NULL) { v = xmlSchemaNewValue(type->builtInType); if (v != NULL) { v->value.decimal.lo = lo; v->value.decimal.mi = mi; v->value.decimal.hi = hi; v->value.decimal.sign = sign; v->value.decimal.frac = 0; v->value.decimal.total = ret; *val = v; } } goto return0; } case XML_SCHEMAS_UINT: case XML_SCHEMAS_ULONG: case XML_SCHEMAS_USHORT: case XML_SCHEMAS_UBYTE:{ const xmlChar *cur = value; unsigned long lo, mi, hi; if (cur == NULL) goto return1; ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); if (ret < 0) goto return1; if (*cur != 0) goto return1; if (type->builtInType == XML_SCHEMAS_ULONG) { if (hi >= 1844) { if (hi > 1844) goto return1; if (mi >= 67440737) { if (mi > 67440737) goto return1; if (lo > 9551615) goto return1; } } } else if (type->builtInType == XML_SCHEMAS_UINT) { if (hi != 0) goto return1; if (mi >= 42) { if (mi > 42) goto return1; if (lo > 94967295) goto return1; } } else if (type->builtInType == XML_SCHEMAS_USHORT) { if ((mi != 0) || (hi != 0)) goto return1; if (lo > 65535) goto return1; } else if (type->builtInType == XML_SCHEMAS_UBYTE) { if ((mi != 0) || (hi != 0)) goto return1; if (lo > 255) goto return1; } if (val != NULL) { v = xmlSchemaNewValue(type->builtInType); if (v != NULL) { v->value.decimal.lo = lo; v->value.decimal.mi = mi; v->value.decimal.hi = hi; v->value.decimal.sign = 0; v->value.decimal.frac = 0; v->value.decimal.total = ret; *val = v; } } goto return0; } } done: if (norm != NULL) xmlFree(norm); return (ret); return3: if (norm != NULL) xmlFree(norm); return (3); return1: if (norm != NULL) xmlFree(norm); return (1); return0: if (norm != NULL) xmlFree(norm); return (0); error: if (norm != NULL) xmlFree(norm); return (-1); } /** * xmlSchemaValPredefTypeNode: * @type: the predefined type * @value: the value to check * @val: the return computed value * @node: the node containing the value * * Check that a value conforms to the lexical space of the predefined type. * if true a value is computed and returned in @val. * * Returns 0 if this validates, a positive error code number otherwise * and -1 in case of internal or API error. */ int xmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val, xmlNodePtr node) { return(xmlSchemaValAtomicType(type, value, val, node, 0, XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); } /** * xmlSchemaValPredefTypeNodeNoNorm: * @type: the predefined type * @value: the value to check * @val: the return computed value * @node: the node containing the value * * Check that a value conforms to the lexical space of the predefined type. * if true a value is computed and returned in @val. * This one does apply any normalization to the value. * * Returns 0 if this validates, a positive error code number otherwise * and -1 in case of internal or API error. */ int xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val, xmlNodePtr node) { return(xmlSchemaValAtomicType(type, value, val, node, 1, XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); } /** * xmlSchemaValidatePredefinedType: * @type: the predefined type * @value: the value to check * @val: the return computed value * * Check that a value conforms to the lexical space of the predefined type. * if true a value is computed and returned in @val. * * Returns 0 if this validates, a positive error code number otherwise * and -1 in case of internal or API error. */ int xmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val) { return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); } /** * xmlSchemaCompareDecimals: * @x: a first decimal value * @y: a second decimal value * * Compare 2 decimals * * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error */ static int xmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) { xmlSchemaValPtr swp; int order = 1, integx, integy, dlen; unsigned long hi, mi, lo; /* * First test: If x is -ve and not zero */ if ((x->value.decimal.sign) && ((x->value.decimal.lo != 0) || (x->value.decimal.mi != 0) || (x->value.decimal.hi != 0))) { /* * Then if y is -ve and not zero reverse the compare */ if ((y->value.decimal.sign) && ((y->value.decimal.lo != 0) || (y->value.decimal.mi != 0) || (y->value.decimal.hi != 0))) order = -1; /* * Otherwise (y >= 0) we have the answer */ else return (-1); /* * If x is not -ve and y is -ve we have the answer */ } else if ((y->value.decimal.sign) && ((y->value.decimal.lo != 0) || (y->value.decimal.mi != 0) || (y->value.decimal.hi != 0))) { return (1); } /* * If it's not simply determined by a difference in sign, * then we need to compare the actual values of the two nums. * To do this, we start by looking at the integral parts. * If the number of integral digits differ, then we have our * answer. */ integx = x->value.decimal.total - x->value.decimal.frac; integy = y->value.decimal.total - y->value.decimal.frac; /* * NOTE: We changed the "total" for values like "0.1" * (or "-0.1" or ".1") to be 1, which was 2 previously. * Therefore the special case, when such values are * compared with 0, needs to be handled separately; * otherwise a zero would be recognized incorrectly as * greater than those values. This has the nice side effect * that we gain an overall optimized comparison with zeroes. * Note that a "0" has a "total" of 1 already. */ if (integx == 1) { if (x->value.decimal.lo == 0) { if (integy != 1) return -order; else if (y->value.decimal.lo != 0) return -order; else return(0); } } if (integy == 1) { if (y->value.decimal.lo == 0) { if (integx != 1) return order; else if (x->value.decimal.lo != 0) return order; else return(0); } } if (integx > integy) return order; else if (integy > integx) return -order; /* * If the number of integral digits is the same for both numbers, * then things get a little more complicated. We need to "normalize" * the numbers in order to properly compare them. To do this, we * look at the total length of each number (length => number of * significant digits), and divide the "shorter" by 10 (decreasing * the length) until they are of equal length. */ dlen = x->value.decimal.total - y->value.decimal.total; if (dlen < 0) { /* y has more digits than x */ swp = x; hi = y->value.decimal.hi; mi = y->value.decimal.mi; lo = y->value.decimal.lo; dlen = -dlen; order = -order; } else { /* x has more digits than y */ swp = y; hi = x->value.decimal.hi; mi = x->value.decimal.mi; lo = x->value.decimal.lo; } while (dlen > 8) { /* in effect, right shift by 10**8 */ lo = mi; mi = hi; hi = 0; dlen -= 8; } while (dlen > 0) { unsigned long rem1, rem2; rem1 = (hi % 10) * 100000000L; hi = hi / 10; rem2 = (mi % 10) * 100000000L; mi = (mi + rem1) / 10; lo = (lo + rem2) / 10; dlen--; } if (hi > swp->value.decimal.hi) { return order; } else if (hi == swp->value.decimal.hi) { if (mi > swp->value.decimal.mi) { return order; } else if (mi == swp->value.decimal.mi) { if (lo > swp->value.decimal.lo) { return order; } else if (lo == swp->value.decimal.lo) { if (x->value.decimal.total == y->value.decimal.total) { return 0; } else { return order; } } } } return -order; } /** * xmlSchemaCompareDurations: * @x: a first duration value * @y: a second duration value * * Compare 2 durations * * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in * case of error */ static int xmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) { long carry, mon, day; double sec; int invert = 1; long xmon, xday, myear, minday, maxday; static const long dayRange [2][12] = { { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; if ((x == NULL) || (y == NULL)) return -2; /* months */ mon = x->value.dur.mon - y->value.dur.mon; /* seconds */ sec = x->value.dur.sec - y->value.dur.sec; carry = (long)(sec / SECS_PER_DAY); sec -= ((double)carry) * SECS_PER_DAY; /* days */ day = x->value.dur.day - y->value.dur.day + carry; /* easy test */ if (mon == 0) { if (day == 0) if (sec == 0.0) return 0; else if (sec < 0.0) return -1; else return 1; else if (day < 0) return -1; else return 1; } if (mon > 0) { if ((day >= 0) && (sec >= 0.0)) return 1; else { xmon = mon; xday = -day; } } else if ((day <= 0) && (sec <= 0.0)) { return -1; } else { invert = -1; xmon = -mon; xday = day; } myear = xmon / 12; if (myear == 0) { minday = 0; maxday = 0; } else { maxday = 366 * ((myear + 3) / 4) + 365 * ((myear - 1) % 4); minday = maxday - 1; } xmon = xmon % 12; minday += dayRange[0][xmon]; maxday += dayRange[1][xmon]; if ((maxday == minday) && (maxday == xday)) return(0); /* can this really happen ? */ if (maxday < xday) return(-invert); if (minday > xday) return(invert); /* indeterminate */ return 2; } /* * macros for adding date/times and durations */ #define FQUOTIENT(a,b) (floor(((double)a/(double)b))) #define MODULO(a,b) (a - FQUOTIENT(a,b) * b) #define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) #define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) /** * xmlSchemaDupVal: * @v: the #xmlSchemaValPtr value to duplicate * * Makes a copy of @v. The calling program is responsible for freeing * the returned value. * * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. */ static xmlSchemaValPtr xmlSchemaDupVal (xmlSchemaValPtr v) { xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); if (ret == NULL) return NULL; memcpy(ret, v, sizeof(xmlSchemaVal)); ret->next = NULL; return ret; } /** * xmlSchemaCopyValue: * @val: the precomputed value to be copied * * Copies the precomputed value. This duplicates any string within. * * Returns the copy or NULL if a copy for a data-type is not implemented. */ xmlSchemaValPtr xmlSchemaCopyValue(xmlSchemaValPtr val) { xmlSchemaValPtr ret = NULL, prev = NULL, cur; /* * Copy the string values. */ while (val != NULL) { switch (val->type) { case XML_SCHEMAS_ANYTYPE: case XML_SCHEMAS_IDREFS: case XML_SCHEMAS_ENTITIES: case XML_SCHEMAS_NMTOKENS: xmlSchemaFreeValue(ret); return (NULL); case XML_SCHEMAS_ANYSIMPLETYPE: case XML_SCHEMAS_STRING: case XML_SCHEMAS_NORMSTRING: case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: case XML_SCHEMAS_IDREF: case XML_SCHEMAS_ENTITY: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_ANYURI: cur = xmlSchemaDupVal(val); if (val->value.str != NULL) cur->value.str = xmlStrdup(BAD_CAST val->value.str); break; case XML_SCHEMAS_QNAME: case XML_SCHEMAS_NOTATION: cur = xmlSchemaDupVal(val); if (val->value.qname.name != NULL) cur->value.qname.name = xmlStrdup(BAD_CAST val->value.qname.name); if (val->value.qname.uri != NULL) cur->value.qname.uri = xmlStrdup(BAD_CAST val->value.qname.uri); break; case XML_SCHEMAS_HEXBINARY: cur = xmlSchemaDupVal(val); if (val->value.hex.str != NULL) cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); break; case XML_SCHEMAS_BASE64BINARY: cur = xmlSchemaDupVal(val); if (val->value.base64.str != NULL) cur->value.base64.str = xmlStrdup(BAD_CAST val->value.base64.str); break; default: cur = xmlSchemaDupVal(val); break; } if (ret == NULL) ret = cur; else prev->next = cur; prev = cur; val = val->next; } return (ret); } /** * _xmlSchemaDateAdd: * @dt: an #xmlSchemaValPtr * @dur: an #xmlSchemaValPtr of type #XS_DURATION * * Compute a new date/time from @dt and @dur. This function assumes @dt * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as * @dt. The calling program is responsible for freeing the returned value. * * Returns a pointer to a new #xmlSchemaVal or NULL if error. */ static xmlSchemaValPtr _xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) { xmlSchemaValPtr ret, tmp; long carry, tempdays, temp; xmlSchemaValDatePtr r, d; xmlSchemaValDurationPtr u; if ((dt == NULL) || (dur == NULL)) return NULL; ret = xmlSchemaNewValue(dt->type); if (ret == NULL) return NULL; /* make a copy so we don't alter the original value */ tmp = xmlSchemaDupVal(dt); if (tmp == NULL) { xmlSchemaFreeValue(ret); return NULL; } r = &(ret->value.date); d = &(tmp->value.date); u = &(dur->value.dur); /* normalization */ if (d->mon == 0) d->mon = 1; /* normalize for time zone offset */ u->sec -= (d->tzo * 60); d->tzo = 0; /* normalization */ if (d->day == 0) d->day = 1; /* month */ carry = d->mon + u->mon; r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); carry = (long) FQUOTIENT_RANGE(carry, 1, 13); /* year (may be modified later) */ r->year = d->year + carry; if (r->year == 0) { if (d->year > 0) r->year--; else r->year++; } /* time zone */ r->tzo = d->tzo; r->tz_flag = d->tz_flag; /* seconds */ r->sec = d->sec + u->sec; carry = (long) FQUOTIENT((long)r->sec, 60); if (r->sec != 0.0) { r->sec = MODULO(r->sec, 60.0); } /* minute */ carry += d->min; r->min = (unsigned int) MODULO(carry, 60); carry = (long) FQUOTIENT(carry, 60); /* hours */ carry += d->hour; r->hour = (unsigned int) MODULO(carry, 24); carry = (long)FQUOTIENT(carry, 24); /* * days * Note we use tempdays because the temporary values may need more * than 5 bits */ if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && (d->day > MAX_DAYINMONTH(r->year, r->mon))) tempdays = MAX_DAYINMONTH(r->year, r->mon); else if (d->day < 1) tempdays = 1; else tempdays = d->day; tempdays += u->day + carry; while (1) { if (tempdays < 1) { long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13); long tyr = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13); if (tyr == 0) tyr--; /* * Coverity detected an overrun in daysInMonth * of size 12 at position 12 with index variable "((r)->mon - 1)" */ if (tmon < 0) tmon = 0; if (tmon > 12) tmon = 12; tempdays += MAX_DAYINMONTH(tyr, tmon); carry = -1; } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); carry = 1; } else break; temp = r->mon + carry; r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); if (r->year == 0) { if (temp < 1) r->year--; else r->year++; } } r->day = tempdays; /* * adjust the date/time type to the date values */ if (ret->type != XML_SCHEMAS_DATETIME) { if ((r->hour) || (r->min) || (r->sec)) ret->type = XML_SCHEMAS_DATETIME; else if (ret->type != XML_SCHEMAS_DATE) { if ((r->mon != 1) && (r->day != 1)) ret->type = XML_SCHEMAS_DATE; else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) ret->type = XML_SCHEMAS_GYEARMONTH; } } xmlSchemaFreeValue(tmp); return ret; } /** * xmlSchemaDateNormalize: * @dt: an #xmlSchemaValPtr of a date/time type value. * @offset: number of seconds to adjust @dt by. * * Normalize @dt to GMT time. The @offset parameter is subtracted from * the return value is a time-zone offset is present on @dt. * * Returns a normalized copy of @dt or NULL if error. */ static xmlSchemaValPtr xmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) { xmlSchemaValPtr dur, ret; if (dt == NULL) return NULL; if (((dt->type != XML_SCHEMAS_TIME) && (dt->type != XML_SCHEMAS_DATETIME) && (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) return xmlSchemaDupVal(dt); dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); if (dur == NULL) return NULL; dur->value.date.sec -= offset; ret = _xmlSchemaDateAdd(dt, dur); if (ret == NULL) return NULL; xmlSchemaFreeValue(dur); /* ret->value.date.tzo = 0; */ return ret; } /** * _xmlSchemaDateCastYMToDays: * @dt: an #xmlSchemaValPtr * * Convert mon and year of @dt to total number of days. Take the * number of years since (or before) 1 AD and add the number of leap * years. This is a function because negative * years must be handled a little differently and there is no zero year. * * Returns number of days. */ static long _xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) { long ret; int mon; mon = dt->value.date.mon; if (mon <= 0) mon = 1; /* normalization */ if (dt->value.date.year <= 0) ret = (dt->value.date.year * 365) + (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ ((dt->value.date.year+1)/400)) + DAY_IN_YEAR(0, mon, dt->value.date.year); else ret = ((dt->value.date.year-1) * 365) + (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ ((dt->value.date.year-1)/400)) + DAY_IN_YEAR(0, mon, dt->value.date.year); return ret; } /** * TIME_TO_NUMBER: * @dt: an #xmlSchemaValPtr * * Calculates the number of seconds in the time portion of @dt. * * Returns seconds. */ #define TIME_TO_NUMBER(dt) \ ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ (dt->value.date.min * SECS_PER_MIN) + \ (dt->value.date.tzo * SECS_PER_MIN)) + \ dt->value.date.sec) /** * xmlSchemaCompareDates: * @x: a first date/time value * @y: a second date/time value * * Compare 2 date/times * * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in * case of error */ static int xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) { unsigned char xmask, ymask, xor_mask, and_mask; xmlSchemaValPtr p1, p2, q1, q2; long p1d, p2d, q1d, q2d; if ((x == NULL) || (y == NULL)) return -2; if (x->value.date.tz_flag) { if (!y->value.date.tz_flag) { p1 = xmlSchemaDateNormalize(x, 0); p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; /* normalize y + 14:00 */ q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; if (p1d < q1d) { xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); return -1; } else if (p1d == q1d) { double sec; sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); if (sec < 0.0) { xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); return -1; } else { int ret = 0; /* normalize y - 14:00 */ q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; if (p1d > q2d) ret = 1; else if (p1d == q2d) { sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); if (sec > 0.0) ret = 1; else ret = 2; /* indeterminate */ } xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); xmlSchemaFreeValue(q2); if (ret != 0) return(ret); } } else { xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); } } } else if (y->value.date.tz_flag) { q1 = xmlSchemaDateNormalize(y, 0); q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; /* normalize x - 14:00 */ p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; if (p1d < q1d) { xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); return -1; } else if (p1d == q1d) { double sec; sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); if (sec < 0.0) { xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); return -1; } else { int ret = 0; /* normalize x + 14:00 */ p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; if (p2d > q1d) { ret = 1; } else if (p2d == q1d) { sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); if (sec > 0.0) ret = 1; else ret = 2; /* indeterminate */ } xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); xmlSchemaFreeValue(p2); if (ret != 0) return(ret); } } else { xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); } } /* * if the same type then calculate the difference */ if (x->type == y->type) { int ret = 0; q1 = xmlSchemaDateNormalize(y, 0); q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; p1 = xmlSchemaDateNormalize(x, 0); p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; if (p1d < q1d) { ret = -1; } else if (p1d > q1d) { ret = 1; } else { double sec; sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); if (sec < 0.0) ret = -1; else if (sec > 0.0) ret = 1; } xmlSchemaFreeValue(p1); xmlSchemaFreeValue(q1); return(ret); } switch (x->type) { case XML_SCHEMAS_DATETIME: xmask = 0xf; break; case XML_SCHEMAS_DATE: xmask = 0x7; break; case XML_SCHEMAS_GYEAR: xmask = 0x1; break; case XML_SCHEMAS_GMONTH: xmask = 0x2; break; case XML_SCHEMAS_GDAY: xmask = 0x3; break; case XML_SCHEMAS_GYEARMONTH: xmask = 0x3; break; case XML_SCHEMAS_GMONTHDAY: xmask = 0x6; break; case XML_SCHEMAS_TIME: xmask = 0x8; break; default: xmask = 0; break; } switch (y->type) { case XML_SCHEMAS_DATETIME: ymask = 0xf; break; case XML_SCHEMAS_DATE: ymask = 0x7; break; case XML_SCHEMAS_GYEAR: ymask = 0x1; break; case XML_SCHEMAS_GMONTH: ymask = 0x2; break; case XML_SCHEMAS_GDAY: ymask = 0x3; break; case XML_SCHEMAS_GYEARMONTH: ymask = 0x3; break; case XML_SCHEMAS_GMONTHDAY: ymask = 0x6; break; case XML_SCHEMAS_TIME: ymask = 0x8; break; default: ymask = 0; break; } xor_mask = xmask ^ ymask; /* mark type differences */ and_mask = xmask & ymask; /* mark field specification */ /* year */ if (xor_mask & 1) return 2; /* indeterminate */ else if (and_mask & 1) { if (x->value.date.year < y->value.date.year) return -1; else if (x->value.date.year > y->value.date.year) return 1; } /* month */ if (xor_mask & 2) return 2; /* indeterminate */ else if (and_mask & 2) { if (x->value.date.mon < y->value.date.mon) return -1; else if (x->value.date.mon > y->value.date.mon) return 1; } /* day */ if (xor_mask & 4) return 2; /* indeterminate */ else if (and_mask & 4) { if (x->value.date.day < y->value.date.day) return -1; else if (x->value.date.day > y->value.date.day) return 1; } /* time */ if (xor_mask & 8) return 2; /* indeterminate */ else if (and_mask & 8) { if (x->value.date.hour < y->value.date.hour) return -1; else if (x->value.date.hour > y->value.date.hour) return 1; else if (x->value.date.min < y->value.date.min) return -1; else if (x->value.date.min > y->value.date.min) return 1; else if (x->value.date.sec < y->value.date.sec) return -1; else if (x->value.date.sec > y->value.date.sec) return 1; } return 0; } /** * xmlSchemaComparePreserveReplaceStrings: * @x: a first string value * @y: a second string value * @invert: inverts the result if x < y or x > y. * * Compare 2 string for their normalized values. * @x is a string with whitespace of "preserve", @y is * a string with a whitespace of "replace". I.e. @x could * be an "xsd:string" and @y an "xsd:normalizedString". * * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in * case of error */ static int xmlSchemaComparePreserveReplaceStrings(const xmlChar *x, const xmlChar *y, int invert) { int tmp; while ((*x != 0) && (*y != 0)) { if (IS_WSP_REPLACE_CH(*y)) { if (! IS_WSP_SPACE_CH(*x)) { if ((*x - 0x20) < 0) { if (invert) return(1); else return(-1); } else { if (invert) return(-1); else return(1); } } } else { tmp = *x - *y; if (tmp < 0) { if (invert) return(1); else return(-1); } if (tmp > 0) { if (invert) return(-1); else return(1); } } x++; y++; } if (*x != 0) { if (invert) return(-1); else return(1); } if (*y != 0) { if (invert) return(1); else return(-1); } return(0); } /** * xmlSchemaComparePreserveCollapseStrings: * @x: a first string value * @y: a second string value * * Compare 2 string for their normalized values. * @x is a string with whitespace of "preserve", @y is * a string with a whitespace of "collapse". I.e. @x could * be an "xsd:string" and @y an "xsd:normalizedString". * * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in * case of error */ static int xmlSchemaComparePreserveCollapseStrings(const xmlChar *x, const xmlChar *y, int invert) { int tmp; /* * Skip leading blank chars of the collapsed string. */ while IS_WSP_BLANK_CH(*y) y++; while ((*x != 0) && (*y != 0)) { if IS_WSP_BLANK_CH(*y) { if (! IS_WSP_SPACE_CH(*x)) { /* * The yv character would have been replaced to 0x20. */ if ((*x - 0x20) < 0) { if (invert) return(1); else return(-1); } else { if (invert) return(-1); else return(1); } } x++; y++; /* * Skip contiguous blank chars of the collapsed string. */ while IS_WSP_BLANK_CH(*y) y++; } else { tmp = *x++ - *y++; if (tmp < 0) { if (invert) return(1); else return(-1); } if (tmp > 0) { if (invert) return(-1); else return(1); } } } if (*x != 0) { if (invert) return(-1); else return(1); } if (*y != 0) { /* * Skip trailing blank chars of the collapsed string. */ while IS_WSP_BLANK_CH(*y) y++; if (*y != 0) { if (invert) return(1); else return(-1); } } return(0); } /** * xmlSchemaComparePreserveCollapseStrings: * @x: a first string value * @y: a second string value * * Compare 2 string for their normalized values. * @x is a string with whitespace of "preserve", @y is * a string with a whitespace of "collapse". I.e. @x could * be an "xsd:string" and @y an "xsd:normalizedString". * * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in * case of error */ static int xmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, const xmlChar *y, int invert) { int tmp; /* * Skip leading blank chars of the collapsed string. */ while IS_WSP_BLANK_CH(*y) y++; while ((*x != 0) && (*y != 0)) { if IS_WSP_BLANK_CH(*y) { if (! IS_WSP_BLANK_CH(*x)) { /* * The yv character would have been replaced to 0x20. */ if ((*x - 0x20) < 0) { if (invert) return(1); else return(-1); } else { if (invert) return(-1); else return(1); } } x++; y++; /* * Skip contiguous blank chars of the collapsed string. */ while IS_WSP_BLANK_CH(*y) y++; } else { if IS_WSP_BLANK_CH(*x) { /* * The xv character would have been replaced to 0x20. */ if ((0x20 - *y) < 0) { if (invert) return(1); else return(-1); } else { if (invert) return(-1); else return(1); } } tmp = *x++ - *y++; if (tmp < 0) return(-1); if (tmp > 0) return(1); } } if (*x != 0) { if (invert) return(-1); else return(1); } if (*y != 0) { /* * Skip trailing blank chars of the collapsed string. */ while IS_WSP_BLANK_CH(*y) y++; if (*y != 0) { if (invert) return(1); else return(-1); } } return(0); } /** * xmlSchemaCompareReplacedStrings: * @x: a first string value * @y: a second string value * * Compare 2 string for their normalized values. * * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in * case of error */ static int xmlSchemaCompareReplacedStrings(const xmlChar *x, const xmlChar *y) { int tmp; while ((*x != 0) && (*y != 0)) { if IS_WSP_BLANK_CH(*y) { if (! IS_WSP_BLANK_CH(*x)) { if ((*x - 0x20) < 0) return(-1); else return(1); } } else { if IS_WSP_BLANK_CH(*x) { if ((0x20 - *y) < 0) return(-1); else return(1); } tmp = *x - *y; if (tmp < 0) return(-1); if (tmp > 0) return(1); } x++; y++; } if (*x != 0) return(1); if (*y != 0) return(-1); return(0); } /** * xmlSchemaCompareNormStrings: * @x: a first string value * @y: a second string value * * Compare 2 string for their normalized values. * * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in * case of error */ static int xmlSchemaCompareNormStrings(const xmlChar *x, const xmlChar *y) { int tmp; while (IS_BLANK_CH(*x)) x++; while (IS_BLANK_CH(*y)) y++; while ((*x != 0) && (*y != 0)) { if (IS_BLANK_CH(*x)) { if (!IS_BLANK_CH(*y)) { tmp = *x - *y; return(tmp); } while (IS_BLANK_CH(*x)) x++; while (IS_BLANK_CH(*y)) y++; } else { tmp = *x++ - *y++; if (tmp < 0) return(-1); if (tmp > 0) return(1); } } if (*x != 0) { while (IS_BLANK_CH(*x)) x++; if (*x != 0) return(1); } if (*y != 0) { while (IS_BLANK_CH(*y)) y++; if (*y != 0) return(-1); } return(0); } /** * xmlSchemaCompareFloats: * @x: a first float or double value * @y: a second float or double value * * Compare 2 values * * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in * case of error */ static int xmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { double d1, d2; if ((x == NULL) || (y == NULL)) return(-2); /* * Cast everything to doubles. */ if (x->type == XML_SCHEMAS_DOUBLE) d1 = x->value.d; else if (x->type == XML_SCHEMAS_FLOAT) d1 = x->value.f; else return(-2); if (y->type == XML_SCHEMAS_DOUBLE) d2 = y->value.d; else if (y->type == XML_SCHEMAS_FLOAT) d2 = y->value.f; else return(-2); /* * Check for special cases. */ if (xmlXPathIsNaN(d1)) { if (xmlXPathIsNaN(d2)) return(0); return(1); } if (xmlXPathIsNaN(d2)) return(-1); if (d1 == xmlXPathPINF) { if (d2 == xmlXPathPINF) return(0); return(1); } if (d2 == xmlXPathPINF) return(-1); if (d1 == xmlXPathNINF) { if (d2 == xmlXPathNINF) return(0); return(-1); } if (d2 == xmlXPathNINF) return(1); /* * basic tests, the last one we should have equality, but * portability is more important than speed and handling * NaN or Inf in a portable way is always a challenge, so ... */ if (d1 < d2) return(-1); if (d1 > d2) return(1); if (d1 == d2) return(0); return(2); } /** * xmlSchemaCompareValues: * @x: a first value * @xvalue: the first value as a string (optional) * @xwtsp: the whitespace type * @y: a second value * @xvalue: the second value as a string (optional) * @ywtsp: the whitespace type * * Compare 2 values * * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not * comparable and -2 in case of error */ static int xmlSchemaCompareValuesInternal(xmlSchemaValType xtype, xmlSchemaValPtr x, const xmlChar *xvalue, xmlSchemaWhitespaceValueType xws, xmlSchemaValType ytype, xmlSchemaValPtr y, const xmlChar *yvalue, xmlSchemaWhitespaceValueType yws) { switch (xtype) { case XML_SCHEMAS_UNKNOWN: case XML_SCHEMAS_ANYTYPE: return(-2); case XML_SCHEMAS_INTEGER: case XML_SCHEMAS_NPINTEGER: case XML_SCHEMAS_NINTEGER: case XML_SCHEMAS_NNINTEGER: case XML_SCHEMAS_PINTEGER: case XML_SCHEMAS_INT: case XML_SCHEMAS_UINT: case XML_SCHEMAS_LONG: case XML_SCHEMAS_ULONG: case XML_SCHEMAS_SHORT: case XML_SCHEMAS_USHORT: case XML_SCHEMAS_BYTE: case XML_SCHEMAS_UBYTE: case XML_SCHEMAS_DECIMAL: if ((x == NULL) || (y == NULL)) return(-2); if (ytype == xtype) return(xmlSchemaCompareDecimals(x, y)); if ((ytype == XML_SCHEMAS_DECIMAL) || (ytype == XML_SCHEMAS_INTEGER) || (ytype == XML_SCHEMAS_NPINTEGER) || (ytype == XML_SCHEMAS_NINTEGER) || (ytype == XML_SCHEMAS_NNINTEGER) || (ytype == XML_SCHEMAS_PINTEGER) || (ytype == XML_SCHEMAS_INT) || (ytype == XML_SCHEMAS_UINT) || (ytype == XML_SCHEMAS_LONG) || (ytype == XML_SCHEMAS_ULONG) || (ytype == XML_SCHEMAS_SHORT) || (ytype == XML_SCHEMAS_USHORT) || (ytype == XML_SCHEMAS_BYTE) || (ytype == XML_SCHEMAS_UBYTE)) return(xmlSchemaCompareDecimals(x, y)); return(-2); case XML_SCHEMAS_DURATION: if ((x == NULL) || (y == NULL)) return(-2); if (ytype == XML_SCHEMAS_DURATION) return(xmlSchemaCompareDurations(x, y)); return(-2); case XML_SCHEMAS_TIME: case XML_SCHEMAS_GDAY: case XML_SCHEMAS_GMONTH: case XML_SCHEMAS_GMONTHDAY: case XML_SCHEMAS_GYEAR: case XML_SCHEMAS_GYEARMONTH: case XML_SCHEMAS_DATE: case XML_SCHEMAS_DATETIME: if ((x == NULL) || (y == NULL)) return(-2); if ((ytype == XML_SCHEMAS_DATETIME) || (ytype == XML_SCHEMAS_TIME) || (ytype == XML_SCHEMAS_GDAY) || (ytype == XML_SCHEMAS_GMONTH) || (ytype == XML_SCHEMAS_GMONTHDAY) || (ytype == XML_SCHEMAS_GYEAR) || (ytype == XML_SCHEMAS_DATE) || (ytype == XML_SCHEMAS_GYEARMONTH)) return (xmlSchemaCompareDates(x, y)); return (-2); /* * Note that we will support comparison of string types against * anySimpleType as well. */ case XML_SCHEMAS_ANYSIMPLETYPE: case XML_SCHEMAS_STRING: case XML_SCHEMAS_NORMSTRING: case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_NAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: case XML_SCHEMAS_IDREF: case XML_SCHEMAS_ENTITY: case XML_SCHEMAS_ANYURI: { const xmlChar *xv, *yv; if (x == NULL) xv = xvalue; else xv = x->value.str; if (y == NULL) yv = yvalue; else yv = y->value.str; /* * TODO: Compare those against QName. */ if (ytype == XML_SCHEMAS_QNAME) { TODO if (y == NULL) return(-2); return (-2); } if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || (ytype == XML_SCHEMAS_STRING) || (ytype == XML_SCHEMAS_NORMSTRING) || (ytype == XML_SCHEMAS_TOKEN) || (ytype == XML_SCHEMAS_LANGUAGE) || (ytype == XML_SCHEMAS_NMTOKEN) || (ytype == XML_SCHEMAS_NAME) || (ytype == XML_SCHEMAS_NCNAME) || (ytype == XML_SCHEMAS_ID) || (ytype == XML_SCHEMAS_IDREF) || (ytype == XML_SCHEMAS_ENTITY) || (ytype == XML_SCHEMAS_ANYURI)) { if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { /* TODO: What about x < y or x > y. */ if (xmlStrEqual(xv, yv)) return (0); else return (2); } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); if (yws == XML_SCHEMA_WHITESPACE_REPLACE) return (xmlSchemaCompareReplacedStrings(xv, yv)); if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); if (yws == XML_SCHEMA_WHITESPACE_REPLACE) return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) return (xmlSchemaCompareNormStrings(xv, yv)); } else return (-2); } return (-2); } case XML_SCHEMAS_QNAME: case XML_SCHEMAS_NOTATION: if ((x == NULL) || (y == NULL)) return(-2); if ((ytype == XML_SCHEMAS_QNAME) || (ytype == XML_SCHEMAS_NOTATION)) { if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) return(0); return(2); } return (-2); case XML_SCHEMAS_FLOAT: case XML_SCHEMAS_DOUBLE: if ((x == NULL) || (y == NULL)) return(-2); if ((ytype == XML_SCHEMAS_FLOAT) || (ytype == XML_SCHEMAS_DOUBLE)) return (xmlSchemaCompareFloats(x, y)); return (-2); case XML_SCHEMAS_BOOLEAN: if ((x == NULL) || (y == NULL)) return(-2); if (ytype == XML_SCHEMAS_BOOLEAN) { if (x->value.b == y->value.b) return(0); if (x->value.b == 0) return(-1); return(1); } return (-2); case XML_SCHEMAS_HEXBINARY: if ((x == NULL) || (y == NULL)) return(-2); if (ytype == XML_SCHEMAS_HEXBINARY) { if (x->value.hex.total == y->value.hex.total) { int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); if (ret > 0) return(1); else if (ret == 0) return(0); } else if (x->value.hex.total > y->value.hex.total) return(1); return(-1); } return (-2); case XML_SCHEMAS_BASE64BINARY: if ((x == NULL) || (y == NULL)) return(-2); if (ytype == XML_SCHEMAS_BASE64BINARY) { if (x->value.base64.total == y->value.base64.total) { int ret = xmlStrcmp(x->value.base64.str, y->value.base64.str); if (ret > 0) return(1); else if (ret == 0) return(0); else return(-1); } else if (x->value.base64.total > y->value.base64.total) return(1); else return(-1); } return (-2); case XML_SCHEMAS_IDREFS: case XML_SCHEMAS_ENTITIES: case XML_SCHEMAS_NMTOKENS: TODO break; } return -2; } /** * xmlSchemaCompareValues: * @x: a first value * @y: a second value * * Compare 2 values * * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in * case of error */ int xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { xmlSchemaWhitespaceValueType xws, yws; if ((x == NULL) || (y == NULL)) return(-2); if (x->type == XML_SCHEMAS_STRING) xws = XML_SCHEMA_WHITESPACE_PRESERVE; else if (x->type == XML_SCHEMAS_NORMSTRING) xws = XML_SCHEMA_WHITESPACE_REPLACE; else xws = XML_SCHEMA_WHITESPACE_COLLAPSE; if (y->type == XML_SCHEMAS_STRING) yws = XML_SCHEMA_WHITESPACE_PRESERVE; else if (x->type == XML_SCHEMAS_NORMSTRING) yws = XML_SCHEMA_WHITESPACE_REPLACE; else yws = XML_SCHEMA_WHITESPACE_COLLAPSE; return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, y, NULL, yws)); } /** * xmlSchemaCompareValuesWhtsp: * @x: a first value * @xws: the whitespace value of x * @y: a second value * @yws: the whitespace value of y * * Compare 2 values * * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in * case of error */ int xmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, xmlSchemaWhitespaceValueType xws, xmlSchemaValPtr y, xmlSchemaWhitespaceValueType yws) { if ((x == NULL) || (y == NULL)) return(-2); return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, y, NULL, yws)); } /** * xmlSchemaCompareValuesWhtspExt: * @x: a first value * @xws: the whitespace value of x * @y: a second value * @yws: the whitespace value of y * * Compare 2 values * * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in * case of error */ static int xmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, xmlSchemaValPtr x, const xmlChar *xvalue, xmlSchemaWhitespaceValueType xws, xmlSchemaValType ytype, xmlSchemaValPtr y, const xmlChar *yvalue, xmlSchemaWhitespaceValueType yws) { return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, yvalue, yws)); } /** * xmlSchemaNormLen: * @value: a string * * Computes the UTF8 length of the normalized value of the string * * Returns the length or -1 in case of error. */ static int xmlSchemaNormLen(const xmlChar *value) { const xmlChar *utf; int ret = 0; if (value == NULL) return(-1); utf = value; while (IS_BLANK_CH(*utf)) utf++; while (*utf != 0) { if (utf[0] & 0x80) { if ((utf[1] & 0xc0) != 0x80) return(-1); if ((utf[0] & 0xe0) == 0xe0) { if ((utf[2] & 0xc0) != 0x80) return(-1); if ((utf[0] & 0xf0) == 0xf0) { if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) return(-1); utf += 4; } else { utf += 3; } } else { utf += 2; } } else if (IS_BLANK_CH(*utf)) { while (IS_BLANK_CH(*utf)) utf++; if (*utf == 0) break; } else { utf++; } ret++; } return(ret); } /** * xmlSchemaGetFacetValueAsULong: * @facet: an schemas type facet * * Extract the value of a facet * * Returns the value as a long */ unsigned long xmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) { /* * TODO: Check if this is a decimal. */ if (facet == NULL) return 0; return ((unsigned long) facet->val->value.decimal.lo); } /** * xmlSchemaValidateListSimpleTypeFacet: * @facet: the facet to check * @value: the lexical repr of the value to validate * @actualLen: the number of list items * @expectedLen: the resulting expected number of list items * * Checks the value of a list simple type against a facet. * * Returns 0 if the value is valid, a positive error code * number otherwise and -1 in case of an internal error. */ int xmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, const xmlChar *value, unsigned long actualLen, unsigned long *expectedLen) { if (facet == NULL) return(-1); /* * TODO: Check if this will work with large numbers. * (compare value.decimal.mi and value.decimal.hi as well?). */ if (facet->type == XML_SCHEMA_FACET_LENGTH) { if (actualLen != facet->val->value.decimal.lo) { if (expectedLen != NULL) *expectedLen = facet->val->value.decimal.lo; return (XML_SCHEMAV_CVC_LENGTH_VALID); } } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { if (actualLen < facet->val->value.decimal.lo) { if (expectedLen != NULL) *expectedLen = facet->val->value.decimal.lo; return (XML_SCHEMAV_CVC_MINLENGTH_VALID); } } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { if (actualLen > facet->val->value.decimal.lo) { if (expectedLen != NULL) *expectedLen = facet->val->value.decimal.lo; return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); } } else /* * NOTE: That we can pass NULL as xmlSchemaValPtr to * xmlSchemaValidateFacet, since the remaining facet types * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. */ return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); return (0); } /** * xmlSchemaValidateLengthFacet: * @type: the built-in type * @facet: the facet to check * @value: the lexical repr. of the value to be validated * @val: the precomputed value * @ws: the whitespace type of the value * @length: the actual length of the value * * Checka a value against a "length", "minLength" and "maxLength" * facet; sets @length to the computed length of @value. * * Returns 0 if the value is valid, a positive error code * otherwise and -1 in case of an internal or API error. */ static int xmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, xmlSchemaValType valType, const xmlChar *value, xmlSchemaValPtr val, unsigned long *length, xmlSchemaWhitespaceValueType ws) { unsigned int len = 0; if ((length == NULL) || (facet == NULL)) return (-1); *length = 0; if ((facet->type != XML_SCHEMA_FACET_LENGTH) && (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && (facet->type != XML_SCHEMA_FACET_MINLENGTH)) return (-1); /* * TODO: length, maxLength and minLength must be of type * nonNegativeInteger only. Check if decimal is used somehow. */ if ((facet->val == NULL) || ((facet->val->type != XML_SCHEMAS_DECIMAL) && (facet->val->type != XML_SCHEMAS_NNINTEGER)) || (facet->val->value.decimal.frac != 0)) { return(-1); } if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) len = val->value.hex.total; else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) len = val->value.base64.total; else { switch (valType) { case XML_SCHEMAS_STRING: case XML_SCHEMAS_NORMSTRING: if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { /* * This is to ensure API compatibility with the old * xmlSchemaValidateLengthFacet(). Anyway, this was and * is not the correct handling. * TODO: Get rid of this case somehow. */ if (valType == XML_SCHEMAS_STRING) len = xmlUTF8Strlen(value); else len = xmlSchemaNormLen(value); } else if (value != NULL) { if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) len = xmlSchemaNormLen(value); else /* * Should be OK for "preserve" as well. */ len = xmlUTF8Strlen(value); } break; case XML_SCHEMAS_IDREF: case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_NAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: /* * FIXME: What exactly to do with anyURI? */ case XML_SCHEMAS_ANYURI: if (value != NULL) len = xmlSchemaNormLen(value); break; case XML_SCHEMAS_QNAME: case XML_SCHEMAS_NOTATION: /* * For QName and NOTATION, those facets are * deprecated and should be ignored. */ return (0); default: TODO } } *length = (unsigned long) len; /* * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". */ if (facet->type == XML_SCHEMA_FACET_LENGTH) { if (len != facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_LENGTH_VALID); } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { if (len < facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_MINLENGTH_VALID); } else { if (len > facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); } return (0); } /** * xmlSchemaValidateLengthFacet: * @type: the built-in type * @facet: the facet to check * @value: the lexical repr. of the value to be validated * @val: the precomputed value * @length: the actual length of the value * * Checka a value against a "length", "minLength" and "maxLength" * facet; sets @length to the computed length of @value. * * Returns 0 if the value is valid, a positive error code * otherwise and -1 in case of an internal or API error. */ int xmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, xmlSchemaFacetPtr facet, const xmlChar *value, xmlSchemaValPtr val, unsigned long *length) { if (type == NULL) return(-1); return (xmlSchemaValidateLengthFacetInternal(facet, type->builtInType, value, val, length, XML_SCHEMA_WHITESPACE_UNKNOWN)); } /** * xmlSchemaValidateLengthFacetWhtsp: * @facet: the facet to check * @valType: the built-in type * @value: the lexical repr. of the value to be validated * @val: the precomputed value * @ws: the whitespace type of the value * @length: the actual length of the value * * Checka a value against a "length", "minLength" and "maxLength" * facet; sets @length to the computed length of @value. * * Returns 0 if the value is valid, a positive error code * otherwise and -1 in case of an internal or API error. */ int xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, xmlSchemaValType valType, const xmlChar *value, xmlSchemaValPtr val, unsigned long *length, xmlSchemaWhitespaceValueType ws) { return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, length, ws)); } /** * xmlSchemaValidateFacetInternal: * @facet: the facet to check * @fws: the whitespace type of the facet's value * @valType: the built-in type of the value * @value: the lexical repr of the value to validate * @val: the precomputed value * @ws: the whitespace type of the value * * Check a value against a facet condition * * Returns 0 if the element is schemas valid, a positive error code * number otherwise and -1 in case of internal or API error. */ static int xmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, xmlSchemaWhitespaceValueType fws, xmlSchemaValType valType, const xmlChar *value, xmlSchemaValPtr val, xmlSchemaWhitespaceValueType ws) { int ret; if (facet == NULL) return(-1); switch (facet->type) { case XML_SCHEMA_FACET_PATTERN: /* * NOTE that for patterns, the @value needs to be the normalized * value, *not* the lexical initial value or the canonical value. */ if (value == NULL) return(-1); ret = xmlRegexpExec(facet->regexp, value); if (ret == 1) return(0); if (ret == 0) return(XML_SCHEMAV_CVC_PATTERN_VALID); return(ret); case XML_SCHEMA_FACET_MAXEXCLUSIVE: ret = xmlSchemaCompareValues(val, facet->val); if (ret == -2) return(-1); if (ret == -1) return(0); return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); case XML_SCHEMA_FACET_MAXINCLUSIVE: ret = xmlSchemaCompareValues(val, facet->val); if (ret == -2) return(-1); if ((ret == -1) || (ret == 0)) return(0); return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); case XML_SCHEMA_FACET_MINEXCLUSIVE: ret = xmlSchemaCompareValues(val, facet->val); if (ret == -2) return(-1); if (ret == 1) return(0); return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); case XML_SCHEMA_FACET_MININCLUSIVE: ret = xmlSchemaCompareValues(val, facet->val); if (ret == -2) return(-1); if ((ret == 1) || (ret == 0)) return(0); return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); case XML_SCHEMA_FACET_WHITESPACE: /* TODO whitespaces */ /* * NOTE: Whitespace should be handled to normalize * the value to be validated against a the facets; * not to normalize the value in-between. */ return(0); case XML_SCHEMA_FACET_ENUMERATION: if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { /* * This is to ensure API compatibility with the old * xmlSchemaValidateFacet(). * TODO: Get rid of this case. */ if ((facet->value != NULL) && (xmlStrEqual(facet->value, value))) return(0); } else { ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, facet->val, facet->value, fws, valType, val, value, ws); if (ret == -2) return(-1); if (ret == 0) return(0); } return(XML_SCHEMAV_CVC_ENUMERATION_VALID); case XML_SCHEMA_FACET_LENGTH: /* * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, * then any {value} is facet-valid." */ if ((valType == XML_SCHEMAS_QNAME) || (valType == XML_SCHEMAS_NOTATION)) return (0); /* No break on purpose. */ case XML_SCHEMA_FACET_MAXLENGTH: case XML_SCHEMA_FACET_MINLENGTH: { unsigned int len = 0; if ((valType == XML_SCHEMAS_QNAME) || (valType == XML_SCHEMAS_NOTATION)) return (0); /* * TODO: length, maxLength and minLength must be of type * nonNegativeInteger only. Check if decimal is used somehow. */ if ((facet->val == NULL) || ((facet->val->type != XML_SCHEMAS_DECIMAL) && (facet->val->type != XML_SCHEMAS_NNINTEGER)) || (facet->val->value.decimal.frac != 0)) { return(-1); } if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) len = val->value.hex.total; else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) len = val->value.base64.total; else { switch (valType) { case XML_SCHEMAS_STRING: case XML_SCHEMAS_NORMSTRING: if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { /* * This is to ensure API compatibility with the old * xmlSchemaValidateFacet(). Anyway, this was and * is not the correct handling. * TODO: Get rid of this case somehow. */ if (valType == XML_SCHEMAS_STRING) len = xmlUTF8Strlen(value); else len = xmlSchemaNormLen(value); } else if (value != NULL) { if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) len = xmlSchemaNormLen(value); else /* * Should be OK for "preserve" as well. */ len = xmlUTF8Strlen(value); } break; case XML_SCHEMAS_IDREF: case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_NAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: case XML_SCHEMAS_ANYURI: if (value != NULL) len = xmlSchemaNormLen(value); break; default: TODO } } if (facet->type == XML_SCHEMA_FACET_LENGTH) { if (len != facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_LENGTH_VALID); } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { if (len < facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_MINLENGTH_VALID); } else { if (len > facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); } break; } case XML_SCHEMA_FACET_TOTALDIGITS: case XML_SCHEMA_FACET_FRACTIONDIGITS: if ((facet->val == NULL) || ((facet->val->type != XML_SCHEMAS_PINTEGER) && (facet->val->type != XML_SCHEMAS_NNINTEGER)) || (facet->val->value.decimal.frac != 0)) { return(-1); } if ((val == NULL) || ((val->type != XML_SCHEMAS_DECIMAL) && (val->type != XML_SCHEMAS_INTEGER) && (val->type != XML_SCHEMAS_NPINTEGER) && (val->type != XML_SCHEMAS_NINTEGER) && (val->type != XML_SCHEMAS_NNINTEGER) && (val->type != XML_SCHEMAS_PINTEGER) && (val->type != XML_SCHEMAS_INT) && (val->type != XML_SCHEMAS_UINT) && (val->type != XML_SCHEMAS_LONG) && (val->type != XML_SCHEMAS_ULONG) && (val->type != XML_SCHEMAS_SHORT) && (val->type != XML_SCHEMAS_USHORT) && (val->type != XML_SCHEMAS_BYTE) && (val->type != XML_SCHEMAS_UBYTE))) { return(-1); } if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { if (val->value.decimal.total > facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { if (val->value.decimal.frac > facet->val->value.decimal.lo) return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); } break; default: TODO } return(0); } /** * xmlSchemaValidateFacet: * @base: the base type * @facet: the facet to check * @value: the lexical repr of the value to validate * @val: the precomputed value * * Check a value against a facet condition * * Returns 0 if the element is schemas valid, a positive error code * number otherwise and -1 in case of internal or API error. */ int xmlSchemaValidateFacet(xmlSchemaTypePtr base, xmlSchemaFacetPtr facet, const xmlChar *value, xmlSchemaValPtr val) { /* * This tries to ensure API compatibility regarding the old * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and * xmlSchemaValidateFacetWhtsp(). */ if (val != NULL) return(xmlSchemaValidateFacetInternal(facet, XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, XML_SCHEMA_WHITESPACE_UNKNOWN)); else if (base != NULL) return(xmlSchemaValidateFacetInternal(facet, XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, XML_SCHEMA_WHITESPACE_UNKNOWN)); return(-1); } /** * xmlSchemaValidateFacetWhtsp: * @facet: the facet to check * @fws: the whitespace type of the facet's value * @valType: the built-in type of the value * @value: the lexical (or normalized for pattern) repr of the value to validate * @val: the precomputed value * @ws: the whitespace type of the value * * Check a value against a facet condition. This takes value normalization * according to the specified whitespace types into account. * Note that @value needs to be the *normalized* value if the facet * is of type "pattern". * * Returns 0 if the element is schemas valid, a positive error code * number otherwise and -1 in case of internal or API error. */ int xmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, xmlSchemaWhitespaceValueType fws, xmlSchemaValType valType, const xmlChar *value, xmlSchemaValPtr val, xmlSchemaWhitespaceValueType ws) { return(xmlSchemaValidateFacetInternal(facet, fws, valType, value, val, ws)); } #if 0 #ifndef DBL_DIG #define DBL_DIG 16 #endif #ifndef DBL_EPSILON #define DBL_EPSILON 1E-9 #endif #define INTEGER_DIGITS DBL_DIG #define FRACTION_DIGITS (DBL_DIG + 1) #define EXPONENT_DIGITS (3 + 2) /** * xmlXPathFormatNumber: * @number: number to format * @buffer: output buffer * @buffersize: size of output buffer * * Convert the number into a string representation. */ static void xmlSchemaFormatFloat(double number, char buffer[], int buffersize) { switch (xmlXPathIsInf(number)) { case 1: if (buffersize > (int)sizeof("INF")) snprintf(buffer, buffersize, "INF"); break; case -1: if (buffersize > (int)sizeof("-INF")) snprintf(buffer, buffersize, "-INF"); break; default: if (xmlXPathIsNaN(number)) { if (buffersize > (int)sizeof("NaN")) snprintf(buffer, buffersize, "NaN"); } else if (number == 0) { snprintf(buffer, buffersize, "0.0E0"); } else { /* 3 is sign, decimal point, and terminating zero */ char work[DBL_DIG + EXPONENT_DIGITS + 3]; int integer_place, fraction_place; char *ptr; char *after_fraction; double absolute_value; int size; absolute_value = fabs(number); /* * Result is in work, and after_fraction points * just past the fractional part. * Use scientific notation */ integer_place = DBL_DIG + EXPONENT_DIGITS + 1; fraction_place = DBL_DIG - 1; snprintf(work, sizeof(work),"%*.*e", integer_place, fraction_place, number); after_fraction = strchr(work + DBL_DIG, 'e'); /* Remove fractional trailing zeroes */ ptr = after_fraction; while (*(--ptr) == '0') ; if (*ptr != '.') ptr++; while ((*ptr++ = *after_fraction++) != 0); /* Finally copy result back to caller */ size = strlen(work) + 1; if (size > buffersize) { work[buffersize - 1] = 0; size = buffersize; } memmove(buffer, work, size); } break; } } #endif /** * xmlSchemaGetCanonValue: * @val: the precomputed value * @retValue: the returned value * * Get a the cononical lexical representation of the value. * The caller has to FREE the returned retValue. * * WARNING: Some value types are not supported yet, resulting * in a @retValue of "???". * * TODO: XML Schema 1.0 does not define canonical representations * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. * * * Returns 0 if the value could be built, 1 if the value type is * not supported yet and -1 in case of API errors. */ int xmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) { if ((retValue == NULL) || (val == NULL)) return (-1); *retValue = NULL; switch (val->type) { case XML_SCHEMAS_STRING: if (val->value.str == NULL) *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); else *retValue = BAD_CAST xmlStrdup((const xmlChar *) val->value.str); break; case XML_SCHEMAS_NORMSTRING: if (val->value.str == NULL) *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); else { *retValue = xmlSchemaWhiteSpaceReplace( (const xmlChar *) val->value.str); if ((*retValue) == NULL) *retValue = BAD_CAST xmlStrdup( (const xmlChar *) val->value.str); } break; case XML_SCHEMAS_TOKEN: case XML_SCHEMAS_LANGUAGE: case XML_SCHEMAS_NMTOKEN: case XML_SCHEMAS_NAME: case XML_SCHEMAS_NCNAME: case XML_SCHEMAS_ID: case XML_SCHEMAS_IDREF: case XML_SCHEMAS_ENTITY: case XML_SCHEMAS_NOTATION: /* Unclear */ case XML_SCHEMAS_ANYURI: /* Unclear */ if (val->value.str == NULL) return (-1); *retValue = BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); if (*retValue == NULL) *retValue = BAD_CAST xmlStrdup((const xmlChar *) val->value.str); break; case XML_SCHEMAS_QNAME: /* TODO: Unclear in XML Schema 1.0. */ if (val->value.qname.uri == NULL) { *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); return (0); } else { *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), BAD_CAST val->value.qname.uri); *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), BAD_CAST "}"); *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), BAD_CAST val->value.qname.uri); } break; case XML_SCHEMAS_DECIMAL: /* * TODO: Lookout for a more simple implementation. */ if ((val->value.decimal.total == 1) && (val->value.decimal.lo == 0)) { *retValue = xmlStrdup(BAD_CAST "0.0"); } else { xmlSchemaValDecimal dec = val->value.decimal; int bufsize; char *buf = NULL, *offs; /* Add room for the decimal point as well. */ bufsize = dec.total + 2; if (dec.sign) bufsize++; /* Add room for leading/trailing zero. */ if ((dec.frac == 0) || (dec.frac == dec.total)) bufsize++; buf = xmlMalloc(bufsize); if (buf == NULL) return(-1); offs = buf; if (dec.sign) *offs++ = '-'; if (dec.frac == dec.total) { *offs++ = '0'; *offs++ = '.'; } if (dec.hi != 0) snprintf(offs, bufsize - (offs - buf), "%lu%lu%lu", dec.hi, dec.mi, dec.lo); else if (dec.mi != 0) snprintf(offs, bufsize - (offs - buf), "%lu%lu", dec.mi, dec.lo); else snprintf(offs, bufsize - (offs - buf), "%lu", dec.lo); if (dec.frac != 0) { if (dec.frac != dec.total) { int diff = dec.total - dec.frac; /* * Insert the decimal point. */ memmove(offs + diff + 1, offs + diff, dec.frac +1); offs[diff] = '.'; } else { unsigned int i = 0; /* * Insert missing zeroes behind the decimal point. */ while (*(offs + i) != 0) i++; if (i < dec.total) { memmove(offs + (dec.total - i), offs, i +1); memset(offs, '0', dec.total - i); } } } else { /* * Append decimal point and zero. */ offs = buf + bufsize - 1; *offs-- = 0; *offs-- = '0'; *offs-- = '.'; } *retValue = BAD_CAST buf; } break; case XML_SCHEMAS_INTEGER: case XML_SCHEMAS_PINTEGER: case XML_SCHEMAS_NPINTEGER: case XML_SCHEMAS_NINTEGER: case XML_SCHEMAS_NNINTEGER: case XML_SCHEMAS_LONG: case XML_SCHEMAS_BYTE: case XML_SCHEMAS_SHORT: case XML_SCHEMAS_INT: case XML_SCHEMAS_UINT: case XML_SCHEMAS_ULONG: case XML_SCHEMAS_USHORT: case XML_SCHEMAS_UBYTE: if ((val->value.decimal.total == 1) && (val->value.decimal.lo == 0)) *retValue = xmlStrdup(BAD_CAST "0"); else { xmlSchemaValDecimal dec = val->value.decimal; int bufsize = dec.total + 1; /* Add room for the decimal point as well. */ if (dec.sign) bufsize++; *retValue = xmlMalloc(bufsize); if (*retValue == NULL) return(-1); if (dec.hi != 0) { if (dec.sign) snprintf((char *) *retValue, bufsize, "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); else snprintf((char *) *retValue, bufsize, "%lu%lu%lu", dec.hi, dec.mi, dec.lo); } else if (dec.mi != 0) { if (dec.sign) snprintf((char *) *retValue, bufsize, "-%lu%lu", dec.mi, dec.lo); else snprintf((char *) *retValue, bufsize, "%lu%lu", dec.mi, dec.lo); } else { if (dec.sign) snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); else snprintf((char *) *retValue, bufsize, "%lu", dec.lo); } } break; case XML_SCHEMAS_BOOLEAN: if (val->value.b) *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); else *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); break; case XML_SCHEMAS_DURATION: { char buf[100]; unsigned long year; unsigned long mon, day, hour = 0, min = 0; double sec = 0, left; /* TODO: Unclear in XML Schema 1.0 */ /* * TODO: This results in a normalized output of the value * - which is NOT conformant to the spec - * since the exact values of each property are not * recoverable. Think about extending the structure to * provide a field for every property. */ year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); mon = labs(val->value.dur.mon) - 12 * year; day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); left = fabs(val->value.dur.sec) - day * 86400; if (left > 0) { hour = (unsigned long) FQUOTIENT(left, 3600); left = left - (hour * 3600); if (left > 0) { min = (unsigned long) FQUOTIENT(left, 60); sec = left - (min * 60); } } if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", year, mon, day, hour, min, sec); else snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", year, mon, day, hour, min, sec); *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; case XML_SCHEMAS_GYEAR: { char buf[30]; /* TODO: Unclear in XML Schema 1.0 */ /* TODO: What to do with the timezone? */ snprintf(buf, 30, "%04ld", val->value.date.year); *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; case XML_SCHEMAS_GMONTH: { /* TODO: Unclear in XML Schema 1.0 */ /* TODO: What to do with the timezone? */ *retValue = xmlMalloc(6); if (*retValue == NULL) return(-1); snprintf((char *) *retValue, 6, "--%02u", val->value.date.mon); } break; case XML_SCHEMAS_GDAY: { /* TODO: Unclear in XML Schema 1.0 */ /* TODO: What to do with the timezone? */ *retValue = xmlMalloc(6); if (*retValue == NULL) return(-1); snprintf((char *) *retValue, 6, "---%02u", val->value.date.day); } break; case XML_SCHEMAS_GMONTHDAY: { /* TODO: Unclear in XML Schema 1.0 */ /* TODO: What to do with the timezone? */ *retValue = xmlMalloc(8); if (*retValue == NULL) return(-1); snprintf((char *) *retValue, 8, "--%02u-%02u", val->value.date.mon, val->value.date.day); } break; case XML_SCHEMAS_GYEARMONTH: { char buf[35]; /* TODO: Unclear in XML Schema 1.0 */ /* TODO: What to do with the timezone? */ if (val->value.date.year < 0) snprintf(buf, 35, "-%04ld-%02u", labs(val->value.date.year), val->value.date.mon); else snprintf(buf, 35, "%04ld-%02u", val->value.date.year, val->value.date.mon); *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; case XML_SCHEMAS_TIME: { char buf[30]; if (val->value.date.tz_flag) { xmlSchemaValPtr norm; norm = xmlSchemaDateNormalize(val, 0); if (norm == NULL) return (-1); /* * TODO: Check if "%.14g" is portable. */ snprintf(buf, 30, "%02u:%02u:%02.14gZ", norm->value.date.hour, norm->value.date.min, norm->value.date.sec); xmlSchemaFreeValue(norm); } else { snprintf(buf, 30, "%02u:%02u:%02.14g", val->value.date.hour, val->value.date.min, val->value.date.sec); } *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; case XML_SCHEMAS_DATE: { char buf[30]; if (val->value.date.tz_flag) { xmlSchemaValPtr norm; norm = xmlSchemaDateNormalize(val, 0); if (norm == NULL) return (-1); /* * TODO: Append the canonical value of the * recoverable timezone and not "Z". */ snprintf(buf, 30, "%04ld:%02u:%02uZ", norm->value.date.year, norm->value.date.mon, norm->value.date.day); xmlSchemaFreeValue(norm); } else { snprintf(buf, 30, "%04ld:%02u:%02u", val->value.date.year, val->value.date.mon, val->value.date.day); } *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; case XML_SCHEMAS_DATETIME: { char buf[50]; if (val->value.date.tz_flag) { xmlSchemaValPtr norm; norm = xmlSchemaDateNormalize(val, 0); if (norm == NULL) return (-1); /* * TODO: Check if "%.14g" is portable. */ snprintf(buf, 50, "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", norm->value.date.year, norm->value.date.mon, norm->value.date.day, norm->value.date.hour, norm->value.date.min, norm->value.date.sec); xmlSchemaFreeValue(norm); } else { snprintf(buf, 50, "%04ld:%02u:%02uT%02u:%02u:%02.14g", val->value.date.year, val->value.date.mon, val->value.date.day, val->value.date.hour, val->value.date.min, val->value.date.sec); } *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; case XML_SCHEMAS_HEXBINARY: *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); break; case XML_SCHEMAS_BASE64BINARY: /* * TODO: Is the following spec piece implemented?: * SPEC: "Note: For some values the canonical form defined * above does not conform to [RFC 2045], which requires breaking * with linefeeds at appropriate intervals." */ *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); break; case XML_SCHEMAS_FLOAT: { char buf[30]; /* * |m| < 16777216, -149 <= e <= 104. * TODO: Handle, NaN, INF, -INF. The format is not * yet conformant. The c type float does not cover * the whole range. */ snprintf(buf, 30, "%01.14e", val->value.f); *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; case XML_SCHEMAS_DOUBLE: { char buf[40]; /* |m| < 9007199254740992, -1075 <= e <= 970 */ /* * TODO: Handle, NaN, INF, -INF. The format is not * yet conformant. The c type float does not cover * the whole range. */ snprintf(buf, 40, "%01.14e", val->value.d); *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); } break; default: *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); return (1); } if (*retValue == NULL) return(-1); return (0); } /** * xmlSchemaGetCanonValueWhtsp: * @val: the precomputed value * @retValue: the returned value * @ws: the whitespace type of the value * * Get a the cononical representation of the value. * The caller has to free the returned @retValue. * * Returns 0 if the value could be built, 1 if the value type is * not supported yet and -1 in case of API errors. */ int xmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, const xmlChar **retValue, xmlSchemaWhitespaceValueType ws) { if ((retValue == NULL) || (val == NULL)) return (-1); if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) return (-1); *retValue = NULL; switch (val->type) { case XML_SCHEMAS_STRING: if (val->value.str == NULL) *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) *retValue = xmlSchemaCollapseString(val->value.str); else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); if ((*retValue) == NULL) *retValue = BAD_CAST xmlStrdup(val->value.str); break; case XML_SCHEMAS_NORMSTRING: if (val->value.str == NULL) *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); else { if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) *retValue = xmlSchemaCollapseString(val->value.str); else *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); if ((*retValue) == NULL) *retValue = BAD_CAST xmlStrdup(val->value.str); } break; default: return (xmlSchemaGetCanonValue(val, retValue)); } return (0); } /** * xmlSchemaGetValType: * @val: a schemas value * * Accessor for the type of a value * * Returns the xmlSchemaValType of the value */ xmlSchemaValType xmlSchemaGetValType(xmlSchemaValPtr val) { if (val == NULL) return(XML_SCHEMAS_UNKNOWN); return (val->type); } #define bottom_xmlschemastypes #include "elfgcchack.h" #endif /* LIBXML_SCHEMAS_ENABLED */ libxml2-2.9.1+dfsg1/depcomp0000755000175000017500000005064312134171754014146 0ustar aronaron#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libxml2-2.9.1+dfsg1/testapi.c0000644000175000017500000536602412126244144014411 0ustar aronaron/* * testapi.c: libxml2 API tester program. * * Automatically generated by gentest.py from libxml2-api.xml * * See Copyright for the status of this software. * * daniel@veillard.com */ #include "libxml.h" #include #include /* for putenv() */ #include #include #include static int testlibxml2(void); static int test_module(const char *module); static int generic_errors = 0; static int call_tests = 0; static int function_tests = 0; static xmlChar chartab[1024]; static int inttab[1024]; static unsigned long longtab[1024]; static xmlDocPtr api_doc = NULL; static xmlDtdPtr api_dtd = NULL; static xmlNodePtr api_root = NULL; static xmlAttrPtr api_attr = NULL; static xmlNsPtr api_ns = NULL; static void structured_errors(void *userData ATTRIBUTE_UNUSED, xmlErrorPtr error ATTRIBUTE_UNUSED) { generic_errors++; } static void free_api_doc(void) { xmlFreeDoc(api_doc); api_doc = NULL; api_dtd = NULL; api_root = NULL; api_attr = NULL; api_ns = NULL; } static xmlDocPtr get_api_doc(void) { if (api_doc == NULL) { api_doc = xmlReadMemory("]>", 88, "root_test", NULL, 0); api_root = NULL; api_attr = NULL; } return(api_doc); } static xmlDtdPtr get_api_dtd(void) { if ((api_dtd == NULL) || (api_dtd->type != XML_DTD_NODE)) { get_api_doc(); if ((api_doc != NULL) && (api_doc->children != NULL) && (api_doc->children->type == XML_DTD_NODE)) api_dtd = (xmlDtdPtr) api_doc->children; } return(api_dtd); } static xmlNodePtr get_api_root(void) { if ((api_root == NULL) || (api_root->type != XML_ELEMENT_NODE)) { get_api_doc(); if ((api_doc != NULL) && (api_doc->children != NULL) && (api_doc->children->next != NULL) && (api_doc->children->next->type == XML_ELEMENT_NODE)) api_root = api_doc->children->next; } return(api_root); } static xmlNsPtr get_api_ns(void) { get_api_root(); if (api_root != NULL) api_ns = api_root->nsDef; return(api_ns); } static xmlAttrPtr get_api_attr(void) { #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) static int nr = 0; xmlChar name[20]; #endif if ((api_root == NULL) || (api_root->type != XML_ELEMENT_NODE)) { get_api_root(); } if (api_root == NULL) return(NULL); if (api_root->properties != NULL) { api_attr = api_root->properties; return(api_root->properties); } api_attr = NULL; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) snprintf((char *) name, 20, "foo%d", nr++); api_attr = xmlSetProp(api_root, name, (const xmlChar *) "bar"); #endif return(api_attr); } static int quiet = 0; int main(int argc, char **argv) { int ret; int blocks, mem; #ifdef HAVE_PUTENV /* access to the proxy can slow up regression tests a lot */ putenv((char *) "http_proxy="); #endif memset(chartab, 0, sizeof(chartab)); strncpy((char *) chartab, " chartab\n", 20); memset(inttab, 0, sizeof(inttab)); memset(longtab, 0, sizeof(longtab)); xmlInitParser(); #ifdef LIBXML_SCHEMAS_ENABLED xmlRelaxNGInitTypes(); #endif LIBXML_TEST_VERSION xmlSetStructuredErrorFunc(NULL, structured_errors); if (argc >= 2) { if (!strcmp(argv[1], "-q")) { quiet = 1; if (argc >= 3) ret = test_module(argv[2]); else ret = testlibxml2(); } else { ret = test_module(argv[1]); } } else ret = testlibxml2(); xmlCleanupParser(); blocks = xmlMemBlocks(); mem = xmlMemUsed(); if ((blocks != 0) || (mem != 0)) { printf("testapi leaked %d bytes in %d blocks\n", mem, blocks); } xmlMemoryDump(); return (ret != 0); } #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* We manually define xmlErrMemory because it's normal declaration is "hidden" by #ifdef IN_LIBXML */ void xmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra); /* We need some "remote" addresses, but want to avoid getting into name resolution delays, so we use these */ #define REMOTE1GOOD "http://localhost/" #define REMOTE1BAD "http:http://http" #define REMOTE2GOOD "ftp://localhost/foo" #define gen_nb_void_ptr 2 static void *gen_void_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_void_ptr(int no ATTRIBUTE_UNUSED, void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #if 0 #define gen_nb_const_void_ptr 2 static const void *gen_const_void_ptr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return((const void *) "immutable string"); return(NULL); } static void des_const_void_ptr(int no ATTRIBUTE_UNUSED, const void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #define gen_nb_userdata 3 static void *gen_userdata(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return((void *) &call_tests); if (no == 1) return((void *) -1); return(NULL); } static void des_userdata(int no ATTRIBUTE_UNUSED, void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_int 4 static int gen_int(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(0); if (no == 1) return(1); if (no == 2) return(-1); if (no == 3) return(122); return(-1); } static void des_int(int no ATTRIBUTE_UNUSED, int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_parseroptions 5 static int gen_parseroptions(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(XML_PARSE_NOBLANKS | XML_PARSE_RECOVER); if (no == 1) return(XML_PARSE_NOENT | XML_PARSE_DTDLOAD | XML_PARSE_DTDATTR | XML_PARSE_DTDVALID | XML_PARSE_NOCDATA); if (no == 2) return(XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE | XML_PARSE_NSCLEAN); if (no == 3) return(XML_PARSE_XINCLUDE | XML_PARSE_NODICT); return(XML_PARSE_SAX1); } static void des_parseroptions(int no ATTRIBUTE_UNUSED, int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #if 0 #define gen_nb_long 5 static long gen_long(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(0); if (no == 1) return(1); if (no == 2) return(-1); if (no == 3) return(122); return(-1); } static void des_long(int no ATTRIBUTE_UNUSED, long val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #define gen_nb_xmlChar 4 static xmlChar gen_xmlChar(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return('a'); if (no == 1) return(' '); if (no == 2) return((xmlChar) '\xf8'); return(0); } static void des_xmlChar(int no ATTRIBUTE_UNUSED, xmlChar val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_unsigned_int 3 static unsigned int gen_unsigned_int(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(0); if (no == 1) return(1); if (no == 2) return(122); return((unsigned int) -1); } static void des_unsigned_int(int no ATTRIBUTE_UNUSED, unsigned int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_unsigned_long 4 static unsigned long gen_unsigned_long(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(0); if (no == 1) return(1); if (no == 2) return(122); return((unsigned long) -1); } static void des_unsigned_long(int no ATTRIBUTE_UNUSED, unsigned long val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_double 4 static double gen_double(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(0); if (no == 1) return(-1.1); #if defined(LIBXML_XPATH_ENABLED) if (no == 2) return(xmlXPathNAN); #endif return(-1); } static void des_double(int no ATTRIBUTE_UNUSED, double val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_unsigned_long_ptr 2 static unsigned long *gen_unsigned_long_ptr(int no, int nr) { if (no == 0) return(&longtab[nr]); return(NULL); } static void des_unsigned_long_ptr(int no ATTRIBUTE_UNUSED, unsigned long *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_int_ptr 2 static int *gen_int_ptr(int no, int nr) { if (no == 0) return(&inttab[nr]); return(NULL); } static void des_int_ptr(int no ATTRIBUTE_UNUSED, int *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_const_char_ptr 4 static char *gen_const_char_ptr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return((char *) "foo"); if (no == 1) return((char *) ""); if (no == 2) return((char *) "test/ent2"); return(NULL); } static void des_const_char_ptr(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlChar_ptr 2 static xmlChar *gen_xmlChar_ptr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(&chartab[0]); return(NULL); } static void des_xmlChar_ptr(int no ATTRIBUTE_UNUSED, xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_FILE_ptr 2 static FILE *gen_FILE_ptr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(fopen("test.out", "a+")); return(NULL); } static void des_FILE_ptr(int no ATTRIBUTE_UNUSED, FILE *val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) fclose(val); } #define gen_nb_debug_FILE_ptr 2 static FILE *gen_debug_FILE_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(fopen("test.out", "a+")); } static void des_debug_FILE_ptr(int no ATTRIBUTE_UNUSED, FILE *val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) fclose(val); } #define gen_nb_const_xmlChar_ptr 5 static xmlChar *gen_const_xmlChar_ptr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return((xmlChar *) "foo"); if (no == 1) return((xmlChar *) ""); if (no == 2) return((xmlChar *) "n" "\xf8" "ne"); if (no == 3) return((xmlChar *) " 2ab "); return(NULL); } static void des_const_xmlChar_ptr(int no ATTRIBUTE_UNUSED, const xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_filepath 8 static const char *gen_filepath(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return("missing.xml"); if (no == 1) return(""); if (no == 2) return("test/ent2"); if (no == 3) return("test/valid/REC-xml-19980210.xml"); if (no == 4) return("test/valid/dtds/xhtml1-strict.dtd"); if (no == 5) return(REMOTE1GOOD); if (no == 6) return(REMOTE1BAD); return(NULL); } static void des_filepath(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_eaten_name 2 static xmlChar *gen_eaten_name(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlStrdup(BAD_CAST "eaten")); return(NULL); } static void des_eaten_name(int no ATTRIBUTE_UNUSED, xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_fileoutput 6 static const char *gen_fileoutput(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return("/missing.xml"); if (no == 1) return(""); if (no == 2) return(REMOTE2GOOD); if (no == 3) return(REMOTE1GOOD); if (no == 4) return(REMOTE1BAD); return(NULL); } static void des_fileoutput(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlParserCtxtPtr 3 static xmlParserCtxtPtr gen_xmlParserCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewParserCtxt()); if (no == 1) return(xmlCreateMemoryParserCtxt("", 6)); return(NULL); } static void des_xmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlParserCtxtPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) xmlFreeParserCtxt(val); } #define gen_nb_xmlSAXHandlerPtr 2 static xmlSAXHandlerPtr gen_xmlSAXHandlerPtr(int no, int nr ATTRIBUTE_UNUSED) { #ifdef LIBXML_SAX1_ENABLED if (no == 0) return((xmlSAXHandlerPtr) &xmlDefaultSAXHandler); #endif return(NULL); } static void des_xmlSAXHandlerPtr(int no ATTRIBUTE_UNUSED, xmlSAXHandlerPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlValidCtxtPtr 2 static xmlValidCtxtPtr gen_xmlValidCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) { #ifdef LIBXML_VALID_ENABLED if (no == 0) return(xmlNewValidCtxt()); #endif return(NULL); } static void des_xmlValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlValidCtxtPtr val, int nr ATTRIBUTE_UNUSED) { #ifdef LIBXML_VALID_ENABLED if (val != NULL) xmlFreeValidCtxt(val); #endif } #define gen_nb_xmlParserInputBufferPtr 8 static xmlParserInputBufferPtr gen_xmlParserInputBufferPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlParserInputBufferCreateFilename("missing.xml", XML_CHAR_ENCODING_NONE)); if (no == 1) return(xmlParserInputBufferCreateFilename("", XML_CHAR_ENCODING_NONE)); if (no == 2) return(xmlParserInputBufferCreateFilename("test/ent2", XML_CHAR_ENCODING_NONE)); if (no == 3) return(xmlParserInputBufferCreateFilename("test/valid/REC-xml-19980210.xml", XML_CHAR_ENCODING_NONE)); if (no == 4) return(xmlParserInputBufferCreateFilename("test/valid/dtds/xhtml1-strict.dtd", XML_CHAR_ENCODING_NONE)); if (no == 5) return(xmlParserInputBufferCreateFilename(REMOTE1GOOD, XML_CHAR_ENCODING_NONE)); if (no == 6) return(xmlParserInputBufferCreateFilename(REMOTE1BAD, XML_CHAR_ENCODING_NONE)); return(NULL); } static void des_xmlParserInputBufferPtr(int no ATTRIBUTE_UNUSED, xmlParserInputBufferPtr val, int nr ATTRIBUTE_UNUSED) { xmlFreeParserInputBuffer(val); } #define gen_nb_xmlDocPtr 4 static xmlDocPtr gen_xmlDocPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewDoc(BAD_CAST "1.0")); if (no == 1) return(xmlReadMemory("", 6, "test", NULL, 0)); if (no == 2) return(xmlReadMemory(" ", 24, "test", NULL, 0)); return(NULL); } static void des_xmlDocPtr(int no ATTRIBUTE_UNUSED, xmlDocPtr val, int nr ATTRIBUTE_UNUSED) { if ((val != NULL) && (val != api_doc) && (val->doc != api_doc)) xmlFreeDoc(val); } #define gen_nb_xmlAttrPtr 2 static xmlAttrPtr gen_xmlAttrPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(get_api_attr()); return(NULL); } static void des_xmlAttrPtr(int no, xmlAttrPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { if (no == 0) free_api_doc(); } #define gen_nb_xmlDictPtr 2 static xmlDictPtr gen_xmlDictPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlDictCreate()); return(NULL); } static void des_xmlDictPtr(int no ATTRIBUTE_UNUSED, xmlDictPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) xmlDictFree(val); } #define gen_nb_xmlNodePtr 3 static xmlNodePtr gen_xmlNodePtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL)); if (no == 1) return(get_api_root()); return(NULL); /* if (no == 2) return((xmlNodePtr) get_api_doc()); */ } static void des_xmlNodePtr(int no, xmlNodePtr val, int nr ATTRIBUTE_UNUSED) { if (no == 1) { free_api_doc(); } else if (val != NULL) { xmlUnlinkNode(val); xmlFreeNode(val); } } #define gen_nb_xmlDtdPtr 3 static xmlDtdPtr gen_xmlDtdPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewDtd(NULL, BAD_CAST "dtd", BAD_CAST"foo", BAD_CAST"bar")); if (no == 1) return(get_api_dtd()); return(NULL); } static void des_xmlDtdPtr(int no, xmlDtdPtr val, int nr ATTRIBUTE_UNUSED) { if (no == 1) free_api_doc(); else if (val != NULL) { xmlUnlinkNode((xmlNodePtr) val); xmlFreeNode((xmlNodePtr) val); } } #define gen_nb_xmlNsPtr 2 static xmlNsPtr gen_xmlNsPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(get_api_ns()); return(NULL); } static void des_xmlNsPtr(int no, xmlNsPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { if (no == 0) free_api_doc(); } #define gen_nb_xmlNodePtr_in 3 static xmlNodePtr gen_xmlNodePtr_in(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL)); if (no == 0) return(xmlNewText(BAD_CAST "text")); return(NULL); } static void des_xmlNodePtr_in(int no ATTRIBUTE_UNUSED, xmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #ifdef LIBXML_WRITER_ENABLED #define gen_nb_xmlTextWriterPtr 2 static xmlTextWriterPtr gen_xmlTextWriterPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewTextWriterFilename("test.out", 0)); return(NULL); } static void des_xmlTextWriterPtr(int no ATTRIBUTE_UNUSED, xmlTextWriterPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) xmlFreeTextWriter(val); } #endif #ifdef LIBXML_READER_ENABLED #define gen_nb_xmlTextReaderPtr 4 static xmlTextReaderPtr gen_xmlTextReaderPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewTextReaderFilename("test/ent2")); if (no == 1) return(xmlNewTextReaderFilename("test/valid/REC-xml-19980210.xml")); if (no == 2) return(xmlNewTextReaderFilename("test/valid/dtds/xhtml1-strict.dtd")); return(NULL); } static void des_xmlTextReaderPtr(int no ATTRIBUTE_UNUSED, xmlTextReaderPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) xmlFreeTextReader(val); } #endif #define gen_nb_xmlBufferPtr 3 static const xmlChar *static_buf_content = (xmlChar *)"a static buffer"; static xmlBufferPtr gen_xmlBufferPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlBufferCreate()); if (no == 1) return(xmlBufferCreateStatic((void *)static_buf_content, 13)); return(NULL); } static void des_xmlBufferPtr(int no ATTRIBUTE_UNUSED, xmlBufferPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) { xmlBufferFree(val); } } #define gen_nb_xmlListPtr 2 static xmlListPtr gen_xmlListPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlListCreate(NULL, NULL)); return(NULL); } static void des_xmlListPtr(int no ATTRIBUTE_UNUSED, xmlListPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) { xmlListDelete(val); } } #define gen_nb_xmlHashTablePtr 2 static xmlHashTablePtr gen_xmlHashTablePtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlHashCreate(10)); return(NULL); } static void des_xmlHashTablePtr(int no ATTRIBUTE_UNUSED, xmlHashTablePtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) { xmlHashFree(val, NULL); } } #include #ifdef LIBXML_XPATH_ENABLED #define gen_nb_xmlXPathObjectPtr 5 static xmlXPathObjectPtr gen_xmlXPathObjectPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlXPathNewString(BAD_CAST "string object")); if (no == 1) return(xmlXPathNewFloat(1.1)); if (no == 2) return(xmlXPathNewBoolean(1)); if (no == 3) return(xmlXPathNewNodeSet(NULL)); return(NULL); } static void des_xmlXPathObjectPtr(int no ATTRIBUTE_UNUSED, xmlXPathObjectPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) { xmlXPathFreeObject(val); } } #endif #ifdef LIBXML_OUTPUT_ENABLED #define gen_nb_xmlOutputBufferPtr 2 static xmlOutputBufferPtr gen_xmlOutputBufferPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlOutputBufferCreateFilename("test.out", NULL, 0)); return(NULL); } static void des_xmlOutputBufferPtr(int no ATTRIBUTE_UNUSED, xmlOutputBufferPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) { xmlOutputBufferClose(val); } } #endif #ifdef LIBXML_FTP_ENABLED #define gen_nb_xmlNanoFTPCtxtPtr 4 static void *gen_xmlNanoFTPCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNanoFTPNewCtxt(REMOTE2GOOD)); if (no == 1) return(xmlNanoFTPNewCtxt(REMOTE1GOOD)); if (no == 2) return(xmlNanoFTPNewCtxt("foo")); return(NULL); } static void des_xmlNanoFTPCtxtPtr(int no ATTRIBUTE_UNUSED, void *val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) { xmlNanoFTPFreeCtxt(val); } } #endif #ifdef LIBXML_HTTP_ENABLED #define gen_nb_xmlNanoHTTPCtxtPtr 1 static void *gen_xmlNanoHTTPCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNanoHTTPOpen(REMOTE1GOOD, NULL)); if (no == 1) return(xmlNanoHTTPOpen(REMOTE2GOOD, NULL)); if (no == 2) return(xmlNanoHTTPOpen(REMOTE1BAD, NULL)); return(NULL); } static void des_xmlNanoHTTPCtxtPtr(int no ATTRIBUTE_UNUSED, void *val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) { xmlNanoHTTPClose(val); } } #endif #define gen_nb_xmlCharEncoding 4 static xmlCharEncoding gen_xmlCharEncoding(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(XML_CHAR_ENCODING_UTF8); if (no == 1) return(XML_CHAR_ENCODING_NONE); if (no == 2) return(XML_CHAR_ENCODING_8859_1); return(XML_CHAR_ENCODING_ERROR); } static void des_xmlCharEncoding(int no ATTRIBUTE_UNUSED, xmlCharEncoding val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) #define gen_nb_xmlExpCtxtPtr 1 static xmlExpCtxtPtr gen_xmlExpCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlExpCtxtPtr(int no ATTRIBUTE_UNUSED, xmlExpCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlExpNodePtr 1 static xmlExpNodePtr gen_xmlExpNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlExpNodePtr(int no ATTRIBUTE_UNUSED, xmlExpNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #if defined(LIBXML_SCHEMAS_ENABLED) #define gen_nb_xmlSchemaPtr 1 static xmlSchemaPtr gen_xmlSchemaPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaPtr(int no ATTRIBUTE_UNUSED, xmlSchemaPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlSchemaValidCtxtPtr 1 static xmlSchemaValidCtxtPtr gen_xmlSchemaValidCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSchemaValidCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif /* LIBXML_SCHEMAS_ENABLED */ #define gen_nb_xmlHashDeallocator 2 static void test_xmlHashDeallocator(void *payload ATTRIBUTE_UNUSED, xmlChar *name ATTRIBUTE_UNUSED) { } static xmlHashDeallocator gen_xmlHashDeallocator(int no, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(test_xmlHashDeallocator); return(NULL); } static void des_xmlHashDeallocator(int no ATTRIBUTE_UNUSED, xmlHashDeallocator val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static void desret_int(int val ATTRIBUTE_UNUSED) { } static void desret_xmlChar(xmlChar val ATTRIBUTE_UNUSED) { } static void desret_long(long val ATTRIBUTE_UNUSED) { } static void desret_unsigned_long(unsigned long val ATTRIBUTE_UNUSED) { } static void desret_double(double val ATTRIBUTE_UNUSED) { } static void desret_xmlCharEncoding(xmlCharEncoding val ATTRIBUTE_UNUSED) { } #if 0 static void desret_const_void_ptr(void *val ATTRIBUTE_UNUSED) { } #endif static void desret_void_ptr(void *val ATTRIBUTE_UNUSED) { } static void desret_const_char_ptr(const char *val ATTRIBUTE_UNUSED) { } static void desret_const_xmlChar_ptr(const xmlChar *val ATTRIBUTE_UNUSED) { } static void desret_xmlChar_ptr(xmlChar *val) { if (val != NULL) xmlFree(val); } static void desret_xmlDocPtr(xmlDocPtr val) { if (val != api_doc) xmlFreeDoc(val); } static void desret_xmlDictPtr(xmlDictPtr val) { xmlDictFree(val); } #ifdef LIBXML_OUTPUT_ENABLED static void desret_xmlOutputBufferPtr(xmlOutputBufferPtr val) { xmlOutputBufferClose(val); } #endif #ifdef LIBXML_READER_ENABLED static void desret_xmlTextReaderPtr(xmlTextReaderPtr val) { xmlFreeTextReader(val); } #endif static void desret_xmlNodePtr(xmlNodePtr val) { if ((val != NULL) && (val != api_root) && (val != (xmlNodePtr) api_doc)) { xmlUnlinkNode(val); xmlFreeNode(val); } } static void desret_xmlAttrPtr(xmlAttrPtr val) { if (val != NULL) { xmlUnlinkNode((xmlNodePtr) val); xmlFreeNode((xmlNodePtr) val); } } static void desret_xmlEntityPtr(xmlEntityPtr val) { if (val != NULL) { xmlUnlinkNode((xmlNodePtr) val); xmlFreeNode((xmlNodePtr) val); } } static void desret_xmlElementPtr(xmlElementPtr val) { if (val != NULL) { xmlUnlinkNode((xmlNodePtr) val); } } static void desret_xmlAttributePtr(xmlAttributePtr val) { if (val != NULL) { xmlUnlinkNode((xmlNodePtr) val); } } static void desret_xmlNsPtr(xmlNsPtr val ATTRIBUTE_UNUSED) { } static void desret_xmlDtdPtr(xmlDtdPtr val) { desret_xmlNodePtr((xmlNodePtr)val); } #ifdef LIBXML_XPATH_ENABLED static void desret_xmlXPathObjectPtr(xmlXPathObjectPtr val) { xmlXPathFreeObject(val); } static void desret_xmlNodeSetPtr(xmlNodeSetPtr val) { xmlXPathFreeNodeSet(val); } #endif static void desret_xmlParserCtxtPtr(xmlParserCtxtPtr val) { xmlFreeParserCtxt(val); } static void desret_xmlParserInputBufferPtr(xmlParserInputBufferPtr val) { xmlFreeParserInputBuffer(val); } static void desret_xmlParserInputPtr(xmlParserInputPtr val) { xmlFreeInputStream(val); } #ifdef LIBXML_WRITER_ENABLED static void desret_xmlTextWriterPtr(xmlTextWriterPtr val) { xmlFreeTextWriter(val); } #endif static void desret_xmlBufferPtr(xmlBufferPtr val) { xmlBufferFree(val); } #ifdef LIBXML_SCHEMAS_ENABLED static void desret_xmlSchemaParserCtxtPtr(xmlSchemaParserCtxtPtr val) { xmlSchemaFreeParserCtxt(val); } static void desret_xmlSchemaTypePtr(xmlSchemaTypePtr val ATTRIBUTE_UNUSED) { } static void desret_xmlRelaxNGParserCtxtPtr(xmlRelaxNGParserCtxtPtr val) { xmlRelaxNGFreeParserCtxt(val); } #endif #ifdef LIBXML_HTML_ENABLED static void desret_const_htmlEntityDesc_ptr(const htmlEntityDesc * val ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_HTTP_ENABLED static void desret_xmlNanoHTTPCtxtPtr(void *val) { xmlNanoHTTPClose(val); } #endif #ifdef LIBXML_FTP_ENABLED static void desret_xmlNanoFTPCtxtPtr(void *val) { xmlNanoFTPClose(val); } #endif /* cut and pasted from autogenerated to avoid troubles */ #define gen_nb_const_xmlChar_ptr_ptr 1 static xmlChar ** gen_const_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, const xmlChar ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_unsigned_char_ptr 1 static unsigned char * gen_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, unsigned char * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_const_unsigned_char_ptr 1 static unsigned char * gen_const_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, const unsigned char * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #ifdef LIBXML_HTML_ENABLED #define gen_nb_const_htmlNodePtr 1 static htmlNodePtr gen_const_htmlNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_htmlNodePtr(int no ATTRIBUTE_UNUSED, const htmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_HTML_ENABLED #define gen_nb_htmlDocPtr 3 static htmlDocPtr gen_htmlDocPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(htmlNewDoc(NULL, NULL)); if (no == 1) return(htmlReadMemory("", 7, "test", NULL, 0)); return(NULL); } static void des_htmlDocPtr(int no ATTRIBUTE_UNUSED, htmlDocPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { if ((val != NULL) && (val != api_doc) && (val->doc != api_doc)) xmlFreeDoc(val); } static void desret_htmlDocPtr(htmlDocPtr val) { if ((val != NULL) && (val != api_doc) && (val->doc != api_doc)) xmlFreeDoc(val); } #define gen_nb_htmlParserCtxtPtr 3 static htmlParserCtxtPtr gen_htmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { if (no == 0) return(xmlNewParserCtxt()); if (no == 1) return(htmlCreateMemoryParserCtxt("", 7)); return(NULL); } static void des_htmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, htmlParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { if (val != NULL) htmlFreeParserCtxt(val); } static void desret_htmlParserCtxtPtr(htmlParserCtxtPtr val) { if (val != NULL) htmlFreeParserCtxt(val); } #endif #ifdef LIBXML_XPATH_ENABLED #define gen_nb_xmlNodeSetPtr 1 static xmlNodeSetPtr gen_xmlNodeSetPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlNodeSetPtr(int no ATTRIBUTE_UNUSED, xmlNodeSetPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_DEBUG_ENABLED #ifdef LIBXML_XPATH_ENABLED #define gen_nb_xmlShellCtxtPtr 1 static xmlShellCtxtPtr gen_xmlShellCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlShellCtxtPtr(int no ATTRIBUTE_UNUSED, xmlShellCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #endif #ifdef LIBXML_PATTERN_ENABLED #define gen_nb_xmlPatternPtr 1 static xmlPatternPtr gen_xmlPatternPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlPatternPtr(int no ATTRIBUTE_UNUSED, xmlPatternPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #define gen_nb_xmlElementContentPtr 1 static xmlElementContentPtr gen_xmlElementContentPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlElementContentPtr(int no ATTRIBUTE_UNUSED, xmlElementContentPtr val, int nr ATTRIBUTE_UNUSED) { if (val != NULL) xmlFreeElementContent(val); } static void desret_xmlElementContentPtr(xmlElementContentPtr val) { if (val != NULL) xmlFreeElementContent(val); } #define gen_nb_xmlParserNodeInfoSeqPtr 1 static xmlParserNodeInfoSeqPtr gen_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, xmlParserNodeInfoSeqPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static void desret_const_xmlParserNodeInfo_ptr(const xmlParserNodeInfo *val ATTRIBUTE_UNUSED) { } #define gen_nb_void_ptr_ptr 1 static void ** gen_void_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_void_ptr_ptr(int no ATTRIBUTE_UNUSED, void ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } /************************************************************************ * * * WARNING: end of the manually maintained part of the test code * * do not remove or alter the CUT HERE line * * * ************************************************************************/ /* CUT HERE: everything below that line is generated */ #ifdef LIBXML_HTML_ENABLED static void desret_htmlStatus(htmlStatus val ATTRIBUTE_UNUSED) { } #endif #define gen_nb_xmlAttributeDefault 4 static xmlAttributeDefault gen_xmlAttributeDefault(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_ATTRIBUTE_FIXED); if (no == 2) return(XML_ATTRIBUTE_IMPLIED); if (no == 3) return(XML_ATTRIBUTE_NONE); if (no == 4) return(XML_ATTRIBUTE_REQUIRED); return(0); } static void des_xmlAttributeDefault(int no ATTRIBUTE_UNUSED, xmlAttributeDefault val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlAttributeType 4 static xmlAttributeType gen_xmlAttributeType(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_ATTRIBUTE_CDATA); if (no == 2) return(XML_ATTRIBUTE_ENTITIES); if (no == 3) return(XML_ATTRIBUTE_ENTITY); if (no == 4) return(XML_ATTRIBUTE_ENUMERATION); return(0); } static void des_xmlAttributeType(int no ATTRIBUTE_UNUSED, xmlAttributeType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlBufferAllocationScheme 4 static xmlBufferAllocationScheme gen_xmlBufferAllocationScheme(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_BUFFER_ALLOC_DOUBLEIT); if (no == 2) return(XML_BUFFER_ALLOC_EXACT); if (no == 3) return(XML_BUFFER_ALLOC_HYBRID); if (no == 4) return(XML_BUFFER_ALLOC_IMMUTABLE); return(0); } static void des_xmlBufferAllocationScheme(int no ATTRIBUTE_UNUSED, xmlBufferAllocationScheme val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static void desret_xmlBufferAllocationScheme(xmlBufferAllocationScheme val ATTRIBUTE_UNUSED) { } #ifdef LIBXML_CATALOG_ENABLED #define gen_nb_xmlCatalogAllow 4 static xmlCatalogAllow gen_xmlCatalogAllow(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_CATA_ALLOW_ALL); if (no == 2) return(XML_CATA_ALLOW_DOCUMENT); if (no == 3) return(XML_CATA_ALLOW_GLOBAL); if (no == 4) return(XML_CATA_ALLOW_NONE); return(0); } static void des_xmlCatalogAllow(int no ATTRIBUTE_UNUSED, xmlCatalogAllow val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static void desret_xmlCatalogAllow(xmlCatalogAllow val ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_CATALOG_ENABLED #define gen_nb_xmlCatalogPrefer 3 static xmlCatalogPrefer gen_xmlCatalogPrefer(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_CATA_PREFER_NONE); if (no == 2) return(XML_CATA_PREFER_PUBLIC); if (no == 3) return(XML_CATA_PREFER_SYSTEM); return(0); } static void des_xmlCatalogPrefer(int no ATTRIBUTE_UNUSED, xmlCatalogPrefer val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static void desret_xmlCatalogPrefer(xmlCatalogPrefer val ATTRIBUTE_UNUSED) { } #endif #define gen_nb_xmlElementContentType 4 static xmlElementContentType gen_xmlElementContentType(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_ELEMENT_CONTENT_ELEMENT); if (no == 2) return(XML_ELEMENT_CONTENT_OR); if (no == 3) return(XML_ELEMENT_CONTENT_PCDATA); if (no == 4) return(XML_ELEMENT_CONTENT_SEQ); return(0); } static void des_xmlElementContentType(int no ATTRIBUTE_UNUSED, xmlElementContentType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlElementTypeVal 4 static xmlElementTypeVal gen_xmlElementTypeVal(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_ELEMENT_TYPE_ANY); if (no == 2) return(XML_ELEMENT_TYPE_ELEMENT); if (no == 3) return(XML_ELEMENT_TYPE_EMPTY); if (no == 4) return(XML_ELEMENT_TYPE_MIXED); return(0); } static void des_xmlElementTypeVal(int no ATTRIBUTE_UNUSED, xmlElementTypeVal val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_xmlFeature 4 static xmlFeature gen_xmlFeature(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_WITH_AUTOMATA); if (no == 2) return(XML_WITH_C14N); if (no == 3) return(XML_WITH_CATALOG); if (no == 4) return(XML_WITH_DEBUG); return(0); } static void des_xmlFeature(int no ATTRIBUTE_UNUSED, xmlFeature val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static void desret_xmlParserErrors(xmlParserErrors val ATTRIBUTE_UNUSED) { } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaValType 4 static xmlSchemaValType gen_xmlSchemaValType(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_SCHEMAS_ANYSIMPLETYPE); if (no == 2) return(XML_SCHEMAS_ANYTYPE); if (no == 3) return(XML_SCHEMAS_ANYURI); if (no == 4) return(XML_SCHEMAS_BASE64BINARY); return(0); } static void des_xmlSchemaValType(int no ATTRIBUTE_UNUSED, xmlSchemaValType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static void desret_xmlSchemaValType(xmlSchemaValType val ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaWhitespaceValueType 4 static xmlSchemaWhitespaceValueType gen_xmlSchemaWhitespaceValueType(int no, int nr ATTRIBUTE_UNUSED) { if (no == 1) return(XML_SCHEMA_WHITESPACE_COLLAPSE); if (no == 2) return(XML_SCHEMA_WHITESPACE_PRESERVE); if (no == 3) return(XML_SCHEMA_WHITESPACE_REPLACE); if (no == 4) return(XML_SCHEMA_WHITESPACE_UNKNOWN); return(0); } static void des_xmlSchemaWhitespaceValueType(int no ATTRIBUTE_UNUSED, xmlSchemaWhitespaceValueType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static int test_HTMLparser(void); static int test_HTMLtree(void); static int test_SAX2(void); static int test_c14n(void); static int test_catalog(void); static int test_chvalid(void); static int test_debugXML(void); static int test_dict(void); static int test_encoding(void); static int test_entities(void); static int test_hash(void); static int test_list(void); static int test_nanoftp(void); static int test_nanohttp(void); static int test_parser(void); static int test_parserInternals(void); static int test_pattern(void); static int test_relaxng(void); static int test_schemasInternals(void); static int test_schematron(void); static int test_tree(void); static int test_uri(void); static int test_valid(void); static int test_xinclude(void); static int test_xmlIO(void); static int test_xmlautomata(void); static int test_xmlerror(void); static int test_xmlmodule(void); static int test_xmlreader(void); static int test_xmlregexp(void); static int test_xmlsave(void); static int test_xmlschemas(void); static int test_xmlschemastypes(void); static int test_xmlstring(void); static int test_xmlunicode(void); static int test_xmlwriter(void); static int test_xpath(void); static int test_xpathInternals(void); static int test_xpointer(void); /** * testlibxml2: * * Main entry point of the tester for the full libxml2 module, * it calls all the tester entry point for each module. * * Returns the number of error found */ static int testlibxml2(void) { int test_ret = 0; test_ret += test_HTMLparser(); test_ret += test_HTMLtree(); test_ret += test_SAX2(); test_ret += test_c14n(); test_ret += test_catalog(); test_ret += test_chvalid(); test_ret += test_debugXML(); test_ret += test_dict(); test_ret += test_encoding(); test_ret += test_entities(); test_ret += test_hash(); test_ret += test_list(); test_ret += test_nanoftp(); test_ret += test_nanohttp(); test_ret += test_parser(); test_ret += test_parserInternals(); test_ret += test_pattern(); test_ret += test_relaxng(); test_ret += test_schemasInternals(); test_ret += test_schematron(); test_ret += test_tree(); test_ret += test_uri(); test_ret += test_valid(); test_ret += test_xinclude(); test_ret += test_xmlIO(); test_ret += test_xmlautomata(); test_ret += test_xmlerror(); test_ret += test_xmlmodule(); test_ret += test_xmlreader(); test_ret += test_xmlregexp(); test_ret += test_xmlsave(); test_ret += test_xmlschemas(); test_ret += test_xmlschemastypes(); test_ret += test_xmlstring(); test_ret += test_xmlunicode(); test_ret += test_xmlwriter(); test_ret += test_xpath(); test_ret += test_xpathInternals(); test_ret += test_xpointer(); printf("Total: %d functions, %d tests, %d errors\n", function_tests, call_tests, test_ret); return(test_ret); } static int test_UTF8ToHtml(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; unsigned char * out; /* a pointer to an array of bytes to store the result */ int n_out; int * outlen; /* the length of @out */ int n_outlen; unsigned char * in; /* a pointer to an array of UTF-8 chars */ int n_in; int * inlen; /* the length of @in */ int n_inlen; for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) { for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) { for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) { for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) { mem_base = xmlMemBlocks(); out = gen_unsigned_char_ptr(n_out, 0); outlen = gen_int_ptr(n_outlen, 1); in = gen_const_unsigned_char_ptr(n_in, 2); inlen = gen_int_ptr(n_inlen, 3); ret_val = UTF8ToHtml(out, outlen, (const unsigned char *)in, inlen); desret_int(ret_val); call_tests++; des_unsigned_char_ptr(n_out, out, 0); des_int_ptr(n_outlen, outlen, 1); des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2); des_int_ptr(n_inlen, inlen, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in UTF8ToHtml", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_outlen); printf(" %d", n_in); printf(" %d", n_inlen); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_HTML_ENABLED #define gen_nb_const_htmlElemDesc_ptr 1 static htmlElemDesc * gen_const_htmlElemDesc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_htmlElemDesc_ptr(int no ATTRIBUTE_UNUSED, const htmlElemDesc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_htmlAttrAllowed(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlStatus ret_val; htmlElemDesc * elt; /* HTML element */ int n_elt; xmlChar * attr; /* HTML attribute */ int n_attr; int legacy; /* whether to allow deprecated attributes */ int n_legacy; for (n_elt = 0;n_elt < gen_nb_const_htmlElemDesc_ptr;n_elt++) { for (n_attr = 0;n_attr < gen_nb_const_xmlChar_ptr;n_attr++) { for (n_legacy = 0;n_legacy < gen_nb_int;n_legacy++) { mem_base = xmlMemBlocks(); elt = gen_const_htmlElemDesc_ptr(n_elt, 0); attr = gen_const_xmlChar_ptr(n_attr, 1); legacy = gen_int(n_legacy, 2); ret_val = htmlAttrAllowed((const htmlElemDesc *)elt, (const xmlChar *)attr, legacy); desret_htmlStatus(ret_val); call_tests++; des_const_htmlElemDesc_ptr(n_elt, (const htmlElemDesc *)elt, 0); des_const_xmlChar_ptr(n_attr, (const xmlChar *)attr, 1); des_int(n_legacy, legacy, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlAttrAllowed", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_elt); printf(" %d", n_attr); printf(" %d", n_legacy); printf("\n"); } } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_HTML_ENABLED #define gen_nb_htmlNodePtr 1 static htmlNodePtr gen_htmlNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_htmlNodePtr(int no ATTRIBUTE_UNUSED, htmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_htmlAutoCloseTag(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; htmlDocPtr doc; /* the HTML document */ int n_doc; xmlChar * name; /* The tag name */ int n_name; htmlNodePtr elem; /* the HTML element */ int n_elem; for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_elem = 0;n_elem < gen_nb_htmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); doc = gen_htmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); elem = gen_htmlNodePtr(n_elem, 2); ret_val = htmlAutoCloseTag(doc, (const xmlChar *)name, elem); desret_int(ret_val); call_tests++; des_htmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_htmlNodePtr(n_elem, elem, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlAutoCloseTag", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_elem); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_htmlCreateMemoryParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlParserCtxtPtr ret_val; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); ret_val = htmlCreateMemoryParserCtxt((const char *)buffer, size); desret_htmlParserCtxtPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlCreateMemoryParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf("\n"); } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_HTML_ENABLED #define gen_nb_htmlSAXHandlerPtr 1 static htmlSAXHandlerPtr gen_htmlSAXHandlerPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_htmlSAXHandlerPtr(int no ATTRIBUTE_UNUSED, htmlSAXHandlerPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_htmlCreatePushParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) int mem_base; htmlParserCtxtPtr ret_val; htmlSAXHandlerPtr sax; /* a SAX handler */ int n_sax; void * user_data; /* The user data returned on SAX callbacks */ int n_user_data; char * chunk; /* a pointer to an array of chars */ int n_chunk; int size; /* number of chars in the array */ int n_size; const char * filename; /* an optional file name or URI */ int n_filename; xmlCharEncoding enc; /* an optional encoding */ int n_enc; for (n_sax = 0;n_sax < gen_nb_htmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); sax = gen_htmlSAXHandlerPtr(n_sax, 0); user_data = gen_userdata(n_user_data, 1); chunk = gen_const_char_ptr(n_chunk, 2); size = gen_int(n_size, 3); filename = gen_fileoutput(n_filename, 4); enc = gen_xmlCharEncoding(n_enc, 5); ret_val = htmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename, enc); desret_htmlParserCtxtPtr(ret_val); call_tests++; des_htmlSAXHandlerPtr(n_sax, sax, 0); des_userdata(n_user_data, user_data, 1); des_const_char_ptr(n_chunk, (const char *)chunk, 2); des_int(n_size, size, 3); des_fileoutput(n_filename, filename, 4); des_xmlCharEncoding(n_enc, enc, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlCreatePushParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_user_data); printf(" %d", n_chunk); printf(" %d", n_size); printf(" %d", n_filename); printf(" %d", n_enc); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_htmlCtxtReadDoc(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; xmlChar * cur; /* a pointer to a zero terminated string */ int n_cur; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of htmlParserOption(s) */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); cur = gen_const_xmlChar_ptr(n_cur, 1); URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_int(n_options, 4); ret_val = htmlCtxtReadDoc(ctxt, (const xmlChar *)cur, URL, (const char *)encoding, options); desret_htmlDocPtr(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1); des_filepath(n_URL, URL, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_int(n_options, options, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlCtxtReadDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_htmlCtxtReadFile(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) htmlDocPtr ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; const char * filename; /* a file or URL */ int n_filename; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of htmlParserOption(s) */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); filename = gen_filepath(n_filename, 1); encoding = gen_const_char_ptr(n_encoding, 2); options = gen_int(n_options, 3); ret_val = htmlCtxtReadFile(ctxt, filename, (const char *)encoding, options); desret_htmlDocPtr(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); des_filepath(n_filename, filename, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_int(n_options, options, 3); xmlResetLastError(); } } } } function_tests++; #endif return(test_ret); } static int test_htmlCtxtReadMemory(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of htmlParserOption(s) */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); buffer = gen_const_char_ptr(n_buffer, 1); size = gen_int(n_size, 2); URL = gen_filepath(n_URL, 3); encoding = gen_const_char_ptr(n_encoding, 4); options = gen_int(n_options, 5); ret_val = htmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options); desret_htmlDocPtr(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_buffer, (const char *)buffer, 1); des_int(n_size, size, 2); des_filepath(n_URL, URL, 3); des_const_char_ptr(n_encoding, (const char *)encoding, 4); des_int(n_options, options, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlCtxtReadMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_htmlCtxtReset(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); htmlCtxtReset(ctxt); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlCtxtReset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlCtxtUseOptions(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; int options; /* a combination of htmlParserOption(s) */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); options = gen_int(n_options, 1); ret_val = htmlCtxtUseOptions(ctxt, options); desret_int(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); des_int(n_options, options, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlCtxtUseOptions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_options); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlElementAllowedHere(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; htmlElemDesc * parent; /* HTML parent element */ int n_parent; xmlChar * elt; /* HTML element */ int n_elt; for (n_parent = 0;n_parent < gen_nb_const_htmlElemDesc_ptr;n_parent++) { for (n_elt = 0;n_elt < gen_nb_const_xmlChar_ptr;n_elt++) { mem_base = xmlMemBlocks(); parent = gen_const_htmlElemDesc_ptr(n_parent, 0); elt = gen_const_xmlChar_ptr(n_elt, 1); ret_val = htmlElementAllowedHere((const htmlElemDesc *)parent, (const xmlChar *)elt); desret_int(ret_val); call_tests++; des_const_htmlElemDesc_ptr(n_parent, (const htmlElemDesc *)parent, 0); des_const_xmlChar_ptr(n_elt, (const xmlChar *)elt, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlElementAllowedHere", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf(" %d", n_elt); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlElementStatusHere(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlStatus ret_val; htmlElemDesc * parent; /* HTML parent element */ int n_parent; htmlElemDesc * elt; /* HTML element */ int n_elt; for (n_parent = 0;n_parent < gen_nb_const_htmlElemDesc_ptr;n_parent++) { for (n_elt = 0;n_elt < gen_nb_const_htmlElemDesc_ptr;n_elt++) { mem_base = xmlMemBlocks(); parent = gen_const_htmlElemDesc_ptr(n_parent, 0); elt = gen_const_htmlElemDesc_ptr(n_elt, 1); ret_val = htmlElementStatusHere((const htmlElemDesc *)parent, (const htmlElemDesc *)elt); desret_htmlStatus(ret_val); call_tests++; des_const_htmlElemDesc_ptr(n_parent, (const htmlElemDesc *)parent, 0); des_const_htmlElemDesc_ptr(n_elt, (const htmlElemDesc *)elt, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlElementStatusHere", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf(" %d", n_elt); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlEncodeEntities(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; unsigned char * out; /* a pointer to an array of bytes to store the result */ int n_out; int * outlen; /* the length of @out */ int n_outlen; unsigned char * in; /* a pointer to an array of UTF-8 chars */ int n_in; int * inlen; /* the length of @in */ int n_inlen; int quoteChar; /* the quote character to escape (' or ") or zero. */ int n_quoteChar; for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) { for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) { for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) { for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) { for (n_quoteChar = 0;n_quoteChar < gen_nb_int;n_quoteChar++) { mem_base = xmlMemBlocks(); out = gen_unsigned_char_ptr(n_out, 0); outlen = gen_int_ptr(n_outlen, 1); in = gen_const_unsigned_char_ptr(n_in, 2); inlen = gen_int_ptr(n_inlen, 3); quoteChar = gen_int(n_quoteChar, 4); ret_val = htmlEncodeEntities(out, outlen, (const unsigned char *)in, inlen, quoteChar); desret_int(ret_val); call_tests++; des_unsigned_char_ptr(n_out, out, 0); des_int_ptr(n_outlen, outlen, 1); des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2); des_int_ptr(n_inlen, inlen, 3); des_int(n_quoteChar, quoteChar, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlEncodeEntities", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_outlen); printf(" %d", n_in); printf(" %d", n_inlen); printf(" %d", n_quoteChar); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_htmlEntityLookup(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; const htmlEntityDesc * ret_val; xmlChar * name; /* the entity name */ int n_name; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); ret_val = htmlEntityLookup((const xmlChar *)name); desret_const_htmlEntityDesc_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlEntityLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlEntityValueLookup(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; const htmlEntityDesc * ret_val; unsigned int value; /* the entity's unicode value */ int n_value; for (n_value = 0;n_value < gen_nb_unsigned_int;n_value++) { mem_base = xmlMemBlocks(); value = gen_unsigned_int(n_value, 0); ret_val = htmlEntityValueLookup(value); desret_const_htmlEntityDesc_ptr(ret_val); call_tests++; des_unsigned_int(n_value, value, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlEntityValueLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlHandleOmittedElem(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; int val; /* int 0 or 1 */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = htmlHandleOmittedElem(val); desret_int(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlHandleOmittedElem", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlIsAutoClosed(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; htmlDocPtr doc; /* the HTML document */ int n_doc; htmlNodePtr elem; /* the HTML element */ int n_elem; for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_htmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); doc = gen_htmlDocPtr(n_doc, 0); elem = gen_htmlNodePtr(n_elem, 1); ret_val = htmlIsAutoClosed(doc, elem); desret_int(ret_val); call_tests++; des_htmlDocPtr(n_doc, doc, 0); des_htmlNodePtr(n_elem, elem, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlIsAutoClosed", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_elem); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlIsScriptAttribute(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; xmlChar * name; /* an attribute name */ int n_name; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); ret_val = htmlIsScriptAttribute((const xmlChar *)name); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlIsScriptAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlNewParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlParserCtxtPtr ret_val; mem_base = xmlMemBlocks(); ret_val = htmlNewParserCtxt(); desret_htmlParserCtxtPtr(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNewParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_htmlNodeStatus(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlStatus ret_val; htmlNodePtr node; /* an htmlNodePtr in a tree */ int n_node; int legacy; /* whether to allow deprecated elements (YES is faster here for Element nodes) */ int n_legacy; for (n_node = 0;n_node < gen_nb_const_htmlNodePtr;n_node++) { for (n_legacy = 0;n_legacy < gen_nb_int;n_legacy++) { mem_base = xmlMemBlocks(); node = gen_const_htmlNodePtr(n_node, 0); legacy = gen_int(n_legacy, 1); ret_val = htmlNodeStatus((const htmlNodePtr)node, legacy); desret_htmlStatus(ret_val); call_tests++; des_const_htmlNodePtr(n_node, (const htmlNodePtr)node, 0); des_int(n_legacy, legacy, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNodeStatus", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_legacy); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlParseCharRef(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); ret_val = htmlParseCharRef(ctxt); desret_int(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlParseCharRef", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlParseChunk(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) int mem_base; int ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; char * chunk; /* an char array */ int n_chunk; int size; /* the size in byte of the chunk */ int n_size; int terminate; /* last chunk indicator */ int n_terminate; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_terminate = 0;n_terminate < gen_nb_int;n_terminate++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); chunk = gen_const_char_ptr(n_chunk, 1); size = gen_int(n_size, 2); terminate = gen_int(n_terminate, 3); ret_val = htmlParseChunk(ctxt, (const char *)chunk, size, terminate); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} desret_int(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_chunk, (const char *)chunk, 1); des_int(n_size, size, 2); des_int(n_terminate, terminate, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlParseChunk", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_chunk); printf(" %d", n_size); printf(" %d", n_terminate); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlParseDoc(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; xmlChar * cur; /* a pointer to an array of xmlChar */ int n_cur; char * encoding; /* a free form C string describing the HTML document encoding, or NULL */ int n_encoding; for (n_cur = 0;n_cur < gen_nb_xmlChar_ptr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); cur = gen_xmlChar_ptr(n_cur, 0); encoding = gen_const_char_ptr(n_encoding, 1); ret_val = htmlParseDoc(cur, (const char *)encoding); desret_htmlDocPtr(ret_val); call_tests++; des_xmlChar_ptr(n_cur, cur, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlParseDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_encoding); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlParseDocument(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); ret_val = htmlParseDocument(ctxt); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} desret_int(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlParseDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlParseElement(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); htmlParseElement(ctxt); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlParseElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlParseEntityRef(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; const htmlEntityDesc * ret_val; htmlParserCtxtPtr ctxt; /* an HTML parser context */ int n_ctxt; xmlChar ** str; /* location to store the entity name */ int n_str; for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr_ptr;n_str++) { mem_base = xmlMemBlocks(); ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0); str = gen_const_xmlChar_ptr_ptr(n_str, 1); ret_val = htmlParseEntityRef(ctxt, (const xmlChar **)str); desret_const_htmlEntityDesc_ptr(ret_val); call_tests++; des_htmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr_ptr(n_str, (const xmlChar **)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlParseEntityRef", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_str); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlParseFile(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) htmlDocPtr ret_val; const char * filename; /* the filename */ int n_filename; char * encoding; /* a free form C string describing the HTML document encoding, or NULL */ int n_encoding; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { filename = gen_filepath(n_filename, 0); encoding = gen_const_char_ptr(n_encoding, 1); ret_val = htmlParseFile(filename, (const char *)encoding); desret_htmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); xmlResetLastError(); } } function_tests++; #endif return(test_ret); } static int test_htmlReadDoc(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; xmlChar * cur; /* a pointer to a zero terminated string */ int n_cur; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of htmlParserOption(s) */ int n_options; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); URL = gen_filepath(n_URL, 1); encoding = gen_const_char_ptr(n_encoding, 2); options = gen_int(n_options, 3); ret_val = htmlReadDoc((const xmlChar *)cur, URL, (const char *)encoding, options); desret_htmlDocPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); des_filepath(n_URL, URL, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_int(n_options, options, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlReadDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlReadFile(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; const char * filename; /* a file or URL */ int n_filename; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of htmlParserOption(s) */ int n_options; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); encoding = gen_const_char_ptr(n_encoding, 1); options = gen_int(n_options, 2); ret_val = htmlReadFile(filename, (const char *)encoding, options); desret_htmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); des_int(n_options, options, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlReadFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_htmlReadMemory(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of htmlParserOption(s) */ int n_options; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_int(n_options, 4); ret_val = htmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options); desret_htmlDocPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); des_filepath(n_URL, URL, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_int(n_options, options, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlReadMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_htmlSAXParseDoc(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; xmlChar * cur; /* a pointer to an array of xmlChar */ int n_cur; char * encoding; /* a free form C string describing the HTML document encoding, or NULL */ int n_encoding; htmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; void * userData; /* if using SAX, this pointer will be provided on callbacks. */ int n_userData; for (n_cur = 0;n_cur < gen_nb_xmlChar_ptr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_sax = 0;n_sax < gen_nb_htmlSAXHandlerPtr;n_sax++) { for (n_userData = 0;n_userData < gen_nb_userdata;n_userData++) { mem_base = xmlMemBlocks(); cur = gen_xmlChar_ptr(n_cur, 0); encoding = gen_const_char_ptr(n_encoding, 1); sax = gen_htmlSAXHandlerPtr(n_sax, 2); userData = gen_userdata(n_userData, 3); ret_val = htmlSAXParseDoc(cur, (const char *)encoding, sax, userData); desret_htmlDocPtr(ret_val); call_tests++; des_xmlChar_ptr(n_cur, cur, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); des_htmlSAXHandlerPtr(n_sax, sax, 2); des_userdata(n_userData, userData, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlSAXParseDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_encoding); printf(" %d", n_sax); printf(" %d", n_userData); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlSAXParseFile(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; const char * filename; /* the filename */ int n_filename; char * encoding; /* a free form C string describing the HTML document encoding, or NULL */ int n_encoding; htmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; void * userData; /* if using SAX, this pointer will be provided on callbacks. */ int n_userData; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_sax = 0;n_sax < gen_nb_htmlSAXHandlerPtr;n_sax++) { for (n_userData = 0;n_userData < gen_nb_userdata;n_userData++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); encoding = gen_const_char_ptr(n_encoding, 1); sax = gen_htmlSAXHandlerPtr(n_sax, 2); userData = gen_userdata(n_userData, 3); ret_val = htmlSAXParseFile(filename, (const char *)encoding, sax, userData); desret_htmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); des_htmlSAXHandlerPtr(n_sax, sax, 2); des_userdata(n_userData, userData, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlSAXParseFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_encoding); printf(" %d", n_sax); printf(" %d", n_userData); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlTagLookup(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_HTMLparser(void) { int test_ret = 0; if (quiet == 0) printf("Testing HTMLparser : 32 of 38 functions ...\n"); test_ret += test_UTF8ToHtml(); test_ret += test_htmlAttrAllowed(); test_ret += test_htmlAutoCloseTag(); test_ret += test_htmlCreateMemoryParserCtxt(); test_ret += test_htmlCreatePushParserCtxt(); test_ret += test_htmlCtxtReadDoc(); test_ret += test_htmlCtxtReadFile(); test_ret += test_htmlCtxtReadMemory(); test_ret += test_htmlCtxtReset(); test_ret += test_htmlCtxtUseOptions(); test_ret += test_htmlElementAllowedHere(); test_ret += test_htmlElementStatusHere(); test_ret += test_htmlEncodeEntities(); test_ret += test_htmlEntityLookup(); test_ret += test_htmlEntityValueLookup(); test_ret += test_htmlHandleOmittedElem(); test_ret += test_htmlIsAutoClosed(); test_ret += test_htmlIsScriptAttribute(); test_ret += test_htmlNewParserCtxt(); test_ret += test_htmlNodeStatus(); test_ret += test_htmlParseCharRef(); test_ret += test_htmlParseChunk(); test_ret += test_htmlParseDoc(); test_ret += test_htmlParseDocument(); test_ret += test_htmlParseElement(); test_ret += test_htmlParseEntityRef(); test_ret += test_htmlParseFile(); test_ret += test_htmlReadDoc(); test_ret += test_htmlReadFile(); test_ret += test_htmlReadMemory(); test_ret += test_htmlSAXParseDoc(); test_ret += test_htmlSAXParseFile(); test_ret += test_htmlTagLookup(); if (test_ret != 0) printf("Module HTMLparser: %d errors\n", test_ret); return(test_ret); } static int test_htmlDocContentDumpFormatOutput(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr buf; /* the HTML buffer output */ int n_buf; xmlDocPtr cur; /* the document */ int n_cur; char * encoding; /* the encoding string */ int n_encoding; int format; /* should formatting spaces been added */ int n_format; for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); buf = gen_xmlOutputBufferPtr(n_buf, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); format = gen_int(n_format, 3); htmlDocContentDumpFormatOutput(buf, cur, (const char *)encoding, format); call_tests++; des_xmlOutputBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_int(n_format, format, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlDocContentDumpFormatOutput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_cur); printf(" %d", n_encoding); printf(" %d", n_format); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlDocContentDumpOutput(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr buf; /* the HTML buffer output */ int n_buf; xmlDocPtr cur; /* the document */ int n_cur; char * encoding; /* the encoding string */ int n_encoding; for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); buf = gen_xmlOutputBufferPtr(n_buf, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); htmlDocContentDumpOutput(buf, cur, (const char *)encoding); call_tests++; des_xmlOutputBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlDocContentDumpOutput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_cur); printf(" %d", n_encoding); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_htmlDocDump(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; FILE * f; /* the FILE* */ int n_f; xmlDocPtr cur; /* the document */ int n_cur; for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { mem_base = xmlMemBlocks(); f = gen_FILE_ptr(n_f, 0); cur = gen_xmlDocPtr(n_cur, 1); ret_val = htmlDocDump(f, cur); desret_int(ret_val); call_tests++; des_FILE_ptr(n_f, f, 0); des_xmlDocPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlDocDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_f); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } #define gen_nb_xmlChar_ptr_ptr 1 static xmlChar ** gen_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, xmlChar ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_htmlDocDumpMemory(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlDocPtr cur; /* the document */ int n_cur; xmlChar ** mem; /* OUT: the memory pointer */ int n_mem; int * size; /* OUT: the memory length */ int n_size; for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) { for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) { mem_base = xmlMemBlocks(); cur = gen_xmlDocPtr(n_cur, 0); mem = gen_xmlChar_ptr_ptr(n_mem, 1); size = gen_int_ptr(n_size, 2); htmlDocDumpMemory(cur, mem, size); call_tests++; des_xmlDocPtr(n_cur, cur, 0); des_xmlChar_ptr_ptr(n_mem, mem, 1); des_int_ptr(n_size, size, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlDocDumpMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_mem); printf(" %d", n_size); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_htmlDocDumpMemoryFormat(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlDocPtr cur; /* the document */ int n_cur; xmlChar ** mem; /* OUT: the memory pointer */ int n_mem; int * size; /* OUT: the memory length */ int n_size; int format; /* should formatting spaces been added */ int n_format; for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) { for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); cur = gen_xmlDocPtr(n_cur, 0); mem = gen_xmlChar_ptr_ptr(n_mem, 1); size = gen_int_ptr(n_size, 2); format = gen_int(n_format, 3); htmlDocDumpMemoryFormat(cur, mem, size, format); call_tests++; des_xmlDocPtr(n_cur, cur, 0); des_xmlChar_ptr_ptr(n_mem, mem, 1); des_int_ptr(n_size, size, 2); des_int(n_format, format, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlDocDumpMemoryFormat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_mem); printf(" %d", n_size); printf(" %d", n_format); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlGetMetaEncoding(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; const xmlChar * ret_val; htmlDocPtr doc; /* the document */ int n_doc; for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_htmlDocPtr(n_doc, 0); ret_val = htmlGetMetaEncoding(doc); desret_const_xmlChar_ptr(ret_val); call_tests++; des_htmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlGetMetaEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlIsBooleanAttr(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; xmlChar * name; /* the name of the attribute to check */ int n_name; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); ret_val = htmlIsBooleanAttr((const xmlChar *)name); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlIsBooleanAttr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_htmlNewDoc(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; xmlChar * URI; /* URI for the dtd, or NULL */ int n_URI; xmlChar * ExternalID; /* the external ID of the DTD, or NULL */ int n_ExternalID; for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { mem_base = xmlMemBlocks(); URI = gen_const_xmlChar_ptr(n_URI, 0); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 1); ret_val = htmlNewDoc((const xmlChar *)URI, (const xmlChar *)ExternalID); desret_htmlDocPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNewDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf(" %d", n_ExternalID); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlNewDocNoDtD(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlDocPtr ret_val; xmlChar * URI; /* URI for the dtd, or NULL */ int n_URI; xmlChar * ExternalID; /* the external ID of the DTD, or NULL */ int n_ExternalID; for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { mem_base = xmlMemBlocks(); URI = gen_const_xmlChar_ptr(n_URI, 0); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 1); ret_val = htmlNewDocNoDtD((const xmlChar *)URI, (const xmlChar *)ExternalID); desret_htmlDocPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNewDocNoDtD", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf(" %d", n_ExternalID); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlNodeDump(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlBufferPtr buf; /* the HTML buffer output */ int n_buf; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); ret_val = htmlNodeDump(buf, doc, cur); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNodeDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_doc); printf(" %d", n_cur); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_htmlNodeDumpFile(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; FILE * out; /* the FILE pointer */ int n_out; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); out = gen_FILE_ptr(n_out, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); htmlNodeDumpFile(out, doc, cur); call_tests++; des_FILE_ptr(n_out, out, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNodeDumpFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_doc); printf(" %d", n_cur); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_htmlNodeDumpFileFormat(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; FILE * out; /* the FILE pointer */ int n_out; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; char * encoding; /* the document encoding */ int n_encoding; int format; /* should formatting spaces been added */ int n_format; for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); out = gen_FILE_ptr(n_out, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); encoding = gen_const_char_ptr(n_encoding, 3); format = gen_int(n_format, 4); ret_val = htmlNodeDumpFileFormat(out, doc, cur, (const char *)encoding, format); desret_int(ret_val); call_tests++; des_FILE_ptr(n_out, out, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_int(n_format, format, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNodeDumpFileFormat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_doc); printf(" %d", n_cur); printf(" %d", n_encoding); printf(" %d", n_format); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_htmlNodeDumpFormatOutput(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr buf; /* the HTML buffer output */ int n_buf; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; char * encoding; /* the encoding string */ int n_encoding; int format; /* should formatting spaces been added */ int n_format; for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); buf = gen_xmlOutputBufferPtr(n_buf, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); encoding = gen_const_char_ptr(n_encoding, 3); format = gen_int(n_format, 4); htmlNodeDumpFormatOutput(buf, doc, cur, (const char *)encoding, format); call_tests++; des_xmlOutputBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_int(n_format, format, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNodeDumpFormatOutput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_doc); printf(" %d", n_cur); printf(" %d", n_encoding); printf(" %d", n_format); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_htmlNodeDumpOutput(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr buf; /* the HTML buffer output */ int n_buf; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; char * encoding; /* the encoding string */ int n_encoding; for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); buf = gen_xmlOutputBufferPtr(n_buf, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); encoding = gen_const_char_ptr(n_encoding, 3); htmlNodeDumpOutput(buf, doc, cur, (const char *)encoding); call_tests++; des_xmlOutputBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlNodeDumpOutput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_doc); printf(" %d", n_cur); printf(" %d", n_encoding); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlSaveFile(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; const char * filename; /* the filename (or URL) */ int n_filename; xmlDocPtr cur; /* the document */ int n_cur; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); cur = gen_xmlDocPtr(n_cur, 1); ret_val = htmlSaveFile(filename, cur); desret_int(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_xmlDocPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlSaveFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlSaveFileEnc(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; const char * filename; /* the filename */ int n_filename; xmlDocPtr cur; /* the document */ int n_cur; char * encoding; /* the document encoding */ int n_encoding; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); ret_val = htmlSaveFileEnc(filename, cur, (const char *)encoding); desret_int(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlSaveFileEnc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_cur); printf(" %d", n_encoding); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_htmlSaveFileFormat(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; const char * filename; /* the filename */ int n_filename; xmlDocPtr cur; /* the document */ int n_cur; char * encoding; /* the document encoding */ int n_encoding; int format; /* should formatting spaces been added */ int n_format; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); format = gen_int(n_format, 3); ret_val = htmlSaveFileFormat(filename, cur, (const char *)encoding, format); desret_int(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_int(n_format, format, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlSaveFileFormat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_cur); printf(" %d", n_encoding); printf(" %d", n_format); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_htmlSetMetaEncoding(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; int ret_val; htmlDocPtr doc; /* the document */ int n_doc; xmlChar * encoding; /* the encoding string */ int n_encoding; for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) { for (n_encoding = 0;n_encoding < gen_nb_const_xmlChar_ptr;n_encoding++) { mem_base = xmlMemBlocks(); doc = gen_htmlDocPtr(n_doc, 0); encoding = gen_const_xmlChar_ptr(n_encoding, 1); ret_val = htmlSetMetaEncoding(doc, (const xmlChar *)encoding); desret_int(ret_val); call_tests++; des_htmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_encoding, (const xmlChar *)encoding, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlSetMetaEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_encoding); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_HTMLtree(void) { int test_ret = 0; if (quiet == 0) printf("Testing HTMLtree : 18 of 18 functions ...\n"); test_ret += test_htmlDocContentDumpFormatOutput(); test_ret += test_htmlDocContentDumpOutput(); test_ret += test_htmlDocDump(); test_ret += test_htmlDocDumpMemory(); test_ret += test_htmlDocDumpMemoryFormat(); test_ret += test_htmlGetMetaEncoding(); test_ret += test_htmlIsBooleanAttr(); test_ret += test_htmlNewDoc(); test_ret += test_htmlNewDocNoDtD(); test_ret += test_htmlNodeDump(); test_ret += test_htmlNodeDumpFile(); test_ret += test_htmlNodeDumpFileFormat(); test_ret += test_htmlNodeDumpFormatOutput(); test_ret += test_htmlNodeDumpOutput(); test_ret += test_htmlSaveFile(); test_ret += test_htmlSaveFileEnc(); test_ret += test_htmlSaveFileFormat(); test_ret += test_htmlSetMetaEncoding(); if (test_ret != 0) printf("Module HTMLtree: %d errors\n", test_ret); return(test_ret); } static int test_docbDefaultSAXHandlerInit(void) { int test_ret = 0; #if defined(LIBXML_DOCB_ENABLED) #ifdef LIBXML_DOCB_ENABLED int mem_base; mem_base = xmlMemBlocks(); docbDefaultSAXHandlerInit(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in docbDefaultSAXHandlerInit", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif #endif return(test_ret); } static int test_htmlDefaultSAXHandlerInit(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) #ifdef LIBXML_HTML_ENABLED int mem_base; mem_base = xmlMemBlocks(); htmlDefaultSAXHandlerInit(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlDefaultSAXHandlerInit", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif #endif return(test_ret); } static int test_xmlDefaultSAXHandlerInit(void) { int test_ret = 0; int mem_base; mem_base = xmlMemBlocks(); xmlDefaultSAXHandlerInit(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDefaultSAXHandlerInit", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } #define gen_nb_xmlEnumerationPtr 1 static xmlEnumerationPtr gen_xmlEnumerationPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlEnumerationPtr(int no ATTRIBUTE_UNUSED, xmlEnumerationPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlSAX2AttributeDecl(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * elem; /* the name of the element */ int n_elem; xmlChar * fullname; /* the attribute name */ int n_fullname; int type; /* the attribute type */ int n_type; int def; /* the type of default value */ int n_def; xmlChar * defaultValue; /* the attribute default value */ int n_defaultValue; xmlEnumerationPtr tree; /* the tree of enumerated value set */ int n_tree; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) { for (n_fullname = 0;n_fullname < gen_nb_const_xmlChar_ptr;n_fullname++) { for (n_type = 0;n_type < gen_nb_int;n_type++) { for (n_def = 0;n_def < gen_nb_int;n_def++) { for (n_defaultValue = 0;n_defaultValue < gen_nb_const_xmlChar_ptr;n_defaultValue++) { for (n_tree = 0;n_tree < gen_nb_xmlEnumerationPtr;n_tree++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); elem = gen_const_xmlChar_ptr(n_elem, 1); fullname = gen_const_xmlChar_ptr(n_fullname, 2); type = gen_int(n_type, 3); def = gen_int(n_def, 4); defaultValue = gen_const_xmlChar_ptr(n_defaultValue, 5); tree = gen_xmlEnumerationPtr(n_tree, 6); xmlSAX2AttributeDecl(ctx, (const xmlChar *)elem, (const xmlChar *)fullname, type, def, (const xmlChar *)defaultValue, tree); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 1); des_const_xmlChar_ptr(n_fullname, (const xmlChar *)fullname, 2); des_int(n_type, type, 3); des_int(n_def, def, 4); des_const_xmlChar_ptr(n_defaultValue, (const xmlChar *)defaultValue, 5); des_xmlEnumerationPtr(n_tree, tree, 6); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2AttributeDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_elem); printf(" %d", n_fullname); printf(" %d", n_type); printf(" %d", n_def); printf(" %d", n_defaultValue); printf(" %d", n_tree); printf("\n"); } } } } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2CDataBlock(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * value; /* The pcdata content */ int n_value; int len; /* the block length */ int n_len; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); value = gen_const_xmlChar_ptr(n_value, 1); len = gen_int(n_len, 2); xmlSAX2CDataBlock(ctx, (const xmlChar *)value, len); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2CDataBlock", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_value); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlSAX2Characters(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * ch; /* a xmlChar string */ int n_ch; int len; /* the number of xmlChar */ int n_len; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_ch = 0;n_ch < gen_nb_const_xmlChar_ptr;n_ch++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ch = gen_const_xmlChar_ptr(n_ch, 1); len = gen_int(n_len, 2); xmlSAX2Characters(ctx, (const xmlChar *)ch, len); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_ch, (const xmlChar *)ch, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2Characters", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_ch); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlSAX2Comment(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * value; /* the xmlSAX2Comment content */ int n_value; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); value = gen_const_xmlChar_ptr(n_value, 1); xmlSAX2Comment(ctx, (const xmlChar *)value); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2Comment", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_value); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSAX2ElementDecl(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* the element name */ int n_name; int type; /* the element type */ int n_type; xmlElementContentPtr content; /* the element value tree */ int n_content; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_int;n_type++) { for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); type = gen_int(n_type, 2); content = gen_xmlElementContentPtr(n_content, 3); xmlSAX2ElementDecl(ctx, (const xmlChar *)name, type, content); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_int(n_type, type, 2); des_xmlElementContentPtr(n_content, content, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2ElementDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf(" %d", n_type); printf(" %d", n_content); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2EndDocument(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); xmlSAX2EndDocument(ctx); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2EndDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2EndElement(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* The element name */ int n_name; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); xmlSAX2EndElement(ctx, (const xmlChar *)name); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2EndElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAX2EndElementNs(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * localname; /* the local name of the element */ int n_localname; xmlChar * prefix; /* the element namespace prefix if available */ int n_prefix; xmlChar * URI; /* the element namespace name if available */ int n_URI; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_localname = 0;n_localname < gen_nb_const_xmlChar_ptr;n_localname++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); localname = gen_const_xmlChar_ptr(n_localname, 1); prefix = gen_const_xmlChar_ptr(n_prefix, 2); URI = gen_const_xmlChar_ptr(n_URI, 3); xmlSAX2EndElementNs(ctx, (const xmlChar *)localname, (const xmlChar *)prefix, (const xmlChar *)URI); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_localname, (const xmlChar *)localname, 1); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2); des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2EndElementNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_localname); printf(" %d", n_prefix); printf(" %d", n_URI); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2EntityDecl(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* the entity name */ int n_name; int type; /* the entity type */ int n_type; xmlChar * publicId; /* The public ID of the entity */ int n_publicId; xmlChar * systemId; /* The system ID of the entity */ int n_systemId; xmlChar * content; /* the entity value (without processing). */ int n_content; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_int;n_type++) { for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) { for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) { for (n_content = 0;n_content < gen_nb_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); type = gen_int(n_type, 2); publicId = gen_const_xmlChar_ptr(n_publicId, 3); systemId = gen_const_xmlChar_ptr(n_systemId, 4); content = gen_xmlChar_ptr(n_content, 5); xmlSAX2EntityDecl(ctx, (const xmlChar *)name, type, (const xmlChar *)publicId, (const xmlChar *)systemId, content); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_int(n_type, type, 2); des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 3); des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 4); des_xmlChar_ptr(n_content, content, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2EntityDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf(" %d", n_type); printf(" %d", n_publicId); printf(" %d", n_systemId); printf(" %d", n_content); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2ExternalSubset(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* the root element name */ int n_name; xmlChar * ExternalID; /* the external ID */ int n_ExternalID; xmlChar * SystemID; /* the SYSTEM ID (e.g. filename or URL) */ int n_SystemID; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2); SystemID = gen_const_xmlChar_ptr(n_SystemID, 3); xmlSAX2ExternalSubset(ctx, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2ExternalSubset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2GetColumnNumber(void) { int test_ret = 0; int mem_base; int ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ret_val = xmlSAX2GetColumnNumber(ctx); desret_int(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2GetColumnNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2GetEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* The entity name */ int n_name; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlSAX2GetEntity(ctx, (const xmlChar *)name); desret_xmlEntityPtr(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2GetEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSAX2GetLineNumber(void) { int test_ret = 0; int mem_base; int ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ret_val = xmlSAX2GetLineNumber(ctx); desret_int(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2GetLineNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2GetParameterEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* The entity name */ int n_name; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlSAX2GetParameterEntity(ctx, (const xmlChar *)name); desret_xmlEntityPtr(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2GetParameterEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSAX2GetPublicId(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ret_val = xmlSAX2GetPublicId(ctx); desret_const_xmlChar_ptr(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2GetPublicId", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2GetSystemId(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ret_val = xmlSAX2GetSystemId(ctx); desret_const_xmlChar_ptr(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2GetSystemId", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2HasExternalSubset(void) { int test_ret = 0; int mem_base; int ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ret_val = xmlSAX2HasExternalSubset(ctx); desret_int(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2HasExternalSubset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2HasInternalSubset(void) { int test_ret = 0; int mem_base; int ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ret_val = xmlSAX2HasInternalSubset(ctx); desret_int(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2HasInternalSubset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2IgnorableWhitespace(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * ch; /* a xmlChar string */ int n_ch; int len; /* the number of xmlChar */ int n_len; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_ch = 0;n_ch < gen_nb_const_xmlChar_ptr;n_ch++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ch = gen_const_xmlChar_ptr(n_ch, 1); len = gen_int(n_len, 2); xmlSAX2IgnorableWhitespace(ctx, (const xmlChar *)ch, len); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_ch, (const xmlChar *)ch, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2IgnorableWhitespace", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_ch); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } #define gen_nb_xmlSAXHandler_ptr 1 static xmlSAXHandler * gen_xmlSAXHandler_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSAXHandler_ptr(int no ATTRIBUTE_UNUSED, xmlSAXHandler * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlSAX2InitDefaultSAXHandler(void) { int test_ret = 0; int mem_base; xmlSAXHandler * hdlr; /* the SAX handler */ int n_hdlr; int warning; /* flag if non-zero sets the handler warning procedure */ int n_warning; for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) { for (n_warning = 0;n_warning < gen_nb_int;n_warning++) { mem_base = xmlMemBlocks(); hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0); warning = gen_int(n_warning, 1); xmlSAX2InitDefaultSAXHandler(hdlr, warning); call_tests++; des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0); des_int(n_warning, warning, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2InitDefaultSAXHandler", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_hdlr); printf(" %d", n_warning); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSAX2InitDocbDefaultSAXHandler(void) { int test_ret = 0; #if defined(LIBXML_DOCB_ENABLED) int mem_base; xmlSAXHandler * hdlr; /* the SAX handler */ int n_hdlr; for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) { mem_base = xmlMemBlocks(); hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0); xmlSAX2InitDocbDefaultSAXHandler(hdlr); call_tests++; des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2InitDocbDefaultSAXHandler", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_hdlr); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSAX2InitHtmlDefaultSAXHandler(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; xmlSAXHandler * hdlr; /* the SAX handler */ int n_hdlr; for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) { mem_base = xmlMemBlocks(); hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0); xmlSAX2InitHtmlDefaultSAXHandler(hdlr); call_tests++; des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2InitHtmlDefaultSAXHandler", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_hdlr); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSAX2InternalSubset(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* the root element name */ int n_name; xmlChar * ExternalID; /* the external ID */ int n_ExternalID; xmlChar * SystemID; /* the SYSTEM ID (e.g. filename or URL) */ int n_SystemID; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2); SystemID = gen_const_xmlChar_ptr(n_SystemID, 3); xmlSAX2InternalSubset(ctx, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2InternalSubset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2IsStandalone(void) { int test_ret = 0; int mem_base; int ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); ret_val = xmlSAX2IsStandalone(ctx); desret_int(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2IsStandalone", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2NotationDecl(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* The name of the notation */ int n_name; xmlChar * publicId; /* The public ID of the entity */ int n_publicId; xmlChar * systemId; /* The system ID of the entity */ int n_systemId; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) { for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); publicId = gen_const_xmlChar_ptr(n_publicId, 2); systemId = gen_const_xmlChar_ptr(n_systemId, 3); xmlSAX2NotationDecl(ctx, (const xmlChar *)name, (const xmlChar *)publicId, (const xmlChar *)systemId); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 2); des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2NotationDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf(" %d", n_publicId); printf(" %d", n_systemId); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2ProcessingInstruction(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * target; /* the target name */ int n_target; xmlChar * data; /* the PI data's */ int n_data; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_target = 0;n_target < gen_nb_const_xmlChar_ptr;n_target++) { for (n_data = 0;n_data < gen_nb_const_xmlChar_ptr;n_data++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); target = gen_const_xmlChar_ptr(n_target, 1); data = gen_const_xmlChar_ptr(n_data, 2); xmlSAX2ProcessingInstruction(ctx, (const xmlChar *)target, (const xmlChar *)data); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_target, (const xmlChar *)target, 1); des_const_xmlChar_ptr(n_data, (const xmlChar *)data, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2ProcessingInstruction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_target); printf(" %d", n_data); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlSAX2Reference(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* The entity name */ int n_name; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); xmlSAX2Reference(ctx, (const xmlChar *)name); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2Reference", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSAX2ResolveEntity(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * publicId; /* The public ID of the entity */ int n_publicId; xmlChar * systemId; /* The system ID of the entity */ int n_systemId; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) { for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); publicId = gen_const_xmlChar_ptr(n_publicId, 1); systemId = gen_const_xmlChar_ptr(n_systemId, 2); ret_val = xmlSAX2ResolveEntity(ctx, (const xmlChar *)publicId, (const xmlChar *)systemId); desret_xmlParserInputPtr(ret_val); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 1); des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2ResolveEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_publicId); printf(" %d", n_systemId); printf("\n"); } } } } function_tests++; return(test_ret); } #define gen_nb_xmlSAXLocatorPtr 1 static xmlSAXLocatorPtr gen_xmlSAXLocatorPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSAXLocatorPtr(int no ATTRIBUTE_UNUSED, xmlSAXLocatorPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlSAX2SetDocumentLocator(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlSAXLocatorPtr loc; /* A SAX Locator */ int n_loc; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_loc = 0;n_loc < gen_nb_xmlSAXLocatorPtr;n_loc++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); loc = gen_xmlSAXLocatorPtr(n_loc, 1); xmlSAX2SetDocumentLocator(ctx, loc); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_xmlSAXLocatorPtr(n_loc, loc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2SetDocumentLocator", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_loc); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSAX2StartDocument(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); xmlSAX2StartDocument(ctx); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2StartDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSAX2StartElement(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * fullname; /* The element name, including namespace prefix */ int n_fullname; xmlChar ** atts; /* An array of name/value attributes pairs, NULL terminated */ int n_atts; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_fullname = 0;n_fullname < gen_nb_const_xmlChar_ptr;n_fullname++) { for (n_atts = 0;n_atts < gen_nb_const_xmlChar_ptr_ptr;n_atts++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); fullname = gen_const_xmlChar_ptr(n_fullname, 1); atts = gen_const_xmlChar_ptr_ptr(n_atts, 2); xmlSAX2StartElement(ctx, (const xmlChar *)fullname, (const xmlChar **)atts); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_fullname, (const xmlChar *)fullname, 1); des_const_xmlChar_ptr_ptr(n_atts, (const xmlChar **)atts, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2StartElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_fullname); printf(" %d", n_atts); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAX2StartElementNs(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * localname; /* the local name of the element */ int n_localname; xmlChar * prefix; /* the element namespace prefix if available */ int n_prefix; xmlChar * URI; /* the element namespace name if available */ int n_URI; int nb_namespaces; /* number of namespace definitions on that node */ int n_nb_namespaces; xmlChar ** namespaces; /* pointer to the array of prefix/URI pairs namespace definitions */ int n_namespaces; int nb_attributes; /* the number of attributes on that node */ int n_nb_attributes; int nb_defaulted; /* the number of defaulted attributes. */ int n_nb_defaulted; xmlChar ** attributes; /* pointer to the array of (localname/prefix/URI/value/end) attribute values. */ int n_attributes; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_localname = 0;n_localname < gen_nb_const_xmlChar_ptr;n_localname++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { for (n_nb_namespaces = 0;n_nb_namespaces < gen_nb_int;n_nb_namespaces++) { for (n_namespaces = 0;n_namespaces < gen_nb_const_xmlChar_ptr_ptr;n_namespaces++) { for (n_nb_attributes = 0;n_nb_attributes < gen_nb_int;n_nb_attributes++) { for (n_nb_defaulted = 0;n_nb_defaulted < gen_nb_int;n_nb_defaulted++) { for (n_attributes = 0;n_attributes < gen_nb_const_xmlChar_ptr_ptr;n_attributes++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); localname = gen_const_xmlChar_ptr(n_localname, 1); prefix = gen_const_xmlChar_ptr(n_prefix, 2); URI = gen_const_xmlChar_ptr(n_URI, 3); nb_namespaces = gen_int(n_nb_namespaces, 4); namespaces = gen_const_xmlChar_ptr_ptr(n_namespaces, 5); nb_attributes = gen_int(n_nb_attributes, 6); nb_defaulted = gen_int(n_nb_defaulted, 7); attributes = gen_const_xmlChar_ptr_ptr(n_attributes, 8); xmlSAX2StartElementNs(ctx, (const xmlChar *)localname, (const xmlChar *)prefix, (const xmlChar *)URI, nb_namespaces, (const xmlChar **)namespaces, nb_attributes, nb_defaulted, (const xmlChar **)attributes); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_localname, (const xmlChar *)localname, 1); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2); des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 3); des_int(n_nb_namespaces, nb_namespaces, 4); des_const_xmlChar_ptr_ptr(n_namespaces, (const xmlChar **)namespaces, 5); des_int(n_nb_attributes, nb_attributes, 6); des_int(n_nb_defaulted, nb_defaulted, 7); des_const_xmlChar_ptr_ptr(n_attributes, (const xmlChar **)attributes, 8); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2StartElementNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_localname); printf(" %d", n_prefix); printf(" %d", n_URI); printf(" %d", n_nb_namespaces); printf(" %d", n_namespaces); printf(" %d", n_nb_attributes); printf(" %d", n_nb_defaulted); printf(" %d", n_attributes); printf("\n"); } } } } } } } } } } function_tests++; return(test_ret); } static int test_xmlSAX2UnparsedEntityDecl(void) { int test_ret = 0; int mem_base; void * ctx; /* the user data (XML parser context) */ int n_ctx; xmlChar * name; /* The name of the entity */ int n_name; xmlChar * publicId; /* The public ID of the entity */ int n_publicId; xmlChar * systemId; /* The system ID of the entity */ int n_systemId; xmlChar * notationName; /* the name of the notation */ int n_notationName; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) { for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) { for (n_notationName = 0;n_notationName < gen_nb_const_xmlChar_ptr;n_notationName++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); name = gen_const_xmlChar_ptr(n_name, 1); publicId = gen_const_xmlChar_ptr(n_publicId, 2); systemId = gen_const_xmlChar_ptr(n_systemId, 3); notationName = gen_const_xmlChar_ptr(n_notationName, 4); xmlSAX2UnparsedEntityDecl(ctx, (const xmlChar *)name, (const xmlChar *)publicId, (const xmlChar *)systemId, (const xmlChar *)notationName); call_tests++; des_void_ptr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 2); des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 3); des_const_xmlChar_ptr(n_notationName, (const xmlChar *)notationName, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAX2UnparsedEntityDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_name); printf(" %d", n_publicId); printf(" %d", n_systemId); printf(" %d", n_notationName); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlSAXDefaultVersion(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; int ret_val; int version; /* the version, 1 or 2 */ int n_version; for (n_version = 0;n_version < gen_nb_int;n_version++) { mem_base = xmlMemBlocks(); version = gen_int(n_version, 0); ret_val = xmlSAXDefaultVersion(version); desret_int(ret_val); call_tests++; des_int(n_version, version, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXDefaultVersion", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_version); printf("\n"); } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXVersion(void) { int test_ret = 0; int mem_base; int ret_val; xmlSAXHandler * hdlr; /* the SAX handler */ int n_hdlr; int version; /* the version, 1 or 2 */ int n_version; for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) { for (n_version = 0;n_version < gen_nb_int;n_version++) { mem_base = xmlMemBlocks(); hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0); version = gen_int(n_version, 1); ret_val = xmlSAXVersion(hdlr, version); desret_int(ret_val); call_tests++; des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0); des_int(n_version, version, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXVersion", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_hdlr); printf(" %d", n_version); printf("\n"); } } } function_tests++; return(test_ret); } static int test_SAX2(void) { int test_ret = 0; if (quiet == 0) printf("Testing SAX2 : 38 of 38 functions ...\n"); test_ret += test_docbDefaultSAXHandlerInit(); test_ret += test_htmlDefaultSAXHandlerInit(); test_ret += test_xmlDefaultSAXHandlerInit(); test_ret += test_xmlSAX2AttributeDecl(); test_ret += test_xmlSAX2CDataBlock(); test_ret += test_xmlSAX2Characters(); test_ret += test_xmlSAX2Comment(); test_ret += test_xmlSAX2ElementDecl(); test_ret += test_xmlSAX2EndDocument(); test_ret += test_xmlSAX2EndElement(); test_ret += test_xmlSAX2EndElementNs(); test_ret += test_xmlSAX2EntityDecl(); test_ret += test_xmlSAX2ExternalSubset(); test_ret += test_xmlSAX2GetColumnNumber(); test_ret += test_xmlSAX2GetEntity(); test_ret += test_xmlSAX2GetLineNumber(); test_ret += test_xmlSAX2GetParameterEntity(); test_ret += test_xmlSAX2GetPublicId(); test_ret += test_xmlSAX2GetSystemId(); test_ret += test_xmlSAX2HasExternalSubset(); test_ret += test_xmlSAX2HasInternalSubset(); test_ret += test_xmlSAX2IgnorableWhitespace(); test_ret += test_xmlSAX2InitDefaultSAXHandler(); test_ret += test_xmlSAX2InitDocbDefaultSAXHandler(); test_ret += test_xmlSAX2InitHtmlDefaultSAXHandler(); test_ret += test_xmlSAX2InternalSubset(); test_ret += test_xmlSAX2IsStandalone(); test_ret += test_xmlSAX2NotationDecl(); test_ret += test_xmlSAX2ProcessingInstruction(); test_ret += test_xmlSAX2Reference(); test_ret += test_xmlSAX2ResolveEntity(); test_ret += test_xmlSAX2SetDocumentLocator(); test_ret += test_xmlSAX2StartDocument(); test_ret += test_xmlSAX2StartElement(); test_ret += test_xmlSAX2StartElementNs(); test_ret += test_xmlSAX2UnparsedEntityDecl(); test_ret += test_xmlSAXDefaultVersion(); test_ret += test_xmlSAXVersion(); if (test_ret != 0) printf("Module SAX2: %d errors\n", test_ret); return(test_ret); } static int test_xmlC14NDocDumpMemory(void) { int test_ret = 0; #if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlDocPtr doc; /* the XML document for canonization */ int n_doc; xmlNodeSetPtr nodes; /* the nodes set to be included in the canonized image or NULL if all document nodes should be included */ int n_nodes; int mode; /* the c14n mode (see @xmlC14NMode) */ int n_mode; xmlChar ** inclusive_ns_prefixes; /* the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise) */ int n_inclusive_ns_prefixes; int with_comments; /* include comments in the result (!=0) or not (==0) */ int n_with_comments; xmlChar ** doc_txt_ptr; /* the memory pointer for allocated canonical XML text; the caller of this functions is responsible for calling xmlFree() to free allocated memory */ int n_doc_txt_ptr; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { for (n_mode = 0;n_mode < gen_nb_int;n_mode++) { for (n_inclusive_ns_prefixes = 0;n_inclusive_ns_prefixes < gen_nb_xmlChar_ptr_ptr;n_inclusive_ns_prefixes++) { for (n_with_comments = 0;n_with_comments < gen_nb_int;n_with_comments++) { for (n_doc_txt_ptr = 0;n_doc_txt_ptr < gen_nb_xmlChar_ptr_ptr;n_doc_txt_ptr++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); nodes = gen_xmlNodeSetPtr(n_nodes, 1); mode = gen_int(n_mode, 2); inclusive_ns_prefixes = gen_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, 3); with_comments = gen_int(n_with_comments, 4); doc_txt_ptr = gen_xmlChar_ptr_ptr(n_doc_txt_ptr, 5); ret_val = xmlC14NDocDumpMemory(doc, nodes, mode, inclusive_ns_prefixes, with_comments, doc_txt_ptr); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodeSetPtr(n_nodes, nodes, 1); des_int(n_mode, mode, 2); des_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, inclusive_ns_prefixes, 3); des_int(n_with_comments, with_comments, 4); des_xmlChar_ptr_ptr(n_doc_txt_ptr, doc_txt_ptr, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlC14NDocDumpMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_nodes); printf(" %d", n_mode); printf(" %d", n_inclusive_ns_prefixes); printf(" %d", n_with_comments); printf(" %d", n_doc_txt_ptr); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlC14NDocSave(void) { int test_ret = 0; #if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlDocPtr doc; /* the XML document for canonization */ int n_doc; xmlNodeSetPtr nodes; /* the nodes set to be included in the canonized image or NULL if all document nodes should be included */ int n_nodes; int mode; /* the c14n mode (see @xmlC14NMode) */ int n_mode; xmlChar ** inclusive_ns_prefixes; /* the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise) */ int n_inclusive_ns_prefixes; int with_comments; /* include comments in the result (!=0) or not (==0) */ int n_with_comments; const char * filename; /* the filename to store canonical XML image */ int n_filename; int compression; /* the compression level (zlib requred): -1 - libxml default, 0 - uncompressed, >0 - compression level */ int n_compression; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { for (n_mode = 0;n_mode < gen_nb_int;n_mode++) { for (n_inclusive_ns_prefixes = 0;n_inclusive_ns_prefixes < gen_nb_xmlChar_ptr_ptr;n_inclusive_ns_prefixes++) { for (n_with_comments = 0;n_with_comments < gen_nb_int;n_with_comments++) { for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_compression = 0;n_compression < gen_nb_int;n_compression++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); nodes = gen_xmlNodeSetPtr(n_nodes, 1); mode = gen_int(n_mode, 2); inclusive_ns_prefixes = gen_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, 3); with_comments = gen_int(n_with_comments, 4); filename = gen_fileoutput(n_filename, 5); compression = gen_int(n_compression, 6); ret_val = xmlC14NDocSave(doc, nodes, mode, inclusive_ns_prefixes, with_comments, filename, compression); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodeSetPtr(n_nodes, nodes, 1); des_int(n_mode, mode, 2); des_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, inclusive_ns_prefixes, 3); des_int(n_with_comments, with_comments, 4); des_fileoutput(n_filename, filename, 5); des_int(n_compression, compression, 6); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlC14NDocSave", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_nodes); printf(" %d", n_mode); printf(" %d", n_inclusive_ns_prefixes); printf(" %d", n_with_comments); printf(" %d", n_filename); printf(" %d", n_compression); printf("\n"); } } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlC14NDocSaveTo(void) { int test_ret = 0; #if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlDocPtr doc; /* the XML document for canonization */ int n_doc; xmlNodeSetPtr nodes; /* the nodes set to be included in the canonized image or NULL if all document nodes should be included */ int n_nodes; int mode; /* the c14n mode (see @xmlC14NMode) */ int n_mode; xmlChar ** inclusive_ns_prefixes; /* the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise) */ int n_inclusive_ns_prefixes; int with_comments; /* include comments in the result (!=0) or not (==0) */ int n_with_comments; xmlOutputBufferPtr buf; /* the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output */ int n_buf; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { for (n_mode = 0;n_mode < gen_nb_int;n_mode++) { for (n_inclusive_ns_prefixes = 0;n_inclusive_ns_prefixes < gen_nb_xmlChar_ptr_ptr;n_inclusive_ns_prefixes++) { for (n_with_comments = 0;n_with_comments < gen_nb_int;n_with_comments++) { for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); nodes = gen_xmlNodeSetPtr(n_nodes, 1); mode = gen_int(n_mode, 2); inclusive_ns_prefixes = gen_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, 3); with_comments = gen_int(n_with_comments, 4); buf = gen_xmlOutputBufferPtr(n_buf, 5); ret_val = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes, with_comments, buf); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodeSetPtr(n_nodes, nodes, 1); des_int(n_mode, mode, 2); des_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, inclusive_ns_prefixes, 3); des_int(n_with_comments, with_comments, 4); des_xmlOutputBufferPtr(n_buf, buf, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlC14NDocSaveTo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_nodes); printf(" %d", n_mode); printf(" %d", n_inclusive_ns_prefixes); printf(" %d", n_with_comments); printf(" %d", n_buf); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlC14NExecute(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_c14n(void) { int test_ret = 0; if (quiet == 0) printf("Testing c14n : 3 of 4 functions ...\n"); test_ret += test_xmlC14NDocDumpMemory(); test_ret += test_xmlC14NDocSave(); test_ret += test_xmlC14NDocSaveTo(); test_ret += test_xmlC14NExecute(); if (test_ret != 0) printf("Module c14n: %d errors\n", test_ret); return(test_ret); } #ifdef LIBXML_CATALOG_ENABLED #define gen_nb_xmlCatalogPtr 1 static xmlCatalogPtr gen_xmlCatalogPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlCatalogPtr(int no ATTRIBUTE_UNUSED, xmlCatalogPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlACatalogAdd(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; int ret_val; xmlCatalogPtr catal; /* a Catalog */ int n_catal; xmlChar * type; /* the type of record to add to the catalog */ int n_type; xmlChar * orig; /* the system, public or prefix to match */ int n_orig; xmlChar * replace; /* the replacement value for the match */ int n_replace; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { for (n_type = 0;n_type < gen_nb_const_xmlChar_ptr;n_type++) { for (n_orig = 0;n_orig < gen_nb_const_xmlChar_ptr;n_orig++) { for (n_replace = 0;n_replace < gen_nb_const_xmlChar_ptr;n_replace++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); type = gen_const_xmlChar_ptr(n_type, 1); orig = gen_const_xmlChar_ptr(n_orig, 2); replace = gen_const_xmlChar_ptr(n_replace, 3); ret_val = xmlACatalogAdd(catal, (const xmlChar *)type, (const xmlChar *)orig, (const xmlChar *)replace); desret_int(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); des_const_xmlChar_ptr(n_type, (const xmlChar *)type, 1); des_const_xmlChar_ptr(n_orig, (const xmlChar *)orig, 2); des_const_xmlChar_ptr(n_replace, (const xmlChar *)replace, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlACatalogAdd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf(" %d", n_type); printf(" %d", n_orig); printf(" %d", n_replace); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlACatalogDump(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlCatalogPtr catal; /* a Catalog */ int n_catal; FILE * out; /* the file. */ int n_out; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); out = gen_FILE_ptr(n_out, 1); xmlACatalogDump(catal, out); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); des_FILE_ptr(n_out, out, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlACatalogDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf(" %d", n_out); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlACatalogRemove(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; int ret_val; xmlCatalogPtr catal; /* a Catalog */ int n_catal; xmlChar * value; /* the value to remove */ int n_value; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); value = gen_const_xmlChar_ptr(n_value, 1); ret_val = xmlACatalogRemove(catal, (const xmlChar *)value); desret_int(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlACatalogRemove", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf(" %d", n_value); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlACatalogResolve(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; xmlCatalogPtr catal; /* a Catalog */ int n_catal; xmlChar * pubID; /* the public ID string */ int n_pubID; xmlChar * sysID; /* the system ID string */ int n_sysID; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) { for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); pubID = gen_const_xmlChar_ptr(n_pubID, 1); sysID = gen_const_xmlChar_ptr(n_sysID, 2); ret_val = xmlACatalogResolve(catal, (const xmlChar *)pubID, (const xmlChar *)sysID); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 1); des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlACatalogResolve", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf(" %d", n_pubID); printf(" %d", n_sysID); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlACatalogResolvePublic(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; xmlCatalogPtr catal; /* a Catalog */ int n_catal; xmlChar * pubID; /* the public ID string */ int n_pubID; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); pubID = gen_const_xmlChar_ptr(n_pubID, 1); ret_val = xmlACatalogResolvePublic(catal, (const xmlChar *)pubID); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlACatalogResolvePublic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf(" %d", n_pubID); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlACatalogResolveSystem(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; xmlCatalogPtr catal; /* a Catalog */ int n_catal; xmlChar * sysID; /* the system ID string */ int n_sysID; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); sysID = gen_const_xmlChar_ptr(n_sysID, 1); ret_val = xmlACatalogResolveSystem(catal, (const xmlChar *)sysID); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlACatalogResolveSystem", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf(" %d", n_sysID); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlACatalogResolveURI(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; xmlCatalogPtr catal; /* a Catalog */ int n_catal; xmlChar * URI; /* the URI */ int n_URI; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); URI = gen_const_xmlChar_ptr(n_URI, 1); ret_val = xmlACatalogResolveURI(catal, (const xmlChar *)URI); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlACatalogResolveURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf(" %d", n_URI); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogAdd(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; int ret_val; xmlChar * type; /* the type of record to add to the catalog */ int n_type; xmlChar * orig; /* the system, public or prefix to match */ int n_orig; xmlChar * replace; /* the replacement value for the match */ int n_replace; for (n_type = 0;n_type < gen_nb_const_xmlChar_ptr;n_type++) { for (n_orig = 0;n_orig < gen_nb_const_xmlChar_ptr;n_orig++) { for (n_replace = 0;n_replace < gen_nb_const_xmlChar_ptr;n_replace++) { mem_base = xmlMemBlocks(); type = gen_const_xmlChar_ptr(n_type, 0); orig = gen_const_xmlChar_ptr(n_orig, 1); replace = gen_const_xmlChar_ptr(n_replace, 2); ret_val = xmlCatalogAdd((const xmlChar *)type, (const xmlChar *)orig, (const xmlChar *)replace); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_type, (const xmlChar *)type, 0); des_const_xmlChar_ptr(n_orig, (const xmlChar *)orig, 1); des_const_xmlChar_ptr(n_replace, (const xmlChar *)replace, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogAdd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf(" %d", n_orig); printf(" %d", n_replace); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogCleanup(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) xmlCatalogCleanup(); call_tests++; xmlResetLastError(); function_tests++; #endif return(test_ret); } static int test_xmlCatalogConvert(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int ret_val; ret_val = xmlCatalogConvert(); desret_int(ret_val); call_tests++; xmlResetLastError(); function_tests++; #endif return(test_ret); } static int test_xmlCatalogDump(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; FILE * out; /* the file. */ int n_out; for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) { mem_base = xmlMemBlocks(); out = gen_FILE_ptr(n_out, 0); xmlCatalogDump(out); call_tests++; des_FILE_ptr(n_out, out, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogGetDefaults(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlCatalogAllow ret_val; mem_base = xmlMemBlocks(); ret_val = xmlCatalogGetDefaults(); desret_xmlCatalogAllow(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogGetDefaults", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlCatalogIsEmpty(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; int ret_val; xmlCatalogPtr catal; /* should this create an SGML catalog */ int n_catal; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); ret_val = xmlCatalogIsEmpty(catal); desret_int(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogIsEmpty", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogLocalResolve(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; void * catalogs; /* a document's list of catalogs */ int n_catalogs; xmlChar * pubID; /* the public ID string */ int n_pubID; xmlChar * sysID; /* the system ID string */ int n_sysID; for (n_catalogs = 0;n_catalogs < gen_nb_void_ptr;n_catalogs++) { for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) { for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) { mem_base = xmlMemBlocks(); catalogs = gen_void_ptr(n_catalogs, 0); pubID = gen_const_xmlChar_ptr(n_pubID, 1); sysID = gen_const_xmlChar_ptr(n_sysID, 2); ret_val = xmlCatalogLocalResolve(catalogs, (const xmlChar *)pubID, (const xmlChar *)sysID); desret_xmlChar_ptr(ret_val); call_tests++; des_void_ptr(n_catalogs, catalogs, 0); des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 1); des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogLocalResolve", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catalogs); printf(" %d", n_pubID); printf(" %d", n_sysID); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogLocalResolveURI(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; void * catalogs; /* a document's list of catalogs */ int n_catalogs; xmlChar * URI; /* the URI */ int n_URI; for (n_catalogs = 0;n_catalogs < gen_nb_void_ptr;n_catalogs++) { for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { mem_base = xmlMemBlocks(); catalogs = gen_void_ptr(n_catalogs, 0); URI = gen_const_xmlChar_ptr(n_URI, 1); ret_val = xmlCatalogLocalResolveURI(catalogs, (const xmlChar *)URI); desret_xmlChar_ptr(ret_val); call_tests++; des_void_ptr(n_catalogs, catalogs, 0); des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogLocalResolveURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catalogs); printf(" %d", n_URI); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogRemove(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int ret_val; xmlChar * value; /* the value to remove */ int n_value; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { value = gen_const_xmlChar_ptr(n_value, 0); ret_val = xmlCatalogRemove((const xmlChar *)value); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); xmlResetLastError(); } function_tests++; #endif return(test_ret); } static int test_xmlCatalogResolve(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) xmlChar * ret_val; xmlChar * pubID; /* the public ID string */ int n_pubID; xmlChar * sysID; /* the system ID string */ int n_sysID; for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) { for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) { pubID = gen_const_xmlChar_ptr(n_pubID, 0); sysID = gen_const_xmlChar_ptr(n_sysID, 1); ret_val = xmlCatalogResolve((const xmlChar *)pubID, (const xmlChar *)sysID); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 0); des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 1); xmlResetLastError(); } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogResolvePublic(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; xmlChar * pubID; /* the public ID string */ int n_pubID; for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) { mem_base = xmlMemBlocks(); pubID = gen_const_xmlChar_ptr(n_pubID, 0); ret_val = xmlCatalogResolvePublic((const xmlChar *)pubID); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogResolvePublic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_pubID); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogResolveSystem(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; xmlChar * sysID; /* the system ID string */ int n_sysID; for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) { mem_base = xmlMemBlocks(); sysID = gen_const_xmlChar_ptr(n_sysID, 0); ret_val = xmlCatalogResolveSystem((const xmlChar *)sysID); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogResolveSystem", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sysID); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogResolveURI(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlChar * ret_val; xmlChar * URI; /* the URI */ int n_URI; for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { mem_base = xmlMemBlocks(); URI = gen_const_xmlChar_ptr(n_URI, 0); ret_val = xmlCatalogResolveURI((const xmlChar *)URI); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogResolveURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogSetDefaultPrefer(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlCatalogPrefer ret_val; xmlCatalogPrefer prefer; /* the default preference for delegation */ int n_prefer; for (n_prefer = 0;n_prefer < gen_nb_xmlCatalogPrefer;n_prefer++) { mem_base = xmlMemBlocks(); prefer = gen_xmlCatalogPrefer(n_prefer, 0); ret_val = xmlCatalogSetDefaultPrefer(prefer); desret_xmlCatalogPrefer(ret_val); call_tests++; des_xmlCatalogPrefer(n_prefer, prefer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogSetDefaultPrefer", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_prefer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCatalogSetDefaults(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlCatalogAllow allow; /* what catalogs should be accepted */ int n_allow; for (n_allow = 0;n_allow < gen_nb_xmlCatalogAllow;n_allow++) { mem_base = xmlMemBlocks(); allow = gen_xmlCatalogAllow(n_allow, 0); xmlCatalogSetDefaults(allow); call_tests++; des_xmlCatalogAllow(n_allow, allow, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCatalogSetDefaults", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_allow); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlConvertSGMLCatalog(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; int ret_val; xmlCatalogPtr catal; /* the catalog */ int n_catal; for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) { mem_base = xmlMemBlocks(); catal = gen_xmlCatalogPtr(n_catal, 0); ret_val = xmlConvertSGMLCatalog(catal); desret_int(ret_val); call_tests++; des_xmlCatalogPtr(n_catal, catal, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlConvertSGMLCatalog", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_catal); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlInitializeCatalog(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlInitializeCatalog(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlInitializeCatalog", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlLoadACatalog(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlLoadCatalog(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int ret_val; const char * filename; /* a file path */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { filename = gen_filepath(n_filename, 0); ret_val = xmlLoadCatalog(filename); desret_int(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); } function_tests++; #endif return(test_ret); } static int test_xmlLoadCatalogs(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) char * pathss; /* a list of directories separated by a colon or a space. */ int n_pathss; for (n_pathss = 0;n_pathss < gen_nb_const_char_ptr;n_pathss++) { pathss = gen_const_char_ptr(n_pathss, 0); xmlLoadCatalogs((const char *)pathss); call_tests++; des_const_char_ptr(n_pathss, (const char *)pathss, 0); xmlResetLastError(); } function_tests++; #endif return(test_ret); } static int test_xmlLoadSGMLSuperCatalog(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlNewCatalog(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParseCatalogFile(void) { int test_ret = 0; #if defined(LIBXML_CATALOG_ENABLED) int mem_base; xmlDocPtr ret_val; const char * filename; /* the filename */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlParseCatalogFile(filename); desret_xmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseCatalogFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_catalog(void) { int test_ret = 0; if (quiet == 0) printf("Testing catalog : 27 of 36 functions ...\n"); test_ret += test_xmlACatalogAdd(); test_ret += test_xmlACatalogDump(); test_ret += test_xmlACatalogRemove(); test_ret += test_xmlACatalogResolve(); test_ret += test_xmlACatalogResolvePublic(); test_ret += test_xmlACatalogResolveSystem(); test_ret += test_xmlACatalogResolveURI(); test_ret += test_xmlCatalogAdd(); test_ret += test_xmlCatalogCleanup(); test_ret += test_xmlCatalogConvert(); test_ret += test_xmlCatalogDump(); test_ret += test_xmlCatalogGetDefaults(); test_ret += test_xmlCatalogIsEmpty(); test_ret += test_xmlCatalogLocalResolve(); test_ret += test_xmlCatalogLocalResolveURI(); test_ret += test_xmlCatalogRemove(); test_ret += test_xmlCatalogResolve(); test_ret += test_xmlCatalogResolvePublic(); test_ret += test_xmlCatalogResolveSystem(); test_ret += test_xmlCatalogResolveURI(); test_ret += test_xmlCatalogSetDefaultPrefer(); test_ret += test_xmlCatalogSetDefaults(); test_ret += test_xmlConvertSGMLCatalog(); test_ret += test_xmlInitializeCatalog(); test_ret += test_xmlLoadACatalog(); test_ret += test_xmlLoadCatalog(); test_ret += test_xmlLoadCatalogs(); test_ret += test_xmlLoadSGMLSuperCatalog(); test_ret += test_xmlNewCatalog(); test_ret += test_xmlParseCatalogFile(); if (test_ret != 0) printf("Module catalog: %d errors\n", test_ret); return(test_ret); } #define gen_nb_const_xmlChRangeGroup_ptr 1 static xmlChRangeGroup * gen_const_xmlChRangeGroup_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlChRangeGroup_ptr(int no ATTRIBUTE_UNUSED, const xmlChRangeGroup * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlCharInRange(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int val; /* character to be validated */ int n_val; xmlChRangeGroup * rptr; /* pointer to range to be used to validate */ int n_rptr; for (n_val = 0;n_val < gen_nb_unsigned_int;n_val++) { for (n_rptr = 0;n_rptr < gen_nb_const_xmlChRangeGroup_ptr;n_rptr++) { mem_base = xmlMemBlocks(); val = gen_unsigned_int(n_val, 0); rptr = gen_const_xmlChRangeGroup_ptr(n_rptr, 1); ret_val = xmlCharInRange(val, (const xmlChRangeGroup *)rptr); desret_int(ret_val); call_tests++; des_unsigned_int(n_val, val, 0); des_const_xmlChRangeGroup_ptr(n_rptr, (const xmlChRangeGroup *)rptr, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCharInRange", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf(" %d", n_rptr); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlIsBaseChar(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsBaseChar(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsBaseChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsBlank(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsBlank(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsBlank", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsChar(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsChar(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsCombining(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsCombining(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsCombining", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsDigit(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsDigit(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsDigit", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsExtender(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsExtender(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsExtender", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsIdeographic(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsIdeographic(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsIdeographic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsPubidChar(void) { int test_ret = 0; int mem_base; int ret_val; unsigned int ch; /* character to validate */ int n_ch; for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) { mem_base = xmlMemBlocks(); ch = gen_unsigned_int(n_ch, 0); ret_val = xmlIsPubidChar(ch); desret_int(ret_val); call_tests++; des_unsigned_int(n_ch, ch, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsPubidChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ch); printf("\n"); } } function_tests++; return(test_ret); } static int test_chvalid(void) { int test_ret = 0; if (quiet == 0) printf("Testing chvalid : 9 of 9 functions ...\n"); test_ret += test_xmlCharInRange(); test_ret += test_xmlIsBaseChar(); test_ret += test_xmlIsBlank(); test_ret += test_xmlIsChar(); test_ret += test_xmlIsCombining(); test_ret += test_xmlIsDigit(); test_ret += test_xmlIsExtender(); test_ret += test_xmlIsIdeographic(); test_ret += test_xmlIsPubidChar(); if (test_ret != 0) printf("Module chvalid: %d errors\n", test_ret); return(test_ret); } static int test_xmlBoolToText(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; const char * ret_val; int boolval; /* a bool to turn into text */ int n_boolval; for (n_boolval = 0;n_boolval < gen_nb_int;n_boolval++) { mem_base = xmlMemBlocks(); boolval = gen_int(n_boolval, 0); ret_val = xmlBoolToText(boolval); desret_const_char_ptr(ret_val); call_tests++; des_int(n_boolval, boolval, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBoolToText", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_boolval); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlDebugCheckDocument(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; int ret_val; FILE * output; /* the FILE * for the output */ int n_output; xmlDocPtr doc; /* the document */ int n_doc; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlDebugCheckDocument(output, doc); desret_int(ret_val); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugCheckDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpAttr(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlAttrPtr attr; /* the attribute */ int n_attr; int depth; /* the indentation level. */ int n_depth; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); attr = gen_xmlAttrPtr(n_attr, 1); depth = gen_int(n_depth, 2); xmlDebugDumpAttr(output, attr, depth); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlAttrPtr(n_attr, attr, 1); des_int(n_depth, depth, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpAttr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_attr); printf(" %d", n_depth); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpAttrList(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlAttrPtr attr; /* the attribute list */ int n_attr; int depth; /* the indentation level. */ int n_depth; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); attr = gen_xmlAttrPtr(n_attr, 1); depth = gen_int(n_depth, 2); xmlDebugDumpAttrList(output, attr, depth); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlAttrPtr(n_attr, attr, 1); des_int(n_depth, depth, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpAttrList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_attr); printf(" %d", n_depth); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpDTD(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlDtdPtr dtd; /* the DTD */ int n_dtd; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); dtd = gen_xmlDtdPtr(n_dtd, 1); xmlDebugDumpDTD(output, dtd); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlDtdPtr(n_dtd, dtd, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpDTD", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_dtd); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpDocument(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlDocPtr doc; /* the document */ int n_doc; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); doc = gen_xmlDocPtr(n_doc, 1); xmlDebugDumpDocument(output, doc); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpDocumentHead(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlDocPtr doc; /* the document */ int n_doc; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); doc = gen_xmlDocPtr(n_doc, 1); xmlDebugDumpDocumentHead(output, doc); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpDocumentHead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpEntities(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlDocPtr doc; /* the document */ int n_doc; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); doc = gen_xmlDocPtr(n_doc, 1); xmlDebugDumpEntities(output, doc); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpEntities", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpNode(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlNodePtr node; /* the node */ int n_node; int depth; /* the indentation level. */ int n_depth; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); node = gen_xmlNodePtr(n_node, 1); depth = gen_int(n_depth, 2); xmlDebugDumpNode(output, node, depth); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlNodePtr(n_node, node, 1); des_int(n_depth, depth, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_node); printf(" %d", n_depth); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpNodeList(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlNodePtr node; /* the node list */ int n_node; int depth; /* the indentation level. */ int n_depth; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); node = gen_xmlNodePtr(n_node, 1); depth = gen_int(n_depth, 2); xmlDebugDumpNodeList(output, node, depth); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlNodePtr(n_node, node, 1); des_int(n_depth, depth, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpNodeList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_node); printf(" %d", n_depth); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpOneNode(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlNodePtr node; /* the node */ int n_node; int depth; /* the indentation level. */ int n_depth; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); node = gen_xmlNodePtr(n_node, 1); depth = gen_int(n_depth, 2); xmlDebugDumpOneNode(output, node, depth); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlNodePtr(n_node, node, 1); des_int(n_depth, depth, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpOneNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_node); printf(" %d", n_depth); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlDebugDumpString(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlChar * str; /* the string */ int n_str; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); str = gen_const_xmlChar_ptr(n_str, 1); xmlDebugDumpString(output, (const xmlChar *)str); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDebugDumpString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_str); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlLsCountNode(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; int ret_val; xmlNodePtr node; /* the node to count */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlLsCountNode(node); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlLsCountNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlLsOneNode(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlNodePtr node; /* the node to dump */ int n_node; for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); output = gen_debug_FILE_ptr(n_output, 0); node = gen_xmlNodePtr(n_node, 1); xmlLsOneNode(output, node); call_tests++; des_debug_FILE_ptr(n_output, output, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlLsOneNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } #define gen_nb_char_ptr 1 static char * gen_char_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_char_ptr(int no ATTRIBUTE_UNUSED, char * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlShell(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlShellBase(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * arg; /* unused */ int n_arg; xmlNodePtr node; /* a node */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); arg = gen_char_ptr(n_arg, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellBase(ctxt, arg, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_arg, arg, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellBase", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_arg); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellCat(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * arg; /* unused */ int n_arg; xmlNodePtr node; /* a node */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); arg = gen_char_ptr(n_arg, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellCat(ctxt, arg, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_arg, arg, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellCat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_arg); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellDir(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * arg; /* unused */ int n_arg; xmlNodePtr node; /* a node */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); arg = gen_char_ptr(n_arg, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellDir(ctxt, arg, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_arg, arg, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellDir", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_arg); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellDu(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * arg; /* unused */ int n_arg; xmlNodePtr tree; /* a node defining a subtree */ int n_tree; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) { for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); arg = gen_char_ptr(n_arg, 1); tree = gen_xmlNodePtr(n_tree, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellDu(ctxt, arg, tree, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_arg, arg, 1); des_xmlNodePtr(n_tree, tree, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellDu", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_arg); printf(" %d", n_tree); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellList(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * arg; /* unused */ int n_arg; xmlNodePtr node; /* a node */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); arg = gen_char_ptr(n_arg, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellList(ctxt, arg, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_arg, arg, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_arg); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellLoad(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * filename; /* the file name */ int n_filename; xmlNodePtr node; /* unused */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_char_ptr;n_filename++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); filename = gen_char_ptr(n_filename, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellLoad(ctxt, filename, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_filename, filename, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellLoad", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_filename); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellPrintXPathResult(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr list; /* a valid result generated by an xpath evaluation */ int n_list; for (n_list = 0;n_list < gen_nb_xmlXPathObjectPtr;n_list++) { mem_base = xmlMemBlocks(); list = gen_xmlXPathObjectPtr(n_list, 0); xmlShellPrintXPathResult(list); call_tests++; des_xmlXPathObjectPtr(n_list, list, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellPrintXPathResult", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_list); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlShellPwd(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * buffer; /* the output buffer */ int n_buffer; xmlNodePtr node; /* a node */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); buffer = gen_char_ptr(n_buffer, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellPwd(ctxt, buffer, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_buffer, buffer, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellPwd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_buffer); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellSave(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * filename; /* the file name (optional) */ int n_filename; xmlNodePtr node; /* unused */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_char_ptr;n_filename++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); filename = gen_char_ptr(n_filename, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellSave(ctxt, filename, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_filename, filename, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellSave", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_filename); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellValidate(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * dtd; /* the DTD URI (optional) */ int n_dtd; xmlNodePtr node; /* unused */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_dtd = 0;n_dtd < gen_nb_char_ptr;n_dtd++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); dtd = gen_char_ptr(n_dtd, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellValidate(ctxt, dtd, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_dtd, dtd, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellValidate", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_dtd); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlShellWrite(void) { int test_ret = 0; #if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlShellCtxtPtr ctxt; /* the shell context */ int n_ctxt; char * filename; /* the file name */ int n_filename; xmlNodePtr node; /* a node in the tree */ int n_node; xmlNodePtr node2; /* unused */ int n_node2; for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_char_ptr;n_filename++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0); filename = gen_char_ptr(n_filename, 1); node = gen_xmlNodePtr(n_node, 2); node2 = gen_xmlNodePtr(n_node2, 3); ret_val = xmlShellWrite(ctxt, filename, node, node2); desret_int(ret_val); call_tests++; des_xmlShellCtxtPtr(n_ctxt, ctxt, 0); des_char_ptr(n_filename, filename, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr(n_node2, node2, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlShellWrite", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_filename); printf(" %d", n_node); printf(" %d", n_node2); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_debugXML(void) { int test_ret = 0; if (quiet == 0) printf("Testing debugXML : 25 of 28 functions ...\n"); test_ret += test_xmlBoolToText(); test_ret += test_xmlDebugCheckDocument(); test_ret += test_xmlDebugDumpAttr(); test_ret += test_xmlDebugDumpAttrList(); test_ret += test_xmlDebugDumpDTD(); test_ret += test_xmlDebugDumpDocument(); test_ret += test_xmlDebugDumpDocumentHead(); test_ret += test_xmlDebugDumpEntities(); test_ret += test_xmlDebugDumpNode(); test_ret += test_xmlDebugDumpNodeList(); test_ret += test_xmlDebugDumpOneNode(); test_ret += test_xmlDebugDumpString(); test_ret += test_xmlLsCountNode(); test_ret += test_xmlLsOneNode(); test_ret += test_xmlShell(); test_ret += test_xmlShellBase(); test_ret += test_xmlShellCat(); test_ret += test_xmlShellDir(); test_ret += test_xmlShellDu(); test_ret += test_xmlShellList(); test_ret += test_xmlShellLoad(); test_ret += test_xmlShellPrintXPathResult(); test_ret += test_xmlShellPwd(); test_ret += test_xmlShellSave(); test_ret += test_xmlShellValidate(); test_ret += test_xmlShellWrite(); if (test_ret != 0) printf("Module debugXML: %d errors\n", test_ret); return(test_ret); } static int test_xmlDictCleanup(void) { int test_ret = 0; int mem_base; mem_base = xmlMemBlocks(); xmlDictCleanup(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictCleanup", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlDictCreate(void) { int test_ret = 0; int mem_base; xmlDictPtr ret_val; mem_base = xmlMemBlocks(); ret_val = xmlDictCreate(); desret_xmlDictPtr(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictCreate", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlDictCreateSub(void) { int test_ret = 0; int mem_base; xmlDictPtr ret_val; xmlDictPtr sub; /* an existing dictionnary */ int n_sub; for (n_sub = 0;n_sub < gen_nb_xmlDictPtr;n_sub++) { mem_base = xmlMemBlocks(); sub = gen_xmlDictPtr(n_sub, 0); ret_val = xmlDictCreateSub(sub); desret_xmlDictPtr(ret_val); call_tests++; des_xmlDictPtr(n_sub, sub, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictCreateSub", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sub); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlDictExists(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlDictPtr dict; /* the dictionnary */ int n_dict; xmlChar * name; /* the name of the userdata */ int n_name; int len; /* the length of the name, if -1 it is recomputed */ int n_len; for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); dict = gen_xmlDictPtr(n_dict, 0); name = gen_const_xmlChar_ptr(n_name, 1); len = gen_int(n_len, 2); ret_val = xmlDictExists(dict, (const xmlChar *)name, len); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlDictPtr(n_dict, dict, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictExists", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dict); printf(" %d", n_name); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlDictGetUsage(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlDictLookup(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlDictPtr dict; /* the dictionnary */ int n_dict; xmlChar * name; /* the name of the userdata */ int n_name; int len; /* the length of the name, if -1 it is recomputed */ int n_len; for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); dict = gen_xmlDictPtr(n_dict, 0); name = gen_const_xmlChar_ptr(n_name, 1); len = gen_int(n_len, 2); ret_val = xmlDictLookup(dict, (const xmlChar *)name, len); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlDictPtr(n_dict, dict, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dict); printf(" %d", n_name); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlDictOwns(void) { int test_ret = 0; int mem_base; int ret_val; xmlDictPtr dict; /* the dictionnary */ int n_dict; xmlChar * str; /* the string */ int n_str; for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); dict = gen_xmlDictPtr(n_dict, 0); str = gen_const_xmlChar_ptr(n_str, 1); ret_val = xmlDictOwns(dict, (const xmlChar *)str); desret_int(ret_val); call_tests++; des_xmlDictPtr(n_dict, dict, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictOwns", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dict); printf(" %d", n_str); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlDictQLookup(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlDictPtr dict; /* the dictionnary */ int n_dict; xmlChar * prefix; /* the prefix */ int n_prefix; xmlChar * name; /* the name */ int n_name; for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); dict = gen_xmlDictPtr(n_dict, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); ret_val = xmlDictQLookup(dict, (const xmlChar *)prefix, (const xmlChar *)name); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlDictPtr(n_dict, dict, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictQLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dict); printf(" %d", n_prefix); printf(" %d", n_name); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlDictReference(void) { int test_ret = 0; int mem_base; int ret_val; xmlDictPtr dict; /* the dictionnary */ int n_dict; for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) { mem_base = xmlMemBlocks(); dict = gen_xmlDictPtr(n_dict, 0); ret_val = xmlDictReference(dict); xmlDictFree(dict); desret_int(ret_val); call_tests++; des_xmlDictPtr(n_dict, dict, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictReference", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dict); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlDictSetLimit(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlDictSize(void) { int test_ret = 0; int mem_base; int ret_val; xmlDictPtr dict; /* the dictionnary */ int n_dict; for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) { mem_base = xmlMemBlocks(); dict = gen_xmlDictPtr(n_dict, 0); ret_val = xmlDictSize(dict); desret_int(ret_val); call_tests++; des_xmlDictPtr(n_dict, dict, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDictSize", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dict); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlInitializeDict(void) { int test_ret = 0; int mem_base; int ret_val; mem_base = xmlMemBlocks(); ret_val = xmlInitializeDict(); desret_int(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlInitializeDict", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_dict(void) { int test_ret = 0; if (quiet == 0) printf("Testing dict : 10 of 13 functions ...\n"); test_ret += test_xmlDictCleanup(); test_ret += test_xmlDictCreate(); test_ret += test_xmlDictCreateSub(); test_ret += test_xmlDictExists(); test_ret += test_xmlDictGetUsage(); test_ret += test_xmlDictLookup(); test_ret += test_xmlDictOwns(); test_ret += test_xmlDictQLookup(); test_ret += test_xmlDictReference(); test_ret += test_xmlDictSetLimit(); test_ret += test_xmlDictSize(); test_ret += test_xmlInitializeDict(); if (test_ret != 0) printf("Module dict: %d errors\n", test_ret); return(test_ret); } static int test_UTF8Toisolat1(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) #ifdef LIBXML_OUTPUT_ENABLED int mem_base; int ret_val; unsigned char * out; /* a pointer to an array of bytes to store the result */ int n_out; int * outlen; /* the length of @out */ int n_outlen; unsigned char * in; /* a pointer to an array of UTF-8 chars */ int n_in; int * inlen; /* the length of @in */ int n_inlen; for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) { for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) { for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) { for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) { mem_base = xmlMemBlocks(); out = gen_unsigned_char_ptr(n_out, 0); outlen = gen_int_ptr(n_outlen, 1); in = gen_const_unsigned_char_ptr(n_in, 2); inlen = gen_int_ptr(n_inlen, 3); ret_val = UTF8Toisolat1(out, outlen, (const unsigned char *)in, inlen); desret_int(ret_val); call_tests++; des_unsigned_char_ptr(n_out, out, 0); des_int_ptr(n_outlen, outlen, 1); des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2); des_int_ptr(n_inlen, inlen, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in UTF8Toisolat1", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_outlen); printf(" %d", n_in); printf(" %d", n_inlen); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_isolat1ToUTF8(void) { int test_ret = 0; int mem_base; int ret_val; unsigned char * out; /* a pointer to an array of bytes to store the result */ int n_out; int * outlen; /* the length of @out */ int n_outlen; unsigned char * in; /* a pointer to an array of ISO Latin 1 chars */ int n_in; int * inlen; /* the length of @in */ int n_inlen; for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) { for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) { for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) { for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) { mem_base = xmlMemBlocks(); out = gen_unsigned_char_ptr(n_out, 0); outlen = gen_int_ptr(n_outlen, 1); in = gen_const_unsigned_char_ptr(n_in, 2); inlen = gen_int_ptr(n_inlen, 3); ret_val = isolat1ToUTF8(out, outlen, (const unsigned char *)in, inlen); desret_int(ret_val); call_tests++; des_unsigned_char_ptr(n_out, out, 0); des_int_ptr(n_outlen, outlen, 1); des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2); des_int_ptr(n_inlen, inlen, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in isolat1ToUTF8", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_outlen); printf(" %d", n_in); printf(" %d", n_inlen); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlAddEncodingAlias(void) { int test_ret = 0; int ret_val; char * name; /* the encoding name as parsed, in UTF-8 format (ASCII actually) */ int n_name; char * alias; /* the alias name as parsed, in UTF-8 format (ASCII actually) */ int n_alias; for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) { for (n_alias = 0;n_alias < gen_nb_const_char_ptr;n_alias++) { name = gen_const_char_ptr(n_name, 0); alias = gen_const_char_ptr(n_alias, 1); ret_val = xmlAddEncodingAlias((const char *)name, (const char *)alias); desret_int(ret_val); call_tests++; des_const_char_ptr(n_name, (const char *)name, 0); des_const_char_ptr(n_alias, (const char *)alias, 1); xmlResetLastError(); } } function_tests++; return(test_ret); } #define gen_nb_xmlCharEncodingHandler_ptr 1 static xmlCharEncodingHandler * gen_xmlCharEncodingHandler_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlCharEncodingHandler_ptr(int no ATTRIBUTE_UNUSED, xmlCharEncodingHandler * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlCharEncCloseFunc(void) { int test_ret = 0; int mem_base; int ret_val; xmlCharEncodingHandler * handler; /* char enconding transformation data structure */ int n_handler; for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) { mem_base = xmlMemBlocks(); handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0); ret_val = xmlCharEncCloseFunc(handler); desret_int(ret_val); call_tests++; des_xmlCharEncodingHandler_ptr(n_handler, handler, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCharEncCloseFunc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_handler); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCharEncFirstLine(void) { int test_ret = 0; int mem_base; int ret_val; xmlCharEncodingHandler * handler; /* char enconding transformation data structure */ int n_handler; xmlBufferPtr out; /* an xmlBuffer for the output. */ int n_out; xmlBufferPtr in; /* an xmlBuffer for the input */ int n_in; for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) { for (n_out = 0;n_out < gen_nb_xmlBufferPtr;n_out++) { for (n_in = 0;n_in < gen_nb_xmlBufferPtr;n_in++) { mem_base = xmlMemBlocks(); handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0); out = gen_xmlBufferPtr(n_out, 1); in = gen_xmlBufferPtr(n_in, 2); ret_val = xmlCharEncFirstLine(handler, out, in); desret_int(ret_val); call_tests++; des_xmlCharEncodingHandler_ptr(n_handler, handler, 0); des_xmlBufferPtr(n_out, out, 1); des_xmlBufferPtr(n_in, in, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCharEncFirstLine", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_handler); printf(" %d", n_out); printf(" %d", n_in); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlCharEncInFunc(void) { int test_ret = 0; int mem_base; int ret_val; xmlCharEncodingHandler * handler; /* char encoding transformation data structure */ int n_handler; xmlBufferPtr out; /* an xmlBuffer for the output. */ int n_out; xmlBufferPtr in; /* an xmlBuffer for the input */ int n_in; for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) { for (n_out = 0;n_out < gen_nb_xmlBufferPtr;n_out++) { for (n_in = 0;n_in < gen_nb_xmlBufferPtr;n_in++) { mem_base = xmlMemBlocks(); handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0); out = gen_xmlBufferPtr(n_out, 1); in = gen_xmlBufferPtr(n_in, 2); ret_val = xmlCharEncInFunc(handler, out, in); desret_int(ret_val); call_tests++; des_xmlCharEncodingHandler_ptr(n_handler, handler, 0); des_xmlBufferPtr(n_out, out, 1); des_xmlBufferPtr(n_in, in, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCharEncInFunc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_handler); printf(" %d", n_out); printf(" %d", n_in); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlCharEncOutFunc(void) { int test_ret = 0; int mem_base; int ret_val; xmlCharEncodingHandler * handler; /* char enconding transformation data structure */ int n_handler; xmlBufferPtr out; /* an xmlBuffer for the output. */ int n_out; xmlBufferPtr in; /* an xmlBuffer for the input */ int n_in; for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) { for (n_out = 0;n_out < gen_nb_xmlBufferPtr;n_out++) { for (n_in = 0;n_in < gen_nb_xmlBufferPtr;n_in++) { mem_base = xmlMemBlocks(); handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0); out = gen_xmlBufferPtr(n_out, 1); in = gen_xmlBufferPtr(n_in, 2); ret_val = xmlCharEncOutFunc(handler, out, in); desret_int(ret_val); call_tests++; des_xmlCharEncodingHandler_ptr(n_handler, handler, 0); des_xmlBufferPtr(n_out, out, 1); des_xmlBufferPtr(n_in, in, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCharEncOutFunc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_handler); printf(" %d", n_out); printf(" %d", n_in); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlCleanupCharEncodingHandlers(void) { int test_ret = 0; xmlCleanupCharEncodingHandlers(); call_tests++; xmlResetLastError(); function_tests++; return(test_ret); } static int test_xmlCleanupEncodingAliases(void) { int test_ret = 0; int mem_base; mem_base = xmlMemBlocks(); xmlCleanupEncodingAliases(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCleanupEncodingAliases", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlDelEncodingAlias(void) { int test_ret = 0; int mem_base; int ret_val; char * alias; /* the alias name as parsed, in UTF-8 format (ASCII actually) */ int n_alias; for (n_alias = 0;n_alias < gen_nb_const_char_ptr;n_alias++) { mem_base = xmlMemBlocks(); alias = gen_const_char_ptr(n_alias, 0); ret_val = xmlDelEncodingAlias((const char *)alias); desret_int(ret_val); call_tests++; des_const_char_ptr(n_alias, (const char *)alias, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDelEncodingAlias", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_alias); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlDetectCharEncoding(void) { int test_ret = 0; int mem_base; xmlCharEncoding ret_val; unsigned char * in; /* a pointer to the first bytes of the XML entity, must be at least 2 bytes long (at least 4 if encoding is UTF4 variant). */ int n_in; int len; /* pointer to the length of the buffer */ int n_len; for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); in = gen_const_unsigned_char_ptr(n_in, 0); len = gen_int(n_len, 1); ret_val = xmlDetectCharEncoding((const unsigned char *)in, len); desret_xmlCharEncoding(ret_val); call_tests++; des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDetectCharEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_in); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlFindCharEncodingHandler(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlGetCharEncodingHandler(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlGetCharEncodingName(void) { int test_ret = 0; int mem_base; const char * ret_val; xmlCharEncoding enc; /* the encoding */ int n_enc; for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); enc = gen_xmlCharEncoding(n_enc, 0); ret_val = xmlGetCharEncodingName(enc); desret_const_char_ptr(ret_val); call_tests++; des_xmlCharEncoding(n_enc, enc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetCharEncodingName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_enc); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlGetEncodingAlias(void) { int test_ret = 0; int mem_base; const char * ret_val; char * alias; /* the alias name as parsed, in UTF-8 format (ASCII actually) */ int n_alias; for (n_alias = 0;n_alias < gen_nb_const_char_ptr;n_alias++) { mem_base = xmlMemBlocks(); alias = gen_const_char_ptr(n_alias, 0); ret_val = xmlGetEncodingAlias((const char *)alias); desret_const_char_ptr(ret_val); call_tests++; des_const_char_ptr(n_alias, (const char *)alias, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetEncodingAlias", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_alias); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlInitCharEncodingHandlers(void) { int test_ret = 0; xmlInitCharEncodingHandlers(); call_tests++; xmlResetLastError(); function_tests++; return(test_ret); } static int test_xmlNewCharEncodingHandler(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParseCharEncoding(void) { int test_ret = 0; int mem_base; xmlCharEncoding ret_val; char * name; /* the encoding name as parsed, in UTF-8 format (ASCII actually) */ int n_name; for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) { mem_base = xmlMemBlocks(); name = gen_const_char_ptr(n_name, 0); ret_val = xmlParseCharEncoding((const char *)name); desret_xmlCharEncoding(ret_val); call_tests++; des_const_char_ptr(n_name, (const char *)name, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseCharEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf("\n"); } } function_tests++; return(test_ret); } #define gen_nb_xmlCharEncodingHandlerPtr 1 static xmlCharEncodingHandlerPtr gen_xmlCharEncodingHandlerPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlCharEncodingHandlerPtr(int no ATTRIBUTE_UNUSED, xmlCharEncodingHandlerPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlRegisterCharEncodingHandler(void) { int test_ret = 0; int mem_base; xmlCharEncodingHandlerPtr handler; /* the xmlCharEncodingHandlerPtr handler block */ int n_handler; for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandlerPtr;n_handler++) { mem_base = xmlMemBlocks(); handler = gen_xmlCharEncodingHandlerPtr(n_handler, 0); xmlRegisterCharEncodingHandler(handler); call_tests++; des_xmlCharEncodingHandlerPtr(n_handler, handler, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegisterCharEncodingHandler", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_handler); printf("\n"); } } function_tests++; return(test_ret); } static int test_encoding(void) { int test_ret = 0; if (quiet == 0) printf("Testing encoding : 16 of 19 functions ...\n"); test_ret += test_UTF8Toisolat1(); test_ret += test_isolat1ToUTF8(); test_ret += test_xmlAddEncodingAlias(); test_ret += test_xmlCharEncCloseFunc(); test_ret += test_xmlCharEncFirstLine(); test_ret += test_xmlCharEncInFunc(); test_ret += test_xmlCharEncOutFunc(); test_ret += test_xmlCleanupCharEncodingHandlers(); test_ret += test_xmlCleanupEncodingAliases(); test_ret += test_xmlDelEncodingAlias(); test_ret += test_xmlDetectCharEncoding(); test_ret += test_xmlFindCharEncodingHandler(); test_ret += test_xmlGetCharEncodingHandler(); test_ret += test_xmlGetCharEncodingName(); test_ret += test_xmlGetEncodingAlias(); test_ret += test_xmlInitCharEncodingHandlers(); test_ret += test_xmlNewCharEncodingHandler(); test_ret += test_xmlParseCharEncoding(); test_ret += test_xmlRegisterCharEncodingHandler(); if (test_ret != 0) printf("Module encoding: %d errors\n", test_ret); return(test_ret); } static int test_xmlAddDocEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the entity name */ int n_name; int type; /* the entity type XML_xxx_yyy_ENTITY */ int n_type; xmlChar * ExternalID; /* the entity external ID if available */ int n_ExternalID; xmlChar * SystemID; /* the entity system ID if available */ int n_SystemID; xmlChar * content; /* the entity content */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_int;n_type++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); type = gen_int(n_type, 2); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 3); SystemID = gen_const_xmlChar_ptr(n_SystemID, 4); content = gen_const_xmlChar_ptr(n_content, 5); ret_val = xmlAddDocEntity(doc, (const xmlChar *)name, type, (const xmlChar *)ExternalID, (const xmlChar *)SystemID, (const xmlChar *)content); desret_xmlEntityPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_int(n_type, type, 2); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 3); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 4); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddDocEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_type); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf(" %d", n_content); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_xmlAddDtdEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the entity name */ int n_name; int type; /* the entity type XML_xxx_yyy_ENTITY */ int n_type; xmlChar * ExternalID; /* the entity external ID if available */ int n_ExternalID; xmlChar * SystemID; /* the entity system ID if available */ int n_SystemID; xmlChar * content; /* the entity content */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_int;n_type++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); type = gen_int(n_type, 2); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 3); SystemID = gen_const_xmlChar_ptr(n_SystemID, 4); content = gen_const_xmlChar_ptr(n_content, 5); ret_val = xmlAddDtdEntity(doc, (const xmlChar *)name, type, (const xmlChar *)ExternalID, (const xmlChar *)SystemID, (const xmlChar *)content); desret_xmlEntityPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_int(n_type, type, 2); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 3); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 4); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddDtdEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_type); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf(" %d", n_content); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_xmlCleanupPredefinedEntities(void) { int test_ret = 0; #if defined(LIBXML_LEGACY_ENABLED) #ifdef LIBXML_LEGACY_ENABLED int mem_base; mem_base = xmlMemBlocks(); xmlCleanupPredefinedEntities(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCleanupPredefinedEntities", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif #endif return(test_ret); } #define gen_nb_xmlEntitiesTablePtr 1 static xmlEntitiesTablePtr gen_xmlEntitiesTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlEntitiesTablePtr(int no ATTRIBUTE_UNUSED, xmlEntitiesTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlCopyEntitiesTable(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlCreateEntitiesTable(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlDumpEntitiesTable(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* An XML buffer. */ int n_buf; xmlEntitiesTablePtr table; /* An entity table */ int n_table; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_table = 0;n_table < gen_nb_xmlEntitiesTablePtr;n_table++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); table = gen_xmlEntitiesTablePtr(n_table, 1); xmlDumpEntitiesTable(buf, table); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlEntitiesTablePtr(n_table, table, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpEntitiesTable", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_table); printf("\n"); } } } function_tests++; #endif return(test_ret); } #define gen_nb_xmlEntityPtr 1 static xmlEntityPtr gen_xmlEntityPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlEntityPtr(int no ATTRIBUTE_UNUSED, xmlEntityPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlDumpEntityDecl(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* An XML buffer. */ int n_buf; xmlEntityPtr ent; /* An entity table */ int n_ent; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_ent = 0;n_ent < gen_nb_xmlEntityPtr;n_ent++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); ent = gen_xmlEntityPtr(n_ent, 1); xmlDumpEntityDecl(buf, ent); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlEntityPtr(n_ent, ent, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpEntityDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_ent); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlEncodeEntitiesReentrant(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlDocPtr doc; /* the document containing the string */ int n_doc; xmlChar * input; /* A string to convert to XML. */ int n_input; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_input = 0;n_input < gen_nb_const_xmlChar_ptr;n_input++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); input = gen_const_xmlChar_ptr(n_input, 1); ret_val = xmlEncodeEntitiesReentrant(doc, (const xmlChar *)input); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_input, (const xmlChar *)input, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlEncodeEntitiesReentrant", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_input); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlEncodeSpecialChars(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlDocPtr doc; /* the document containing the string */ int n_doc; xmlChar * input; /* A string to convert to XML. */ int n_input; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_input = 0;n_input < gen_nb_const_xmlChar_ptr;n_input++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); input = gen_const_xmlChar_ptr(n_input, 1); ret_val = xmlEncodeSpecialChars(doc, (const xmlChar *)input); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_input, (const xmlChar *)input, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlEncodeSpecialChars", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_input); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetDocEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; xmlDocPtr doc; /* the document referencing the entity */ int n_doc; xmlChar * name; /* the entity name */ int n_name; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlGetDocEntity(doc, (const xmlChar *)name); desret_xmlEntityPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetDocEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetDtdEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; xmlDocPtr doc; /* the document referencing the entity */ int n_doc; xmlChar * name; /* the entity name */ int n_name; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlGetDtdEntity(doc, (const xmlChar *)name); desret_xmlEntityPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetDtdEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetParameterEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; xmlDocPtr doc; /* the document referencing the entity */ int n_doc; xmlChar * name; /* the entity name */ int n_name; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlGetParameterEntity(doc, (const xmlChar *)name); desret_xmlEntityPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetParameterEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetPredefinedEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; xmlChar * name; /* the entity name */ int n_name; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); ret_val = xmlGetPredefinedEntity((const xmlChar *)name); desret_xmlEntityPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetPredefinedEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlInitializePredefinedEntities(void) { int test_ret = 0; #if defined(LIBXML_LEGACY_ENABLED) #ifdef LIBXML_LEGACY_ENABLED int mem_base; mem_base = xmlMemBlocks(); xmlInitializePredefinedEntities(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlInitializePredefinedEntities", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif #endif return(test_ret); } static int test_xmlNewEntity(void) { int test_ret = 0; int mem_base; xmlEntityPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the entity name */ int n_name; int type; /* the entity type XML_xxx_yyy_ENTITY */ int n_type; xmlChar * ExternalID; /* the entity external ID if available */ int n_ExternalID; xmlChar * SystemID; /* the entity system ID if available */ int n_SystemID; xmlChar * content; /* the entity content */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_int;n_type++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); type = gen_int(n_type, 2); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 3); SystemID = gen_const_xmlChar_ptr(n_SystemID, 4); content = gen_const_xmlChar_ptr(n_content, 5); ret_val = xmlNewEntity(doc, (const xmlChar *)name, type, (const xmlChar *)ExternalID, (const xmlChar *)SystemID, (const xmlChar *)content); desret_xmlEntityPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_int(n_type, type, 2); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 3); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 4); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_type); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf(" %d", n_content); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_entities(void) { int test_ret = 0; if (quiet == 0) printf("Testing entities : 13 of 17 functions ...\n"); test_ret += test_xmlAddDocEntity(); test_ret += test_xmlAddDtdEntity(); test_ret += test_xmlCleanupPredefinedEntities(); test_ret += test_xmlCopyEntitiesTable(); test_ret += test_xmlCreateEntitiesTable(); test_ret += test_xmlDumpEntitiesTable(); test_ret += test_xmlDumpEntityDecl(); test_ret += test_xmlEncodeEntitiesReentrant(); test_ret += test_xmlEncodeSpecialChars(); test_ret += test_xmlGetDocEntity(); test_ret += test_xmlGetDtdEntity(); test_ret += test_xmlGetParameterEntity(); test_ret += test_xmlGetPredefinedEntity(); test_ret += test_xmlInitializePredefinedEntities(); test_ret += test_xmlNewEntity(); if (test_ret != 0) printf("Module entities: %d errors\n", test_ret); return(test_ret); } static int test_xmlHashAddEntry(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; void * userdata; /* a pointer to the userdata */ int n_userdata; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); userdata = gen_userdata(n_userdata, 2); ret_val = xmlHashAddEntry(table, (const xmlChar *)name, userdata); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_userdata(n_userdata, userdata, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashAddEntry", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_userdata); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlHashAddEntry2(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; void * userdata; /* a pointer to the userdata */ int n_userdata; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); userdata = gen_userdata(n_userdata, 3); ret_val = xmlHashAddEntry2(table, (const xmlChar *)name, (const xmlChar *)name2, userdata); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); des_userdata(n_userdata, userdata, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashAddEntry2", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf(" %d", n_userdata); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlHashAddEntry3(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; xmlChar * name3; /* a third name of the userdata */ int n_name3; void * userdata; /* a pointer to the userdata */ int n_userdata; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) { for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); name3 = gen_const_xmlChar_ptr(n_name3, 3); userdata = gen_userdata(n_userdata, 4); ret_val = xmlHashAddEntry3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3, userdata); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3); des_userdata(n_userdata, userdata, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashAddEntry3", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf(" %d", n_name3); printf(" %d", n_userdata); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlHashCopy(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlHashCreate(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlHashCreateDict(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlHashLookup(void) { int test_ret = 0; int mem_base; void * ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlHashLookup(table, (const xmlChar *)name); desret_void_ptr(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlHashLookup2(void) { int test_ret = 0; int mem_base; void * ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); ret_val = xmlHashLookup2(table, (const xmlChar *)name, (const xmlChar *)name2); desret_void_ptr(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashLookup2", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlHashLookup3(void) { int test_ret = 0; int mem_base; void * ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; xmlChar * name3; /* a third name of the userdata */ int n_name3; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); name3 = gen_const_xmlChar_ptr(n_name3, 3); ret_val = xmlHashLookup3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3); desret_void_ptr(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashLookup3", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf(" %d", n_name3); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlHashQLookup(void) { int test_ret = 0; int mem_base; void * ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * prefix; /* the prefix of the userdata */ int n_prefix; xmlChar * name; /* the name of the userdata */ int n_name; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); ret_val = xmlHashQLookup(table, (const xmlChar *)prefix, (const xmlChar *)name); desret_void_ptr(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashQLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_prefix); printf(" %d", n_name); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlHashQLookup2(void) { int test_ret = 0; int mem_base; void * ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * prefix; /* the prefix of the userdata */ int n_prefix; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * prefix2; /* the second prefix of the userdata */ int n_prefix2; xmlChar * name2; /* a second name of the userdata */ int n_name2; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_prefix2 = 0;n_prefix2 < gen_nb_const_xmlChar_ptr;n_prefix2++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); prefix2 = gen_const_xmlChar_ptr(n_prefix2, 3); name2 = gen_const_xmlChar_ptr(n_name2, 4); ret_val = xmlHashQLookup2(table, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)prefix2, (const xmlChar *)name2); desret_void_ptr(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_prefix2, (const xmlChar *)prefix2, 3); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashQLookup2", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_prefix); printf(" %d", n_name); printf(" %d", n_prefix2); printf(" %d", n_name2); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlHashQLookup3(void) { int test_ret = 0; int mem_base; void * ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * prefix; /* the prefix of the userdata */ int n_prefix; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * prefix2; /* the second prefix of the userdata */ int n_prefix2; xmlChar * name2; /* a second name of the userdata */ int n_name2; xmlChar * prefix3; /* the third prefix of the userdata */ int n_prefix3; xmlChar * name3; /* a third name of the userdata */ int n_name3; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_prefix2 = 0;n_prefix2 < gen_nb_const_xmlChar_ptr;n_prefix2++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_prefix3 = 0;n_prefix3 < gen_nb_const_xmlChar_ptr;n_prefix3++) { for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); prefix2 = gen_const_xmlChar_ptr(n_prefix2, 3); name2 = gen_const_xmlChar_ptr(n_name2, 4); prefix3 = gen_const_xmlChar_ptr(n_prefix3, 5); name3 = gen_const_xmlChar_ptr(n_name3, 6); ret_val = xmlHashQLookup3(table, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)prefix2, (const xmlChar *)name2, (const xmlChar *)prefix3, (const xmlChar *)name3); desret_void_ptr(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_prefix2, (const xmlChar *)prefix2, 3); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 4); des_const_xmlChar_ptr(n_prefix3, (const xmlChar *)prefix3, 5); des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 6); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashQLookup3", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_prefix); printf(" %d", n_name); printf(" %d", n_prefix2); printf(" %d", n_name2); printf(" %d", n_prefix3); printf(" %d", n_name3); printf("\n"); } } } } } } } } function_tests++; return(test_ret); } static int test_xmlHashRemoveEntry(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlHashDeallocator f; /* the deallocator function for removed item (if any) */ int n_f; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); f = gen_xmlHashDeallocator(n_f, 2); ret_val = xmlHashRemoveEntry(table, (const xmlChar *)name, f); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_xmlHashDeallocator(n_f, f, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashRemoveEntry", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_f); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlHashRemoveEntry2(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; xmlHashDeallocator f; /* the deallocator function for removed item (if any) */ int n_f; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); f = gen_xmlHashDeallocator(n_f, 3); ret_val = xmlHashRemoveEntry2(table, (const xmlChar *)name, (const xmlChar *)name2, f); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); des_xmlHashDeallocator(n_f, f, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashRemoveEntry2", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf(" %d", n_f); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlHashRemoveEntry3(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; xmlChar * name3; /* a third name of the userdata */ int n_name3; xmlHashDeallocator f; /* the deallocator function for removed item (if any) */ int n_f; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) { for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); name3 = gen_const_xmlChar_ptr(n_name3, 3); f = gen_xmlHashDeallocator(n_f, 4); ret_val = xmlHashRemoveEntry3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3, f); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3); des_xmlHashDeallocator(n_f, f, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashRemoveEntry3", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf(" %d", n_name3); printf(" %d", n_f); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlHashScan(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlHashScan3(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlHashScanFull(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlHashScanFull3(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlHashSize(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); ret_val = xmlHashSize(table); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashSize", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlHashUpdateEntry(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; void * userdata; /* a pointer to the userdata */ int n_userdata; xmlHashDeallocator f; /* the deallocator function for replaced item (if any) */ int n_f; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) { for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); userdata = gen_userdata(n_userdata, 2); f = gen_xmlHashDeallocator(n_f, 3); ret_val = xmlHashUpdateEntry(table, (const xmlChar *)name, userdata, f); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_userdata(n_userdata, userdata, 2); des_xmlHashDeallocator(n_f, f, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashUpdateEntry", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_userdata); printf(" %d", n_f); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlHashUpdateEntry2(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; void * userdata; /* a pointer to the userdata */ int n_userdata; xmlHashDeallocator f; /* the deallocator function for replaced item (if any) */ int n_f; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) { for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); userdata = gen_userdata(n_userdata, 3); f = gen_xmlHashDeallocator(n_f, 4); ret_val = xmlHashUpdateEntry2(table, (const xmlChar *)name, (const xmlChar *)name2, userdata, f); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); des_userdata(n_userdata, userdata, 3); des_xmlHashDeallocator(n_f, f, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashUpdateEntry2", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf(" %d", n_userdata); printf(" %d", n_f); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlHashUpdateEntry3(void) { int test_ret = 0; int mem_base; int ret_val; xmlHashTablePtr table; /* the hash table */ int n_table; xmlChar * name; /* the name of the userdata */ int n_name; xmlChar * name2; /* a second name of the userdata */ int n_name2; xmlChar * name3; /* a third name of the userdata */ int n_name3; void * userdata; /* a pointer to the userdata */ int n_userdata; xmlHashDeallocator f; /* the deallocator function for replaced item (if any) */ int n_f; for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) { for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) { for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) { for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) { mem_base = xmlMemBlocks(); table = gen_xmlHashTablePtr(n_table, 0); name = gen_const_xmlChar_ptr(n_name, 1); name2 = gen_const_xmlChar_ptr(n_name2, 2); name3 = gen_const_xmlChar_ptr(n_name3, 3); userdata = gen_userdata(n_userdata, 4); f = gen_xmlHashDeallocator(n_f, 5); ret_val = xmlHashUpdateEntry3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3, userdata, f); desret_int(ret_val); call_tests++; des_xmlHashTablePtr(n_table, table, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2); des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3); des_userdata(n_userdata, userdata, 4); des_xmlHashDeallocator(n_f, f, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHashUpdateEntry3", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_table); printf(" %d", n_name); printf(" %d", n_name2); printf(" %d", n_name3); printf(" %d", n_userdata); printf(" %d", n_f); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_hash(void) { int test_ret = 0; if (quiet == 0) printf("Testing hash : 16 of 24 functions ...\n"); test_ret += test_xmlHashAddEntry(); test_ret += test_xmlHashAddEntry2(); test_ret += test_xmlHashAddEntry3(); test_ret += test_xmlHashCopy(); test_ret += test_xmlHashCreate(); test_ret += test_xmlHashCreateDict(); test_ret += test_xmlHashLookup(); test_ret += test_xmlHashLookup2(); test_ret += test_xmlHashLookup3(); test_ret += test_xmlHashQLookup(); test_ret += test_xmlHashQLookup2(); test_ret += test_xmlHashQLookup3(); test_ret += test_xmlHashRemoveEntry(); test_ret += test_xmlHashRemoveEntry2(); test_ret += test_xmlHashRemoveEntry3(); test_ret += test_xmlHashScan(); test_ret += test_xmlHashScan3(); test_ret += test_xmlHashScanFull(); test_ret += test_xmlHashScanFull3(); test_ret += test_xmlHashSize(); test_ret += test_xmlHashUpdateEntry(); test_ret += test_xmlHashUpdateEntry2(); test_ret += test_xmlHashUpdateEntry3(); if (test_ret != 0) printf("Module hash: %d errors\n", test_ret); return(test_ret); } #define gen_nb_xmlLinkPtr 1 static xmlLinkPtr gen_xmlLinkPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlLinkPtr(int no ATTRIBUTE_UNUSED, xmlLinkPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlLinkGetData(void) { int test_ret = 0; int mem_base; void * ret_val; xmlLinkPtr lk; /* a link */ int n_lk; for (n_lk = 0;n_lk < gen_nb_xmlLinkPtr;n_lk++) { mem_base = xmlMemBlocks(); lk = gen_xmlLinkPtr(n_lk, 0); ret_val = xmlLinkGetData(lk); desret_void_ptr(ret_val); call_tests++; des_xmlLinkPtr(n_lk, lk, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlLinkGetData", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_lk); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlListAppend(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* the data */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListAppend(l, data); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListAppend", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListClear(void) { int test_ret = 0; int mem_base; xmlListPtr l; /* a list */ int n_l; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); xmlListClear(l); call_tests++; des_xmlListPtr(n_l, l, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListClear", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf("\n"); } } function_tests++; return(test_ret); } #define gen_nb_const_xmlListPtr 1 static xmlListPtr gen_const_xmlListPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlListPtr(int no ATTRIBUTE_UNUSED, const xmlListPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlListCopy(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr cur; /* the new list */ int n_cur; xmlListPtr old; /* the old list */ int n_old; for (n_cur = 0;n_cur < gen_nb_xmlListPtr;n_cur++) { for (n_old = 0;n_old < gen_nb_const_xmlListPtr;n_old++) { mem_base = xmlMemBlocks(); cur = gen_xmlListPtr(n_cur, 0); old = gen_const_xmlListPtr(n_old, 1); ret_val = xmlListCopy(cur, (const xmlListPtr)old); desret_int(ret_val); call_tests++; des_xmlListPtr(n_cur, cur, 0); des_const_xmlListPtr(n_old, (const xmlListPtr)old, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListCopy", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_old); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListCreate(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlListDup(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlListEmpty(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); ret_val = xmlListEmpty(l); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListEmpty", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlListEnd(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlListFront(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlListInsert(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* the data */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListInsert(l, data); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListInsert", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListMerge(void) { int test_ret = 0; int mem_base; xmlListPtr l1; /* the original list */ int n_l1; xmlListPtr l2; /* the new list */ int n_l2; for (n_l1 = 0;n_l1 < gen_nb_xmlListPtr;n_l1++) { for (n_l2 = 0;n_l2 < gen_nb_xmlListPtr;n_l2++) { mem_base = xmlMemBlocks(); l1 = gen_xmlListPtr(n_l1, 0); l2 = gen_xmlListPtr(n_l2, 1); xmlListMerge(l1, l2); call_tests++; des_xmlListPtr(n_l1, l1, 0); des_xmlListPtr(n_l2, l2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListMerge", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l1); printf(" %d", n_l2); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListPopBack(void) { int test_ret = 0; int mem_base; xmlListPtr l; /* a list */ int n_l; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); xmlListPopBack(l); call_tests++; des_xmlListPtr(n_l, l, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListPopBack", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlListPopFront(void) { int test_ret = 0; int mem_base; xmlListPtr l; /* a list */ int n_l; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); xmlListPopFront(l); call_tests++; des_xmlListPtr(n_l, l, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListPopFront", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlListPushBack(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* new data */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListPushBack(l, data); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListPushBack", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListPushFront(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* new data */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListPushFront(l, data); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListPushFront", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListRemoveAll(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* list data */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListRemoveAll(l, data); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListRemoveAll", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListRemoveFirst(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* list data */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListRemoveFirst(l, data); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListRemoveFirst", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListRemoveLast(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* list data */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListRemoveLast(l, data); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListRemoveLast", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListReverse(void) { int test_ret = 0; int mem_base; xmlListPtr l; /* a list */ int n_l; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); xmlListReverse(l); call_tests++; des_xmlListPtr(n_l, l, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListReverse", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlListReverseSearch(void) { int test_ret = 0; int mem_base; void * ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* a search value */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListReverseSearch(l, data); desret_void_ptr(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListReverseSearch", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListReverseWalk(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlListSearch(void) { int test_ret = 0; int mem_base; void * ret_val; xmlListPtr l; /* a list */ int n_l; void * data; /* a search value */ int n_data; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); data = gen_userdata(n_data, 1); ret_val = xmlListSearch(l, data); desret_void_ptr(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); des_userdata(n_data, data, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListSearch", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf(" %d", n_data); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlListSize(void) { int test_ret = 0; int mem_base; int ret_val; xmlListPtr l; /* a list */ int n_l; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); ret_val = xmlListSize(l); desret_int(ret_val); call_tests++; des_xmlListPtr(n_l, l, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListSize", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlListSort(void) { int test_ret = 0; int mem_base; xmlListPtr l; /* a list */ int n_l; for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) { mem_base = xmlMemBlocks(); l = gen_xmlListPtr(n_l, 0); xmlListSort(l); call_tests++; des_xmlListPtr(n_l, l, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlListSort", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_l); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlListWalk(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_list(void) { int test_ret = 0; if (quiet == 0) printf("Testing list : 19 of 26 functions ...\n"); test_ret += test_xmlLinkGetData(); test_ret += test_xmlListAppend(); test_ret += test_xmlListClear(); test_ret += test_xmlListCopy(); test_ret += test_xmlListCreate(); test_ret += test_xmlListDup(); test_ret += test_xmlListEmpty(); test_ret += test_xmlListEnd(); test_ret += test_xmlListFront(); test_ret += test_xmlListInsert(); test_ret += test_xmlListMerge(); test_ret += test_xmlListPopBack(); test_ret += test_xmlListPopFront(); test_ret += test_xmlListPushBack(); test_ret += test_xmlListPushFront(); test_ret += test_xmlListRemoveAll(); test_ret += test_xmlListRemoveFirst(); test_ret += test_xmlListRemoveLast(); test_ret += test_xmlListReverse(); test_ret += test_xmlListReverseSearch(); test_ret += test_xmlListReverseWalk(); test_ret += test_xmlListSearch(); test_ret += test_xmlListSize(); test_ret += test_xmlListSort(); test_ret += test_xmlListWalk(); if (test_ret != 0) printf("Module list: %d errors\n", test_ret); return(test_ret); } static int test_xmlNanoFTPCheckResponse(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* an FTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoFTPCheckResponse(ctx); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPCheckResponse", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPCleanup(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlNanoFTPCleanup(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPCleanup", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPCloseConnection(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* an FTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoFTPCloseConnection(ctx); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPCloseConnection", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPCwd(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* an FTP context */ int n_ctx; char * directory; /* a directory on the server */ int n_directory; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { for (n_directory = 0;n_directory < gen_nb_const_char_ptr;n_directory++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); directory = gen_const_char_ptr(n_directory, 1); ret_val = xmlNanoFTPCwd(ctx, (const char *)directory); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); des_const_char_ptr(n_directory, (const char *)directory, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPCwd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_directory); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPDele(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* an FTP context */ int n_ctx; const char * file; /* a file or directory on the server */ int n_file; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { for (n_file = 0;n_file < gen_nb_filepath;n_file++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); file = gen_filepath(n_file, 1); ret_val = xmlNanoFTPDele(ctx, file); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); des_filepath(n_file, file, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPDele", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_file); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPGet(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlNanoFTPGetConnection(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlNanoFTPGetResponse(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* an FTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoFTPGetResponse(ctx); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPGetResponse", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPGetSocket(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlNanoFTPInit(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlNanoFTPInit(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPInit", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPList(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlNanoFTPNewCtxt(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; void * ret_val; const char * URL; /* The URL used to initialize the context */ int n_URL; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { mem_base = xmlMemBlocks(); URL = gen_filepath(n_URL, 0); ret_val = xmlNanoFTPNewCtxt(URL); desret_xmlNanoFTPCtxtPtr(ret_val); call_tests++; des_filepath(n_URL, URL, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPNewCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPOpen(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; void * ret_val; const char * URL; /* the URL to the resource */ int n_URL; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { mem_base = xmlMemBlocks(); URL = gen_filepath(n_URL, 0); ret_val = xmlNanoFTPOpen(URL); desret_xmlNanoFTPCtxtPtr(ret_val); call_tests++; des_filepath(n_URL, URL, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPOpen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPProxy(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) char * host; /* the proxy host name */ int n_host; int port; /* the proxy port */ int n_port; char * user; /* the proxy user name */ int n_user; char * passwd; /* the proxy password */ int n_passwd; int type; /* the type of proxy 1 for using SITE, 2 for USER a@b */ int n_type; for (n_host = 0;n_host < gen_nb_const_char_ptr;n_host++) { for (n_port = 0;n_port < gen_nb_int;n_port++) { for (n_user = 0;n_user < gen_nb_const_char_ptr;n_user++) { for (n_passwd = 0;n_passwd < gen_nb_const_char_ptr;n_passwd++) { for (n_type = 0;n_type < gen_nb_int;n_type++) { host = gen_const_char_ptr(n_host, 0); port = gen_int(n_port, 1); user = gen_const_char_ptr(n_user, 2); passwd = gen_const_char_ptr(n_passwd, 3); type = gen_int(n_type, 4); xmlNanoFTPProxy((const char *)host, port, (const char *)user, (const char *)passwd, type); call_tests++; des_const_char_ptr(n_host, (const char *)host, 0); des_int(n_port, port, 1); des_const_char_ptr(n_user, (const char *)user, 2); des_const_char_ptr(n_passwd, (const char *)passwd, 3); des_int(n_type, type, 4); xmlResetLastError(); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPQuit(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* an FTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoFTPQuit(ctx); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPQuit", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPRead(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* the FTP context */ int n_ctx; void * dest; /* a buffer */ int n_dest; int len; /* the buffer length */ int n_len; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { for (n_dest = 0;n_dest < gen_nb_void_ptr;n_dest++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); dest = gen_void_ptr(n_dest, 1); len = gen_int(n_len, 2); ret_val = xmlNanoFTPRead(ctx, dest, len); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); des_void_ptr(n_dest, dest, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_dest); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPScanProxy(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) const char * URL; /* The proxy URL used to initialize the proxy context */ int n_URL; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { URL = gen_filepath(n_URL, 0); xmlNanoFTPScanProxy(URL); call_tests++; des_filepath(n_URL, URL, 0); xmlResetLastError(); } function_tests++; #endif return(test_ret); } static int test_xmlNanoFTPUpdateURL(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * ctx; /* an FTP context */ int n_ctx; const char * URL; /* The URL used to update the context */ int n_URL; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); URL = gen_filepath(n_URL, 1); ret_val = xmlNanoFTPUpdateURL(ctx, URL); desret_int(ret_val); call_tests++; des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); des_filepath(n_URL, URL, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoFTPUpdateURL", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_URL); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_nanoftp(void) { int test_ret = 0; if (quiet == 0) printf("Testing nanoftp : 14 of 22 functions ...\n"); test_ret += test_xmlNanoFTPCheckResponse(); test_ret += test_xmlNanoFTPCleanup(); test_ret += test_xmlNanoFTPCloseConnection(); test_ret += test_xmlNanoFTPCwd(); test_ret += test_xmlNanoFTPDele(); test_ret += test_xmlNanoFTPGet(); test_ret += test_xmlNanoFTPGetConnection(); test_ret += test_xmlNanoFTPGetResponse(); test_ret += test_xmlNanoFTPGetSocket(); test_ret += test_xmlNanoFTPInit(); test_ret += test_xmlNanoFTPList(); test_ret += test_xmlNanoFTPNewCtxt(); test_ret += test_xmlNanoFTPOpen(); test_ret += test_xmlNanoFTPProxy(); test_ret += test_xmlNanoFTPQuit(); test_ret += test_xmlNanoFTPRead(); test_ret += test_xmlNanoFTPScanProxy(); test_ret += test_xmlNanoFTPUpdateURL(); if (test_ret != 0) printf("Module nanoftp: %d errors\n", test_ret); return(test_ret); } static int test_xmlNanoHTTPAuthHeader(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; const char * ret_val; void * ctx; /* the HTTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoHTTPAuthHeader(ctx); desret_const_char_ptr(ret_val); call_tests++; des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPAuthHeader", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPCleanup(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlNanoHTTPCleanup(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPCleanup", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPContentLength(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; int ret_val; void * ctx; /* the HTTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoHTTPContentLength(ctx); desret_int(ret_val); call_tests++; des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPContentLength", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPEncoding(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; const char * ret_val; void * ctx; /* the HTTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoHTTPEncoding(ctx); desret_const_char_ptr(ret_val); call_tests++; des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } #define gen_nb_char_ptr_ptr 1 static char ** gen_char_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_char_ptr_ptr(int no ATTRIBUTE_UNUSED, char ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlNanoHTTPFetch(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; int ret_val; const char * URL; /* The URL to load */ int n_URL; const char * filename; /* the filename where the content should be saved */ int n_filename; char ** contentType; /* if available the Content-Type information will be returned at that location */ int n_contentType; for (n_URL = 0;n_URL < gen_nb_fileoutput;n_URL++) { for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_contentType = 0;n_contentType < gen_nb_char_ptr_ptr;n_contentType++) { mem_base = xmlMemBlocks(); URL = gen_fileoutput(n_URL, 0); filename = gen_fileoutput(n_filename, 1); contentType = gen_char_ptr_ptr(n_contentType, 2); ret_val = xmlNanoHTTPFetch(URL, filename, contentType); desret_int(ret_val); call_tests++; des_fileoutput(n_URL, URL, 0); des_fileoutput(n_filename, filename, 1); des_char_ptr_ptr(n_contentType, contentType, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPFetch", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf(" %d", n_filename); printf(" %d", n_contentType); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPInit(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlNanoHTTPInit(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPInit", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPMimeType(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; const char * ret_val; void * ctx; /* the HTTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoHTTPMimeType(ctx); desret_const_char_ptr(ret_val); call_tests++; des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPMimeType", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPOpen(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; void * ret_val; const char * URL; /* The URL to load */ int n_URL; char ** contentType; /* if available the Content-Type information will be returned at that location */ int n_contentType; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_contentType = 0;n_contentType < gen_nb_char_ptr_ptr;n_contentType++) { mem_base = xmlMemBlocks(); URL = gen_filepath(n_URL, 0); contentType = gen_char_ptr_ptr(n_contentType, 1); ret_val = xmlNanoHTTPOpen(URL, contentType); desret_xmlNanoHTTPCtxtPtr(ret_val); call_tests++; des_filepath(n_URL, URL, 0); des_char_ptr_ptr(n_contentType, contentType, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPOpen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf(" %d", n_contentType); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPOpenRedir(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; void * ret_val; const char * URL; /* The URL to load */ int n_URL; char ** contentType; /* if available the Content-Type information will be returned at that location */ int n_contentType; char ** redir; /* if available the redirected URL will be returned */ int n_redir; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_contentType = 0;n_contentType < gen_nb_char_ptr_ptr;n_contentType++) { for (n_redir = 0;n_redir < gen_nb_char_ptr_ptr;n_redir++) { mem_base = xmlMemBlocks(); URL = gen_filepath(n_URL, 0); contentType = gen_char_ptr_ptr(n_contentType, 1); redir = gen_char_ptr_ptr(n_redir, 2); ret_val = xmlNanoHTTPOpenRedir(URL, contentType, redir); desret_xmlNanoHTTPCtxtPtr(ret_val); call_tests++; des_filepath(n_URL, URL, 0); des_char_ptr_ptr(n_contentType, contentType, 1); des_char_ptr_ptr(n_redir, redir, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPOpenRedir", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf(" %d", n_contentType); printf(" %d", n_redir); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPRead(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; int ret_val; void * ctx; /* the HTTP context */ int n_ctx; void * dest; /* a buffer */ int n_dest; int len; /* the buffer length */ int n_len; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) { for (n_dest = 0;n_dest < gen_nb_void_ptr;n_dest++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0); dest = gen_void_ptr(n_dest, 1); len = gen_int(n_len, 2); ret_val = xmlNanoHTTPRead(ctx, dest, len); desret_int(ret_val); call_tests++; des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0); des_void_ptr(n_dest, dest, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_dest); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPRedir(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlNanoHTTPReturnCode(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; int ret_val; void * ctx; /* the HTTP context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0); ret_val = xmlNanoHTTPReturnCode(ctx); desret_int(ret_val); call_tests++; des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPReturnCode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPSave(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; void * ctxt; /* the HTTP context */ int n_ctxt; const char * filename; /* the filename where the content should be saved */ int n_filename; for (n_ctxt = 0;n_ctxt < gen_nb_void_ptr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { mem_base = xmlMemBlocks(); ctxt = gen_void_ptr(n_ctxt, 0); filename = gen_fileoutput(n_filename, 1); ret_val = xmlNanoHTTPSave(ctxt, filename); desret_int(ret_val); call_tests++; des_void_ptr(n_ctxt, ctxt, 0); des_fileoutput(n_filename, filename, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNanoHTTPSave", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_filename); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNanoHTTPScanProxy(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) const char * URL; /* The proxy URL used to initialize the proxy context */ int n_URL; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { URL = gen_filepath(n_URL, 0); xmlNanoHTTPScanProxy(URL); call_tests++; des_filepath(n_URL, URL, 0); xmlResetLastError(); } function_tests++; #endif return(test_ret); } static int test_nanohttp(void) { int test_ret = 0; if (quiet == 0) printf("Testing nanohttp : 13 of 17 functions ...\n"); test_ret += test_xmlNanoHTTPAuthHeader(); test_ret += test_xmlNanoHTTPCleanup(); test_ret += test_xmlNanoHTTPContentLength(); test_ret += test_xmlNanoHTTPEncoding(); test_ret += test_xmlNanoHTTPFetch(); test_ret += test_xmlNanoHTTPInit(); test_ret += test_xmlNanoHTTPMimeType(); test_ret += test_xmlNanoHTTPOpen(); test_ret += test_xmlNanoHTTPOpenRedir(); test_ret += test_xmlNanoHTTPRead(); test_ret += test_xmlNanoHTTPRedir(); test_ret += test_xmlNanoHTTPReturnCode(); test_ret += test_xmlNanoHTTPSave(); test_ret += test_xmlNanoHTTPScanProxy(); if (test_ret != 0) printf("Module nanohttp: %d errors\n", test_ret); return(test_ret); } static int test_xmlByteConsumed(void) { int test_ret = 0; int mem_base; long ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = xmlByteConsumed(ctxt); desret_long(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlByteConsumed", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlClearNodeInfoSeq(void) { int test_ret = 0; int mem_base; xmlParserNodeInfoSeqPtr seq; /* a node info sequence pointer */ int n_seq; for (n_seq = 0;n_seq < gen_nb_xmlParserNodeInfoSeqPtr;n_seq++) { mem_base = xmlMemBlocks(); seq = gen_xmlParserNodeInfoSeqPtr(n_seq, 0); xmlClearNodeInfoSeq(seq); call_tests++; des_xmlParserNodeInfoSeqPtr(n_seq, seq, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlClearNodeInfoSeq", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_seq); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlClearParserCtxt(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); xmlClearParserCtxt(ctxt); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlClearParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCreateDocParserCtxt(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ret_val; xmlChar * cur; /* a pointer to an array of xmlChar */ int n_cur; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); ret_val = xmlCreateDocParserCtxt((const xmlChar *)cur); desret_xmlParserCtxtPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCreateDocParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCreatePushParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_PUSH_ENABLED) int mem_base; xmlParserCtxtPtr ret_val; xmlSAXHandlerPtr sax; /* a SAX handler */ int n_sax; void * user_data; /* The user data returned on SAX callbacks */ int n_user_data; char * chunk; /* a pointer to an array of chars */ int n_chunk; int size; /* number of chars in the array */ int n_size; const char * filename; /* an optional file name or URI */ int n_filename; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); user_data = gen_userdata(n_user_data, 1); chunk = gen_const_char_ptr(n_chunk, 2); size = gen_int(n_size, 3); filename = gen_fileoutput(n_filename, 4); ret_val = xmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename); desret_xmlParserCtxtPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_userdata(n_user_data, user_data, 1); des_const_char_ptr(n_chunk, (const char *)chunk, 2); des_int(n_size, size, 3); des_fileoutput(n_filename, filename, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCreatePushParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_user_data); printf(" %d", n_chunk); printf(" %d", n_size); printf(" %d", n_filename); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlCtxtReadDoc(void) { int test_ret = 0; int mem_base; xmlDocPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlChar * cur; /* a pointer to a zero terminated string */ int n_cur; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); cur = gen_const_xmlChar_ptr(n_cur, 1); URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_parseroptions(n_options, 4); ret_val = xmlCtxtReadDoc(ctxt, (const xmlChar *)cur, URL, (const char *)encoding, options); desret_xmlDocPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1); des_filepath(n_URL, URL, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_parseroptions(n_options, options, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCtxtReadDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlCtxtReadFile(void) { int test_ret = 0; int mem_base; xmlDocPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; const char * filename; /* a file or URL */ int n_filename; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); filename = gen_filepath(n_filename, 1); encoding = gen_const_char_ptr(n_encoding, 2); options = gen_parseroptions(n_options, 3); ret_val = xmlCtxtReadFile(ctxt, filename, (const char *)encoding, options); desret_xmlDocPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_filepath(n_filename, filename, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_parseroptions(n_options, options, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCtxtReadFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_filename); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlCtxtReadMemory(void) { int test_ret = 0; int mem_base; xmlDocPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); buffer = gen_const_char_ptr(n_buffer, 1); size = gen_int(n_size, 2); URL = gen_filepath(n_URL, 3); encoding = gen_const_char_ptr(n_encoding, 4); options = gen_parseroptions(n_options, 5); ret_val = xmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options); desret_xmlDocPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_buffer, (const char *)buffer, 1); des_int(n_size, size, 2); des_filepath(n_URL, URL, 3); des_const_char_ptr(n_encoding, (const char *)encoding, 4); des_parseroptions(n_options, options, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCtxtReadMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_xmlCtxtReset(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); xmlCtxtReset(ctxt); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCtxtReset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCtxtResetPush(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; char * chunk; /* a pointer to an array of chars */ int n_chunk; int size; /* number of chars in the array */ int n_size; const char * filename; /* an optional file name or URI */ int n_filename; char * encoding; /* the document encoding, or NULL */ int n_encoding; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); chunk = gen_const_char_ptr(n_chunk, 1); size = gen_int(n_size, 2); filename = gen_filepath(n_filename, 3); encoding = gen_const_char_ptr(n_encoding, 4); ret_val = xmlCtxtResetPush(ctxt, (const char *)chunk, size, filename, (const char *)encoding); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_chunk, (const char *)chunk, 1); des_int(n_size, size, 2); des_filepath(n_filename, filename, 3); des_const_char_ptr(n_encoding, (const char *)encoding, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCtxtResetPush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_chunk); printf(" %d", n_size); printf(" %d", n_filename); printf(" %d", n_encoding); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlCtxtUseOptions(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; int options; /* a combination of xmlParserOption */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); options = gen_parseroptions(n_options, 1); ret_val = xmlCtxtUseOptions(ctxt, options); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_parseroptions(n_options, options, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCtxtUseOptions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_options); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetExternalEntityLoader(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlGetFeature(void) { int test_ret = 0; #if defined(LIBXML_LEGACY_ENABLED) #ifdef LIBXML_LEGACY_ENABLED int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML/HTML parser context */ int n_ctxt; char * name; /* the feature name */ int n_name; void * result; /* location to store the result */ int n_result; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) { for (n_result = 0;n_result < gen_nb_void_ptr;n_result++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); name = gen_const_char_ptr(n_name, 1); result = gen_void_ptr(n_result, 2); ret_val = xmlGetFeature(ctxt, (const char *)name, result); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_name, (const char *)name, 1); des_void_ptr(n_result, result, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetFeature", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_name); printf(" %d", n_result); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } #define gen_nb_const_char_ptr_ptr 1 static char ** gen_const_char_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_char_ptr_ptr(int no ATTRIBUTE_UNUSED, const char ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlGetFeaturesList(void) { int test_ret = 0; #if defined(LIBXML_LEGACY_ENABLED) #ifdef LIBXML_LEGACY_ENABLED int mem_base; int ret_val; int * len; /* the length of the features name array (input/output) */ int n_len; char ** result; /* an array of string to be filled with the features name. */ int n_result; for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) { for (n_result = 0;n_result < gen_nb_const_char_ptr_ptr;n_result++) { mem_base = xmlMemBlocks(); len = gen_int_ptr(n_len, 0); result = gen_const_char_ptr_ptr(n_result, 1); ret_val = xmlGetFeaturesList(len, (const char **)result); desret_int(ret_val); call_tests++; des_int_ptr(n_len, len, 0); des_const_char_ptr_ptr(n_result, (const char **)result, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetFeaturesList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_len); printf(" %d", n_result); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlHasFeature(void) { int test_ret = 0; int mem_base; int ret_val; xmlFeature feature; /* the feature to be examined */ int n_feature; for (n_feature = 0;n_feature < gen_nb_xmlFeature;n_feature++) { mem_base = xmlMemBlocks(); feature = gen_xmlFeature(n_feature, 0); ret_val = xmlHasFeature(feature); desret_int(ret_val); call_tests++; des_xmlFeature(n_feature, feature, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHasFeature", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_feature); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIOParseDTD(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) #ifdef LIBXML_VALID_ENABLED xmlDtdPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block or NULL */ int n_sax; xmlParserInputBufferPtr input; /* an Input Buffer */ int n_input; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { sax = gen_xmlSAXHandlerPtr(n_sax, 0); input = gen_xmlParserInputBufferPtr(n_input, 1); enc = gen_xmlCharEncoding(n_enc, 2); ret_val = xmlIOParseDTD(sax, input, enc); input = NULL; desret_xmlDtdPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_xmlParserInputBufferPtr(n_input, input, 1); des_xmlCharEncoding(n_enc, enc, 2); xmlResetLastError(); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlInitNodeInfoSeq(void) { int test_ret = 0; int mem_base; xmlParserNodeInfoSeqPtr seq; /* a node info sequence pointer */ int n_seq; for (n_seq = 0;n_seq < gen_nb_xmlParserNodeInfoSeqPtr;n_seq++) { mem_base = xmlMemBlocks(); seq = gen_xmlParserNodeInfoSeqPtr(n_seq, 0); xmlInitNodeInfoSeq(seq); call_tests++; des_xmlParserNodeInfoSeqPtr(n_seq, seq, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlInitNodeInfoSeq", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_seq); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlInitParser(void) { int test_ret = 0; int mem_base; mem_base = xmlMemBlocks(); xmlInitParser(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlInitParser", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlInitParserCtxt(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = xmlInitParserCtxt(ctxt); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlInitParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlKeepBlanksDefault(void) { int test_ret = 0; int mem_base; int ret_val; int val; /* int 0 or 1 */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = xmlKeepBlanksDefault(val); desret_int(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlKeepBlanksDefault", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlLineNumbersDefault(void) { int test_ret = 0; int mem_base; int ret_val; int val; /* int 0 or 1 */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = xmlLineNumbersDefault(val); desret_int(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlLineNumbersDefault", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlLoadExternalEntity(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; const char * URL; /* the URL for the entity to load */ int n_URL; char * ID; /* the Public ID for the entity to load */ int n_ID; xmlParserCtxtPtr ctxt; /* the context in which the entity is called or NULL */ int n_ctxt; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_ID = 0;n_ID < gen_nb_const_char_ptr;n_ID++) { for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); URL = gen_filepath(n_URL, 0); ID = gen_const_char_ptr(n_ID, 1); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 2); ret_val = xmlLoadExternalEntity(URL, (const char *)ID, ctxt); desret_xmlParserInputPtr(ret_val); call_tests++; des_filepath(n_URL, URL, 0); des_const_char_ptr(n_ID, (const char *)ID, 1); des_xmlParserCtxtPtr(n_ctxt, ctxt, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlLoadExternalEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf(" %d", n_ID); printf(" %d", n_ctxt); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewIOInputStream(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlParserInputBufferPtr input; /* an I/O Input */ int n_input; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); input = gen_xmlParserInputBufferPtr(n_input, 1); enc = gen_xmlCharEncoding(n_enc, 2); ret_val = xmlNewIOInputStream(ctxt, input, enc); if (ret_val != NULL) input = NULL; desret_xmlParserInputPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlParserInputBufferPtr(n_input, input, 1); des_xmlCharEncoding(n_enc, enc, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewIOInputStream", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_input); printf(" %d", n_enc); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewParserCtxt(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ret_val; mem_base = xmlMemBlocks(); ret_val = xmlNewParserCtxt(); desret_xmlParserCtxtPtr(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } #define gen_nb_xmlNodePtr_ptr 1 static xmlNodePtr * gen_xmlNodePtr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlNodePtr_ptr(int no ATTRIBUTE_UNUSED, xmlNodePtr * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlParseBalancedChunkMemory(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; int ret_val; xmlDocPtr doc; /* the document the chunk pertains to */ int n_doc; xmlSAXHandlerPtr sax; /* the SAX handler bloc (possibly NULL) */ int n_sax; void * user_data; /* The user data returned on SAX callbacks (possibly NULL) */ int n_user_data; int depth; /* Used for loop detection, use 0 */ int n_depth; xmlChar * string; /* the input string in UTF8 or ISO-Latin (zero terminated) */ int n_string; xmlNodePtr * lst; /* the return value for the set of parsed nodes */ int n_lst; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) { for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); sax = gen_xmlSAXHandlerPtr(n_sax, 1); user_data = gen_userdata(n_user_data, 2); depth = gen_int(n_depth, 3); string = gen_const_xmlChar_ptr(n_string, 4); lst = gen_xmlNodePtr_ptr(n_lst, 5); #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif ret_val = xmlParseBalancedChunkMemory(doc, sax, user_data, depth, (const xmlChar *)string, lst); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlSAXHandlerPtr(n_sax, sax, 1); des_userdata(n_user_data, user_data, 2); des_int(n_depth, depth, 3); des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 4); des_xmlNodePtr_ptr(n_lst, lst, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseBalancedChunkMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_sax); printf(" %d", n_user_data); printf(" %d", n_depth); printf(" %d", n_string); printf(" %d", n_lst); printf("\n"); } } } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlParseBalancedChunkMemoryRecover(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; int ret_val; xmlDocPtr doc; /* the document the chunk pertains to */ int n_doc; xmlSAXHandlerPtr sax; /* the SAX handler bloc (possibly NULL) */ int n_sax; void * user_data; /* The user data returned on SAX callbacks (possibly NULL) */ int n_user_data; int depth; /* Used for loop detection, use 0 */ int n_depth; xmlChar * string; /* the input string in UTF8 or ISO-Latin (zero terminated) */ int n_string; xmlNodePtr * lst; /* the return value for the set of parsed nodes */ int n_lst; int recover; /* return nodes even if the data is broken (use 0) */ int n_recover; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) { for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) { for (n_recover = 0;n_recover < gen_nb_int;n_recover++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); sax = gen_xmlSAXHandlerPtr(n_sax, 1); user_data = gen_userdata(n_user_data, 2); depth = gen_int(n_depth, 3); string = gen_const_xmlChar_ptr(n_string, 4); lst = gen_xmlNodePtr_ptr(n_lst, 5); recover = gen_int(n_recover, 6); #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif ret_val = xmlParseBalancedChunkMemoryRecover(doc, sax, user_data, depth, (const xmlChar *)string, lst, recover); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlSAXHandlerPtr(n_sax, sax, 1); des_userdata(n_user_data, user_data, 2); des_int(n_depth, depth, 3); des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 4); des_xmlNodePtr_ptr(n_lst, lst, 5); des_int(n_recover, recover, 6); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseBalancedChunkMemoryRecover", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_sax); printf(" %d", n_user_data); printf(" %d", n_depth); printf(" %d", n_string); printf(" %d", n_lst); printf(" %d", n_recover); printf("\n"); } } } } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlParseChunk(void) { int test_ret = 0; #if defined(LIBXML_PUSH_ENABLED) int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; char * chunk; /* an char array */ int n_chunk; int size; /* the size in byte of the chunk */ int n_size; int terminate; /* last chunk indicator */ int n_terminate; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_terminate = 0;n_terminate < gen_nb_int;n_terminate++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); chunk = gen_const_char_ptr(n_chunk, 1); size = gen_int(n_size, 2); terminate = gen_int(n_terminate, 3); ret_val = xmlParseChunk(ctxt, (const char *)chunk, size, terminate); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_chunk, (const char *)chunk, 1); des_int(n_size, size, 2); des_int(n_terminate, terminate, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseChunk", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_chunk); printf(" %d", n_size); printf(" %d", n_terminate); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlParseCtxtExternalEntity(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctx; /* the existing parsing context */ int n_ctx; xmlChar * URL; /* the URL for the entity to load */ int n_URL; xmlChar * ID; /* the System ID for the entity to load */ int n_ID; xmlNodePtr * lst; /* the return value for the set of parsed nodes */ int n_lst; for (n_ctx = 0;n_ctx < gen_nb_xmlParserCtxtPtr;n_ctx++) { for (n_URL = 0;n_URL < gen_nb_const_xmlChar_ptr;n_URL++) { for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) { for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) { mem_base = xmlMemBlocks(); ctx = gen_xmlParserCtxtPtr(n_ctx, 0); URL = gen_const_xmlChar_ptr(n_URL, 1); ID = gen_const_xmlChar_ptr(n_ID, 2); lst = gen_xmlNodePtr_ptr(n_lst, 3); ret_val = xmlParseCtxtExternalEntity(ctx, (const xmlChar *)URL, (const xmlChar *)ID, lst); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctx, ctx, 0); des_const_xmlChar_ptr(n_URL, (const xmlChar *)URL, 1); des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 2); des_xmlNodePtr_ptr(n_lst, lst, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseCtxtExternalEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_URL); printf(" %d", n_ID); printf(" %d", n_lst); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlParseDTD(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) #ifdef LIBXML_VALID_ENABLED int mem_base; xmlDtdPtr ret_val; xmlChar * ExternalID; /* a NAME* containing the External ID of the DTD */ int n_ExternalID; xmlChar * SystemID; /* a NAME* containing the URL to the DTD */ int n_SystemID; for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { mem_base = xmlMemBlocks(); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 0); SystemID = gen_const_xmlChar_ptr(n_SystemID, 1); ret_val = xmlParseDTD((const xmlChar *)ExternalID, (const xmlChar *)SystemID); desret_xmlDtdPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 0); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseDTD", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlParseDoc(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlChar * cur; /* a pointer to an array of xmlChar */ int n_cur; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); ret_val = xmlParseDoc((const xmlChar *)cur); desret_xmlDocPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; #endif #endif return(test_ret); } static int test_xmlParseDocument(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = xmlParseDocument(ctxt); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlParseEntity(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; const char * filename; /* the filename */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlParseEntity(filename); desret_xmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif #endif return(test_ret); } static int test_xmlParseExtParsedEnt(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = xmlParseExtParsedEnt(ctxt); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseExtParsedEnt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlParseExternalEntity(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; int ret_val; xmlDocPtr doc; /* the document the chunk pertains to */ int n_doc; xmlSAXHandlerPtr sax; /* the SAX handler bloc (possibly NULL) */ int n_sax; void * user_data; /* The user data returned on SAX callbacks (possibly NULL) */ int n_user_data; int depth; /* Used for loop detection, use 0 */ int n_depth; xmlChar * URL; /* the URL for the entity to load */ int n_URL; xmlChar * ID; /* the System ID for the entity to load */ int n_ID; xmlNodePtr * lst; /* the return value for the set of parsed nodes */ int n_lst; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { for (n_URL = 0;n_URL < gen_nb_const_xmlChar_ptr;n_URL++) { for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) { for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); sax = gen_xmlSAXHandlerPtr(n_sax, 1); user_data = gen_userdata(n_user_data, 2); depth = gen_int(n_depth, 3); URL = gen_const_xmlChar_ptr(n_URL, 4); ID = gen_const_xmlChar_ptr(n_ID, 5); lst = gen_xmlNodePtr_ptr(n_lst, 6); ret_val = xmlParseExternalEntity(doc, sax, user_data, depth, (const xmlChar *)URL, (const xmlChar *)ID, lst); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlSAXHandlerPtr(n_sax, sax, 1); des_userdata(n_user_data, user_data, 2); des_int(n_depth, depth, 3); des_const_xmlChar_ptr(n_URL, (const xmlChar *)URL, 4); des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 5); des_xmlNodePtr_ptr(n_lst, lst, 6); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseExternalEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_sax); printf(" %d", n_user_data); printf(" %d", n_depth); printf(" %d", n_URL); printf(" %d", n_ID); printf(" %d", n_lst); printf("\n"); } } } } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlParseFile(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; const char * filename; /* the filename */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlParseFile(filename); desret_xmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif #endif return(test_ret); } static int test_xmlParseInNodeContext(void) { int test_ret = 0; int mem_base; xmlParserErrors ret_val; xmlNodePtr node; /* the context node */ int n_node; char * data; /* the input string */ int n_data; int datalen; /* the input string length in bytes */ int n_datalen; int options; /* a combination of xmlParserOption */ int n_options; xmlNodePtr * lst; /* the return value for the set of parsed nodes */ int n_lst; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_data = 0;n_data < gen_nb_const_char_ptr;n_data++) { for (n_datalen = 0;n_datalen < gen_nb_int;n_datalen++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); data = gen_const_char_ptr(n_data, 1); datalen = gen_int(n_datalen, 2); options = gen_parseroptions(n_options, 3); lst = gen_xmlNodePtr_ptr(n_lst, 4); ret_val = xmlParseInNodeContext(node, (const char *)data, datalen, options, lst); desret_xmlParserErrors(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_char_ptr(n_data, (const char *)data, 1); des_int(n_datalen, datalen, 2); des_parseroptions(n_options, options, 3); des_xmlNodePtr_ptr(n_lst, lst, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseInNodeContext", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_data); printf(" %d", n_datalen); printf(" %d", n_options); printf(" %d", n_lst); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlParseMemory(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; char * buffer; /* an pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); ret_val = xmlParseMemory((const char *)buffer, size); desret_xmlDocPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } #define gen_nb_const_xmlParserNodeInfoPtr 1 static xmlParserNodeInfoPtr gen_const_xmlParserNodeInfoPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlParserNodeInfoPtr(int no ATTRIBUTE_UNUSED, const xmlParserNodeInfoPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlParserAddNodeInfo(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlParserNodeInfoPtr info; /* a node info sequence pointer */ int n_info; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_info = 0;n_info < gen_nb_const_xmlParserNodeInfoPtr;n_info++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); info = gen_const_xmlParserNodeInfoPtr(n_info, 1); xmlParserAddNodeInfo(ctxt, (const xmlParserNodeInfoPtr)info); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlParserNodeInfoPtr(n_info, (const xmlParserNodeInfoPtr)info, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserAddNodeInfo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_info); printf("\n"); } } } function_tests++; return(test_ret); } #define gen_nb_const_xmlParserCtxtPtr 1 static xmlParserCtxtPtr gen_const_xmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, const xmlParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #define gen_nb_const_xmlNodePtr 1 static xmlNodePtr gen_const_xmlNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlNodePtr(int no ATTRIBUTE_UNUSED, const xmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlParserFindNodeInfo(void) { int test_ret = 0; int mem_base; const xmlParserNodeInfo * ret_val; xmlParserCtxtPtr ctx; /* an XML parser context */ int n_ctx; xmlNodePtr node; /* an XML node within the tree */ int n_node; for (n_ctx = 0;n_ctx < gen_nb_const_xmlParserCtxtPtr;n_ctx++) { for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); ctx = gen_const_xmlParserCtxtPtr(n_ctx, 0); node = gen_const_xmlNodePtr(n_node, 1); ret_val = xmlParserFindNodeInfo((const xmlParserCtxtPtr)ctx, (const xmlNodePtr)node); desret_const_xmlParserNodeInfo_ptr(ret_val); call_tests++; des_const_xmlParserCtxtPtr(n_ctx, (const xmlParserCtxtPtr)ctx, 0); des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserFindNodeInfo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf(" %d", n_node); printf("\n"); } } } function_tests++; return(test_ret); } #define gen_nb_const_xmlParserNodeInfoSeqPtr 1 static xmlParserNodeInfoSeqPtr gen_const_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, const xmlParserNodeInfoSeqPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlParserFindNodeInfoIndex(void) { int test_ret = 0; int mem_base; unsigned long ret_val; xmlParserNodeInfoSeqPtr seq; /* a node info sequence pointer */ int n_seq; xmlNodePtr node; /* an XML node pointer */ int n_node; for (n_seq = 0;n_seq < gen_nb_const_xmlParserNodeInfoSeqPtr;n_seq++) { for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); seq = gen_const_xmlParserNodeInfoSeqPtr(n_seq, 0); node = gen_const_xmlNodePtr(n_node, 1); ret_val = xmlParserFindNodeInfoIndex((const xmlParserNodeInfoSeqPtr)seq, (const xmlNodePtr)node); desret_unsigned_long(ret_val); call_tests++; des_const_xmlParserNodeInfoSeqPtr(n_seq, (const xmlParserNodeInfoSeqPtr)seq, 0); des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserFindNodeInfoIndex", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_seq); printf(" %d", n_node); printf("\n"); } } } function_tests++; return(test_ret); } #define gen_nb_xmlParserInputPtr 1 static xmlParserInputPtr gen_xmlParserInputPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlParserInputPtr(int no ATTRIBUTE_UNUSED, xmlParserInputPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlParserInputGrow(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserInputPtr in; /* an XML parser input */ int n_in; int len; /* an indicative size for the lookahead */ int n_len; for (n_in = 0;n_in < gen_nb_xmlParserInputPtr;n_in++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); in = gen_xmlParserInputPtr(n_in, 0); len = gen_int(n_len, 1); ret_val = xmlParserInputGrow(in, len); desret_int(ret_val); call_tests++; des_xmlParserInputPtr(n_in, in, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputGrow", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_in); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlParserInputRead(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserInputPtr in; /* an XML parser input */ int n_in; int len; /* an indicative size for the lookahead */ int n_len; for (n_in = 0;n_in < gen_nb_xmlParserInputPtr;n_in++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); in = gen_xmlParserInputPtr(n_in, 0); len = gen_int(n_len, 1); ret_val = xmlParserInputRead(in, len); desret_int(ret_val); call_tests++; des_xmlParserInputPtr(n_in, in, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_in); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlPedanticParserDefault(void) { int test_ret = 0; int mem_base; int ret_val; int val; /* int 0 or 1 */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = xmlPedanticParserDefault(val); desret_int(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPedanticParserDefault", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlReadDoc(void) { int test_ret = 0; int mem_base; xmlDocPtr ret_val; xmlChar * cur; /* a pointer to a zero terminated string */ int n_cur; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); URL = gen_filepath(n_URL, 1); encoding = gen_const_char_ptr(n_encoding, 2); options = gen_parseroptions(n_options, 3); ret_val = xmlReadDoc((const xmlChar *)cur, URL, (const char *)encoding, options); desret_xmlDocPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); des_filepath(n_URL, URL, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_parseroptions(n_options, options, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReadDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlReadFile(void) { int test_ret = 0; int mem_base; xmlDocPtr ret_val; const char * filename; /* a file or URL */ int n_filename; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); encoding = gen_const_char_ptr(n_encoding, 1); options = gen_parseroptions(n_options, 2); ret_val = xmlReadFile(filename, (const char *)encoding, options); desret_xmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); des_parseroptions(n_options, options, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReadFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlReadMemory(void) { int test_ret = 0; int mem_base; xmlDocPtr ret_val; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_parseroptions(n_options, 4); ret_val = xmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options); desret_xmlDocPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); des_filepath(n_URL, URL, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_parseroptions(n_options, options, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReadMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlRecoverDoc(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlChar * cur; /* a pointer to an array of xmlChar */ int n_cur; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); ret_val = xmlRecoverDoc((const xmlChar *)cur); desret_xmlDocPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRecoverDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; #endif #endif return(test_ret); } static int test_xmlRecoverFile(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; const char * filename; /* the filename */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlRecoverFile(filename); desret_xmlDocPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRecoverFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif #endif return(test_ret); } static int test_xmlRecoverMemory(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; char * buffer; /* an pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); ret_val = xmlRecoverMemory((const char *)buffer, size); desret_xmlDocPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRecoverMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXParseDTD(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDtdPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; xmlChar * ExternalID; /* a NAME* containing the External ID of the DTD */ int n_ExternalID; xmlChar * SystemID; /* a NAME* containing the URL to the DTD */ int n_SystemID; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 1); SystemID = gen_const_xmlChar_ptr(n_SystemID, 2); ret_val = xmlSAXParseDTD(sax, (const xmlChar *)ExternalID, (const xmlChar *)SystemID); desret_xmlDtdPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 1); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXParseDTD", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXParseDoc(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; xmlChar * cur; /* a pointer to an array of xmlChar */ int n_cur; int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */ int n_recovery; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); cur = gen_const_xmlChar_ptr(n_cur, 1); recovery = gen_int(n_recovery, 2); ret_val = xmlSAXParseDoc(sax, (const xmlChar *)cur, recovery); desret_xmlDocPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1); des_int(n_recovery, recovery, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXParseDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_cur); printf(" %d", n_recovery); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXParseEntity(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; const char * filename; /* the filename */ int n_filename; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); filename = gen_filepath(n_filename, 1); ret_val = xmlSAXParseEntity(sax, filename); desret_xmlDocPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_filepath(n_filename, filename, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXParseEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_filename); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXParseFile(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; const char * filename; /* the filename */ int n_filename; int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */ int n_recovery; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); filename = gen_filepath(n_filename, 1); recovery = gen_int(n_recovery, 2); ret_val = xmlSAXParseFile(sax, filename, recovery); desret_xmlDocPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_filepath(n_filename, filename, 1); des_int(n_recovery, recovery, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXParseFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_filename); printf(" %d", n_recovery); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXParseFileWithData(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; const char * filename; /* the filename */ int n_filename; int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */ int n_recovery; void * data; /* the userdata */ int n_data; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); filename = gen_filepath(n_filename, 1); recovery = gen_int(n_recovery, 2); data = gen_userdata(n_data, 3); ret_val = xmlSAXParseFileWithData(sax, filename, recovery, data); desret_xmlDocPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_filepath(n_filename, filename, 1); des_int(n_recovery, recovery, 2); des_userdata(n_data, data, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXParseFileWithData", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_filename); printf(" %d", n_recovery); printf(" %d", n_data); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXParseMemory(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; char * buffer; /* an pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; int recovery; /* work in recovery mode, i.e. tries to read not Well Formed documents */ int n_recovery; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); buffer = gen_const_char_ptr(n_buffer, 1); size = gen_int(n_size, 2); recovery = gen_int(n_recovery, 3); ret_val = xmlSAXParseMemory(sax, (const char *)buffer, size, recovery); desret_xmlDocPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_const_char_ptr(n_buffer, (const char *)buffer, 1); des_int(n_size, size, 2); des_int(n_recovery, recovery, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXParseMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_recovery); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXParseMemoryWithData(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlDocPtr ret_val; xmlSAXHandlerPtr sax; /* the SAX handler block */ int n_sax; char * buffer; /* an pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */ int n_recovery; void * data; /* the userdata */ int n_data; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); buffer = gen_const_char_ptr(n_buffer, 1); size = gen_int(n_size, 2); recovery = gen_int(n_recovery, 3); data = gen_userdata(n_data, 4); ret_val = xmlSAXParseMemoryWithData(sax, (const char *)buffer, size, recovery, data); desret_xmlDocPtr(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_const_char_ptr(n_buffer, (const char *)buffer, 1); des_int(n_size, size, 2); des_int(n_recovery, recovery, 3); des_userdata(n_data, data, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXParseMemoryWithData", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_recovery); printf(" %d", n_data); printf("\n"); } } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXUserParseFile(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; int ret_val; xmlSAXHandlerPtr sax; /* a SAX handler */ int n_sax; void * user_data; /* The user data returned on SAX callbacks */ int n_user_data; const char * filename; /* a file name */ int n_filename; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); user_data = gen_userdata(n_user_data, 1); filename = gen_filepath(n_filename, 2); #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif ret_val = xmlSAXUserParseFile(sax, user_data, filename); desret_int(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_userdata(n_user_data, user_data, 1); des_filepath(n_filename, filename, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXUserParseFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_user_data); printf(" %d", n_filename); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSAXUserParseMemory(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; int ret_val; xmlSAXHandlerPtr sax; /* a SAX handler */ int n_sax; void * user_data; /* The user data returned on SAX callbacks */ int n_user_data; char * buffer; /* an in-memory XML document input */ int n_buffer; int size; /* the length of the XML document in bytes */ int n_size; for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { mem_base = xmlMemBlocks(); sax = gen_xmlSAXHandlerPtr(n_sax, 0); user_data = gen_userdata(n_user_data, 1); buffer = gen_const_char_ptr(n_buffer, 2); size = gen_int(n_size, 3); #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; #endif ret_val = xmlSAXUserParseMemory(sax, user_data, (const char *)buffer, size); desret_int(ret_val); call_tests++; des_xmlSAXHandlerPtr(n_sax, sax, 0); des_userdata(n_user_data, user_data, 1); des_const_char_ptr(n_buffer, (const char *)buffer, 2); des_int(n_size, size, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSAXUserParseMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_sax); printf(" %d", n_user_data); printf(" %d", n_buffer); printf(" %d", n_size); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSetExternalEntityLoader(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSetFeature(void) { int test_ret = 0; #if defined(LIBXML_LEGACY_ENABLED) #ifdef LIBXML_LEGACY_ENABLED int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML/HTML parser context */ int n_ctxt; char * name; /* the feature name */ int n_name; void * value; /* pointer to the location of the new value */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_void_ptr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); name = gen_const_char_ptr(n_name, 1); value = gen_void_ptr(n_value, 2); ret_val = xmlSetFeature(ctxt, (const char *)name, value); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_name, (const char *)name, 1); des_void_ptr(n_value, value, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetFeature", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlSetupParserForBuffer(void) { int test_ret = 0; #if defined(LIBXML_SAX1_ENABLED) #ifdef LIBXML_SAX1_ENABLED int mem_base; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlChar * buffer; /* a xmlChar * buffer */ int n_buffer; const char * filename; /* a file name */ int n_filename; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_buffer = 0;n_buffer < gen_nb_const_xmlChar_ptr;n_buffer++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); buffer = gen_const_xmlChar_ptr(n_buffer, 1); filename = gen_filepath(n_filename, 2); xmlSetupParserForBuffer(ctxt, (const xmlChar *)buffer, filename); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_buffer, (const xmlChar *)buffer, 1); des_filepath(n_filename, filename, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetupParserForBuffer", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_buffer); printf(" %d", n_filename); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlStopParser(void) { int test_ret = 0; #ifdef LIBXML_PUSH_ENABLED int mem_base; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); xmlStopParser(ctxt); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStopParser", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSubstituteEntitiesDefault(void) { int test_ret = 0; int mem_base; int ret_val; int val; /* int 0 or 1 */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = xmlSubstituteEntitiesDefault(val); desret_int(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSubstituteEntitiesDefault", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; return(test_ret); } static int test_parser(void) { int test_ret = 0; if (quiet == 0) printf("Testing parser : 61 of 70 functions ...\n"); test_ret += test_xmlByteConsumed(); test_ret += test_xmlClearNodeInfoSeq(); test_ret += test_xmlClearParserCtxt(); test_ret += test_xmlCreateDocParserCtxt(); test_ret += test_xmlCreatePushParserCtxt(); test_ret += test_xmlCtxtReadDoc(); test_ret += test_xmlCtxtReadFile(); test_ret += test_xmlCtxtReadMemory(); test_ret += test_xmlCtxtReset(); test_ret += test_xmlCtxtResetPush(); test_ret += test_xmlCtxtUseOptions(); test_ret += test_xmlGetExternalEntityLoader(); test_ret += test_xmlGetFeature(); test_ret += test_xmlGetFeaturesList(); test_ret += test_xmlHasFeature(); test_ret += test_xmlIOParseDTD(); test_ret += test_xmlInitNodeInfoSeq(); test_ret += test_xmlInitParser(); test_ret += test_xmlInitParserCtxt(); test_ret += test_xmlKeepBlanksDefault(); test_ret += test_xmlLineNumbersDefault(); test_ret += test_xmlLoadExternalEntity(); test_ret += test_xmlNewIOInputStream(); test_ret += test_xmlNewParserCtxt(); test_ret += test_xmlParseBalancedChunkMemory(); test_ret += test_xmlParseBalancedChunkMemoryRecover(); test_ret += test_xmlParseChunk(); test_ret += test_xmlParseCtxtExternalEntity(); test_ret += test_xmlParseDTD(); test_ret += test_xmlParseDoc(); test_ret += test_xmlParseDocument(); test_ret += test_xmlParseEntity(); test_ret += test_xmlParseExtParsedEnt(); test_ret += test_xmlParseExternalEntity(); test_ret += test_xmlParseFile(); test_ret += test_xmlParseInNodeContext(); test_ret += test_xmlParseMemory(); test_ret += test_xmlParserAddNodeInfo(); test_ret += test_xmlParserFindNodeInfo(); test_ret += test_xmlParserFindNodeInfoIndex(); test_ret += test_xmlParserInputGrow(); test_ret += test_xmlParserInputRead(); test_ret += test_xmlPedanticParserDefault(); test_ret += test_xmlReadDoc(); test_ret += test_xmlReadFile(); test_ret += test_xmlReadMemory(); test_ret += test_xmlRecoverDoc(); test_ret += test_xmlRecoverFile(); test_ret += test_xmlRecoverMemory(); test_ret += test_xmlSAXParseDTD(); test_ret += test_xmlSAXParseDoc(); test_ret += test_xmlSAXParseEntity(); test_ret += test_xmlSAXParseFile(); test_ret += test_xmlSAXParseFileWithData(); test_ret += test_xmlSAXParseMemory(); test_ret += test_xmlSAXParseMemoryWithData(); test_ret += test_xmlSAXUserParseFile(); test_ret += test_xmlSAXUserParseMemory(); test_ret += test_xmlSetExternalEntityLoader(); test_ret += test_xmlSetFeature(); test_ret += test_xmlSetupParserForBuffer(); test_ret += test_xmlStopParser(); test_ret += test_xmlSubstituteEntitiesDefault(); if (test_ret != 0) printf("Module parser: %d errors\n", test_ret); return(test_ret); } static int test_htmlCreateFileParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; htmlParserCtxtPtr ret_val; const char * filename; /* the filename */ int n_filename; char * encoding; /* a free form C string describing the HTML document encoding, or NULL */ int n_encoding; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); encoding = gen_const_char_ptr(n_encoding, 1); ret_val = htmlCreateFileParserCtxt(filename, (const char *)encoding); desret_htmlParserCtxtPtr(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlCreateFileParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_encoding); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_htmlInitAutoClose(void) { int test_ret = 0; #if defined(LIBXML_HTML_ENABLED) int mem_base; mem_base = xmlMemBlocks(); htmlInitAutoClose(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in htmlInitAutoClose", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_inputPop(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = inputPop(ctxt); desret_xmlParserInputPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in inputPop", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_inputPush(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlParserInputPtr value; /* the parser input */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_value = 0;n_value < gen_nb_xmlParserInputPtr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); value = gen_xmlParserInputPtr(n_value, 1); ret_val = inputPush(ctxt, value); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlParserInputPtr(n_value, value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in inputPush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_value); printf("\n"); } } } function_tests++; return(test_ret); } static int test_namePop(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = namePop(ctxt); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in namePop", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_namePush(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlChar * value; /* the element name */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); value = gen_const_xmlChar_ptr(n_value, 1); ret_val = namePush(ctxt, (const xmlChar *)value); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in namePush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_value); printf("\n"); } } } function_tests++; return(test_ret); } static int test_nodePop(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = nodePop(ctxt); desret_xmlNodePtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in nodePop", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_nodePush(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlNodePtr value; /* the element node */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_value = 0;n_value < gen_nb_xmlNodePtr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); value = gen_xmlNodePtr(n_value, 1); ret_val = nodePush(ctxt, value); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_value, value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in nodePush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_value); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCheckLanguageID(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * lang; /* pointer to the string value */ int n_lang; for (n_lang = 0;n_lang < gen_nb_const_xmlChar_ptr;n_lang++) { mem_base = xmlMemBlocks(); lang = gen_const_xmlChar_ptr(n_lang, 0); ret_val = xmlCheckLanguageID((const xmlChar *)lang); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_lang, (const xmlChar *)lang, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCheckLanguageID", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_lang); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCopyChar(void) { int test_ret = 0; int mem_base; int ret_val; int len; /* Ignored, compatibility */ int n_len; xmlChar * out; /* pointer to an array of xmlChar */ int n_out; int val; /* the char value */ int n_val; for (n_len = 0;n_len < gen_nb_int;n_len++) { for (n_out = 0;n_out < gen_nb_xmlChar_ptr;n_out++) { for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); len = gen_int(n_len, 0); out = gen_xmlChar_ptr(n_out, 1); val = gen_int(n_val, 2); ret_val = xmlCopyChar(len, out, val); desret_int(ret_val); call_tests++; des_int(n_len, len, 0); des_xmlChar_ptr(n_out, out, 1); des_int(n_val, val, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_len); printf(" %d", n_out); printf(" %d", n_val); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlCopyCharMultiByte(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * out; /* pointer to an array of xmlChar */ int n_out; int val; /* the char value */ int n_val; for (n_out = 0;n_out < gen_nb_xmlChar_ptr;n_out++) { for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); out = gen_xmlChar_ptr(n_out, 0); val = gen_int(n_val, 1); ret_val = xmlCopyCharMultiByte(out, val); desret_int(ret_val); call_tests++; des_xmlChar_ptr(n_out, out, 0); des_int(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyCharMultiByte", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_val); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCreateEntityParserCtxt(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ret_val; xmlChar * URL; /* the entity URL */ int n_URL; xmlChar * ID; /* the entity PUBLIC ID */ int n_ID; xmlChar * base; /* a possible base for the target URI */ int n_base; for (n_URL = 0;n_URL < gen_nb_const_xmlChar_ptr;n_URL++) { for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) { for (n_base = 0;n_base < gen_nb_const_xmlChar_ptr;n_base++) { mem_base = xmlMemBlocks(); URL = gen_const_xmlChar_ptr(n_URL, 0); ID = gen_const_xmlChar_ptr(n_ID, 1); base = gen_const_xmlChar_ptr(n_base, 2); ret_val = xmlCreateEntityParserCtxt((const xmlChar *)URL, (const xmlChar *)ID, (const xmlChar *)base); desret_xmlParserCtxtPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_URL, (const xmlChar *)URL, 0); des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 1); des_const_xmlChar_ptr(n_base, (const xmlChar *)base, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCreateEntityParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf(" %d", n_ID); printf(" %d", n_base); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlCreateFileParserCtxt(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ret_val; const char * filename; /* the filename */ int n_filename; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); ret_val = xmlCreateFileParserCtxt(filename); desret_xmlParserCtxtPtr(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCreateFileParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCreateMemoryParserCtxt(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ret_val; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); ret_val = xmlCreateMemoryParserCtxt((const char *)buffer, size); desret_xmlParserCtxtPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCreateMemoryParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCreateURLParserCtxt(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ret_val; const char * filename; /* the filename or URL */ int n_filename; int options; /* a combination of xmlParserOption */ int n_options; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); options = gen_int(n_options, 1); ret_val = xmlCreateURLParserCtxt(filename, options); desret_xmlParserCtxtPtr(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_int(n_options, options, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCreateURLParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_options); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCurrentChar(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* the XML parser context */ int n_ctxt; int * len; /* pointer to the length of the char read */ int n_len; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); len = gen_int_ptr(n_len, 1); ret_val = xmlCurrentChar(ctxt, len); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_int_ptr(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCurrentChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlErrMemory(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; char * extra; /* extra informations */ int n_extra; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_extra = 0;n_extra < gen_nb_const_char_ptr;n_extra++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); extra = gen_const_char_ptr(n_extra, 1); xmlErrMemory(ctxt, (const char *)extra); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_char_ptr(n_extra, (const char *)extra, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlErrMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_extra); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlIsLetter(void) { int test_ret = 0; int mem_base; int ret_val; int c; /* an unicode character (int) */ int n_c; for (n_c = 0;n_c < gen_nb_int;n_c++) { mem_base = xmlMemBlocks(); c = gen_int(n_c, 0); ret_val = xmlIsLetter(c); desret_int(ret_val); call_tests++; des_int(n_c, c, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsLetter", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_c); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNewEntityInputStream(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlEntityPtr entity; /* an Entity pointer */ int n_entity; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_entity = 0;n_entity < gen_nb_xmlEntityPtr;n_entity++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); entity = gen_xmlEntityPtr(n_entity, 1); ret_val = xmlNewEntityInputStream(ctxt, entity); desret_xmlParserInputPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlEntityPtr(n_entity, entity, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewEntityInputStream", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_entity); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewInputFromFile(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; const char * filename; /* the filename to use as entity */ int n_filename; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); filename = gen_filepath(n_filename, 1); ret_val = xmlNewInputFromFile(ctxt, filename); desret_xmlParserInputPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_filepath(n_filename, filename, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewInputFromFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_filename); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewInputStream(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = xmlNewInputStream(ctxt); desret_xmlParserInputPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewInputStream", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNewStringInputStream(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlChar * buffer; /* an memory buffer */ int n_buffer; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_buffer = 0;n_buffer < gen_nb_const_xmlChar_ptr;n_buffer++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); buffer = gen_const_xmlChar_ptr(n_buffer, 1); ret_val = xmlNewStringInputStream(ctxt, (const xmlChar *)buffer); desret_xmlParserInputPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_buffer, (const xmlChar *)buffer, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewStringInputStream", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_buffer); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNextChar(void) { int test_ret = 0; int mem_base; xmlParserCtxtPtr ctxt; /* the XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); xmlNextChar(ctxt); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNextChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlParserInputShrink(void) { int test_ret = 0; int mem_base; xmlParserInputPtr in; /* an XML parser input */ int n_in; for (n_in = 0;n_in < gen_nb_xmlParserInputPtr;n_in++) { mem_base = xmlMemBlocks(); in = gen_xmlParserInputPtr(n_in, 0); xmlParserInputShrink(in); call_tests++; des_xmlParserInputPtr(n_in, in, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputShrink", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_in); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlPopInput(void) { int test_ret = 0; int mem_base; xmlChar ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret_val = xmlPopInput(ctxt); desret_xmlChar(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPopInput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlPushInput(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlParserInputPtr input; /* an XML parser input fragment (entity, XML fragment ...). */ int n_input; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); input = gen_xmlParserInputPtr(n_input, 1); ret_val = xmlPushInput(ctxt, input); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlParserInputPtr(n_input, input, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPushInput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_input); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSetEntityReferenceFunc(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSplitQName(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlChar * name; /* an XML parser context */ int n_name; xmlChar ** prefix; /* a xmlChar ** */ int n_prefix; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_prefix = 0;n_prefix < gen_nb_xmlChar_ptr_ptr;n_prefix++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); name = gen_const_xmlChar_ptr(n_name, 1); prefix = gen_xmlChar_ptr_ptr(n_prefix, 2); ret_val = xmlSplitQName(ctxt, (const xmlChar *)name, prefix); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_xmlChar_ptr_ptr(n_prefix, prefix, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSplitQName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_name); printf(" %d", n_prefix); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlStringCurrentChar(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* the XML parser context */ int n_ctxt; xmlChar * cur; /* pointer to the beginning of the char */ int n_cur; int * len; /* pointer to the length of the char read */ int n_len; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); cur = gen_const_xmlChar_ptr(n_cur, 1); len = gen_int_ptr(n_len, 2); ret_val = xmlStringCurrentChar(ctxt, (const xmlChar *)cur, len); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1); des_int_ptr(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStringCurrentChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlStringDecodeEntities(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlParserCtxtPtr ctxt; /* the parser context */ int n_ctxt; xmlChar * str; /* the input string */ int n_str; int what; /* combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF */ int n_what; xmlChar end; /* an end marker xmlChar, 0 if none */ int n_end; xmlChar end2; /* an end marker xmlChar, 0 if none */ int n_end2; xmlChar end3; /* an end marker xmlChar, 0 if none */ int n_end3; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_what = 0;n_what < gen_nb_int;n_what++) { for (n_end = 0;n_end < gen_nb_xmlChar;n_end++) { for (n_end2 = 0;n_end2 < gen_nb_xmlChar;n_end2++) { for (n_end3 = 0;n_end3 < gen_nb_xmlChar;n_end3++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); str = gen_const_xmlChar_ptr(n_str, 1); what = gen_int(n_what, 2); end = gen_xmlChar(n_end, 3); end2 = gen_xmlChar(n_end2, 4); end3 = gen_xmlChar(n_end3, 5); ret_val = xmlStringDecodeEntities(ctxt, (const xmlChar *)str, what, end, end2, end3); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); des_int(n_what, what, 2); des_xmlChar(n_end, end, 3); des_xmlChar(n_end2, end2, 4); des_xmlChar(n_end3, end3, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStringDecodeEntities", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_str); printf(" %d", n_what); printf(" %d", n_end); printf(" %d", n_end2); printf(" %d", n_end3); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_xmlStringLenDecodeEntities(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlParserCtxtPtr ctxt; /* the parser context */ int n_ctxt; xmlChar * str; /* the input string */ int n_str; int len; /* the string length */ int n_len; int what; /* combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF */ int n_what; xmlChar end; /* an end marker xmlChar, 0 if none */ int n_end; xmlChar end2; /* an end marker xmlChar, 0 if none */ int n_end2; xmlChar end3; /* an end marker xmlChar, 0 if none */ int n_end3; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { for (n_what = 0;n_what < gen_nb_int;n_what++) { for (n_end = 0;n_end < gen_nb_xmlChar;n_end++) { for (n_end2 = 0;n_end2 < gen_nb_xmlChar;n_end2++) { for (n_end3 = 0;n_end3 < gen_nb_xmlChar;n_end3++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); str = gen_const_xmlChar_ptr(n_str, 1); len = gen_int(n_len, 2); what = gen_int(n_what, 3); end = gen_xmlChar(n_end, 4); end2 = gen_xmlChar(n_end2, 5); end3 = gen_xmlChar(n_end3, 6); ret_val = xmlStringLenDecodeEntities(ctxt, (const xmlChar *)str, len, what, end, end2, end3); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); des_int(n_len, len, 2); des_int(n_what, what, 3); des_xmlChar(n_end, end, 4); des_xmlChar(n_end2, end2, 5); des_xmlChar(n_end3, end3, 6); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStringLenDecodeEntities", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_str); printf(" %d", n_len); printf(" %d", n_what); printf(" %d", n_end); printf(" %d", n_end2); printf(" %d", n_end3); printf("\n"); } } } } } } } } function_tests++; return(test_ret); } static int test_xmlSwitchEncoding(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* the parser context */ int n_ctxt; xmlCharEncoding enc; /* the encoding value (number) */ int n_enc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); enc = gen_xmlCharEncoding(n_enc, 1); ret_val = xmlSwitchEncoding(ctxt, enc); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlCharEncoding(n_enc, enc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSwitchEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_enc); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSwitchInputEncoding(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* the parser context */ int n_ctxt; xmlParserInputPtr input; /* the input stream */ int n_input; xmlCharEncodingHandlerPtr handler; /* the encoding handler */ int n_handler; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) { for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandlerPtr;n_handler++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); input = gen_xmlParserInputPtr(n_input, 1); handler = gen_xmlCharEncodingHandlerPtr(n_handler, 2); ret_val = xmlSwitchInputEncoding(ctxt, input, handler); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlParserInputPtr(n_input, input, 1); des_xmlCharEncodingHandlerPtr(n_handler, handler, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSwitchInputEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_input); printf(" %d", n_handler); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlSwitchToEncoding(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserCtxtPtr ctxt; /* the parser context */ int n_ctxt; xmlCharEncodingHandlerPtr handler; /* the encoding handler */ int n_handler; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandlerPtr;n_handler++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); handler = gen_xmlCharEncodingHandlerPtr(n_handler, 1); ret_val = xmlSwitchToEncoding(ctxt, handler); desret_int(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlCharEncodingHandlerPtr(n_handler, handler, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSwitchToEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_handler); printf("\n"); } } } function_tests++; return(test_ret); } static int test_parserInternals(void) { int test_ret = 0; if (quiet == 0) printf("Testing parserInternals : 33 of 90 functions ...\n"); test_ret += test_htmlCreateFileParserCtxt(); test_ret += test_htmlInitAutoClose(); test_ret += test_inputPop(); test_ret += test_inputPush(); test_ret += test_namePop(); test_ret += test_namePush(); test_ret += test_nodePop(); test_ret += test_nodePush(); test_ret += test_xmlCheckLanguageID(); test_ret += test_xmlCopyChar(); test_ret += test_xmlCopyCharMultiByte(); test_ret += test_xmlCreateEntityParserCtxt(); test_ret += test_xmlCreateFileParserCtxt(); test_ret += test_xmlCreateMemoryParserCtxt(); test_ret += test_xmlCreateURLParserCtxt(); test_ret += test_xmlCurrentChar(); test_ret += test_xmlErrMemory(); test_ret += test_xmlIsLetter(); test_ret += test_xmlNewEntityInputStream(); test_ret += test_xmlNewInputFromFile(); test_ret += test_xmlNewInputStream(); test_ret += test_xmlNewStringInputStream(); test_ret += test_xmlNextChar(); test_ret += test_xmlParserInputShrink(); test_ret += test_xmlPopInput(); test_ret += test_xmlPushInput(); test_ret += test_xmlSetEntityReferenceFunc(); test_ret += test_xmlSplitQName(); test_ret += test_xmlStringCurrentChar(); test_ret += test_xmlStringDecodeEntities(); test_ret += test_xmlStringLenDecodeEntities(); test_ret += test_xmlSwitchEncoding(); test_ret += test_xmlSwitchInputEncoding(); test_ret += test_xmlSwitchToEncoding(); if (test_ret != 0) printf("Module parserInternals: %d errors\n", test_ret); return(test_ret); } static int test_xmlPatternFromRoot(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlPatternPtr comp; /* the precompiled pattern */ int n_comp; for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) { mem_base = xmlMemBlocks(); comp = gen_xmlPatternPtr(n_comp, 0); ret_val = xmlPatternFromRoot(comp); desret_int(ret_val); call_tests++; des_xmlPatternPtr(n_comp, comp, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPatternFromRoot", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlPatternGetStreamCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlPatternMatch(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlPatternPtr comp; /* the precompiled pattern */ int n_comp; xmlNodePtr node; /* a node */ int n_node; for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); comp = gen_xmlPatternPtr(n_comp, 0); node = gen_xmlNodePtr(n_node, 1); ret_val = xmlPatternMatch(comp, node); desret_int(ret_val); call_tests++; des_xmlPatternPtr(n_comp, comp, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPatternMatch", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlPatternMaxDepth(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlPatternPtr comp; /* the precompiled pattern */ int n_comp; for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) { mem_base = xmlMemBlocks(); comp = gen_xmlPatternPtr(n_comp, 0); ret_val = xmlPatternMaxDepth(comp); desret_int(ret_val); call_tests++; des_xmlPatternPtr(n_comp, comp, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPatternMaxDepth", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlPatternMinDepth(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlPatternPtr comp; /* the precompiled pattern */ int n_comp; for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) { mem_base = xmlMemBlocks(); comp = gen_xmlPatternPtr(n_comp, 0); ret_val = xmlPatternMinDepth(comp); desret_int(ret_val); call_tests++; des_xmlPatternPtr(n_comp, comp, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPatternMinDepth", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlPatternStreamable(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlPatternPtr comp; /* the precompiled pattern */ int n_comp; for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) { mem_base = xmlMemBlocks(); comp = gen_xmlPatternPtr(n_comp, 0); ret_val = xmlPatternStreamable(comp); desret_int(ret_val); call_tests++; des_xmlPatternPtr(n_comp, comp, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPatternStreamable", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlPatterncompile(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_PATTERN_ENABLED #define gen_nb_xmlStreamCtxtPtr 1 static xmlStreamCtxtPtr gen_xmlStreamCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlStreamCtxtPtr(int no ATTRIBUTE_UNUSED, xmlStreamCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlStreamPop(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlStreamCtxtPtr stream; /* the stream context */ int n_stream; for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) { mem_base = xmlMemBlocks(); stream = gen_xmlStreamCtxtPtr(n_stream, 0); ret_val = xmlStreamPop(stream); desret_int(ret_val); call_tests++; des_xmlStreamCtxtPtr(n_stream, stream, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStreamPop", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_stream); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlStreamPush(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlStreamCtxtPtr stream; /* the stream context */ int n_stream; xmlChar * name; /* the current name */ int n_name; xmlChar * ns; /* the namespace name */ int n_ns; for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) { mem_base = xmlMemBlocks(); stream = gen_xmlStreamCtxtPtr(n_stream, 0); name = gen_const_xmlChar_ptr(n_name, 1); ns = gen_const_xmlChar_ptr(n_ns, 2); ret_val = xmlStreamPush(stream, (const xmlChar *)name, (const xmlChar *)ns); desret_int(ret_val); call_tests++; des_xmlStreamCtxtPtr(n_stream, stream, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStreamPush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_stream); printf(" %d", n_name); printf(" %d", n_ns); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlStreamPushAttr(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlStreamCtxtPtr stream; /* the stream context */ int n_stream; xmlChar * name; /* the current name */ int n_name; xmlChar * ns; /* the namespace name */ int n_ns; for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) { mem_base = xmlMemBlocks(); stream = gen_xmlStreamCtxtPtr(n_stream, 0); name = gen_const_xmlChar_ptr(n_name, 1); ns = gen_const_xmlChar_ptr(n_ns, 2); ret_val = xmlStreamPushAttr(stream, (const xmlChar *)name, (const xmlChar *)ns); desret_int(ret_val); call_tests++; des_xmlStreamCtxtPtr(n_stream, stream, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStreamPushAttr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_stream); printf(" %d", n_name); printf(" %d", n_ns); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlStreamPushNode(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlStreamCtxtPtr stream; /* the stream context */ int n_stream; xmlChar * name; /* the current name */ int n_name; xmlChar * ns; /* the namespace name */ int n_ns; int nodeType; /* the type of the node being pushed */ int n_nodeType; for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) { for (n_nodeType = 0;n_nodeType < gen_nb_int;n_nodeType++) { mem_base = xmlMemBlocks(); stream = gen_xmlStreamCtxtPtr(n_stream, 0); name = gen_const_xmlChar_ptr(n_name, 1); ns = gen_const_xmlChar_ptr(n_ns, 2); nodeType = gen_int(n_nodeType, 3); ret_val = xmlStreamPushNode(stream, (const xmlChar *)name, (const xmlChar *)ns, nodeType); desret_int(ret_val); call_tests++; des_xmlStreamCtxtPtr(n_stream, stream, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 2); des_int(n_nodeType, nodeType, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStreamPushNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_stream); printf(" %d", n_name); printf(" %d", n_ns); printf(" %d", n_nodeType); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlStreamWantsAnyNode(void) { int test_ret = 0; #if defined(LIBXML_PATTERN_ENABLED) int mem_base; int ret_val; xmlStreamCtxtPtr streamCtxt; /* the stream context */ int n_streamCtxt; for (n_streamCtxt = 0;n_streamCtxt < gen_nb_xmlStreamCtxtPtr;n_streamCtxt++) { mem_base = xmlMemBlocks(); streamCtxt = gen_xmlStreamCtxtPtr(n_streamCtxt, 0); ret_val = xmlStreamWantsAnyNode(streamCtxt); desret_int(ret_val); call_tests++; des_xmlStreamCtxtPtr(n_streamCtxt, streamCtxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStreamWantsAnyNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_streamCtxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_pattern(void) { int test_ret = 0; if (quiet == 0) printf("Testing pattern : 10 of 15 functions ...\n"); test_ret += test_xmlPatternFromRoot(); test_ret += test_xmlPatternGetStreamCtxt(); test_ret += test_xmlPatternMatch(); test_ret += test_xmlPatternMaxDepth(); test_ret += test_xmlPatternMinDepth(); test_ret += test_xmlPatternStreamable(); test_ret += test_xmlPatterncompile(); test_ret += test_xmlStreamPop(); test_ret += test_xmlStreamPush(); test_ret += test_xmlStreamPushAttr(); test_ret += test_xmlStreamPushNode(); test_ret += test_xmlStreamWantsAnyNode(); if (test_ret != 0) printf("Module pattern: %d errors\n", test_ret); return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlRelaxNGPtr 1 static xmlRelaxNGPtr gen_xmlRelaxNGPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlRelaxNGPtr(int no ATTRIBUTE_UNUSED, xmlRelaxNGPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlRelaxNGDump(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; FILE * output; /* the file output */ int n_output; xmlRelaxNGPtr schema; /* a schema structure */ int n_schema; for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) { for (n_schema = 0;n_schema < gen_nb_xmlRelaxNGPtr;n_schema++) { mem_base = xmlMemBlocks(); output = gen_FILE_ptr(n_output, 0); schema = gen_xmlRelaxNGPtr(n_schema, 1); xmlRelaxNGDump(output, schema); call_tests++; des_FILE_ptr(n_output, output, 0); des_xmlRelaxNGPtr(n_schema, schema, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_schema); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGDumpTree(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; FILE * output; /* the file output */ int n_output; xmlRelaxNGPtr schema; /* a schema structure */ int n_schema; for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) { for (n_schema = 0;n_schema < gen_nb_xmlRelaxNGPtr;n_schema++) { mem_base = xmlMemBlocks(); output = gen_FILE_ptr(n_output, 0); schema = gen_xmlRelaxNGPtr(n_schema, 1); xmlRelaxNGDumpTree(output, schema); call_tests++; des_FILE_ptr(n_output, output, 0); des_xmlRelaxNGPtr(n_schema, schema, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGDumpTree", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_schema); printf("\n"); } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlRelaxNGParserCtxtPtr 1 static xmlRelaxNGParserCtxtPtr gen_xmlRelaxNGParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlRelaxNGParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlRelaxNGParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlRelaxNGValidityErrorFunc_ptr 1 static xmlRelaxNGValidityErrorFunc * gen_xmlRelaxNGValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlRelaxNGValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlRelaxNGValidityErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlRelaxNGValidityWarningFunc_ptr 1 static xmlRelaxNGValidityWarningFunc * gen_xmlRelaxNGValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlRelaxNGValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, xmlRelaxNGValidityWarningFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlRelaxNGGetParserErrors(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGParserCtxtPtr ctxt; /* a Relax-NG validation context */ int n_ctxt; xmlRelaxNGValidityErrorFunc * err; /* the error callback result */ int n_err; xmlRelaxNGValidityWarningFunc * warn; /* the warning callback result */ int n_warn; void ** ctx; /* contextual data for the callbacks result */ int n_ctx; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGParserCtxtPtr;n_ctxt++) { for (n_err = 0;n_err < gen_nb_xmlRelaxNGValidityErrorFunc_ptr;n_err++) { for (n_warn = 0;n_warn < gen_nb_xmlRelaxNGValidityWarningFunc_ptr;n_warn++) { for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGParserCtxtPtr(n_ctxt, 0); err = gen_xmlRelaxNGValidityErrorFunc_ptr(n_err, 1); warn = gen_xmlRelaxNGValidityWarningFunc_ptr(n_warn, 2); ctx = gen_void_ptr_ptr(n_ctx, 3); ret_val = xmlRelaxNGGetParserErrors(ctxt, err, warn, ctx); desret_int(ret_val); call_tests++; des_xmlRelaxNGParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlRelaxNGValidityErrorFunc_ptr(n_err, err, 1); des_xmlRelaxNGValidityWarningFunc_ptr(n_warn, warn, 2); des_void_ptr_ptr(n_ctx, ctx, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGGetParserErrors", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_err); printf(" %d", n_warn); printf(" %d", n_ctx); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlRelaxNGValidCtxtPtr 1 static xmlRelaxNGValidCtxtPtr gen_xmlRelaxNGValidCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlRelaxNGValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlRelaxNGValidCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlRelaxNGGetValidErrors(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGValidCtxtPtr ctxt; /* a Relax-NG validation context */ int n_ctxt; xmlRelaxNGValidityErrorFunc * err; /* the error function result */ int n_err; xmlRelaxNGValidityWarningFunc * warn; /* the warning function result */ int n_warn; void ** ctx; /* the functions context result */ int n_ctx; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) { for (n_err = 0;n_err < gen_nb_xmlRelaxNGValidityErrorFunc_ptr;n_err++) { for (n_warn = 0;n_warn < gen_nb_xmlRelaxNGValidityWarningFunc_ptr;n_warn++) { for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0); err = gen_xmlRelaxNGValidityErrorFunc_ptr(n_err, 1); warn = gen_xmlRelaxNGValidityWarningFunc_ptr(n_warn, 2); ctx = gen_void_ptr_ptr(n_ctx, 3); ret_val = xmlRelaxNGGetValidErrors(ctxt, err, warn, ctx); desret_int(ret_val); call_tests++; des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlRelaxNGValidityErrorFunc_ptr(n_err, err, 1); des_xmlRelaxNGValidityWarningFunc_ptr(n_warn, warn, 2); des_void_ptr_ptr(n_ctx, ctx, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGGetValidErrors", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_err); printf(" %d", n_warn); printf(" %d", n_ctx); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGInitTypes(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; mem_base = xmlMemBlocks(); ret_val = xmlRelaxNGInitTypes(); desret_int(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGInitTypes", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGNewDocParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlRelaxNGParserCtxtPtr ret_val; xmlDocPtr doc; /* a preparsed document tree */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlRelaxNGNewDocParserCtxt(doc); desret_xmlRelaxNGParserCtxtPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGNewDocParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGNewMemParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlRelaxNGParserCtxtPtr ret_val; char * buffer; /* a pointer to a char array containing the schemas */ int n_buffer; int size; /* the size of the array */ int n_size; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); ret_val = xmlRelaxNGNewMemParserCtxt((const char *)buffer, size); desret_xmlRelaxNGParserCtxtPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGNewMemParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGNewParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlRelaxNGParserCtxtPtr ret_val; char * URL; /* the location of the schema */ int n_URL; for (n_URL = 0;n_URL < gen_nb_const_char_ptr;n_URL++) { mem_base = xmlMemBlocks(); URL = gen_const_char_ptr(n_URL, 0); ret_val = xmlRelaxNGNewParserCtxt((const char *)URL); desret_xmlRelaxNGParserCtxtPtr(ret_val); call_tests++; des_const_char_ptr(n_URL, (const char *)URL, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGNewParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGNewValidCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRelaxNGParse(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRelaxNGSetParserErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRelaxNGSetParserStructuredErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRelaxNGSetValidErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRelaxNGSetValidStructuredErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRelaxNGValidateDoc(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGValidCtxtPtr ctxt; /* a Relax-NG validation context */ int n_ctxt; xmlDocPtr doc; /* a parsed document tree */ int n_doc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlRelaxNGValidateDoc(ctxt, doc); desret_int(ret_val); call_tests++; des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGValidateDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGValidateFullElement(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); ret_val = xmlRelaxNGValidateFullElement(ctxt, doc, elem); desret_int(ret_val); call_tests++; des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGValidateFullElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGValidatePopElement(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGValidCtxtPtr ctxt; /* the RelaxNG validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); ret_val = xmlRelaxNGValidatePopElement(ctxt, doc, elem); desret_int(ret_val); call_tests++; des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGValidatePopElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGValidatePushCData(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGValidCtxtPtr ctxt; /* the RelaxNG validation context */ int n_ctxt; xmlChar * data; /* some character data read */ int n_data; int len; /* the length of the data */ int n_len; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) { for (n_data = 0;n_data < gen_nb_const_xmlChar_ptr;n_data++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0); data = gen_const_xmlChar_ptr(n_data, 1); len = gen_int(n_len, 2); ret_val = xmlRelaxNGValidatePushCData(ctxt, (const xmlChar *)data, len); desret_int(ret_val); call_tests++; des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_data, (const xmlChar *)data, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGValidatePushCData", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_data); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxNGValidatePushElement(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); ret_val = xmlRelaxNGValidatePushElement(ctxt, doc, elem); desret_int(ret_val); call_tests++; des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxNGValidatePushElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlRelaxParserSetFlag(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlRelaxNGParserCtxtPtr ctxt; /* a RelaxNG parser context */ int n_ctxt; int flags; /* a set of flags values */ int n_flags; for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGParserCtxtPtr;n_ctxt++) { for (n_flags = 0;n_flags < gen_nb_int;n_flags++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlRelaxNGParserCtxtPtr(n_ctxt, 0); flags = gen_int(n_flags, 1); ret_val = xmlRelaxParserSetFlag(ctxt, flags); desret_int(ret_val); call_tests++; des_xmlRelaxNGParserCtxtPtr(n_ctxt, ctxt, 0); des_int(n_flags, flags, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRelaxParserSetFlag", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_flags); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_relaxng(void) { int test_ret = 0; if (quiet == 0) printf("Testing relaxng : 14 of 24 functions ...\n"); test_ret += test_xmlRelaxNGDump(); test_ret += test_xmlRelaxNGDumpTree(); test_ret += test_xmlRelaxNGGetParserErrors(); test_ret += test_xmlRelaxNGGetValidErrors(); test_ret += test_xmlRelaxNGInitTypes(); test_ret += test_xmlRelaxNGNewDocParserCtxt(); test_ret += test_xmlRelaxNGNewMemParserCtxt(); test_ret += test_xmlRelaxNGNewParserCtxt(); test_ret += test_xmlRelaxNGNewValidCtxt(); test_ret += test_xmlRelaxNGParse(); test_ret += test_xmlRelaxNGSetParserErrors(); test_ret += test_xmlRelaxNGSetParserStructuredErrors(); test_ret += test_xmlRelaxNGSetValidErrors(); test_ret += test_xmlRelaxNGSetValidStructuredErrors(); test_ret += test_xmlRelaxNGValidateDoc(); test_ret += test_xmlRelaxNGValidateFullElement(); test_ret += test_xmlRelaxNGValidatePopElement(); test_ret += test_xmlRelaxNGValidatePushCData(); test_ret += test_xmlRelaxNGValidatePushElement(); test_ret += test_xmlRelaxParserSetFlag(); if (test_ret != 0) printf("Module relaxng: %d errors\n", test_ret); return(test_ret); } static int test_schemasInternals(void) { int test_ret = 0; if (quiet == 0) printf("Testing schemasInternals : 0 of 2 functions ...\n"); if (test_ret != 0) printf("Module schemasInternals: %d errors\n", test_ret); return(test_ret); } static int test_xmlSchematronNewDocParserCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchematronNewMemParserCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchematronNewParserCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_SCHEMATRON_ENABLED #define gen_nb_xmlSchematronPtr 1 static xmlSchematronPtr gen_xmlSchematronPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchematronPtr(int no ATTRIBUTE_UNUSED, xmlSchematronPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchematronNewValidCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_SCHEMATRON_ENABLED #define gen_nb_xmlSchematronParserCtxtPtr 1 static xmlSchematronParserCtxtPtr gen_xmlSchematronParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchematronParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSchematronParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchematronParse(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_SCHEMATRON_ENABLED #define gen_nb_xmlSchematronValidCtxtPtr 1 static xmlSchematronValidCtxtPtr gen_xmlSchematronValidCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchematronValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSchematronValidCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchematronSetValidStructuredErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchematronValidateDoc(void) { int test_ret = 0; #if defined(LIBXML_SCHEMATRON_ENABLED) int mem_base; int ret_val; xmlSchematronValidCtxtPtr ctxt; /* the schema validation context */ int n_ctxt; xmlDocPtr instance; /* the document instace tree */ int n_instance; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchematronValidCtxtPtr;n_ctxt++) { for (n_instance = 0;n_instance < gen_nb_xmlDocPtr;n_instance++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchematronValidCtxtPtr(n_ctxt, 0); instance = gen_xmlDocPtr(n_instance, 1); ret_val = xmlSchematronValidateDoc(ctxt, instance); desret_int(ret_val); call_tests++; des_xmlSchematronValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_instance, instance, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchematronValidateDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_instance); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_schematron(void) { int test_ret = 0; if (quiet == 0) printf("Testing schematron : 1 of 10 functions ...\n"); test_ret += test_xmlSchematronNewDocParserCtxt(); test_ret += test_xmlSchematronNewMemParserCtxt(); test_ret += test_xmlSchematronNewParserCtxt(); test_ret += test_xmlSchematronNewValidCtxt(); test_ret += test_xmlSchematronParse(); test_ret += test_xmlSchematronSetValidStructuredErrors(); test_ret += test_xmlSchematronValidateDoc(); if (test_ret != 0) printf("Module schematron: %d errors\n", test_ret); return(test_ret); } static int test_xmlAddChild(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; xmlNodePtr cur; /* the child node */ int n_cur; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr_in;n_cur++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); cur = gen_xmlNodePtr_in(n_cur, 1); ret_val = xmlAddChild(parent, cur); if (ret_val == NULL) { xmlFreeNode(cur) ; cur = NULL ; } desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); des_xmlNodePtr_in(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddChild", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlAddChildList(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; xmlNodePtr cur; /* the first node in the list */ int n_cur; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr_in;n_cur++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); cur = gen_xmlNodePtr_in(n_cur, 1); ret_val = xmlAddChildList(parent, cur); if (ret_val == NULL) { xmlFreeNodeList(cur) ; cur = NULL ; } desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); des_xmlNodePtr_in(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddChildList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlAddNextSibling(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr cur; /* the child node */ int n_cur; xmlNodePtr elem; /* the new node */ int n_elem; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr_in;n_elem++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); elem = gen_xmlNodePtr_in(n_elem, 1); ret_val = xmlAddNextSibling(cur, elem); if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; } desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_xmlNodePtr_in(n_elem, elem, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddNextSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_elem); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlAddPrevSibling(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlNodePtr ret_val; xmlNodePtr cur; /* the child node */ int n_cur; xmlNodePtr elem; /* the new node */ int n_elem; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr_in;n_elem++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); elem = gen_xmlNodePtr_in(n_elem, 1); ret_val = xmlAddPrevSibling(cur, elem); if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; } desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_xmlNodePtr_in(n_elem, elem, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddPrevSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_elem); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlAddSibling(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr cur; /* the child node */ int n_cur; xmlNodePtr elem; /* the new node */ int n_elem; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr_in;n_elem++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); elem = gen_xmlNodePtr_in(n_elem, 1); ret_val = xmlAddSibling(cur, elem); if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; } desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_xmlNodePtr_in(n_elem, elem, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_elem); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlAttrSerializeTxtContent(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) #ifdef LIBXML_OUTPUT_ENABLED int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlDocPtr doc; /* the document */ int n_doc; xmlAttrPtr attr; /* the attribute node */ int n_attr; xmlChar * string; /* the text content */ int n_string; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); doc = gen_xmlDocPtr(n_doc, 1); attr = gen_xmlAttrPtr(n_attr, 2); string = gen_const_xmlChar_ptr(n_string, 3); xmlAttrSerializeTxtContent(buf, doc, attr, (const xmlChar *)string); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlAttrPtr(n_attr, attr, 2); des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAttrSerializeTxtContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_doc); printf(" %d", n_attr); printf(" %d", n_string); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } #define gen_nb_const_xmlBufPtr 1 static xmlBufPtr gen_const_xmlBufPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlBufPtr(int no ATTRIBUTE_UNUSED, const xmlBufPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlBufContent(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlBufPtr buf; /* the buffer */ int n_buf; for (n_buf = 0;n_buf < gen_nb_const_xmlBufPtr;n_buf++) { mem_base = xmlMemBlocks(); buf = gen_const_xmlBufPtr(n_buf, 0); ret_val = xmlBufContent((const xmlBufPtr)buf); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlBufPtr(n_buf, (const xmlBufPtr)buf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlBufEnd(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlBufPtr buf; /* the buffer */ int n_buf; for (n_buf = 0;n_buf < gen_nb_const_xmlBufPtr;n_buf++) { mem_base = xmlMemBlocks(); buf = gen_const_xmlBufPtr(n_buf, 0); ret_val = xmlBufEnd((const xmlBufPtr)buf); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlBufPtr(n_buf, (const xmlBufPtr)buf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufEnd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf("\n"); } } function_tests++; return(test_ret); } #define gen_nb_xmlBufPtr 1 static xmlBufPtr gen_xmlBufPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlBufPtr(int no ATTRIBUTE_UNUSED, xmlBufPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlBufGetNodeContent(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufPtr buf; /* a buffer xmlBufPtr */ int n_buf; xmlNodePtr cur; /* the node being read */ int n_cur; for (n_buf = 0;n_buf < gen_nb_xmlBufPtr;n_buf++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufPtr(n_buf, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlBufGetNodeContent(buf, cur); desret_int(ret_val); call_tests++; des_xmlBufPtr(n_buf, buf, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufGetNodeContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufNodeDump(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlBufShrink(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlBufUse(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlBufferAdd(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer to dump */ int n_buf; xmlChar * str; /* the #xmlChar string */ int n_str; int len; /* the number of #xmlChar to add */ int n_len; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); str = gen_const_xmlChar_ptr(n_str, 1); len = gen_int(n_len, 2); ret_val = xmlBufferAdd(buf, (const xmlChar *)str, len); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferAdd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_str); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlBufferAddHead(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer */ int n_buf; xmlChar * str; /* the #xmlChar string */ int n_str; int len; /* the number of #xmlChar to add */ int n_len; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); str = gen_const_xmlChar_ptr(n_str, 1); len = gen_int(n_len, 2); ret_val = xmlBufferAddHead(buf, (const xmlChar *)str, len); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferAddHead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_str); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlBufferCCat(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer to dump */ int n_buf; char * str; /* the C char string */ int n_str; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_str = 0;n_str < gen_nb_const_char_ptr;n_str++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); str = gen_const_char_ptr(n_str, 1); ret_val = xmlBufferCCat(buf, (const char *)str); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_const_char_ptr(n_str, (const char *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferCCat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_str); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufferCat(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer to add to */ int n_buf; xmlChar * str; /* the #xmlChar string */ int n_str; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); str = gen_const_xmlChar_ptr(n_str, 1); ret_val = xmlBufferCat(buf, (const xmlChar *)str); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferCat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_str); printf("\n"); } } } function_tests++; return(test_ret); } #define gen_nb_const_xmlBufferPtr 1 static xmlBufferPtr gen_const_xmlBufferPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_const_xmlBufferPtr(int no ATTRIBUTE_UNUSED, const xmlBufferPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlBufferContent(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlBufferPtr buf; /* the buffer */ int n_buf; for (n_buf = 0;n_buf < gen_nb_const_xmlBufferPtr;n_buf++) { mem_base = xmlMemBlocks(); buf = gen_const_xmlBufferPtr(n_buf, 0); ret_val = xmlBufferContent((const xmlBufferPtr)buf); desret_const_xmlChar_ptr(ret_val); call_tests++; des_const_xmlBufferPtr(n_buf, (const xmlBufferPtr)buf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlBufferCreate(void) { int test_ret = 0; int mem_base; xmlBufferPtr ret_val; mem_base = xmlMemBlocks(); ret_val = xmlBufferCreate(); desret_xmlBufferPtr(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferCreate", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlBufferCreateSize(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlBufferCreateStatic(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlBufferDetach(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlBufferPtr buf; /* the buffer */ int n_buf; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); ret_val = xmlBufferDetach(buf); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferDetach", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlBufferEmpty(void) { int test_ret = 0; int mem_base; xmlBufferPtr buf; /* the buffer */ int n_buf; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); xmlBufferEmpty(buf); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferEmpty", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlBufferGrow(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer */ int n_buf; unsigned int len; /* the minimum free size to allocate */ int n_len; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_len = 0;n_len < gen_nb_unsigned_int;n_len++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); len = gen_unsigned_int(n_len, 1); ret_val = xmlBufferGrow(buf, len); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_unsigned_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferGrow", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufferLength(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer */ int n_buf; for (n_buf = 0;n_buf < gen_nb_const_xmlBufferPtr;n_buf++) { mem_base = xmlMemBlocks(); buf = gen_const_xmlBufferPtr(n_buf, 0); ret_val = xmlBufferLength((const xmlBufferPtr)buf); desret_int(ret_val); call_tests++; des_const_xmlBufferPtr(n_buf, (const xmlBufferPtr)buf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferLength", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlBufferResize(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer to resize */ int n_buf; unsigned int size; /* the desired size */ int n_size; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_size = 0;n_size < gen_nb_unsigned_int;n_size++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); size = gen_unsigned_int(n_size, 1); ret_val = xmlBufferResize(buf, size); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_unsigned_int(n_size, size, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferResize", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_size); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufferSetAllocationScheme(void) { int test_ret = 0; int mem_base; xmlBufferPtr buf; /* the buffer to tune */ int n_buf; xmlBufferAllocationScheme scheme; /* allocation scheme to use */ int n_scheme; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_scheme = 0;n_scheme < gen_nb_xmlBufferAllocationScheme;n_scheme++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); scheme = gen_xmlBufferAllocationScheme(n_scheme, 1); xmlBufferSetAllocationScheme(buf, scheme); if ((buf != NULL) && (scheme == XML_BUFFER_ALLOC_IMMUTABLE) && (buf->content != NULL) && (buf->content != static_buf_content)) { xmlFree(buf->content); buf->content = NULL;} call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlBufferAllocationScheme(n_scheme, scheme, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferSetAllocationScheme", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_scheme); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufferShrink(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buf; /* the buffer to dump */ int n_buf; unsigned int len; /* the number of xmlChar to remove */ int n_len; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_len = 0;n_len < gen_nb_unsigned_int;n_len++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); len = gen_unsigned_int(n_len, 1); ret_val = xmlBufferShrink(buf, len); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_unsigned_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferShrink", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufferWriteCHAR(void) { int test_ret = 0; int mem_base; xmlBufferPtr buf; /* the XML buffer */ int n_buf; xmlChar * string; /* the string to add */ int n_string; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); string = gen_const_xmlChar_ptr(n_string, 1); xmlBufferWriteCHAR(buf, (const xmlChar *)string); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferWriteCHAR", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_string); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufferWriteChar(void) { int test_ret = 0; int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; char * string; /* the string to add */ int n_string; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_string = 0;n_string < gen_nb_const_char_ptr;n_string++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); string = gen_const_char_ptr(n_string, 1); xmlBufferWriteChar(buf, (const char *)string); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_const_char_ptr(n_string, (const char *)string, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferWriteChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_string); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBufferWriteQuotedString(void) { int test_ret = 0; int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlChar * string; /* the string to add */ int n_string; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); string = gen_const_xmlChar_ptr(n_string, 1); xmlBufferWriteQuotedString(buf, (const xmlChar *)string); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBufferWriteQuotedString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_string); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBuildQName(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * ncname; /* the Name */ int n_ncname; xmlChar * prefix; /* the prefix */ int n_prefix; xmlChar * memory; /* preallocated memory */ int n_memory; int len; /* preallocated memory length */ int n_len; for (n_ncname = 0;n_ncname < gen_nb_const_xmlChar_ptr;n_ncname++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_memory = 0;n_memory < gen_nb_xmlChar_ptr;n_memory++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ncname = gen_const_xmlChar_ptr(n_ncname, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); memory = gen_xmlChar_ptr(n_memory, 2); len = gen_int(n_len, 3); ret_val = xmlBuildQName((const xmlChar *)ncname, (const xmlChar *)prefix, memory, len); if ((ret_val != NULL) && (ret_val != ncname) && (ret_val != prefix) && (ret_val != memory)) xmlFree(ret_val); ret_val = NULL; desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_ncname, (const xmlChar *)ncname, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_xmlChar_ptr(n_memory, memory, 2); des_int(n_len, len, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBuildQName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ncname); printf(" %d", n_prefix); printf(" %d", n_memory); printf(" %d", n_len); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlChildElementCount(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; unsigned long ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); ret_val = xmlChildElementCount(parent); desret_unsigned_long(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlChildElementCount", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCopyDoc(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlDocPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; int recursive; /* if not zero do a recursive copy. */ int n_recursive; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_recursive = 0;n_recursive < gen_nb_int;n_recursive++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); recursive = gen_int(n_recursive, 1); ret_val = xmlCopyDoc(doc, recursive); desret_xmlDocPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_int(n_recursive, recursive, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_recursive); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlCopyDtd(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlDtdPtr ret_val; xmlDtdPtr dtd; /* the dtd */ int n_dtd; for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { mem_base = xmlMemBlocks(); dtd = gen_xmlDtdPtr(n_dtd, 0); ret_val = xmlCopyDtd(dtd); desret_xmlDtdPtr(ret_val); call_tests++; des_xmlDtdPtr(n_dtd, dtd, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyDtd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dtd); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlCopyNamespace(void) { int test_ret = 0; int mem_base; xmlNsPtr ret_val; xmlNsPtr cur; /* the namespace */ int n_cur; for (n_cur = 0;n_cur < gen_nb_xmlNsPtr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_xmlNsPtr(n_cur, 0); ret_val = xmlCopyNamespace(cur); if (ret_val != NULL) xmlFreeNs(ret_val); desret_xmlNsPtr(ret_val); call_tests++; des_xmlNsPtr(n_cur, cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyNamespace", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCopyNamespaceList(void) { int test_ret = 0; int mem_base; xmlNsPtr ret_val; xmlNsPtr cur; /* the first namespace */ int n_cur; for (n_cur = 0;n_cur < gen_nb_xmlNsPtr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_xmlNsPtr(n_cur, 0); ret_val = xmlCopyNamespaceList(cur); if (ret_val != NULL) xmlFreeNsList(ret_val); desret_xmlNsPtr(ret_val); call_tests++; des_xmlNsPtr(n_cur, cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyNamespaceList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCopyNode(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr node; /* the node */ int n_node; int extended; /* if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable) */ int n_extended; for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) { for (n_extended = 0;n_extended < gen_nb_int;n_extended++) { mem_base = xmlMemBlocks(); node = gen_const_xmlNodePtr(n_node, 0); extended = gen_int(n_extended, 1); ret_val = xmlCopyNode((const xmlNodePtr)node, extended); desret_xmlNodePtr(ret_val); call_tests++; des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 0); des_int(n_extended, extended, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_extended); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCopyNodeList(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr node; /* the first node in the list. */ int n_node; for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_const_xmlNodePtr(n_node, 0); ret_val = xmlCopyNodeList((const xmlNodePtr)node); desret_xmlNodePtr(ret_val); call_tests++; des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyNodeList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCopyProp(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlNodePtr target; /* the element where the attribute will be grafted */ int n_target; xmlAttrPtr cur; /* the attribute */ int n_cur; for (n_target = 0;n_target < gen_nb_xmlNodePtr;n_target++) { for (n_cur = 0;n_cur < gen_nb_xmlAttrPtr;n_cur++) { mem_base = xmlMemBlocks(); target = gen_xmlNodePtr(n_target, 0); cur = gen_xmlAttrPtr(n_cur, 1); ret_val = xmlCopyProp(target, cur); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_target, target, 0); des_xmlAttrPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_target); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCopyPropList(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlNodePtr target; /* the element where the attributes will be grafted */ int n_target; xmlAttrPtr cur; /* the first attribute */ int n_cur; for (n_target = 0;n_target < gen_nb_xmlNodePtr;n_target++) { for (n_cur = 0;n_cur < gen_nb_xmlAttrPtr;n_cur++) { mem_base = xmlMemBlocks(); target = gen_xmlNodePtr(n_target, 0); cur = gen_xmlAttrPtr(n_cur, 1); ret_val = xmlCopyPropList(target, cur); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_target, target, 0); des_xmlAttrPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyPropList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_target); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCreateIntSubset(void) { int test_ret = 0; int mem_base; xmlDtdPtr ret_val; xmlDocPtr doc; /* the document pointer */ int n_doc; xmlChar * name; /* the DTD name */ int n_name; xmlChar * ExternalID; /* the external (PUBLIC) ID */ int n_ExternalID; xmlChar * SystemID; /* the system ID */ int n_SystemID; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2); SystemID = gen_const_xmlChar_ptr(n_SystemID, 3); ret_val = xmlCreateIntSubset(doc, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID); desret_xmlDtdPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCreateIntSubset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf("\n"); } } } } } function_tests++; return(test_ret); } #define gen_nb_xmlDOMWrapCtxtPtr 1 static xmlDOMWrapCtxtPtr gen_xmlDOMWrapCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlDOMWrapCtxtPtr(int no ATTRIBUTE_UNUSED, xmlDOMWrapCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlDOMWrapAdoptNode(void) { int test_ret = 0; int mem_base; int ret_val; xmlDOMWrapCtxtPtr ctxt; /* the optional context for custom processing */ int n_ctxt; xmlDocPtr sourceDoc; /* the optional sourceDoc */ int n_sourceDoc; xmlNodePtr node; /* the node to start with */ int n_node; xmlDocPtr destDoc; /* the destination doc */ int n_destDoc; xmlNodePtr destParent; /* the optional new parent of @node in @destDoc */ int n_destParent; int options; /* option flags */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) { for (n_sourceDoc = 0;n_sourceDoc < gen_nb_xmlDocPtr;n_sourceDoc++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_destDoc = 0;n_destDoc < gen_nb_xmlDocPtr;n_destDoc++) { for (n_destParent = 0;n_destParent < gen_nb_xmlNodePtr;n_destParent++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0); sourceDoc = gen_xmlDocPtr(n_sourceDoc, 1); node = gen_xmlNodePtr(n_node, 2); destDoc = gen_xmlDocPtr(n_destDoc, 3); destParent = gen_xmlNodePtr(n_destParent, 4); options = gen_int(n_options, 5); ret_val = xmlDOMWrapAdoptNode(ctxt, sourceDoc, node, destDoc, destParent, options); if ((node != NULL) && (node->parent == NULL)) {xmlUnlinkNode(node);xmlFreeNode(node);node = NULL;} desret_int(ret_val); call_tests++; des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_sourceDoc, sourceDoc, 1); des_xmlNodePtr(n_node, node, 2); des_xmlDocPtr(n_destDoc, destDoc, 3); des_xmlNodePtr(n_destParent, destParent, 4); des_int(n_options, options, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDOMWrapAdoptNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_sourceDoc); printf(" %d", n_node); printf(" %d", n_destDoc); printf(" %d", n_destParent); printf(" %d", n_options); printf("\n"); } } } } } } } function_tests++; return(test_ret); } static int test_xmlDOMWrapCloneNode(void) { int test_ret = 0; int mem_base; int ret_val; xmlDOMWrapCtxtPtr ctxt; /* the optional context for custom processing */ int n_ctxt; xmlDocPtr sourceDoc; /* the optional sourceDoc */ int n_sourceDoc; xmlNodePtr node; /* the node to start with */ int n_node; xmlNodePtr * resNode; /* the clone of the given @node */ int n_resNode; xmlDocPtr destDoc; /* the destination doc */ int n_destDoc; xmlNodePtr destParent; /* the optional new parent of @node in @destDoc */ int n_destParent; int deep; /* descend into child if set */ int n_deep; int options; /* option flags */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) { for (n_sourceDoc = 0;n_sourceDoc < gen_nb_xmlDocPtr;n_sourceDoc++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_resNode = 0;n_resNode < gen_nb_xmlNodePtr_ptr;n_resNode++) { for (n_destDoc = 0;n_destDoc < gen_nb_xmlDocPtr;n_destDoc++) { for (n_destParent = 0;n_destParent < gen_nb_xmlNodePtr;n_destParent++) { for (n_deep = 0;n_deep < gen_nb_int;n_deep++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0); sourceDoc = gen_xmlDocPtr(n_sourceDoc, 1); node = gen_xmlNodePtr(n_node, 2); resNode = gen_xmlNodePtr_ptr(n_resNode, 3); destDoc = gen_xmlDocPtr(n_destDoc, 4); destParent = gen_xmlNodePtr(n_destParent, 5); deep = gen_int(n_deep, 6); options = gen_int(n_options, 7); ret_val = xmlDOMWrapCloneNode(ctxt, sourceDoc, node, resNode, destDoc, destParent, deep, options); desret_int(ret_val); call_tests++; des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_sourceDoc, sourceDoc, 1); des_xmlNodePtr(n_node, node, 2); des_xmlNodePtr_ptr(n_resNode, resNode, 3); des_xmlDocPtr(n_destDoc, destDoc, 4); des_xmlNodePtr(n_destParent, destParent, 5); des_int(n_deep, deep, 6); des_int(n_options, options, 7); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDOMWrapCloneNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_sourceDoc); printf(" %d", n_node); printf(" %d", n_resNode); printf(" %d", n_destDoc); printf(" %d", n_destParent); printf(" %d", n_deep); printf(" %d", n_options); printf("\n"); } } } } } } } } } function_tests++; return(test_ret); } static int test_xmlDOMWrapNewCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlDOMWrapReconcileNamespaces(void) { int test_ret = 0; int mem_base; int ret_val; xmlDOMWrapCtxtPtr ctxt; /* DOM wrapper context, unused at the moment */ int n_ctxt; xmlNodePtr elem; /* the element-node */ int n_elem; int options; /* option flags */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0); elem = gen_xmlNodePtr(n_elem, 1); options = gen_int(n_options, 2); ret_val = xmlDOMWrapReconcileNamespaces(ctxt, elem, options); desret_int(ret_val); call_tests++; des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_elem, elem, 1); des_int(n_options, options, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDOMWrapReconcileNamespaces", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_elem); printf(" %d", n_options); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlDOMWrapRemoveNode(void) { int test_ret = 0; int mem_base; int ret_val; xmlDOMWrapCtxtPtr ctxt; /* a DOM wrapper context */ int n_ctxt; xmlDocPtr doc; /* the doc */ int n_doc; xmlNodePtr node; /* the node to be removed. */ int n_node; int options; /* set of options, unused at the moment */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); node = gen_xmlNodePtr(n_node, 2); options = gen_int(n_options, 3); ret_val = xmlDOMWrapRemoveNode(ctxt, doc, node, options); desret_int(ret_val); call_tests++; des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_node, node, 2); des_int(n_options, options, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDOMWrapRemoveNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_node); printf(" %d", n_options); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlDocCopyNode(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr node; /* the node */ int n_node; xmlDocPtr doc; /* the document */ int n_doc; int extended; /* if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable) */ int n_extended; for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_extended = 0;n_extended < gen_nb_int;n_extended++) { mem_base = xmlMemBlocks(); node = gen_const_xmlNodePtr(n_node, 0); doc = gen_xmlDocPtr(n_doc, 1); extended = gen_int(n_extended, 2); ret_val = xmlDocCopyNode((const xmlNodePtr)node, doc, extended); desret_xmlNodePtr(ret_val); call_tests++; des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 0); des_xmlDocPtr(n_doc, doc, 1); des_int(n_extended, extended, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocCopyNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_doc); printf(" %d", n_extended); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlDocCopyNodeList(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the target document */ int n_doc; xmlNodePtr node; /* the first node in the list. */ int n_node; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); node = gen_const_xmlNodePtr(n_node, 1); ret_val = xmlDocCopyNodeList(doc, (const xmlNodePtr)node); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocCopyNodeList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_node); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlDocDump(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; FILE * f; /* the FILE* */ int n_f; xmlDocPtr cur; /* the document */ int n_cur; for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { mem_base = xmlMemBlocks(); f = gen_FILE_ptr(n_f, 0); cur = gen_xmlDocPtr(n_cur, 1); ret_val = xmlDocDump(f, cur); desret_int(ret_val); call_tests++; des_FILE_ptr(n_f, f, 0); des_xmlDocPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_f); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDocDumpFormatMemory(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlDocPtr cur; /* the document */ int n_cur; xmlChar ** mem; /* OUT: the memory pointer */ int n_mem; int * size; /* OUT: the memory length */ int n_size; int format; /* should formatting spaces been added */ int n_format; for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) { for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); cur = gen_xmlDocPtr(n_cur, 0); mem = gen_xmlChar_ptr_ptr(n_mem, 1); size = gen_int_ptr(n_size, 2); format = gen_int(n_format, 3); xmlDocDumpFormatMemory(cur, mem, size, format); call_tests++; des_xmlDocPtr(n_cur, cur, 0); des_xmlChar_ptr_ptr(n_mem, mem, 1); des_int_ptr(n_size, size, 2); des_int(n_format, format, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocDumpFormatMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_mem); printf(" %d", n_size); printf(" %d", n_format); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlDocDumpFormatMemoryEnc(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlDocPtr out_doc; /* Document to generate XML text from */ int n_out_doc; xmlChar ** doc_txt_ptr; /* Memory pointer for allocated XML text */ int n_doc_txt_ptr; int * doc_txt_len; /* Length of the generated XML text */ int n_doc_txt_len; char * txt_encoding; /* Character encoding to use when generating XML text */ int n_txt_encoding; int format; /* should formatting spaces been added */ int n_format; for (n_out_doc = 0;n_out_doc < gen_nb_xmlDocPtr;n_out_doc++) { for (n_doc_txt_ptr = 0;n_doc_txt_ptr < gen_nb_xmlChar_ptr_ptr;n_doc_txt_ptr++) { for (n_doc_txt_len = 0;n_doc_txt_len < gen_nb_int_ptr;n_doc_txt_len++) { for (n_txt_encoding = 0;n_txt_encoding < gen_nb_const_char_ptr;n_txt_encoding++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); out_doc = gen_xmlDocPtr(n_out_doc, 0); doc_txt_ptr = gen_xmlChar_ptr_ptr(n_doc_txt_ptr, 1); doc_txt_len = gen_int_ptr(n_doc_txt_len, 2); txt_encoding = gen_const_char_ptr(n_txt_encoding, 3); format = gen_int(n_format, 4); xmlDocDumpFormatMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len, (const char *)txt_encoding, format); call_tests++; des_xmlDocPtr(n_out_doc, out_doc, 0); des_xmlChar_ptr_ptr(n_doc_txt_ptr, doc_txt_ptr, 1); des_int_ptr(n_doc_txt_len, doc_txt_len, 2); des_const_char_ptr(n_txt_encoding, (const char *)txt_encoding, 3); des_int(n_format, format, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocDumpFormatMemoryEnc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out_doc); printf(" %d", n_doc_txt_ptr); printf(" %d", n_doc_txt_len); printf(" %d", n_txt_encoding); printf(" %d", n_format); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlDocDumpMemory(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlDocPtr cur; /* the document */ int n_cur; xmlChar ** mem; /* OUT: the memory pointer */ int n_mem; int * size; /* OUT: the memory length */ int n_size; for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) { for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) { mem_base = xmlMemBlocks(); cur = gen_xmlDocPtr(n_cur, 0); mem = gen_xmlChar_ptr_ptr(n_mem, 1); size = gen_int_ptr(n_size, 2); xmlDocDumpMemory(cur, mem, size); call_tests++; des_xmlDocPtr(n_cur, cur, 0); des_xmlChar_ptr_ptr(n_mem, mem, 1); des_int_ptr(n_size, size, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocDumpMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_mem); printf(" %d", n_size); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlDocDumpMemoryEnc(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlDocPtr out_doc; /* Document to generate XML text from */ int n_out_doc; xmlChar ** doc_txt_ptr; /* Memory pointer for allocated XML text */ int n_doc_txt_ptr; int * doc_txt_len; /* Length of the generated XML text */ int n_doc_txt_len; char * txt_encoding; /* Character encoding to use when generating XML text */ int n_txt_encoding; for (n_out_doc = 0;n_out_doc < gen_nb_xmlDocPtr;n_out_doc++) { for (n_doc_txt_ptr = 0;n_doc_txt_ptr < gen_nb_xmlChar_ptr_ptr;n_doc_txt_ptr++) { for (n_doc_txt_len = 0;n_doc_txt_len < gen_nb_int_ptr;n_doc_txt_len++) { for (n_txt_encoding = 0;n_txt_encoding < gen_nb_const_char_ptr;n_txt_encoding++) { mem_base = xmlMemBlocks(); out_doc = gen_xmlDocPtr(n_out_doc, 0); doc_txt_ptr = gen_xmlChar_ptr_ptr(n_doc_txt_ptr, 1); doc_txt_len = gen_int_ptr(n_doc_txt_len, 2); txt_encoding = gen_const_char_ptr(n_txt_encoding, 3); xmlDocDumpMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len, (const char *)txt_encoding); call_tests++; des_xmlDocPtr(n_out_doc, out_doc, 0); des_xmlChar_ptr_ptr(n_doc_txt_ptr, doc_txt_ptr, 1); des_int_ptr(n_doc_txt_len, doc_txt_len, 2); des_const_char_ptr(n_txt_encoding, (const char *)txt_encoding, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocDumpMemoryEnc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out_doc); printf(" %d", n_doc_txt_ptr); printf(" %d", n_doc_txt_len); printf(" %d", n_txt_encoding); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlDocFormatDump(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; FILE * f; /* the FILE* */ int n_f; xmlDocPtr cur; /* the document */ int n_cur; int format; /* should formatting spaces been added */ int n_format; for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); f = gen_FILE_ptr(n_f, 0); cur = gen_xmlDocPtr(n_cur, 1); format = gen_int(n_format, 2); ret_val = xmlDocFormatDump(f, cur, format); desret_int(ret_val); call_tests++; des_FILE_ptr(n_f, f, 0); des_xmlDocPtr(n_cur, cur, 1); des_int(n_format, format, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocFormatDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_f); printf(" %d", n_cur); printf(" %d", n_format); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlDocGetRootElement(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlDocGetRootElement(doc); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocGetRootElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlDocSetRootElement(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr root; /* the new document root element, if root is NULL no action is taken, to remove a node from a document use xmlUnlinkNode(root) instead. */ int n_root; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_root = 0;n_root < gen_nb_xmlNodePtr_in;n_root++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); root = gen_xmlNodePtr_in(n_root, 1); ret_val = xmlDocSetRootElement(doc, root); if (doc == NULL) { xmlFreeNode(root) ; root = NULL ; } desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr_in(n_root, root, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDocSetRootElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_root); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlElemDump(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; FILE * f; /* the FILE * for the output */ int n_f; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); f = gen_FILE_ptr(n_f, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); xmlElemDump(f, doc, cur); call_tests++; des_FILE_ptr(n_f, f, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlElemDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_f); printf(" %d", n_doc); printf(" %d", n_cur); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlFirstElementChild(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); ret_val = xmlFirstElementChild(parent); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlFirstElementChild", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlGetBufferAllocationScheme(void) { int test_ret = 0; int mem_base; xmlBufferAllocationScheme ret_val; mem_base = xmlMemBlocks(); ret_val = xmlGetBufferAllocationScheme(); desret_xmlBufferAllocationScheme(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetBufferAllocationScheme", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlGetCompressMode(void) { int test_ret = 0; int mem_base; int ret_val; mem_base = xmlMemBlocks(); ret_val = xmlGetCompressMode(); desret_int(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetCompressMode", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlGetDocCompressMode(void) { int test_ret = 0; int mem_base; int ret_val; xmlDocPtr doc; /* the document */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlGetDocCompressMode(doc); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetDocCompressMode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlGetIntSubset(void) { int test_ret = 0; int mem_base; xmlDtdPtr ret_val; xmlDocPtr doc; /* the document pointer */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlGetIntSubset(doc); desret_xmlDtdPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetIntSubset", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlGetLastChild(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); ret_val = xmlGetLastChild(parent); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetLastChild", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlGetLineNo(void) { int test_ret = 0; int mem_base; long ret_val; xmlNodePtr node; /* valid node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlGetLineNo(node); desret_long(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetLineNo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlGetNoNsProp(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * name; /* the attribute name */ int n_name; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlGetNoNsProp(node, (const xmlChar *)name); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetNoNsProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetNodePath(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) int mem_base; xmlChar * ret_val; xmlNodePtr node; /* a node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlGetNodePath(node); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetNodePath", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlGetNsList(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlGetNsProp(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * name; /* the attribute name */ int n_name; xmlChar * nameSpace; /* the URI of the namespace */ int n_nameSpace; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_nameSpace = 0;n_nameSpace < gen_nb_const_xmlChar_ptr;n_nameSpace++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); nameSpace = gen_const_xmlChar_ptr(n_nameSpace, 2); ret_val = xmlGetNsProp(node, (const xmlChar *)name, (const xmlChar *)nameSpace); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_nameSpace, (const xmlChar *)nameSpace, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetNsProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf(" %d", n_nameSpace); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlGetProp(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * name; /* the attribute name */ int n_name; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlGetProp(node, (const xmlChar *)name); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlHasNsProp(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * name; /* the attribute name */ int n_name; xmlChar * nameSpace; /* the URI of the namespace */ int n_nameSpace; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_nameSpace = 0;n_nameSpace < gen_nb_const_xmlChar_ptr;n_nameSpace++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); nameSpace = gen_const_xmlChar_ptr(n_nameSpace, 2); ret_val = xmlHasNsProp(node, (const xmlChar *)name, (const xmlChar *)nameSpace); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_nameSpace, (const xmlChar *)nameSpace, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHasNsProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf(" %d", n_nameSpace); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlHasProp(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * name; /* the attribute name */ int n_name; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlHasProp(node, (const xmlChar *)name); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlHasProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlIsBlankNode(void) { int test_ret = 0; int mem_base; int ret_val; xmlNodePtr node; /* the node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlIsBlankNode(node); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsBlankNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlIsXHTML(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * systemID; /* the system identifier */ int n_systemID; xmlChar * publicID; /* the public identifier */ int n_publicID; for (n_systemID = 0;n_systemID < gen_nb_const_xmlChar_ptr;n_systemID++) { for (n_publicID = 0;n_publicID < gen_nb_const_xmlChar_ptr;n_publicID++) { mem_base = xmlMemBlocks(); systemID = gen_const_xmlChar_ptr(n_systemID, 0); publicID = gen_const_xmlChar_ptr(n_publicID, 1); ret_val = xmlIsXHTML((const xmlChar *)systemID, (const xmlChar *)publicID); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_systemID, (const xmlChar *)systemID, 0); des_const_xmlChar_ptr(n_publicID, (const xmlChar *)publicID, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsXHTML", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_systemID); printf(" %d", n_publicID); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlLastElementChild(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); ret_val = xmlLastElementChild(parent); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlLastElementChild", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNewCDataBlock(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * content; /* the CDATA block content content */ int n_content; int len; /* the length of the block */ int n_len; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); ret_val = xmlNewCDataBlock(doc, (const xmlChar *)content, len); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewCDataBlock", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_content); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewCharRef(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the char ref string, starting with # or "&# ... ;" */ int n_name; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlNewCharRef(doc, (const xmlChar *)name); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewCharRef", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewChild(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; xmlNodePtr ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; xmlNsPtr ns; /* a namespace if any */ int n_ns; xmlChar * name; /* the name of the child */ int n_name; xmlChar * content; /* the XML content of the child if any. */ int n_content; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_const_xmlChar_ptr(n_name, 2); content = gen_const_xmlChar_ptr(n_content, 3); ret_val = xmlNewChild(parent, ns, (const xmlChar *)name, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); des_xmlNsPtr(n_ns, ns, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewChild", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlNewComment(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlChar * content; /* the comment content */ int n_content; for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); content = gen_const_xmlChar_ptr(n_content, 0); ret_val = xmlNewComment((const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewComment", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_content); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNewDoc(void) { int test_ret = 0; int mem_base; xmlDocPtr ret_val; xmlChar * version; /* xmlChar string giving the version of XML "1.0" */ int n_version; for (n_version = 0;n_version < gen_nb_const_xmlChar_ptr;n_version++) { mem_base = xmlMemBlocks(); version = gen_const_xmlChar_ptr(n_version, 0); ret_val = xmlNewDoc((const xmlChar *)version); desret_xmlDocPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_version, (const xmlChar *)version, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_version); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNewDocComment(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * content; /* the comment content */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlNewDocComment(doc, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocComment", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_content); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewDocFragment(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document owning the fragment */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlNewDocFragment(doc); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocFragment", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNewDocNode(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNsPtr ns; /* namespace if any */ int n_ns; xmlChar * name; /* the node name */ int n_name; xmlChar * content; /* the XML text content if any */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_const_xmlChar_ptr(n_name, 2); content = gen_const_xmlChar_ptr(n_content, 3); ret_val = xmlNewDocNode(doc, ns, (const xmlChar *)name, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNsPtr(n_ns, ns, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlNewDocNodeEatName(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNsPtr ns; /* namespace if any */ int n_ns; xmlChar * name; /* the node name */ int n_name; xmlChar * content; /* the XML text content if any */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_eaten_name;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_eaten_name(n_name, 2); content = gen_const_xmlChar_ptr(n_content, 3); ret_val = xmlNewDocNodeEatName(doc, ns, name, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNsPtr(n_ns, ns, 1); des_eaten_name(n_name, name, 2); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocNodeEatName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlNewDocPI(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the target document */ int n_doc; xmlChar * name; /* the processing instruction name */ int n_name; xmlChar * content; /* the PI content */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); content = gen_const_xmlChar_ptr(n_content, 2); ret_val = xmlNewDocPI(doc, (const xmlChar *)name, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocPI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewDocProp(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the name of the attribute */ int n_name; xmlChar * value; /* the value of the attribute */ int n_value; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); value = gen_const_xmlChar_ptr(n_value, 2); ret_val = xmlNewDocProp(doc, (const xmlChar *)name, (const xmlChar *)value); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewDocRawNode(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNsPtr ns; /* namespace if any */ int n_ns; xmlChar * name; /* the node name */ int n_name; xmlChar * content; /* the text content if any */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_const_xmlChar_ptr(n_name, 2); content = gen_const_xmlChar_ptr(n_content, 3); ret_val = xmlNewDocRawNode(doc, ns, (const xmlChar *)name, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNsPtr(n_ns, ns, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocRawNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlNewDocText(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * content; /* the text content */ int n_content; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlNewDocText(doc, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocText", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_content); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewDocTextLen(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * content; /* the text content */ int n_content; int len; /* the text len. */ int n_len; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); ret_val = xmlNewDocTextLen(doc, (const xmlChar *)content, len); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocTextLen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_content); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewDtd(void) { int test_ret = 0; int mem_base; xmlDtdPtr ret_val; xmlDocPtr doc; /* the document pointer */ int n_doc; xmlChar * name; /* the DTD name */ int n_name; xmlChar * ExternalID; /* the external ID */ int n_ExternalID; xmlChar * SystemID; /* the system ID */ int n_SystemID; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) { for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2); SystemID = gen_const_xmlChar_ptr(n_SystemID, 3); ret_val = xmlNewDtd(doc, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID); desret_xmlDtdPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2); des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDtd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_ExternalID); printf(" %d", n_SystemID); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlNewNode(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNsPtr ns; /* namespace if any */ int n_ns; xmlChar * name; /* the node name */ int n_name; for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); ns = gen_xmlNsPtr(n_ns, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlNewNode(ns, (const xmlChar *)name); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNsPtr(n_ns, ns, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ns); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewNodeEatName(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNsPtr ns; /* namespace if any */ int n_ns; xmlChar * name; /* the node name */ int n_name; for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_eaten_name;n_name++) { mem_base = xmlMemBlocks(); ns = gen_xmlNsPtr(n_ns, 0); name = gen_eaten_name(n_name, 1); ret_val = xmlNewNodeEatName(ns, name); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNsPtr(n_ns, ns, 0); des_eaten_name(n_name, name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewNodeEatName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ns); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewNs(void) { int test_ret = 0; int mem_base; xmlNsPtr ret_val; xmlNodePtr node; /* the element carrying the namespace */ int n_node; xmlChar * href; /* the URI associated */ int n_href; xmlChar * prefix; /* the prefix for the namespace */ int n_prefix; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_href = 0;n_href < gen_nb_const_xmlChar_ptr;n_href++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); href = gen_const_xmlChar_ptr(n_href, 1); prefix = gen_const_xmlChar_ptr(n_prefix, 2); ret_val = xmlNewNs(node, (const xmlChar *)href, (const xmlChar *)prefix); if ((node == NULL) && (ret_val != NULL)) xmlFreeNs(ret_val); desret_xmlNsPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_href, (const xmlChar *)href, 1); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_href); printf(" %d", n_prefix); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewNsProp(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlNodePtr node; /* the holding node */ int n_node; xmlNsPtr ns; /* the namespace */ int n_ns; xmlChar * name; /* the name of the attribute */ int n_name; xmlChar * value; /* the value of the attribute */ int n_value; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_const_xmlChar_ptr(n_name, 2); value = gen_const_xmlChar_ptr(n_value, 3); ret_val = xmlNewNsProp(node, ns, (const xmlChar *)name, (const xmlChar *)value); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_xmlNsPtr(n_ns, ns, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewNsProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlNewNsPropEatName(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlNodePtr node; /* the holding node */ int n_node; xmlNsPtr ns; /* the namespace */ int n_ns; xmlChar * name; /* the name of the attribute */ int n_name; xmlChar * value; /* the value of the attribute */ int n_value; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_eaten_name;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_eaten_name(n_name, 2); value = gen_const_xmlChar_ptr(n_value, 3); ret_val = xmlNewNsPropEatName(node, ns, name, (const xmlChar *)value); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_xmlNsPtr(n_ns, ns, 1); des_eaten_name(n_name, name, 2); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewNsPropEatName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlNewPI(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlChar * name; /* the processing instruction name */ int n_name; xmlChar * content; /* the PI content */ int n_content; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlNewPI((const xmlChar *)name, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewPI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewProp(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; xmlAttrPtr ret_val; xmlNodePtr node; /* the holding node */ int n_node; xmlChar * name; /* the name of the attribute */ int n_name; xmlChar * value; /* the value of the attribute */ int n_value; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); value = gen_const_xmlChar_ptr(n_value, 2); ret_val = xmlNewProp(node, (const xmlChar *)name, (const xmlChar *)value); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlNewReference(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the reference name, or the reference string with & and ; */ int n_name; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlNewReference(doc, (const xmlChar *)name); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewReference", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewText(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlChar * content; /* the text content */ int n_content; for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); content = gen_const_xmlChar_ptr(n_content, 0); ret_val = xmlNewText((const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewText", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_content); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNewTextChild(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; xmlNodePtr ret_val; xmlNodePtr parent; /* the parent node */ int n_parent; xmlNsPtr ns; /* a namespace if any */ int n_ns; xmlChar * name; /* the name of the child */ int n_name; xmlChar * content; /* the text content of the child if any. */ int n_content; for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); parent = gen_xmlNodePtr(n_parent, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_const_xmlChar_ptr(n_name, 2); content = gen_const_xmlChar_ptr(n_content, 3); ret_val = xmlNewTextChild(parent, ns, (const xmlChar *)name, (const xmlChar *)content); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_parent, parent, 0); des_xmlNsPtr(n_ns, ns, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextChild", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_parent); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlNewTextLen(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlChar * content; /* the text content */ int n_content; int len; /* the text len. */ int n_len; for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); content = gen_const_xmlChar_ptr(n_content, 0); len = gen_int(n_len, 1); ret_val = xmlNewTextLen((const xmlChar *)content, len); desret_xmlNodePtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextLen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_content); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNextElementSibling(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr ret_val; xmlNodePtr node; /* the current node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlNextElementSibling(node); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNextElementSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNodeAddContent(void) { int test_ret = 0; int mem_base; xmlNodePtr cur; /* the node being modified */ int n_cur; xmlChar * content; /* extra content */ int n_content; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); content = gen_const_xmlChar_ptr(n_content, 1); xmlNodeAddContent(cur, (const xmlChar *)content); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeAddContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_content); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNodeAddContentLen(void) { int test_ret = 0; int mem_base; xmlNodePtr cur; /* the node being modified */ int n_cur; xmlChar * content; /* extra content */ int n_content; int len; /* the size of @content */ int n_len; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); xmlNodeAddContentLen(cur, (const xmlChar *)content, len); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeAddContentLen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_content); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNodeBufGetContent(void) { int test_ret = 0; int mem_base; int ret_val; xmlBufferPtr buffer; /* a buffer */ int n_buffer; xmlNodePtr cur; /* the node being read */ int n_cur; for (n_buffer = 0;n_buffer < gen_nb_xmlBufferPtr;n_buffer++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); buffer = gen_xmlBufferPtr(n_buffer, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlNodeBufGetContent(buffer, cur); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buffer, buffer, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeBufGetContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNodeDump(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; int level; /* the imbrication level for indenting */ int n_level; int format; /* is formatting allowed */ int n_format; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_level = 0;n_level < gen_nb_int;n_level++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); level = gen_int(n_level, 3); format = gen_int(n_format, 4); ret_val = xmlNodeDump(buf, doc, cur, level, format); desret_int(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); des_int(n_level, level, 3); des_int(n_format, format, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_doc); printf(" %d", n_cur); printf(" %d", n_level); printf(" %d", n_format); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlNodeDumpOutput(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr buf; /* the XML buffer output */ int n_buf; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr cur; /* the current node */ int n_cur; int level; /* the imbrication level for indenting */ int n_level; int format; /* is formatting allowed */ int n_format; char * encoding; /* an optional encoding string */ int n_encoding; for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_level = 0;n_level < gen_nb_int;n_level++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); buf = gen_xmlOutputBufferPtr(n_buf, 0); doc = gen_xmlDocPtr(n_doc, 1); cur = gen_xmlNodePtr(n_cur, 2); level = gen_int(n_level, 3); format = gen_int(n_format, 4); encoding = gen_const_char_ptr(n_encoding, 5); xmlNodeDumpOutput(buf, doc, cur, level, format, (const char *)encoding); call_tests++; des_xmlOutputBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_cur, cur, 2); des_int(n_level, level, 3); des_int(n_format, format, 4); des_const_char_ptr(n_encoding, (const char *)encoding, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeDumpOutput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_doc); printf(" %d", n_cur); printf(" %d", n_level); printf(" %d", n_format); printf(" %d", n_encoding); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlNodeGetBase(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlDocPtr doc; /* the document the node pertains to */ int n_doc; xmlNodePtr cur; /* the node being checked */ int n_cur; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlNodeGetBase(doc, cur); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeGetBase", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNodeGetContent(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlNodePtr cur; /* the node being read */ int n_cur; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); ret_val = xmlNodeGetContent(cur); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodePtr(n_cur, cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeGetContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNodeGetLang(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlNodePtr cur; /* the node being checked */ int n_cur; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); ret_val = xmlNodeGetLang(cur); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodePtr(n_cur, cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeGetLang", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNodeGetSpacePreserve(void) { int test_ret = 0; int mem_base; int ret_val; xmlNodePtr cur; /* the node being checked */ int n_cur; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); ret_val = xmlNodeGetSpacePreserve(cur); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_cur, cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeGetSpacePreserve", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNodeIsText(void) { int test_ret = 0; int mem_base; int ret_val; xmlNodePtr node; /* the node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlNodeIsText(node); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeIsText", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlNodeListGetRawString(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlChar * ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr list; /* a Node list */ int n_list; int inLine; /* should we replace entity contents or show their external form */ int n_inLine; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_list = 0;n_list < gen_nb_xmlNodePtr;n_list++) { for (n_inLine = 0;n_inLine < gen_nb_int;n_inLine++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); list = gen_xmlNodePtr(n_list, 1); inLine = gen_int(n_inLine, 2); ret_val = xmlNodeListGetRawString(doc, list, inLine); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_list, list, 1); des_int(n_inLine, inLine, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeListGetRawString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_list); printf(" %d", n_inLine); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlNodeListGetString(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr list; /* a Node list */ int n_list; int inLine; /* should we replace entity contents or show their external form */ int n_inLine; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_list = 0;n_list < gen_nb_xmlNodePtr;n_list++) { for (n_inLine = 0;n_inLine < gen_nb_int;n_inLine++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); list = gen_xmlNodePtr(n_list, 1); inLine = gen_int(n_inLine, 2); ret_val = xmlNodeListGetString(doc, list, inLine); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_list, list, 1); des_int(n_inLine, inLine, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeListGetString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_list); printf(" %d", n_inLine); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNodeSetBase(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) int mem_base; xmlNodePtr cur; /* the node being changed */ int n_cur; xmlChar * uri; /* the new base URI */ int n_uri; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_uri = 0;n_uri < gen_nb_const_xmlChar_ptr;n_uri++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); uri = gen_const_xmlChar_ptr(n_uri, 1); xmlNodeSetBase(cur, (const xmlChar *)uri); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_const_xmlChar_ptr(n_uri, (const xmlChar *)uri, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeSetBase", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_uri); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNodeSetContent(void) { int test_ret = 0; int mem_base; xmlNodePtr cur; /* the node being modified */ int n_cur; xmlChar * content; /* the new value of the content */ int n_content; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); content = gen_const_xmlChar_ptr(n_content, 1); xmlNodeSetContent(cur, (const xmlChar *)content); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeSetContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_content); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNodeSetContentLen(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr cur; /* the node being modified */ int n_cur; xmlChar * content; /* the new value of the content */ int n_content; int len; /* the size of @content */ int n_len; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); xmlNodeSetContentLen(cur, (const xmlChar *)content, len); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeSetContentLen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_content); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlNodeSetLang(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr cur; /* the node being changed */ int n_cur; xmlChar * lang; /* the language description */ int n_lang; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_lang = 0;n_lang < gen_nb_const_xmlChar_ptr;n_lang++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); lang = gen_const_xmlChar_ptr(n_lang, 1); xmlNodeSetLang(cur, (const xmlChar *)lang); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_const_xmlChar_ptr(n_lang, (const xmlChar *)lang, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeSetLang", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_lang); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNodeSetName(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr cur; /* the node being changed */ int n_cur; xmlChar * name; /* the new tag name */ int n_name; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); name = gen_const_xmlChar_ptr(n_name, 1); xmlNodeSetName(cur, (const xmlChar *)name); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeSetName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNodeSetSpacePreserve(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr cur; /* the node being changed */ int n_cur; int val; /* the xml:space value ("0": default, 1: "preserve") */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodePtr(n_cur, 0); val = gen_int(n_val, 1); xmlNodeSetSpacePreserve(cur, val); call_tests++; des_xmlNodePtr(n_cur, cur, 0); des_int(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNodeSetSpacePreserve", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlPreviousElementSibling(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) int mem_base; xmlNodePtr ret_val; xmlNodePtr node; /* the current node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlPreviousElementSibling(node); desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPreviousElementSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlReconciliateNs(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; int ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr tree; /* a node defining the subtree to reconciliate */ int n_tree; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); tree = gen_xmlNodePtr(n_tree, 1); ret_val = xmlReconciliateNs(doc, tree); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_tree, tree, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReconciliateNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_tree); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlRemoveProp(void) { int test_ret = 0; int mem_base; int ret_val; xmlAttrPtr cur; /* an attribute */ int n_cur; for (n_cur = 0;n_cur < gen_nb_xmlAttrPtr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_xmlAttrPtr(n_cur, 0); ret_val = xmlRemoveProp(cur); cur = NULL; desret_int(ret_val); call_tests++; des_xmlAttrPtr(n_cur, cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRemoveProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlReplaceNode(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) int mem_base; xmlNodePtr ret_val; xmlNodePtr old; /* the old node */ int n_old; xmlNodePtr cur; /* the node */ int n_cur; for (n_old = 0;n_old < gen_nb_xmlNodePtr;n_old++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr_in;n_cur++) { mem_base = xmlMemBlocks(); old = gen_xmlNodePtr(n_old, 0); cur = gen_xmlNodePtr_in(n_cur, 1); ret_val = xmlReplaceNode(old, cur); if (cur != NULL) { xmlUnlinkNode(cur); xmlFreeNode(cur) ; cur = NULL ; } if (old != NULL) { xmlUnlinkNode(old); xmlFreeNode(old) ; old = NULL ; } ret_val = NULL; desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr(n_old, old, 0); des_xmlNodePtr_in(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReplaceNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_old); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSaveFile(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; const char * filename; /* the filename (or URL) */ int n_filename; xmlDocPtr cur; /* the document */ int n_cur; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); cur = gen_xmlDocPtr(n_cur, 1); ret_val = xmlSaveFile(filename, cur); desret_int(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_xmlDocPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSaveFileEnc(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; const char * filename; /* the filename (or URL) */ int n_filename; xmlDocPtr cur; /* the document */ int n_cur; char * encoding; /* the name of an encoding (or NULL) */ int n_encoding; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); ret_val = xmlSaveFileEnc(filename, cur, (const char *)encoding); desret_int(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveFileEnc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_cur); printf(" %d", n_encoding); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlSaveFileTo(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlOutputBufferPtr buf; /* an output I/O buffer */ int n_buf; xmlDocPtr cur; /* the document */ int n_cur; char * encoding; /* the encoding if any assuming the I/O layer handles the trancoding */ int n_encoding; for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { mem_base = xmlMemBlocks(); buf = gen_xmlOutputBufferPtr(n_buf, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); ret_val = xmlSaveFileTo(buf, cur, (const char *)encoding); buf = NULL; desret_int(ret_val); call_tests++; des_xmlOutputBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveFileTo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_cur); printf(" %d", n_encoding); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlSaveFormatFile(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; const char * filename; /* the filename (or URL) */ int n_filename; xmlDocPtr cur; /* the document */ int n_cur; int format; /* should formatting spaces been added */ int n_format; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); cur = gen_xmlDocPtr(n_cur, 1); format = gen_int(n_format, 2); ret_val = xmlSaveFormatFile(filename, cur, format); desret_int(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_xmlDocPtr(n_cur, cur, 1); des_int(n_format, format, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveFormatFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_cur); printf(" %d", n_format); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlSaveFormatFileEnc(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; const char * filename; /* the filename or URL to output */ int n_filename; xmlDocPtr cur; /* the document being saved */ int n_cur; char * encoding; /* the name of the encoding to use or NULL. */ int n_encoding; int format; /* should formatting spaces be added. */ int n_format; for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); filename = gen_fileoutput(n_filename, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); format = gen_int(n_format, 3); ret_val = xmlSaveFormatFileEnc(filename, cur, (const char *)encoding, format); desret_int(ret_val); call_tests++; des_fileoutput(n_filename, filename, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_int(n_format, format, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveFormatFileEnc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_cur); printf(" %d", n_encoding); printf(" %d", n_format); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSaveFormatFileTo(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlOutputBufferPtr buf; /* an output I/O buffer */ int n_buf; xmlDocPtr cur; /* the document */ int n_cur; char * encoding; /* the encoding if any assuming the I/O layer handles the trancoding */ int n_encoding; int format; /* should formatting spaces been added */ int n_format; for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) { for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_format = 0;n_format < gen_nb_int;n_format++) { mem_base = xmlMemBlocks(); buf = gen_xmlOutputBufferPtr(n_buf, 0); cur = gen_xmlDocPtr(n_cur, 1); encoding = gen_const_char_ptr(n_encoding, 2); format = gen_int(n_format, 3); ret_val = xmlSaveFormatFileTo(buf, cur, (const char *)encoding, format); buf = NULL; desret_int(ret_val); call_tests++; des_xmlOutputBufferPtr(n_buf, buf, 0); des_xmlDocPtr(n_cur, cur, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_int(n_format, format, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveFormatFileTo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_cur); printf(" %d", n_encoding); printf(" %d", n_format); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSearchNs(void) { int test_ret = 0; int mem_base; xmlNsPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr node; /* the current node */ int n_node; xmlChar * nameSpace; /* the namespace prefix */ int n_nameSpace; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_nameSpace = 0;n_nameSpace < gen_nb_const_xmlChar_ptr;n_nameSpace++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); node = gen_xmlNodePtr(n_node, 1); nameSpace = gen_const_xmlChar_ptr(n_nameSpace, 2); ret_val = xmlSearchNs(doc, node, (const xmlChar *)nameSpace); desret_xmlNsPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_node, node, 1); des_const_xmlChar_ptr(n_nameSpace, (const xmlChar *)nameSpace, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSearchNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_node); printf(" %d", n_nameSpace); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlSearchNsByHref(void) { int test_ret = 0; int mem_base; xmlNsPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr node; /* the current node */ int n_node; xmlChar * href; /* the namespace value */ int n_href; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_href = 0;n_href < gen_nb_const_xmlChar_ptr;n_href++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); node = gen_xmlNodePtr(n_node, 1); href = gen_const_xmlChar_ptr(n_href, 2); ret_val = xmlSearchNsByHref(doc, node, (const xmlChar *)href); desret_xmlNsPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_node, node, 1); des_const_xmlChar_ptr(n_href, (const xmlChar *)href, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSearchNsByHref", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_node); printf(" %d", n_href); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlSetBufferAllocationScheme(void) { int test_ret = 0; int mem_base; xmlBufferAllocationScheme scheme; /* allocation method to use */ int n_scheme; for (n_scheme = 0;n_scheme < gen_nb_xmlBufferAllocationScheme;n_scheme++) { mem_base = xmlMemBlocks(); scheme = gen_xmlBufferAllocationScheme(n_scheme, 0); xmlSetBufferAllocationScheme(scheme); call_tests++; des_xmlBufferAllocationScheme(n_scheme, scheme, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetBufferAllocationScheme", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_scheme); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSetCompressMode(void) { int test_ret = 0; int mem_base; int mode; /* the compression ratio */ int n_mode; for (n_mode = 0;n_mode < gen_nb_int;n_mode++) { mem_base = xmlMemBlocks(); mode = gen_int(n_mode, 0); xmlSetCompressMode(mode); call_tests++; des_int(n_mode, mode, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetCompressMode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_mode); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlSetDocCompressMode(void) { int test_ret = 0; int mem_base; xmlDocPtr doc; /* the document */ int n_doc; int mode; /* the compression ratio */ int n_mode; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_mode = 0;n_mode < gen_nb_int;n_mode++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); mode = gen_int(n_mode, 1); xmlSetDocCompressMode(doc, mode); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_int(n_mode, mode, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetDocCompressMode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_mode); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSetNs(void) { int test_ret = 0; int mem_base; xmlNodePtr node; /* a node in the document */ int n_node; xmlNsPtr ns; /* a namespace pointer */ int n_ns; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ns = gen_xmlNsPtr(n_ns, 1); xmlSetNs(node, ns); call_tests++; des_xmlNodePtr(n_node, node, 0); des_xmlNsPtr(n_ns, ns, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_ns); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSetNsProp(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) int mem_base; xmlAttrPtr ret_val; xmlNodePtr node; /* the node */ int n_node; xmlNsPtr ns; /* the namespace definition */ int n_ns; xmlChar * name; /* the attribute name */ int n_name; xmlChar * value; /* the attribute value */ int n_value; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_const_xmlChar_ptr(n_name, 2); value = gen_const_xmlChar_ptr(n_value, 3); ret_val = xmlSetNsProp(node, ns, (const xmlChar *)name, (const xmlChar *)value); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_xmlNsPtr(n_ns, ns, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetNsProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_ns); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSetProp(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) int mem_base; xmlAttrPtr ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * name; /* the attribute name (a QName) */ int n_name; xmlChar * value; /* the attribute value */ int n_value; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); value = gen_const_xmlChar_ptr(n_value, 2); ret_val = xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSetProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlSplitQName2(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * name; /* the full QName */ int n_name; xmlChar ** prefix; /* a xmlChar ** */ int n_prefix; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_prefix = 0;n_prefix < gen_nb_xmlChar_ptr_ptr;n_prefix++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); prefix = gen_xmlChar_ptr_ptr(n_prefix, 1); ret_val = xmlSplitQName2((const xmlChar *)name, prefix); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); des_xmlChar_ptr_ptr(n_prefix, prefix, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSplitQName2", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf(" %d", n_prefix); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSplitQName3(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlChar * name; /* the full QName */ int n_name; int * len; /* an int * */ int n_len; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); len = gen_int_ptr(n_len, 1); ret_val = xmlSplitQName3((const xmlChar *)name, len); desret_const_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); des_int_ptr(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSplitQName3", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStringGetNodeList(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * value; /* the value of the attribute */ int n_value; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); value = gen_const_xmlChar_ptr(n_value, 1); ret_val = xmlStringGetNodeList(doc, (const xmlChar *)value); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStringGetNodeList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_value); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStringLenGetNodeList(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * value; /* the value of the text */ int n_value; int len; /* the length of the string value */ int n_len; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); value = gen_const_xmlChar_ptr(n_value, 1); len = gen_int(n_len, 2); ret_val = xmlStringLenGetNodeList(doc, (const xmlChar *)value, len); desret_xmlNodePtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStringLenGetNodeList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_value); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlTextConcat(void) { int test_ret = 0; int mem_base; int ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * content; /* the content */ int n_content; int len; /* @content length */ int n_len; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); ret_val = xmlTextConcat(node, (const xmlChar *)content, len); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextConcat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_content); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlTextMerge(void) { int test_ret = 0; int mem_base; xmlNodePtr ret_val; xmlNodePtr first; /* the first text node */ int n_first; xmlNodePtr second; /* the second text node being merged */ int n_second; for (n_first = 0;n_first < gen_nb_xmlNodePtr_in;n_first++) { for (n_second = 0;n_second < gen_nb_xmlNodePtr_in;n_second++) { mem_base = xmlMemBlocks(); first = gen_xmlNodePtr_in(n_first, 0); second = gen_xmlNodePtr_in(n_second, 1); ret_val = xmlTextMerge(first, second); if ((first != NULL) && (first->type != XML_TEXT_NODE)) { xmlUnlinkNode(second); xmlFreeNode(second) ; second = NULL ; } desret_xmlNodePtr(ret_val); call_tests++; des_xmlNodePtr_in(n_first, first, 0); des_xmlNodePtr_in(n_second, second, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextMerge", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_first); printf(" %d", n_second); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlUnsetNsProp(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlNodePtr node; /* the node */ int n_node; xmlNsPtr ns; /* the namespace definition */ int n_ns; xmlChar * name; /* the attribute name */ int n_name; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ns = gen_xmlNsPtr(n_ns, 1); name = gen_const_xmlChar_ptr(n_name, 2); ret_val = xmlUnsetNsProp(node, ns, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_xmlNsPtr(n_ns, ns, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUnsetNsProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_ns); printf(" %d", n_name); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlUnsetProp(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlNodePtr node; /* the node */ int n_node; xmlChar * name; /* the attribute name */ int n_name; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlUnsetProp(node, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUnsetProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateNCName(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; int ret_val; xmlChar * value; /* the value to check */ int n_value; int space; /* allow spaces in front and end of the string */ int n_space; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_space = 0;n_space < gen_nb_int;n_space++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); space = gen_int(n_space, 1); ret_val = xmlValidateNCName((const xmlChar *)value, space); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); des_int(n_space, space, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNCName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf(" %d", n_space); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlValidateNMToken(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; int ret_val; xmlChar * value; /* the value to check */ int n_value; int space; /* allow spaces in front and end of the string */ int n_space; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_space = 0;n_space < gen_nb_int;n_space++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); space = gen_int(n_space, 1); ret_val = xmlValidateNMToken((const xmlChar *)value, space); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); des_int(n_space, space, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNMToken", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf(" %d", n_space); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlValidateName(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; int ret_val; xmlChar * value; /* the value to check */ int n_value; int space; /* allow spaces in front and end of the string */ int n_space; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_space = 0;n_space < gen_nb_int;n_space++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); space = gen_int(n_space, 1); ret_val = xmlValidateName((const xmlChar *)value, space); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); des_int(n_space, space, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf(" %d", n_space); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlValidateQName(void) { int test_ret = 0; #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) #ifdef LIBXML_TREE_ENABLED int mem_base; int ret_val; xmlChar * value; /* the value to check */ int n_value; int space; /* allow spaces in front and end of the string */ int n_space; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_space = 0;n_space < gen_nb_int;n_space++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); space = gen_int(n_space, 1); ret_val = xmlValidateQName((const xmlChar *)value, space); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); des_int(n_space, space, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateQName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf(" %d", n_space); printf("\n"); } } } function_tests++; #endif #endif return(test_ret); } static int test_tree(void) { int test_ret = 0; if (quiet == 0) printf("Testing tree : 142 of 164 functions ...\n"); test_ret += test_xmlAddChild(); test_ret += test_xmlAddChildList(); test_ret += test_xmlAddNextSibling(); test_ret += test_xmlAddPrevSibling(); test_ret += test_xmlAddSibling(); test_ret += test_xmlAttrSerializeTxtContent(); test_ret += test_xmlBufContent(); test_ret += test_xmlBufEnd(); test_ret += test_xmlBufGetNodeContent(); test_ret += test_xmlBufNodeDump(); test_ret += test_xmlBufShrink(); test_ret += test_xmlBufUse(); test_ret += test_xmlBufferAdd(); test_ret += test_xmlBufferAddHead(); test_ret += test_xmlBufferCCat(); test_ret += test_xmlBufferCat(); test_ret += test_xmlBufferContent(); test_ret += test_xmlBufferCreate(); test_ret += test_xmlBufferCreateSize(); test_ret += test_xmlBufferCreateStatic(); test_ret += test_xmlBufferDetach(); test_ret += test_xmlBufferEmpty(); test_ret += test_xmlBufferGrow(); test_ret += test_xmlBufferLength(); test_ret += test_xmlBufferResize(); test_ret += test_xmlBufferSetAllocationScheme(); test_ret += test_xmlBufferShrink(); test_ret += test_xmlBufferWriteCHAR(); test_ret += test_xmlBufferWriteChar(); test_ret += test_xmlBufferWriteQuotedString(); test_ret += test_xmlBuildQName(); test_ret += test_xmlChildElementCount(); test_ret += test_xmlCopyDoc(); test_ret += test_xmlCopyDtd(); test_ret += test_xmlCopyNamespace(); test_ret += test_xmlCopyNamespaceList(); test_ret += test_xmlCopyNode(); test_ret += test_xmlCopyNodeList(); test_ret += test_xmlCopyProp(); test_ret += test_xmlCopyPropList(); test_ret += test_xmlCreateIntSubset(); test_ret += test_xmlDOMWrapAdoptNode(); test_ret += test_xmlDOMWrapCloneNode(); test_ret += test_xmlDOMWrapNewCtxt(); test_ret += test_xmlDOMWrapReconcileNamespaces(); test_ret += test_xmlDOMWrapRemoveNode(); test_ret += test_xmlDocCopyNode(); test_ret += test_xmlDocCopyNodeList(); test_ret += test_xmlDocDump(); test_ret += test_xmlDocDumpFormatMemory(); test_ret += test_xmlDocDumpFormatMemoryEnc(); test_ret += test_xmlDocDumpMemory(); test_ret += test_xmlDocDumpMemoryEnc(); test_ret += test_xmlDocFormatDump(); test_ret += test_xmlDocGetRootElement(); test_ret += test_xmlDocSetRootElement(); test_ret += test_xmlElemDump(); test_ret += test_xmlFirstElementChild(); test_ret += test_xmlGetBufferAllocationScheme(); test_ret += test_xmlGetCompressMode(); test_ret += test_xmlGetDocCompressMode(); test_ret += test_xmlGetIntSubset(); test_ret += test_xmlGetLastChild(); test_ret += test_xmlGetLineNo(); test_ret += test_xmlGetNoNsProp(); test_ret += test_xmlGetNodePath(); test_ret += test_xmlGetNsList(); test_ret += test_xmlGetNsProp(); test_ret += test_xmlGetProp(); test_ret += test_xmlHasNsProp(); test_ret += test_xmlHasProp(); test_ret += test_xmlIsBlankNode(); test_ret += test_xmlIsXHTML(); test_ret += test_xmlLastElementChild(); test_ret += test_xmlNewCDataBlock(); test_ret += test_xmlNewCharRef(); test_ret += test_xmlNewChild(); test_ret += test_xmlNewComment(); test_ret += test_xmlNewDoc(); test_ret += test_xmlNewDocComment(); test_ret += test_xmlNewDocFragment(); test_ret += test_xmlNewDocNode(); test_ret += test_xmlNewDocNodeEatName(); test_ret += test_xmlNewDocPI(); test_ret += test_xmlNewDocProp(); test_ret += test_xmlNewDocRawNode(); test_ret += test_xmlNewDocText(); test_ret += test_xmlNewDocTextLen(); test_ret += test_xmlNewDtd(); test_ret += test_xmlNewNode(); test_ret += test_xmlNewNodeEatName(); test_ret += test_xmlNewNs(); test_ret += test_xmlNewNsProp(); test_ret += test_xmlNewNsPropEatName(); test_ret += test_xmlNewPI(); test_ret += test_xmlNewProp(); test_ret += test_xmlNewReference(); test_ret += test_xmlNewText(); test_ret += test_xmlNewTextChild(); test_ret += test_xmlNewTextLen(); test_ret += test_xmlNextElementSibling(); test_ret += test_xmlNodeAddContent(); test_ret += test_xmlNodeAddContentLen(); test_ret += test_xmlNodeBufGetContent(); test_ret += test_xmlNodeDump(); test_ret += test_xmlNodeDumpOutput(); test_ret += test_xmlNodeGetBase(); test_ret += test_xmlNodeGetContent(); test_ret += test_xmlNodeGetLang(); test_ret += test_xmlNodeGetSpacePreserve(); test_ret += test_xmlNodeIsText(); test_ret += test_xmlNodeListGetRawString(); test_ret += test_xmlNodeListGetString(); test_ret += test_xmlNodeSetBase(); test_ret += test_xmlNodeSetContent(); test_ret += test_xmlNodeSetContentLen(); test_ret += test_xmlNodeSetLang(); test_ret += test_xmlNodeSetName(); test_ret += test_xmlNodeSetSpacePreserve(); test_ret += test_xmlPreviousElementSibling(); test_ret += test_xmlReconciliateNs(); test_ret += test_xmlRemoveProp(); test_ret += test_xmlReplaceNode(); test_ret += test_xmlSaveFile(); test_ret += test_xmlSaveFileEnc(); test_ret += test_xmlSaveFileTo(); test_ret += test_xmlSaveFormatFile(); test_ret += test_xmlSaveFormatFileEnc(); test_ret += test_xmlSaveFormatFileTo(); test_ret += test_xmlSearchNs(); test_ret += test_xmlSearchNsByHref(); test_ret += test_xmlSetBufferAllocationScheme(); test_ret += test_xmlSetCompressMode(); test_ret += test_xmlSetDocCompressMode(); test_ret += test_xmlSetNs(); test_ret += test_xmlSetNsProp(); test_ret += test_xmlSetProp(); test_ret += test_xmlSplitQName2(); test_ret += test_xmlSplitQName3(); test_ret += test_xmlStringGetNodeList(); test_ret += test_xmlStringLenGetNodeList(); test_ret += test_xmlTextConcat(); test_ret += test_xmlTextMerge(); test_ret += test_xmlUnsetNsProp(); test_ret += test_xmlUnsetProp(); test_ret += test_xmlValidateNCName(); test_ret += test_xmlValidateNMToken(); test_ret += test_xmlValidateName(); test_ret += test_xmlValidateQName(); if (test_ret != 0) printf("Module tree: %d errors\n", test_ret); return(test_ret); } static int test_xmlBuildRelativeURI(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * URI; /* the URI reference under consideration */ int n_URI; xmlChar * base; /* the base value */ int n_base; for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { for (n_base = 0;n_base < gen_nb_const_xmlChar_ptr;n_base++) { mem_base = xmlMemBlocks(); URI = gen_const_xmlChar_ptr(n_URI, 0); base = gen_const_xmlChar_ptr(n_base, 1); ret_val = xmlBuildRelativeURI((const xmlChar *)URI, (const xmlChar *)base); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0); des_const_xmlChar_ptr(n_base, (const xmlChar *)base, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBuildRelativeURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf(" %d", n_base); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlBuildURI(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * URI; /* the URI instance found in the document */ int n_URI; xmlChar * base; /* the base value */ int n_base; for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) { for (n_base = 0;n_base < gen_nb_const_xmlChar_ptr;n_base++) { mem_base = xmlMemBlocks(); URI = gen_const_xmlChar_ptr(n_URI, 0); base = gen_const_xmlChar_ptr(n_base, 1); ret_val = xmlBuildURI((const xmlChar *)URI, (const xmlChar *)base); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0); des_const_xmlChar_ptr(n_base, (const xmlChar *)base, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlBuildURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf(" %d", n_base); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCanonicPath(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * path; /* the resource locator in a filesystem notation */ int n_path; for (n_path = 0;n_path < gen_nb_const_xmlChar_ptr;n_path++) { mem_base = xmlMemBlocks(); path = gen_const_xmlChar_ptr(n_path, 0); ret_val = xmlCanonicPath((const xmlChar *)path); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_path, (const xmlChar *)path, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCanonicPath", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_path); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCreateURI(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlNormalizeURIPath(void) { int test_ret = 0; int mem_base; int ret_val; char * path; /* pointer to the path string */ int n_path; for (n_path = 0;n_path < gen_nb_char_ptr;n_path++) { mem_base = xmlMemBlocks(); path = gen_char_ptr(n_path, 0); ret_val = xmlNormalizeURIPath(path); desret_int(ret_val); call_tests++; des_char_ptr(n_path, path, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNormalizeURIPath", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_path); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlParseURI(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParseURIRaw(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #define gen_nb_xmlURIPtr 1 static xmlURIPtr gen_xmlURIPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlURIPtr(int no ATTRIBUTE_UNUSED, xmlURIPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlParseURIReference(void) { int test_ret = 0; int mem_base; int ret_val; xmlURIPtr uri; /* pointer to an URI structure */ int n_uri; char * str; /* the string to analyze */ int n_str; for (n_uri = 0;n_uri < gen_nb_xmlURIPtr;n_uri++) { for (n_str = 0;n_str < gen_nb_const_char_ptr;n_str++) { mem_base = xmlMemBlocks(); uri = gen_xmlURIPtr(n_uri, 0); str = gen_const_char_ptr(n_str, 1); ret_val = xmlParseURIReference(uri, (const char *)str); desret_int(ret_val); call_tests++; des_xmlURIPtr(n_uri, uri, 0); des_const_char_ptr(n_str, (const char *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParseURIReference", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_uri); printf(" %d", n_str); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlPathToURI(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * path; /* the resource locator in a filesystem notation */ int n_path; for (n_path = 0;n_path < gen_nb_const_xmlChar_ptr;n_path++) { mem_base = xmlMemBlocks(); path = gen_const_xmlChar_ptr(n_path, 0); ret_val = xmlPathToURI((const xmlChar *)path); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_path, (const xmlChar *)path, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPathToURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_path); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlPrintURI(void) { int test_ret = 0; int mem_base; FILE * stream; /* a FILE* for the output */ int n_stream; xmlURIPtr uri; /* pointer to an xmlURI */ int n_uri; for (n_stream = 0;n_stream < gen_nb_FILE_ptr;n_stream++) { for (n_uri = 0;n_uri < gen_nb_xmlURIPtr;n_uri++) { mem_base = xmlMemBlocks(); stream = gen_FILE_ptr(n_stream, 0); uri = gen_xmlURIPtr(n_uri, 1); xmlPrintURI(stream, uri); call_tests++; des_FILE_ptr(n_stream, stream, 0); des_xmlURIPtr(n_uri, uri, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPrintURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_stream); printf(" %d", n_uri); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSaveUri(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlURIPtr uri; /* pointer to an xmlURI */ int n_uri; for (n_uri = 0;n_uri < gen_nb_xmlURIPtr;n_uri++) { mem_base = xmlMemBlocks(); uri = gen_xmlURIPtr(n_uri, 0); ret_val = xmlSaveUri(uri); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlURIPtr(n_uri, uri, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveUri", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_uri); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlURIEscape(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * str; /* the string of the URI to escape */ int n_str; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); ret_val = xmlURIEscape((const xmlChar *)str); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlURIEscape", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlURIEscapeStr(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * str; /* string to escape */ int n_str; xmlChar * list; /* exception list string of chars not to escape */ int n_list; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_list = 0;n_list < gen_nb_const_xmlChar_ptr;n_list++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); list = gen_const_xmlChar_ptr(n_list, 1); ret_val = xmlURIEscapeStr((const xmlChar *)str, (const xmlChar *)list); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_const_xmlChar_ptr(n_list, (const xmlChar *)list, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlURIEscapeStr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_list); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlURIUnescapeString(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_uri(void) { int test_ret = 0; if (quiet == 0) printf("Testing uri : 10 of 15 functions ...\n"); test_ret += test_xmlBuildRelativeURI(); test_ret += test_xmlBuildURI(); test_ret += test_xmlCanonicPath(); test_ret += test_xmlCreateURI(); test_ret += test_xmlNormalizeURIPath(); test_ret += test_xmlParseURI(); test_ret += test_xmlParseURIRaw(); test_ret += test_xmlParseURIReference(); test_ret += test_xmlPathToURI(); test_ret += test_xmlPrintURI(); test_ret += test_xmlSaveUri(); test_ret += test_xmlURIEscape(); test_ret += test_xmlURIEscapeStr(); test_ret += test_xmlURIUnescapeString(); if (test_ret != 0) printf("Module uri: %d errors\n", test_ret); return(test_ret); } static int test_xmlAddAttributeDecl(void) { int test_ret = 0; int mem_base; xmlAttributePtr ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDtdPtr dtd; /* pointer to the DTD */ int n_dtd; xmlChar * elem; /* the element name */ int n_elem; xmlChar * name; /* the attribute name */ int n_name; xmlChar * ns; /* the attribute namespace prefix */ int n_ns; xmlAttributeType type; /* the attribute type */ int n_type; xmlAttributeDefault def; /* the attribute default type */ int n_def; xmlChar * defaultValue; /* the attribute default value */ int n_defaultValue; xmlEnumerationPtr tree; /* if it's an enumeration, the associated list */ int n_tree; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) { for (n_type = 0;n_type < gen_nb_xmlAttributeType;n_type++) { for (n_def = 0;n_def < gen_nb_xmlAttributeDefault;n_def++) { for (n_defaultValue = 0;n_defaultValue < gen_nb_const_xmlChar_ptr;n_defaultValue++) { for (n_tree = 0;n_tree < gen_nb_xmlEnumerationPtr;n_tree++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); dtd = gen_xmlDtdPtr(n_dtd, 1); elem = gen_const_xmlChar_ptr(n_elem, 2); name = gen_const_xmlChar_ptr(n_name, 3); ns = gen_const_xmlChar_ptr(n_ns, 4); type = gen_xmlAttributeType(n_type, 5); def = gen_xmlAttributeDefault(n_def, 6); defaultValue = gen_const_xmlChar_ptr(n_defaultValue, 7); tree = gen_xmlEnumerationPtr(n_tree, 8); ret_val = xmlAddAttributeDecl(ctxt, dtd, (const xmlChar *)elem, (const xmlChar *)name, (const xmlChar *)ns, type, def, (const xmlChar *)defaultValue, tree); desret_xmlAttributePtr(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDtdPtr(n_dtd, dtd, 1); des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 2); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 3); des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 4); des_xmlAttributeType(n_type, type, 5); des_xmlAttributeDefault(n_def, def, 6); des_const_xmlChar_ptr(n_defaultValue, (const xmlChar *)defaultValue, 7); des_xmlEnumerationPtr(n_tree, tree, 8); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddAttributeDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_dtd); printf(" %d", n_elem); printf(" %d", n_name); printf(" %d", n_ns); printf(" %d", n_type); printf(" %d", n_def); printf(" %d", n_defaultValue); printf(" %d", n_tree); printf("\n"); } } } } } } } } } } function_tests++; return(test_ret); } static int test_xmlAddElementDecl(void) { int test_ret = 0; int mem_base; xmlElementPtr ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDtdPtr dtd; /* pointer to the DTD */ int n_dtd; xmlChar * name; /* the entity name */ int n_name; xmlElementTypeVal type; /* the element type */ int n_type; xmlElementContentPtr content; /* the element content tree or NULL */ int n_content; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_xmlElementTypeVal;n_type++) { for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); dtd = gen_xmlDtdPtr(n_dtd, 1); name = gen_const_xmlChar_ptr(n_name, 2); type = gen_xmlElementTypeVal(n_type, 3); content = gen_xmlElementContentPtr(n_content, 4); ret_val = xmlAddElementDecl(ctxt, dtd, (const xmlChar *)name, type, content); desret_xmlElementPtr(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDtdPtr(n_dtd, dtd, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_xmlElementTypeVal(n_type, type, 3); des_xmlElementContentPtr(n_content, content, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAddElementDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_dtd); printf(" %d", n_name); printf(" %d", n_type); printf(" %d", n_content); printf("\n"); } } } } } } function_tests++; return(test_ret); } static int test_xmlAddID(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAddNotationDecl(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAddRef(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #define gen_nb_xmlAttributeTablePtr 1 static xmlAttributeTablePtr gen_xmlAttributeTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlAttributeTablePtr(int no ATTRIBUTE_UNUSED, xmlAttributeTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlCopyAttributeTable(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlCopyDocElementContent(void) { int test_ret = 0; int mem_base; xmlElementContentPtr ret_val; xmlDocPtr doc; /* the document owning the element declaration */ int n_doc; xmlElementContentPtr cur; /* An element content pointer. */ int n_cur; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_cur = 0;n_cur < gen_nb_xmlElementContentPtr;n_cur++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); cur = gen_xmlElementContentPtr(n_cur, 1); ret_val = xmlCopyDocElementContent(doc, cur); desret_xmlElementContentPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlElementContentPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyDocElementContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_cur); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCopyElementContent(void) { int test_ret = 0; int mem_base; xmlElementContentPtr ret_val; xmlElementContentPtr cur; /* An element content pointer. */ int n_cur; for (n_cur = 0;n_cur < gen_nb_xmlElementContentPtr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_xmlElementContentPtr(n_cur, 0); ret_val = xmlCopyElementContent(cur); desret_xmlElementContentPtr(ret_val); call_tests++; des_xmlElementContentPtr(n_cur, cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyElementContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } #define gen_nb_xmlElementTablePtr 1 static xmlElementTablePtr gen_xmlElementTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlElementTablePtr(int no ATTRIBUTE_UNUSED, xmlElementTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlCopyElementTable(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlCopyEnumeration(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #define gen_nb_xmlNotationTablePtr 1 static xmlNotationTablePtr gen_xmlNotationTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlNotationTablePtr(int no ATTRIBUTE_UNUSED, xmlNotationTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlCopyNotationTable(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlCreateEnumeration(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #define gen_nb_xmlAttributePtr 1 static xmlAttributePtr gen_xmlAttributePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlAttributePtr(int no ATTRIBUTE_UNUSED, xmlAttributePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlDumpAttributeDecl(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlAttributePtr attr; /* An attribute declaration */ int n_attr; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_attr = 0;n_attr < gen_nb_xmlAttributePtr;n_attr++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); attr = gen_xmlAttributePtr(n_attr, 1); xmlDumpAttributeDecl(buf, attr); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlAttributePtr(n_attr, attr, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpAttributeDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_attr); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDumpAttributeTable(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlAttributeTablePtr table; /* An attribute table */ int n_table; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_table = 0;n_table < gen_nb_xmlAttributeTablePtr;n_table++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); table = gen_xmlAttributeTablePtr(n_table, 1); xmlDumpAttributeTable(buf, table); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlAttributeTablePtr(n_table, table, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpAttributeTable", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_table); printf("\n"); } } } function_tests++; #endif return(test_ret); } #define gen_nb_xmlElementPtr 1 static xmlElementPtr gen_xmlElementPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlElementPtr(int no ATTRIBUTE_UNUSED, xmlElementPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlDumpElementDecl(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlElementPtr elem; /* An element table */ int n_elem; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_elem = 0;n_elem < gen_nb_xmlElementPtr;n_elem++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); elem = gen_xmlElementPtr(n_elem, 1); xmlDumpElementDecl(buf, elem); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlElementPtr(n_elem, elem, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpElementDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_elem); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDumpElementTable(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlElementTablePtr table; /* An element table */ int n_table; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_table = 0;n_table < gen_nb_xmlElementTablePtr;n_table++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); table = gen_xmlElementTablePtr(n_table, 1); xmlDumpElementTable(buf, table); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlElementTablePtr(n_table, table, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpElementTable", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_table); printf("\n"); } } } function_tests++; #endif return(test_ret); } #define gen_nb_xmlNotationPtr 1 static xmlNotationPtr gen_xmlNotationPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlNotationPtr(int no ATTRIBUTE_UNUSED, xmlNotationPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlDumpNotationDecl(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlNotationPtr nota; /* A notation declaration */ int n_nota; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_nota = 0;n_nota < gen_nb_xmlNotationPtr;n_nota++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); nota = gen_xmlNotationPtr(n_nota, 1); xmlDumpNotationDecl(buf, nota); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlNotationPtr(n_nota, nota, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpNotationDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_nota); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlDumpNotationTable(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlBufferPtr buf; /* the XML buffer output */ int n_buf; xmlNotationTablePtr table; /* A notation table */ int n_table; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_table = 0;n_table < gen_nb_xmlNotationTablePtr;n_table++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); table = gen_xmlNotationTablePtr(n_table, 1); xmlDumpNotationTable(buf, table); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlNotationTablePtr(n_table, table, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlDumpNotationTable", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_table); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlGetDtdAttrDesc(void) { int test_ret = 0; int mem_base; xmlAttributePtr ret_val; xmlDtdPtr dtd; /* a pointer to the DtD to search */ int n_dtd; xmlChar * elem; /* the element name */ int n_elem; xmlChar * name; /* the attribute name */ int n_name; for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); dtd = gen_xmlDtdPtr(n_dtd, 0); elem = gen_const_xmlChar_ptr(n_elem, 1); name = gen_const_xmlChar_ptr(n_name, 2); ret_val = xmlGetDtdAttrDesc(dtd, (const xmlChar *)elem, (const xmlChar *)name); desret_xmlAttributePtr(ret_val); call_tests++; des_xmlDtdPtr(n_dtd, dtd, 0); des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetDtdAttrDesc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dtd); printf(" %d", n_elem); printf(" %d", n_name); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlGetDtdElementDesc(void) { int test_ret = 0; int mem_base; xmlElementPtr ret_val; xmlDtdPtr dtd; /* a pointer to the DtD to search */ int n_dtd; xmlChar * name; /* the element name */ int n_name; for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); dtd = gen_xmlDtdPtr(n_dtd, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlGetDtdElementDesc(dtd, (const xmlChar *)name); desret_xmlElementPtr(ret_val); call_tests++; des_xmlDtdPtr(n_dtd, dtd, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetDtdElementDesc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dtd); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetDtdNotationDesc(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlGetDtdQAttrDesc(void) { int test_ret = 0; int mem_base; xmlAttributePtr ret_val; xmlDtdPtr dtd; /* a pointer to the DtD to search */ int n_dtd; xmlChar * elem; /* the element name */ int n_elem; xmlChar * name; /* the attribute name */ int n_name; xmlChar * prefix; /* the attribute namespace prefix */ int n_prefix; for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { mem_base = xmlMemBlocks(); dtd = gen_xmlDtdPtr(n_dtd, 0); elem = gen_const_xmlChar_ptr(n_elem, 1); name = gen_const_xmlChar_ptr(n_name, 2); prefix = gen_const_xmlChar_ptr(n_prefix, 3); ret_val = xmlGetDtdQAttrDesc(dtd, (const xmlChar *)elem, (const xmlChar *)name, (const xmlChar *)prefix); desret_xmlAttributePtr(ret_val); call_tests++; des_xmlDtdPtr(n_dtd, dtd, 0); des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetDtdQAttrDesc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dtd); printf(" %d", n_elem); printf(" %d", n_name); printf(" %d", n_prefix); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlGetDtdQElementDesc(void) { int test_ret = 0; int mem_base; xmlElementPtr ret_val; xmlDtdPtr dtd; /* a pointer to the DtD to search */ int n_dtd; xmlChar * name; /* the element name */ int n_name; xmlChar * prefix; /* the element namespace prefix */ int n_prefix; for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { mem_base = xmlMemBlocks(); dtd = gen_xmlDtdPtr(n_dtd, 0); name = gen_const_xmlChar_ptr(n_name, 1); prefix = gen_const_xmlChar_ptr(n_prefix, 2); ret_val = xmlGetDtdQElementDesc(dtd, (const xmlChar *)name, (const xmlChar *)prefix); desret_xmlElementPtr(ret_val); call_tests++; des_xmlDtdPtr(n_dtd, dtd, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetDtdQElementDesc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_dtd); printf(" %d", n_name); printf(" %d", n_prefix); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlGetID(void) { int test_ret = 0; int mem_base; xmlAttrPtr ret_val; xmlDocPtr doc; /* pointer to the document */ int n_doc; xmlChar * ID; /* the ID value */ int n_ID; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ID = gen_const_xmlChar_ptr(n_ID, 1); ret_val = xmlGetID(doc, (const xmlChar *)ID); desret_xmlAttrPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetID", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_ID); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlGetRefs(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlIsID(void) { int test_ret = 0; int mem_base; int ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr elem; /* the element carrying the attribute */ int n_elem; xmlAttrPtr attr; /* the attribute */ int n_attr; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); elem = gen_xmlNodePtr(n_elem, 1); attr = gen_xmlAttrPtr(n_attr, 2); ret_val = xmlIsID(doc, elem, attr); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_elem, elem, 1); des_xmlAttrPtr(n_attr, attr, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsID", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_attr); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlIsMixedElement(void) { int test_ret = 0; int mem_base; int ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the element name */ int n_name; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlIsMixedElement(doc, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsMixedElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlIsRef(void) { int test_ret = 0; int mem_base; int ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr elem; /* the element carrying the attribute */ int n_elem; xmlAttrPtr attr; /* the attribute */ int n_attr; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); elem = gen_xmlNodePtr(n_elem, 1); attr = gen_xmlAttrPtr(n_attr, 2); ret_val = xmlIsRef(doc, elem, attr); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_elem, elem, 1); des_xmlAttrPtr(n_attr, attr, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIsRef", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_attr); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewDocElementContent(void) { int test_ret = 0; int mem_base; xmlElementContentPtr ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * name; /* the subelement name or NULL */ int n_name; xmlElementContentType type; /* the type of element content decl */ int n_type; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_xmlElementContentType;n_type++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); name = gen_const_xmlChar_ptr(n_name, 1); type = gen_xmlElementContentType(n_type, 2); ret_val = xmlNewDocElementContent(doc, (const xmlChar *)name, type); xmlFreeDocElementContent(doc, ret_val); ret_val = NULL; desret_xmlElementContentPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_xmlElementContentType(n_type, type, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewDocElementContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_name); printf(" %d", n_type); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNewElementContent(void) { int test_ret = 0; int mem_base; xmlElementContentPtr ret_val; xmlChar * name; /* the subelement name or NULL */ int n_name; xmlElementContentType type; /* the type of element content decl */ int n_type; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_type = 0;n_type < gen_nb_xmlElementContentType;n_type++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); type = gen_xmlElementContentType(n_type, 1); ret_val = xmlNewElementContent((const xmlChar *)name, type); desret_xmlElementContentPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); des_xmlElementContentType(n_type, type, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewElementContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf(" %d", n_type); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlNewValidCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRemoveID(void) { int test_ret = 0; int mem_base; int ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlAttrPtr attr; /* the attribute */ int n_attr; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); attr = gen_xmlAttrPtr(n_attr, 1); ret_val = xmlRemoveID(doc, attr); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlAttrPtr(n_attr, attr, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRemoveID", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_attr); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlRemoveRef(void) { int test_ret = 0; int mem_base; int ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlAttrPtr attr; /* the attribute */ int n_attr; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); attr = gen_xmlAttrPtr(n_attr, 1); ret_val = xmlRemoveRef(doc, attr); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlAttrPtr(n_attr, attr, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRemoveRef", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_attr); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlSnprintfElementContent(void) { int test_ret = 0; int mem_base; char * buf; /* an output buffer */ int n_buf; int size; /* the buffer size */ int n_size; xmlElementContentPtr content; /* An element table */ int n_content; int englob; /* 1 if one must print the englobing parenthesis, 0 otherwise */ int n_englob; for (n_buf = 0;n_buf < gen_nb_char_ptr;n_buf++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) { for (n_englob = 0;n_englob < gen_nb_int;n_englob++) { mem_base = xmlMemBlocks(); buf = gen_char_ptr(n_buf, 0); size = gen_int(n_size, 1); content = gen_xmlElementContentPtr(n_content, 2); englob = gen_int(n_englob, 3); xmlSnprintfElementContent(buf, size, content, englob); call_tests++; des_char_ptr(n_buf, buf, 0); des_int(n_size, size, 1); des_xmlElementContentPtr(n_content, content, 2); des_int(n_englob, englob, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSnprintfElementContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_size); printf(" %d", n_content); printf(" %d", n_englob); printf("\n"); } } } } } function_tests++; return(test_ret); } static int test_xmlSprintfElementContent(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) #ifdef LIBXML_OUTPUT_ENABLED int mem_base; char * buf; /* an output buffer */ int n_buf; xmlElementContentPtr content; /* An element table */ int n_content; int englob; /* 1 if one must print the englobing parenthesis, 0 otherwise */ int n_englob; for (n_buf = 0;n_buf < gen_nb_char_ptr;n_buf++) { for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) { for (n_englob = 0;n_englob < gen_nb_int;n_englob++) { mem_base = xmlMemBlocks(); buf = gen_char_ptr(n_buf, 0); content = gen_xmlElementContentPtr(n_content, 1); englob = gen_int(n_englob, 2); xmlSprintfElementContent(buf, content, englob); call_tests++; des_char_ptr(n_buf, buf, 0); des_xmlElementContentPtr(n_content, content, 1); des_int(n_englob, englob, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSprintfElementContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_content); printf(" %d", n_englob); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlValidBuildContentModel(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* a validation context */ int n_ctxt; xmlElementPtr elem; /* an element declaration node */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_elem = 0;n_elem < gen_nb_xmlElementPtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); elem = gen_xmlElementPtr(n_elem, 1); ret_val = xmlValidBuildContentModel(ctxt, elem); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlElementPtr(n_elem, elem, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidBuildContentModel", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_elem); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlValidCtxtNormalizeAttributeValue(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; xmlChar * ret_val; xmlValidCtxtPtr ctxt; /* the validation context or NULL */ int n_ctxt; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr elem; /* the parent */ int n_elem; xmlChar * name; /* the attribute name */ int n_name; xmlChar * value; /* the attribute value */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); name = gen_const_xmlChar_ptr(n_name, 3); value = gen_const_xmlChar_ptr(n_value, 4); ret_val = xmlValidCtxtNormalizeAttributeValue(ctxt, doc, elem, (const xmlChar *)name, (const xmlChar *)value); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 3); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidCtxtNormalizeAttributeValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } #define gen_nb_xmlElementContent_ptr 1 static xmlElementContent * gen_xmlElementContent_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlElementContent_ptr(int no ATTRIBUTE_UNUSED, xmlElementContent * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlValidGetPotentialChildren(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) #ifdef LIBXML_VALID_ENABLED int mem_base; int ret_val; xmlElementContent * ctree; /* an element content tree */ int n_ctree; xmlChar ** names; /* an array to store the list of child names */ int n_names; int * len; /* a pointer to the number of element in the list */ int n_len; int max; /* the size of the array */ int n_max; for (n_ctree = 0;n_ctree < gen_nb_xmlElementContent_ptr;n_ctree++) { for (n_names = 0;n_names < gen_nb_const_xmlChar_ptr_ptr;n_names++) { for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) { for (n_max = 0;n_max < gen_nb_int;n_max++) { mem_base = xmlMemBlocks(); ctree = gen_xmlElementContent_ptr(n_ctree, 0); names = gen_const_xmlChar_ptr_ptr(n_names, 1); len = gen_int_ptr(n_len, 2); max = gen_int(n_max, 3); ret_val = xmlValidGetPotentialChildren(ctree, (const xmlChar **)names, len, max); desret_int(ret_val); call_tests++; des_xmlElementContent_ptr(n_ctree, ctree, 0); des_const_xmlChar_ptr_ptr(n_names, (const xmlChar **)names, 1); des_int_ptr(n_len, len, 2); des_int(n_max, max, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidGetPotentialChildren", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctree); printf(" %d", n_names); printf(" %d", n_len); printf(" %d", n_max); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlValidGetValidElements(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) #ifdef LIBXML_VALID_ENABLED int mem_base; int ret_val; xmlNode * prev; /* an element to insert after */ int n_prev; xmlNode * next; /* an element to insert next */ int n_next; xmlChar ** names; /* an array to store the list of child names */ int n_names; int max; /* the size of the array */ int n_max; for (n_prev = 0;n_prev < gen_nb_xmlNodePtr;n_prev++) { for (n_next = 0;n_next < gen_nb_xmlNodePtr;n_next++) { for (n_names = 0;n_names < gen_nb_const_xmlChar_ptr_ptr;n_names++) { for (n_max = 0;n_max < gen_nb_int;n_max++) { mem_base = xmlMemBlocks(); prev = gen_xmlNodePtr(n_prev, 0); next = gen_xmlNodePtr(n_next, 1); names = gen_const_xmlChar_ptr_ptr(n_names, 2); max = gen_int(n_max, 3); ret_val = xmlValidGetValidElements(prev, next, (const xmlChar **)names, max); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_prev, prev, 0); des_xmlNodePtr(n_next, next, 1); des_const_xmlChar_ptr_ptr(n_names, (const xmlChar **)names, 2); des_int(n_max, max, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidGetValidElements", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_prev); printf(" %d", n_next); printf(" %d", n_names); printf(" %d", n_max); printf("\n"); } } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlValidNormalizeAttributeValue(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; xmlChar * ret_val; xmlDocPtr doc; /* the document */ int n_doc; xmlNodePtr elem; /* the parent */ int n_elem; xmlChar * name; /* the attribute name */ int n_name; xmlChar * value; /* the attribute value */ int n_value; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); elem = gen_xmlNodePtr(n_elem, 1); name = gen_const_xmlChar_ptr(n_name, 2); value = gen_const_xmlChar_ptr(n_value, 3); ret_val = xmlValidNormalizeAttributeValue(doc, elem, (const xmlChar *)name, (const xmlChar *)value); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_elem, elem, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidNormalizeAttributeValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateAttributeDecl(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlAttributePtr attr; /* an attribute definition */ int n_attr; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_attr = 0;n_attr < gen_nb_xmlAttributePtr;n_attr++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); attr = gen_xmlAttributePtr(n_attr, 2); ret_val = xmlValidateAttributeDecl(ctxt, doc, attr); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlAttributePtr(n_attr, attr, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateAttributeDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_attr); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateAttributeValue(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlAttributeType type; /* an attribute type */ int n_type; xmlChar * value; /* an attribute value */ int n_value; for (n_type = 0;n_type < gen_nb_xmlAttributeType;n_type++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); type = gen_xmlAttributeType(n_type, 0); value = gen_const_xmlChar_ptr(n_value, 1); ret_val = xmlValidateAttributeValue(type, (const xmlChar *)value); desret_int(ret_val); call_tests++; des_xmlAttributeType(n_type, type, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateAttributeValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf(" %d", n_value); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateDocument(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlValidateDocument(ctxt, doc); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateDocumentFinal(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlValidateDocumentFinal(ctxt, doc); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateDocumentFinal", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateDtd(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlDtdPtr dtd; /* a dtd instance */ int n_dtd; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); dtd = gen_xmlDtdPtr(n_dtd, 2); ret_val = xmlValidateDtd(ctxt, doc, dtd); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlDtdPtr(n_dtd, dtd, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateDtd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_dtd); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateDtdFinal(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlValidateDtdFinal(ctxt, doc); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateDtdFinal", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateElement(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); ret_val = xmlValidateElement(ctxt, doc, elem); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateElementDecl(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlElementPtr elem; /* an element definition */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlElementPtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlElementPtr(n_elem, 2); ret_val = xmlValidateElementDecl(ctxt, doc, elem); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlElementPtr(n_elem, elem, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateElementDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateNameValue(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlChar * value; /* an Name value */ int n_value; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); ret_val = xmlValidateNameValue((const xmlChar *)value); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNameValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlValidateNamesValue(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlChar * value; /* an Names value */ int n_value; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); ret_val = xmlValidateNamesValue((const xmlChar *)value); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNamesValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlValidateNmtokenValue(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlChar * value; /* an Nmtoken value */ int n_value; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); ret_val = xmlValidateNmtokenValue((const xmlChar *)value); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNmtokenValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlValidateNmtokensValue(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlChar * value; /* an Nmtokens value */ int n_value; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); ret_val = xmlValidateNmtokensValue((const xmlChar *)value); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNmtokensValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlValidateNotationDecl(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNotationPtr nota; /* a notation definition */ int n_nota; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_nota = 0;n_nota < gen_nb_xmlNotationPtr;n_nota++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); nota = gen_xmlNotationPtr(n_nota, 2); ret_val = xmlValidateNotationDecl(ctxt, doc, nota); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNotationPtr(n_nota, nota, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNotationDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_nota); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateNotationUse(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* the document */ int n_doc; xmlChar * notationName; /* the notation name to check */ int n_notationName; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_notationName = 0;n_notationName < gen_nb_const_xmlChar_ptr;n_notationName++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); notationName = gen_const_xmlChar_ptr(n_notationName, 2); ret_val = xmlValidateNotationUse(ctxt, doc, (const xmlChar *)notationName); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_const_xmlChar_ptr(n_notationName, (const xmlChar *)notationName, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateNotationUse", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_notationName); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateOneAttribute(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; xmlAttrPtr attr; /* an attribute instance */ int n_attr; xmlChar * value; /* the attribute value (without entities processing) */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); attr = gen_xmlAttrPtr(n_attr, 3); value = gen_const_xmlChar_ptr(n_value, 4); ret_val = xmlValidateOneAttribute(ctxt, doc, elem, attr, (const xmlChar *)value); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); des_xmlAttrPtr(n_attr, attr, 3); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateOneAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_attr); printf(" %d", n_value); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateOneElement(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); ret_val = xmlValidateOneElement(ctxt, doc, elem); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateOneElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateOneNamespace(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; xmlChar * prefix; /* the namespace prefix */ int n_prefix; xmlNsPtr ns; /* an namespace declaration instance */ int n_ns; xmlChar * value; /* the attribute value (without entities processing) */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); prefix = gen_const_xmlChar_ptr(n_prefix, 3); ns = gen_xmlNsPtr(n_ns, 4); value = gen_const_xmlChar_ptr(n_value, 5); ret_val = xmlValidateOneNamespace(ctxt, doc, elem, (const xmlChar *)prefix, ns, (const xmlChar *)value); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 3); des_xmlNsPtr(n_ns, ns, 4); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateOneNamespace", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_prefix); printf(" %d", n_ns); printf(" %d", n_value); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidatePopElement(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; xmlChar * qname; /* the qualified name as appearing in the serialization */ int n_qname; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_qname = 0;n_qname < gen_nb_const_xmlChar_ptr;n_qname++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); qname = gen_const_xmlChar_ptr(n_qname, 3); ret_val = xmlValidatePopElement(ctxt, doc, elem, (const xmlChar *)qname); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); des_const_xmlChar_ptr(n_qname, (const xmlChar *)qname, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidatePopElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_qname); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidatePushCData(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlChar * data; /* some character data read */ int n_data; int len; /* the length of the data */ int n_len; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_data = 0;n_data < gen_nb_const_xmlChar_ptr;n_data++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); data = gen_const_xmlChar_ptr(n_data, 1); len = gen_int(n_len, 2); ret_val = xmlValidatePushCData(ctxt, (const xmlChar *)data, len); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_data, (const xmlChar *)data, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidatePushCData", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_data); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidatePushElement(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; xmlNodePtr elem; /* an element instance */ int n_elem; xmlChar * qname; /* the qualified name as appearing in the serialization */ int n_qname; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { for (n_qname = 0;n_qname < gen_nb_const_xmlChar_ptr;n_qname++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); elem = gen_xmlNodePtr(n_elem, 2); qname = gen_const_xmlChar_ptr(n_qname, 3); ret_val = xmlValidatePushElement(ctxt, doc, elem, (const xmlChar *)qname); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); des_xmlNodePtr(n_elem, elem, 2); des_const_xmlChar_ptr(n_qname, (const xmlChar *)qname, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidatePushElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf(" %d", n_elem); printf(" %d", n_qname); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlValidateRoot(void) { int test_ret = 0; #if defined(LIBXML_VALID_ENABLED) int mem_base; int ret_val; xmlValidCtxtPtr ctxt; /* the validation context */ int n_ctxt; xmlDocPtr doc; /* a document instance */ int n_doc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlValidateRoot(ctxt, doc); desret_int(ret_val); call_tests++; des_xmlValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlValidateRoot", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_valid(void) { int test_ret = 0; if (quiet == 0) printf("Testing valid : 50 of 70 functions ...\n"); test_ret += test_xmlAddAttributeDecl(); test_ret += test_xmlAddElementDecl(); test_ret += test_xmlAddID(); test_ret += test_xmlAddNotationDecl(); test_ret += test_xmlAddRef(); test_ret += test_xmlCopyAttributeTable(); test_ret += test_xmlCopyDocElementContent(); test_ret += test_xmlCopyElementContent(); test_ret += test_xmlCopyElementTable(); test_ret += test_xmlCopyEnumeration(); test_ret += test_xmlCopyNotationTable(); test_ret += test_xmlCreateEnumeration(); test_ret += test_xmlDumpAttributeDecl(); test_ret += test_xmlDumpAttributeTable(); test_ret += test_xmlDumpElementDecl(); test_ret += test_xmlDumpElementTable(); test_ret += test_xmlDumpNotationDecl(); test_ret += test_xmlDumpNotationTable(); test_ret += test_xmlGetDtdAttrDesc(); test_ret += test_xmlGetDtdElementDesc(); test_ret += test_xmlGetDtdNotationDesc(); test_ret += test_xmlGetDtdQAttrDesc(); test_ret += test_xmlGetDtdQElementDesc(); test_ret += test_xmlGetID(); test_ret += test_xmlGetRefs(); test_ret += test_xmlIsID(); test_ret += test_xmlIsMixedElement(); test_ret += test_xmlIsRef(); test_ret += test_xmlNewDocElementContent(); test_ret += test_xmlNewElementContent(); test_ret += test_xmlNewValidCtxt(); test_ret += test_xmlRemoveID(); test_ret += test_xmlRemoveRef(); test_ret += test_xmlSnprintfElementContent(); test_ret += test_xmlSprintfElementContent(); test_ret += test_xmlValidBuildContentModel(); test_ret += test_xmlValidCtxtNormalizeAttributeValue(); test_ret += test_xmlValidGetPotentialChildren(); test_ret += test_xmlValidGetValidElements(); test_ret += test_xmlValidNormalizeAttributeValue(); test_ret += test_xmlValidateAttributeDecl(); test_ret += test_xmlValidateAttributeValue(); test_ret += test_xmlValidateDocument(); test_ret += test_xmlValidateDocumentFinal(); test_ret += test_xmlValidateDtd(); test_ret += test_xmlValidateDtdFinal(); test_ret += test_xmlValidateElement(); test_ret += test_xmlValidateElementDecl(); test_ret += test_xmlValidateNameValue(); test_ret += test_xmlValidateNamesValue(); test_ret += test_xmlValidateNmtokenValue(); test_ret += test_xmlValidateNmtokensValue(); test_ret += test_xmlValidateNotationDecl(); test_ret += test_xmlValidateNotationUse(); test_ret += test_xmlValidateOneAttribute(); test_ret += test_xmlValidateOneElement(); test_ret += test_xmlValidateOneNamespace(); test_ret += test_xmlValidatePopElement(); test_ret += test_xmlValidatePushCData(); test_ret += test_xmlValidatePushElement(); test_ret += test_xmlValidateRoot(); if (test_ret != 0) printf("Module valid: %d errors\n", test_ret); return(test_ret); } static int test_xmlXIncludeNewContext(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXIncludeProcess(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlDocPtr doc; /* an XML document */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlXIncludeProcess(doc); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeProcess", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXIncludeProcessFlags(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlDocPtr doc; /* an XML document */ int n_doc; int flags; /* a set of xmlParserOption used for parsing XML includes */ int n_flags; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_flags = 0;n_flags < gen_nb_int;n_flags++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); flags = gen_int(n_flags, 1); ret_val = xmlXIncludeProcessFlags(doc, flags); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_int(n_flags, flags, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeProcessFlags", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_flags); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXIncludeProcessFlagsData(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlDocPtr doc; /* an XML document */ int n_doc; int flags; /* a set of xmlParserOption used for parsing XML includes */ int n_flags; void * data; /* application data that will be passed to the parser context in the _private field of the parser context(s) */ int n_data; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_flags = 0;n_flags < gen_nb_int;n_flags++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); flags = gen_int(n_flags, 1); data = gen_userdata(n_data, 2); ret_val = xmlXIncludeProcessFlagsData(doc, flags, data); desret_int(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_int(n_flags, flags, 1); des_userdata(n_data, data, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeProcessFlagsData", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_flags); printf(" %d", n_data); printf("\n"); } } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_XINCLUDE_ENABLED #define gen_nb_xmlXIncludeCtxtPtr 1 static xmlXIncludeCtxtPtr gen_xmlXIncludeCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlXIncludeCtxtPtr(int no ATTRIBUTE_UNUSED, xmlXIncludeCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlXIncludeProcessNode(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlXIncludeCtxtPtr ctxt; /* an existing XInclude context */ int n_ctxt; xmlNodePtr node; /* a node in an XML document */ int n_node; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXIncludeCtxtPtr;n_ctxt++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXIncludeCtxtPtr(n_ctxt, 0); node = gen_xmlNodePtr(n_node, 1); ret_val = xmlXIncludeProcessNode(ctxt, node); desret_int(ret_val); call_tests++; des_xmlXIncludeCtxtPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeProcessNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXIncludeProcessTree(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlNodePtr tree; /* a node in an XML document */ int n_tree; for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) { mem_base = xmlMemBlocks(); tree = gen_xmlNodePtr(n_tree, 0); ret_val = xmlXIncludeProcessTree(tree); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_tree, tree, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeProcessTree", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_tree); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXIncludeProcessTreeFlags(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlNodePtr tree; /* a node in an XML document */ int n_tree; int flags; /* a set of xmlParserOption used for parsing XML includes */ int n_flags; for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) { for (n_flags = 0;n_flags < gen_nb_int;n_flags++) { mem_base = xmlMemBlocks(); tree = gen_xmlNodePtr(n_tree, 0); flags = gen_int(n_flags, 1); ret_val = xmlXIncludeProcessTreeFlags(tree, flags); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_tree, tree, 0); des_int(n_flags, flags, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeProcessTreeFlags", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_tree); printf(" %d", n_flags); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXIncludeProcessTreeFlagsData(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlNodePtr tree; /* an XML node */ int n_tree; int flags; /* a set of xmlParserOption used for parsing XML includes */ int n_flags; void * data; /* application data that will be passed to the parser context in the _private field of the parser context(s) */ int n_data; for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) { for (n_flags = 0;n_flags < gen_nb_int;n_flags++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); tree = gen_xmlNodePtr(n_tree, 0); flags = gen_int(n_flags, 1); data = gen_userdata(n_data, 2); ret_val = xmlXIncludeProcessTreeFlagsData(tree, flags, data); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_tree, tree, 0); des_int(n_flags, flags, 1); des_userdata(n_data, data, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeProcessTreeFlagsData", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_tree); printf(" %d", n_flags); printf(" %d", n_data); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXIncludeSetFlags(void) { int test_ret = 0; #if defined(LIBXML_XINCLUDE_ENABLED) int mem_base; int ret_val; xmlXIncludeCtxtPtr ctxt; /* an XInclude processing context */ int n_ctxt; int flags; /* a set of xmlParserOption used for parsing XML includes */ int n_flags; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXIncludeCtxtPtr;n_ctxt++) { for (n_flags = 0;n_flags < gen_nb_int;n_flags++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXIncludeCtxtPtr(n_ctxt, 0); flags = gen_int(n_flags, 1); ret_val = xmlXIncludeSetFlags(ctxt, flags); desret_int(ret_val); call_tests++; des_xmlXIncludeCtxtPtr(n_ctxt, ctxt, 0); des_int(n_flags, flags, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXIncludeSetFlags", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_flags); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xinclude(void) { int test_ret = 0; if (quiet == 0) printf("Testing xinclude : 8 of 10 functions ...\n"); test_ret += test_xmlXIncludeNewContext(); test_ret += test_xmlXIncludeProcess(); test_ret += test_xmlXIncludeProcessFlags(); test_ret += test_xmlXIncludeProcessFlagsData(); test_ret += test_xmlXIncludeProcessNode(); test_ret += test_xmlXIncludeProcessTree(); test_ret += test_xmlXIncludeProcessTreeFlags(); test_ret += test_xmlXIncludeProcessTreeFlagsData(); test_ret += test_xmlXIncludeSetFlags(); if (test_ret != 0) printf("Module xinclude: %d errors\n", test_ret); return(test_ret); } static int test_xmlAllocOutputBuffer(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr ret_val; xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */ int n_encoder; for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) { mem_base = xmlMemBlocks(); encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 0); ret_val = xmlAllocOutputBuffer(encoder); desret_xmlOutputBufferPtr(ret_val); call_tests++; des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAllocOutputBuffer", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_encoder); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlAllocParserInputBuffer(void) { int test_ret = 0; int mem_base; xmlParserInputBufferPtr ret_val; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); enc = gen_xmlCharEncoding(n_enc, 0); ret_val = xmlAllocParserInputBuffer(enc); desret_xmlParserInputBufferPtr(ret_val); call_tests++; des_xmlCharEncoding(n_enc, enc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAllocParserInputBuffer", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_enc); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCheckFilename(void) { int test_ret = 0; int mem_base; int ret_val; char * path; /* the path to check */ int n_path; for (n_path = 0;n_path < gen_nb_const_char_ptr;n_path++) { mem_base = xmlMemBlocks(); path = gen_const_char_ptr(n_path, 0); ret_val = xmlCheckFilename((const char *)path); desret_int(ret_val); call_tests++; des_const_char_ptr(n_path, (const char *)path, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCheckFilename", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_path); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCheckHTTPInput(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; xmlParserCtxtPtr ctxt; /* an XML parser context */ int n_ctxt; xmlParserInputPtr ret; /* an XML parser input */ int n_ret; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_ret = 0;n_ret < gen_nb_xmlParserInputPtr;n_ret++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); ret = gen_xmlParserInputPtr(n_ret, 1); ret_val = xmlCheckHTTPInput(ctxt, ret); desret_xmlParserInputPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlParserInputPtr(n_ret, ret, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCheckHTTPInput", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_ret); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCleanupInputCallbacks(void) { int test_ret = 0; int mem_base; mem_base = xmlMemBlocks(); xmlCleanupInputCallbacks(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCleanupInputCallbacks", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlCleanupOutputCallbacks(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlCleanupOutputCallbacks(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCleanupOutputCallbacks", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlFileClose(void) { int test_ret = 0; int mem_base; int ret_val; void * context; /* the I/O context */ int n_context; for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) { mem_base = xmlMemBlocks(); context = gen_void_ptr(n_context, 0); ret_val = xmlFileClose(context); desret_int(ret_val); call_tests++; des_void_ptr(n_context, context, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlFileClose", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_context); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlFileMatch(void) { int test_ret = 0; int mem_base; int ret_val; const char * filename; /* the URI for matching */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlFileMatch(filename); desret_int(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlFileMatch", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlFileOpen(void) { int test_ret = 0; int mem_base; void * ret_val; const char * filename; /* the URI for matching */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlFileOpen(filename); desret_void_ptr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlFileOpen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlFileRead(void) { int test_ret = 0; int mem_base; int ret_val; void * context; /* the I/O context */ int n_context; char * buffer; /* where to drop data */ int n_buffer; int len; /* number of bytes to write */ int n_len; for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) { for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); context = gen_void_ptr(n_context, 0); buffer = gen_char_ptr(n_buffer, 1); len = gen_int(n_len, 2); ret_val = xmlFileRead(context, buffer, len); desret_int(ret_val); call_tests++; des_void_ptr(n_context, context, 0); des_char_ptr(n_buffer, buffer, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlFileRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_context); printf(" %d", n_buffer); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlIOFTPClose(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * context; /* the I/O context */ int n_context; for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) { mem_base = xmlMemBlocks(); context = gen_void_ptr(n_context, 0); ret_val = xmlIOFTPClose(context); desret_int(ret_val); call_tests++; des_void_ptr(n_context, context, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOFTPClose", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_context); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlIOFTPMatch(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; const char * filename; /* the URI for matching */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlIOFTPMatch(filename); desret_int(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOFTPMatch", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlIOFTPOpen(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; void * ret_val; const char * filename; /* the URI for matching */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlIOFTPOpen(filename); desret_void_ptr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOFTPOpen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlIOFTPRead(void) { int test_ret = 0; #if defined(LIBXML_FTP_ENABLED) int mem_base; int ret_val; void * context; /* the I/O context */ int n_context; char * buffer; /* where to drop data */ int n_buffer; int len; /* number of bytes to write */ int n_len; for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) { for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); context = gen_void_ptr(n_context, 0); buffer = gen_char_ptr(n_buffer, 1); len = gen_int(n_len, 2); ret_val = xmlIOFTPRead(context, buffer, len); desret_int(ret_val); call_tests++; des_void_ptr(n_context, context, 0); des_char_ptr(n_buffer, buffer, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOFTPRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_context); printf(" %d", n_buffer); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlIOHTTPClose(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; int ret_val; void * context; /* the I/O context */ int n_context; for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) { mem_base = xmlMemBlocks(); context = gen_void_ptr(n_context, 0); ret_val = xmlIOHTTPClose(context); desret_int(ret_val); call_tests++; des_void_ptr(n_context, context, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOHTTPClose", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_context); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlIOHTTPMatch(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; int ret_val; const char * filename; /* the URI for matching */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlIOHTTPMatch(filename); desret_int(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOHTTPMatch", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlIOHTTPOpen(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; void * ret_val; const char * filename; /* the URI for matching */ int n_filename; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); ret_val = xmlIOHTTPOpen(filename); desret_xmlNanoHTTPCtxtPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOHTTPOpen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlIOHTTPRead(void) { int test_ret = 0; #if defined(LIBXML_HTTP_ENABLED) int mem_base; int ret_val; void * context; /* the I/O context */ int n_context; char * buffer; /* where to drop data */ int n_buffer; int len; /* number of bytes to write */ int n_len; for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) { for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); context = gen_void_ptr(n_context, 0); buffer = gen_char_ptr(n_buffer, 1); len = gen_int(n_len, 2); ret_val = xmlIOHTTPRead(context, buffer, len); desret_int(ret_val); call_tests++; des_void_ptr(n_context, context, 0); des_char_ptr(n_buffer, buffer, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlIOHTTPRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_context); printf(" %d", n_buffer); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlNoNetExternalEntityLoader(void) { int test_ret = 0; int mem_base; xmlParserInputPtr ret_val; const char * URL; /* the URL for the entity to load */ int n_URL; char * ID; /* the System ID for the entity to load */ int n_ID; xmlParserCtxtPtr ctxt; /* the context in which the entity is called or NULL */ int n_ctxt; for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_ID = 0;n_ID < gen_nb_const_char_ptr;n_ID++) { for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); URL = gen_filepath(n_URL, 0); ID = gen_const_char_ptr(n_ID, 1); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 2); ret_val = xmlNoNetExternalEntityLoader(URL, (const char *)ID, ctxt); desret_xmlParserInputPtr(ret_val); call_tests++; des_filepath(n_URL, URL, 0); des_const_char_ptr(n_ID, (const char *)ID, 1); des_xmlParserCtxtPtr(n_ctxt, ctxt, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNoNetExternalEntityLoader", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf(" %d", n_ID); printf(" %d", n_ctxt); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlNormalizeWindowsPath(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * path; /* the input file path */ int n_path; for (n_path = 0;n_path < gen_nb_const_xmlChar_ptr;n_path++) { mem_base = xmlMemBlocks(); path = gen_const_xmlChar_ptr(n_path, 0); ret_val = xmlNormalizeWindowsPath((const xmlChar *)path); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_path, (const xmlChar *)path, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNormalizeWindowsPath", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_path); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlOutputBufferCreateBuffer(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr ret_val; xmlBufferPtr buffer; /* a xmlBufferPtr */ int n_buffer; xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */ int n_encoder; for (n_buffer = 0;n_buffer < gen_nb_xmlBufferPtr;n_buffer++) { for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) { mem_base = xmlMemBlocks(); buffer = gen_xmlBufferPtr(n_buffer, 0); encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1); ret_val = xmlOutputBufferCreateBuffer(buffer, encoder); desret_xmlOutputBufferPtr(ret_val); call_tests++; des_xmlBufferPtr(n_buffer, buffer, 0); des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferCreateBuffer", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_encoder); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlOutputBufferCreateFd(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr ret_val; int fd; /* a file descriptor number */ int n_fd; xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */ int n_encoder; for (n_fd = 0;n_fd < gen_nb_int;n_fd++) { for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) { mem_base = xmlMemBlocks(); fd = gen_int(n_fd, 0); encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1); ret_val = xmlOutputBufferCreateFd(fd, encoder); desret_xmlOutputBufferPtr(ret_val); call_tests++; des_int(n_fd, fd, 0); des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferCreateFd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_fd); printf(" %d", n_encoder); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlOutputBufferCreateFile(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr ret_val; FILE * file; /* a FILE* */ int n_file; xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */ int n_encoder; for (n_file = 0;n_file < gen_nb_FILE_ptr;n_file++) { for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) { mem_base = xmlMemBlocks(); file = gen_FILE_ptr(n_file, 0); encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1); ret_val = xmlOutputBufferCreateFile(file, encoder); desret_xmlOutputBufferPtr(ret_val); call_tests++; des_FILE_ptr(n_file, file, 0); des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferCreateFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_file); printf(" %d", n_encoder); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlOutputBufferCreateFilename(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; xmlOutputBufferPtr ret_val; const char * URI; /* a C string containing the URI or filename */ int n_URI; xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */ int n_encoder; int compression; /* the compression ration (0 none, 9 max). */ int n_compression; for (n_URI = 0;n_URI < gen_nb_fileoutput;n_URI++) { for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) { for (n_compression = 0;n_compression < gen_nb_int;n_compression++) { mem_base = xmlMemBlocks(); URI = gen_fileoutput(n_URI, 0); encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1); compression = gen_int(n_compression, 2); ret_val = xmlOutputBufferCreateFilename(URI, encoder, compression); desret_xmlOutputBufferPtr(ret_val); call_tests++; des_fileoutput(n_URI, URI, 0); des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1); des_int(n_compression, compression, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferCreateFilename", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf(" %d", n_encoder); printf(" %d", n_compression); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlOutputBufferFlush(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlOutputBufferPtr out; /* a buffered output */ int n_out; for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) { mem_base = xmlMemBlocks(); out = gen_xmlOutputBufferPtr(n_out, 0); ret_val = xmlOutputBufferFlush(out); desret_int(ret_val); call_tests++; des_xmlOutputBufferPtr(n_out, out, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferFlush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlOutputBufferGetContent(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; const xmlChar * ret_val; xmlOutputBufferPtr out; /* an xmlOutputBufferPtr */ int n_out; for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) { mem_base = xmlMemBlocks(); out = gen_xmlOutputBufferPtr(n_out, 0); ret_val = xmlOutputBufferGetContent(out); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlOutputBufferPtr(n_out, out, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferGetContent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlOutputBufferGetSize(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlOutputBufferWrite(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlOutputBufferPtr out; /* a buffered parser output */ int n_out; int len; /* the size in bytes of the array. */ int n_len; char * buf; /* an char array */ int n_buf; for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { for (n_buf = 0;n_buf < gen_nb_const_char_ptr;n_buf++) { mem_base = xmlMemBlocks(); out = gen_xmlOutputBufferPtr(n_out, 0); len = gen_int(n_len, 1); buf = gen_const_char_ptr(n_buf, 2); ret_val = xmlOutputBufferWrite(out, len, (const char *)buf); desret_int(ret_val); call_tests++; des_xmlOutputBufferPtr(n_out, out, 0); des_int(n_len, len, 1); des_const_char_ptr(n_buf, (const char *)buf, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferWrite", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_len); printf(" %d", n_buf); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlOutputBufferWriteEscape(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlOutputBufferWriteString(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlOutputBufferPtr out; /* a buffered parser output */ int n_out; char * str; /* a zero terminated C string */ int n_str; for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) { for (n_str = 0;n_str < gen_nb_const_char_ptr;n_str++) { mem_base = xmlMemBlocks(); out = gen_xmlOutputBufferPtr(n_out, 0); str = gen_const_char_ptr(n_str, 1); ret_val = xmlOutputBufferWriteString(out, (const char *)str); desret_int(ret_val); call_tests++; des_xmlOutputBufferPtr(n_out, out, 0); des_const_char_ptr(n_str, (const char *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlOutputBufferWriteString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf(" %d", n_str); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlParserGetDirectory(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParserInputBufferCreateFd(void) { int test_ret = 0; int mem_base; xmlParserInputBufferPtr ret_val; int fd; /* a file descriptor number */ int n_fd; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_fd = 0;n_fd < gen_nb_int;n_fd++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); fd = gen_int(n_fd, 0); enc = gen_xmlCharEncoding(n_enc, 1); if (fd >= 0) fd = -1; ret_val = xmlParserInputBufferCreateFd(fd, enc); desret_xmlParserInputBufferPtr(ret_val); call_tests++; des_int(n_fd, fd, 0); des_xmlCharEncoding(n_enc, enc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferCreateFd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_fd); printf(" %d", n_enc); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlParserInputBufferCreateFile(void) { int test_ret = 0; int mem_base; xmlParserInputBufferPtr ret_val; FILE * file; /* a FILE* */ int n_file; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_file = 0;n_file < gen_nb_FILE_ptr;n_file++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); file = gen_FILE_ptr(n_file, 0); enc = gen_xmlCharEncoding(n_enc, 1); ret_val = xmlParserInputBufferCreateFile(file, enc); desret_xmlParserInputBufferPtr(ret_val); call_tests++; des_FILE_ptr(n_file, file, 0); des_xmlCharEncoding(n_enc, enc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferCreateFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_file); printf(" %d", n_enc); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlParserInputBufferCreateFilename(void) { int test_ret = 0; int mem_base; xmlParserInputBufferPtr ret_val; const char * URI; /* a C string containing the URI or filename */ int n_URI; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_URI = 0;n_URI < gen_nb_fileoutput;n_URI++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); URI = gen_fileoutput(n_URI, 0); enc = gen_xmlCharEncoding(n_enc, 1); ret_val = xmlParserInputBufferCreateFilename(URI, enc); desret_xmlParserInputBufferPtr(ret_val); call_tests++; des_fileoutput(n_URI, URI, 0); des_xmlCharEncoding(n_enc, enc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferCreateFilename", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf(" %d", n_enc); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlParserInputBufferCreateMem(void) { int test_ret = 0; int mem_base; xmlParserInputBufferPtr ret_val; char * mem; /* the memory input */ int n_mem; int size; /* the length of the memory block */ int n_size; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_mem = 0;n_mem < gen_nb_const_char_ptr;n_mem++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); mem = gen_const_char_ptr(n_mem, 0); size = gen_int(n_size, 1); enc = gen_xmlCharEncoding(n_enc, 2); ret_val = xmlParserInputBufferCreateMem((const char *)mem, size, enc); desret_xmlParserInputBufferPtr(ret_val); call_tests++; des_const_char_ptr(n_mem, (const char *)mem, 0); des_int(n_size, size, 1); des_xmlCharEncoding(n_enc, enc, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferCreateMem", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_mem); printf(" %d", n_size); printf(" %d", n_enc); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlParserInputBufferCreateStatic(void) { int test_ret = 0; int mem_base; xmlParserInputBufferPtr ret_val; char * mem; /* the memory input */ int n_mem; int size; /* the length of the memory block */ int n_size; xmlCharEncoding enc; /* the charset encoding if known */ int n_enc; for (n_mem = 0;n_mem < gen_nb_const_char_ptr;n_mem++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { mem_base = xmlMemBlocks(); mem = gen_const_char_ptr(n_mem, 0); size = gen_int(n_size, 1); enc = gen_xmlCharEncoding(n_enc, 2); ret_val = xmlParserInputBufferCreateStatic((const char *)mem, size, enc); desret_xmlParserInputBufferPtr(ret_val); call_tests++; des_const_char_ptr(n_mem, (const char *)mem, 0); des_int(n_size, size, 1); des_xmlCharEncoding(n_enc, enc, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferCreateStatic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_mem); printf(" %d", n_size); printf(" %d", n_enc); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlParserInputBufferGrow(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserInputBufferPtr in; /* a buffered parser input */ int n_in; int len; /* indicative value of the amount of chars to read */ int n_len; for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); in = gen_xmlParserInputBufferPtr(n_in, 0); len = gen_int(n_len, 1); ret_val = xmlParserInputBufferGrow(in, len); desret_int(ret_val); call_tests++; des_xmlParserInputBufferPtr(n_in, in, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferGrow", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_in); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlParserInputBufferPush(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserInputBufferPtr in; /* a buffered parser input */ int n_in; int len; /* the size in bytes of the array. */ int n_len; char * buf; /* an char array */ int n_buf; for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { for (n_buf = 0;n_buf < gen_nb_const_char_ptr;n_buf++) { mem_base = xmlMemBlocks(); in = gen_xmlParserInputBufferPtr(n_in, 0); len = gen_int(n_len, 1); buf = gen_const_char_ptr(n_buf, 2); ret_val = xmlParserInputBufferPush(in, len, (const char *)buf); desret_int(ret_val); call_tests++; des_xmlParserInputBufferPtr(n_in, in, 0); des_int(n_len, len, 1); des_const_char_ptr(n_buf, (const char *)buf, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferPush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_in); printf(" %d", n_len); printf(" %d", n_buf); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlParserInputBufferRead(void) { int test_ret = 0; int mem_base; int ret_val; xmlParserInputBufferPtr in; /* a buffered parser input */ int n_in; int len; /* indicative value of the amount of chars to read */ int n_len; for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); in = gen_xmlParserInputBufferPtr(n_in, 0); len = gen_int(n_len, 1); ret_val = xmlParserInputBufferRead(in, len); desret_int(ret_val); call_tests++; des_xmlParserInputBufferPtr(n_in, in, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserInputBufferRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_in); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlPopInputCallbacks(void) { int test_ret = 0; int mem_base; int ret_val; mem_base = xmlMemBlocks(); ret_val = xmlPopInputCallbacks(); desret_int(ret_val); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlPopInputCallbacks", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlRegisterDefaultInputCallbacks(void) { int test_ret = 0; int mem_base; mem_base = xmlMemBlocks(); xmlRegisterDefaultInputCallbacks(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegisterDefaultInputCallbacks", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; return(test_ret); } static int test_xmlRegisterDefaultOutputCallbacks(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlRegisterDefaultOutputCallbacks(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegisterDefaultOutputCallbacks", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlRegisterHTTPPostCallbacks(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) && defined(LIBXML_HTTP_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlRegisterHTTPPostCallbacks(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegisterHTTPPostCallbacks", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlIO(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlIO : 40 of 50 functions ...\n"); test_ret += test_xmlAllocOutputBuffer(); test_ret += test_xmlAllocParserInputBuffer(); test_ret += test_xmlCheckFilename(); test_ret += test_xmlCheckHTTPInput(); test_ret += test_xmlCleanupInputCallbacks(); test_ret += test_xmlCleanupOutputCallbacks(); test_ret += test_xmlFileClose(); test_ret += test_xmlFileMatch(); test_ret += test_xmlFileOpen(); test_ret += test_xmlFileRead(); test_ret += test_xmlIOFTPClose(); test_ret += test_xmlIOFTPMatch(); test_ret += test_xmlIOFTPOpen(); test_ret += test_xmlIOFTPRead(); test_ret += test_xmlIOHTTPClose(); test_ret += test_xmlIOHTTPMatch(); test_ret += test_xmlIOHTTPOpen(); test_ret += test_xmlIOHTTPRead(); test_ret += test_xmlNoNetExternalEntityLoader(); test_ret += test_xmlNormalizeWindowsPath(); test_ret += test_xmlOutputBufferCreateBuffer(); test_ret += test_xmlOutputBufferCreateFd(); test_ret += test_xmlOutputBufferCreateFile(); test_ret += test_xmlOutputBufferCreateFilename(); test_ret += test_xmlOutputBufferFlush(); test_ret += test_xmlOutputBufferGetContent(); test_ret += test_xmlOutputBufferGetSize(); test_ret += test_xmlOutputBufferWrite(); test_ret += test_xmlOutputBufferWriteEscape(); test_ret += test_xmlOutputBufferWriteString(); test_ret += test_xmlParserGetDirectory(); test_ret += test_xmlParserInputBufferCreateFd(); test_ret += test_xmlParserInputBufferCreateFile(); test_ret += test_xmlParserInputBufferCreateFilename(); test_ret += test_xmlParserInputBufferCreateMem(); test_ret += test_xmlParserInputBufferCreateStatic(); test_ret += test_xmlParserInputBufferGrow(); test_ret += test_xmlParserInputBufferPush(); test_ret += test_xmlParserInputBufferRead(); test_ret += test_xmlPopInputCallbacks(); test_ret += test_xmlRegisterDefaultInputCallbacks(); test_ret += test_xmlRegisterDefaultOutputCallbacks(); test_ret += test_xmlRegisterHTTPPostCallbacks(); if (test_ret != 0) printf("Module xmlIO: %d errors\n", test_ret); return(test_ret); } #ifdef LIBXML_AUTOMATA_ENABLED #define gen_nb_xmlAutomataPtr 1 static xmlAutomataPtr gen_xmlAutomataPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlAutomataPtr(int no ATTRIBUTE_UNUSED, xmlAutomataPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlAutomataCompile(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataGetInitState(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataIsDeterminist(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) int mem_base; int ret_val; xmlAutomataPtr am; /* an automata */ int n_am; for (n_am = 0;n_am < gen_nb_xmlAutomataPtr;n_am++) { mem_base = xmlMemBlocks(); am = gen_xmlAutomataPtr(n_am, 0); ret_val = xmlAutomataIsDeterminist(am); desret_int(ret_val); call_tests++; des_xmlAutomataPtr(n_am, am, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAutomataIsDeterminist", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_am); printf("\n"); } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_AUTOMATA_ENABLED #define gen_nb_xmlAutomataStatePtr 1 static xmlAutomataStatePtr gen_xmlAutomataStatePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlAutomataStatePtr(int no ATTRIBUTE_UNUSED, xmlAutomataStatePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlAutomataNewAllTrans(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewCountTrans(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewCountTrans2(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewCountedTrans(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewCounter(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) int mem_base; int ret_val; xmlAutomataPtr am; /* an automata */ int n_am; int min; /* the minimal value on the counter */ int n_min; int max; /* the maximal value on the counter */ int n_max; for (n_am = 0;n_am < gen_nb_xmlAutomataPtr;n_am++) { for (n_min = 0;n_min < gen_nb_int;n_min++) { for (n_max = 0;n_max < gen_nb_int;n_max++) { mem_base = xmlMemBlocks(); am = gen_xmlAutomataPtr(n_am, 0); min = gen_int(n_min, 1); max = gen_int(n_max, 2); ret_val = xmlAutomataNewCounter(am, min, max); desret_int(ret_val); call_tests++; des_xmlAutomataPtr(n_am, am, 0); des_int(n_min, min, 1); des_int(n_max, max, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAutomataNewCounter", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_am); printf(" %d", n_min); printf(" %d", n_max); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlAutomataNewCounterTrans(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewEpsilon(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewNegTrans(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewOnceTrans(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewOnceTrans2(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewState(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewTransition(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataNewTransition2(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlAutomataSetFinalState(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) int mem_base; int ret_val; xmlAutomataPtr am; /* an automata */ int n_am; xmlAutomataStatePtr state; /* a state in this automata */ int n_state; for (n_am = 0;n_am < gen_nb_xmlAutomataPtr;n_am++) { for (n_state = 0;n_state < gen_nb_xmlAutomataStatePtr;n_state++) { mem_base = xmlMemBlocks(); am = gen_xmlAutomataPtr(n_am, 0); state = gen_xmlAutomataStatePtr(n_state, 1); ret_val = xmlAutomataSetFinalState(am, state); desret_int(ret_val); call_tests++; des_xmlAutomataPtr(n_am, am, 0); des_xmlAutomataStatePtr(n_state, state, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlAutomataSetFinalState", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_am); printf(" %d", n_state); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNewAutomata(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlautomata(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlautomata : 3 of 19 functions ...\n"); test_ret += test_xmlAutomataCompile(); test_ret += test_xmlAutomataGetInitState(); test_ret += test_xmlAutomataIsDeterminist(); test_ret += test_xmlAutomataNewAllTrans(); test_ret += test_xmlAutomataNewCountTrans(); test_ret += test_xmlAutomataNewCountTrans2(); test_ret += test_xmlAutomataNewCountedTrans(); test_ret += test_xmlAutomataNewCounter(); test_ret += test_xmlAutomataNewCounterTrans(); test_ret += test_xmlAutomataNewEpsilon(); test_ret += test_xmlAutomataNewNegTrans(); test_ret += test_xmlAutomataNewOnceTrans(); test_ret += test_xmlAutomataNewOnceTrans2(); test_ret += test_xmlAutomataNewState(); test_ret += test_xmlAutomataNewTransition(); test_ret += test_xmlAutomataNewTransition2(); test_ret += test_xmlAutomataSetFinalState(); test_ret += test_xmlNewAutomata(); if (test_ret != 0) printf("Module xmlautomata: %d errors\n", test_ret); return(test_ret); } #define gen_nb_xmlGenericErrorFunc_ptr 1 static xmlGenericErrorFunc * gen_xmlGenericErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlGenericErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlGenericErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_initGenericErrorDefaultFunc(void) { int test_ret = 0; int mem_base; xmlGenericErrorFunc * handler; /* the handler */ int n_handler; for (n_handler = 0;n_handler < gen_nb_xmlGenericErrorFunc_ptr;n_handler++) { mem_base = xmlMemBlocks(); handler = gen_xmlGenericErrorFunc_ptr(n_handler, 0); initGenericErrorDefaultFunc(handler); call_tests++; des_xmlGenericErrorFunc_ptr(n_handler, handler, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in initGenericErrorDefaultFunc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_handler); printf("\n"); } } function_tests++; return(test_ret); } #define gen_nb_xmlErrorPtr 1 static xmlErrorPtr gen_xmlErrorPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlErrorPtr(int no ATTRIBUTE_UNUSED, xmlErrorPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } static int test_xmlCopyError(void) { int test_ret = 0; int mem_base; int ret_val; xmlErrorPtr from; /* a source error */ int n_from; xmlErrorPtr to; /* a target error */ int n_to; for (n_from = 0;n_from < gen_nb_xmlErrorPtr;n_from++) { for (n_to = 0;n_to < gen_nb_xmlErrorPtr;n_to++) { mem_base = xmlMemBlocks(); from = gen_xmlErrorPtr(n_from, 0); to = gen_xmlErrorPtr(n_to, 1); ret_val = xmlCopyError(from, to); desret_int(ret_val); call_tests++; des_xmlErrorPtr(n_from, from, 0); des_xmlErrorPtr(n_to, to, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCopyError", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_from); printf(" %d", n_to); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCtxtGetLastError(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlCtxtResetLastError(void) { int test_ret = 0; int mem_base; void * ctx; /* an XML parser context */ int n_ctx; for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctx = gen_void_ptr(n_ctx, 0); xmlCtxtResetLastError(ctx); call_tests++; des_void_ptr(n_ctx, ctx, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCtxtResetLastError", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctx); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlGetLastError(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParserError(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParserPrintFileContext(void) { int test_ret = 0; int mem_base; xmlParserInputPtr input; /* an xmlParserInputPtr input */ int n_input; for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) { mem_base = xmlMemBlocks(); input = gen_xmlParserInputPtr(n_input, 0); xmlParserPrintFileContext(input); call_tests++; des_xmlParserInputPtr(n_input, input, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserPrintFileContext", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_input); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlParserPrintFileInfo(void) { int test_ret = 0; int mem_base; xmlParserInputPtr input; /* an xmlParserInputPtr input */ int n_input; for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) { mem_base = xmlMemBlocks(); input = gen_xmlParserInputPtr(n_input, 0); xmlParserPrintFileInfo(input); call_tests++; des_xmlParserInputPtr(n_input, input, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlParserPrintFileInfo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_input); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlParserValidityError(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParserValidityWarning(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlParserWarning(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlResetError(void) { int test_ret = 0; int mem_base; xmlErrorPtr err; /* pointer to the error. */ int n_err; for (n_err = 0;n_err < gen_nb_xmlErrorPtr;n_err++) { mem_base = xmlMemBlocks(); err = gen_xmlErrorPtr(n_err, 0); xmlResetError(err); call_tests++; des_xmlErrorPtr(n_err, err, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlResetError", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_err); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlResetLastError(void) { int test_ret = 0; xmlResetLastError(); call_tests++; xmlResetLastError(); function_tests++; return(test_ret); } static int test_xmlSetGenericErrorFunc(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSetStructuredErrorFunc(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlerror(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlerror : 7 of 15 functions ...\n"); test_ret += test_initGenericErrorDefaultFunc(); test_ret += test_xmlCopyError(); test_ret += test_xmlCtxtGetLastError(); test_ret += test_xmlCtxtResetLastError(); test_ret += test_xmlGetLastError(); test_ret += test_xmlParserError(); test_ret += test_xmlParserPrintFileContext(); test_ret += test_xmlParserPrintFileInfo(); test_ret += test_xmlParserValidityError(); test_ret += test_xmlParserValidityWarning(); test_ret += test_xmlParserWarning(); test_ret += test_xmlResetError(); test_ret += test_xmlResetLastError(); test_ret += test_xmlSetGenericErrorFunc(); test_ret += test_xmlSetStructuredErrorFunc(); if (test_ret != 0) printf("Module xmlerror: %d errors\n", test_ret); return(test_ret); } #ifdef LIBXML_MODULES_ENABLED #define gen_nb_xmlModulePtr 1 static xmlModulePtr gen_xmlModulePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlModulePtr(int no ATTRIBUTE_UNUSED, xmlModulePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlModuleClose(void) { int test_ret = 0; #if defined(LIBXML_MODULES_ENABLED) int mem_base; int ret_val; xmlModulePtr module; /* the module handle */ int n_module; for (n_module = 0;n_module < gen_nb_xmlModulePtr;n_module++) { mem_base = xmlMemBlocks(); module = gen_xmlModulePtr(n_module, 0); ret_val = xmlModuleClose(module); desret_int(ret_val); call_tests++; des_xmlModulePtr(n_module, module, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlModuleClose", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_module); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlModuleOpen(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlModuleSymbol(void) { int test_ret = 0; #if defined(LIBXML_MODULES_ENABLED) int mem_base; int ret_val; xmlModulePtr module; /* the module */ int n_module; char * name; /* the name of the symbol */ int n_name; void ** symbol; /* the resulting symbol address */ int n_symbol; for (n_module = 0;n_module < gen_nb_xmlModulePtr;n_module++) { for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) { for (n_symbol = 0;n_symbol < gen_nb_void_ptr_ptr;n_symbol++) { mem_base = xmlMemBlocks(); module = gen_xmlModulePtr(n_module, 0); name = gen_const_char_ptr(n_name, 1); symbol = gen_void_ptr_ptr(n_symbol, 2); ret_val = xmlModuleSymbol(module, (const char *)name, symbol); desret_int(ret_val); call_tests++; des_xmlModulePtr(n_module, module, 0); des_const_char_ptr(n_name, (const char *)name, 1); des_void_ptr_ptr(n_symbol, symbol, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlModuleSymbol", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_module); printf(" %d", n_name); printf(" %d", n_symbol); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlmodule(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlmodule : 2 of 4 functions ...\n"); test_ret += test_xmlModuleClose(); test_ret += test_xmlModuleOpen(); test_ret += test_xmlModuleSymbol(); if (test_ret != 0) printf("Module xmlmodule: %d errors\n", test_ret); return(test_ret); } static int test_xmlNewTextReader(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlTextReaderPtr ret_val; xmlParserInputBufferPtr input; /* the xmlParserInputBufferPtr used to read data */ int n_input; const char * URI; /* the URI information for the source if available */ int n_URI; for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) { for (n_URI = 0;n_URI < gen_nb_filepath;n_URI++) { mem_base = xmlMemBlocks(); input = gen_xmlParserInputBufferPtr(n_input, 0); URI = gen_filepath(n_URI, 1); ret_val = xmlNewTextReader(input, URI); desret_xmlTextReaderPtr(ret_val); call_tests++; des_xmlParserInputBufferPtr(n_input, input, 0); des_filepath(n_URI, URI, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextReader", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_input); printf(" %d", n_URI); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNewTextReaderFilename(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlTextReaderPtr ret_val; const char * URI; /* the URI of the resource to process */ int n_URI; for (n_URI = 0;n_URI < gen_nb_filepath;n_URI++) { mem_base = xmlMemBlocks(); URI = gen_filepath(n_URI, 0); ret_val = xmlNewTextReaderFilename(URI); desret_xmlTextReaderPtr(ret_val); call_tests++; des_filepath(n_URI, URI, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextReaderFilename", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URI); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlReaderForDoc(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlTextReaderPtr ret_val; xmlChar * cur; /* a pointer to a zero terminated string */ int n_cur; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); URL = gen_filepath(n_URL, 1); encoding = gen_const_char_ptr(n_encoding, 2); options = gen_parseroptions(n_options, 3); ret_val = xmlReaderForDoc((const xmlChar *)cur, URL, (const char *)encoding, options); desret_xmlTextReaderPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); des_filepath(n_URL, URL, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_parseroptions(n_options, options, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderForDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlReaderForFile(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlTextReaderPtr ret_val; const char * filename; /* a file or URL */ int n_filename; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); filename = gen_filepath(n_filename, 0); encoding = gen_const_char_ptr(n_encoding, 1); options = gen_parseroptions(n_options, 2); ret_val = xmlReaderForFile(filename, (const char *)encoding, options); desret_xmlTextReaderPtr(ret_val); call_tests++; des_filepath(n_filename, filename, 0); des_const_char_ptr(n_encoding, (const char *)encoding, 1); des_parseroptions(n_options, options, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderForFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_filename); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlReaderForMemory(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlTextReaderPtr ret_val; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_parseroptions(n_options, 4); ret_val = xmlReaderForMemory((const char *)buffer, size, URL, (const char *)encoding, options); desret_xmlTextReaderPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); des_filepath(n_URL, URL, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_parseroptions(n_options, options, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderForMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlReaderNewDoc(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* an XML reader */ int n_reader; xmlChar * cur; /* a pointer to a zero terminated string */ int n_cur; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); cur = gen_const_xmlChar_ptr(n_cur, 1); URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_parseroptions(n_options, 4); ret_val = xmlReaderNewDoc(reader, (const xmlChar *)cur, URL, (const char *)encoding, options); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1); des_filepath(n_URL, URL, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_parseroptions(n_options, options, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderNewDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_cur); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlReaderNewFile(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* an XML reader */ int n_reader; const char * filename; /* a file or URL */ int n_filename; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); filename = gen_filepath(n_filename, 1); encoding = gen_const_char_ptr(n_encoding, 2); options = gen_parseroptions(n_options, 3); ret_val = xmlReaderNewFile(reader, filename, (const char *)encoding, options); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_filepath(n_filename, filename, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_parseroptions(n_options, options, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderNewFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_filename); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlReaderNewMemory(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* an XML reader */ int n_reader; char * buffer; /* a pointer to a char array */ int n_buffer; int size; /* the size of the array */ int n_size; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); buffer = gen_const_char_ptr(n_buffer, 1); size = gen_int(n_size, 2); URL = gen_filepath(n_URL, 3); encoding = gen_const_char_ptr(n_encoding, 4); options = gen_parseroptions(n_options, 5); ret_val = xmlReaderNewMemory(reader, (const char *)buffer, size, URL, (const char *)encoding, options); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_char_ptr(n_buffer, (const char *)buffer, 1); des_int(n_size, size, 2); des_filepath(n_URL, URL, 3); des_const_char_ptr(n_encoding, (const char *)encoding, 4); des_parseroptions(n_options, options, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderNewMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_buffer); printf(" %d", n_size); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlReaderNewWalker(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* an XML reader */ int n_reader; xmlDocPtr doc; /* a preparsed document */ int n_doc; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlReaderNewWalker(reader, doc); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderNewWalker", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlReaderWalker(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlTextReaderPtr ret_val; xmlDocPtr doc; /* a preparsed document */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlReaderWalker(doc); desret_xmlTextReaderPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlReaderWalker", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderAttributeCount(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderAttributeCount(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderAttributeCount", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderBaseUri(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderBaseUri(reader); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderBaseUri", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderByteConsumed(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; long ret_val; xmlTextReaderPtr reader; /* an XML reader */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderByteConsumed(reader); desret_long(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderByteConsumed", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderClose(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderClose(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderClose", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstBaseUri(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstBaseUri(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstBaseUri", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstEncoding(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstEncoding(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstEncoding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstLocalName(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstLocalName(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstLocalName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstName(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstName(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstNamespaceUri(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstNamespaceUri(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstNamespaceUri", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstPrefix(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstPrefix(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstPrefix", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstString(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlChar * str; /* the string to intern. */ int n_str; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); str = gen_const_xmlChar_ptr(n_str, 1); ret_val = xmlTextReaderConstString(reader, (const xmlChar *)str); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_str); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstValue(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstValue(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstXmlLang(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstXmlLang(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstXmlLang", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderConstXmlVersion(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; const xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderConstXmlVersion(reader); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderConstXmlVersion", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderCurrentDoc(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlDocPtr ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderCurrentDoc(reader); desret_xmlDocPtr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderCurrentDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderCurrentNode(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlNodePtr ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderCurrentNode(reader); desret_xmlNodePtr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderCurrentNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderDepth(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderDepth(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderDepth", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderExpand(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlNodePtr ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderExpand(reader); desret_xmlNodePtr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderExpand", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderGetAttribute(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlChar * name; /* the qualified name of the attribute. */ int n_name; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlTextReaderGetAttribute(reader, (const xmlChar *)name); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderGetAttributeNo(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; int no; /* the zero-based index of the attribute relative to the containing element */ int n_no; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_no = 0;n_no < gen_nb_int;n_no++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); no = gen_int(n_no, 1); ret_val = xmlTextReaderGetAttributeNo(reader, no); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_int(n_no, no, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetAttributeNo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_no); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderGetAttributeNs(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlChar * localName; /* the local name of the attribute. */ int n_localName; xmlChar * namespaceURI; /* the namespace URI of the attribute. */ int n_namespaceURI; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_localName = 0;n_localName < gen_nb_const_xmlChar_ptr;n_localName++) { for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); localName = gen_const_xmlChar_ptr(n_localName, 1); namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 2); ret_val = xmlTextReaderGetAttributeNs(reader, (const xmlChar *)localName, (const xmlChar *)namespaceURI); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_localName, (const xmlChar *)localName, 1); des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetAttributeNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_localName); printf(" %d", n_namespaceURI); printf("\n"); } } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_READER_ENABLED #define gen_nb_xmlTextReaderErrorFunc_ptr 1 static xmlTextReaderErrorFunc * gen_xmlTextReaderErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlTextReaderErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlTextReaderErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlTextReaderGetErrorHandler(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlTextReaderErrorFunc * f; /* the callback function or NULL is no callback has been registered */ int n_f; void ** arg; /* a user argument */ int n_arg; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_f = 0;n_f < gen_nb_xmlTextReaderErrorFunc_ptr;n_f++) { for (n_arg = 0;n_arg < gen_nb_void_ptr_ptr;n_arg++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); f = gen_xmlTextReaderErrorFunc_ptr(n_f, 1); arg = gen_void_ptr_ptr(n_arg, 2); xmlTextReaderGetErrorHandler(reader, f, arg); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_xmlTextReaderErrorFunc_ptr(n_f, f, 1); des_void_ptr_ptr(n_arg, arg, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetErrorHandler", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_f); printf(" %d", n_arg); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderGetParserColumnNumber(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the user data (XML reader context) */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderGetParserColumnNumber(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetParserColumnNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderGetParserLineNumber(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the user data (XML reader context) */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderGetParserLineNumber(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetParserLineNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderGetParserProp(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; int prop; /* the xmlParserProperties to get */ int n_prop; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_prop = 0;n_prop < gen_nb_int;n_prop++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); prop = gen_int(n_prop, 1); ret_val = xmlTextReaderGetParserProp(reader, prop); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_int(n_prop, prop, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetParserProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_prop); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderGetRemainder(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlParserInputBufferPtr ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderGetRemainder(reader); desret_xmlParserInputBufferPtr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderGetRemainder", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderHasAttributes(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderHasAttributes(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderHasAttributes", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderHasValue(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderHasValue(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderHasValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderIsDefault(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderIsDefault(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderIsDefault", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderIsEmptyElement(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderIsEmptyElement(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderIsEmptyElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderIsNamespaceDecl(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderIsNamespaceDecl(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderIsNamespaceDecl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderIsValid(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderIsValid(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderIsValid", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderLocalName(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderLocalName(reader); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderLocalName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_READER_ENABLED #define gen_nb_xmlTextReaderLocatorPtr 1 static xmlTextReaderLocatorPtr gen_xmlTextReaderLocatorPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlTextReaderLocatorPtr(int no ATTRIBUTE_UNUSED, xmlTextReaderLocatorPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlTextReaderLocatorBaseURI(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderLocatorPtr locator; /* the xmlTextReaderLocatorPtr used */ int n_locator; for (n_locator = 0;n_locator < gen_nb_xmlTextReaderLocatorPtr;n_locator++) { mem_base = xmlMemBlocks(); locator = gen_xmlTextReaderLocatorPtr(n_locator, 0); ret_val = xmlTextReaderLocatorBaseURI(locator); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderLocatorPtr(n_locator, locator, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderLocatorBaseURI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_locator); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderLocatorLineNumber(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderLocatorPtr locator; /* the xmlTextReaderLocatorPtr used */ int n_locator; for (n_locator = 0;n_locator < gen_nb_xmlTextReaderLocatorPtr;n_locator++) { mem_base = xmlMemBlocks(); locator = gen_xmlTextReaderLocatorPtr(n_locator, 0); ret_val = xmlTextReaderLocatorLineNumber(locator); desret_int(ret_val); call_tests++; des_xmlTextReaderLocatorPtr(n_locator, locator, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderLocatorLineNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_locator); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderLookupNamespace(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlChar * prefix; /* the prefix whose namespace URI is to be resolved. To return the default namespace, specify NULL */ int n_prefix; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); ret_val = xmlTextReaderLookupNamespace(reader, (const xmlChar *)prefix); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderLookupNamespace", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_prefix); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderMoveToAttribute(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlChar * name; /* the qualified name of the attribute. */ int n_name; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlTextReaderMoveToAttribute(reader, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderMoveToAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderMoveToAttributeNo(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; int no; /* the zero-based index of the attribute relative to the containing element. */ int n_no; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_no = 0;n_no < gen_nb_int;n_no++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); no = gen_int(n_no, 1); ret_val = xmlTextReaderMoveToAttributeNo(reader, no); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_int(n_no, no, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderMoveToAttributeNo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_no); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderMoveToAttributeNs(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlChar * localName; /* the local name of the attribute. */ int n_localName; xmlChar * namespaceURI; /* the namespace URI of the attribute. */ int n_namespaceURI; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_localName = 0;n_localName < gen_nb_const_xmlChar_ptr;n_localName++) { for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); localName = gen_const_xmlChar_ptr(n_localName, 1); namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 2); ret_val = xmlTextReaderMoveToAttributeNs(reader, (const xmlChar *)localName, (const xmlChar *)namespaceURI); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_localName, (const xmlChar *)localName, 1); des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderMoveToAttributeNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_localName); printf(" %d", n_namespaceURI); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderMoveToElement(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderMoveToElement(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderMoveToElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderMoveToFirstAttribute(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderMoveToFirstAttribute(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderMoveToFirstAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderMoveToNextAttribute(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderMoveToNextAttribute(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderMoveToNextAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderName(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderName(reader); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderNamespaceUri(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderNamespaceUri(reader); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderNamespaceUri", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderNext(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderNext(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderNext", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderNextSibling(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderNextSibling(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderNextSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderNodeType(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderNodeType(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderNodeType", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderNormalization(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderNormalization(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderNormalization", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderPrefix(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderPrefix(reader); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderPrefix", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderPreserve(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlNodePtr ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderPreserve(reader); desret_xmlNodePtr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderPreserve", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderPreservePattern(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) #ifdef LIBXML_PATTERN_ENABLED int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlChar * pattern; /* an XPath subset pattern */ int n_pattern; xmlChar ** namespaces; /* the prefix definitions, array of [URI, prefix] or NULL */ int n_namespaces; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_pattern = 0;n_pattern < gen_nb_const_xmlChar_ptr;n_pattern++) { for (n_namespaces = 0;n_namespaces < gen_nb_const_xmlChar_ptr_ptr;n_namespaces++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); pattern = gen_const_xmlChar_ptr(n_pattern, 1); namespaces = gen_const_xmlChar_ptr_ptr(n_namespaces, 2); ret_val = xmlTextReaderPreservePattern(reader, (const xmlChar *)pattern, (const xmlChar **)namespaces); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_xmlChar_ptr(n_pattern, (const xmlChar *)pattern, 1); des_const_xmlChar_ptr_ptr(n_namespaces, (const xmlChar **)namespaces, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderPreservePattern", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_pattern); printf(" %d", n_namespaces); printf("\n"); } } } } function_tests++; #endif #endif return(test_ret); } static int test_xmlTextReaderQuoteChar(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderQuoteChar(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderQuoteChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderRead(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderRead(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderRead", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderReadAttributeValue(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderReadAttributeValue(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderReadAttributeValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderReadState(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderReadState(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderReadState", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderRelaxNGSetSchema(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlRelaxNGPtr schema; /* a precompiled RelaxNG schema */ int n_schema; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_schema = 0;n_schema < gen_nb_xmlRelaxNGPtr;n_schema++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); schema = gen_xmlRelaxNGPtr(n_schema, 1); ret_val = xmlTextReaderRelaxNGSetSchema(reader, schema); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_xmlRelaxNGPtr(n_schema, schema, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderRelaxNGSetSchema", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_schema); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderRelaxNGValidate(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; char * rng; /* the path to a RelaxNG schema or NULL */ int n_rng; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_rng = 0;n_rng < gen_nb_const_char_ptr;n_rng++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); rng = gen_const_char_ptr(n_rng, 1); ret_val = xmlTextReaderRelaxNGValidate(reader, (const char *)rng); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_char_ptr(n_rng, (const char *)rng, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderRelaxNGValidate", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_rng); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderRelaxNGValidateCtxt(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlRelaxNGValidCtxtPtr ctxt; /* the RelaxNG schema validation context or NULL */ int n_ctxt; int options; /* options (not used yet) */ int n_options; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 1); options = gen_parseroptions(n_options, 2); ret_val = xmlTextReaderRelaxNGValidateCtxt(reader, ctxt, options); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 1); des_parseroptions(n_options, options, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderRelaxNGValidateCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_ctxt); printf(" %d", n_options); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderSchemaValidate(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; char * xsd; /* the path to a W3C XSD schema or NULL */ int n_xsd; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_xsd = 0;n_xsd < gen_nb_const_char_ptr;n_xsd++) { reader = gen_xmlTextReaderPtr(n_reader, 0); xsd = gen_const_char_ptr(n_xsd, 1); ret_val = xmlTextReaderSchemaValidate(reader, (const char *)xsd); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_const_char_ptr(n_xsd, (const char *)xsd, 1); xmlResetLastError(); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderSchemaValidateCtxt(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlSchemaValidCtxtPtr ctxt; /* the XML Schema validation context or NULL */ int n_ctxt; int options; /* options (not used yet) */ int n_options; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 1); options = gen_parseroptions(n_options, 2); ret_val = xmlTextReaderSchemaValidateCtxt(reader, ctxt, options); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 1); des_parseroptions(n_options, options, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderSchemaValidateCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_ctxt); printf(" %d", n_options); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderSetErrorHandler(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextReaderSetParserProp(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; int prop; /* the xmlParserProperties to set */ int n_prop; int value; /* usually 0 or 1 to (de)activate it */ int n_value; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_prop = 0;n_prop < gen_nb_int;n_prop++) { for (n_value = 0;n_value < gen_nb_int;n_value++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); prop = gen_int(n_prop, 1); value = gen_int(n_value, 2); ret_val = xmlTextReaderSetParserProp(reader, prop, value); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_int(n_prop, prop, 1); des_int(n_value, value, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderSetParserProp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_prop); printf(" %d", n_value); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderSetSchema(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; xmlSchemaPtr schema; /* a precompiled Schema schema */ int n_schema; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_schema = 0;n_schema < gen_nb_xmlSchemaPtr;n_schema++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); schema = gen_xmlSchemaPtr(n_schema, 1); ret_val = xmlTextReaderSetSchema(reader, schema); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_xmlSchemaPtr(n_schema, schema, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderSetSchema", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_schema); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderSetStructuredErrorHandler(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextReaderSetup(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* an XML reader */ int n_reader; xmlParserInputBufferPtr input; /* xmlParserInputBufferPtr used to feed the reader, will be destroyed with it. */ int n_input; const char * URL; /* the base URL to use for the document */ int n_URL; char * encoding; /* the document encoding, or NULL */ int n_encoding; int options; /* a combination of xmlParserOption */ int n_options; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) { for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); input = gen_xmlParserInputBufferPtr(n_input, 1); URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_parseroptions(n_options, 4); ret_val = xmlTextReaderSetup(reader, input, URL, (const char *)encoding, options); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); des_filepath(n_URL, URL, 2); des_const_char_ptr(n_encoding, (const char *)encoding, 3); des_parseroptions(n_options, options, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderSetup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf(" %d", n_input); printf(" %d", n_URL); printf(" %d", n_encoding); printf(" %d", n_options); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderStandalone(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; int ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderStandalone(reader); desret_int(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderStandalone", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderValue(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderValue(reader); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextReaderXmlLang(void) { int test_ret = 0; #if defined(LIBXML_READER_ENABLED) int mem_base; xmlChar * ret_val; xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */ int n_reader; for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) { mem_base = xmlMemBlocks(); reader = gen_xmlTextReaderPtr(n_reader, 0); ret_val = xmlTextReaderXmlLang(reader); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlTextReaderPtr(n_reader, reader, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextReaderXmlLang", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_reader); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlreader(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlreader : 76 of 86 functions ...\n"); test_ret += test_xmlNewTextReader(); test_ret += test_xmlNewTextReaderFilename(); test_ret += test_xmlReaderForDoc(); test_ret += test_xmlReaderForFile(); test_ret += test_xmlReaderForMemory(); test_ret += test_xmlReaderNewDoc(); test_ret += test_xmlReaderNewFile(); test_ret += test_xmlReaderNewMemory(); test_ret += test_xmlReaderNewWalker(); test_ret += test_xmlReaderWalker(); test_ret += test_xmlTextReaderAttributeCount(); test_ret += test_xmlTextReaderBaseUri(); test_ret += test_xmlTextReaderByteConsumed(); test_ret += test_xmlTextReaderClose(); test_ret += test_xmlTextReaderConstBaseUri(); test_ret += test_xmlTextReaderConstEncoding(); test_ret += test_xmlTextReaderConstLocalName(); test_ret += test_xmlTextReaderConstName(); test_ret += test_xmlTextReaderConstNamespaceUri(); test_ret += test_xmlTextReaderConstPrefix(); test_ret += test_xmlTextReaderConstString(); test_ret += test_xmlTextReaderConstValue(); test_ret += test_xmlTextReaderConstXmlLang(); test_ret += test_xmlTextReaderConstXmlVersion(); test_ret += test_xmlTextReaderCurrentDoc(); test_ret += test_xmlTextReaderCurrentNode(); test_ret += test_xmlTextReaderDepth(); test_ret += test_xmlTextReaderExpand(); test_ret += test_xmlTextReaderGetAttribute(); test_ret += test_xmlTextReaderGetAttributeNo(); test_ret += test_xmlTextReaderGetAttributeNs(); test_ret += test_xmlTextReaderGetErrorHandler(); test_ret += test_xmlTextReaderGetParserColumnNumber(); test_ret += test_xmlTextReaderGetParserLineNumber(); test_ret += test_xmlTextReaderGetParserProp(); test_ret += test_xmlTextReaderGetRemainder(); test_ret += test_xmlTextReaderHasAttributes(); test_ret += test_xmlTextReaderHasValue(); test_ret += test_xmlTextReaderIsDefault(); test_ret += test_xmlTextReaderIsEmptyElement(); test_ret += test_xmlTextReaderIsNamespaceDecl(); test_ret += test_xmlTextReaderIsValid(); test_ret += test_xmlTextReaderLocalName(); test_ret += test_xmlTextReaderLocatorBaseURI(); test_ret += test_xmlTextReaderLocatorLineNumber(); test_ret += test_xmlTextReaderLookupNamespace(); test_ret += test_xmlTextReaderMoveToAttribute(); test_ret += test_xmlTextReaderMoveToAttributeNo(); test_ret += test_xmlTextReaderMoveToAttributeNs(); test_ret += test_xmlTextReaderMoveToElement(); test_ret += test_xmlTextReaderMoveToFirstAttribute(); test_ret += test_xmlTextReaderMoveToNextAttribute(); test_ret += test_xmlTextReaderName(); test_ret += test_xmlTextReaderNamespaceUri(); test_ret += test_xmlTextReaderNext(); test_ret += test_xmlTextReaderNextSibling(); test_ret += test_xmlTextReaderNodeType(); test_ret += test_xmlTextReaderNormalization(); test_ret += test_xmlTextReaderPrefix(); test_ret += test_xmlTextReaderPreserve(); test_ret += test_xmlTextReaderPreservePattern(); test_ret += test_xmlTextReaderQuoteChar(); test_ret += test_xmlTextReaderRead(); test_ret += test_xmlTextReaderReadAttributeValue(); test_ret += test_xmlTextReaderReadState(); test_ret += test_xmlTextReaderRelaxNGSetSchema(); test_ret += test_xmlTextReaderRelaxNGValidate(); test_ret += test_xmlTextReaderRelaxNGValidateCtxt(); test_ret += test_xmlTextReaderSchemaValidate(); test_ret += test_xmlTextReaderSchemaValidateCtxt(); test_ret += test_xmlTextReaderSetErrorHandler(); test_ret += test_xmlTextReaderSetParserProp(); test_ret += test_xmlTextReaderSetSchema(); test_ret += test_xmlTextReaderSetStructuredErrorHandler(); test_ret += test_xmlTextReaderSetup(); test_ret += test_xmlTextReaderStandalone(); test_ret += test_xmlTextReaderValue(); test_ret += test_xmlTextReaderXmlLang(); if (test_ret != 0) printf("Module xmlreader: %d errors\n", test_ret); return(test_ret); } static int test_xmlExpCtxtNbCons(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; int ret_val; xmlExpCtxtPtr ctxt; /* an expression context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0); ret_val = xmlExpCtxtNbCons(ctxt); desret_int(ret_val); call_tests++; des_xmlExpCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpCtxtNbCons", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlExpCtxtNbNodes(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; int ret_val; xmlExpCtxtPtr ctxt; /* an expression context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0); ret_val = xmlExpCtxtNbNodes(ctxt); desret_int(ret_val); call_tests++; des_xmlExpCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpCtxtNbNodes", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlExpDump(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; xmlBufferPtr buf; /* a buffer to receive the output */ int n_buf; xmlExpNodePtr expr; /* the compiled expression */ int n_expr; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_expr = 0;n_expr < gen_nb_xmlExpNodePtr;n_expr++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); expr = gen_xmlExpNodePtr(n_expr, 1); xmlExpDump(buf, expr); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_xmlExpNodePtr(n_expr, expr, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_expr); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlExpExpDerive(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpGetLanguage(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; int ret_val; xmlExpCtxtPtr ctxt; /* the expression context */ int n_ctxt; xmlExpNodePtr exp; /* the expression */ int n_exp; xmlChar ** langList; /* where to store the tokens */ int n_langList; int len; /* the allocated length of @list */ int n_len; for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) { for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) { for (n_langList = 0;n_langList < gen_nb_const_xmlChar_ptr_ptr;n_langList++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0); exp = gen_xmlExpNodePtr(n_exp, 1); langList = gen_const_xmlChar_ptr_ptr(n_langList, 2); len = gen_int(n_len, 3); ret_val = xmlExpGetLanguage(ctxt, exp, (const xmlChar **)langList, len); desret_int(ret_val); call_tests++; des_xmlExpCtxtPtr(n_ctxt, ctxt, 0); des_xmlExpNodePtr(n_exp, exp, 1); des_const_xmlChar_ptr_ptr(n_langList, (const xmlChar **)langList, 2); des_int(n_len, len, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpGetLanguage", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_exp); printf(" %d", n_langList); printf(" %d", n_len); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlExpGetStart(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; int ret_val; xmlExpCtxtPtr ctxt; /* the expression context */ int n_ctxt; xmlExpNodePtr exp; /* the expression */ int n_exp; xmlChar ** tokList; /* where to store the tokens */ int n_tokList; int len; /* the allocated length of @list */ int n_len; for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) { for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) { for (n_tokList = 0;n_tokList < gen_nb_const_xmlChar_ptr_ptr;n_tokList++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0); exp = gen_xmlExpNodePtr(n_exp, 1); tokList = gen_const_xmlChar_ptr_ptr(n_tokList, 2); len = gen_int(n_len, 3); ret_val = xmlExpGetStart(ctxt, exp, (const xmlChar **)tokList, len); desret_int(ret_val); call_tests++; des_xmlExpCtxtPtr(n_ctxt, ctxt, 0); des_xmlExpNodePtr(n_exp, exp, 1); des_const_xmlChar_ptr_ptr(n_tokList, (const xmlChar **)tokList, 2); des_int(n_len, len, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpGetStart", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_exp); printf(" %d", n_tokList); printf(" %d", n_len); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlExpIsNillable(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; int ret_val; xmlExpNodePtr exp; /* the expression */ int n_exp; for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) { mem_base = xmlMemBlocks(); exp = gen_xmlExpNodePtr(n_exp, 0); ret_val = xmlExpIsNillable(exp); desret_int(ret_val); call_tests++; des_xmlExpNodePtr(n_exp, exp, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpIsNillable", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_exp); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlExpMaxToken(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; int ret_val; xmlExpNodePtr expr; /* a compiled expression */ int n_expr; for (n_expr = 0;n_expr < gen_nb_xmlExpNodePtr;n_expr++) { mem_base = xmlMemBlocks(); expr = gen_xmlExpNodePtr(n_expr, 0); ret_val = xmlExpMaxToken(expr); desret_int(ret_val); call_tests++; des_xmlExpNodePtr(n_expr, expr, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpMaxToken", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_expr); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlExpNewAtom(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpNewCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpNewOr(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpNewRange(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpNewSeq(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpParse(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpRef(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; xmlExpNodePtr exp; /* the expression */ int n_exp; for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) { mem_base = xmlMemBlocks(); exp = gen_xmlExpNodePtr(n_exp, 0); xmlExpRef(exp); call_tests++; des_xmlExpNodePtr(n_exp, exp, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpRef", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_exp); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlExpStringDerive(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlExpSubsume(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) int mem_base; int ret_val; xmlExpCtxtPtr ctxt; /* the expressions context */ int n_ctxt; xmlExpNodePtr exp; /* the englobing expression */ int n_exp; xmlExpNodePtr sub; /* the subexpression */ int n_sub; for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) { for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) { for (n_sub = 0;n_sub < gen_nb_xmlExpNodePtr;n_sub++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0); exp = gen_xmlExpNodePtr(n_exp, 1); sub = gen_xmlExpNodePtr(n_sub, 2); ret_val = xmlExpSubsume(ctxt, exp, sub); desret_int(ret_val); call_tests++; des_xmlExpCtxtPtr(n_ctxt, ctxt, 0); des_xmlExpNodePtr(n_exp, exp, 1); des_xmlExpNodePtr(n_sub, sub, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlExpSubsume", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_exp); printf(" %d", n_sub); printf("\n"); } } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_REGEXP_ENABLED #define gen_nb_xmlRegExecCtxtPtr 1 static xmlRegExecCtxtPtr gen_xmlRegExecCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlRegExecCtxtPtr(int no ATTRIBUTE_UNUSED, xmlRegExecCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlRegExecErrInfo(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlRegExecCtxtPtr exec; /* a regexp execution context generating an error */ int n_exec; xmlChar ** string; /* return value for the error string */ int n_string; int * nbval; /* pointer to the number of accepted values IN/OUT */ int n_nbval; int * nbneg; /* return number of negative transitions */ int n_nbneg; xmlChar ** values; /* pointer to the array of acceptable values */ int n_values; int * terminal; /* return value if this was a terminal state */ int n_terminal; for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) { for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr_ptr;n_string++) { for (n_nbval = 0;n_nbval < gen_nb_int_ptr;n_nbval++) { for (n_nbneg = 0;n_nbneg < gen_nb_int_ptr;n_nbneg++) { for (n_values = 0;n_values < gen_nb_xmlChar_ptr_ptr;n_values++) { for (n_terminal = 0;n_terminal < gen_nb_int_ptr;n_terminal++) { mem_base = xmlMemBlocks(); exec = gen_xmlRegExecCtxtPtr(n_exec, 0); string = gen_const_xmlChar_ptr_ptr(n_string, 1); nbval = gen_int_ptr(n_nbval, 2); nbneg = gen_int_ptr(n_nbneg, 3); values = gen_xmlChar_ptr_ptr(n_values, 4); terminal = gen_int_ptr(n_terminal, 5); ret_val = xmlRegExecErrInfo(exec, (const xmlChar **)string, nbval, nbneg, values, terminal); desret_int(ret_val); call_tests++; des_xmlRegExecCtxtPtr(n_exec, exec, 0); des_const_xmlChar_ptr_ptr(n_string, (const xmlChar **)string, 1); des_int_ptr(n_nbval, nbval, 2); des_int_ptr(n_nbneg, nbneg, 3); des_xmlChar_ptr_ptr(n_values, values, 4); des_int_ptr(n_terminal, terminal, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegExecErrInfo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_exec); printf(" %d", n_string); printf(" %d", n_nbval); printf(" %d", n_nbneg); printf(" %d", n_values); printf(" %d", n_terminal); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlRegExecNextValues(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlRegExecCtxtPtr exec; /* a regexp execution context */ int n_exec; int * nbval; /* pointer to the number of accepted values IN/OUT */ int n_nbval; int * nbneg; /* return number of negative transitions */ int n_nbneg; xmlChar ** values; /* pointer to the array of acceptable values */ int n_values; int * terminal; /* return value if this was a terminal state */ int n_terminal; for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) { for (n_nbval = 0;n_nbval < gen_nb_int_ptr;n_nbval++) { for (n_nbneg = 0;n_nbneg < gen_nb_int_ptr;n_nbneg++) { for (n_values = 0;n_values < gen_nb_xmlChar_ptr_ptr;n_values++) { for (n_terminal = 0;n_terminal < gen_nb_int_ptr;n_terminal++) { mem_base = xmlMemBlocks(); exec = gen_xmlRegExecCtxtPtr(n_exec, 0); nbval = gen_int_ptr(n_nbval, 1); nbneg = gen_int_ptr(n_nbneg, 2); values = gen_xmlChar_ptr_ptr(n_values, 3); terminal = gen_int_ptr(n_terminal, 4); ret_val = xmlRegExecNextValues(exec, nbval, nbneg, values, terminal); desret_int(ret_val); call_tests++; des_xmlRegExecCtxtPtr(n_exec, exec, 0); des_int_ptr(n_nbval, nbval, 1); des_int_ptr(n_nbneg, nbneg, 2); des_xmlChar_ptr_ptr(n_values, values, 3); des_int_ptr(n_terminal, terminal, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegExecNextValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_exec); printf(" %d", n_nbval); printf(" %d", n_nbneg); printf(" %d", n_values); printf(" %d", n_terminal); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlRegExecPushString(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlRegExecCtxtPtr exec; /* a regexp execution context or NULL to indicate the end */ int n_exec; xmlChar * value; /* a string token input */ int n_value; void * data; /* data associated to the token to reuse in callbacks */ int n_data; for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); exec = gen_xmlRegExecCtxtPtr(n_exec, 0); value = gen_const_xmlChar_ptr(n_value, 1); data = gen_userdata(n_data, 2); ret_val = xmlRegExecPushString(exec, (const xmlChar *)value, data); desret_int(ret_val); call_tests++; des_xmlRegExecCtxtPtr(n_exec, exec, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_userdata(n_data, data, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegExecPushString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_exec); printf(" %d", n_value); printf(" %d", n_data); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlRegExecPushString2(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlRegExecCtxtPtr exec; /* a regexp execution context or NULL to indicate the end */ int n_exec; xmlChar * value; /* the first string token input */ int n_value; xmlChar * value2; /* the second string token input */ int n_value2; void * data; /* data associated to the token to reuse in callbacks */ int n_data; for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_value2 = 0;n_value2 < gen_nb_const_xmlChar_ptr;n_value2++) { for (n_data = 0;n_data < gen_nb_userdata;n_data++) { mem_base = xmlMemBlocks(); exec = gen_xmlRegExecCtxtPtr(n_exec, 0); value = gen_const_xmlChar_ptr(n_value, 1); value2 = gen_const_xmlChar_ptr(n_value2, 2); data = gen_userdata(n_data, 3); ret_val = xmlRegExecPushString2(exec, (const xmlChar *)value, (const xmlChar *)value2, data); desret_int(ret_val); call_tests++; des_xmlRegExecCtxtPtr(n_exec, exec, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_const_xmlChar_ptr(n_value2, (const xmlChar *)value2, 2); des_userdata(n_data, data, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegExecPushString2", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_exec); printf(" %d", n_value); printf(" %d", n_value2); printf(" %d", n_data); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_REGEXP_ENABLED #define gen_nb_xmlRegexpPtr 1 static xmlRegexpPtr gen_xmlRegexpPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlRegexpPtr(int no ATTRIBUTE_UNUSED, xmlRegexpPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlRegNewExecCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRegexpCompile(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlRegexpExec(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlRegexpPtr comp; /* the compiled regular expression */ int n_comp; xmlChar * content; /* the value to check against the regular expression */ int n_content; for (n_comp = 0;n_comp < gen_nb_xmlRegexpPtr;n_comp++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); comp = gen_xmlRegexpPtr(n_comp, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlRegexpExec(comp, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlRegexpPtr(n_comp, comp, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegexpExec", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf(" %d", n_content); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlRegexpIsDeterminist(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) int mem_base; int ret_val; xmlRegexpPtr comp; /* the compiled regular expression */ int n_comp; for (n_comp = 0;n_comp < gen_nb_xmlRegexpPtr;n_comp++) { mem_base = xmlMemBlocks(); comp = gen_xmlRegexpPtr(n_comp, 0); ret_val = xmlRegexpIsDeterminist(comp); desret_int(ret_val); call_tests++; des_xmlRegexpPtr(n_comp, comp, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegexpIsDeterminist", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlRegexpPrint(void) { int test_ret = 0; #if defined(LIBXML_REGEXP_ENABLED) int mem_base; FILE * output; /* the file for the output debug */ int n_output; xmlRegexpPtr regexp; /* the compiled regexp */ int n_regexp; for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) { for (n_regexp = 0;n_regexp < gen_nb_xmlRegexpPtr;n_regexp++) { mem_base = xmlMemBlocks(); output = gen_FILE_ptr(n_output, 0); regexp = gen_xmlRegexpPtr(n_regexp, 1); xmlRegexpPrint(output, regexp); call_tests++; des_FILE_ptr(n_output, output, 0); des_xmlRegexpPtr(n_regexp, regexp, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlRegexpPrint", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_regexp); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlregexp(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlregexp : 16 of 30 functions ...\n"); test_ret += test_xmlExpCtxtNbCons(); test_ret += test_xmlExpCtxtNbNodes(); test_ret += test_xmlExpDump(); test_ret += test_xmlExpExpDerive(); test_ret += test_xmlExpGetLanguage(); test_ret += test_xmlExpGetStart(); test_ret += test_xmlExpIsNillable(); test_ret += test_xmlExpMaxToken(); test_ret += test_xmlExpNewAtom(); test_ret += test_xmlExpNewCtxt(); test_ret += test_xmlExpNewOr(); test_ret += test_xmlExpNewRange(); test_ret += test_xmlExpNewSeq(); test_ret += test_xmlExpParse(); test_ret += test_xmlExpRef(); test_ret += test_xmlExpStringDerive(); test_ret += test_xmlExpSubsume(); test_ret += test_xmlRegExecErrInfo(); test_ret += test_xmlRegExecNextValues(); test_ret += test_xmlRegExecPushString(); test_ret += test_xmlRegExecPushString2(); test_ret += test_xmlRegNewExecCtxt(); test_ret += test_xmlRegexpCompile(); test_ret += test_xmlRegexpExec(); test_ret += test_xmlRegexpIsDeterminist(); test_ret += test_xmlRegexpPrint(); if (test_ret != 0) printf("Module xmlregexp: %d errors\n", test_ret); return(test_ret); } #ifdef LIBXML_OUTPUT_ENABLED #define gen_nb_xmlSaveCtxtPtr 1 static xmlSaveCtxtPtr gen_xmlSaveCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSaveCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSaveCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSaveClose(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlSaveCtxtPtr ctxt; /* a document saving context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0); ret_val = xmlSaveClose(ctxt); desret_int(ret_val); call_tests++; des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveClose", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSaveDoc(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; long ret_val; xmlSaveCtxtPtr ctxt; /* a document saving context */ int n_ctxt; xmlDocPtr doc; /* a document */ int n_doc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlSaveDoc(ctxt, doc); desret_long(ret_val); call_tests++; des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSaveFlush(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; int ret_val; xmlSaveCtxtPtr ctxt; /* a document saving context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0); ret_val = xmlSaveFlush(ctxt); desret_int(ret_val); call_tests++; des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveFlush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSaveSetAttrEscape(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSaveSetEscape(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSaveToBuffer(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSaveToFd(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSaveToFilename(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSaveTree(void) { int test_ret = 0; #if defined(LIBXML_OUTPUT_ENABLED) int mem_base; long ret_val; xmlSaveCtxtPtr ctxt; /* a document saving context */ int n_ctxt; xmlNodePtr node; /* the top node of the subtree to save */ int n_node; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0); node = gen_xmlNodePtr(n_node, 1); ret_val = xmlSaveTree(ctxt, node); desret_long(ret_val); call_tests++; des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSaveTree", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlsave(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlsave : 4 of 10 functions ...\n"); test_ret += test_xmlSaveClose(); test_ret += test_xmlSaveDoc(); test_ret += test_xmlSaveFlush(); test_ret += test_xmlSaveSetAttrEscape(); test_ret += test_xmlSaveSetEscape(); test_ret += test_xmlSaveToBuffer(); test_ret += test_xmlSaveToFd(); test_ret += test_xmlSaveToFilename(); test_ret += test_xmlSaveTree(); if (test_ret != 0) printf("Module xmlsave: %d errors\n", test_ret); return(test_ret); } static int test_xmlSchemaDump(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int mem_base; FILE * output; /* the file output */ int n_output; xmlSchemaPtr schema; /* a schema structure */ int n_schema; for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) { for (n_schema = 0;n_schema < gen_nb_xmlSchemaPtr;n_schema++) { mem_base = xmlMemBlocks(); output = gen_FILE_ptr(n_output, 0); schema = gen_xmlSchemaPtr(n_schema, 1); xmlSchemaDump(output, schema); call_tests++; des_FILE_ptr(n_output, output, 0); des_xmlSchemaPtr(n_schema, schema, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaDump", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_schema); printf("\n"); } } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaParserCtxtPtr 1 static xmlSchemaParserCtxtPtr gen_xmlSchemaParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSchemaParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaValidityErrorFunc_ptr 1 static xmlSchemaValidityErrorFunc * gen_xmlSchemaValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlSchemaValidityErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaValidityWarningFunc_ptr 1 static xmlSchemaValidityWarningFunc * gen_xmlSchemaValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, xmlSchemaValidityWarningFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchemaGetParserErrors(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaParserCtxtPtr ctxt; /* a XMl-Schema parser context */ int n_ctxt; xmlSchemaValidityErrorFunc * err; /* the error callback result */ int n_err; xmlSchemaValidityWarningFunc * warn; /* the warning callback result */ int n_warn; void ** ctx; /* contextual data for the callbacks result */ int n_ctx; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaParserCtxtPtr;n_ctxt++) { for (n_err = 0;n_err < gen_nb_xmlSchemaValidityErrorFunc_ptr;n_err++) { for (n_warn = 0;n_warn < gen_nb_xmlSchemaValidityWarningFunc_ptr;n_warn++) { for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaParserCtxtPtr(n_ctxt, 0); err = gen_xmlSchemaValidityErrorFunc_ptr(n_err, 1); warn = gen_xmlSchemaValidityWarningFunc_ptr(n_warn, 2); ctx = gen_void_ptr_ptr(n_ctx, 3); ret_val = xmlSchemaGetParserErrors(ctxt, err, warn, ctx); desret_int(ret_val); call_tests++; des_xmlSchemaParserCtxtPtr(n_ctxt, ctxt, 0); des_xmlSchemaValidityErrorFunc_ptr(n_err, err, 1); des_xmlSchemaValidityWarningFunc_ptr(n_warn, warn, 2); des_void_ptr_ptr(n_ctx, ctx, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetParserErrors", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_err); printf(" %d", n_warn); printf(" %d", n_ctx); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaGetValidErrors(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* a XML-Schema validation context */ int n_ctxt; xmlSchemaValidityErrorFunc * err; /* the error function result */ int n_err; xmlSchemaValidityWarningFunc * warn; /* the warning function result */ int n_warn; void ** ctx; /* the functions context result */ int n_ctx; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { for (n_err = 0;n_err < gen_nb_xmlSchemaValidityErrorFunc_ptr;n_err++) { for (n_warn = 0;n_warn < gen_nb_xmlSchemaValidityWarningFunc_ptr;n_warn++) { for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); err = gen_xmlSchemaValidityErrorFunc_ptr(n_err, 1); warn = gen_xmlSchemaValidityWarningFunc_ptr(n_warn, 2); ctx = gen_void_ptr_ptr(n_ctx, 3); ret_val = xmlSchemaGetValidErrors(ctxt, err, warn, ctx); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlSchemaValidityErrorFunc_ptr(n_err, err, 1); des_xmlSchemaValidityWarningFunc_ptr(n_warn, warn, 2); des_void_ptr_ptr(n_ctx, ctx, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetValidErrors", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_err); printf(" %d", n_warn); printf(" %d", n_ctx); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaIsValid(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* the schema validation context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); ret_val = xmlSchemaIsValid(ctxt); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaIsValid", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaNewDocParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlSchemaParserCtxtPtr ret_val; xmlDocPtr doc; /* a preparsed document tree */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlSchemaNewDocParserCtxt(doc); desret_xmlSchemaParserCtxtPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaNewDocParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaNewMemParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlSchemaParserCtxtPtr ret_val; char * buffer; /* a pointer to a char array containing the schemas */ int n_buffer; int size; /* the size of the array */ int n_size; for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) { for (n_size = 0;n_size < gen_nb_int;n_size++) { mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); ret_val = xmlSchemaNewMemParserCtxt((const char *)buffer, size); desret_xmlSchemaParserCtxtPtr(ret_val); call_tests++; des_const_char_ptr(n_buffer, (const char *)buffer, 0); des_int(n_size, size, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaNewMemParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buffer); printf(" %d", n_size); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaNewParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlSchemaParserCtxtPtr ret_val; char * URL; /* the location of the schema */ int n_URL; for (n_URL = 0;n_URL < gen_nb_const_char_ptr;n_URL++) { mem_base = xmlMemBlocks(); URL = gen_const_char_ptr(n_URL, 0); ret_val = xmlSchemaNewParserCtxt((const char *)URL); desret_xmlSchemaParserCtxtPtr(ret_val); call_tests++; des_const_char_ptr(n_URL, (const char *)URL, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaNewParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_URL); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaNewValidCtxt(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaParse(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSAXHandlerPtr_ptr 1 static xmlSAXHandlerPtr * gen_xmlSAXHandlerPtr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSAXHandlerPtr_ptr(int no ATTRIBUTE_UNUSED, xmlSAXHandlerPtr * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchemaSAXPlug(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaSAXPlugPtr 1 static xmlSchemaSAXPlugPtr gen_xmlSchemaSAXPlugPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaSAXPlugPtr(int no ATTRIBUTE_UNUSED, xmlSchemaSAXPlugPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchemaSAXUnplug(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaSAXPlugPtr plug; /* a data structure returned by xmlSchemaSAXPlug */ int n_plug; for (n_plug = 0;n_plug < gen_nb_xmlSchemaSAXPlugPtr;n_plug++) { mem_base = xmlMemBlocks(); plug = gen_xmlSchemaSAXPlugPtr(n_plug, 0); ret_val = xmlSchemaSAXUnplug(plug); desret_int(ret_val); call_tests++; des_xmlSchemaSAXPlugPtr(n_plug, plug, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaSAXUnplug", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_plug); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaSetParserErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaSetParserStructuredErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaSetValidErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaSetValidOptions(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */ int n_ctxt; int options; /* a combination of xmlSchemaValidOption */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); options = gen_int(n_options, 1); ret_val = xmlSchemaSetValidOptions(ctxt, options); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); des_int(n_options, options, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaSetValidOptions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_options); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaSetValidStructuredErrors(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaValidCtxtGetOptions(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); ret_val = xmlSchemaValidCtxtGetOptions(ctxt); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidCtxtGetOptions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidCtxtGetParserCtxt(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlParserCtxtPtr ret_val; xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); ret_val = xmlSchemaValidCtxtGetParserCtxt(ctxt); desret_xmlParserCtxtPtr(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidCtxtGetParserCtxt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateDoc(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */ int n_ctxt; xmlDocPtr doc; /* a parsed document tree */ int n_doc; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); doc = gen_xmlDocPtr(n_doc, 1); ret_val = xmlSchemaValidateDoc(ctxt, doc); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlDocPtr(n_doc, doc, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateDoc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_doc); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateFile(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */ int n_ctxt; const char * filename; /* the URI of the instance */ int n_filename; int options; /* a future set of options, currently unused */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); filename = gen_filepath(n_filename, 1); options = gen_int(n_options, 2); ret_val = xmlSchemaValidateFile(ctxt, filename, options); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); des_filepath(n_filename, filename, 1); des_int(n_options, options, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateFile", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_filename); printf(" %d", n_options); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateOneElement(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */ int n_ctxt; xmlNodePtr elem; /* an element node */ int n_elem; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); elem = gen_xmlNodePtr(n_elem, 1); ret_val = xmlSchemaValidateOneElement(ctxt, elem); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_elem, elem, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateOneElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_elem); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateSetFilename(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlSchemaValidCtxtPtr vctxt; /* the schema validation context */ int n_vctxt; const char * filename; /* the file name */ int n_filename; for (n_vctxt = 0;n_vctxt < gen_nb_xmlSchemaValidCtxtPtr;n_vctxt++) { for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { mem_base = xmlMemBlocks(); vctxt = gen_xmlSchemaValidCtxtPtr(n_vctxt, 0); filename = gen_filepath(n_filename, 1); xmlSchemaValidateSetFilename(vctxt, filename); call_tests++; des_xmlSchemaValidCtxtPtr(n_vctxt, vctxt, 0); des_filepath(n_filename, filename, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateSetFilename", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_vctxt); printf(" %d", n_filename); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateSetLocator(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaValidateStream(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */ int n_ctxt; xmlParserInputBufferPtr input; /* the input to use for reading the data */ int n_input; xmlCharEncoding enc; /* an optional encoding information */ int n_enc; xmlSAXHandlerPtr sax; /* a SAX handler for the resulting events */ int n_sax; void * user_data; /* the context to provide to the SAX handler. */ int n_user_data; for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) { for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) { for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) { for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) { for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0); input = gen_xmlParserInputBufferPtr(n_input, 1); enc = gen_xmlCharEncoding(n_enc, 2); sax = gen_xmlSAXHandlerPtr(n_sax, 3); user_data = gen_userdata(n_user_data, 4); ret_val = xmlSchemaValidateStream(ctxt, input, enc, sax, user_data); desret_int(ret_val); call_tests++; des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0); des_xmlParserInputBufferPtr(n_input, input, 1); des_xmlCharEncoding(n_enc, enc, 2); des_xmlSAXHandlerPtr(n_sax, sax, 3); des_userdata(n_user_data, user_data, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateStream", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_input); printf(" %d", n_enc); printf(" %d", n_sax); printf(" %d", n_user_data); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlschemas(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlschemas : 16 of 27 functions ...\n"); test_ret += test_xmlSchemaDump(); test_ret += test_xmlSchemaGetParserErrors(); test_ret += test_xmlSchemaGetValidErrors(); test_ret += test_xmlSchemaIsValid(); test_ret += test_xmlSchemaNewDocParserCtxt(); test_ret += test_xmlSchemaNewMemParserCtxt(); test_ret += test_xmlSchemaNewParserCtxt(); test_ret += test_xmlSchemaNewValidCtxt(); test_ret += test_xmlSchemaParse(); test_ret += test_xmlSchemaSAXPlug(); test_ret += test_xmlSchemaSAXUnplug(); test_ret += test_xmlSchemaSetParserErrors(); test_ret += test_xmlSchemaSetParserStructuredErrors(); test_ret += test_xmlSchemaSetValidErrors(); test_ret += test_xmlSchemaSetValidOptions(); test_ret += test_xmlSchemaSetValidStructuredErrors(); test_ret += test_xmlSchemaValidCtxtGetOptions(); test_ret += test_xmlSchemaValidCtxtGetParserCtxt(); test_ret += test_xmlSchemaValidateDoc(); test_ret += test_xmlSchemaValidateFile(); test_ret += test_xmlSchemaValidateOneElement(); test_ret += test_xmlSchemaValidateSetFilename(); test_ret += test_xmlSchemaValidateSetLocator(); test_ret += test_xmlSchemaValidateStream(); if (test_ret != 0) printf("Module xmlschemas: %d errors\n", test_ret); return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaFacetPtr 1 static xmlSchemaFacetPtr gen_xmlSchemaFacetPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaFacetPtr(int no ATTRIBUTE_UNUSED, xmlSchemaFacetPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaTypePtr 1 static xmlSchemaTypePtr gen_xmlSchemaTypePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaTypePtr(int no ATTRIBUTE_UNUSED, xmlSchemaTypePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchemaCheckFacet(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaFacetPtr facet; /* the facet */ int n_facet; xmlSchemaTypePtr typeDecl; /* the schema type definition */ int n_typeDecl; xmlSchemaParserCtxtPtr pctxt; /* the schema parser context or NULL */ int n_pctxt; xmlChar * name; /* the optional name of the type */ int n_name; for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) { for (n_typeDecl = 0;n_typeDecl < gen_nb_xmlSchemaTypePtr;n_typeDecl++) { for (n_pctxt = 0;n_pctxt < gen_nb_xmlSchemaParserCtxtPtr;n_pctxt++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); facet = gen_xmlSchemaFacetPtr(n_facet, 0); typeDecl = gen_xmlSchemaTypePtr(n_typeDecl, 1); pctxt = gen_xmlSchemaParserCtxtPtr(n_pctxt, 2); name = gen_const_xmlChar_ptr(n_name, 3); ret_val = xmlSchemaCheckFacet(facet, typeDecl, pctxt, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlSchemaFacetPtr(n_facet, facet, 0); des_xmlSchemaTypePtr(n_typeDecl, typeDecl, 1); des_xmlSchemaParserCtxtPtr(n_pctxt, pctxt, 2); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaCheckFacet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_facet); printf(" %d", n_typeDecl); printf(" %d", n_pctxt); printf(" %d", n_name); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaCleanupTypes(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) xmlSchemaCleanupTypes(); call_tests++; xmlResetLastError(); function_tests++; #endif return(test_ret); } static int test_xmlSchemaCollapseString(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlChar * ret_val; xmlChar * value; /* a value */ int n_value; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); ret_val = xmlSchemaCollapseString((const xmlChar *)value); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaCollapseString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf("\n"); } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaValPtr 1 static xmlSchemaValPtr gen_xmlSchemaValPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaValPtr(int no ATTRIBUTE_UNUSED, xmlSchemaValPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchemaCompareValues(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValPtr x; /* a first value */ int n_x; xmlSchemaValPtr y; /* a second value */ int n_y; for (n_x = 0;n_x < gen_nb_xmlSchemaValPtr;n_x++) { for (n_y = 0;n_y < gen_nb_xmlSchemaValPtr;n_y++) { mem_base = xmlMemBlocks(); x = gen_xmlSchemaValPtr(n_x, 0); y = gen_xmlSchemaValPtr(n_y, 1); ret_val = xmlSchemaCompareValues(x, y); desret_int(ret_val); call_tests++; des_xmlSchemaValPtr(n_x, x, 0); des_xmlSchemaValPtr(n_y, y, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaCompareValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_x); printf(" %d", n_y); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaCompareValuesWhtsp(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValPtr x; /* a first value */ int n_x; xmlSchemaWhitespaceValueType xws; /* the whitespace value of x */ int n_xws; xmlSchemaValPtr y; /* a second value */ int n_y; xmlSchemaWhitespaceValueType yws; /* the whitespace value of y */ int n_yws; for (n_x = 0;n_x < gen_nb_xmlSchemaValPtr;n_x++) { for (n_xws = 0;n_xws < gen_nb_xmlSchemaWhitespaceValueType;n_xws++) { for (n_y = 0;n_y < gen_nb_xmlSchemaValPtr;n_y++) { for (n_yws = 0;n_yws < gen_nb_xmlSchemaWhitespaceValueType;n_yws++) { mem_base = xmlMemBlocks(); x = gen_xmlSchemaValPtr(n_x, 0); xws = gen_xmlSchemaWhitespaceValueType(n_xws, 1); y = gen_xmlSchemaValPtr(n_y, 2); yws = gen_xmlSchemaWhitespaceValueType(n_yws, 3); ret_val = xmlSchemaCompareValuesWhtsp(x, xws, y, yws); desret_int(ret_val); call_tests++; des_xmlSchemaValPtr(n_x, x, 0); des_xmlSchemaWhitespaceValueType(n_xws, xws, 1); des_xmlSchemaValPtr(n_y, y, 2); des_xmlSchemaWhitespaceValueType(n_yws, yws, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaCompareValuesWhtsp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_x); printf(" %d", n_xws); printf(" %d", n_y); printf(" %d", n_yws); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaCopyValue(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaGetBuiltInListSimpleTypeItemType(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlSchemaTypePtr ret_val; xmlSchemaTypePtr type; /* the built-in simple type. */ int n_type; for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) { mem_base = xmlMemBlocks(); type = gen_xmlSchemaTypePtr(n_type, 0); ret_val = xmlSchemaGetBuiltInListSimpleTypeItemType(type); desret_xmlSchemaTypePtr(ret_val); call_tests++; des_xmlSchemaTypePtr(n_type, type, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetBuiltInListSimpleTypeItemType", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaGetBuiltInType(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) xmlSchemaTypePtr ret_val; xmlSchemaValType type; /* the type of the built in type */ int n_type; for (n_type = 0;n_type < gen_nb_xmlSchemaValType;n_type++) { type = gen_xmlSchemaValType(n_type, 0); ret_val = xmlSchemaGetBuiltInType(type); desret_xmlSchemaTypePtr(ret_val); call_tests++; des_xmlSchemaValType(n_type, type, 0); xmlResetLastError(); } function_tests++; #endif return(test_ret); } static int test_xmlSchemaGetCanonValue(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValPtr val; /* the precomputed value */ int n_val; xmlChar ** retValue; /* the returned value */ int n_retValue; for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { for (n_retValue = 0;n_retValue < gen_nb_const_xmlChar_ptr_ptr;n_retValue++) { mem_base = xmlMemBlocks(); val = gen_xmlSchemaValPtr(n_val, 0); retValue = gen_const_xmlChar_ptr_ptr(n_retValue, 1); ret_val = xmlSchemaGetCanonValue(val, (const xmlChar **)retValue); desret_int(ret_val); call_tests++; des_xmlSchemaValPtr(n_val, val, 0); des_const_xmlChar_ptr_ptr(n_retValue, (const xmlChar **)retValue, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetCanonValue", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf(" %d", n_retValue); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaGetCanonValueWhtsp(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValPtr val; /* the precomputed value */ int n_val; xmlChar ** retValue; /* the returned value */ int n_retValue; xmlSchemaWhitespaceValueType ws; /* the whitespace type of the value */ int n_ws; for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { for (n_retValue = 0;n_retValue < gen_nb_const_xmlChar_ptr_ptr;n_retValue++) { for (n_ws = 0;n_ws < gen_nb_xmlSchemaWhitespaceValueType;n_ws++) { mem_base = xmlMemBlocks(); val = gen_xmlSchemaValPtr(n_val, 0); retValue = gen_const_xmlChar_ptr_ptr(n_retValue, 1); ws = gen_xmlSchemaWhitespaceValueType(n_ws, 2); ret_val = xmlSchemaGetCanonValueWhtsp(val, (const xmlChar **)retValue, ws); desret_int(ret_val); call_tests++; des_xmlSchemaValPtr(n_val, val, 0); des_const_xmlChar_ptr_ptr(n_retValue, (const xmlChar **)retValue, 1); des_xmlSchemaWhitespaceValueType(n_ws, ws, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetCanonValueWhtsp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf(" %d", n_retValue); printf(" %d", n_ws); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaGetFacetValueAsULong(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; unsigned long ret_val; xmlSchemaFacetPtr facet; /* an schemas type facet */ int n_facet; for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) { mem_base = xmlMemBlocks(); facet = gen_xmlSchemaFacetPtr(n_facet, 0); ret_val = xmlSchemaGetFacetValueAsULong(facet); desret_unsigned_long(ret_val); call_tests++; des_xmlSchemaFacetPtr(n_facet, facet, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetFacetValueAsULong", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_facet); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaGetPredefinedType(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlSchemaTypePtr ret_val; xmlChar * name; /* the type name */ int n_name; xmlChar * ns; /* the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" */ int n_ns; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); ns = gen_const_xmlChar_ptr(n_ns, 1); ret_val = xmlSchemaGetPredefinedType((const xmlChar *)name, (const xmlChar *)ns); desret_xmlSchemaTypePtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetPredefinedType", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf(" %d", n_ns); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaGetValType(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlSchemaValType ret_val; xmlSchemaValPtr val; /* a schemas value */ int n_val; for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlSchemaValPtr(n_val, 0); ret_val = xmlSchemaGetValType(val); desret_xmlSchemaValType(ret_val); call_tests++; des_xmlSchemaValPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaGetValType", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaInitTypes(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) xmlSchemaInitTypes(); call_tests++; xmlResetLastError(); function_tests++; #endif return(test_ret); } static int test_xmlSchemaIsBuiltInTypeFacet(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaTypePtr type; /* the built-in type */ int n_type; int facetType; /* the facet type */ int n_facetType; for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) { for (n_facetType = 0;n_facetType < gen_nb_int;n_facetType++) { mem_base = xmlMemBlocks(); type = gen_xmlSchemaTypePtr(n_type, 0); facetType = gen_int(n_facetType, 1); ret_val = xmlSchemaIsBuiltInTypeFacet(type, facetType); desret_int(ret_val); call_tests++; des_xmlSchemaTypePtr(n_type, type, 0); des_int(n_facetType, facetType, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaIsBuiltInTypeFacet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf(" %d", n_facetType); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaNewFacet(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaNewNOTATIONValue(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaNewQNameValue(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaNewStringValue(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_SCHEMAS_ENABLED #define gen_nb_xmlSchemaValPtr_ptr 1 static xmlSchemaValPtr * gen_xmlSchemaValPtr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlSchemaValPtr_ptr(int no ATTRIBUTE_UNUSED, xmlSchemaValPtr * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlSchemaValPredefTypeNode(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaTypePtr type; /* the predefined type */ int n_type; xmlChar * value; /* the value to check */ int n_value; xmlSchemaValPtr * val; /* the return computed value */ int n_val; xmlNodePtr node; /* the node containing the value */ int n_node; for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr_ptr;n_val++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); type = gen_xmlSchemaTypePtr(n_type, 0); value = gen_const_xmlChar_ptr(n_value, 1); val = gen_xmlSchemaValPtr_ptr(n_val, 2); node = gen_xmlNodePtr(n_node, 3); ret_val = xmlSchemaValPredefTypeNode(type, (const xmlChar *)value, val, node); desret_int(ret_val); call_tests++; des_xmlSchemaTypePtr(n_type, type, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_xmlSchemaValPtr_ptr(n_val, val, 2); des_xmlNodePtr(n_node, node, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValPredefTypeNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf(" %d", n_value); printf(" %d", n_val); printf(" %d", n_node); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValPredefTypeNodeNoNorm(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaTypePtr type; /* the predefined type */ int n_type; xmlChar * value; /* the value to check */ int n_value; xmlSchemaValPtr * val; /* the return computed value */ int n_val; xmlNodePtr node; /* the node containing the value */ int n_node; for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr_ptr;n_val++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); type = gen_xmlSchemaTypePtr(n_type, 0); value = gen_const_xmlChar_ptr(n_value, 1); val = gen_xmlSchemaValPtr_ptr(n_val, 2); node = gen_xmlNodePtr(n_node, 3); ret_val = xmlSchemaValPredefTypeNodeNoNorm(type, (const xmlChar *)value, val, node); desret_int(ret_val); call_tests++; des_xmlSchemaTypePtr(n_type, type, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_xmlSchemaValPtr_ptr(n_val, val, 2); des_xmlNodePtr(n_node, node, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValPredefTypeNodeNoNorm", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf(" %d", n_value); printf(" %d", n_val); printf(" %d", n_node); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateFacet(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaTypePtr base; /* the base type */ int n_base; xmlSchemaFacetPtr facet; /* the facet to check */ int n_facet; xmlChar * value; /* the lexical repr of the value to validate */ int n_value; xmlSchemaValPtr val; /* the precomputed value */ int n_val; for (n_base = 0;n_base < gen_nb_xmlSchemaTypePtr;n_base++) { for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { mem_base = xmlMemBlocks(); base = gen_xmlSchemaTypePtr(n_base, 0); facet = gen_xmlSchemaFacetPtr(n_facet, 1); value = gen_const_xmlChar_ptr(n_value, 2); val = gen_xmlSchemaValPtr(n_val, 3); ret_val = xmlSchemaValidateFacet(base, facet, (const xmlChar *)value, val); desret_int(ret_val); call_tests++; des_xmlSchemaTypePtr(n_base, base, 0); des_xmlSchemaFacetPtr(n_facet, facet, 1); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2); des_xmlSchemaValPtr(n_val, val, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateFacet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_base); printf(" %d", n_facet); printf(" %d", n_value); printf(" %d", n_val); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateFacetWhtsp(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaFacetPtr facet; /* the facet to check */ int n_facet; xmlSchemaWhitespaceValueType fws; /* the whitespace type of the facet's value */ int n_fws; xmlSchemaValType valType; /* the built-in type of the value */ int n_valType; xmlChar * value; /* the lexical (or normalized for pattern) repr of the value to validate */ int n_value; xmlSchemaValPtr val; /* the precomputed value */ int n_val; xmlSchemaWhitespaceValueType ws; /* the whitespace type of the value */ int n_ws; for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) { for (n_fws = 0;n_fws < gen_nb_xmlSchemaWhitespaceValueType;n_fws++) { for (n_valType = 0;n_valType < gen_nb_xmlSchemaValType;n_valType++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { for (n_ws = 0;n_ws < gen_nb_xmlSchemaWhitespaceValueType;n_ws++) { mem_base = xmlMemBlocks(); facet = gen_xmlSchemaFacetPtr(n_facet, 0); fws = gen_xmlSchemaWhitespaceValueType(n_fws, 1); valType = gen_xmlSchemaValType(n_valType, 2); value = gen_const_xmlChar_ptr(n_value, 3); val = gen_xmlSchemaValPtr(n_val, 4); ws = gen_xmlSchemaWhitespaceValueType(n_ws, 5); ret_val = xmlSchemaValidateFacetWhtsp(facet, fws, valType, (const xmlChar *)value, val, ws); desret_int(ret_val); call_tests++; des_xmlSchemaFacetPtr(n_facet, facet, 0); des_xmlSchemaWhitespaceValueType(n_fws, fws, 1); des_xmlSchemaValType(n_valType, valType, 2); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3); des_xmlSchemaValPtr(n_val, val, 4); des_xmlSchemaWhitespaceValueType(n_ws, ws, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateFacetWhtsp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_facet); printf(" %d", n_fws); printf(" %d", n_valType); printf(" %d", n_value); printf(" %d", n_val); printf(" %d", n_ws); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateLengthFacet(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaTypePtr type; /* the built-in type */ int n_type; xmlSchemaFacetPtr facet; /* the facet to check */ int n_facet; xmlChar * value; /* the lexical repr. of the value to be validated */ int n_value; xmlSchemaValPtr val; /* the precomputed value */ int n_val; unsigned long * length; /* the actual length of the value */ int n_length; for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) { for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { for (n_length = 0;n_length < gen_nb_unsigned_long_ptr;n_length++) { mem_base = xmlMemBlocks(); type = gen_xmlSchemaTypePtr(n_type, 0); facet = gen_xmlSchemaFacetPtr(n_facet, 1); value = gen_const_xmlChar_ptr(n_value, 2); val = gen_xmlSchemaValPtr(n_val, 3); length = gen_unsigned_long_ptr(n_length, 4); ret_val = xmlSchemaValidateLengthFacet(type, facet, (const xmlChar *)value, val, length); desret_int(ret_val); call_tests++; des_xmlSchemaTypePtr(n_type, type, 0); des_xmlSchemaFacetPtr(n_facet, facet, 1); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2); des_xmlSchemaValPtr(n_val, val, 3); des_unsigned_long_ptr(n_length, length, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateLengthFacet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf(" %d", n_facet); printf(" %d", n_value); printf(" %d", n_val); printf(" %d", n_length); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateLengthFacetWhtsp(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaFacetPtr facet; /* the facet to check */ int n_facet; xmlSchemaValType valType; /* the built-in type */ int n_valType; xmlChar * value; /* the lexical repr. of the value to be validated */ int n_value; xmlSchemaValPtr val; /* the precomputed value */ int n_val; unsigned long * length; /* the actual length of the value */ int n_length; xmlSchemaWhitespaceValueType ws; /* the whitespace type of the value */ int n_ws; for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) { for (n_valType = 0;n_valType < gen_nb_xmlSchemaValType;n_valType++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { for (n_length = 0;n_length < gen_nb_unsigned_long_ptr;n_length++) { for (n_ws = 0;n_ws < gen_nb_xmlSchemaWhitespaceValueType;n_ws++) { mem_base = xmlMemBlocks(); facet = gen_xmlSchemaFacetPtr(n_facet, 0); valType = gen_xmlSchemaValType(n_valType, 1); value = gen_const_xmlChar_ptr(n_value, 2); val = gen_xmlSchemaValPtr(n_val, 3); length = gen_unsigned_long_ptr(n_length, 4); ws = gen_xmlSchemaWhitespaceValueType(n_ws, 5); ret_val = xmlSchemaValidateLengthFacetWhtsp(facet, valType, (const xmlChar *)value, val, length, ws); desret_int(ret_val); call_tests++; des_xmlSchemaFacetPtr(n_facet, facet, 0); des_xmlSchemaValType(n_valType, valType, 1); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2); des_xmlSchemaValPtr(n_val, val, 3); des_unsigned_long_ptr(n_length, length, 4); des_xmlSchemaWhitespaceValueType(n_ws, ws, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateLengthFacetWhtsp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_facet); printf(" %d", n_valType); printf(" %d", n_value); printf(" %d", n_val); printf(" %d", n_length); printf(" %d", n_ws); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidateListSimpleTypeFacet(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaFacetPtr facet; /* the facet to check */ int n_facet; xmlChar * value; /* the lexical repr of the value to validate */ int n_value; unsigned long actualLen; /* the number of list items */ int n_actualLen; unsigned long * expectedLen; /* the resulting expected number of list items */ int n_expectedLen; for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_actualLen = 0;n_actualLen < gen_nb_unsigned_long;n_actualLen++) { for (n_expectedLen = 0;n_expectedLen < gen_nb_unsigned_long_ptr;n_expectedLen++) { mem_base = xmlMemBlocks(); facet = gen_xmlSchemaFacetPtr(n_facet, 0); value = gen_const_xmlChar_ptr(n_value, 1); actualLen = gen_unsigned_long(n_actualLen, 2); expectedLen = gen_unsigned_long_ptr(n_expectedLen, 3); ret_val = xmlSchemaValidateListSimpleTypeFacet(facet, (const xmlChar *)value, actualLen, expectedLen); desret_int(ret_val); call_tests++; des_xmlSchemaFacetPtr(n_facet, facet, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_unsigned_long(n_actualLen, actualLen, 2); des_unsigned_long_ptr(n_expectedLen, expectedLen, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidateListSimpleTypeFacet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_facet); printf(" %d", n_value); printf(" %d", n_actualLen); printf(" %d", n_expectedLen); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValidatePredefinedType(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaTypePtr type; /* the predefined type */ int n_type; xmlChar * value; /* the value to check */ int n_value; xmlSchemaValPtr * val; /* the return computed value */ int n_val; for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) { for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr_ptr;n_val++) { mem_base = xmlMemBlocks(); type = gen_xmlSchemaTypePtr(n_type, 0); value = gen_const_xmlChar_ptr(n_value, 1); val = gen_xmlSchemaValPtr_ptr(n_val, 2); ret_val = xmlSchemaValidatePredefinedType(type, (const xmlChar *)value, val); desret_int(ret_val); call_tests++; des_xmlSchemaTypePtr(n_type, type, 0); des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1); des_xmlSchemaValPtr_ptr(n_val, val, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValidatePredefinedType", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_type); printf(" %d", n_value); printf(" %d", n_val); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValueAppend(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValPtr prev; /* the value */ int n_prev; xmlSchemaValPtr cur; /* the value to be appended */ int n_cur; for (n_prev = 0;n_prev < gen_nb_xmlSchemaValPtr;n_prev++) { for (n_cur = 0;n_cur < gen_nb_xmlSchemaValPtr;n_cur++) { mem_base = xmlMemBlocks(); prev = gen_xmlSchemaValPtr(n_prev, 0); cur = gen_xmlSchemaValPtr(n_cur, 1); ret_val = xmlSchemaValueAppend(prev, cur); desret_int(ret_val); call_tests++; des_xmlSchemaValPtr(n_prev, prev, 0); des_xmlSchemaValPtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValueAppend", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_prev); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValueGetAsBoolean(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; xmlSchemaValPtr val; /* the value */ int n_val; for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlSchemaValPtr(n_val, 0); ret_val = xmlSchemaValueGetAsBoolean(val); desret_int(ret_val); call_tests++; des_xmlSchemaValPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValueGetAsBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValueGetAsString(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; const xmlChar * ret_val; xmlSchemaValPtr val; /* the value */ int n_val; for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlSchemaValPtr(n_val, 0); ret_val = xmlSchemaValueGetAsString(val); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlSchemaValPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaValueGetAsString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlSchemaValueGetNext(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlSchemaWhiteSpaceReplace(void) { int test_ret = 0; #if defined(LIBXML_SCHEMAS_ENABLED) int mem_base; xmlChar * ret_val; xmlChar * value; /* a value */ int n_value; for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) { mem_base = xmlMemBlocks(); value = gen_const_xmlChar_ptr(n_value, 0); ret_val = xmlSchemaWhiteSpaceReplace((const xmlChar *)value); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlSchemaWhiteSpaceReplace", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_value); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlschemastypes(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlschemastypes : 26 of 34 functions ...\n"); test_ret += test_xmlSchemaCheckFacet(); test_ret += test_xmlSchemaCleanupTypes(); test_ret += test_xmlSchemaCollapseString(); test_ret += test_xmlSchemaCompareValues(); test_ret += test_xmlSchemaCompareValuesWhtsp(); test_ret += test_xmlSchemaCopyValue(); test_ret += test_xmlSchemaGetBuiltInListSimpleTypeItemType(); test_ret += test_xmlSchemaGetBuiltInType(); test_ret += test_xmlSchemaGetCanonValue(); test_ret += test_xmlSchemaGetCanonValueWhtsp(); test_ret += test_xmlSchemaGetFacetValueAsULong(); test_ret += test_xmlSchemaGetPredefinedType(); test_ret += test_xmlSchemaGetValType(); test_ret += test_xmlSchemaInitTypes(); test_ret += test_xmlSchemaIsBuiltInTypeFacet(); test_ret += test_xmlSchemaNewFacet(); test_ret += test_xmlSchemaNewNOTATIONValue(); test_ret += test_xmlSchemaNewQNameValue(); test_ret += test_xmlSchemaNewStringValue(); test_ret += test_xmlSchemaValPredefTypeNode(); test_ret += test_xmlSchemaValPredefTypeNodeNoNorm(); test_ret += test_xmlSchemaValidateFacet(); test_ret += test_xmlSchemaValidateFacetWhtsp(); test_ret += test_xmlSchemaValidateLengthFacet(); test_ret += test_xmlSchemaValidateLengthFacetWhtsp(); test_ret += test_xmlSchemaValidateListSimpleTypeFacet(); test_ret += test_xmlSchemaValidatePredefinedType(); test_ret += test_xmlSchemaValueAppend(); test_ret += test_xmlSchemaValueGetAsBoolean(); test_ret += test_xmlSchemaValueGetAsString(); test_ret += test_xmlSchemaValueGetNext(); test_ret += test_xmlSchemaWhiteSpaceReplace(); if (test_ret != 0) printf("Module xmlschemastypes: %d errors\n", test_ret); return(test_ret); } static int test_xmlCharStrdup(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; char * cur; /* the input char * */ int n_cur; for (n_cur = 0;n_cur < gen_nb_const_char_ptr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_const_char_ptr(n_cur, 0); ret_val = xmlCharStrdup((const char *)cur); desret_xmlChar_ptr(ret_val); call_tests++; des_const_char_ptr(n_cur, (const char *)cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCharStrdup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlCharStrndup(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; char * cur; /* the input char * */ int n_cur; int len; /* the len of @cur */ int n_len; for (n_cur = 0;n_cur < gen_nb_const_char_ptr;n_cur++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); cur = gen_const_char_ptr(n_cur, 0); len = gen_int(n_len, 1); ret_val = xmlCharStrndup((const char *)cur, len); desret_xmlChar_ptr(ret_val); call_tests++; des_const_char_ptr(n_cur, (const char *)cur, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCharStrndup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlCheckUTF8(void) { int test_ret = 0; int mem_base; int ret_val; unsigned char * utf; /* Pointer to putative UTF-8 encoded string. */ int n_utf; for (n_utf = 0;n_utf < gen_nb_const_unsigned_char_ptr;n_utf++) { mem_base = xmlMemBlocks(); utf = gen_const_unsigned_char_ptr(n_utf, 0); ret_val = xmlCheckUTF8((const unsigned char *)utf); desret_int(ret_val); call_tests++; des_const_unsigned_char_ptr(n_utf, (const unsigned char *)utf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlCheckUTF8", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlGetUTF8Char(void) { int test_ret = 0; int mem_base; int ret_val; unsigned char * utf; /* a sequence of UTF-8 encoded bytes */ int n_utf; int * len; /* a pointer to the minimum number of bytes present in the sequence. This is used to assure the next character is completely contained within the sequence. */ int n_len; for (n_utf = 0;n_utf < gen_nb_const_unsigned_char_ptr;n_utf++) { for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) { mem_base = xmlMemBlocks(); utf = gen_const_unsigned_char_ptr(n_utf, 0); len = gen_int_ptr(n_len, 1); ret_val = xmlGetUTF8Char((const unsigned char *)utf, len); desret_int(ret_val); call_tests++; des_const_unsigned_char_ptr(n_utf, (const unsigned char *)utf, 0); des_int_ptr(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlGetUTF8Char", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrEqual(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * str1; /* the first xmlChar * */ int n_str1; xmlChar * str2; /* the second xmlChar * */ int n_str2; for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) { for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) { mem_base = xmlMemBlocks(); str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); ret_val = xmlStrEqual((const xmlChar *)str1, (const xmlChar *)str2); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0); des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrEqual", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str1); printf(" %d", n_str2); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrPrintf(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlStrQEqual(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * pref; /* the prefix of the QName */ int n_pref; xmlChar * name; /* the localname of the QName */ int n_name; xmlChar * str; /* the second xmlChar * */ int n_str; for (n_pref = 0;n_pref < gen_nb_const_xmlChar_ptr;n_pref++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); pref = gen_const_xmlChar_ptr(n_pref, 0); name = gen_const_xmlChar_ptr(n_name, 1); str = gen_const_xmlChar_ptr(n_str, 2); ret_val = xmlStrQEqual((const xmlChar *)pref, (const xmlChar *)name, (const xmlChar *)str); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_pref, (const xmlChar *)pref, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrQEqual", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_pref); printf(" %d", n_name); printf(" %d", n_str); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlStrVPrintf(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlStrcasecmp(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * str1; /* the first xmlChar * */ int n_str1; xmlChar * str2; /* the second xmlChar * */ int n_str2; for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) { for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) { mem_base = xmlMemBlocks(); str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); ret_val = xmlStrcasecmp((const xmlChar *)str1, (const xmlChar *)str2); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0); des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrcasecmp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str1); printf(" %d", n_str2); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrcasestr(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlChar * str; /* the xmlChar * array (haystack) */ int n_str; xmlChar * val; /* the xmlChar to search (needle) */ int n_val; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); val = gen_const_xmlChar_ptr(n_val, 1); ret_val = xmlStrcasestr((const xmlChar *)str, (const xmlChar *)val); desret_const_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrcasestr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_val); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrchr(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlChar * str; /* the xmlChar * array */ int n_str; xmlChar val; /* the xmlChar to search */ int n_val; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_val = 0;n_val < gen_nb_xmlChar;n_val++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); val = gen_xmlChar(n_val, 1); ret_val = xmlStrchr((const xmlChar *)str, val); desret_const_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_xmlChar(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrchr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_val); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrcmp(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * str1; /* the first xmlChar * */ int n_str1; xmlChar * str2; /* the second xmlChar * */ int n_str2; for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) { for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) { mem_base = xmlMemBlocks(); str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); ret_val = xmlStrcmp((const xmlChar *)str1, (const xmlChar *)str2); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0); des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrcmp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str1); printf(" %d", n_str2); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrdup(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * cur; /* the input xmlChar * */ int n_cur; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); ret_val = xmlStrdup((const xmlChar *)cur); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrdup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlStrlen(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * str; /* the xmlChar * array */ int n_str; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); ret_val = xmlStrlen((const xmlChar *)str); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrlen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlStrncasecmp(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * str1; /* the first xmlChar * */ int n_str1; xmlChar * str2; /* the second xmlChar * */ int n_str2; int len; /* the max comparison length */ int n_len; for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) { for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); len = gen_int(n_len, 2); ret_val = xmlStrncasecmp((const xmlChar *)str1, (const xmlChar *)str2, len); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0); des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrncasecmp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str1); printf(" %d", n_str2); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlStrncatNew(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * str1; /* first xmlChar string */ int n_str1; xmlChar * str2; /* second xmlChar string */ int n_str2; int len; /* the len of @str2 or < 0 */ int n_len; for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) { for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); len = gen_int(n_len, 2); ret_val = xmlStrncatNew((const xmlChar *)str1, (const xmlChar *)str2, len); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0); des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrncatNew", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str1); printf(" %d", n_str2); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlStrncmp(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * str1; /* the first xmlChar * */ int n_str1; xmlChar * str2; /* the second xmlChar * */ int n_str2; int len; /* the max comparison length */ int n_len; for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) { for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); len = gen_int(n_len, 2); ret_val = xmlStrncmp((const xmlChar *)str1, (const xmlChar *)str2, len); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0); des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrncmp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str1); printf(" %d", n_str2); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlStrndup(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * cur; /* the input xmlChar * */ int n_cur; int len; /* the len of @cur */ int n_len; for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); len = gen_int(n_len, 1); ret_val = xmlStrndup((const xmlChar *)cur, len); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrndup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrstr(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlChar * str; /* the xmlChar * array (haystack) */ int n_str; xmlChar * val; /* the xmlChar to search (needle) */ int n_val; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); val = gen_const_xmlChar_ptr(n_val, 1); ret_val = xmlStrstr((const xmlChar *)str, (const xmlChar *)val); desret_const_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrstr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_val); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlStrsub(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * str; /* the xmlChar * array (haystack) */ int n_str; int start; /* the index of the first char (zero based) */ int n_start; int len; /* the length of the substring */ int n_len; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_start = 0;n_start < gen_nb_int;n_start++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); start = gen_int(n_start, 1); len = gen_int(n_len, 2); ret_val = xmlStrsub((const xmlChar *)str, start, len); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_int(n_start, start, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlStrsub", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_start); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlUTF8Charcmp(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * utf1; /* pointer to first UTF8 char */ int n_utf1; xmlChar * utf2; /* pointer to second UTF8 char */ int n_utf2; for (n_utf1 = 0;n_utf1 < gen_nb_const_xmlChar_ptr;n_utf1++) { for (n_utf2 = 0;n_utf2 < gen_nb_const_xmlChar_ptr;n_utf2++) { mem_base = xmlMemBlocks(); utf1 = gen_const_xmlChar_ptr(n_utf1, 0); utf2 = gen_const_xmlChar_ptr(n_utf2, 1); ret_val = xmlUTF8Charcmp((const xmlChar *)utf1, (const xmlChar *)utf2); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf1, (const xmlChar *)utf1, 0); des_const_xmlChar_ptr(n_utf2, (const xmlChar *)utf2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Charcmp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf1); printf(" %d", n_utf2); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlUTF8Size(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * utf; /* pointer to the UTF8 character */ int n_utf; for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) { mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); ret_val = xmlUTF8Size((const xmlChar *)utf); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Size", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlUTF8Strlen(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * utf; /* a sequence of UTF-8 encoded bytes */ int n_utf; for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) { mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); ret_val = xmlUTF8Strlen((const xmlChar *)utf); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Strlen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf("\n"); } } function_tests++; return(test_ret); } static int test_xmlUTF8Strloc(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * utf; /* the input UTF8 * */ int n_utf; xmlChar * utfchar; /* the UTF8 character to be found */ int n_utfchar; for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) { for (n_utfchar = 0;n_utfchar < gen_nb_const_xmlChar_ptr;n_utfchar++) { mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); utfchar = gen_const_xmlChar_ptr(n_utfchar, 1); ret_val = xmlUTF8Strloc((const xmlChar *)utf, (const xmlChar *)utfchar); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0); des_const_xmlChar_ptr(n_utfchar, (const xmlChar *)utfchar, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Strloc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf(" %d", n_utfchar); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlUTF8Strndup(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * utf; /* the input UTF8 * */ int n_utf; int len; /* the len of @utf (in chars) */ int n_len; for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); len = gen_int(n_len, 1); ret_val = xmlUTF8Strndup((const xmlChar *)utf, len); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Strndup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlUTF8Strpos(void) { int test_ret = 0; int mem_base; const xmlChar * ret_val; xmlChar * utf; /* the input UTF8 * */ int n_utf; int pos; /* the position of the desired UTF8 char (in chars) */ int n_pos; for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) { for (n_pos = 0;n_pos < gen_nb_int;n_pos++) { mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); pos = gen_int(n_pos, 1); ret_val = xmlUTF8Strpos((const xmlChar *)utf, pos); desret_const_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0); des_int(n_pos, pos, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Strpos", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf(" %d", n_pos); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlUTF8Strsize(void) { int test_ret = 0; int mem_base; int ret_val; xmlChar * utf; /* a sequence of UTF-8 encoded bytes */ int n_utf; int len; /* the number of characters in the array */ int n_len; for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); len = gen_int(n_len, 1); ret_val = xmlUTF8Strsize((const xmlChar *)utf, len); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0); des_int(n_len, len, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Strsize", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf(" %d", n_len); printf("\n"); } } } function_tests++; return(test_ret); } static int test_xmlUTF8Strsub(void) { int test_ret = 0; int mem_base; xmlChar * ret_val; xmlChar * utf; /* a sequence of UTF-8 encoded bytes */ int n_utf; int start; /* relative pos of first char */ int n_start; int len; /* total number to copy */ int n_len; for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) { for (n_start = 0;n_start < gen_nb_int;n_start++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); start = gen_int(n_start, 1); len = gen_int(n_len, 2); ret_val = xmlUTF8Strsub((const xmlChar *)utf, start, len); desret_xmlChar_ptr(ret_val); call_tests++; des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0); des_int(n_start, start, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUTF8Strsub", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_utf); printf(" %d", n_start); printf(" %d", n_len); printf("\n"); } } } } function_tests++; return(test_ret); } static int test_xmlstring(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlstring : 26 of 30 functions ...\n"); test_ret += test_xmlCharStrdup(); test_ret += test_xmlCharStrndup(); test_ret += test_xmlCheckUTF8(); test_ret += test_xmlGetUTF8Char(); test_ret += test_xmlStrEqual(); test_ret += test_xmlStrPrintf(); test_ret += test_xmlStrQEqual(); test_ret += test_xmlStrVPrintf(); test_ret += test_xmlStrcasecmp(); test_ret += test_xmlStrcasestr(); test_ret += test_xmlStrchr(); test_ret += test_xmlStrcmp(); test_ret += test_xmlStrdup(); test_ret += test_xmlStrlen(); test_ret += test_xmlStrncasecmp(); test_ret += test_xmlStrncatNew(); test_ret += test_xmlStrncmp(); test_ret += test_xmlStrndup(); test_ret += test_xmlStrstr(); test_ret += test_xmlStrsub(); test_ret += test_xmlUTF8Charcmp(); test_ret += test_xmlUTF8Size(); test_ret += test_xmlUTF8Strlen(); test_ret += test_xmlUTF8Strloc(); test_ret += test_xmlUTF8Strndup(); test_ret += test_xmlUTF8Strpos(); test_ret += test_xmlUTF8Strsize(); test_ret += test_xmlUTF8Strsub(); if (test_ret != 0) printf("Module xmlstring: %d errors\n", test_ret); return(test_ret); } static int test_xmlUCSIsAegeanNumbers(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsAegeanNumbers(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsAegeanNumbers", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsAlphabeticPresentationForms(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsAlphabeticPresentationForms(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsAlphabeticPresentationForms", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsArabic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsArabic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsArabic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsArabicPresentationFormsA(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsArabicPresentationFormsA(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsArabicPresentationFormsA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsArabicPresentationFormsB(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsArabicPresentationFormsB(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsArabicPresentationFormsB", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsArmenian(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsArmenian(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsArmenian", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsArrows(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsArrows(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsArrows", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBasicLatin(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBasicLatin(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBasicLatin", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBengali(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBengali(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBengali", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBlock(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; char * block; /* UCS block name */ int n_block; for (n_code = 0;n_code < gen_nb_int;n_code++) { for (n_block = 0;n_block < gen_nb_const_char_ptr;n_block++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); block = gen_const_char_ptr(n_block, 1); ret_val = xmlUCSIsBlock(code, (const char *)block); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); des_const_char_ptr(n_block, (const char *)block, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBlock", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf(" %d", n_block); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBlockElements(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBlockElements(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBlockElements", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBopomofo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBopomofo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBopomofo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBopomofoExtended(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBopomofoExtended(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBopomofoExtended", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBoxDrawing(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBoxDrawing(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBoxDrawing", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBraillePatterns(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBraillePatterns(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBraillePatterns", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsBuhid(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsBuhid(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsBuhid", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsByzantineMusicalSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsByzantineMusicalSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsByzantineMusicalSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKCompatibility(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKCompatibility(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKCompatibility", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKCompatibilityForms(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKCompatibilityForms(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKCompatibilityForms", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKCompatibilityIdeographs(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKCompatibilityIdeographs(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKCompatibilityIdeographs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKCompatibilityIdeographsSupplement(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKCompatibilityIdeographsSupplement(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKCompatibilityIdeographsSupplement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKRadicalsSupplement(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKRadicalsSupplement(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKRadicalsSupplement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKSymbolsandPunctuation(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKSymbolsandPunctuation(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKSymbolsandPunctuation", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKUnifiedIdeographs(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKUnifiedIdeographs(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKUnifiedIdeographs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKUnifiedIdeographsExtensionA(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKUnifiedIdeographsExtensionA(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKUnifiedIdeographsExtensionA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCJKUnifiedIdeographsExtensionB(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCJKUnifiedIdeographsExtensionB(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCJKUnifiedIdeographsExtensionB", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCat(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; char * cat; /* UCS Category name */ int n_cat; for (n_code = 0;n_code < gen_nb_int;n_code++) { for (n_cat = 0;n_cat < gen_nb_const_char_ptr;n_cat++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); cat = gen_const_char_ptr(n_cat, 1); ret_val = xmlUCSIsCat(code, (const char *)cat); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); des_const_char_ptr(n_cat, (const char *)cat, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf(" %d", n_cat); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatC(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatC(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatC", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatCc(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatCc(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatCc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatCf(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatCf(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatCf", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatCo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatCo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatCo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatCs(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatCs(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatCs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatL(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatL(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatL", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatLl(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatLl(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatLl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatLm(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatLm(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatLm", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatLo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatLo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatLo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatLt(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatLt(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatLt", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatLu(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatLu(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatLu", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatM(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatM(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatM", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatMc(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatMc(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatMc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatMe(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatMe(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatMe", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatMn(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatMn(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatMn", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatN(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatN(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatN", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatNd(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatNd(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatNd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatNl(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatNl(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatNl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatNo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatNo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatNo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatP(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatP(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatP", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatPc(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatPc(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatPc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatPd(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatPd(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatPd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatPe(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatPe(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatPe", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatPf(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatPf(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatPf", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatPi(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatPi(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatPi", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatPo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatPo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatPo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatPs(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatPs(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatPs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatS(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatS(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatS", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatSc(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatSc(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatSc", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatSk(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatSk(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatSk", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatSm(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatSm(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatSm", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatSo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatSo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatSo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatZ(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatZ(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatZ", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatZl(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatZl(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatZl", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatZp(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatZp(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatZp", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCatZs(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCatZs(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCatZs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCherokee(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCherokee(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCherokee", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCombiningDiacriticalMarks(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCombiningDiacriticalMarks(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCombiningDiacriticalMarks", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCombiningDiacriticalMarksforSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCombiningDiacriticalMarksforSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCombiningDiacriticalMarksforSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCombiningHalfMarks(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCombiningHalfMarks(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCombiningHalfMarks", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCombiningMarksforSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCombiningMarksforSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCombiningMarksforSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsControlPictures(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsControlPictures(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsControlPictures", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCurrencySymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCurrencySymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCurrencySymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCypriotSyllabary(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCypriotSyllabary(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCypriotSyllabary", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCyrillic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCyrillic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCyrillic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsCyrillicSupplement(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsCyrillicSupplement(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsCyrillicSupplement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsDeseret(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsDeseret(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsDeseret", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsDevanagari(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsDevanagari(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsDevanagari", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsDingbats(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsDingbats(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsDingbats", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsEnclosedAlphanumerics(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsEnclosedAlphanumerics(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsEnclosedAlphanumerics", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsEnclosedCJKLettersandMonths(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsEnclosedCJKLettersandMonths(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsEnclosedCJKLettersandMonths", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsEthiopic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsEthiopic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsEthiopic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGeneralPunctuation(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGeneralPunctuation(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGeneralPunctuation", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGeometricShapes(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGeometricShapes(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGeometricShapes", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGeorgian(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGeorgian(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGeorgian", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGothic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGothic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGothic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGreek(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGreek(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGreek", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGreekExtended(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGreekExtended(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGreekExtended", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGreekandCoptic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGreekandCoptic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGreekandCoptic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGujarati(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGujarati(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGujarati", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsGurmukhi(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsGurmukhi(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsGurmukhi", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHalfwidthandFullwidthForms(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHalfwidthandFullwidthForms(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHalfwidthandFullwidthForms", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHangulCompatibilityJamo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHangulCompatibilityJamo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHangulCompatibilityJamo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHangulJamo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHangulJamo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHangulJamo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHangulSyllables(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHangulSyllables(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHangulSyllables", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHanunoo(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHanunoo(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHanunoo", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHebrew(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHebrew(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHebrew", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHighPrivateUseSurrogates(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHighPrivateUseSurrogates(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHighPrivateUseSurrogates", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHighSurrogates(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHighSurrogates(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHighSurrogates", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsHiragana(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsHiragana(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsHiragana", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsIPAExtensions(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsIPAExtensions(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsIPAExtensions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsIdeographicDescriptionCharacters(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsIdeographicDescriptionCharacters(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsIdeographicDescriptionCharacters", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsKanbun(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsKanbun(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsKanbun", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsKangxiRadicals(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsKangxiRadicals(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsKangxiRadicals", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsKannada(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsKannada(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsKannada", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsKatakana(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsKatakana(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsKatakana", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsKatakanaPhoneticExtensions(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsKatakanaPhoneticExtensions(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsKatakanaPhoneticExtensions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsKhmer(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsKhmer(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsKhmer", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsKhmerSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsKhmerSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsKhmerSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLao(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLao(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLao", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLatin1Supplement(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLatin1Supplement(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLatin1Supplement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLatinExtendedA(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLatinExtendedA(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLatinExtendedA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLatinExtendedAdditional(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLatinExtendedAdditional(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLatinExtendedAdditional", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLatinExtendedB(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLatinExtendedB(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLatinExtendedB", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLetterlikeSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLetterlikeSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLetterlikeSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLimbu(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLimbu(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLimbu", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLinearBIdeograms(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLinearBIdeograms(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLinearBIdeograms", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLinearBSyllabary(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLinearBSyllabary(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLinearBSyllabary", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsLowSurrogates(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsLowSurrogates(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsLowSurrogates", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMalayalam(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMalayalam(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMalayalam", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMathematicalAlphanumericSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMathematicalAlphanumericSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMathematicalAlphanumericSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMathematicalOperators(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMathematicalOperators(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMathematicalOperators", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMiscellaneousMathematicalSymbolsA(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMiscellaneousMathematicalSymbolsA(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMiscellaneousMathematicalSymbolsA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMiscellaneousMathematicalSymbolsB(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMiscellaneousMathematicalSymbolsB(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMiscellaneousMathematicalSymbolsB", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMiscellaneousSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMiscellaneousSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMiscellaneousSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMiscellaneousSymbolsandArrows(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMiscellaneousSymbolsandArrows(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMiscellaneousSymbolsandArrows", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMiscellaneousTechnical(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMiscellaneousTechnical(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMiscellaneousTechnical", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMongolian(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMongolian(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMongolian", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMusicalSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMusicalSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMusicalSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsMyanmar(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsMyanmar(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsMyanmar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsNumberForms(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsNumberForms(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsNumberForms", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsOgham(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsOgham(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsOgham", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsOldItalic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsOldItalic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsOldItalic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsOpticalCharacterRecognition(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsOpticalCharacterRecognition(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsOpticalCharacterRecognition", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsOriya(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsOriya(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsOriya", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsOsmanya(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsOsmanya(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsOsmanya", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsPhoneticExtensions(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsPhoneticExtensions(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsPhoneticExtensions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsPrivateUse(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsPrivateUse(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsPrivateUse", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsPrivateUseArea(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsPrivateUseArea(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsPrivateUseArea", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsRunic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsRunic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsRunic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsShavian(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsShavian(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsShavian", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSinhala(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSinhala(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSinhala", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSmallFormVariants(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSmallFormVariants(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSmallFormVariants", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSpacingModifierLetters(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSpacingModifierLetters(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSpacingModifierLetters", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSpecials(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSpecials(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSpecials", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSuperscriptsandSubscripts(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSuperscriptsandSubscripts(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSuperscriptsandSubscripts", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSupplementalArrowsA(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSupplementalArrowsA(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSupplementalArrowsA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSupplementalArrowsB(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSupplementalArrowsB(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSupplementalArrowsB", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSupplementalMathematicalOperators(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSupplementalMathematicalOperators(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSupplementalMathematicalOperators", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSupplementaryPrivateUseAreaA(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSupplementaryPrivateUseAreaA(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSupplementaryPrivateUseAreaA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSupplementaryPrivateUseAreaB(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSupplementaryPrivateUseAreaB(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSupplementaryPrivateUseAreaB", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsSyriac(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsSyriac(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsSyriac", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTagalog(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTagalog(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTagalog", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTagbanwa(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTagbanwa(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTagbanwa", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTags(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTags(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTags", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTaiLe(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTaiLe(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTaiLe", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTaiXuanJingSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTaiXuanJingSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTaiXuanJingSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTamil(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTamil(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTamil", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTelugu(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTelugu(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTelugu", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsThaana(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsThaana(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsThaana", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsThai(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsThai(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsThai", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsTibetan(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsTibetan(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsTibetan", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsUgaritic(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsUgaritic(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsUgaritic", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsUnifiedCanadianAboriginalSyllabics(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsUnifiedCanadianAboriginalSyllabics(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsUnifiedCanadianAboriginalSyllabics", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsVariationSelectors(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsVariationSelectors(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsVariationSelectors", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsVariationSelectorsSupplement(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsVariationSelectorsSupplement(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsVariationSelectorsSupplement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsYiRadicals(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsYiRadicals(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsYiRadicals", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsYiSyllables(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsYiSyllables(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsYiSyllables", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlUCSIsYijingHexagramSymbols(void) { int test_ret = 0; #if defined(LIBXML_UNICODE_ENABLED) int mem_base; int ret_val; int code; /* UCS code point */ int n_code; for (n_code = 0;n_code < gen_nb_int;n_code++) { mem_base = xmlMemBlocks(); code = gen_int(n_code, 0); ret_val = xmlUCSIsYijingHexagramSymbols(code); desret_int(ret_val); call_tests++; des_int(n_code, code, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlUCSIsYijingHexagramSymbols", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_code); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlunicode(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlunicode : 166 of 166 functions ...\n"); test_ret += test_xmlUCSIsAegeanNumbers(); test_ret += test_xmlUCSIsAlphabeticPresentationForms(); test_ret += test_xmlUCSIsArabic(); test_ret += test_xmlUCSIsArabicPresentationFormsA(); test_ret += test_xmlUCSIsArabicPresentationFormsB(); test_ret += test_xmlUCSIsArmenian(); test_ret += test_xmlUCSIsArrows(); test_ret += test_xmlUCSIsBasicLatin(); test_ret += test_xmlUCSIsBengali(); test_ret += test_xmlUCSIsBlock(); test_ret += test_xmlUCSIsBlockElements(); test_ret += test_xmlUCSIsBopomofo(); test_ret += test_xmlUCSIsBopomofoExtended(); test_ret += test_xmlUCSIsBoxDrawing(); test_ret += test_xmlUCSIsBraillePatterns(); test_ret += test_xmlUCSIsBuhid(); test_ret += test_xmlUCSIsByzantineMusicalSymbols(); test_ret += test_xmlUCSIsCJKCompatibility(); test_ret += test_xmlUCSIsCJKCompatibilityForms(); test_ret += test_xmlUCSIsCJKCompatibilityIdeographs(); test_ret += test_xmlUCSIsCJKCompatibilityIdeographsSupplement(); test_ret += test_xmlUCSIsCJKRadicalsSupplement(); test_ret += test_xmlUCSIsCJKSymbolsandPunctuation(); test_ret += test_xmlUCSIsCJKUnifiedIdeographs(); test_ret += test_xmlUCSIsCJKUnifiedIdeographsExtensionA(); test_ret += test_xmlUCSIsCJKUnifiedIdeographsExtensionB(); test_ret += test_xmlUCSIsCat(); test_ret += test_xmlUCSIsCatC(); test_ret += test_xmlUCSIsCatCc(); test_ret += test_xmlUCSIsCatCf(); test_ret += test_xmlUCSIsCatCo(); test_ret += test_xmlUCSIsCatCs(); test_ret += test_xmlUCSIsCatL(); test_ret += test_xmlUCSIsCatLl(); test_ret += test_xmlUCSIsCatLm(); test_ret += test_xmlUCSIsCatLo(); test_ret += test_xmlUCSIsCatLt(); test_ret += test_xmlUCSIsCatLu(); test_ret += test_xmlUCSIsCatM(); test_ret += test_xmlUCSIsCatMc(); test_ret += test_xmlUCSIsCatMe(); test_ret += test_xmlUCSIsCatMn(); test_ret += test_xmlUCSIsCatN(); test_ret += test_xmlUCSIsCatNd(); test_ret += test_xmlUCSIsCatNl(); test_ret += test_xmlUCSIsCatNo(); test_ret += test_xmlUCSIsCatP(); test_ret += test_xmlUCSIsCatPc(); test_ret += test_xmlUCSIsCatPd(); test_ret += test_xmlUCSIsCatPe(); test_ret += test_xmlUCSIsCatPf(); test_ret += test_xmlUCSIsCatPi(); test_ret += test_xmlUCSIsCatPo(); test_ret += test_xmlUCSIsCatPs(); test_ret += test_xmlUCSIsCatS(); test_ret += test_xmlUCSIsCatSc(); test_ret += test_xmlUCSIsCatSk(); test_ret += test_xmlUCSIsCatSm(); test_ret += test_xmlUCSIsCatSo(); test_ret += test_xmlUCSIsCatZ(); test_ret += test_xmlUCSIsCatZl(); test_ret += test_xmlUCSIsCatZp(); test_ret += test_xmlUCSIsCatZs(); test_ret += test_xmlUCSIsCherokee(); test_ret += test_xmlUCSIsCombiningDiacriticalMarks(); test_ret += test_xmlUCSIsCombiningDiacriticalMarksforSymbols(); test_ret += test_xmlUCSIsCombiningHalfMarks(); test_ret += test_xmlUCSIsCombiningMarksforSymbols(); test_ret += test_xmlUCSIsControlPictures(); test_ret += test_xmlUCSIsCurrencySymbols(); test_ret += test_xmlUCSIsCypriotSyllabary(); test_ret += test_xmlUCSIsCyrillic(); test_ret += test_xmlUCSIsCyrillicSupplement(); test_ret += test_xmlUCSIsDeseret(); test_ret += test_xmlUCSIsDevanagari(); test_ret += test_xmlUCSIsDingbats(); test_ret += test_xmlUCSIsEnclosedAlphanumerics(); test_ret += test_xmlUCSIsEnclosedCJKLettersandMonths(); test_ret += test_xmlUCSIsEthiopic(); test_ret += test_xmlUCSIsGeneralPunctuation(); test_ret += test_xmlUCSIsGeometricShapes(); test_ret += test_xmlUCSIsGeorgian(); test_ret += test_xmlUCSIsGothic(); test_ret += test_xmlUCSIsGreek(); test_ret += test_xmlUCSIsGreekExtended(); test_ret += test_xmlUCSIsGreekandCoptic(); test_ret += test_xmlUCSIsGujarati(); test_ret += test_xmlUCSIsGurmukhi(); test_ret += test_xmlUCSIsHalfwidthandFullwidthForms(); test_ret += test_xmlUCSIsHangulCompatibilityJamo(); test_ret += test_xmlUCSIsHangulJamo(); test_ret += test_xmlUCSIsHangulSyllables(); test_ret += test_xmlUCSIsHanunoo(); test_ret += test_xmlUCSIsHebrew(); test_ret += test_xmlUCSIsHighPrivateUseSurrogates(); test_ret += test_xmlUCSIsHighSurrogates(); test_ret += test_xmlUCSIsHiragana(); test_ret += test_xmlUCSIsIPAExtensions(); test_ret += test_xmlUCSIsIdeographicDescriptionCharacters(); test_ret += test_xmlUCSIsKanbun(); test_ret += test_xmlUCSIsKangxiRadicals(); test_ret += test_xmlUCSIsKannada(); test_ret += test_xmlUCSIsKatakana(); test_ret += test_xmlUCSIsKatakanaPhoneticExtensions(); test_ret += test_xmlUCSIsKhmer(); test_ret += test_xmlUCSIsKhmerSymbols(); test_ret += test_xmlUCSIsLao(); test_ret += test_xmlUCSIsLatin1Supplement(); test_ret += test_xmlUCSIsLatinExtendedA(); test_ret += test_xmlUCSIsLatinExtendedAdditional(); test_ret += test_xmlUCSIsLatinExtendedB(); test_ret += test_xmlUCSIsLetterlikeSymbols(); test_ret += test_xmlUCSIsLimbu(); test_ret += test_xmlUCSIsLinearBIdeograms(); test_ret += test_xmlUCSIsLinearBSyllabary(); test_ret += test_xmlUCSIsLowSurrogates(); test_ret += test_xmlUCSIsMalayalam(); test_ret += test_xmlUCSIsMathematicalAlphanumericSymbols(); test_ret += test_xmlUCSIsMathematicalOperators(); test_ret += test_xmlUCSIsMiscellaneousMathematicalSymbolsA(); test_ret += test_xmlUCSIsMiscellaneousMathematicalSymbolsB(); test_ret += test_xmlUCSIsMiscellaneousSymbols(); test_ret += test_xmlUCSIsMiscellaneousSymbolsandArrows(); test_ret += test_xmlUCSIsMiscellaneousTechnical(); test_ret += test_xmlUCSIsMongolian(); test_ret += test_xmlUCSIsMusicalSymbols(); test_ret += test_xmlUCSIsMyanmar(); test_ret += test_xmlUCSIsNumberForms(); test_ret += test_xmlUCSIsOgham(); test_ret += test_xmlUCSIsOldItalic(); test_ret += test_xmlUCSIsOpticalCharacterRecognition(); test_ret += test_xmlUCSIsOriya(); test_ret += test_xmlUCSIsOsmanya(); test_ret += test_xmlUCSIsPhoneticExtensions(); test_ret += test_xmlUCSIsPrivateUse(); test_ret += test_xmlUCSIsPrivateUseArea(); test_ret += test_xmlUCSIsRunic(); test_ret += test_xmlUCSIsShavian(); test_ret += test_xmlUCSIsSinhala(); test_ret += test_xmlUCSIsSmallFormVariants(); test_ret += test_xmlUCSIsSpacingModifierLetters(); test_ret += test_xmlUCSIsSpecials(); test_ret += test_xmlUCSIsSuperscriptsandSubscripts(); test_ret += test_xmlUCSIsSupplementalArrowsA(); test_ret += test_xmlUCSIsSupplementalArrowsB(); test_ret += test_xmlUCSIsSupplementalMathematicalOperators(); test_ret += test_xmlUCSIsSupplementaryPrivateUseAreaA(); test_ret += test_xmlUCSIsSupplementaryPrivateUseAreaB(); test_ret += test_xmlUCSIsSyriac(); test_ret += test_xmlUCSIsTagalog(); test_ret += test_xmlUCSIsTagbanwa(); test_ret += test_xmlUCSIsTags(); test_ret += test_xmlUCSIsTaiLe(); test_ret += test_xmlUCSIsTaiXuanJingSymbols(); test_ret += test_xmlUCSIsTamil(); test_ret += test_xmlUCSIsTelugu(); test_ret += test_xmlUCSIsThaana(); test_ret += test_xmlUCSIsThai(); test_ret += test_xmlUCSIsTibetan(); test_ret += test_xmlUCSIsUgaritic(); test_ret += test_xmlUCSIsUnifiedCanadianAboriginalSyllabics(); test_ret += test_xmlUCSIsVariationSelectors(); test_ret += test_xmlUCSIsVariationSelectorsSupplement(); test_ret += test_xmlUCSIsYiRadicals(); test_ret += test_xmlUCSIsYiSyllables(); test_ret += test_xmlUCSIsYijingHexagramSymbols(); if (test_ret != 0) printf("Module xmlunicode: %d errors\n", test_ret); return(test_ret); } static int test_xmlNewTextWriter(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; xmlTextWriterPtr ret_val; xmlOutputBufferPtr out; /* an xmlOutputBufferPtr */ int n_out; for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) { mem_base = xmlMemBlocks(); out = gen_xmlOutputBufferPtr(n_out, 0); ret_val = xmlNewTextWriter(out); if (ret_val != NULL) out = NULL; desret_xmlTextWriterPtr(ret_val); call_tests++; des_xmlOutputBufferPtr(n_out, out, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextWriter", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_out); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlNewTextWriterFilename(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; xmlTextWriterPtr ret_val; const char * uri; /* the URI of the resource for the output */ int n_uri; int compression; /* compress the output? */ int n_compression; for (n_uri = 0;n_uri < gen_nb_fileoutput;n_uri++) { for (n_compression = 0;n_compression < gen_nb_int;n_compression++) { mem_base = xmlMemBlocks(); uri = gen_fileoutput(n_uri, 0); compression = gen_int(n_compression, 1); ret_val = xmlNewTextWriterFilename(uri, compression); desret_xmlTextWriterPtr(ret_val); call_tests++; des_fileoutput(n_uri, uri, 0); des_int(n_compression, compression, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextWriterFilename", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_uri); printf(" %d", n_compression); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNewTextWriterMemory(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; xmlTextWriterPtr ret_val; xmlBufferPtr buf; /* xmlBufferPtr */ int n_buf; int compression; /* compress the output? */ int n_compression; for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) { for (n_compression = 0;n_compression < gen_nb_int;n_compression++) { mem_base = xmlMemBlocks(); buf = gen_xmlBufferPtr(n_buf, 0); compression = gen_int(n_compression, 1); ret_val = xmlNewTextWriterMemory(buf, compression); desret_xmlTextWriterPtr(ret_val); call_tests++; des_xmlBufferPtr(n_buf, buf, 0); des_int(n_compression, compression, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextWriterMemory", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_buf); printf(" %d", n_compression); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNewTextWriterPushParser(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; xmlTextWriterPtr ret_val; xmlParserCtxtPtr ctxt; /* xmlParserCtxtPtr to hold the new XML document tree */ int n_ctxt; int compression; /* compress the output? */ int n_compression; for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) { for (n_compression = 0;n_compression < gen_nb_int;n_compression++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0); compression = gen_int(n_compression, 1); ret_val = xmlNewTextWriterPushParser(ctxt, compression); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} if (ret_val != NULL) ctxt = NULL; desret_xmlTextWriterPtr(ret_val); call_tests++; des_xmlParserCtxtPtr(n_ctxt, ctxt, 0); des_int(n_compression, compression, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextWriterPushParser", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_compression); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlNewTextWriterTree(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; xmlTextWriterPtr ret_val; xmlDocPtr doc; /* xmlDocPtr */ int n_doc; xmlNodePtr node; /* xmlNodePtr or NULL for doc->children */ int n_node; int compression; /* compress the output? */ int n_compression; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_compression = 0;n_compression < gen_nb_int;n_compression++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); node = gen_xmlNodePtr(n_node, 1); compression = gen_int(n_compression, 2); ret_val = xmlNewTextWriterTree(doc, node, compression); desret_xmlTextWriterPtr(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); des_xmlNodePtr(n_node, node, 1); des_int(n_compression, compression, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlNewTextWriterTree", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf(" %d", n_node); printf(" %d", n_compression); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndAttribute(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndAttribute(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndCDATA(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndCDATA(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndCDATA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndComment(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndComment(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndComment", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndDTD(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndDTD(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndDTD", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndDTDAttlist(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndDTDAttlist(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndDTDAttlist", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndDTDElement(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndDTDElement(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndDTDElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndDTDEntity(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndDTDEntity(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndDTDEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndDocument(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndDocument(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndElement(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndElement(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterEndPI(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterEndPI(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterEndPI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterFlush(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterFlush(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterFlush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterFullEndElement(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterFullEndElement(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterFullEndElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterSetIndent(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; int indent; /* do indentation? */ int n_indent; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_indent = 0;n_indent < gen_nb_int;n_indent++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); indent = gen_int(n_indent, 1); ret_val = xmlTextWriterSetIndent(writer, indent); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_int(n_indent, indent, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterSetIndent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_indent); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterSetIndentString(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * str; /* the xmlChar string */ int n_str; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); str = gen_const_xmlChar_ptr(n_str, 1); ret_val = xmlTextWriterSetIndentString(writer, (const xmlChar *)str); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterSetIndentString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_str); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterSetQuoteChar(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar quotechar; /* the quote character */ int n_quotechar; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_quotechar = 0;n_quotechar < gen_nb_xmlChar;n_quotechar++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); quotechar = gen_xmlChar(n_quotechar, 1); ret_val = xmlTextWriterSetQuoteChar(writer, quotechar); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_xmlChar(n_quotechar, quotechar, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterSetQuoteChar", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_quotechar); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartAttribute(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* element name */ int n_name; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlTextWriterStartAttribute(writer, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartAttributeNS(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * prefix; /* namespace prefix or NULL */ int n_prefix; xmlChar * name; /* element local name */ int n_name; xmlChar * namespaceURI; /* namespace URI or NULL */ int n_namespaceURI; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3); ret_val = xmlTextWriterStartAttributeNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartAttributeNS", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_prefix); printf(" %d", n_name); printf(" %d", n_namespaceURI); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartCDATA(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterStartCDATA(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartCDATA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartComment(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); ret_val = xmlTextWriterStartComment(writer); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartComment", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartDTD(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* the name of the DTD */ int n_name; xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */ int n_pubid; xmlChar * sysid; /* the system identifier, which is the URI of the DTD */ int n_sysid; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) { for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); pubid = gen_const_xmlChar_ptr(n_pubid, 2); sysid = gen_const_xmlChar_ptr(n_sysid, 3); ret_val = xmlTextWriterStartDTD(writer, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 2); des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartDTD", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf(" %d", n_pubid); printf(" %d", n_sysid); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartDTDAttlist(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* the name of the DTD ATTLIST */ int n_name; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlTextWriterStartDTDAttlist(writer, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartDTDAttlist", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartDTDElement(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* the name of the DTD element */ int n_name; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlTextWriterStartDTDElement(writer, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartDTDElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartDTDEntity(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; int pe; /* TRUE if this is a parameter entity, FALSE if not */ int n_pe; xmlChar * name; /* the name of the DTD ATTLIST */ int n_name; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_pe = 0;n_pe < gen_nb_int;n_pe++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); pe = gen_int(n_pe, 1); name = gen_const_xmlChar_ptr(n_name, 2); ret_val = xmlTextWriterStartDTDEntity(writer, pe, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_int(n_pe, pe, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartDTDEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_pe); printf(" %d", n_name); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartDocument(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; char * version; /* the xml version ("1.0") or NULL for default ("1.0") */ int n_version; char * encoding; /* the encoding or NULL for default */ int n_encoding; char * standalone; /* "yes" or "no" or NULL for default */ int n_standalone; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_version = 0;n_version < gen_nb_const_char_ptr;n_version++) { for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) { for (n_standalone = 0;n_standalone < gen_nb_const_char_ptr;n_standalone++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); version = gen_const_char_ptr(n_version, 1); encoding = gen_const_char_ptr(n_encoding, 2); standalone = gen_const_char_ptr(n_standalone, 3); ret_val = xmlTextWriterStartDocument(writer, (const char *)version, (const char *)encoding, (const char *)standalone); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_char_ptr(n_version, (const char *)version, 1); des_const_char_ptr(n_encoding, (const char *)encoding, 2); des_const_char_ptr(n_standalone, (const char *)standalone, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartDocument", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_version); printf(" %d", n_encoding); printf(" %d", n_standalone); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartElement(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* element name */ int n_name; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlTextWriterStartElement(writer, (const xmlChar *)name); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartElementNS(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * prefix; /* namespace prefix or NULL */ int n_prefix; xmlChar * name; /* element local name */ int n_name; xmlChar * namespaceURI; /* namespace URI or NULL */ int n_namespaceURI; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3); ret_val = xmlTextWriterStartElementNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartElementNS", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_prefix); printf(" %d", n_name); printf(" %d", n_namespaceURI); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterStartPI(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * target; /* PI target */ int n_target; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_target = 0;n_target < gen_nb_const_xmlChar_ptr;n_target++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); target = gen_const_xmlChar_ptr(n_target, 1); ret_val = xmlTextWriterStartPI(writer, (const xmlChar *)target); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_target, (const xmlChar *)target, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterStartPI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_target); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteAttribute(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* attribute name */ int n_name; xmlChar * content; /* attribute content */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); content = gen_const_xmlChar_ptr(n_content, 2); ret_val = xmlTextWriterWriteAttribute(writer, (const xmlChar *)name, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteAttributeNS(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * prefix; /* namespace prefix */ int n_prefix; xmlChar * name; /* attribute local name */ int n_name; xmlChar * namespaceURI; /* namespace URI */ int n_namespaceURI; xmlChar * content; /* attribute content */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3); content = gen_const_xmlChar_ptr(n_content, 4); ret_val = xmlTextWriterWriteAttributeNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteAttributeNS", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_prefix); printf(" %d", n_name); printf(" %d", n_namespaceURI); printf(" %d", n_content); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteBase64(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; char * data; /* binary data */ int n_data; int start; /* the position within the data of the first byte to encode */ int n_start; int len; /* the number of bytes to encode */ int n_len; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_data = 0;n_data < gen_nb_const_char_ptr;n_data++) { for (n_start = 0;n_start < gen_nb_int;n_start++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); data = gen_const_char_ptr(n_data, 1); start = gen_int(n_start, 2); len = gen_int(n_len, 3); ret_val = xmlTextWriterWriteBase64(writer, (const char *)data, start, len); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_char_ptr(n_data, (const char *)data, 1); des_int(n_start, start, 2); des_int(n_len, len, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteBase64", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_data); printf(" %d", n_start); printf(" %d", n_len); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteBinHex(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; char * data; /* binary data */ int n_data; int start; /* the position within the data of the first byte to encode */ int n_start; int len; /* the number of bytes to encode */ int n_len; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_data = 0;n_data < gen_nb_const_char_ptr;n_data++) { for (n_start = 0;n_start < gen_nb_int;n_start++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); data = gen_const_char_ptr(n_data, 1); start = gen_int(n_start, 2); len = gen_int(n_len, 3); ret_val = xmlTextWriterWriteBinHex(writer, (const char *)data, start, len); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_char_ptr(n_data, (const char *)data, 1); des_int(n_start, start, 2); des_int(n_len, len, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteBinHex", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_data); printf(" %d", n_start); printf(" %d", n_len); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteCDATA(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * content; /* CDATA content */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlTextWriterWriteCDATA(writer, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteCDATA", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_content); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteComment(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * content; /* comment string */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlTextWriterWriteComment(writer, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteComment", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_content); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTD(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* the name of the DTD */ int n_name; xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */ int n_pubid; xmlChar * sysid; /* the system identifier, which is the URI of the DTD */ int n_sysid; xmlChar * subset; /* string content of the DTD */ int n_subset; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) { for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) { for (n_subset = 0;n_subset < gen_nb_const_xmlChar_ptr;n_subset++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); pubid = gen_const_xmlChar_ptr(n_pubid, 2); sysid = gen_const_xmlChar_ptr(n_sysid, 3); subset = gen_const_xmlChar_ptr(n_subset, 4); ret_val = xmlTextWriterWriteDTD(writer, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)subset); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 2); des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 3); des_const_xmlChar_ptr(n_subset, (const xmlChar *)subset, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTD", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf(" %d", n_pubid); printf(" %d", n_sysid); printf(" %d", n_subset); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTDAttlist(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* the name of the DTD ATTLIST */ int n_name; xmlChar * content; /* content of the ATTLIST */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); content = gen_const_xmlChar_ptr(n_content, 2); ret_val = xmlTextWriterWriteDTDAttlist(writer, (const xmlChar *)name, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTDAttlist", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTDElement(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* the name of the DTD element */ int n_name; xmlChar * content; /* content of the element */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); content = gen_const_xmlChar_ptr(n_content, 2); ret_val = xmlTextWriterWriteDTDElement(writer, (const xmlChar *)name, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTDElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTDEntity(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; int pe; /* TRUE if this is a parameter entity, FALSE if not */ int n_pe; xmlChar * name; /* the name of the DTD entity */ int n_name; xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */ int n_pubid; xmlChar * sysid; /* the system identifier, which is the URI of the DTD */ int n_sysid; xmlChar * ndataid; /* the xml notation name. */ int n_ndataid; xmlChar * content; /* content of the entity */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_pe = 0;n_pe < gen_nb_int;n_pe++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) { for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) { for (n_ndataid = 0;n_ndataid < gen_nb_const_xmlChar_ptr;n_ndataid++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); pe = gen_int(n_pe, 1); name = gen_const_xmlChar_ptr(n_name, 2); pubid = gen_const_xmlChar_ptr(n_pubid, 3); sysid = gen_const_xmlChar_ptr(n_sysid, 4); ndataid = gen_const_xmlChar_ptr(n_ndataid, 5); content = gen_const_xmlChar_ptr(n_content, 6); ret_val = xmlTextWriterWriteDTDEntity(writer, pe, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)ndataid, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_int(n_pe, pe, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 3); des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 4); des_const_xmlChar_ptr(n_ndataid, (const xmlChar *)ndataid, 5); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 6); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTDEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_pe); printf(" %d", n_name); printf(" %d", n_pubid); printf(" %d", n_sysid); printf(" %d", n_ndataid); printf(" %d", n_content); printf("\n"); } } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTDExternalEntity(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; int pe; /* TRUE if this is a parameter entity, FALSE if not */ int n_pe; xmlChar * name; /* the name of the DTD entity */ int n_name; xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */ int n_pubid; xmlChar * sysid; /* the system identifier, which is the URI of the DTD */ int n_sysid; xmlChar * ndataid; /* the xml notation name. */ int n_ndataid; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_pe = 0;n_pe < gen_nb_int;n_pe++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) { for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) { for (n_ndataid = 0;n_ndataid < gen_nb_const_xmlChar_ptr;n_ndataid++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); pe = gen_int(n_pe, 1); name = gen_const_xmlChar_ptr(n_name, 2); pubid = gen_const_xmlChar_ptr(n_pubid, 3); sysid = gen_const_xmlChar_ptr(n_sysid, 4); ndataid = gen_const_xmlChar_ptr(n_ndataid, 5); ret_val = xmlTextWriterWriteDTDExternalEntity(writer, pe, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)ndataid); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_int(n_pe, pe, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 3); des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 4); des_const_xmlChar_ptr(n_ndataid, (const xmlChar *)ndataid, 5); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTDExternalEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_pe); printf(" %d", n_name); printf(" %d", n_pubid); printf(" %d", n_sysid); printf(" %d", n_ndataid); printf("\n"); } } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTDExternalEntityContents(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */ int n_pubid; xmlChar * sysid; /* the system identifier, which is the URI of the DTD */ int n_sysid; xmlChar * ndataid; /* the xml notation name. */ int n_ndataid; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) { for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) { for (n_ndataid = 0;n_ndataid < gen_nb_const_xmlChar_ptr;n_ndataid++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); pubid = gen_const_xmlChar_ptr(n_pubid, 1); sysid = gen_const_xmlChar_ptr(n_sysid, 2); ndataid = gen_const_xmlChar_ptr(n_ndataid, 3); ret_val = xmlTextWriterWriteDTDExternalEntityContents(writer, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)ndataid); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 1); des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 2); des_const_xmlChar_ptr(n_ndataid, (const xmlChar *)ndataid, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTDExternalEntityContents", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_pubid); printf(" %d", n_sysid); printf(" %d", n_ndataid); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTDInternalEntity(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; int pe; /* TRUE if this is a parameter entity, FALSE if not */ int n_pe; xmlChar * name; /* the name of the DTD entity */ int n_name; xmlChar * content; /* content of the entity */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_pe = 0;n_pe < gen_nb_int;n_pe++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); pe = gen_int(n_pe, 1); name = gen_const_xmlChar_ptr(n_name, 2); content = gen_const_xmlChar_ptr(n_content, 3); ret_val = xmlTextWriterWriteDTDInternalEntity(writer, pe, (const xmlChar *)name, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_int(n_pe, pe, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTDInternalEntity", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_pe); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteDTDNotation(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* the name of the xml notation */ int n_name; xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */ int n_pubid; xmlChar * sysid; /* the system identifier, which is the URI of the DTD */ int n_sysid; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) { for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); pubid = gen_const_xmlChar_ptr(n_pubid, 2); sysid = gen_const_xmlChar_ptr(n_sysid, 3); ret_val = xmlTextWriterWriteDTDNotation(writer, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 2); des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteDTDNotation", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf(" %d", n_pubid); printf(" %d", n_sysid); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteElement(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * name; /* element name */ int n_name; xmlChar * content; /* element content */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); name = gen_const_xmlChar_ptr(n_name, 1); content = gen_const_xmlChar_ptr(n_content, 2); ret_val = xmlTextWriterWriteElement(writer, (const xmlChar *)name, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteElement", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_name); printf(" %d", n_content); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteElementNS(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * prefix; /* namespace prefix */ int n_prefix; xmlChar * name; /* element local name */ int n_name; xmlChar * namespaceURI; /* namespace URI */ int n_namespaceURI; xmlChar * content; /* element content */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); name = gen_const_xmlChar_ptr(n_name, 2); namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3); content = gen_const_xmlChar_ptr(n_content, 4); ret_val = xmlTextWriterWriteElementNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2); des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 4); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteElementNS", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_prefix); printf(" %d", n_name); printf(" %d", n_namespaceURI); printf(" %d", n_content); printf("\n"); } } } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteFormatAttribute(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatAttributeNS(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatCDATA(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatComment(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatDTD(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatDTDAttlist(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatDTDElement(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatDTDInternalEntity(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatElement(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatElementNS(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatPI(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatRaw(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteFormatString(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWritePI(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * target; /* PI target */ int n_target; xmlChar * content; /* PI content */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_target = 0;n_target < gen_nb_const_xmlChar_ptr;n_target++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); target = gen_const_xmlChar_ptr(n_target, 1); content = gen_const_xmlChar_ptr(n_content, 2); ret_val = xmlTextWriterWritePI(writer, (const xmlChar *)target, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_target, (const xmlChar *)target, 1); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWritePI", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_target); printf(" %d", n_content); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteRaw(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * content; /* text string */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlTextWriterWriteRaw(writer, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteRaw", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_content); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteRawLen(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * content; /* text string */ int n_content; int len; /* length of the text string */ int n_len; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { for (n_len = 0;n_len < gen_nb_int;n_len++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); ret_val = xmlTextWriterWriteRawLen(writer, (const xmlChar *)content, len); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); des_int(n_len, len, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteRawLen", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_content); printf(" %d", n_len); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteString(void) { int test_ret = 0; #if defined(LIBXML_WRITER_ENABLED) int mem_base; int ret_val; xmlTextWriterPtr writer; /* the xmlTextWriterPtr */ int n_writer; xmlChar * content; /* text string */ int n_content; for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) { for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) { mem_base = xmlMemBlocks(); writer = gen_xmlTextWriterPtr(n_writer, 0); content = gen_const_xmlChar_ptr(n_content, 1); ret_val = xmlTextWriterWriteString(writer, (const xmlChar *)content); desret_int(ret_val); call_tests++; des_xmlTextWriterPtr(n_writer, writer, 0); des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlTextWriterWriteString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_writer); printf(" %d", n_content); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlTextWriterWriteVFormatAttribute(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatAttributeNS(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatCDATA(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatComment(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatDTD(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatDTDAttlist(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatDTDElement(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatDTDInternalEntity(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatElement(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatElementNS(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatPI(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatRaw(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlTextWriterWriteVFormatString(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlwriter(void) { int test_ret = 0; if (quiet == 0) printf("Testing xmlwriter : 52 of 80 functions ...\n"); test_ret += test_xmlNewTextWriter(); test_ret += test_xmlNewTextWriterFilename(); test_ret += test_xmlNewTextWriterMemory(); test_ret += test_xmlNewTextWriterPushParser(); test_ret += test_xmlNewTextWriterTree(); test_ret += test_xmlTextWriterEndAttribute(); test_ret += test_xmlTextWriterEndCDATA(); test_ret += test_xmlTextWriterEndComment(); test_ret += test_xmlTextWriterEndDTD(); test_ret += test_xmlTextWriterEndDTDAttlist(); test_ret += test_xmlTextWriterEndDTDElement(); test_ret += test_xmlTextWriterEndDTDEntity(); test_ret += test_xmlTextWriterEndDocument(); test_ret += test_xmlTextWriterEndElement(); test_ret += test_xmlTextWriterEndPI(); test_ret += test_xmlTextWriterFlush(); test_ret += test_xmlTextWriterFullEndElement(); test_ret += test_xmlTextWriterSetIndent(); test_ret += test_xmlTextWriterSetIndentString(); test_ret += test_xmlTextWriterSetQuoteChar(); test_ret += test_xmlTextWriterStartAttribute(); test_ret += test_xmlTextWriterStartAttributeNS(); test_ret += test_xmlTextWriterStartCDATA(); test_ret += test_xmlTextWriterStartComment(); test_ret += test_xmlTextWriterStartDTD(); test_ret += test_xmlTextWriterStartDTDAttlist(); test_ret += test_xmlTextWriterStartDTDElement(); test_ret += test_xmlTextWriterStartDTDEntity(); test_ret += test_xmlTextWriterStartDocument(); test_ret += test_xmlTextWriterStartElement(); test_ret += test_xmlTextWriterStartElementNS(); test_ret += test_xmlTextWriterStartPI(); test_ret += test_xmlTextWriterWriteAttribute(); test_ret += test_xmlTextWriterWriteAttributeNS(); test_ret += test_xmlTextWriterWriteBase64(); test_ret += test_xmlTextWriterWriteBinHex(); test_ret += test_xmlTextWriterWriteCDATA(); test_ret += test_xmlTextWriterWriteComment(); test_ret += test_xmlTextWriterWriteDTD(); test_ret += test_xmlTextWriterWriteDTDAttlist(); test_ret += test_xmlTextWriterWriteDTDElement(); test_ret += test_xmlTextWriterWriteDTDEntity(); test_ret += test_xmlTextWriterWriteDTDExternalEntity(); test_ret += test_xmlTextWriterWriteDTDExternalEntityContents(); test_ret += test_xmlTextWriterWriteDTDInternalEntity(); test_ret += test_xmlTextWriterWriteDTDNotation(); test_ret += test_xmlTextWriterWriteElement(); test_ret += test_xmlTextWriterWriteElementNS(); test_ret += test_xmlTextWriterWriteFormatAttribute(); test_ret += test_xmlTextWriterWriteFormatAttributeNS(); test_ret += test_xmlTextWriterWriteFormatCDATA(); test_ret += test_xmlTextWriterWriteFormatComment(); test_ret += test_xmlTextWriterWriteFormatDTD(); test_ret += test_xmlTextWriterWriteFormatDTDAttlist(); test_ret += test_xmlTextWriterWriteFormatDTDElement(); test_ret += test_xmlTextWriterWriteFormatDTDInternalEntity(); test_ret += test_xmlTextWriterWriteFormatElement(); test_ret += test_xmlTextWriterWriteFormatElementNS(); test_ret += test_xmlTextWriterWriteFormatPI(); test_ret += test_xmlTextWriterWriteFormatRaw(); test_ret += test_xmlTextWriterWriteFormatString(); test_ret += test_xmlTextWriterWritePI(); test_ret += test_xmlTextWriterWriteRaw(); test_ret += test_xmlTextWriterWriteRawLen(); test_ret += test_xmlTextWriterWriteString(); test_ret += test_xmlTextWriterWriteVFormatAttribute(); test_ret += test_xmlTextWriterWriteVFormatAttributeNS(); test_ret += test_xmlTextWriterWriteVFormatCDATA(); test_ret += test_xmlTextWriterWriteVFormatComment(); test_ret += test_xmlTextWriterWriteVFormatDTD(); test_ret += test_xmlTextWriterWriteVFormatDTDAttlist(); test_ret += test_xmlTextWriterWriteVFormatDTDElement(); test_ret += test_xmlTextWriterWriteVFormatDTDInternalEntity(); test_ret += test_xmlTextWriterWriteVFormatElement(); test_ret += test_xmlTextWriterWriteVFormatElementNS(); test_ret += test_xmlTextWriterWriteVFormatPI(); test_ret += test_xmlTextWriterWriteVFormatRaw(); test_ret += test_xmlTextWriterWriteVFormatString(); if (test_ret != 0) printf("Module xmlwriter: %d errors\n", test_ret); return(test_ret); } static int test_xmlXPathCastBooleanToNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; double ret_val; int val; /* a boolean */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = xmlXPathCastBooleanToNumber(val); desret_double(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastBooleanToNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastBooleanToString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; int val; /* a boolean */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = xmlXPathCastBooleanToString(val); desret_xmlChar_ptr(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastBooleanToString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastNodeSetToBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodeSetPtr ns; /* a node-set */ int n_ns; for (n_ns = 0;n_ns < gen_nb_xmlNodeSetPtr;n_ns++) { mem_base = xmlMemBlocks(); ns = gen_xmlNodeSetPtr(n_ns, 0); ret_val = xmlXPathCastNodeSetToBoolean(ns); desret_int(ret_val); call_tests++; des_xmlNodeSetPtr(n_ns, ns, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastNodeSetToBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ns); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastNodeSetToNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; double ret_val; xmlNodeSetPtr ns; /* a node-set */ int n_ns; for (n_ns = 0;n_ns < gen_nb_xmlNodeSetPtr;n_ns++) { mem_base = xmlMemBlocks(); ns = gen_xmlNodeSetPtr(n_ns, 0); ret_val = xmlXPathCastNodeSetToNumber(ns); desret_double(ret_val); call_tests++; des_xmlNodeSetPtr(n_ns, ns, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastNodeSetToNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ns); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastNodeSetToString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; xmlNodeSetPtr ns; /* a node-set */ int n_ns; for (n_ns = 0;n_ns < gen_nb_xmlNodeSetPtr;n_ns++) { mem_base = xmlMemBlocks(); ns = gen_xmlNodeSetPtr(n_ns, 0); ret_val = xmlXPathCastNodeSetToString(ns); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodeSetPtr(n_ns, ns, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastNodeSetToString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ns); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastNodeToNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; double ret_val; xmlNodePtr node; /* a node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlXPathCastNodeToNumber(node); desret_double(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastNodeToNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastNodeToString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; xmlNodePtr node; /* a node */ int n_node; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ret_val = xmlXPathCastNodeToString(node); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastNodeToString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastNumberToBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; double val; /* a number */ int n_val; for (n_val = 0;n_val < gen_nb_double;n_val++) { mem_base = xmlMemBlocks(); val = gen_double(n_val, 0); ret_val = xmlXPathCastNumberToBoolean(val); desret_int(ret_val); call_tests++; des_double(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastNumberToBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastNumberToString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; double val; /* a number */ int n_val; for (n_val = 0;n_val < gen_nb_double;n_val++) { mem_base = xmlMemBlocks(); val = gen_double(n_val, 0); ret_val = xmlXPathCastNumberToString(val); desret_xmlChar_ptr(ret_val); call_tests++; des_double(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastNumberToString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastStringToBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlChar * val; /* a string */ int n_val; for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) { mem_base = xmlMemBlocks(); val = gen_const_xmlChar_ptr(n_val, 0); ret_val = xmlXPathCastStringToBoolean((const xmlChar *)val); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastStringToBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastStringToNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; double ret_val; xmlChar * val; /* a string */ int n_val; for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) { mem_base = xmlMemBlocks(); val = gen_const_xmlChar_ptr(n_val, 0); ret_val = xmlXPathCastStringToNumber((const xmlChar *)val); desret_double(ret_val); call_tests++; des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastStringToNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastToBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathObjectPtr val; /* an XPath object */ int n_val; for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlXPathObjectPtr(n_val, 0); ret_val = xmlXPathCastToBoolean(val); desret_int(ret_val); call_tests++; des_xmlXPathObjectPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastToBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastToNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; double ret_val; xmlXPathObjectPtr val; /* an XPath object */ int n_val; for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlXPathObjectPtr(n_val, 0); ret_val = xmlXPathCastToNumber(val); desret_double(ret_val); call_tests++; des_xmlXPathObjectPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastToNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCastToString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; xmlXPathObjectPtr val; /* an XPath object */ int n_val; for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlXPathObjectPtr(n_val, 0); ret_val = xmlXPathCastToString(val); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCastToString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCmpNodes(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodePtr node1; /* the first node */ int n_node1; xmlNodePtr node2; /* the second node */ int n_node2; for (n_node1 = 0;n_node1 < gen_nb_xmlNodePtr;n_node1++) { for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) { mem_base = xmlMemBlocks(); node1 = gen_xmlNodePtr(n_node1, 0); node2 = gen_xmlNodePtr(n_node2, 1); ret_val = xmlXPathCmpNodes(node1, node2); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node1, node1, 0); des_xmlNodePtr(n_node2, node2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCmpNodes", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node1); printf(" %d", n_node2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCompile(void) { int test_ret = 0; /* missing type support */ return(test_ret); } #ifdef LIBXML_XPATH_ENABLED #define gen_nb_xmlXPathCompExprPtr 1 static xmlXPathCompExprPtr gen_xmlXPathCompExprPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlXPathCompExprPtr(int no ATTRIBUTE_UNUSED, xmlXPathCompExprPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif #ifdef LIBXML_XPATH_ENABLED #define gen_nb_xmlXPathContextPtr 1 static xmlXPathContextPtr gen_xmlXPathContextPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlXPathContextPtr(int no ATTRIBUTE_UNUSED, xmlXPathContextPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlXPathCompiledEval(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathCompExprPtr comp; /* the compiled XPath expression */ int n_comp; xmlXPathContextPtr ctx; /* the XPath context */ int n_ctx; for (n_comp = 0;n_comp < gen_nb_xmlXPathCompExprPtr;n_comp++) { for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) { mem_base = xmlMemBlocks(); comp = gen_xmlXPathCompExprPtr(n_comp, 0); ctx = gen_xmlXPathContextPtr(n_ctx, 1); ret_val = xmlXPathCompiledEval(comp, ctx); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathCompExprPtr(n_comp, comp, 0); des_xmlXPathContextPtr(n_ctx, ctx, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCompiledEval", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf(" %d", n_ctx); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCompiledEvalToBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathCompExprPtr comp; /* the compiled XPath expression */ int n_comp; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; for (n_comp = 0;n_comp < gen_nb_xmlXPathCompExprPtr;n_comp++) { for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); comp = gen_xmlXPathCompExprPtr(n_comp, 0); ctxt = gen_xmlXPathContextPtr(n_ctxt, 1); ret_val = xmlXPathCompiledEvalToBoolean(comp, ctxt); desret_int(ret_val); call_tests++; des_xmlXPathCompExprPtr(n_comp, comp, 0); des_xmlXPathContextPtr(n_ctxt, ctxt, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCompiledEvalToBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_comp); printf(" %d", n_ctxt); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathContextSetCache(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; int active; /* enables/disables (creates/frees) the cache */ int n_active; int value; /* a value with semantics dependant on @options */ int n_value; int options; /* options (currently only the value 0 is used) */ int n_options; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_active = 0;n_active < gen_nb_int;n_active++) { for (n_value = 0;n_value < gen_nb_int;n_value++) { for (n_options = 0;n_options < gen_nb_int;n_options++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); active = gen_int(n_active, 1); value = gen_int(n_value, 2); options = gen_int(n_options, 3); ret_val = xmlXPathContextSetCache(ctxt, active, value, options); desret_int(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_int(n_active, active, 1); des_int(n_value, value, 2); des_int(n_options, options, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathContextSetCache", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_active); printf(" %d", n_value); printf(" %d", n_options); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathConvertBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathObjectPtr val; /* an XPath object */ int n_val; for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlXPathObjectPtr(n_val, 0); ret_val = xmlXPathConvertBoolean(val); val = NULL; desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathConvertBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathConvertNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathObjectPtr val; /* an XPath object */ int n_val; for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlXPathObjectPtr(n_val, 0); ret_val = xmlXPathConvertNumber(val); val = NULL; desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathConvertNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathConvertString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathObjectPtr val; /* an XPath object */ int n_val; for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlXPathObjectPtr(n_val, 0); ret_val = xmlXPathConvertString(val); val = NULL; desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathConvertString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCtxtCompile(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathEval(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlChar * str; /* the XPath expression */ int n_str; xmlXPathContextPtr ctx; /* the XPath context */ int n_ctx; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); ctx = gen_xmlXPathContextPtr(n_ctx, 1); ret_val = xmlXPathEval((const xmlChar *)str, ctx); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_xmlXPathContextPtr(n_ctx, ctx, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathEval", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_ctx); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathEvalExpression(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlChar * str; /* the XPath expression */ int n_str; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); ctxt = gen_xmlXPathContextPtr(n_ctxt, 1); ret_val = xmlXPathEvalExpression((const xmlChar *)str, ctxt); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_xmlXPathContextPtr(n_ctxt, ctxt, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathEvalExpression", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_ctxt); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathEvalPredicate(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; xmlXPathObjectPtr res; /* the Predicate Expression evaluation result */ int n_res; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_res = 0;n_res < gen_nb_xmlXPathObjectPtr;n_res++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); res = gen_xmlXPathObjectPtr(n_res, 1); ret_val = xmlXPathEvalPredicate(ctxt, res); desret_int(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_xmlXPathObjectPtr(n_res, res, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathEvalPredicate", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_res); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathInit(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; mem_base = xmlMemBlocks(); xmlXPathInit(); call_tests++; xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathInit", xmlMemBlocks() - mem_base); test_ret++; printf("\n"); } function_tests++; #endif return(test_ret); } static int test_xmlXPathIsInf(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; double val; /* a double value */ int n_val; for (n_val = 0;n_val < gen_nb_double;n_val++) { mem_base = xmlMemBlocks(); val = gen_double(n_val, 0); ret_val = xmlXPathIsInf(val); desret_int(ret_val); call_tests++; des_double(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathIsInf", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathIsNaN(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) int mem_base; int ret_val; double val; /* a double value */ int n_val; for (n_val = 0;n_val < gen_nb_double;n_val++) { mem_base = xmlMemBlocks(); val = gen_double(n_val, 0); ret_val = xmlXPathIsNaN(val); desret_int(ret_val); call_tests++; des_double(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathIsNaN", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNewContext(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathNodeEval(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr node; /* the node to to use as the context node */ int n_node; xmlChar * str; /* the XPath expression */ int n_str; xmlXPathContextPtr ctx; /* the XPath context */ int n_ctx; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); str = gen_const_xmlChar_ptr(n_str, 1); ctx = gen_xmlXPathContextPtr(n_ctx, 2); ret_val = xmlXPathNodeEval(node, (const xmlChar *)str, ctx); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1); des_xmlXPathContextPtr(n_ctx, ctx, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeEval", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_str); printf(" %d", n_ctx); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetCreate(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodePtr val; /* an initial xmlNodePtr, or NULL */ int n_val; for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlNodePtr(n_val, 0); ret_val = xmlXPathNodeSetCreate(val); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodePtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetCreate", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathObjectCopy(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathObjectPtr val; /* the original object */ int n_val; for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlXPathObjectPtr(n_val, 0); ret_val = xmlXPathObjectCopy(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathObjectCopy", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathOrderDocElems(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; long ret_val; xmlDocPtr doc; /* an input document */ int n_doc; for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) { mem_base = xmlMemBlocks(); doc = gen_xmlDocPtr(n_doc, 0); ret_val = xmlXPathOrderDocElems(doc); desret_long(ret_val); call_tests++; des_xmlDocPtr(n_doc, doc, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathOrderDocElems", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_doc); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathSetContextNode(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodePtr node; /* the node to to use as the context node */ int n_node; xmlXPathContextPtr ctx; /* the XPath context */ int n_ctx; for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) { mem_base = xmlMemBlocks(); node = gen_xmlNodePtr(n_node, 0); ctx = gen_xmlXPathContextPtr(n_ctx, 1); ret_val = xmlXPathSetContextNode(node, ctx); desret_int(ret_val); call_tests++; des_xmlNodePtr(n_node, node, 0); des_xmlXPathContextPtr(n_ctx, ctx, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathSetContextNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_node); printf(" %d", n_ctx); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xpath(void) { int test_ret = 0; if (quiet == 0) printf("Testing xpath : 32 of 40 functions ...\n"); test_ret += test_xmlXPathCastBooleanToNumber(); test_ret += test_xmlXPathCastBooleanToString(); test_ret += test_xmlXPathCastNodeSetToBoolean(); test_ret += test_xmlXPathCastNodeSetToNumber(); test_ret += test_xmlXPathCastNodeSetToString(); test_ret += test_xmlXPathCastNodeToNumber(); test_ret += test_xmlXPathCastNodeToString(); test_ret += test_xmlXPathCastNumberToBoolean(); test_ret += test_xmlXPathCastNumberToString(); test_ret += test_xmlXPathCastStringToBoolean(); test_ret += test_xmlXPathCastStringToNumber(); test_ret += test_xmlXPathCastToBoolean(); test_ret += test_xmlXPathCastToNumber(); test_ret += test_xmlXPathCastToString(); test_ret += test_xmlXPathCmpNodes(); test_ret += test_xmlXPathCompile(); test_ret += test_xmlXPathCompiledEval(); test_ret += test_xmlXPathCompiledEvalToBoolean(); test_ret += test_xmlXPathContextSetCache(); test_ret += test_xmlXPathConvertBoolean(); test_ret += test_xmlXPathConvertNumber(); test_ret += test_xmlXPathConvertString(); test_ret += test_xmlXPathCtxtCompile(); test_ret += test_xmlXPathEval(); test_ret += test_xmlXPathEvalExpression(); test_ret += test_xmlXPathEvalPredicate(); test_ret += test_xmlXPathInit(); test_ret += test_xmlXPathIsInf(); test_ret += test_xmlXPathIsNaN(); test_ret += test_xmlXPathNewContext(); test_ret += test_xmlXPathNodeEval(); test_ret += test_xmlXPathNodeSetCreate(); test_ret += test_xmlXPathObjectCopy(); test_ret += test_xmlXPathOrderDocElems(); test_ret += test_xmlXPathSetContextNode(); if (test_ret != 0) printf("Module xpath: %d errors\n", test_ret); return(test_ret); } #ifdef LIBXML_XPATH_ENABLED #define gen_nb_xmlXPathParserContextPtr 1 static xmlXPathParserContextPtr gen_xmlXPathParserContextPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlXPathParserContextPtr(int no ATTRIBUTE_UNUSED, xmlXPathParserContextPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_valuePop(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathParserContextPtr ctxt; /* an XPath evaluation context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = valuePop(ctxt); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in valuePop", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_valuePush(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathParserContextPtr ctxt; /* an XPath evaluation context */ int n_ctxt; xmlXPathObjectPtr value; /* the XPath object */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_value = 0;n_value < gen_nb_xmlXPathObjectPtr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); value = gen_xmlXPathObjectPtr(n_value, 1); ret_val = valuePush(ctxt, value); desret_int(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlXPathObjectPtr(n_value, value, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in valuePush", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_value); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathAddValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathAddValues(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathAddValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathBooleanFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathBooleanFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathBooleanFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCeilingFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathCeilingFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCeilingFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCompareValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int inf; /* less than (1) or greater than (0) */ int n_inf; int strict; /* is the comparison strict */ int n_strict; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_inf = 0;n_inf < gen_nb_int;n_inf++) { for (n_strict = 0;n_strict < gen_nb_int;n_strict++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); inf = gen_int(n_inf, 1); strict = gen_int(n_strict, 2); ret_val = xmlXPathCompareValues(ctxt, inf, strict); desret_int(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_inf, inf, 1); des_int(n_strict, strict, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCompareValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_inf); printf(" %d", n_strict); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathConcatFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathConcatFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathConcatFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathContainsFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathContainsFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathContainsFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathCountFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathCountFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathCountFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathDebugDumpCompExpr(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * for the output */ int n_output; xmlXPathCompExprPtr comp; /* the precompiled XPath expression */ int n_comp; int depth; /* the indentation level. */ int n_depth; for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) { for (n_comp = 0;n_comp < gen_nb_xmlXPathCompExprPtr;n_comp++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { mem_base = xmlMemBlocks(); output = gen_FILE_ptr(n_output, 0); comp = gen_xmlXPathCompExprPtr(n_comp, 1); depth = gen_int(n_depth, 2); xmlXPathDebugDumpCompExpr(output, comp, depth); call_tests++; des_FILE_ptr(n_output, output, 0); des_xmlXPathCompExprPtr(n_comp, comp, 1); des_int(n_depth, depth, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathDebugDumpCompExpr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_comp); printf(" %d", n_depth); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathDebugDumpObject(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) int mem_base; FILE * output; /* the FILE * to dump the output */ int n_output; xmlXPathObjectPtr cur; /* the object to inspect */ int n_cur; int depth; /* indentation level */ int n_depth; for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) { for (n_cur = 0;n_cur < gen_nb_xmlXPathObjectPtr;n_cur++) { for (n_depth = 0;n_depth < gen_nb_int;n_depth++) { mem_base = xmlMemBlocks(); output = gen_FILE_ptr(n_output, 0); cur = gen_xmlXPathObjectPtr(n_cur, 1); depth = gen_int(n_depth, 2); xmlXPathDebugDumpObject(output, cur, depth); call_tests++; des_FILE_ptr(n_output, output, 0); des_xmlXPathObjectPtr(n_cur, cur, 1); des_int(n_depth, depth, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathDebugDumpObject", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_output); printf(" %d", n_cur); printf(" %d", n_depth); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathDifference(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes1; /* a node-set */ int n_nodes1; xmlNodeSetPtr nodes2; /* a node-set */ int n_nodes2; for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) { for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) { mem_base = xmlMemBlocks(); nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0); nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1); ret_val = xmlXPathDifference(nodes1, nodes2); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes1, nodes1, 0); des_xmlNodeSetPtr(n_nodes2, nodes2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathDifference", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes1); printf(" %d", n_nodes2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathDistinct(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes; /* a node-set */ int n_nodes; for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { mem_base = xmlMemBlocks(); nodes = gen_xmlNodeSetPtr(n_nodes, 0); ret_val = xmlXPathDistinct(nodes); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes, nodes, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathDistinct", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathDistinctSorted(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes; /* a node-set, sorted by document order */ int n_nodes; for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { mem_base = xmlMemBlocks(); nodes = gen_xmlNodeSetPtr(n_nodes, 0); ret_val = xmlXPathDistinctSorted(nodes); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes, nodes, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathDistinctSorted", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathDivValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathDivValues(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathDivValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathEqualValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathEqualValues(ctxt); desret_int(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathEqualValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathErr(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* a XPath parser context */ int n_ctxt; int error; /* the error code */ int n_error; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_error = 0;n_error < gen_nb_int;n_error++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); error = gen_int(n_error, 1); xmlXPathErr(ctxt, error); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_error, error, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathErr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_error); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathEvalExpr(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathEvalExpr(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathEvalExpr", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathEvaluatePredicateResult(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlXPathObjectPtr res; /* the Predicate Expression evaluation result */ int n_res; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_res = 0;n_res < gen_nb_xmlXPathObjectPtr;n_res++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); res = gen_xmlXPathObjectPtr(n_res, 1); ret_val = xmlXPathEvaluatePredicateResult(ctxt, res); desret_int(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlXPathObjectPtr(n_res, res, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathEvaluatePredicateResult", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_res); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathFalseFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathFalseFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathFalseFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathFloorFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathFloorFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathFloorFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathFunctionLookup(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathFunctionLookupNS(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathHasSameNodes(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodeSetPtr nodes1; /* a node-set */ int n_nodes1; xmlNodeSetPtr nodes2; /* a node-set */ int n_nodes2; for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) { for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) { mem_base = xmlMemBlocks(); nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0); nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1); ret_val = xmlXPathHasSameNodes(nodes1, nodes2); desret_int(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes1, nodes1, 0); des_xmlNodeSetPtr(n_nodes2, nodes2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathHasSameNodes", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes1); printf(" %d", n_nodes2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathIdFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathIdFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathIdFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathIntersection(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes1; /* a node-set */ int n_nodes1; xmlNodeSetPtr nodes2; /* a node-set */ int n_nodes2; for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) { for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) { mem_base = xmlMemBlocks(); nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0); nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1); ret_val = xmlXPathIntersection(nodes1, nodes2); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes1, nodes1, 0); des_xmlNodeSetPtr(n_nodes2, nodes2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathIntersection", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes1); printf(" %d", n_nodes2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathIsNodeType(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlChar * name; /* a name string */ int n_name; for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); name = gen_const_xmlChar_ptr(n_name, 0); ret_val = xmlXPathIsNodeType((const xmlChar *)name); desret_int(ret_val); call_tests++; des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathIsNodeType", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_name); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathLangFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathLangFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathLangFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathLastFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathLastFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathLastFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathLeading(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes1; /* a node-set */ int n_nodes1; xmlNodeSetPtr nodes2; /* a node-set */ int n_nodes2; for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) { for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) { mem_base = xmlMemBlocks(); nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0); nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1); ret_val = xmlXPathLeading(nodes1, nodes2); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes1, nodes1, 0); des_xmlNodeSetPtr(n_nodes2, nodes2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathLeading", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes1); printf(" %d", n_nodes2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathLeadingSorted(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes1; /* a node-set, sorted by document order */ int n_nodes1; xmlNodeSetPtr nodes2; /* a node-set, sorted by document order */ int n_nodes2; for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) { for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) { mem_base = xmlMemBlocks(); nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0); nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1); ret_val = xmlXPathLeadingSorted(nodes1, nodes2); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes1, nodes1, 0); des_xmlNodeSetPtr(n_nodes2, nodes2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathLeadingSorted", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes1); printf(" %d", n_nodes2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathLocalNameFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathLocalNameFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathLocalNameFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathModValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathModValues(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathModValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathMultValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathMultValues(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathMultValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNamespaceURIFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathNamespaceURIFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNamespaceURIFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNewBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; int val; /* the boolean value */ int n_val; for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); val = gen_int(n_val, 0); ret_val = xmlXPathNewBoolean(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_int(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNewBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNewCString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; char * val; /* the char * value */ int n_val; for (n_val = 0;n_val < gen_nb_const_char_ptr;n_val++) { mem_base = xmlMemBlocks(); val = gen_const_char_ptr(n_val, 0); ret_val = xmlXPathNewCString((const char *)val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_const_char_ptr(n_val, (const char *)val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNewCString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNewFloat(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; double val; /* the double value */ int n_val; for (n_val = 0;n_val < gen_nb_double;n_val++) { mem_base = xmlMemBlocks(); val = gen_double(n_val, 0); ret_val = xmlXPathNewFloat(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_double(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNewFloat", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNewNodeSet(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr val; /* the NodePtr value */ int n_val; for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlNodePtr(n_val, 0); ret_val = xmlXPathNewNodeSet(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNewNodeSet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNewNodeSetList(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodeSetPtr val; /* an existing NodeSet */ int n_val; for (n_val = 0;n_val < gen_nb_xmlNodeSetPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlNodeSetPtr(n_val, 0); ret_val = xmlXPathNewNodeSetList(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNewNodeSetList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNewParserContext(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathNewString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlChar * val; /* the xmlChar * value */ int n_val; for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) { mem_base = xmlMemBlocks(); val = gen_const_xmlChar_ptr(n_val, 0); ret_val = xmlXPathNewString((const xmlChar *)val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNewString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextAncestor(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextAncestor(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextAncestor", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextAncestorOrSelf(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextAncestorOrSelf(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextAncestorOrSelf", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextAttribute(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current attribute in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextAttribute(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextAttribute", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextChild(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextChild(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextChild", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextDescendant(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextDescendant(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextDescendant", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextDescendantOrSelf(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextDescendantOrSelf(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextDescendantOrSelf", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextFollowing(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextFollowing(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextFollowing", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextFollowingSibling(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextFollowingSibling(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextFollowingSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextNamespace(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current attribute in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextNamespace(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextNamespace", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextParent(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextParent(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextParent", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextPreceding(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextPreceding(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextPreceding", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextPrecedingSibling(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextPrecedingSibling(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextPrecedingSibling", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNextSelf(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; xmlNodePtr cur; /* the current node in the traversal */ int n_cur; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); cur = gen_xmlNodePtr(n_cur, 1); ret_val = xmlXPathNextSelf(ctxt, cur); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_xmlNodePtr(n_cur, cur, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNextSelf", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_cur); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeLeading(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes; /* a node-set */ int n_nodes; xmlNodePtr node; /* a node */ int n_node; for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); nodes = gen_xmlNodeSetPtr(n_nodes, 0); node = gen_xmlNodePtr(n_node, 1); ret_val = xmlXPathNodeLeading(nodes, node); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes, nodes, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeLeading", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeLeadingSorted(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes; /* a node-set, sorted by document order */ int n_nodes; xmlNodePtr node; /* a node */ int n_node; for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); nodes = gen_xmlNodeSetPtr(n_nodes, 0); node = gen_xmlNodePtr(n_node, 1); ret_val = xmlXPathNodeLeadingSorted(nodes, node); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes, nodes, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeLeadingSorted", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetAdd(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodeSetPtr cur; /* the initial node set */ int n_cur; xmlNodePtr val; /* a new xmlNodePtr */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodeSetPtr(n_cur, 0); val = gen_xmlNodePtr(n_val, 1); ret_val = xmlXPathNodeSetAdd(cur, val); desret_int(ret_val); call_tests++; des_xmlNodeSetPtr(n_cur, cur, 0); des_xmlNodePtr(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetAdd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetAddNs(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodeSetPtr cur; /* the initial node set */ int n_cur; xmlNodePtr node; /* the hosting node */ int n_node; xmlNsPtr ns; /* a the namespace node */ int n_ns; for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodeSetPtr(n_cur, 0); node = gen_xmlNodePtr(n_node, 1); ns = gen_xmlNsPtr(n_ns, 2); ret_val = xmlXPathNodeSetAddNs(cur, node, ns); desret_int(ret_val); call_tests++; des_xmlNodeSetPtr(n_cur, cur, 0); des_xmlNodePtr(n_node, node, 1); des_xmlNsPtr(n_ns, ns, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetAddNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_node); printf(" %d", n_ns); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetAddUnique(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodeSetPtr cur; /* the initial node set */ int n_cur; xmlNodePtr val; /* a new xmlNodePtr */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodeSetPtr(n_cur, 0); val = gen_xmlNodePtr(n_val, 1); ret_val = xmlXPathNodeSetAddUnique(cur, val); desret_int(ret_val); call_tests++; des_xmlNodeSetPtr(n_cur, cur, 0); des_xmlNodePtr(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetAddUnique", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetContains(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlNodeSetPtr cur; /* the node-set */ int n_cur; xmlNodePtr val; /* the node */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodeSetPtr(n_cur, 0); val = gen_xmlNodePtr(n_val, 1); ret_val = xmlXPathNodeSetContains(cur, val); desret_int(ret_val); call_tests++; des_xmlNodeSetPtr(n_cur, cur, 0); des_xmlNodePtr(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetContains", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetDel(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr cur; /* the initial node set */ int n_cur; xmlNodePtr val; /* an xmlNodePtr */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodeSetPtr(n_cur, 0); val = gen_xmlNodePtr(n_val, 1); xmlXPathNodeSetDel(cur, val); call_tests++; des_xmlNodeSetPtr(n_cur, cur, 0); des_xmlNodePtr(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetDel", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetMerge(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr val1; /* the first NodeSet or NULL */ int n_val1; xmlNodeSetPtr val2; /* the second NodeSet */ int n_val2; for (n_val1 = 0;n_val1 < gen_nb_xmlNodeSetPtr;n_val1++) { for (n_val2 = 0;n_val2 < gen_nb_xmlNodeSetPtr;n_val2++) { mem_base = xmlMemBlocks(); val1 = gen_xmlNodeSetPtr(n_val1, 0); val2 = gen_xmlNodeSetPtr(n_val2, 1); ret_val = xmlXPathNodeSetMerge(val1, val2); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_val1, val1, 0); des_xmlNodeSetPtr(n_val2, val2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetMerge", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val1); printf(" %d", n_val2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetRemove(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr cur; /* the initial node set */ int n_cur; int val; /* the index to remove */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlNodeSetPtr(n_cur, 0); val = gen_int(n_val, 1); xmlXPathNodeSetRemove(cur, val); call_tests++; des_xmlNodeSetPtr(n_cur, cur, 0); des_int(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetRemove", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeSetSort(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr set; /* the node set */ int n_set; for (n_set = 0;n_set < gen_nb_xmlNodeSetPtr;n_set++) { mem_base = xmlMemBlocks(); set = gen_xmlNodeSetPtr(n_set, 0); xmlXPathNodeSetSort(set); call_tests++; des_xmlNodeSetPtr(n_set, set, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeSetSort", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_set); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeTrailing(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes; /* a node-set */ int n_nodes; xmlNodePtr node; /* a node */ int n_node; for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); nodes = gen_xmlNodeSetPtr(n_nodes, 0); node = gen_xmlNodePtr(n_node, 1); ret_val = xmlXPathNodeTrailing(nodes, node); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes, nodes, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeTrailing", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNodeTrailingSorted(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes; /* a node-set, sorted by document order */ int n_nodes; xmlNodePtr node; /* a node */ int n_node; for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) { for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) { mem_base = xmlMemBlocks(); nodes = gen_xmlNodeSetPtr(n_nodes, 0); node = gen_xmlNodePtr(n_node, 1); ret_val = xmlXPathNodeTrailingSorted(nodes, node); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes, nodes, 0); des_xmlNodePtr(n_node, node, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNodeTrailingSorted", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes); printf(" %d", n_node); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNormalizeFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathNormalizeFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNormalizeFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNotEqualValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathNotEqualValues(ctxt); desret_int(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNotEqualValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNotFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathNotFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNotFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNsLookup(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; const xmlChar * ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; xmlChar * prefix; /* the namespace prefix value */ int n_prefix; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); ret_val = xmlXPathNsLookup(ctxt, (const xmlChar *)prefix); desret_const_xmlChar_ptr(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNsLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_prefix); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathNumberFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathNumberFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathNumberFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathParseNCName(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathParseNCName(ctxt); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathParseNCName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathParseName(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathParseName(ctxt); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathParseName", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathPopBoolean(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathParserContextPtr ctxt; /* an XPath parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathPopBoolean(ctxt); desret_int(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathPopBoolean", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathPopExternal(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; void * ret_val; xmlXPathParserContextPtr ctxt; /* an XPath parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathPopExternal(ctxt); desret_void_ptr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathPopExternal", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathPopNodeSet(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlXPathParserContextPtr ctxt; /* an XPath parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathPopNodeSet(ctxt); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathPopNodeSet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathPopNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; double ret_val; xmlXPathParserContextPtr ctxt; /* an XPath parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathPopNumber(ctxt); desret_double(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathPopNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathPopString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlChar * ret_val; xmlXPathParserContextPtr ctxt; /* an XPath parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); ret_val = xmlXPathPopString(ctxt); desret_xmlChar_ptr(ret_val); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathPopString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathPositionFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathPositionFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathPositionFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRegisterAllFunctions(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); xmlXPathRegisterAllFunctions(ctxt); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRegisterAllFunctions", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRegisterFunc(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathRegisterFuncLookup(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathRegisterFuncNS(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathRegisterNs(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; xmlChar * prefix; /* the namespace prefix cannot be NULL or empty string */ int n_prefix; xmlChar * ns_uri; /* the namespace name */ int n_ns_uri; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) { for (n_ns_uri = 0;n_ns_uri < gen_nb_const_xmlChar_ptr;n_ns_uri++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); prefix = gen_const_xmlChar_ptr(n_prefix, 1); ns_uri = gen_const_xmlChar_ptr(n_ns_uri, 2); ret_val = xmlXPathRegisterNs(ctxt, (const xmlChar *)prefix, (const xmlChar *)ns_uri); desret_int(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1); des_const_xmlChar_ptr(n_ns_uri, (const xmlChar *)ns_uri, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRegisterNs", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_prefix); printf(" %d", n_ns_uri); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRegisterVariable(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; xmlChar * name; /* the variable name */ int n_name; xmlXPathObjectPtr value; /* the variable value or NULL */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_value = 0;n_value < gen_nb_xmlXPathObjectPtr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); name = gen_const_xmlChar_ptr(n_name, 1); value = gen_xmlXPathObjectPtr(n_value, 2); ret_val = xmlXPathRegisterVariable(ctxt, (const xmlChar *)name, value); desret_int(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_xmlXPathObjectPtr(n_value, value, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRegisterVariable", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_name); printf(" %d", n_value); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRegisterVariableLookup(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPathRegisterVariableNS(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; int ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; xmlChar * name; /* the variable name */ int n_name; xmlChar * ns_uri; /* the variable namespace URI */ int n_ns_uri; xmlXPathObjectPtr value; /* the variable value or NULL */ int n_value; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ns_uri = 0;n_ns_uri < gen_nb_const_xmlChar_ptr;n_ns_uri++) { for (n_value = 0;n_value < gen_nb_xmlXPathObjectPtr;n_value++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); name = gen_const_xmlChar_ptr(n_name, 1); ns_uri = gen_const_xmlChar_ptr(n_ns_uri, 2); value = gen_xmlXPathObjectPtr(n_value, 3); ret_val = xmlXPathRegisterVariableNS(ctxt, (const xmlChar *)name, (const xmlChar *)ns_uri, value); desret_int(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ns_uri, (const xmlChar *)ns_uri, 2); des_xmlXPathObjectPtr(n_value, value, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRegisterVariableNS", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_name); printf(" %d", n_ns_uri); printf(" %d", n_value); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRegisteredFuncsCleanup(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); xmlXPathRegisteredFuncsCleanup(ctxt); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRegisteredFuncsCleanup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRegisteredNsCleanup(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); xmlXPathRegisteredNsCleanup(ctxt); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRegisteredNsCleanup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRegisteredVariablesCleanup(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); xmlXPathRegisteredVariablesCleanup(ctxt); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRegisteredVariablesCleanup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRoot(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathRoot(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRoot", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathRoundFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathRoundFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathRoundFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathStartsWithFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathStartsWithFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathStartsWithFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathStringEvalNumber(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; double ret_val; xmlChar * str; /* A string to scan */ int n_str; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); ret_val = xmlXPathStringEvalNumber((const xmlChar *)str); desret_double(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathStringEvalNumber", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathStringFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathStringFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathStringFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathStringLengthFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathStringLengthFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathStringLengthFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathSubValues(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathSubValues(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathSubValues", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathSubstringAfterFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathSubstringAfterFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathSubstringAfterFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathSubstringBeforeFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathSubstringBeforeFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathSubstringBeforeFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathSubstringFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathSubstringFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathSubstringFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathSumFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathSumFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathSumFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathTrailing(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes1; /* a node-set */ int n_nodes1; xmlNodeSetPtr nodes2; /* a node-set */ int n_nodes2; for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) { for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) { mem_base = xmlMemBlocks(); nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0); nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1); ret_val = xmlXPathTrailing(nodes1, nodes2); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes1, nodes1, 0); des_xmlNodeSetPtr(n_nodes2, nodes2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathTrailing", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes1); printf(" %d", n_nodes2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathTrailingSorted(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlNodeSetPtr ret_val; xmlNodeSetPtr nodes1; /* a node-set, sorted by document order */ int n_nodes1; xmlNodeSetPtr nodes2; /* a node-set, sorted by document order */ int n_nodes2; for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) { for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) { mem_base = xmlMemBlocks(); nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0); nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1); ret_val = xmlXPathTrailingSorted(nodes1, nodes2); desret_xmlNodeSetPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_nodes1, nodes1, 0); des_xmlNodeSetPtr(n_nodes2, nodes2, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathTrailingSorted", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_nodes1); printf(" %d", n_nodes2); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathTranslateFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathTranslateFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathTranslateFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathTrueFunction(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; int nargs; /* the number of arguments */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPathTrueFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathTrueFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathValueFlipSign(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPathValueFlipSign(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathValueFlipSign", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathVariableLookup(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; xmlChar * name; /* the variable name */ int n_name; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); name = gen_const_xmlChar_ptr(n_name, 1); ret_val = xmlXPathVariableLookup(ctxt, (const xmlChar *)name); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathVariableLookup", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_name); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathVariableLookupNS(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathContextPtr ctxt; /* the XPath context */ int n_ctxt; xmlChar * name; /* the variable name */ int n_name; xmlChar * ns_uri; /* the variable namespace URI */ int n_ns_uri; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) { for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) { for (n_ns_uri = 0;n_ns_uri < gen_nb_const_xmlChar_ptr;n_ns_uri++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathContextPtr(n_ctxt, 0); name = gen_const_xmlChar_ptr(n_name, 1); ns_uri = gen_const_xmlChar_ptr(n_ns_uri, 2); ret_val = xmlXPathVariableLookupNS(ctxt, (const xmlChar *)name, (const xmlChar *)ns_uri); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathContextPtr(n_ctxt, ctxt, 0); des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1); des_const_xmlChar_ptr(n_ns_uri, (const xmlChar *)ns_uri, 2); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathVariableLookupNS", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_name); printf(" %d", n_ns_uri); printf("\n"); } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPathWrapCString(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; char * val; /* the char * value */ int n_val; for (n_val = 0;n_val < gen_nb_char_ptr;n_val++) { mem_base = xmlMemBlocks(); val = gen_char_ptr(n_val, 0); ret_val = xmlXPathWrapCString(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_char_ptr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathWrapCString", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathWrapExternal(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; void * val; /* the user data */ int n_val; for (n_val = 0;n_val < gen_nb_void_ptr;n_val++) { mem_base = xmlMemBlocks(); val = gen_void_ptr(n_val, 0); ret_val = xmlXPathWrapExternal(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_void_ptr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathWrapExternal", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPathWrapNodeSet(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodeSetPtr val; /* the NodePtr value */ int n_val; for (n_val = 0;n_val < gen_nb_xmlNodeSetPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlNodeSetPtr(n_val, 0); ret_val = xmlXPathWrapNodeSet(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPathWrapNodeSet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPatherror(void) { int test_ret = 0; #if defined(LIBXML_XPATH_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPath Parser context */ int n_ctxt; const char * file; /* the file name */ int n_file; int line; /* the line number */ int n_line; int no; /* the error number */ int n_no; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_file = 0;n_file < gen_nb_filepath;n_file++) { for (n_line = 0;n_line < gen_nb_int;n_line++) { for (n_no = 0;n_no < gen_nb_int;n_no++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); file = gen_filepath(n_file, 1); line = gen_int(n_line, 2); no = gen_int(n_no, 3); xmlXPatherror(ctxt, file, line, no); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_filepath(n_file, file, 1); des_int(n_line, line, 2); des_int(n_no, no, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPatherror", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_file); printf(" %d", n_line); printf(" %d", n_no); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xpathInternals(void) { int test_ret = 0; if (quiet == 0) printf("Testing xpathInternals : 106 of 117 functions ...\n"); test_ret += test_valuePop(); test_ret += test_valuePush(); test_ret += test_xmlXPathAddValues(); test_ret += test_xmlXPathBooleanFunction(); test_ret += test_xmlXPathCeilingFunction(); test_ret += test_xmlXPathCompareValues(); test_ret += test_xmlXPathConcatFunction(); test_ret += test_xmlXPathContainsFunction(); test_ret += test_xmlXPathCountFunction(); test_ret += test_xmlXPathDebugDumpCompExpr(); test_ret += test_xmlXPathDebugDumpObject(); test_ret += test_xmlXPathDifference(); test_ret += test_xmlXPathDistinct(); test_ret += test_xmlXPathDistinctSorted(); test_ret += test_xmlXPathDivValues(); test_ret += test_xmlXPathEqualValues(); test_ret += test_xmlXPathErr(); test_ret += test_xmlXPathEvalExpr(); test_ret += test_xmlXPathEvaluatePredicateResult(); test_ret += test_xmlXPathFalseFunction(); test_ret += test_xmlXPathFloorFunction(); test_ret += test_xmlXPathFunctionLookup(); test_ret += test_xmlXPathFunctionLookupNS(); test_ret += test_xmlXPathHasSameNodes(); test_ret += test_xmlXPathIdFunction(); test_ret += test_xmlXPathIntersection(); test_ret += test_xmlXPathIsNodeType(); test_ret += test_xmlXPathLangFunction(); test_ret += test_xmlXPathLastFunction(); test_ret += test_xmlXPathLeading(); test_ret += test_xmlXPathLeadingSorted(); test_ret += test_xmlXPathLocalNameFunction(); test_ret += test_xmlXPathModValues(); test_ret += test_xmlXPathMultValues(); test_ret += test_xmlXPathNamespaceURIFunction(); test_ret += test_xmlXPathNewBoolean(); test_ret += test_xmlXPathNewCString(); test_ret += test_xmlXPathNewFloat(); test_ret += test_xmlXPathNewNodeSet(); test_ret += test_xmlXPathNewNodeSetList(); test_ret += test_xmlXPathNewParserContext(); test_ret += test_xmlXPathNewString(); test_ret += test_xmlXPathNextAncestor(); test_ret += test_xmlXPathNextAncestorOrSelf(); test_ret += test_xmlXPathNextAttribute(); test_ret += test_xmlXPathNextChild(); test_ret += test_xmlXPathNextDescendant(); test_ret += test_xmlXPathNextDescendantOrSelf(); test_ret += test_xmlXPathNextFollowing(); test_ret += test_xmlXPathNextFollowingSibling(); test_ret += test_xmlXPathNextNamespace(); test_ret += test_xmlXPathNextParent(); test_ret += test_xmlXPathNextPreceding(); test_ret += test_xmlXPathNextPrecedingSibling(); test_ret += test_xmlXPathNextSelf(); test_ret += test_xmlXPathNodeLeading(); test_ret += test_xmlXPathNodeLeadingSorted(); test_ret += test_xmlXPathNodeSetAdd(); test_ret += test_xmlXPathNodeSetAddNs(); test_ret += test_xmlXPathNodeSetAddUnique(); test_ret += test_xmlXPathNodeSetContains(); test_ret += test_xmlXPathNodeSetDel(); test_ret += test_xmlXPathNodeSetMerge(); test_ret += test_xmlXPathNodeSetRemove(); test_ret += test_xmlXPathNodeSetSort(); test_ret += test_xmlXPathNodeTrailing(); test_ret += test_xmlXPathNodeTrailingSorted(); test_ret += test_xmlXPathNormalizeFunction(); test_ret += test_xmlXPathNotEqualValues(); test_ret += test_xmlXPathNotFunction(); test_ret += test_xmlXPathNsLookup(); test_ret += test_xmlXPathNumberFunction(); test_ret += test_xmlXPathParseNCName(); test_ret += test_xmlXPathParseName(); test_ret += test_xmlXPathPopBoolean(); test_ret += test_xmlXPathPopExternal(); test_ret += test_xmlXPathPopNodeSet(); test_ret += test_xmlXPathPopNumber(); test_ret += test_xmlXPathPopString(); test_ret += test_xmlXPathPositionFunction(); test_ret += test_xmlXPathRegisterAllFunctions(); test_ret += test_xmlXPathRegisterFunc(); test_ret += test_xmlXPathRegisterFuncLookup(); test_ret += test_xmlXPathRegisterFuncNS(); test_ret += test_xmlXPathRegisterNs(); test_ret += test_xmlXPathRegisterVariable(); test_ret += test_xmlXPathRegisterVariableLookup(); test_ret += test_xmlXPathRegisterVariableNS(); test_ret += test_xmlXPathRegisteredFuncsCleanup(); test_ret += test_xmlXPathRegisteredNsCleanup(); test_ret += test_xmlXPathRegisteredVariablesCleanup(); test_ret += test_xmlXPathRoot(); test_ret += test_xmlXPathRoundFunction(); test_ret += test_xmlXPathStartsWithFunction(); test_ret += test_xmlXPathStringEvalNumber(); test_ret += test_xmlXPathStringFunction(); test_ret += test_xmlXPathStringLengthFunction(); test_ret += test_xmlXPathSubValues(); test_ret += test_xmlXPathSubstringAfterFunction(); test_ret += test_xmlXPathSubstringBeforeFunction(); test_ret += test_xmlXPathSubstringFunction(); test_ret += test_xmlXPathSumFunction(); test_ret += test_xmlXPathTrailing(); test_ret += test_xmlXPathTrailingSorted(); test_ret += test_xmlXPathTranslateFunction(); test_ret += test_xmlXPathTrueFunction(); test_ret += test_xmlXPathValueFlipSign(); test_ret += test_xmlXPathVariableLookup(); test_ret += test_xmlXPathVariableLookupNS(); test_ret += test_xmlXPathWrapCString(); test_ret += test_xmlXPathWrapExternal(); test_ret += test_xmlXPathWrapNodeSet(); test_ret += test_xmlXPatherror(); if (test_ret != 0) printf("Module xpathInternals: %d errors\n", test_ret); return(test_ret); } static int test_xmlXPtrBuildNodeList(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlNodePtr ret_val; xmlXPathObjectPtr obj; /* the XPointer result from the evaluation. */ int n_obj; for (n_obj = 0;n_obj < gen_nb_xmlXPathObjectPtr;n_obj++) { mem_base = xmlMemBlocks(); obj = gen_xmlXPathObjectPtr(n_obj, 0); ret_val = xmlXPtrBuildNodeList(obj); desret_xmlNodePtr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_obj, obj, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrBuildNodeList", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_obj); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrEval(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlChar * str; /* the XPointer expression */ int n_str; xmlXPathContextPtr ctx; /* the XPointer context */ int n_ctx; for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) { for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) { mem_base = xmlMemBlocks(); str = gen_const_xmlChar_ptr(n_str, 0); ctx = gen_xmlXPathContextPtr(n_ctx, 1); ret_val = xmlXPtrEval((const xmlChar *)str, ctx); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0); des_xmlXPathContextPtr(n_ctx, ctx, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrEval", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_str); printf(" %d", n_ctx); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrEvalRangePredicate(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPointer Parser context */ int n_ctxt; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); xmlXPtrEvalRangePredicate(ctxt); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrEvalRangePredicate", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf("\n"); } } function_tests++; #endif return(test_ret); } #ifdef LIBXML_XPTR_ENABLED #define gen_nb_xmlLocationSetPtr 1 static xmlLocationSetPtr gen_xmlLocationSetPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { return(NULL); } static void des_xmlLocationSetPtr(int no ATTRIBUTE_UNUSED, xmlLocationSetPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) { } #endif static int test_xmlXPtrLocationSetAdd(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlLocationSetPtr cur; /* the initial range set */ int n_cur; xmlXPathObjectPtr val; /* a new xmlXPathObjectPtr */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlLocationSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlLocationSetPtr(n_cur, 0); val = gen_xmlXPathObjectPtr(n_val, 1); xmlXPtrLocationSetAdd(cur, val); call_tests++; des_xmlLocationSetPtr(n_cur, cur, 0); des_xmlXPathObjectPtr(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrLocationSetAdd", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrLocationSetCreate(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPtrLocationSetDel(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlLocationSetPtr cur; /* the initial range set */ int n_cur; xmlXPathObjectPtr val; /* an xmlXPathObjectPtr */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlLocationSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlLocationSetPtr(n_cur, 0); val = gen_xmlXPathObjectPtr(n_val, 1); xmlXPtrLocationSetDel(cur, val); call_tests++; des_xmlLocationSetPtr(n_cur, cur, 0); des_xmlXPathObjectPtr(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrLocationSetDel", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrLocationSetMerge(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPtrLocationSetRemove(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlLocationSetPtr cur; /* the initial range set */ int n_cur; int val; /* the index to remove */ int n_val; for (n_cur = 0;n_cur < gen_nb_xmlLocationSetPtr;n_cur++) { for (n_val = 0;n_val < gen_nb_int;n_val++) { mem_base = xmlMemBlocks(); cur = gen_xmlLocationSetPtr(n_cur, 0); val = gen_int(n_val, 1); xmlXPtrLocationSetRemove(cur, val); call_tests++; des_xmlLocationSetPtr(n_cur, cur, 0); des_int(n_val, val, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrLocationSetRemove", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_cur); printf(" %d", n_val); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewCollapsedRange(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr start; /* the starting and ending node */ int n_start; for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) { mem_base = xmlMemBlocks(); start = gen_xmlNodePtr(n_start, 0); ret_val = xmlXPtrNewCollapsedRange(start); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_start, start, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewCollapsedRange", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewContext(void) { int test_ret = 0; /* missing type support */ return(test_ret); } static int test_xmlXPtrNewLocationSetNodeSet(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodeSetPtr set; /* a node set */ int n_set; for (n_set = 0;n_set < gen_nb_xmlNodeSetPtr;n_set++) { mem_base = xmlMemBlocks(); set = gen_xmlNodeSetPtr(n_set, 0); ret_val = xmlXPtrNewLocationSetNodeSet(set); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodeSetPtr(n_set, set, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewLocationSetNodeSet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_set); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewLocationSetNodes(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr start; /* the start NodePtr value */ int n_start; xmlNodePtr end; /* the end NodePtr value or NULL */ int n_end; for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) { for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) { mem_base = xmlMemBlocks(); start = gen_xmlNodePtr(n_start, 0); end = gen_xmlNodePtr(n_end, 1); ret_val = xmlXPtrNewLocationSetNodes(start, end); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_start, start, 0); des_xmlNodePtr(n_end, end, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewLocationSetNodes", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf(" %d", n_end); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewRange(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr start; /* the starting node */ int n_start; int startindex; /* the start index */ int n_startindex; xmlNodePtr end; /* the ending point */ int n_end; int endindex; /* the ending index */ int n_endindex; for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) { for (n_startindex = 0;n_startindex < gen_nb_int;n_startindex++) { for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) { for (n_endindex = 0;n_endindex < gen_nb_int;n_endindex++) { mem_base = xmlMemBlocks(); start = gen_xmlNodePtr(n_start, 0); startindex = gen_int(n_startindex, 1); end = gen_xmlNodePtr(n_end, 2); endindex = gen_int(n_endindex, 3); ret_val = xmlXPtrNewRange(start, startindex, end, endindex); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_start, start, 0); des_int(n_startindex, startindex, 1); des_xmlNodePtr(n_end, end, 2); des_int(n_endindex, endindex, 3); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewRange", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf(" %d", n_startindex); printf(" %d", n_end); printf(" %d", n_endindex); printf("\n"); } } } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewRangeNodeObject(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr start; /* the starting node */ int n_start; xmlXPathObjectPtr end; /* the ending object */ int n_end; for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) { for (n_end = 0;n_end < gen_nb_xmlXPathObjectPtr;n_end++) { mem_base = xmlMemBlocks(); start = gen_xmlNodePtr(n_start, 0); end = gen_xmlXPathObjectPtr(n_end, 1); ret_val = xmlXPtrNewRangeNodeObject(start, end); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_start, start, 0); des_xmlXPathObjectPtr(n_end, end, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewRangeNodeObject", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf(" %d", n_end); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewRangeNodePoint(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr start; /* the starting node */ int n_start; xmlXPathObjectPtr end; /* the ending point */ int n_end; for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) { for (n_end = 0;n_end < gen_nb_xmlXPathObjectPtr;n_end++) { mem_base = xmlMemBlocks(); start = gen_xmlNodePtr(n_start, 0); end = gen_xmlXPathObjectPtr(n_end, 1); ret_val = xmlXPtrNewRangeNodePoint(start, end); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_start, start, 0); des_xmlXPathObjectPtr(n_end, end, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewRangeNodePoint", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf(" %d", n_end); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewRangeNodes(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlNodePtr start; /* the starting node */ int n_start; xmlNodePtr end; /* the ending node */ int n_end; for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) { for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) { mem_base = xmlMemBlocks(); start = gen_xmlNodePtr(n_start, 0); end = gen_xmlNodePtr(n_end, 1); ret_val = xmlXPtrNewRangeNodes(start, end); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlNodePtr(n_start, start, 0); des_xmlNodePtr(n_end, end, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewRangeNodes", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf(" %d", n_end); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewRangePointNode(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathObjectPtr start; /* the starting point */ int n_start; xmlNodePtr end; /* the ending node */ int n_end; for (n_start = 0;n_start < gen_nb_xmlXPathObjectPtr;n_start++) { for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) { mem_base = xmlMemBlocks(); start = gen_xmlXPathObjectPtr(n_start, 0); end = gen_xmlNodePtr(n_end, 1); ret_val = xmlXPtrNewRangePointNode(start, end); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_start, start, 0); des_xmlNodePtr(n_end, end, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewRangePointNode", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf(" %d", n_end); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrNewRangePoints(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlXPathObjectPtr start; /* the starting point */ int n_start; xmlXPathObjectPtr end; /* the ending point */ int n_end; for (n_start = 0;n_start < gen_nb_xmlXPathObjectPtr;n_start++) { for (n_end = 0;n_end < gen_nb_xmlXPathObjectPtr;n_end++) { mem_base = xmlMemBlocks(); start = gen_xmlXPathObjectPtr(n_start, 0); end = gen_xmlXPathObjectPtr(n_end, 1); ret_val = xmlXPtrNewRangePoints(start, end); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlXPathObjectPtr(n_start, start, 0); des_xmlXPathObjectPtr(n_end, end, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrNewRangePoints", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_start); printf(" %d", n_end); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrRangeToFunction(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathParserContextPtr ctxt; /* the XPointer Parser context */ int n_ctxt; int nargs; /* the number of args */ int n_nargs; for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) { for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) { mem_base = xmlMemBlocks(); ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0); nargs = gen_int(n_nargs, 1); xmlXPtrRangeToFunction(ctxt, nargs); call_tests++; des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0); des_int(n_nargs, nargs, 1); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrRangeToFunction", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_ctxt); printf(" %d", n_nargs); printf("\n"); } } } function_tests++; #endif return(test_ret); } static int test_xmlXPtrWrapLocationSet(void) { int test_ret = 0; #if defined(LIBXML_XPTR_ENABLED) int mem_base; xmlXPathObjectPtr ret_val; xmlLocationSetPtr val; /* the LocationSet value */ int n_val; for (n_val = 0;n_val < gen_nb_xmlLocationSetPtr;n_val++) { mem_base = xmlMemBlocks(); val = gen_xmlLocationSetPtr(n_val, 0); ret_val = xmlXPtrWrapLocationSet(val); desret_xmlXPathObjectPtr(ret_val); call_tests++; des_xmlLocationSetPtr(n_val, val, 0); xmlResetLastError(); if (mem_base != xmlMemBlocks()) { printf("Leak of %d blocks found in xmlXPtrWrapLocationSet", xmlMemBlocks() - mem_base); test_ret++; printf(" %d", n_val); printf("\n"); } } function_tests++; #endif return(test_ret); } static int test_xpointer(void) { int test_ret = 0; if (quiet == 0) printf("Testing xpointer : 17 of 21 functions ...\n"); test_ret += test_xmlXPtrBuildNodeList(); test_ret += test_xmlXPtrEval(); test_ret += test_xmlXPtrEvalRangePredicate(); test_ret += test_xmlXPtrLocationSetAdd(); test_ret += test_xmlXPtrLocationSetCreate(); test_ret += test_xmlXPtrLocationSetDel(); test_ret += test_xmlXPtrLocationSetMerge(); test_ret += test_xmlXPtrLocationSetRemove(); test_ret += test_xmlXPtrNewCollapsedRange(); test_ret += test_xmlXPtrNewContext(); test_ret += test_xmlXPtrNewLocationSetNodeSet(); test_ret += test_xmlXPtrNewLocationSetNodes(); test_ret += test_xmlXPtrNewRange(); test_ret += test_xmlXPtrNewRangeNodeObject(); test_ret += test_xmlXPtrNewRangeNodePoint(); test_ret += test_xmlXPtrNewRangeNodes(); test_ret += test_xmlXPtrNewRangePointNode(); test_ret += test_xmlXPtrNewRangePoints(); test_ret += test_xmlXPtrRangeToFunction(); test_ret += test_xmlXPtrWrapLocationSet(); if (test_ret != 0) printf("Module xpointer: %d errors\n", test_ret); return(test_ret); } static int test_module(const char *module) { if (!strcmp(module, "HTMLparser")) return(test_HTMLparser()); if (!strcmp(module, "HTMLtree")) return(test_HTMLtree()); if (!strcmp(module, "SAX2")) return(test_SAX2()); if (!strcmp(module, "c14n")) return(test_c14n()); if (!strcmp(module, "catalog")) return(test_catalog()); if (!strcmp(module, "chvalid")) return(test_chvalid()); if (!strcmp(module, "debugXML")) return(test_debugXML()); if (!strcmp(module, "dict")) return(test_dict()); if (!strcmp(module, "encoding")) return(test_encoding()); if (!strcmp(module, "entities")) return(test_entities()); if (!strcmp(module, "hash")) return(test_hash()); if (!strcmp(module, "list")) return(test_list()); if (!strcmp(module, "nanoftp")) return(test_nanoftp()); if (!strcmp(module, "nanohttp")) return(test_nanohttp()); if (!strcmp(module, "parser")) return(test_parser()); if (!strcmp(module, "parserInternals")) return(test_parserInternals()); if (!strcmp(module, "pattern")) return(test_pattern()); if (!strcmp(module, "relaxng")) return(test_relaxng()); if (!strcmp(module, "schemasInternals")) return(test_schemasInternals()); if (!strcmp(module, "schematron")) return(test_schematron()); if (!strcmp(module, "tree")) return(test_tree()); if (!strcmp(module, "uri")) return(test_uri()); if (!strcmp(module, "valid")) return(test_valid()); if (!strcmp(module, "xinclude")) return(test_xinclude()); if (!strcmp(module, "xmlIO")) return(test_xmlIO()); if (!strcmp(module, "xmlautomata")) return(test_xmlautomata()); if (!strcmp(module, "xmlerror")) return(test_xmlerror()); if (!strcmp(module, "xmlmodule")) return(test_xmlmodule()); if (!strcmp(module, "xmlreader")) return(test_xmlreader()); if (!strcmp(module, "xmlregexp")) return(test_xmlregexp()); if (!strcmp(module, "xmlsave")) return(test_xmlsave()); if (!strcmp(module, "xmlschemas")) return(test_xmlschemas()); if (!strcmp(module, "xmlschemastypes")) return(test_xmlschemastypes()); if (!strcmp(module, "xmlstring")) return(test_xmlstring()); if (!strcmp(module, "xmlunicode")) return(test_xmlunicode()); if (!strcmp(module, "xmlwriter")) return(test_xmlwriter()); if (!strcmp(module, "xpath")) return(test_xpath()); if (!strcmp(module, "xpathInternals")) return(test_xpathInternals()); if (!strcmp(module, "xpointer")) return(test_xpointer()); return(0); } libxml2-2.9.1+dfsg1/entities.c0000644000175000017500000007201712125573772014566 0ustar aronaron/* * entities.c : implementation for the XML entities handling * * See Copyright for the status of this software. * * daniel@veillard.com */ #define IN_LIBXML #include "libxml.h" #include #ifdef HAVE_STDLIB_H #include #endif #include #include #include #include #include #include #include #include #include "save.h" /* * The XML predefined entities. */ static xmlEntity xmlEntityLt = { NULL, XML_ENTITY_DECL, BAD_CAST "lt", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "<", BAD_CAST "<", 1, XML_INTERNAL_PREDEFINED_ENTITY, NULL, NULL, NULL, NULL, 0, 1 }; static xmlEntity xmlEntityGt = { NULL, XML_ENTITY_DECL, BAD_CAST "gt", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST ">", BAD_CAST ">", 1, XML_INTERNAL_PREDEFINED_ENTITY, NULL, NULL, NULL, NULL, 0, 1 }; static xmlEntity xmlEntityAmp = { NULL, XML_ENTITY_DECL, BAD_CAST "amp", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "&", BAD_CAST "&", 1, XML_INTERNAL_PREDEFINED_ENTITY, NULL, NULL, NULL, NULL, 0, 1 }; static xmlEntity xmlEntityQuot = { NULL, XML_ENTITY_DECL, BAD_CAST "quot", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "\"", BAD_CAST "\"", 1, XML_INTERNAL_PREDEFINED_ENTITY, NULL, NULL, NULL, NULL, 0, 1 }; static xmlEntity xmlEntityApos = { NULL, XML_ENTITY_DECL, BAD_CAST "apos", NULL, NULL, NULL, NULL, NULL, NULL, BAD_CAST "'", BAD_CAST "'", 1, XML_INTERNAL_PREDEFINED_ENTITY, NULL, NULL, NULL, NULL, 0, 1 }; /** * xmlEntitiesErrMemory: * @extra: extra informations * * Handle an out of memory condition */ static void xmlEntitiesErrMemory(const char *extra) { __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); } /** * xmlEntitiesErr: * @code: the error code * @msg: the message * * Handle an out of memory condition */ static void xmlEntitiesErr(xmlParserErrors code, const char *msg) { __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL); } /* * xmlFreeEntity : clean-up an entity record. */ static void xmlFreeEntity(xmlEntityPtr entity) { xmlDictPtr dict = NULL; if (entity == NULL) return; if (entity->doc != NULL) dict = entity->doc->dict; if ((entity->children) && (entity->owner == 1) && (entity == (xmlEntityPtr) entity->children->parent)) xmlFreeNodeList(entity->children); if (dict != NULL) { if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name))) xmlFree((char *) entity->name); if ((entity->ExternalID != NULL) && (!xmlDictOwns(dict, entity->ExternalID))) xmlFree((char *) entity->ExternalID); if ((entity->SystemID != NULL) && (!xmlDictOwns(dict, entity->SystemID))) xmlFree((char *) entity->SystemID); if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI))) xmlFree((char *) entity->URI); if ((entity->content != NULL) && (!xmlDictOwns(dict, entity->content))) xmlFree((char *) entity->content); if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig))) xmlFree((char *) entity->orig); } else { if (entity->name != NULL) xmlFree((char *) entity->name); if (entity->ExternalID != NULL) xmlFree((char *) entity->ExternalID); if (entity->SystemID != NULL) xmlFree((char *) entity->SystemID); if (entity->URI != NULL) xmlFree((char *) entity->URI); if (entity->content != NULL) xmlFree((char *) entity->content); if (entity->orig != NULL) xmlFree((char *) entity->orig); } xmlFree(entity); } /* * xmlCreateEntity: * * internal routine doing the entity node strutures allocations */ static xmlEntityPtr xmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content) { xmlEntityPtr ret; ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); if (ret == NULL) { xmlEntitiesErrMemory("xmlCreateEntity: malloc failed"); return(NULL); } memset(ret, 0, sizeof(xmlEntity)); ret->type = XML_ENTITY_DECL; ret->checked = 0; /* * fill the structure. */ ret->etype = (xmlEntityType) type; if (dict == NULL) { ret->name = xmlStrdup(name); if (ExternalID != NULL) ret->ExternalID = xmlStrdup(ExternalID); if (SystemID != NULL) ret->SystemID = xmlStrdup(SystemID); } else { ret->name = xmlDictLookup(dict, name, -1); if (ExternalID != NULL) ret->ExternalID = xmlDictLookup(dict, ExternalID, -1); if (SystemID != NULL) ret->SystemID = xmlDictLookup(dict, SystemID, -1); } if (content != NULL) { ret->length = xmlStrlen(content); if ((dict != NULL) && (ret->length < 5)) ret->content = (xmlChar *) xmlDictLookup(dict, content, ret->length); else ret->content = xmlStrndup(content, ret->length); } else { ret->length = 0; ret->content = NULL; } ret->URI = NULL; /* to be computed by the layer knowing the defining entity */ ret->orig = NULL; ret->owner = 0; return(ret); } /* * xmlAddEntity : register a new entity for an entities table. */ static xmlEntityPtr xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content) { xmlDictPtr dict = NULL; xmlEntitiesTablePtr table = NULL; xmlEntityPtr ret; if (name == NULL) return(NULL); if (dtd == NULL) return(NULL); if (dtd->doc != NULL) dict = dtd->doc->dict; switch (type) { case XML_INTERNAL_GENERAL_ENTITY: case XML_EXTERNAL_GENERAL_PARSED_ENTITY: case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: if (dtd->entities == NULL) dtd->entities = xmlHashCreateDict(0, dict); table = dtd->entities; break; case XML_INTERNAL_PARAMETER_ENTITY: case XML_EXTERNAL_PARAMETER_ENTITY: if (dtd->pentities == NULL) dtd->pentities = xmlHashCreateDict(0, dict); table = dtd->pentities; break; case XML_INTERNAL_PREDEFINED_ENTITY: return(NULL); } if (table == NULL) return(NULL); ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); if (ret == NULL) return(NULL); ret->doc = dtd->doc; if (xmlHashAddEntry(table, name, ret)) { /* * entity was already defined at another level. */ xmlFreeEntity(ret); return(NULL); } return(ret); } /** * xmlGetPredefinedEntity: * @name: the entity name * * Check whether this name is an predefined entity. * * Returns NULL if not, otherwise the entity */ xmlEntityPtr xmlGetPredefinedEntity(const xmlChar *name) { if (name == NULL) return(NULL); switch (name[0]) { case 'l': if (xmlStrEqual(name, BAD_CAST "lt")) return(&xmlEntityLt); break; case 'g': if (xmlStrEqual(name, BAD_CAST "gt")) return(&xmlEntityGt); break; case 'a': if (xmlStrEqual(name, BAD_CAST "amp")) return(&xmlEntityAmp); if (xmlStrEqual(name, BAD_CAST "apos")) return(&xmlEntityApos); break; case 'q': if (xmlStrEqual(name, BAD_CAST "quot")) return(&xmlEntityQuot); break; default: break; } return(NULL); } /** * xmlAddDtdEntity: * @doc: the document * @name: the entity name * @type: the entity type XML_xxx_yyy_ENTITY * @ExternalID: the entity external ID if available * @SystemID: the entity system ID if available * @content: the entity content * * Register a new entity for this document DTD external subset. * * Returns a pointer to the entity or NULL in case of error */ xmlEntityPtr xmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content) { xmlEntityPtr ret; xmlDtdPtr dtd; if (doc == NULL) { xmlEntitiesErr(XML_DTD_NO_DOC, "xmlAddDtdEntity: document is NULL"); return(NULL); } if (doc->extSubset == NULL) { xmlEntitiesErr(XML_DTD_NO_DTD, "xmlAddDtdEntity: document without external subset"); return(NULL); } dtd = doc->extSubset; ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); if (ret == NULL) return(NULL); /* * Link it to the DTD */ ret->parent = dtd; ret->doc = dtd->doc; if (dtd->last == NULL) { dtd->children = dtd->last = (xmlNodePtr) ret; } else { dtd->last->next = (xmlNodePtr) ret; ret->prev = dtd->last; dtd->last = (xmlNodePtr) ret; } return(ret); } /** * xmlAddDocEntity: * @doc: the document * @name: the entity name * @type: the entity type XML_xxx_yyy_ENTITY * @ExternalID: the entity external ID if available * @SystemID: the entity system ID if available * @content: the entity content * * Register a new entity for this document. * * Returns a pointer to the entity or NULL in case of error */ xmlEntityPtr xmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content) { xmlEntityPtr ret; xmlDtdPtr dtd; if (doc == NULL) { xmlEntitiesErr(XML_DTD_NO_DOC, "xmlAddDocEntity: document is NULL"); return(NULL); } if (doc->intSubset == NULL) { xmlEntitiesErr(XML_DTD_NO_DTD, "xmlAddDocEntity: document without internal subset"); return(NULL); } dtd = doc->intSubset; ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); if (ret == NULL) return(NULL); /* * Link it to the DTD */ ret->parent = dtd; ret->doc = dtd->doc; if (dtd->last == NULL) { dtd->children = dtd->last = (xmlNodePtr) ret; } else { dtd->last->next = (xmlNodePtr) ret; ret->prev = dtd->last; dtd->last = (xmlNodePtr) ret; } return(ret); } /** * xmlNewEntity: * @doc: the document * @name: the entity name * @type: the entity type XML_xxx_yyy_ENTITY * @ExternalID: the entity external ID if available * @SystemID: the entity system ID if available * @content: the entity content * * Create a new entity, this differs from xmlAddDocEntity() that if * the document is NULL or has no internal subset defined, then an * unlinked entity structure will be returned, it is then the responsability * of the caller to link it to the document later or free it when not needed * anymore. * * Returns a pointer to the entity or NULL in case of error */ xmlEntityPtr xmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content) { xmlEntityPtr ret; xmlDictPtr dict; if ((doc != NULL) && (doc->intSubset != NULL)) { return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content)); } if (doc != NULL) dict = doc->dict; else dict = NULL; ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); if (ret == NULL) return(NULL); ret->doc = doc; return(ret); } /** * xmlGetEntityFromTable: * @table: an entity table * @name: the entity name * @parameter: look for parameter entities * * Do an entity lookup in the table. * returns the corresponding parameter entity, if found. * * Returns A pointer to the entity structure or NULL if not found. */ static xmlEntityPtr xmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) { return((xmlEntityPtr) xmlHashLookup(table, name)); } /** * xmlGetParameterEntity: * @doc: the document referencing the entity * @name: the entity name * * Do an entity lookup in the internal and external subsets and * returns the corresponding parameter entity, if found. * * Returns A pointer to the entity structure or NULL if not found. */ xmlEntityPtr xmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) { xmlEntitiesTablePtr table; xmlEntityPtr ret; if (doc == NULL) return(NULL); if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) { table = (xmlEntitiesTablePtr) doc->intSubset->pentities; ret = xmlGetEntityFromTable(table, name); if (ret != NULL) return(ret); } if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) { table = (xmlEntitiesTablePtr) doc->extSubset->pentities; return(xmlGetEntityFromTable(table, name)); } return(NULL); } /** * xmlGetDtdEntity: * @doc: the document referencing the entity * @name: the entity name * * Do an entity lookup in the DTD entity hash table and * returns the corresponding entity, if found. * Note: the first argument is the document node, not the DTD node. * * Returns A pointer to the entity structure or NULL if not found. */ xmlEntityPtr xmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) { xmlEntitiesTablePtr table; if (doc == NULL) return(NULL); if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { table = (xmlEntitiesTablePtr) doc->extSubset->entities; return(xmlGetEntityFromTable(table, name)); } return(NULL); } /** * xmlGetDocEntity: * @doc: the document referencing the entity * @name: the entity name * * Do an entity lookup in the document entity hash table and * returns the corresponding entity, otherwise a lookup is done * in the predefined entities too. * * Returns A pointer to the entity structure or NULL if not found. */ xmlEntityPtr xmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) { xmlEntityPtr cur; xmlEntitiesTablePtr table; if (doc != NULL) { if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { table = (xmlEntitiesTablePtr) doc->intSubset->entities; cur = xmlGetEntityFromTable(table, name); if (cur != NULL) return(cur); } if (doc->standalone != 1) { if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { table = (xmlEntitiesTablePtr) doc->extSubset->entities; cur = xmlGetEntityFromTable(table, name); if (cur != NULL) return(cur); } } } return(xmlGetPredefinedEntity(name)); } /* * Macro used to grow the current buffer. */ #define growBufferReentrant() { \ xmlChar *tmp; \ size_t new_size = buffer_size * 2; \ if (new_size < buffer_size) goto mem_error; \ tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ if (tmp == NULL) goto mem_error; \ buffer = tmp; \ buffer_size = new_size; \ } /** * xmlEncodeEntitiesInternal: * @doc: the document containing the string * @input: A string to convert to XML. * @attr: are we handling an atrbute value * * Do a global encoding of a string, replacing the predefined entities * and non ASCII values with their entities and CharRef counterparts. * Contrary to xmlEncodeEntities, this routine is reentrant, and result * must be deallocated. * * Returns A newly allocated string with the substitution done. */ static xmlChar * xmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) { const xmlChar *cur = input; xmlChar *buffer = NULL; xmlChar *out = NULL; size_t buffer_size = 0; int html = 0; if (input == NULL) return(NULL); if (doc != NULL) html = (doc->type == XML_HTML_DOCUMENT_NODE); /* * allocate an translation buffer. */ buffer_size = 1000; buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); if (buffer == NULL) { xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed"); return(NULL); } out = buffer; while (*cur != '\0') { size_t indx = out - buffer; if (indx + 100 > buffer_size) { growBufferReentrant(); out = &buffer[indx]; } /* * By default one have to encode at least '<', '>', '"' and '&' ! */ if (*cur == '<') { const xmlChar *end; /* * Special handling of server side include in HTML attributes */ if (html && attr && (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') && ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) { while (cur != end) { *out++ = *cur++; indx = out - buffer; if (indx + 100 > buffer_size) { growBufferReentrant(); out = &buffer[indx]; } } *out++ = *cur++; *out++ = *cur++; *out++ = *cur++; continue; } *out++ = '&'; *out++ = 'l'; *out++ = 't'; *out++ = ';'; } else if (*cur == '>') { *out++ = '&'; *out++ = 'g'; *out++ = 't'; *out++ = ';'; } else if (*cur == '&') { /* * Special handling of &{...} construct from HTML 4, see * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1 */ if (html && attr && (cur[1] == '{') && (strchr((const char *) cur, '}'))) { while (*cur != '}') { *out++ = *cur++; indx = out - buffer; if (indx + 100 > buffer_size) { growBufferReentrant(); out = &buffer[indx]; } } *out++ = *cur++; continue; } *out++ = '&'; *out++ = 'a'; *out++ = 'm'; *out++ = 'p'; *out++ = ';'; } else if (((*cur >= 0x20) && (*cur < 0x80)) || (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) { /* * default case, just copy ! */ *out++ = *cur; } else if (*cur >= 0x80) { if (((doc != NULL) && (doc->encoding != NULL)) || (html)) { /* * Bjørn Reese provided the patch xmlChar xc; xc = (*cur & 0x3F) << 6; if (cur[1] != 0) { xc += *(++cur) & 0x3F; *out++ = xc; } else */ *out++ = *cur; } else { /* * We assume we have UTF-8 input. */ char buf[11], *ptr; int val = 0, l = 1; if (*cur < 0xC0) { xmlEntitiesErr(XML_CHECK_NOT_UTF8, "xmlEncodeEntities: input not UTF-8"); if (doc != NULL) doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); snprintf(buf, sizeof(buf), "&#%d;", *cur); buf[sizeof(buf) - 1] = 0; ptr = buf; while (*ptr != 0) *out++ = *ptr++; cur++; continue; } else if (*cur < 0xE0) { val = (cur[0]) & 0x1F; val <<= 6; val |= (cur[1]) & 0x3F; l = 2; } else if (*cur < 0xF0) { val = (cur[0]) & 0x0F; val <<= 6; val |= (cur[1]) & 0x3F; val <<= 6; val |= (cur[2]) & 0x3F; l = 3; } else if (*cur < 0xF8) { val = (cur[0]) & 0x07; val <<= 6; val |= (cur[1]) & 0x3F; val <<= 6; val |= (cur[2]) & 0x3F; val <<= 6; val |= (cur[3]) & 0x3F; l = 4; } if ((l == 1) || (!IS_CHAR(val))) { xmlEntitiesErr(XML_ERR_INVALID_CHAR, "xmlEncodeEntities: char out of range\n"); if (doc != NULL) doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); snprintf(buf, sizeof(buf), "&#%d;", *cur); buf[sizeof(buf) - 1] = 0; ptr = buf; while (*ptr != 0) *out++ = *ptr++; cur++; continue; } /* * We could do multiple things here. Just save as a char ref */ snprintf(buf, sizeof(buf), "&#x%X;", val); buf[sizeof(buf) - 1] = 0; ptr = buf; while (*ptr != 0) *out++ = *ptr++; cur += l; continue; } } else if (IS_BYTE_CHAR(*cur)) { char buf[11], *ptr; snprintf(buf, sizeof(buf), "&#%d;", *cur); buf[sizeof(buf) - 1] = 0; ptr = buf; while (*ptr != 0) *out++ = *ptr++; } cur++; } *out = 0; return(buffer); mem_error: xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed"); xmlFree(buffer); return(NULL); } /** * xmlEncodeAttributeEntities: * @doc: the document containing the string * @input: A string to convert to XML. * * Do a global encoding of a string, replacing the predefined entities * and non ASCII values with their entities and CharRef counterparts for * attribute values. * * Returns A newly allocated string with the substitution done. */ xmlChar * xmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) { return xmlEncodeEntitiesInternal(doc, input, 1); } /** * xmlEncodeEntitiesReentrant: * @doc: the document containing the string * @input: A string to convert to XML. * * Do a global encoding of a string, replacing the predefined entities * and non ASCII values with their entities and CharRef counterparts. * Contrary to xmlEncodeEntities, this routine is reentrant, and result * must be deallocated. * * Returns A newly allocated string with the substitution done. */ xmlChar * xmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) { return xmlEncodeEntitiesInternal(doc, input, 0); } /** * xmlEncodeSpecialChars: * @doc: the document containing the string * @input: A string to convert to XML. * * Do a global encoding of a string, replacing the predefined entities * this routine is reentrant, and result must be deallocated. * * Returns A newly allocated string with the substitution done. */ xmlChar * xmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) { const xmlChar *cur = input; xmlChar *buffer = NULL; xmlChar *out = NULL; size_t buffer_size = 0; if (input == NULL) return(NULL); /* * allocate an translation buffer. */ buffer_size = 1000; buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); if (buffer == NULL) { xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed"); return(NULL); } out = buffer; while (*cur != '\0') { size_t indx = out - buffer; if (indx + 10 > buffer_size) { growBufferReentrant(); out = &buffer[indx]; } /* * By default one have to encode at least '<', '>', '"' and '&' ! */ if (*cur == '<') { *out++ = '&'; *out++ = 'l'; *out++ = 't'; *out++ = ';'; } else if (*cur == '>') { *out++ = '&'; *out++ = 'g'; *out++ = 't'; *out++ = ';'; } else if (*cur == '&') { *out++ = '&'; *out++ = 'a'; *out++ = 'm'; *out++ = 'p'; *out++ = ';'; } else if (*cur == '"') { *out++ = '&'; *out++ = 'q'; *out++ = 'u'; *out++ = 'o'; *out++ = 't'; *out++ = ';'; } else if (*cur == '\r') { *out++ = '&'; *out++ = '#'; *out++ = '1'; *out++ = '3'; *out++ = ';'; } else { /* * Works because on UTF-8, all extended sequences cannot * result in bytes in the ASCII range. */ *out++ = *cur; } cur++; } *out = 0; return(buffer); mem_error: xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed"); xmlFree(buffer); return(NULL); } /** * xmlCreateEntitiesTable: * * create and initialize an empty entities hash table. * This really doesn't make sense and should be deprecated * * Returns the xmlEntitiesTablePtr just created or NULL in case of error. */ xmlEntitiesTablePtr xmlCreateEntitiesTable(void) { return((xmlEntitiesTablePtr) xmlHashCreate(0)); } /** * xmlFreeEntityWrapper: * @entity: An entity * @name: its name * * Deallocate the memory used by an entities in the hash table. */ static void xmlFreeEntityWrapper(xmlEntityPtr entity, const xmlChar *name ATTRIBUTE_UNUSED) { if (entity != NULL) xmlFreeEntity(entity); } /** * xmlFreeEntitiesTable: * @table: An entity table * * Deallocate the memory used by an entities hash table. */ void xmlFreeEntitiesTable(xmlEntitiesTablePtr table) { xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); } #ifdef LIBXML_TREE_ENABLED /** * xmlCopyEntity: * @ent: An entity * * Build a copy of an entity * * Returns the new xmlEntitiesPtr or NULL in case of error. */ static xmlEntityPtr xmlCopyEntity(xmlEntityPtr ent) { xmlEntityPtr cur; cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); if (cur == NULL) { xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed"); return(NULL); } memset(cur, 0, sizeof(xmlEntity)); cur->type = XML_ENTITY_DECL; cur->etype = ent->etype; if (ent->name != NULL) cur->name = xmlStrdup(ent->name); if (ent->ExternalID != NULL) cur->ExternalID = xmlStrdup(ent->ExternalID); if (ent->SystemID != NULL) cur->SystemID = xmlStrdup(ent->SystemID); if (ent->content != NULL) cur->content = xmlStrdup(ent->content); if (ent->orig != NULL) cur->orig = xmlStrdup(ent->orig); if (ent->URI != NULL) cur->URI = xmlStrdup(ent->URI); return(cur); } /** * xmlCopyEntitiesTable: * @table: An entity table * * Build a copy of an entity table. * * Returns the new xmlEntitiesTablePtr or NULL in case of error. */ xmlEntitiesTablePtr xmlCopyEntitiesTable(xmlEntitiesTablePtr table) { return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity)); } #endif /* LIBXML_TREE_ENABLED */ #ifdef LIBXML_OUTPUT_ENABLED /** * xmlDumpEntityContent: * @buf: An XML buffer. * @content: The entity content. * * This will dump the quoted string value, taking care of the special * treatment required by % */ static void xmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) { if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; if (xmlStrchr(content, '%')) { const xmlChar * base, *cur; xmlBufferCCat(buf, "\""); base = cur = content; while (*cur != 0) { if (*cur == '"') { if (base != cur) xmlBufferAdd(buf, base, cur - base); xmlBufferAdd(buf, BAD_CAST """, 6); cur++; base = cur; } else if (*cur == '%') { if (base != cur) xmlBufferAdd(buf, base, cur - base); xmlBufferAdd(buf, BAD_CAST "%", 6); cur++; base = cur; } else { cur++; } } if (base != cur) xmlBufferAdd(buf, base, cur - base); xmlBufferCCat(buf, "\""); } else { xmlBufferWriteQuotedString(buf, content); } } /** * xmlDumpEntityDecl: * @buf: An XML buffer. * @ent: An entity table * * This will dump the content of the entity table as an XML DTD definition */ void xmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) { if ((buf == NULL) || (ent == NULL)) return; switch (ent->etype) { case XML_INTERNAL_GENERAL_ENTITY: xmlBufferWriteChar(buf, "name); xmlBufferWriteChar(buf, " "); if (ent->orig != NULL) xmlBufferWriteQuotedString(buf, ent->orig); else xmlDumpEntityContent(buf, ent->content); xmlBufferWriteChar(buf, ">\n"); break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: xmlBufferWriteChar(buf, "name); if (ent->ExternalID != NULL) { xmlBufferWriteChar(buf, " PUBLIC "); xmlBufferWriteQuotedString(buf, ent->ExternalID); xmlBufferWriteChar(buf, " "); xmlBufferWriteQuotedString(buf, ent->SystemID); } else { xmlBufferWriteChar(buf, " SYSTEM "); xmlBufferWriteQuotedString(buf, ent->SystemID); } xmlBufferWriteChar(buf, ">\n"); break; case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: xmlBufferWriteChar(buf, "name); if (ent->ExternalID != NULL) { xmlBufferWriteChar(buf, " PUBLIC "); xmlBufferWriteQuotedString(buf, ent->ExternalID); xmlBufferWriteChar(buf, " "); xmlBufferWriteQuotedString(buf, ent->SystemID); } else { xmlBufferWriteChar(buf, " SYSTEM "); xmlBufferWriteQuotedString(buf, ent->SystemID); } if (ent->content != NULL) { /* Should be true ! */ xmlBufferWriteChar(buf, " NDATA "); if (ent->orig != NULL) xmlBufferWriteCHAR(buf, ent->orig); else xmlBufferWriteCHAR(buf, ent->content); } xmlBufferWriteChar(buf, ">\n"); break; case XML_INTERNAL_PARAMETER_ENTITY: xmlBufferWriteChar(buf, "name); xmlBufferWriteChar(buf, " "); if (ent->orig == NULL) xmlDumpEntityContent(buf, ent->content); else xmlBufferWriteQuotedString(buf, ent->orig); xmlBufferWriteChar(buf, ">\n"); break; case XML_EXTERNAL_PARAMETER_ENTITY: xmlBufferWriteChar(buf, "name); if (ent->ExternalID != NULL) { xmlBufferWriteChar(buf, " PUBLIC "); xmlBufferWriteQuotedString(buf, ent->ExternalID); xmlBufferWriteChar(buf, " "); xmlBufferWriteQuotedString(buf, ent->SystemID); } else { xmlBufferWriteChar(buf, " SYSTEM "); xmlBufferWriteQuotedString(buf, ent->SystemID); } xmlBufferWriteChar(buf, ">\n"); break; default: xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY, "xmlDumpEntitiesDecl: internal: unknown type entity type"); } } /** * xmlDumpEntityDeclScan: * @ent: An entity table * @buf: An XML buffer. * * When using the hash table scan function, arguments need to be reversed */ static void xmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) { xmlDumpEntityDecl(buf, ent); } /** * xmlDumpEntitiesTable: * @buf: An XML buffer. * @table: An entity table * * This will dump the content of the entity table as an XML DTD definition */ void xmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) { xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf); } #endif /* LIBXML_OUTPUT_ENABLED */ #define bottom_entities #include "elfgcchack.h" libxml2-2.9.1+dfsg1/xmlIO.c0000644000175000017500000031656312124455334013771 0ustar aronaron/* * xmlIO.c : implementation of the I/O interfaces used by the parser * * See Copyright for the status of this software. * * daniel@veillard.com * * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char */ #define IN_LIBXML #include "libxml.h" #include #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_ZLIB_H #include #endif #ifdef HAVE_LZMA_H #include #endif #if defined(WIN32) || defined(_WIN32) #include #endif #if defined(_WIN32_WCE) #include /* for CP_UTF8 */ #endif /* Figure a portable way to know if a file is a directory. */ #ifndef HAVE_STAT # ifdef HAVE__STAT /* MS C library seems to define stat and _stat. The definition is identical. Still, mapping them to each other causes a warning. */ # ifndef _MSC_VER # define stat(x,y) _stat(x,y) # endif # define HAVE_STAT # endif #else # ifdef HAVE__STAT # if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) # define stat _stat # endif # endif #endif #ifdef HAVE_STAT # ifndef S_ISDIR # ifdef _S_ISDIR # define S_ISDIR(x) _S_ISDIR(x) # else # ifdef S_IFDIR # ifndef S_IFMT # ifdef _S_IFMT # define S_IFMT _S_IFMT # endif # endif # ifdef S_IFMT # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # endif # endif # endif # endif #endif #include #include #include #include #include #include #include #include #ifdef LIBXML_CATALOG_ENABLED #include #endif #include #include "buf.h" #include "enc.h" /* #define VERBOSE_FAILURE */ /* #define DEBUG_EXTERNAL_ENTITIES */ /* #define DEBUG_INPUT */ #ifdef DEBUG_INPUT #define MINLEN 40 #else #define MINLEN 4000 #endif /* * Input I/O callback sets */ typedef struct _xmlInputCallback { xmlInputMatchCallback matchcallback; xmlInputOpenCallback opencallback; xmlInputReadCallback readcallback; xmlInputCloseCallback closecallback; } xmlInputCallback; #define MAX_INPUT_CALLBACK 15 static xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK]; static int xmlInputCallbackNr = 0; static int xmlInputCallbackInitialized = 0; #ifdef LIBXML_OUTPUT_ENABLED /* * Output I/O callback sets */ typedef struct _xmlOutputCallback { xmlOutputMatchCallback matchcallback; xmlOutputOpenCallback opencallback; xmlOutputWriteCallback writecallback; xmlOutputCloseCallback closecallback; } xmlOutputCallback; #define MAX_OUTPUT_CALLBACK 15 static xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK]; static int xmlOutputCallbackNr = 0; static int xmlOutputCallbackInitialized = 0; xmlOutputBufferPtr xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder); #endif /* LIBXML_OUTPUT_ENABLED */ /************************************************************************ * * * Tree memory error handler * * * ************************************************************************/ static const char *IOerr[] = { "Unknown IO error", /* UNKNOWN */ "Permission denied", /* EACCES */ "Resource temporarily unavailable",/* EAGAIN */ "Bad file descriptor", /* EBADF */ "Bad message", /* EBADMSG */ "Resource busy", /* EBUSY */ "Operation canceled", /* ECANCELED */ "No child processes", /* ECHILD */ "Resource deadlock avoided",/* EDEADLK */ "Domain error", /* EDOM */ "File exists", /* EEXIST */ "Bad address", /* EFAULT */ "File too large", /* EFBIG */ "Operation in progress", /* EINPROGRESS */ "Interrupted function call",/* EINTR */ "Invalid argument", /* EINVAL */ "Input/output error", /* EIO */ "Is a directory", /* EISDIR */ "Too many open files", /* EMFILE */ "Too many links", /* EMLINK */ "Inappropriate message buffer length",/* EMSGSIZE */ "Filename too long", /* ENAMETOOLONG */ "Too many open files in system",/* ENFILE */ "No such device", /* ENODEV */ "No such file or directory",/* ENOENT */ "Exec format error", /* ENOEXEC */ "No locks available", /* ENOLCK */ "Not enough space", /* ENOMEM */ "No space left on device", /* ENOSPC */ "Function not implemented", /* ENOSYS */ "Not a directory", /* ENOTDIR */ "Directory not empty", /* ENOTEMPTY */ "Not supported", /* ENOTSUP */ "Inappropriate I/O control operation",/* ENOTTY */ "No such device or address",/* ENXIO */ "Operation not permitted", /* EPERM */ "Broken pipe", /* EPIPE */ "Result too large", /* ERANGE */ "Read-only file system", /* EROFS */ "Invalid seek", /* ESPIPE */ "No such process", /* ESRCH */ "Operation timed out", /* ETIMEDOUT */ "Improper link", /* EXDEV */ "Attempt to load network entity %s", /* XML_IO_NETWORK_ATTEMPT */ "encoder error", /* XML_IO_ENCODER */ "flush error", "write error", "no input", "buffer full", "loading error", "not a socket", /* ENOTSOCK */ "already connected", /* EISCONN */ "connection refused", /* ECONNREFUSED */ "unreachable network", /* ENETUNREACH */ "adddress in use", /* EADDRINUSE */ "already in use", /* EALREADY */ "unknown address familly", /* EAFNOSUPPORT */ }; #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) /** * __xmlIOWin32UTF8ToWChar: * @u8String: uft-8 string * * Convert a string from utf-8 to wchar (WINDOWS ONLY!) */ static wchar_t * __xmlIOWin32UTF8ToWChar(const char *u8String) { wchar_t *wString = NULL; if (u8String) { int wLen = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String, -1, NULL, 0); if (wLen) { wString = xmlMalloc(wLen * sizeof(wchar_t)); if (wString) { if (MultiByteToWideChar (CP_UTF8, 0, u8String, -1, wString, wLen) == 0) { xmlFree(wString); wString = NULL; } } } } return wString; } #endif /** * xmlIOErrMemory: * @extra: extra informations * * Handle an out of memory condition */ static void xmlIOErrMemory(const char *extra) { __xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra); } /** * __xmlIOErr: * @code: the error number * @ * @extra: extra informations * * Handle an I/O error */ void __xmlIOErr(int domain, int code, const char *extra) { unsigned int idx; if (code == 0) { #ifdef HAVE_ERRNO_H if (errno == 0) code = 0; #ifdef EACCES else if (errno == EACCES) code = XML_IO_EACCES; #endif #ifdef EAGAIN else if (errno == EAGAIN) code = XML_IO_EAGAIN; #endif #ifdef EBADF else if (errno == EBADF) code = XML_IO_EBADF; #endif #ifdef EBADMSG else if (errno == EBADMSG) code = XML_IO_EBADMSG; #endif #ifdef EBUSY else if (errno == EBUSY) code = XML_IO_EBUSY; #endif #ifdef ECANCELED else if (errno == ECANCELED) code = XML_IO_ECANCELED; #endif #ifdef ECHILD else if (errno == ECHILD) code = XML_IO_ECHILD; #endif #ifdef EDEADLK else if (errno == EDEADLK) code = XML_IO_EDEADLK; #endif #ifdef EDOM else if (errno == EDOM) code = XML_IO_EDOM; #endif #ifdef EEXIST else if (errno == EEXIST) code = XML_IO_EEXIST; #endif #ifdef EFAULT else if (errno == EFAULT) code = XML_IO_EFAULT; #endif #ifdef EFBIG else if (errno == EFBIG) code = XML_IO_EFBIG; #endif #ifdef EINPROGRESS else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS; #endif #ifdef EINTR else if (errno == EINTR) code = XML_IO_EINTR; #endif #ifdef EINVAL else if (errno == EINVAL) code = XML_IO_EINVAL; #endif #ifdef EIO else if (errno == EIO) code = XML_IO_EIO; #endif #ifdef EISDIR else if (errno == EISDIR) code = XML_IO_EISDIR; #endif #ifdef EMFILE else if (errno == EMFILE) code = XML_IO_EMFILE; #endif #ifdef EMLINK else if (errno == EMLINK) code = XML_IO_EMLINK; #endif #ifdef EMSGSIZE else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE; #endif #ifdef ENAMETOOLONG else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG; #endif #ifdef ENFILE else if (errno == ENFILE) code = XML_IO_ENFILE; #endif #ifdef ENODEV else if (errno == ENODEV) code = XML_IO_ENODEV; #endif #ifdef ENOENT else if (errno == ENOENT) code = XML_IO_ENOENT; #endif #ifdef ENOEXEC else if (errno == ENOEXEC) code = XML_IO_ENOEXEC; #endif #ifdef ENOLCK else if (errno == ENOLCK) code = XML_IO_ENOLCK; #endif #ifdef ENOMEM else if (errno == ENOMEM) code = XML_IO_ENOMEM; #endif #ifdef ENOSPC else if (errno == ENOSPC) code = XML_IO_ENOSPC; #endif #ifdef ENOSYS else if (errno == ENOSYS) code = XML_IO_ENOSYS; #endif #ifdef ENOTDIR else if (errno == ENOTDIR) code = XML_IO_ENOTDIR; #endif #ifdef ENOTEMPTY else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY; #endif #ifdef ENOTSUP else if (errno == ENOTSUP) code = XML_IO_ENOTSUP; #endif #ifdef ENOTTY else if (errno == ENOTTY) code = XML_IO_ENOTTY; #endif #ifdef ENXIO else if (errno == ENXIO) code = XML_IO_ENXIO; #endif #ifdef EPERM else if (errno == EPERM) code = XML_IO_EPERM; #endif #ifdef EPIPE else if (errno == EPIPE) code = XML_IO_EPIPE; #endif #ifdef ERANGE else if (errno == ERANGE) code = XML_IO_ERANGE; #endif #ifdef EROFS else if (errno == EROFS) code = XML_IO_EROFS; #endif #ifdef ESPIPE else if (errno == ESPIPE) code = XML_IO_ESPIPE; #endif #ifdef ESRCH else if (errno == ESRCH) code = XML_IO_ESRCH; #endif #ifdef ETIMEDOUT else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT; #endif #ifdef EXDEV else if (errno == EXDEV) code = XML_IO_EXDEV; #endif #ifdef ENOTSOCK else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK; #endif #ifdef EISCONN else if (errno == EISCONN) code = XML_IO_EISCONN; #endif #ifdef ECONNREFUSED else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED; #endif #ifdef ETIMEDOUT else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT; #endif #ifdef ENETUNREACH else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH; #endif #ifdef EADDRINUSE else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE; #endif #ifdef EINPROGRESS else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS; #endif #ifdef EALREADY else if (errno == EALREADY) code = XML_IO_EALREADY; #endif #ifdef EAFNOSUPPORT else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT; #endif else code = XML_IO_UNKNOWN; #endif /* HAVE_ERRNO_H */ } idx = 0; if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN; if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0; __xmlSimpleError(domain, code, NULL, IOerr[idx], extra); } /** * xmlIOErr: * @code: the error number * @extra: extra informations * * Handle an I/O error */ static void xmlIOErr(int code, const char *extra) { __xmlIOErr(XML_FROM_IO, code, extra); } /** * __xmlLoaderErr: * @ctx: the parser context * @extra: extra informations * * Handle a resource access error */ void __xmlLoaderErr(void *ctx, const char *msg, const char *filename) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlStructuredErrorFunc schannel = NULL; xmlGenericErrorFunc channel = NULL; void *data = NULL; xmlErrorLevel level = XML_ERR_ERROR; if ((ctxt != NULL) && (ctxt->disableSAX != 0) && (ctxt->instate == XML_PARSER_EOF)) return; if ((ctxt != NULL) && (ctxt->sax != NULL)) { if (ctxt->validate) { channel = ctxt->sax->error; level = XML_ERR_ERROR; } else { channel = ctxt->sax->warning; level = XML_ERR_WARNING; } if (ctxt->sax->initialized == XML_SAX2_MAGIC) schannel = ctxt->sax->serror; data = ctxt->userData; } __xmlRaiseError(schannel, channel, data, ctxt, NULL, XML_FROM_IO, XML_IO_LOAD_ERROR, level, NULL, 0, filename, NULL, NULL, 0, 0, msg, filename); } /************************************************************************ * * * Tree memory error handler * * * ************************************************************************/ /** * xmlNormalizeWindowsPath: * @path: the input file path * * This function is obsolete. Please see xmlURIFromPath in uri.c for * a better solution. * * Returns a canonicalized version of the path */ xmlChar * xmlNormalizeWindowsPath(const xmlChar *path) { return xmlCanonicPath(path); } /** * xmlCleanupInputCallbacks: * * clears the entire input callback table. this includes the * compiled-in I/O. */ void xmlCleanupInputCallbacks(void) { int i; if (!xmlInputCallbackInitialized) return; for (i = xmlInputCallbackNr - 1; i >= 0; i--) { xmlInputCallbackTable[i].matchcallback = NULL; xmlInputCallbackTable[i].opencallback = NULL; xmlInputCallbackTable[i].readcallback = NULL; xmlInputCallbackTable[i].closecallback = NULL; } xmlInputCallbackNr = 0; xmlInputCallbackInitialized = 0; } /** * xmlPopInputCallbacks: * * Clear the top input callback from the input stack. this includes the * compiled-in I/O. * * Returns the number of input callback registered or -1 in case of error. */ int xmlPopInputCallbacks(void) { if (!xmlInputCallbackInitialized) return(-1); if (xmlInputCallbackNr <= 0) return(-1); xmlInputCallbackNr--; xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = NULL; xmlInputCallbackTable[xmlInputCallbackNr].opencallback = NULL; xmlInputCallbackTable[xmlInputCallbackNr].readcallback = NULL; xmlInputCallbackTable[xmlInputCallbackNr].closecallback = NULL; return(xmlInputCallbackNr); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlCleanupOutputCallbacks: * * clears the entire output callback table. this includes the * compiled-in I/O callbacks. */ void xmlCleanupOutputCallbacks(void) { int i; if (!xmlOutputCallbackInitialized) return; for (i = xmlOutputCallbackNr - 1; i >= 0; i--) { xmlOutputCallbackTable[i].matchcallback = NULL; xmlOutputCallbackTable[i].opencallback = NULL; xmlOutputCallbackTable[i].writecallback = NULL; xmlOutputCallbackTable[i].closecallback = NULL; } xmlOutputCallbackNr = 0; xmlOutputCallbackInitialized = 0; } #endif /* LIBXML_OUTPUT_ENABLED */ /************************************************************************ * * * Standard I/O for file accesses * * * ************************************************************************/ #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) /** * xmlWrapOpenUtf8: * @path: the path in utf-8 encoding * @mode: type of access (0 - read, 1 - write) * * function opens the file specified by @path * */ static FILE* xmlWrapOpenUtf8(const char *path,int mode) { FILE *fd = NULL; wchar_t *wPath; wPath = __xmlIOWin32UTF8ToWChar(path); if(wPath) { fd = _wfopen(wPath, mode ? L"wb" : L"rb"); xmlFree(wPath); } /* maybe path in native encoding */ if(fd == NULL) fd = fopen(path, mode ? "wb" : "rb"); return fd; } #ifdef HAVE_ZLIB_H static gzFile xmlWrapGzOpenUtf8(const char *path, const char *mode) { gzFile fd; wchar_t *wPath; fd = gzopen (path, mode); if (fd) return fd; wPath = __xmlIOWin32UTF8ToWChar(path); if(wPath) { int d, m = (strstr(mode, "r") ? O_RDONLY : O_RDWR); #ifdef _O_BINARY m |= (strstr(mode, "b") ? _O_BINARY : 0); #endif d = _wopen(wPath, m); if (d >= 0) fd = gzdopen(d, mode); xmlFree(wPath); } return fd; } #endif /** * xmlWrapStatUtf8: * @path: the path in utf-8 encoding * @info: structure that stores results * * function obtains information about the file or directory * */ static int xmlWrapStatUtf8(const char *path,struct stat *info) { #ifdef HAVE_STAT int retval = -1; wchar_t *wPath; wPath = __xmlIOWin32UTF8ToWChar(path); if (wPath) { retval = _wstat(wPath,info); xmlFree(wPath); } /* maybe path in native encoding */ if(retval < 0) retval = stat(path,info); return retval; #else return -1; #endif } /** * xmlWrapOpenNative: * @path: the path * @mode: type of access (0 - read, 1 - write) * * function opens the file specified by @path * */ static FILE* xmlWrapOpenNative(const char *path,int mode) { return fopen(path,mode ? "wb" : "rb"); } /** * xmlWrapStatNative: * @path: the path * @info: structure that stores results * * function obtains information about the file or directory * */ static int xmlWrapStatNative(const char *path,struct stat *info) { #ifdef HAVE_STAT return stat(path,info); #else return -1; #endif } typedef int (* xmlWrapStatFunc) (const char *f, struct stat *s); static xmlWrapStatFunc xmlWrapStat = xmlWrapStatNative; typedef FILE* (* xmlWrapOpenFunc)(const char *f,int mode); static xmlWrapOpenFunc xmlWrapOpen = xmlWrapOpenNative; #ifdef HAVE_ZLIB_H typedef gzFile (* xmlWrapGzOpenFunc) (const char *f, const char *mode); static xmlWrapGzOpenFunc xmlWrapGzOpen = gzopen; #endif /** * xmlInitPlatformSpecificIo: * * Initialize platform specific features. */ static void xmlInitPlatformSpecificIo(void) { static int xmlPlatformIoInitialized = 0; OSVERSIONINFO osvi; if(xmlPlatformIoInitialized) return; osvi.dwOSVersionInfoSize = sizeof(osvi); if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) { xmlWrapStat = xmlWrapStatUtf8; xmlWrapOpen = xmlWrapOpenUtf8; #ifdef HAVE_ZLIB_H xmlWrapGzOpen = xmlWrapGzOpenUtf8; #endif } else { xmlWrapStat = xmlWrapStatNative; xmlWrapOpen = xmlWrapOpenNative; #ifdef HAVE_ZLIB_H xmlWrapGzOpen = gzopen; #endif } xmlPlatformIoInitialized = 1; return; } #endif /** * xmlCheckFilename: * @path: the path to check * * function checks to see if @path is a valid source * (file, socket...) for XML. * * if stat is not available on the target machine, * returns 1. if stat fails, returns 0 (if calling * stat on the filename fails, it can't be right). * if stat succeeds and the file is a directory, * returns 2. otherwise returns 1. */ int xmlCheckFilename (const char *path) { #ifdef HAVE_STAT struct stat stat_buffer; #endif if (path == NULL) return(0); #ifdef HAVE_STAT #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) /* * On Windows stat and wstat do not work with long pathname, * which start with '\\?\' */ if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') && (path[3] == '\\') ) return 1; if (xmlWrapStat(path, &stat_buffer) == -1) return 0; #else if (stat(path, &stat_buffer) == -1) return 0; #endif #ifdef S_ISDIR if (S_ISDIR(stat_buffer.st_mode)) return 2; #endif #endif /* HAVE_STAT */ return 1; } int xmlNop(void) { return(0); } /** * xmlFdRead: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to read * * Read @len bytes to @buffer from the I/O channel. * * Returns the number of bytes written */ static int xmlFdRead (void * context, char * buffer, int len) { int ret; ret = read((int) (long) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "read()"); return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlFdWrite: * @context: the I/O context * @buffer: where to get data * @len: number of bytes to write * * Write @len bytes from @buffer to the I/O channel. * * Returns the number of bytes written */ static int xmlFdWrite (void * context, const char * buffer, int len) { int ret = 0; if (len > 0) { ret = write((int) (long) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "write()"); } return(ret); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlFdClose: * @context: the I/O context * * Close an I/O channel * * Returns 0 in case of success and error code otherwise */ static int xmlFdClose (void * context) { int ret; ret = close((int) (long) context); if (ret < 0) xmlIOErr(0, "close()"); return(ret); } /** * xmlFileMatch: * @filename: the URI for matching * * input from FILE * * * Returns 1 if matches, 0 otherwise */ int xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) { return(1); } /** * xmlFileOpen_real: * @filename: the URI for matching * * input from FILE *, supports compressed input * if @filename is " " then the standard input is used * * Returns an I/O context or NULL in case of error */ static void * xmlFileOpen_real (const char *filename) { const char *path = NULL; FILE *fd; if (filename == NULL) return(NULL); if (!strcmp(filename, "-")) { fd = stdin; return((void *) fd); } if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) { #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[17]; #else path = &filename[16]; #endif } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[8]; #else path = &filename[7]; #endif } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) { /* lots of generators seems to lazy to read RFC 1738 */ #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[6]; #else path = &filename[5]; #endif } else path = filename; if (path == NULL) return(NULL); if (!xmlCheckFilename(path)) return(NULL); #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) fd = xmlWrapOpen(path, 0); #else fd = fopen(path, "r"); #endif /* WIN32 */ if (fd == NULL) xmlIOErr(0, path); return((void *) fd); } /** * xmlFileOpen: * @filename: the URI for matching * * Wrapper around xmlFileOpen_real that try it with an unescaped * version of @filename, if this fails fallback to @filename * * Returns a handler or NULL in case or failure */ void * xmlFileOpen (const char *filename) { char *unescaped; void *retval; retval = xmlFileOpen_real(filename); if (retval == NULL) { unescaped = xmlURIUnescapeString(filename, 0, NULL); if (unescaped != NULL) { retval = xmlFileOpen_real(unescaped); xmlFree(unescaped); } } return retval; } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlFileOpenW: * @filename: the URI for matching * * output to from FILE *, * if @filename is "-" then the standard output is used * * Returns an I/O context or NULL in case of error */ static void * xmlFileOpenW (const char *filename) { const char *path = NULL; FILE *fd; if (!strcmp(filename, "-")) { fd = stdout; return((void *) fd); } if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[17]; #else path = &filename[16]; #endif else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[8]; #else path = &filename[7]; #endif } else path = filename; if (path == NULL) return(NULL); #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) fd = xmlWrapOpen(path, 1); #else fd = fopen(path, "wb"); #endif /* WIN32 */ if (fd == NULL) xmlIOErr(0, path); return((void *) fd); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlFileRead: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to write * * Read @len bytes to @buffer from the I/O channel. * * Returns the number of bytes written or < 0 in case of failure */ int xmlFileRead (void * context, char * buffer, int len) { int ret; if ((context == NULL) || (buffer == NULL)) return(-1); ret = fread(&buffer[0], 1, len, (FILE *) context); if (ret < 0) xmlIOErr(0, "fread()"); return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlFileWrite: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to write * * Write @len bytes from @buffer to the I/O channel. * * Returns the number of bytes written */ static int xmlFileWrite (void * context, const char * buffer, int len) { int items; if ((context == NULL) || (buffer == NULL)) return(-1); items = fwrite(&buffer[0], len, 1, (FILE *) context); if ((items == 0) && (ferror((FILE *) context))) { xmlIOErr(0, "fwrite()"); return(-1); } return(items * len); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlFileClose: * @context: the I/O context * * Close an I/O channel * * Returns 0 or -1 in case of error */ int xmlFileClose (void * context) { FILE *fil; int ret; if (context == NULL) return(-1); fil = (FILE *) context; if ((fil == stdout) || (fil == stderr)) { ret = fflush(fil); if (ret < 0) xmlIOErr(0, "fflush()"); return(0); } if (fil == stdin) return(0); ret = ( fclose((FILE *) context) == EOF ) ? -1 : 0; if (ret < 0) xmlIOErr(0, "fclose()"); return(ret); } /** * xmlFileFlush: * @context: the I/O context * * Flush an I/O channel */ static int xmlFileFlush (void * context) { int ret; if (context == NULL) return(-1); ret = ( fflush((FILE *) context) == EOF ) ? -1 : 0; if (ret < 0) xmlIOErr(0, "fflush()"); return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlBufferWrite: * @context: the xmlBuffer * @buffer: the data to write * @len: number of bytes to write * * Write @len bytes from @buffer to the xml buffer * * Returns the number of bytes written */ static int xmlBufferWrite (void * context, const char * buffer, int len) { int ret; ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len); if (ret != 0) return(-1); return(len); } #endif #ifdef HAVE_ZLIB_H /************************************************************************ * * * I/O for compressed file accesses * * * ************************************************************************/ /** * xmlGzfileMatch: * @filename: the URI for matching * * input from compressed file test * * Returns 1 if matches, 0 otherwise */ static int xmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) { return(1); } /** * xmlGzfileOpen_real: * @filename: the URI for matching * * input from compressed file open * if @filename is " " then the standard input is used * * Returns an I/O context or NULL in case of error */ static void * xmlGzfileOpen_real (const char *filename) { const char *path = NULL; gzFile fd; if (!strcmp(filename, "-")) { fd = gzdopen(dup(0), "rb"); return((void *) fd); } if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[17]; #else path = &filename[16]; #endif else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[8]; #else path = &filename[7]; #endif } else path = filename; if (path == NULL) return(NULL); if (!xmlCheckFilename(path)) return(NULL); #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) fd = xmlWrapGzOpen(path, "rb"); #else fd = gzopen(path, "rb"); #endif return((void *) fd); } /** * xmlGzfileOpen: * @filename: the URI for matching * * Wrapper around xmlGzfileOpen if the open fais, it will * try to unescape @filename */ static void * xmlGzfileOpen (const char *filename) { char *unescaped; void *retval; retval = xmlGzfileOpen_real(filename); if (retval == NULL) { unescaped = xmlURIUnescapeString(filename, 0, NULL); if (unescaped != NULL) { retval = xmlGzfileOpen_real(unescaped); } xmlFree(unescaped); } return retval; } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlGzfileOpenW: * @filename: the URI for matching * @compression: the compression factor (0 - 9 included) * * input from compressed file open * if @filename is " " then the standard input is used * * Returns an I/O context or NULL in case of error */ static void * xmlGzfileOpenW (const char *filename, int compression) { const char *path = NULL; char mode[15]; gzFile fd; snprintf(mode, sizeof(mode), "wb%d", compression); if (!strcmp(filename, "-")) { fd = gzdopen(dup(1), mode); return((void *) fd); } if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[17]; #else path = &filename[16]; #endif else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &filename[8]; #else path = &filename[7]; #endif } else path = filename; if (path == NULL) return(NULL); #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) fd = xmlWrapGzOpen(path, mode); #else fd = gzopen(path, mode); #endif return((void *) fd); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlGzfileRead: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to write * * Read @len bytes to @buffer from the compressed I/O channel. * * Returns the number of bytes written */ static int xmlGzfileRead (void * context, char * buffer, int len) { int ret; ret = gzread((gzFile) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "gzread()"); return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlGzfileWrite: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to write * * Write @len bytes from @buffer to the compressed I/O channel. * * Returns the number of bytes written */ static int xmlGzfileWrite (void * context, const char * buffer, int len) { int ret; ret = gzwrite((gzFile) context, (char *) &buffer[0], len); if (ret < 0) xmlIOErr(0, "gzwrite()"); return(ret); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlGzfileClose: * @context: the I/O context * * Close a compressed I/O channel */ static int xmlGzfileClose (void * context) { int ret; ret = (gzclose((gzFile) context) == Z_OK ) ? 0 : -1; if (ret < 0) xmlIOErr(0, "gzclose()"); return(ret); } #endif /* HAVE_ZLIB_H */ #ifdef HAVE_LZMA_H /************************************************************************ * * * I/O for compressed file accesses * * * ************************************************************************/ #include "xzlib.h" /** * xmlXzfileMatch: * @filename: the URI for matching * * input from compressed file test * * Returns 1 if matches, 0 otherwise */ static int xmlXzfileMatch (const char *filename ATTRIBUTE_UNUSED) { return(1); } /** * xmlXzFileOpen_real: * @filename: the URI for matching * * input from compressed file open * if @filename is " " then the standard input is used * * Returns an I/O context or NULL in case of error */ static void * xmlXzfileOpen_real (const char *filename) { const char *path = NULL; xzFile fd; if (!strcmp(filename, "-")) { fd = __libxml2_xzdopen(dup(0), "rb"); return((void *) fd); } if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) { path = &filename[16]; } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { path = &filename[7]; } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) { /* lots of generators seems to lazy to read RFC 1738 */ path = &filename[5]; } else path = filename; if (path == NULL) return(NULL); if (!xmlCheckFilename(path)) return(NULL); fd = __libxml2_xzopen(path, "rb"); return((void *) fd); } /** * xmlXzfileOpen: * @filename: the URI for matching * * Wrapper around xmlXzfileOpen_real that try it with an unescaped * version of @filename, if this fails fallback to @filename * * Returns a handler or NULL in case or failure */ static void * xmlXzfileOpen (const char *filename) { char *unescaped; void *retval; retval = xmlXzfileOpen_real(filename); if (retval == NULL) { unescaped = xmlURIUnescapeString(filename, 0, NULL); if (unescaped != NULL) { retval = xmlXzfileOpen_real(unescaped); } xmlFree(unescaped); } return retval; } /** * xmlXzfileRead: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to write * * Read @len bytes to @buffer from the compressed I/O channel. * * Returns the number of bytes written */ static int xmlXzfileRead (void * context, char * buffer, int len) { int ret; ret = __libxml2_xzread((xzFile) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "xzread()"); return(ret); } /** * xmlXzfileClose: * @context: the I/O context * * Close a compressed I/O channel */ static int xmlXzfileClose (void * context) { int ret; ret = (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1; if (ret < 0) xmlIOErr(0, "xzclose()"); return(ret); } #endif /* HAVE_LZMA_H */ #ifdef LIBXML_HTTP_ENABLED /************************************************************************ * * * I/O for HTTP file accesses * * * ************************************************************************/ #ifdef LIBXML_OUTPUT_ENABLED typedef struct xmlIOHTTPWriteCtxt_ { int compression; char * uri; void * doc_buff; } xmlIOHTTPWriteCtxt, *xmlIOHTTPWriteCtxtPtr; #ifdef HAVE_ZLIB_H #define DFLT_WBITS ( -15 ) #define DFLT_MEM_LVL ( 8 ) #define GZ_MAGIC1 ( 0x1f ) #define GZ_MAGIC2 ( 0x8b ) #define LXML_ZLIB_OS_CODE ( 0x03 ) #define INIT_HTTP_BUFF_SIZE ( 32768 ) #define DFLT_ZLIB_RATIO ( 5 ) /* ** Data structure and functions to work with sending compressed data ** via HTTP. */ typedef struct xmlZMemBuff_ { unsigned long size; unsigned long crc; unsigned char * zbuff; z_stream zctrl; } xmlZMemBuff, *xmlZMemBuffPtr; /** * append_reverse_ulong * @buff: Compressed memory buffer * @data: Unsigned long to append * * Append a unsigned long in reverse byte order to the end of the * memory buffer. */ static void append_reverse_ulong( xmlZMemBuff * buff, unsigned long data ) { int idx; if ( buff == NULL ) return; /* ** This is plagiarized from putLong in gzio.c (zlib source) where ** the number "4" is hardcoded. If zlib is ever patched to ** support 64 bit file sizes, this code would need to be patched ** as well. */ for ( idx = 0; idx < 4; idx++ ) { *buff->zctrl.next_out = ( data & 0xff ); data >>= 8; buff->zctrl.next_out++; } return; } /** * * xmlFreeZMemBuff * @buff: The memory buffer context to clear * * Release all the resources associated with the compressed memory buffer. */ static void xmlFreeZMemBuff( xmlZMemBuffPtr buff ) { #ifdef DEBUG_HTTP int z_err; #endif if ( buff == NULL ) return; xmlFree( buff->zbuff ); #ifdef DEBUG_HTTP z_err = deflateEnd( &buff->zctrl ); if ( z_err != Z_OK ) xmlGenericError( xmlGenericErrorContext, "xmlFreeZMemBuff: Error releasing zlib context: %d\n", z_err ); #else deflateEnd( &buff->zctrl ); #endif xmlFree( buff ); return; } /** * xmlCreateZMemBuff *@compression: Compression value to use * * Create a memory buffer to hold the compressed XML document. The * compressed document in memory will end up being identical to what * would be created if gzopen/gzwrite/gzclose were being used to * write the document to disk. The code for the header/trailer data to * the compression is plagiarized from the zlib source files. */ static void * xmlCreateZMemBuff( int compression ) { int z_err; int hdr_lgth; xmlZMemBuffPtr buff = NULL; if ( ( compression < 1 ) || ( compression > 9 ) ) return ( NULL ); /* Create the control and data areas */ buff = xmlMalloc( sizeof( xmlZMemBuff ) ); if ( buff == NULL ) { xmlIOErrMemory("creating buffer context"); return ( NULL ); } (void)memset( buff, 0, sizeof( xmlZMemBuff ) ); buff->size = INIT_HTTP_BUFF_SIZE; buff->zbuff = xmlMalloc( buff->size ); if ( buff->zbuff == NULL ) { xmlFreeZMemBuff( buff ); xmlIOErrMemory("creating buffer"); return ( NULL ); } z_err = deflateInit2( &buff->zctrl, compression, Z_DEFLATED, DFLT_WBITS, DFLT_MEM_LVL, Z_DEFAULT_STRATEGY ); if ( z_err != Z_OK ) { xmlChar msg[500]; xmlFreeZMemBuff( buff ); buff = NULL; xmlStrPrintf(msg, 500, (const xmlChar *) "xmlCreateZMemBuff: %s %d\n", "Error initializing compression context. ZLIB error:", z_err ); xmlIOErr(XML_IO_WRITE, (const char *) msg); return ( NULL ); } /* Set the header data. The CRC will be needed for the trailer */ buff->crc = crc32( 0L, NULL, 0 ); hdr_lgth = snprintf( (char *)buff->zbuff, buff->size, "%c%c%c%c%c%c%c%c%c%c", GZ_MAGIC1, GZ_MAGIC2, Z_DEFLATED, 0, 0, 0, 0, 0, 0, LXML_ZLIB_OS_CODE ); buff->zctrl.next_out = buff->zbuff + hdr_lgth; buff->zctrl.avail_out = buff->size - hdr_lgth; return ( buff ); } /** * xmlZMemBuffExtend * @buff: Buffer used to compress and consolidate data. * @ext_amt: Number of bytes to extend the buffer. * * Extend the internal buffer used to store the compressed data by the * specified amount. * * Returns 0 on success or -1 on failure to extend the buffer. On failure * the original buffer still exists at the original size. */ static int xmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) { int rc = -1; size_t new_size; size_t cur_used; unsigned char * tmp_ptr = NULL; if ( buff == NULL ) return ( -1 ); else if ( ext_amt == 0 ) return ( 0 ); cur_used = buff->zctrl.next_out - buff->zbuff; new_size = buff->size + ext_amt; #ifdef DEBUG_HTTP if ( cur_used > new_size ) xmlGenericError( xmlGenericErrorContext, "xmlZMemBuffExtend: %s\n%s %d bytes.\n", "Buffer overwrite detected during compressed memory", "buffer extension. Overflowed by", (cur_used - new_size ) ); #endif tmp_ptr = xmlRealloc( buff->zbuff, new_size ); if ( tmp_ptr != NULL ) { rc = 0; buff->size = new_size; buff->zbuff = tmp_ptr; buff->zctrl.next_out = tmp_ptr + cur_used; buff->zctrl.avail_out = new_size - cur_used; } else { xmlChar msg[500]; xmlStrPrintf(msg, 500, (const xmlChar *) "xmlZMemBuffExtend: %s %lu bytes.\n", "Allocation failure extending output buffer to", new_size ); xmlIOErr(XML_IO_WRITE, (const char *) msg); } return ( rc ); } /** * xmlZMemBuffAppend * @buff: Buffer used to compress and consolidate data * @src: Uncompressed source content to append to buffer * @len: Length of source data to append to buffer * * Compress and append data to the internal buffer. The data buffer * will be expanded if needed to store the additional data. * * Returns the number of bytes appended to the buffer or -1 on error. */ static int xmlZMemBuffAppend( xmlZMemBuffPtr buff, const char * src, int len ) { int z_err; size_t min_accept; if ( ( buff == NULL ) || ( src == NULL ) ) return ( -1 ); buff->zctrl.avail_in = len; buff->zctrl.next_in = (unsigned char *)src; while ( buff->zctrl.avail_in > 0 ) { /* ** Extend the buffer prior to deflate call if a reasonable amount ** of output buffer space is not available. */ min_accept = buff->zctrl.avail_in / DFLT_ZLIB_RATIO; if ( buff->zctrl.avail_out <= min_accept ) { if ( xmlZMemBuffExtend( buff, buff->size ) == -1 ) return ( -1 ); } z_err = deflate( &buff->zctrl, Z_NO_FLUSH ); if ( z_err != Z_OK ) { xmlChar msg[500]; xmlStrPrintf(msg, 500, (const xmlChar *) "xmlZMemBuffAppend: %s %d %s - %d", "Compression error while appending", len, "bytes to buffer. ZLIB error", z_err ); xmlIOErr(XML_IO_WRITE, (const char *) msg); return ( -1 ); } } buff->crc = crc32( buff->crc, (unsigned char *)src, len ); return ( len ); } /** * xmlZMemBuffGetContent * @buff: Compressed memory content buffer * @data_ref: Pointer reference to point to compressed content * * Flushes the compression buffers, appends gzip file trailers and * returns the compressed content and length of the compressed data. * NOTE: The gzip trailer code here is plagiarized from zlib source. * * Returns the length of the compressed data or -1 on error. */ static int xmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) { int zlgth = -1; int z_err; if ( ( buff == NULL ) || ( data_ref == NULL ) ) return ( -1 ); /* Need to loop until compression output buffers are flushed */ do { z_err = deflate( &buff->zctrl, Z_FINISH ); if ( z_err == Z_OK ) { /* In this case Z_OK means more buffer space needed */ if ( xmlZMemBuffExtend( buff, buff->size ) == -1 ) return ( -1 ); } } while ( z_err == Z_OK ); /* If the compression state is not Z_STREAM_END, some error occurred */ if ( z_err == Z_STREAM_END ) { /* Need to append the gzip data trailer */ if ( buff->zctrl.avail_out < ( 2 * sizeof( unsigned long ) ) ) { if ( xmlZMemBuffExtend(buff, (2 * sizeof(unsigned long))) == -1 ) return ( -1 ); } /* ** For whatever reason, the CRC and length data are pushed out ** in reverse byte order. So a memcpy can't be used here. */ append_reverse_ulong( buff, buff->crc ); append_reverse_ulong( buff, buff->zctrl.total_in ); zlgth = buff->zctrl.next_out - buff->zbuff; *data_ref = (char *)buff->zbuff; } else { xmlChar msg[500]; xmlStrPrintf(msg, 500, (const xmlChar *) "xmlZMemBuffGetContent: %s - %d\n", "Error flushing zlib buffers. Error code", z_err ); xmlIOErr(XML_IO_WRITE, (const char *) msg); } return ( zlgth ); } #endif /* LIBXML_OUTPUT_ENABLED */ #endif /* HAVE_ZLIB_H */ #ifdef LIBXML_OUTPUT_ENABLED /** * xmlFreeHTTPWriteCtxt * @ctxt: Context to cleanup * * Free allocated memory and reclaim system resources. * * No return value. */ static void xmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt ) { if ( ctxt->uri != NULL ) xmlFree( ctxt->uri ); if ( ctxt->doc_buff != NULL ) { #ifdef HAVE_ZLIB_H if ( ctxt->compression > 0 ) { xmlFreeZMemBuff( ctxt->doc_buff ); } else #endif { xmlOutputBufferClose( ctxt->doc_buff ); } } xmlFree( ctxt ); return; } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlIOHTTPMatch: * @filename: the URI for matching * * check if the URI matches an HTTP one * * Returns 1 if matches, 0 otherwise */ int xmlIOHTTPMatch (const char *filename) { if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7)) return(1); return(0); } /** * xmlIOHTTPOpen: * @filename: the URI for matching * * open an HTTP I/O channel * * Returns an I/O context or NULL in case of error */ void * xmlIOHTTPOpen (const char *filename) { return(xmlNanoHTTPOpen(filename, NULL)); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlIOHTTPOpenW: * @post_uri: The destination URI for the document * @compression: The compression desired for the document. * * Open a temporary buffer to collect the document for a subsequent HTTP POST * request. Non-static as is called from the output buffer creation routine. * * Returns an I/O context or NULL in case of error. */ void * xmlIOHTTPOpenW(const char *post_uri, int compression) { xmlIOHTTPWriteCtxtPtr ctxt = NULL; if (post_uri == NULL) return (NULL); ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt)); if (ctxt == NULL) { xmlIOErrMemory("creating HTTP output context"); return (NULL); } (void) memset(ctxt, 0, sizeof(xmlIOHTTPWriteCtxt)); ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri); if (ctxt->uri == NULL) { xmlIOErrMemory("copying URI"); xmlFreeHTTPWriteCtxt(ctxt); return (NULL); } /* * ** Since the document length is required for an HTTP post, * ** need to put the document into a buffer. A memory buffer * ** is being used to avoid pushing the data to disk and back. */ #ifdef HAVE_ZLIB_H if ((compression > 0) && (compression <= 9)) { ctxt->compression = compression; ctxt->doc_buff = xmlCreateZMemBuff(compression); } else #endif { /* Any character conversions should have been done before this */ ctxt->doc_buff = xmlAllocOutputBufferInternal(NULL); } if (ctxt->doc_buff == NULL) { xmlFreeHTTPWriteCtxt(ctxt); ctxt = NULL; } return (ctxt); } #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef LIBXML_OUTPUT_ENABLED /** * xmlIOHTTPDfltOpenW * @post_uri: The destination URI for this document. * * Calls xmlIOHTTPOpenW with no compression to set up for a subsequent * HTTP post command. This function should generally not be used as * the open callback is short circuited in xmlOutputBufferCreateFile. * * Returns a pointer to the new IO context. */ static void * xmlIOHTTPDfltOpenW( const char * post_uri ) { return ( xmlIOHTTPOpenW( post_uri, 0 ) ); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlIOHTTPRead: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to write * * Read @len bytes to @buffer from the I/O channel. * * Returns the number of bytes written */ int xmlIOHTTPRead(void * context, char * buffer, int len) { if ((buffer == NULL) || (len < 0)) return(-1); return(xmlNanoHTTPRead(context, &buffer[0], len)); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlIOHTTPWrite * @context: previously opened writing context * @buffer: data to output to temporary buffer * @len: bytes to output * * Collect data from memory buffer into a temporary file for later * processing. * * Returns number of bytes written. */ static int xmlIOHTTPWrite( void * context, const char * buffer, int len ) { xmlIOHTTPWriteCtxtPtr ctxt = context; if ( ( ctxt == NULL ) || ( ctxt->doc_buff == NULL ) || ( buffer == NULL ) ) return ( -1 ); if ( len > 0 ) { /* Use gzwrite or fwrite as previously setup in the open call */ #ifdef HAVE_ZLIB_H if ( ctxt->compression > 0 ) len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len ); else #endif len = xmlOutputBufferWrite( ctxt->doc_buff, len, buffer ); if ( len < 0 ) { xmlChar msg[500]; xmlStrPrintf(msg, 500, (const xmlChar *) "xmlIOHTTPWrite: %s\n%s '%s'.\n", "Error appending to internal buffer.", "Error sending document to URI", ctxt->uri ); xmlIOErr(XML_IO_WRITE, (const char *) msg); } } return ( len ); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlIOHTTPClose: * @context: the I/O context * * Close an HTTP I/O channel * * Returns 0 */ int xmlIOHTTPClose (void * context) { xmlNanoHTTPClose(context); return 0; } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlIOHTTCloseWrite * @context: The I/O context * @http_mthd: The HTTP method to be used when sending the data * * Close the transmit HTTP I/O channel and actually send the data. */ static int xmlIOHTTPCloseWrite( void * context, const char * http_mthd ) { int close_rc = -1; int http_rtn = 0; int content_lgth = 0; xmlIOHTTPWriteCtxtPtr ctxt = context; char * http_content = NULL; char * content_encoding = NULL; char * content_type = (char *) "text/xml"; void * http_ctxt = NULL; if ( ( ctxt == NULL ) || ( http_mthd == NULL ) ) return ( -1 ); /* Retrieve the content from the appropriate buffer */ #ifdef HAVE_ZLIB_H if ( ctxt->compression > 0 ) { content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content ); content_encoding = (char *) "Content-Encoding: gzip"; } else #endif { /* Pull the data out of the memory output buffer */ xmlOutputBufferPtr dctxt = ctxt->doc_buff; http_content = (char *) xmlBufContent(dctxt->buffer); content_lgth = xmlBufUse(dctxt->buffer); } if ( http_content == NULL ) { xmlChar msg[500]; xmlStrPrintf(msg, 500, (const xmlChar *) "xmlIOHTTPCloseWrite: %s '%s' %s '%s'.\n", "Error retrieving content.\nUnable to", http_mthd, "data to URI", ctxt->uri ); xmlIOErr(XML_IO_WRITE, (const char *) msg); } else { http_ctxt = xmlNanoHTTPMethod( ctxt->uri, http_mthd, http_content, &content_type, content_encoding, content_lgth ); if ( http_ctxt != NULL ) { #ifdef DEBUG_HTTP /* If testing/debugging - dump reply with request content */ FILE * tst_file = NULL; char buffer[ 4096 ]; char * dump_name = NULL; int avail; xmlGenericError( xmlGenericErrorContext, "xmlNanoHTTPCloseWrite: HTTP %s to\n%s returned %d.\n", http_mthd, ctxt->uri, xmlNanoHTTPReturnCode( http_ctxt ) ); /* ** Since either content or reply may be gzipped, ** dump them to separate files instead of the ** standard error context. */ dump_name = tempnam( NULL, "lxml" ); if ( dump_name != NULL ) { (void)snprintf( buffer, sizeof(buffer), "%s.content", dump_name ); tst_file = fopen( buffer, "wb" ); if ( tst_file != NULL ) { xmlGenericError( xmlGenericErrorContext, "Transmitted content saved in file: %s\n", buffer ); fwrite( http_content, sizeof( char ), content_lgth, tst_file ); fclose( tst_file ); } (void)snprintf( buffer, sizeof(buffer), "%s.reply", dump_name ); tst_file = fopen( buffer, "wb" ); if ( tst_file != NULL ) { xmlGenericError( xmlGenericErrorContext, "Reply content saved in file: %s\n", buffer ); while ( (avail = xmlNanoHTTPRead( http_ctxt, buffer, sizeof( buffer ) )) > 0 ) { fwrite( buffer, sizeof( char ), avail, tst_file ); } fclose( tst_file ); } free( dump_name ); } #endif /* DEBUG_HTTP */ http_rtn = xmlNanoHTTPReturnCode( http_ctxt ); if ( ( http_rtn >= 200 ) && ( http_rtn < 300 ) ) close_rc = 0; else { xmlChar msg[500]; xmlStrPrintf(msg, 500, (const xmlChar *) "xmlIOHTTPCloseWrite: HTTP '%s' of %d %s\n'%s' %s %d\n", http_mthd, content_lgth, "bytes to URI", ctxt->uri, "failed. HTTP return code:", http_rtn ); xmlIOErr(XML_IO_WRITE, (const char *) msg); } xmlNanoHTTPClose( http_ctxt ); xmlFree( content_type ); } } /* Final cleanups */ xmlFreeHTTPWriteCtxt( ctxt ); return ( close_rc ); } /** * xmlIOHTTPClosePut * * @context: The I/O context * * Close the transmit HTTP I/O channel and actually send data using a PUT * HTTP method. */ static int xmlIOHTTPClosePut( void * ctxt ) { return ( xmlIOHTTPCloseWrite( ctxt, "PUT" ) ); } /** * xmlIOHTTPClosePost * * @context: The I/O context * * Close the transmit HTTP I/O channel and actually send data using a POST * HTTP method. */ static int xmlIOHTTPClosePost( void * ctxt ) { return ( xmlIOHTTPCloseWrite( ctxt, "POST" ) ); } #endif /* LIBXML_OUTPUT_ENABLED */ #endif /* LIBXML_HTTP_ENABLED */ #ifdef LIBXML_FTP_ENABLED /************************************************************************ * * * I/O for FTP file accesses * * * ************************************************************************/ /** * xmlIOFTPMatch: * @filename: the URI for matching * * check if the URI matches an FTP one * * Returns 1 if matches, 0 otherwise */ int xmlIOFTPMatch (const char *filename) { if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6)) return(1); return(0); } /** * xmlIOFTPOpen: * @filename: the URI for matching * * open an FTP I/O channel * * Returns an I/O context or NULL in case of error */ void * xmlIOFTPOpen (const char *filename) { return(xmlNanoFTPOpen(filename)); } /** * xmlIOFTPRead: * @context: the I/O context * @buffer: where to drop data * @len: number of bytes to write * * Read @len bytes to @buffer from the I/O channel. * * Returns the number of bytes written */ int xmlIOFTPRead(void * context, char * buffer, int len) { if ((buffer == NULL) || (len < 0)) return(-1); return(xmlNanoFTPRead(context, &buffer[0], len)); } /** * xmlIOFTPClose: * @context: the I/O context * * Close an FTP I/O channel * * Returns 0 */ int xmlIOFTPClose (void * context) { return ( xmlNanoFTPClose(context) ); } #endif /* LIBXML_FTP_ENABLED */ /** * xmlRegisterInputCallbacks: * @matchFunc: the xmlInputMatchCallback * @openFunc: the xmlInputOpenCallback * @readFunc: the xmlInputReadCallback * @closeFunc: the xmlInputCloseCallback * * Register a new set of I/O callback for handling parser input. * * Returns the registered handler number or -1 in case of error */ int xmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc, xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc, xmlInputCloseCallback closeFunc) { if (xmlInputCallbackNr >= MAX_INPUT_CALLBACK) { return(-1); } xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc; xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc; xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc; xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc; xmlInputCallbackInitialized = 1; return(xmlInputCallbackNr++); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlRegisterOutputCallbacks: * @matchFunc: the xmlOutputMatchCallback * @openFunc: the xmlOutputOpenCallback * @writeFunc: the xmlOutputWriteCallback * @closeFunc: the xmlOutputCloseCallback * * Register a new set of I/O callback for handling output. * * Returns the registered handler number or -1 in case of error */ int xmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc, xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc, xmlOutputCloseCallback closeFunc) { if (xmlOutputCallbackNr >= MAX_OUTPUT_CALLBACK) { return(-1); } xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc; xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc; xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc; xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc; xmlOutputCallbackInitialized = 1; return(xmlOutputCallbackNr++); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlRegisterDefaultInputCallbacks: * * Registers the default compiled-in I/O handlers. */ void xmlRegisterDefaultInputCallbacks(void) { if (xmlInputCallbackInitialized) return; #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) xmlInitPlatformSpecificIo(); #endif xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen, xmlFileRead, xmlFileClose); #ifdef HAVE_ZLIB_H xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen, xmlGzfileRead, xmlGzfileClose); #endif /* HAVE_ZLIB_H */ #ifdef HAVE_LZMA_H xmlRegisterInputCallbacks(xmlXzfileMatch, xmlXzfileOpen, xmlXzfileRead, xmlXzfileClose); #endif /* HAVE_ZLIB_H */ #ifdef LIBXML_HTTP_ENABLED xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen, xmlIOHTTPRead, xmlIOHTTPClose); #endif /* LIBXML_HTTP_ENABLED */ #ifdef LIBXML_FTP_ENABLED xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen, xmlIOFTPRead, xmlIOFTPClose); #endif /* LIBXML_FTP_ENABLED */ xmlInputCallbackInitialized = 1; } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlRegisterDefaultOutputCallbacks: * * Registers the default compiled-in I/O handlers. */ void xmlRegisterDefaultOutputCallbacks (void) { if (xmlOutputCallbackInitialized) return; #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) xmlInitPlatformSpecificIo(); #endif xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW, xmlFileWrite, xmlFileClose); #ifdef LIBXML_HTTP_ENABLED xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW, xmlIOHTTPWrite, xmlIOHTTPClosePut); #endif /********************************* No way a-priori to distinguish between gzipped files from uncompressed ones except opening if existing then closing and saving with same compression ratio ... a pain. #ifdef HAVE_ZLIB_H xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen, xmlGzfileWrite, xmlGzfileClose); #endif Nor FTP PUT .... #ifdef LIBXML_FTP_ENABLED xmlRegisterOutputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen, xmlIOFTPWrite, xmlIOFTPClose); #endif **********************************/ xmlOutputCallbackInitialized = 1; } #ifdef LIBXML_HTTP_ENABLED /** * xmlRegisterHTTPPostCallbacks: * * By default, libxml submits HTTP output requests using the "PUT" method. * Calling this method changes the HTTP output method to use the "POST" * method instead. * */ void xmlRegisterHTTPPostCallbacks( void ) { /* Register defaults if not done previously */ if ( xmlOutputCallbackInitialized == 0 ) xmlRegisterDefaultOutputCallbacks( ); xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW, xmlIOHTTPWrite, xmlIOHTTPClosePost); return; } #endif #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlAllocParserInputBuffer: * @enc: the charset encoding if known * * Create a buffered parser input for progressive parsing * * Returns the new parser input or NULL */ xmlParserInputBufferPtr xmlAllocParserInputBuffer(xmlCharEncoding enc) { xmlParserInputBufferPtr ret; ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); if (ret == NULL) { xmlIOErrMemory("creating input buffer"); return(NULL); } memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); ret->buffer = xmlBufCreateSize(2 * xmlDefaultBufferSize); if (ret->buffer == NULL) { xmlFree(ret); return(NULL); } xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT); ret->encoder = xmlGetCharEncodingHandler(enc); if (ret->encoder != NULL) ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize); else ret->raw = NULL; ret->readcallback = NULL; ret->closecallback = NULL; ret->context = NULL; ret->compressed = -1; ret->rawconsumed = 0; return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlAllocOutputBuffer: * @encoder: the encoding converter or NULL * * Create a buffered parser output * * Returns the new parser output or NULL */ xmlOutputBufferPtr xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) { xmlOutputBufferPtr ret; ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); if (ret == NULL) { xmlIOErrMemory("creating output buffer"); return(NULL); } memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); ret->buffer = xmlBufCreate(); if (ret->buffer == NULL) { xmlFree(ret); return(NULL); } /* try to avoid a performance problem with Windows realloc() */ if (xmlBufGetAllocationScheme(ret->buffer) == XML_BUFFER_ALLOC_EXACT) xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT); ret->encoder = encoder; if (encoder != NULL) { ret->conv = xmlBufCreateSize(4000); if (ret->conv == NULL) { xmlFree(ret); return(NULL); } /* * This call is designed to initiate the encoder state */ xmlCharEncOutput(ret, 1); } else ret->conv = NULL; ret->writecallback = NULL; ret->closecallback = NULL; ret->context = NULL; ret->written = 0; return(ret); } /** * xmlAllocOutputBufferInternal: * @encoder: the encoding converter or NULL * * Create a buffered parser output * * Returns the new parser output or NULL */ xmlOutputBufferPtr xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) { xmlOutputBufferPtr ret; ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); if (ret == NULL) { xmlIOErrMemory("creating output buffer"); return(NULL); } memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); ret->buffer = xmlBufCreate(); if (ret->buffer == NULL) { xmlFree(ret); return(NULL); } /* * For conversion buffers we use the special IO handling */ xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_IO); ret->encoder = encoder; if (encoder != NULL) { ret->conv = xmlBufCreateSize(4000); if (ret->conv == NULL) { xmlFree(ret); return(NULL); } /* * This call is designed to initiate the encoder state */ xmlCharEncOutput(ret, 1); } else ret->conv = NULL; ret->writecallback = NULL; ret->closecallback = NULL; ret->context = NULL; ret->written = 0; return(ret); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlFreeParserInputBuffer: * @in: a buffered parser input * * Free up the memory used by a buffered parser input */ void xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) { if (in == NULL) return; if (in->raw) { xmlBufFree(in->raw); in->raw = NULL; } if (in->encoder != NULL) { xmlCharEncCloseFunc(in->encoder); } if (in->closecallback != NULL) { in->closecallback(in->context); } if (in->buffer != NULL) { xmlBufFree(in->buffer); in->buffer = NULL; } xmlFree(in); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlOutputBufferClose: * @out: a buffered output * * flushes and close the output I/O channel * and free up all the associated resources * * Returns the number of byte written or -1 in case of error. */ int xmlOutputBufferClose(xmlOutputBufferPtr out) { int written; int err_rc = 0; if (out == NULL) return (-1); if (out->writecallback != NULL) xmlOutputBufferFlush(out); if (out->closecallback != NULL) { err_rc = out->closecallback(out->context); } written = out->written; if (out->conv) { xmlBufFree(out->conv); out->conv = NULL; } if (out->encoder != NULL) { xmlCharEncCloseFunc(out->encoder); } if (out->buffer != NULL) { xmlBufFree(out->buffer); out->buffer = NULL; } if (out->error) err_rc = -1; xmlFree(out); return ((err_rc == 0) ? written : err_rc); } #endif /* LIBXML_OUTPUT_ENABLED */ xmlParserInputBufferPtr __xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; int i = 0; void *context = NULL; if (xmlInputCallbackInitialized == 0) xmlRegisterDefaultInputCallbacks(); if (URI == NULL) return(NULL); /* * Try to find one of the input accept method accepting that scheme * Go in reverse to give precedence to user defined handlers. */ if (context == NULL) { for (i = xmlInputCallbackNr - 1;i >= 0;i--) { if ((xmlInputCallbackTable[i].matchcallback != NULL) && (xmlInputCallbackTable[i].matchcallback(URI) != 0)) { context = xmlInputCallbackTable[i].opencallback(URI); if (context != NULL) { break; } } } } if (context == NULL) { return(NULL); } /* * Allocate the Input buffer front-end. */ ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { ret->context = context; ret->readcallback = xmlInputCallbackTable[i].readcallback; ret->closecallback = xmlInputCallbackTable[i].closecallback; #ifdef HAVE_ZLIB_H if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) && (strcmp(URI, "-") != 0)) { #if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230 ret->compressed = !gzdirect(context); #else if (((z_stream *)context)->avail_in > 4) { char *cptr, buff4[4]; cptr = (char *) ((z_stream *)context)->next_in; if (gzread(context, buff4, 4) == 4) { if (strncmp(buff4, cptr, 4) == 0) ret->compressed = 0; else ret->compressed = 1; gzrewind(context); } } #endif } #endif } else xmlInputCallbackTable[i].closecallback (context); return(ret); } /** * xmlParserInputBufferCreateFilename: * @URI: a C string containing the URI or filename * @enc: the charset encoding if known * * Create a buffered parser input for the progressive parsing of a file * If filename is "-' then we use stdin as the input. * Automatic support for ZLIB/Compress compressed document is provided * by default if found at compile-time. * Do an encoding check if enc == XML_CHAR_ENCODING_NONE * * Returns the new parser input or NULL */ xmlParserInputBufferPtr xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { if ((xmlParserInputBufferCreateFilenameValue)) { return xmlParserInputBufferCreateFilenameValue(URI, enc); } return __xmlParserInputBufferCreateFilename(URI, enc); } #ifdef LIBXML_OUTPUT_ENABLED xmlOutputBufferPtr __xmlOutputBufferCreateFilename(const char *URI, xmlCharEncodingHandlerPtr encoder, int compression ATTRIBUTE_UNUSED) { xmlOutputBufferPtr ret; xmlURIPtr puri; int i = 0; void *context = NULL; char *unescaped = NULL; #ifdef HAVE_ZLIB_H int is_file_uri = 1; #endif if (xmlOutputCallbackInitialized == 0) xmlRegisterDefaultOutputCallbacks(); if (URI == NULL) return(NULL); puri = xmlParseURI(URI); if (puri != NULL) { #ifdef HAVE_ZLIB_H if ((puri->scheme != NULL) && (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file"))) is_file_uri = 0; #endif /* * try to limit the damages of the URI unescaping code. */ if ((puri->scheme == NULL) || (xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file"))) unescaped = xmlURIUnescapeString(URI, 0, NULL); xmlFreeURI(puri); } /* * Try to find one of the output accept method accepting that scheme * Go in reverse to give precedence to user defined handlers. * try with an unescaped version of the URI */ if (unescaped != NULL) { #ifdef HAVE_ZLIB_H if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { context = xmlGzfileOpenW(unescaped, compression); if (context != NULL) { ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { ret->context = context; ret->writecallback = xmlGzfileWrite; ret->closecallback = xmlGzfileClose; } xmlFree(unescaped); return(ret); } } #endif for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { if ((xmlOutputCallbackTable[i].matchcallback != NULL) && (xmlOutputCallbackTable[i].matchcallback(unescaped) != 0)) { #if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) /* Need to pass compression parameter into HTTP open calls */ if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) context = xmlIOHTTPOpenW(unescaped, compression); else #endif context = xmlOutputCallbackTable[i].opencallback(unescaped); if (context != NULL) break; } } xmlFree(unescaped); } /* * If this failed try with a non-escaped URI this may be a strange * filename */ if (context == NULL) { #ifdef HAVE_ZLIB_H if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { context = xmlGzfileOpenW(URI, compression); if (context != NULL) { ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { ret->context = context; ret->writecallback = xmlGzfileWrite; ret->closecallback = xmlGzfileClose; } return(ret); } } #endif for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { if ((xmlOutputCallbackTable[i].matchcallback != NULL) && (xmlOutputCallbackTable[i].matchcallback(URI) != 0)) { #if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) /* Need to pass compression parameter into HTTP open calls */ if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) context = xmlIOHTTPOpenW(URI, compression); else #endif context = xmlOutputCallbackTable[i].opencallback(URI); if (context != NULL) break; } } } if (context == NULL) { return(NULL); } /* * Allocate the Output buffer front-end. */ ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { ret->context = context; ret->writecallback = xmlOutputCallbackTable[i].writecallback; ret->closecallback = xmlOutputCallbackTable[i].closecallback; } return(ret); } /** * xmlOutputBufferCreateFilename: * @URI: a C string containing the URI or filename * @encoder: the encoding converter or NULL * @compression: the compression ration (0 none, 9 max). * * Create a buffered output for the progressive saving of a file * If filename is "-' then we use stdout as the output. * Automatic support for ZLIB/Compress compressed document is provided * by default if found at compile-time. * TODO: currently if compression is set, the library only support * writing to a local file. * * Returns the new output or NULL */ xmlOutputBufferPtr xmlOutputBufferCreateFilename(const char *URI, xmlCharEncodingHandlerPtr encoder, int compression ATTRIBUTE_UNUSED) { if ((xmlOutputBufferCreateFilenameValue)) { return xmlOutputBufferCreateFilenameValue(URI, encoder, compression); } return __xmlOutputBufferCreateFilename(URI, encoder, compression); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlParserInputBufferCreateFile: * @file: a FILE* * @enc: the charset encoding if known * * Create a buffered parser input for the progressive parsing of a FILE * * buffered C I/O * * Returns the new parser input or NULL */ xmlParserInputBufferPtr xmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; if (xmlInputCallbackInitialized == 0) xmlRegisterDefaultInputCallbacks(); if (file == NULL) return(NULL); ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { ret->context = file; ret->readcallback = xmlFileRead; ret->closecallback = xmlFileFlush; } return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlOutputBufferCreateFile: * @file: a FILE* * @encoder: the encoding converter or NULL * * Create a buffered output for the progressive saving to a FILE * * buffered C I/O * * Returns the new parser output or NULL */ xmlOutputBufferPtr xmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) { xmlOutputBufferPtr ret; if (xmlOutputCallbackInitialized == 0) xmlRegisterDefaultOutputCallbacks(); if (file == NULL) return(NULL); ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { ret->context = file; ret->writecallback = xmlFileWrite; ret->closecallback = xmlFileFlush; } return(ret); } /** * xmlOutputBufferCreateBuffer: * @buffer: a xmlBufferPtr * @encoder: the encoding converter or NULL * * Create a buffered output for the progressive saving to a xmlBuffer * * Returns the new parser output or NULL */ xmlOutputBufferPtr xmlOutputBufferCreateBuffer(xmlBufferPtr buffer, xmlCharEncodingHandlerPtr encoder) { xmlOutputBufferPtr ret; if (buffer == NULL) return(NULL); ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback) xmlBufferWrite, (xmlOutputCloseCallback) NULL, (void *) buffer, encoder); return(ret); } /** * xmlOutputBufferGetContent: * @out: an xmlOutputBufferPtr * * Gives a pointer to the data currently held in the output buffer * * Returns a pointer to the data or NULL in case of error */ const xmlChar * xmlOutputBufferGetContent(xmlOutputBufferPtr out) { if ((out == NULL) || (out->buffer == NULL)) return(NULL); return(xmlBufContent(out->buffer)); } /** * xmlOutputBufferGetSize: * @out: an xmlOutputBufferPtr * * Gives the length of the data currently held in the output buffer * * Returns 0 in case or error or no data is held, the size otherwise */ size_t xmlOutputBufferGetSize(xmlOutputBufferPtr out) { if ((out == NULL) || (out->buffer == NULL)) return(0); return(xmlBufUse(out->buffer)); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlParserInputBufferCreateFd: * @fd: a file descriptor number * @enc: the charset encoding if known * * Create a buffered parser input for the progressive parsing for the input * from a file descriptor * * Returns the new parser input or NULL */ xmlParserInputBufferPtr xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; if (fd < 0) return(NULL); ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { ret->context = (void *) (long) fd; ret->readcallback = xmlFdRead; ret->closecallback = xmlFdClose; } return(ret); } /** * xmlParserInputBufferCreateMem: * @mem: the memory input * @size: the length of the memory block * @enc: the charset encoding if known * * Create a buffered parser input for the progressive parsing for the input * from a memory area. * * Returns the new parser input or NULL */ xmlParserInputBufferPtr xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; int errcode; if (size <= 0) return(NULL); if (mem == NULL) return(NULL); ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { ret->context = (void *) mem; ret->readcallback = (xmlInputReadCallback) xmlNop; ret->closecallback = NULL; errcode = xmlBufAdd(ret->buffer, (const xmlChar *) mem, size); if (errcode != 0) { xmlFree(ret); return(NULL); } } return(ret); } /** * xmlParserInputBufferCreateStatic: * @mem: the memory input * @size: the length of the memory block * @enc: the charset encoding if known * * Create a buffered parser input for the progressive parsing for the input * from an immutable memory area. This will not copy the memory area to * the buffer, but the memory is expected to be available until the end of * the parsing, this is useful for example when using mmap'ed file. * * Returns the new parser input or NULL */ xmlParserInputBufferPtr xmlParserInputBufferCreateStatic(const char *mem, int size, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; if (size <= 0) return(NULL); if (mem == NULL) return(NULL); ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); if (ret == NULL) { xmlIOErrMemory("creating input buffer"); return(NULL); } memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); ret->buffer = xmlBufCreateStatic((void *)mem, (size_t) size); if (ret->buffer == NULL) { xmlFree(ret); return(NULL); } ret->encoder = xmlGetCharEncodingHandler(enc); if (ret->encoder != NULL) ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize); else ret->raw = NULL; ret->compressed = -1; ret->context = (void *) mem; ret->readcallback = NULL; ret->closecallback = NULL; return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlOutputBufferCreateFd: * @fd: a file descriptor number * @encoder: the encoding converter or NULL * * Create a buffered output for the progressive saving * to a file descriptor * * Returns the new parser output or NULL */ xmlOutputBufferPtr xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) { xmlOutputBufferPtr ret; if (fd < 0) return(NULL); ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { ret->context = (void *) (long) fd; ret->writecallback = xmlFdWrite; ret->closecallback = NULL; } return(ret); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlParserInputBufferCreateIO: * @ioread: an I/O read function * @ioclose: an I/O close function * @ioctx: an I/O handler * @enc: the charset encoding if known * * Create a buffered parser input for the progressive parsing for the input * from an I/O handler * * Returns the new parser input or NULL */ xmlParserInputBufferPtr xmlParserInputBufferCreateIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; if (ioread == NULL) return(NULL); ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { ret->context = (void *) ioctx; ret->readcallback = ioread; ret->closecallback = ioclose; } return(ret); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlOutputBufferCreateIO: * @iowrite: an I/O write function * @ioclose: an I/O close function * @ioctx: an I/O handler * @encoder: the charset encoding if known * * Create a buffered output for the progressive saving * to an I/O handler * * Returns the new parser output or NULL */ xmlOutputBufferPtr xmlOutputBufferCreateIO(xmlOutputWriteCallback iowrite, xmlOutputCloseCallback ioclose, void *ioctx, xmlCharEncodingHandlerPtr encoder) { xmlOutputBufferPtr ret; if (iowrite == NULL) return(NULL); ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { ret->context = (void *) ioctx; ret->writecallback = iowrite; ret->closecallback = ioclose; } return(ret); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlParserInputBufferCreateFilenameDefault: * @func: function pointer to the new ParserInputBufferCreateFilenameFunc * * Registers a callback for URI input file handling * * Returns the old value of the registration function */ xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) { xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue; if (old == NULL) { old = __xmlParserInputBufferCreateFilename; } xmlParserInputBufferCreateFilenameValue = func; return(old); } /** * xmlOutputBufferCreateFilenameDefault: * @func: function pointer to the new OutputBufferCreateFilenameFunc * * Registers a callback for URI output file handling * * Returns the old value of the registration function */ xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) { xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue; #ifdef LIBXML_OUTPUT_ENABLED if (old == NULL) { old = __xmlOutputBufferCreateFilename; } #endif xmlOutputBufferCreateFilenameValue = func; return(old); } /** * xmlParserInputBufferPush: * @in: a buffered parser input * @len: the size in bytes of the array. * @buf: an char array * * Push the content of the arry in the input buffer * This routine handle the I18N transcoding to internal UTF-8 * This is used when operating the parser in progressive (push) mode. * * Returns the number of chars read and stored in the buffer, or -1 * in case of error. */ int xmlParserInputBufferPush(xmlParserInputBufferPtr in, int len, const char *buf) { int nbchars = 0; int ret; if (len < 0) return(0); if ((in == NULL) || (in->error)) return(-1); if (in->encoder != NULL) { unsigned int use; /* * Store the data in the incoming raw buffer */ if (in->raw == NULL) { in->raw = xmlBufCreate(); } ret = xmlBufAdd(in->raw, (const xmlChar *) buf, len); if (ret != 0) return(-1); /* * convert as much as possible to the parser reading buffer. */ use = xmlBufUse(in->raw); nbchars = xmlCharEncInput(in, 1); if (nbchars < 0) { xmlIOErr(XML_IO_ENCODER, NULL); in->error = XML_IO_ENCODER; return(-1); } in->rawconsumed += (use - xmlBufUse(in->raw)); } else { nbchars = len; ret = xmlBufAdd(in->buffer, (xmlChar *) buf, nbchars); if (ret != 0) return(-1); } #ifdef DEBUG_INPUT xmlGenericError(xmlGenericErrorContext, "I/O: pushed %d chars, buffer %d/%d\n", nbchars, xmlBufUse(in->buffer), xmlBufLength(in->buffer)); #endif return(nbchars); } /** * endOfInput: * * When reading from an Input channel indicated end of file or error * don't reread from it again. */ static int endOfInput (void * context ATTRIBUTE_UNUSED, char * buffer ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) { return(0); } /** * xmlParserInputBufferGrow: * @in: a buffered parser input * @len: indicative value of the amount of chars to read * * Grow up the content of the input buffer, the old data are preserved * This routine handle the I18N transcoding to internal UTF-8 * This routine is used when operating the parser in normal (pull) mode * * TODO: one should be able to remove one extra copy by copying directly * onto in->buffer or in->raw * * Returns the number of chars read and stored in the buffer, or -1 * in case of error. */ int xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { char *buffer = NULL; int res = 0; int nbchars = 0; if ((in == NULL) || (in->error)) return(-1); if ((len <= MINLEN) && (len != 4)) len = MINLEN; if (xmlBufAvail(in->buffer) <= 0) { xmlIOErr(XML_IO_BUFFER_FULL, NULL); in->error = XML_IO_BUFFER_FULL; return(-1); } if (xmlBufGrow(in->buffer, len + 1) < 0) { xmlIOErrMemory("growing input buffer"); in->error = XML_ERR_NO_MEMORY; return(-1); } buffer = (char *)xmlBufEnd(in->buffer); /* * Call the read method for this I/O type. */ if (in->readcallback != NULL) { res = in->readcallback(in->context, &buffer[0], len); if (res <= 0) in->readcallback = endOfInput; } else { xmlIOErr(XML_IO_NO_INPUT, NULL); in->error = XML_IO_NO_INPUT; return(-1); } if (res < 0) { return(-1); } len = res; if (in->encoder != NULL) { unsigned int use; /* * Store the data in the incoming raw buffer */ if (in->raw == NULL) { in->raw = xmlBufCreate(); } res = xmlBufAdd(in->raw, (const xmlChar *) buffer, len); if (res != 0) return(-1); /* * convert as much as possible to the parser reading buffer. */ use = xmlBufUse(in->raw); nbchars = xmlCharEncInput(in, 1); if (nbchars < 0) { xmlIOErr(XML_IO_ENCODER, NULL); in->error = XML_IO_ENCODER; return(-1); } in->rawconsumed += (use - xmlBufUse(in->raw)); } else { nbchars = len; xmlBufAddLen(in->buffer, nbchars); } #ifdef DEBUG_INPUT xmlGenericError(xmlGenericErrorContext, "I/O: read %d chars, buffer %d\n", nbchars, xmlBufUse(in->buffer)); #endif return(nbchars); } /** * xmlParserInputBufferRead: * @in: a buffered parser input * @len: indicative value of the amount of chars to read * * Refresh the content of the input buffer, the old data are considered * consumed * This routine handle the I18N transcoding to internal UTF-8 * * Returns the number of chars read and stored in the buffer, or -1 * in case of error. */ int xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) { if ((in == NULL) || (in->error)) return(-1); if (in->readcallback != NULL) return(xmlParserInputBufferGrow(in, len)); else if (xmlBufGetAllocationScheme(in->buffer) == XML_BUFFER_ALLOC_IMMUTABLE) return(0); else return(-1); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlOutputBufferWrite: * @out: a buffered parser output * @len: the size in bytes of the array. * @buf: an char array * * Write the content of the array in the output I/O buffer * This routine handle the I18N transcoding from internal UTF-8 * The buffer is lossless, i.e. will store in case of partial * or delayed writes. * * Returns the number of chars immediately written, or -1 * in case of error. */ int xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) { int nbchars = 0; /* number of chars to output to I/O */ int ret; /* return from function call */ int written = 0; /* number of char written to I/O so far */ int chunk; /* number of byte curreent processed from buf */ if ((out == NULL) || (out->error)) return(-1); if (len < 0) return(0); if (out->error) return(-1); do { chunk = len; if (chunk > 4 * MINLEN) chunk = 4 * MINLEN; /* * first handle encoding stuff. */ if (out->encoder != NULL) { /* * Store the data in the incoming raw buffer */ if (out->conv == NULL) { out->conv = xmlBufCreate(); } ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk); if (ret != 0) return(-1); if ((xmlBufUse(out->buffer) < MINLEN) && (chunk == len)) goto done; /* * convert as much as possible to the parser reading buffer. */ ret = xmlCharEncOutput(out, 0); if ((ret < 0) && (ret != -3)) { xmlIOErr(XML_IO_ENCODER, NULL); out->error = XML_IO_ENCODER; return(-1); } nbchars = xmlBufUse(out->conv); } else { ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk); if (ret != 0) return(-1); nbchars = xmlBufUse(out->buffer); } buf += chunk; len -= chunk; if ((nbchars < MINLEN) && (len <= 0)) goto done; if (out->writecallback) { /* * second write the stuff to the I/O channel */ if (out->encoder != NULL) { ret = out->writecallback(out->context, (const char *)xmlBufContent(out->conv), nbchars); if (ret >= 0) xmlBufShrink(out->conv, ret); } else { ret = out->writecallback(out->context, (const char *)xmlBufContent(out->buffer), nbchars); if (ret >= 0) xmlBufShrink(out->buffer, ret); } if (ret < 0) { xmlIOErr(XML_IO_WRITE, NULL); out->error = XML_IO_WRITE; return(ret); } out->written += ret; } written += nbchars; } while (len > 0); done: #ifdef DEBUG_INPUT xmlGenericError(xmlGenericErrorContext, "I/O: wrote %d chars\n", written); #endif return(written); } /** * xmlEscapeContent: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of unescaped UTF-8 bytes * @inlen: the length of @in * * Take a block of UTF-8 chars in and escape them. * Returns 0 if success, or -1 otherwise * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ static int xmlEscapeContent(unsigned char* out, int *outlen, const xmlChar* in, int *inlen) { unsigned char* outstart = out; const unsigned char* base = in; unsigned char* outend = out + *outlen; const unsigned char* inend; inend = in + (*inlen); while ((in < inend) && (out < outend)) { if (*in == '<') { if (outend - out < 4) break; *out++ = '&'; *out++ = 'l'; *out++ = 't'; *out++ = ';'; } else if (*in == '>') { if (outend - out < 4) break; *out++ = '&'; *out++ = 'g'; *out++ = 't'; *out++ = ';'; } else if (*in == '&') { if (outend - out < 5) break; *out++ = '&'; *out++ = 'a'; *out++ = 'm'; *out++ = 'p'; *out++ = ';'; } else if (*in == '\r') { if (outend - out < 5) break; *out++ = '&'; *out++ = '#'; *out++ = '1'; *out++ = '3'; *out++ = ';'; } else { *out++ = (unsigned char) *in; } ++in; } *outlen = out - outstart; *inlen = in - base; return(0); } /** * xmlOutputBufferWriteEscape: * @out: a buffered parser output * @str: a zero terminated UTF-8 string * @escaping: an optional escaping function (or NULL) * * Write the content of the string in the output I/O buffer * This routine escapes the caracters and then handle the I18N * transcoding from internal UTF-8 * The buffer is lossless, i.e. will store in case of partial * or delayed writes. * * Returns the number of chars immediately written, or -1 * in case of error. */ int xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, xmlCharEncodingOutputFunc escaping) { int nbchars = 0; /* number of chars to output to I/O */ int ret; /* return from function call */ int written = 0; /* number of char written to I/O so far */ int oldwritten=0;/* loop guard */ int chunk; /* number of byte currently processed from str */ int len; /* number of bytes in str */ int cons; /* byte from str consumed */ if ((out == NULL) || (out->error) || (str == NULL) || (out->buffer == NULL) || (xmlBufGetAllocationScheme(out->buffer) == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1); len = strlen((const char *)str); if (len < 0) return(0); if (out->error) return(-1); if (escaping == NULL) escaping = xmlEscapeContent; do { oldwritten = written; /* * how many bytes to consume and how many bytes to store. */ cons = len; chunk = xmlBufAvail(out->buffer) - 1; /* * make sure we have enough room to save first, if this is * not the case force a flush, but make sure we stay in the loop */ if (chunk < 40) { if (xmlBufGrow(out->buffer, 100) < 0) return(-1); oldwritten = -1; continue; } /* * first handle encoding stuff. */ if (out->encoder != NULL) { /* * Store the data in the incoming raw buffer */ if (out->conv == NULL) { out->conv = xmlBufCreate(); } ret = escaping(xmlBufEnd(out->buffer) , &chunk, str, &cons); if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ return(-1); xmlBufAddLen(out->buffer, chunk); if ((xmlBufUse(out->buffer) < MINLEN) && (cons == len)) goto done; /* * convert as much as possible to the output buffer. */ ret = xmlCharEncOutput(out, 0); if ((ret < 0) && (ret != -3)) { xmlIOErr(XML_IO_ENCODER, NULL); out->error = XML_IO_ENCODER; return(-1); } nbchars = xmlBufUse(out->conv); } else { ret = escaping(xmlBufEnd(out->buffer), &chunk, str, &cons); if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ return(-1); xmlBufAddLen(out->buffer, chunk); nbchars = xmlBufUse(out->buffer); } str += cons; len -= cons; if ((nbchars < MINLEN) && (len <= 0)) goto done; if (out->writecallback) { /* * second write the stuff to the I/O channel */ if (out->encoder != NULL) { ret = out->writecallback(out->context, (const char *)xmlBufContent(out->conv), nbchars); if (ret >= 0) xmlBufShrink(out->conv, ret); } else { ret = out->writecallback(out->context, (const char *)xmlBufContent(out->buffer), nbchars); if (ret >= 0) xmlBufShrink(out->buffer, ret); } if (ret < 0) { xmlIOErr(XML_IO_WRITE, NULL); out->error = XML_IO_WRITE; return(ret); } out->written += ret; } else if (xmlBufAvail(out->buffer) < MINLEN) { xmlBufGrow(out->buffer, MINLEN); } written += nbchars; } while ((len > 0) && (oldwritten != written)); done: #ifdef DEBUG_INPUT xmlGenericError(xmlGenericErrorContext, "I/O: wrote %d chars\n", written); #endif return(written); } /** * xmlOutputBufferWriteString: * @out: a buffered parser output * @str: a zero terminated C string * * Write the content of the string in the output I/O buffer * This routine handle the I18N transcoding from internal UTF-8 * The buffer is lossless, i.e. will store in case of partial * or delayed writes. * * Returns the number of chars immediately written, or -1 * in case of error. */ int xmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) { int len; if ((out == NULL) || (out->error)) return(-1); if (str == NULL) return(-1); len = strlen(str); if (len > 0) return(xmlOutputBufferWrite(out, len, str)); return(len); } /** * xmlOutputBufferFlush: * @out: a buffered output * * flushes the output I/O channel * * Returns the number of byte written or -1 in case of error. */ int xmlOutputBufferFlush(xmlOutputBufferPtr out) { int nbchars = 0, ret = 0; if ((out == NULL) || (out->error)) return(-1); /* * first handle encoding stuff. */ if ((out->conv != NULL) && (out->encoder != NULL)) { /* * convert as much as possible to the parser output buffer. */ do { nbchars = xmlCharEncOutput(out, 0); if (nbchars < 0) { xmlIOErr(XML_IO_ENCODER, NULL); out->error = XML_IO_ENCODER; return(-1); } } while (nbchars); } /* * second flush the stuff to the I/O channel */ if ((out->conv != NULL) && (out->encoder != NULL) && (out->writecallback != NULL)) { ret = out->writecallback(out->context, (const char *)xmlBufContent(out->conv), xmlBufUse(out->conv)); if (ret >= 0) xmlBufShrink(out->conv, ret); } else if (out->writecallback != NULL) { ret = out->writecallback(out->context, (const char *)xmlBufContent(out->buffer), xmlBufUse(out->buffer)); if (ret >= 0) xmlBufShrink(out->buffer, ret); } if (ret < 0) { xmlIOErr(XML_IO_FLUSH, NULL); out->error = XML_IO_FLUSH; return(ret); } out->written += ret; #ifdef DEBUG_INPUT xmlGenericError(xmlGenericErrorContext, "I/O: flushed %d chars\n", ret); #endif return(ret); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlParserGetDirectory: * @filename: the path to a file * * lookup the directory for that file * * Returns a new allocated string containing the directory, or NULL. */ char * xmlParserGetDirectory(const char *filename) { char *ret = NULL; char dir[1024]; char *cur; #ifdef _WIN32_WCE /* easy way by now ... wince does not have dirs! */ return NULL; #endif if (xmlInputCallbackInitialized == 0) xmlRegisterDefaultInputCallbacks(); if (filename == NULL) return(NULL); #if defined(WIN32) && !defined(__CYGWIN__) # define IS_XMLPGD_SEP(ch) ((ch=='/')||(ch=='\\')) #else # define IS_XMLPGD_SEP(ch) (ch=='/') #endif strncpy(dir, filename, 1023); dir[1023] = 0; cur = &dir[strlen(dir)]; while (cur > dir) { if (IS_XMLPGD_SEP(*cur)) break; cur --; } if (IS_XMLPGD_SEP(*cur)) { if (cur == dir) dir[1] = 0; else *cur = 0; ret = xmlMemStrdup(dir); } else { if (getcwd(dir, 1024) != NULL) { dir[1023] = 0; ret = xmlMemStrdup(dir); } } return(ret); #undef IS_XMLPGD_SEP } /**************************************************************** * * * External entities loading * * * ****************************************************************/ /** * xmlCheckHTTPInput: * @ctxt: an XML parser context * @ret: an XML parser input * * Check an input in case it was created from an HTTP stream, in that * case it will handle encoding and update of the base URL in case of * redirection. It also checks for HTTP errors in which case the input * is cleanly freed up and an appropriate error is raised in context * * Returns the input or NULL in case of HTTP error. */ xmlParserInputPtr xmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) { #ifdef LIBXML_HTTP_ENABLED if ((ret != NULL) && (ret->buf != NULL) && (ret->buf->readcallback == xmlIOHTTPRead) && (ret->buf->context != NULL)) { const char *encoding; const char *redir; const char *mime; int code; code = xmlNanoHTTPReturnCode(ret->buf->context); if (code >= 400) { /* fatal error */ if (ret->filename != NULL) __xmlLoaderErr(ctxt, "failed to load HTTP resource \"%s\"\n", (const char *) ret->filename); else __xmlLoaderErr(ctxt, "failed to load HTTP resource\n", NULL); xmlFreeInputStream(ret); ret = NULL; } else { mime = xmlNanoHTTPMimeType(ret->buf->context); if ((xmlStrstr(BAD_CAST mime, BAD_CAST "/xml")) || (xmlStrstr(BAD_CAST mime, BAD_CAST "+xml"))) { encoding = xmlNanoHTTPEncoding(ret->buf->context); if (encoding != NULL) { xmlCharEncodingHandlerPtr handler; handler = xmlFindCharEncodingHandler(encoding); if (handler != NULL) { xmlSwitchInputEncoding(ctxt, ret, handler); } else { __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING, "Unknown encoding %s", BAD_CAST encoding, NULL); } if (ret->encoding == NULL) ret->encoding = xmlStrdup(BAD_CAST encoding); } #if 0 } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) { #endif } redir = xmlNanoHTTPRedir(ret->buf->context); if (redir != NULL) { if (ret->filename != NULL) xmlFree((xmlChar *) ret->filename); if (ret->directory != NULL) { xmlFree((xmlChar *) ret->directory); ret->directory = NULL; } ret->filename = (char *) xmlStrdup((const xmlChar *) redir); } } } #endif return(ret); } static int xmlNoNetExists(const char *URL) { const char *path; if (URL == NULL) return(0); if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file://localhost/", 17)) #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &URL[17]; #else path = &URL[16]; #endif else if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file:///", 8)) { #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) path = &URL[8]; #else path = &URL[7]; #endif } else path = URL; return xmlCheckFilename(path); } #ifdef LIBXML_CATALOG_ENABLED /** * xmlResolveResourceFromCatalog: * @URL: the URL for the entity to load * @ID: the System ID for the entity to load * @ctxt: the context in which the entity is called or NULL * * Resolves the URL and ID against the appropriate catalog. * This function is used by xmlDefaultExternalEntityLoader and * xmlNoNetExternalEntityLoader. * * Returns a new allocated URL, or NULL. */ static xmlChar * xmlResolveResourceFromCatalog(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { xmlChar *resource = NULL; xmlCatalogAllow pref; /* * If the resource doesn't exists as a file, * try to load it from the resource pointed in the catalogs */ pref = xmlCatalogGetDefaults(); if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) { /* * Do a local lookup */ if ((ctxt != NULL) && (ctxt->catalogs != NULL) && ((pref == XML_CATA_ALLOW_ALL) || (pref == XML_CATA_ALLOW_DOCUMENT))) { resource = xmlCatalogLocalResolve(ctxt->catalogs, (const xmlChar *)ID, (const xmlChar *)URL); } /* * Try a global lookup */ if ((resource == NULL) && ((pref == XML_CATA_ALLOW_ALL) || (pref == XML_CATA_ALLOW_GLOBAL))) { resource = xmlCatalogResolve((const xmlChar *)ID, (const xmlChar *)URL); } if ((resource == NULL) && (URL != NULL)) resource = xmlStrdup((const xmlChar *) URL); /* * TODO: do an URI lookup on the reference */ if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) { xmlChar *tmp = NULL; if ((ctxt != NULL) && (ctxt->catalogs != NULL) && ((pref == XML_CATA_ALLOW_ALL) || (pref == XML_CATA_ALLOW_DOCUMENT))) { tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource); } if ((tmp == NULL) && ((pref == XML_CATA_ALLOW_ALL) || (pref == XML_CATA_ALLOW_GLOBAL))) { tmp = xmlCatalogResolveURI(resource); } if (tmp != NULL) { xmlFree(resource); resource = tmp; } } } return resource; } #endif /** * xmlDefaultExternalEntityLoader: * @URL: the URL for the entity to load * @ID: the System ID for the entity to load * @ctxt: the context in which the entity is called or NULL * * By default we don't load external entitites, yet. * * Returns a new allocated xmlParserInputPtr, or NULL. */ static xmlParserInputPtr xmlDefaultExternalEntityLoader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { xmlParserInputPtr ret = NULL; xmlChar *resource = NULL; #ifdef DEBUG_EXTERNAL_ENTITIES xmlGenericError(xmlGenericErrorContext, "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL); #endif if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) { int options = ctxt->options; ctxt->options -= XML_PARSE_NONET; ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); ctxt->options = options; return(ret); } #ifdef LIBXML_CATALOG_ENABLED resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); #endif if (resource == NULL) resource = (xmlChar *) URL; if (resource == NULL) { if (ID == NULL) ID = "NULL"; __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", ID); return (NULL); } ret = xmlNewInputFromFile(ctxt, (const char *) resource); if ((resource != NULL) && (resource != (xmlChar *) URL)) xmlFree(resource); return (ret); } static xmlExternalEntityLoader xmlCurrentExternalEntityLoader = xmlDefaultExternalEntityLoader; /** * xmlSetExternalEntityLoader: * @f: the new entity resolver function * * Changes the defaultexternal entity resolver function for the application */ void xmlSetExternalEntityLoader(xmlExternalEntityLoader f) { xmlCurrentExternalEntityLoader = f; } /** * xmlGetExternalEntityLoader: * * Get the default external entity resolver function for the application * * Returns the xmlExternalEntityLoader function pointer */ xmlExternalEntityLoader xmlGetExternalEntityLoader(void) { return(xmlCurrentExternalEntityLoader); } /** * xmlLoadExternalEntity: * @URL: the URL for the entity to load * @ID: the Public ID for the entity to load * @ctxt: the context in which the entity is called or NULL * * Load an external entity, note that the use of this function for * unparsed entities may generate problems * * Returns the xmlParserInputPtr or NULL */ xmlParserInputPtr xmlLoadExternalEntity(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { if ((URL != NULL) && (xmlNoNetExists(URL) == 0)) { char *canonicFilename; xmlParserInputPtr ret; canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL); if (canonicFilename == NULL) { xmlIOErrMemory("building canonical path\n"); return(NULL); } ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt); xmlFree(canonicFilename); return(ret); } return(xmlCurrentExternalEntityLoader(URL, ID, ctxt)); } /************************************************************************ * * * Disabling Network access * * * ************************************************************************/ /** * xmlNoNetExternalEntityLoader: * @URL: the URL for the entity to load * @ID: the System ID for the entity to load * @ctxt: the context in which the entity is called or NULL * * A specific entity loader disabling network accesses, though still * allowing local catalog accesses for resolution. * * Returns a new allocated xmlParserInputPtr, or NULL. */ xmlParserInputPtr xmlNoNetExternalEntityLoader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { xmlParserInputPtr input = NULL; xmlChar *resource = NULL; #ifdef LIBXML_CATALOG_ENABLED resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); #endif if (resource == NULL) resource = (xmlChar *) URL; if (resource != NULL) { if ((!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "ftp://", 6)) || (!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "http://", 7))) { xmlIOErr(XML_IO_NETWORK_ATTEMPT, (const char *) resource); if (resource != (xmlChar *) URL) xmlFree(resource); return(NULL); } } input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt); if (resource != (xmlChar *) URL) xmlFree(resource); return(input); } #define bottom_xmlIO #include "elfgcchack.h" libxml2-2.9.1+dfsg1/schematron.c0000644000175000017500000013603412113312343015063 0ustar aronaron/* * schematron.c : implementation of the Schematron schema validity checking * * See Copyright for the status of this software. * * Daniel Veillard */ /* * TODO: * + double check the semantic, especially * - multiple rules applying in a single pattern/node * - the semantic of libxml2 patterns vs. XSLT production referenced * by the spec. * + export of results in SVRL * + full parsing and coverage of the spec, conformance of the input to the * spec * + divergences between the draft and the ISO proposed standard :-( * + hook and test include * + try and compare with the XSLT version */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_SCHEMATRON_ENABLED #include #include #include #include #include #include #include #include #define SCHEMATRON_PARSE_OPTIONS XML_PARSE_NOENT #define SCT_OLD_NS BAD_CAST "http://www.ascc.net/xml/schematron" #define XML_SCHEMATRON_NS BAD_CAST "http://purl.oclc.org/dsdl/schematron" static const xmlChar *xmlSchematronNs = XML_SCHEMATRON_NS; static const xmlChar *xmlOldSchematronNs = SCT_OLD_NS; #define IS_SCHEMATRON(node, elem) \ ((node != NULL) && (node->type == XML_ELEMENT_NODE ) && \ (node->ns != NULL) && \ (xmlStrEqual(node->name, (const xmlChar *) elem)) && \ ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) #define NEXT_SCHEMATRON(node) \ while (node != NULL) { \ if ((node->type == XML_ELEMENT_NODE ) && (node->ns != NULL) && \ ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) \ break; \ node = node->next; \ } /** * TODO: * * macro to flag unimplemented blocks */ #define TODO \ xmlGenericError(xmlGenericErrorContext, \ "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); typedef enum { XML_SCHEMATRON_ASSERT=1, XML_SCHEMATRON_REPORT=2 } xmlSchematronTestType; /** * _xmlSchematronTest: * * A Schematrons test, either an assert or a report */ typedef struct _xmlSchematronTest xmlSchematronTest; typedef xmlSchematronTest *xmlSchematronTestPtr; struct _xmlSchematronTest { xmlSchematronTestPtr next; /* the next test in the list */ xmlSchematronTestType type; /* the test type */ xmlNodePtr node; /* the node in the tree */ xmlChar *test; /* the expression to test */ xmlXPathCompExprPtr comp; /* the compiled expression */ xmlChar *report; /* the message to report */ }; /** * _xmlSchematronRule: * * A Schematrons rule */ typedef struct _xmlSchematronRule xmlSchematronRule; typedef xmlSchematronRule *xmlSchematronRulePtr; struct _xmlSchematronRule { xmlSchematronRulePtr next; /* the next rule in the list */ xmlSchematronRulePtr patnext;/* the next rule in the pattern list */ xmlNodePtr node; /* the node in the tree */ xmlChar *context; /* the context evaluation rule */ xmlSchematronTestPtr tests; /* the list of tests */ xmlPatternPtr pattern; /* the compiled pattern associated */ xmlChar *report; /* the message to report */ }; /** * _xmlSchematronPattern: * * A Schematrons pattern */ typedef struct _xmlSchematronPattern xmlSchematronPattern; typedef xmlSchematronPattern *xmlSchematronPatternPtr; struct _xmlSchematronPattern { xmlSchematronPatternPtr next;/* the next pattern in the list */ xmlSchematronRulePtr rules; /* the list of rules */ xmlChar *name; /* the name of the pattern */ }; /** * _xmlSchematron: * * A Schematrons definition */ struct _xmlSchematron { const xmlChar *name; /* schema name */ int preserve; /* was the document passed by the user */ xmlDocPtr doc; /* pointer to the parsed document */ int flags; /* specific to this schematron */ void *_private; /* unused by the library */ xmlDictPtr dict; /* the dictionnary used internally */ const xmlChar *title; /* the title if any */ int nbNs; /* the number of namespaces */ int nbPattern; /* the number of patterns */ xmlSchematronPatternPtr patterns;/* the patterns found */ xmlSchematronRulePtr rules; /* the rules gathered */ int nbNamespaces; /* number of namespaces in the array */ int maxNamespaces; /* size of the array */ const xmlChar **namespaces; /* the array of namespaces */ }; /** * xmlSchematronValidCtxt: * * A Schematrons validation context */ struct _xmlSchematronValidCtxt { int type; int flags; /* an or of xmlSchematronValidOptions */ xmlDictPtr dict; int nberrors; int err; xmlSchematronPtr schema; xmlXPathContextPtr xctxt; FILE *outputFile; /* if using XML_SCHEMATRON_OUT_FILE */ xmlBufferPtr outputBuffer; /* if using XML_SCHEMATRON_OUT_BUFFER */ xmlOutputWriteCallback iowrite; /* if using XML_SCHEMATRON_OUT_IO */ xmlOutputCloseCallback ioclose; void *ioctx; /* error reporting data */ void *userData; /* user specific data block */ xmlSchematronValidityErrorFunc error;/* the callback in case of errors */ xmlSchematronValidityWarningFunc warning;/* callback in case of warning */ xmlStructuredErrorFunc serror; /* the structured function */ }; struct _xmlSchematronParserCtxt { int type; const xmlChar *URL; xmlDocPtr doc; int preserve; /* Whether the doc should be freed */ const char *buffer; int size; xmlDictPtr dict; /* dictionnary for interned string names */ int nberrors; int err; xmlXPathContextPtr xctxt; /* the XPath context used for compilation */ xmlSchematronPtr schema; int nbNamespaces; /* number of namespaces in the array */ int maxNamespaces; /* size of the array */ const xmlChar **namespaces; /* the array of namespaces */ int nbIncludes; /* number of includes in the array */ int maxIncludes; /* size of the array */ xmlNodePtr *includes; /* the array of includes */ /* error reporting data */ void *userData; /* user specific data block */ xmlSchematronValidityErrorFunc error;/* the callback in case of errors */ xmlSchematronValidityWarningFunc warning;/* callback in case of warning */ xmlStructuredErrorFunc serror; /* the structured function */ }; #define XML_STRON_CTXT_PARSER 1 #define XML_STRON_CTXT_VALIDATOR 2 /************************************************************************ * * * Error reporting * * * ************************************************************************/ /** * xmlSchematronPErrMemory: * @node: a context node * @extra: extra informations * * Handle an out of memory condition */ static void xmlSchematronPErrMemory(xmlSchematronParserCtxtPtr ctxt, const char *extra, xmlNodePtr node) { if (ctxt != NULL) ctxt->nberrors++; __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL, extra); } /** * xmlSchematronPErr: * @ctxt: the parsing context * @node: the context node * @error: the error code * @msg: the error message * @str1: extra data * @str2: extra data * * Handle a parser error */ static void xmlSchematronPErr(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr node, int error, const char *msg, const xmlChar * str1, const xmlChar * str2) { xmlGenericErrorFunc channel = NULL; xmlStructuredErrorFunc schannel = NULL; void *data = NULL; if (ctxt != NULL) { ctxt->nberrors++; channel = ctxt->error; data = ctxt->userData; schannel = ctxt->serror; } __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, error, XML_ERR_ERROR, NULL, 0, (const char *) str1, (const char *) str2, NULL, 0, 0, msg, str1, str2); } /** * xmlSchematronVTypeErrMemory: * @node: a context node * @extra: extra informations * * Handle an out of memory condition */ static void xmlSchematronVErrMemory(xmlSchematronValidCtxtPtr ctxt, const char *extra, xmlNodePtr node) { if (ctxt != NULL) { ctxt->nberrors++; ctxt->err = XML_SCHEMAV_INTERNAL; } __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL, extra); } /************************************************************************ * * * Parsing and compilation of the Schematrontrons * * * ************************************************************************/ /** * xmlSchematronAddTest: * @ctxt: the schema parsing context * @type: the type of test * @rule: the parent rule * @node: the node hosting the test * @test: the associated test * @report: the associated report string * * Add a test to a schematron * * Returns the new pointer or NULL in case of error */ static xmlSchematronTestPtr xmlSchematronAddTest(xmlSchematronParserCtxtPtr ctxt, xmlSchematronTestType type, xmlSchematronRulePtr rule, xmlNodePtr node, xmlChar *test, xmlChar *report) { xmlSchematronTestPtr ret; xmlXPathCompExprPtr comp; if ((ctxt == NULL) || (rule == NULL) || (node == NULL) || (test == NULL)) return(NULL); /* * try first to compile the test expression */ comp = xmlXPathCtxtCompile(ctxt->xctxt, test); if (comp == NULL) { xmlSchematronPErr(ctxt, node, XML_SCHEMAP_NOROOT, "Failed to compile test expression %s", test, NULL); return(NULL); } ret = (xmlSchematronTestPtr) xmlMalloc(sizeof(xmlSchematronTest)); if (ret == NULL) { xmlSchematronPErrMemory(ctxt, "allocating schema test", node); return (NULL); } memset(ret, 0, sizeof(xmlSchematronTest)); ret->type = type; ret->node = node; ret->test = test; ret->comp = comp; ret->report = report; ret->next = NULL; if (rule->tests == NULL) { rule->tests = ret; } else { xmlSchematronTestPtr prev = rule->tests; while (prev->next != NULL) prev = prev->next; prev->next = ret; } return (ret); } /** * xmlSchematronFreeTests: * @tests: a list of tests * * Free a list of tests. */ static void xmlSchematronFreeTests(xmlSchematronTestPtr tests) { xmlSchematronTestPtr next; while (tests != NULL) { next = tests->next; if (tests->test != NULL) xmlFree(tests->test); if (tests->comp != NULL) xmlXPathFreeCompExpr(tests->comp); if (tests->report != NULL) xmlFree(tests->report); xmlFree(tests); tests = next; } } /** * xmlSchematronAddRule: * @ctxt: the schema parsing context * @schema: a schema structure * @node: the node hosting the rule * @context: the associated context string * @report: the associated report string * * Add a rule to a schematron * * Returns the new pointer or NULL in case of error */ static xmlSchematronRulePtr xmlSchematronAddRule(xmlSchematronParserCtxtPtr ctxt, xmlSchematronPtr schema, xmlSchematronPatternPtr pat, xmlNodePtr node, xmlChar *context, xmlChar *report) { xmlSchematronRulePtr ret; xmlPatternPtr pattern; if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || (context == NULL)) return(NULL); /* * Try first to compile the pattern */ pattern = xmlPatterncompile(context, ctxt->dict, XML_PATTERN_XPATH, ctxt->namespaces); if (pattern == NULL) { xmlSchematronPErr(ctxt, node, XML_SCHEMAP_NOROOT, "Failed to compile context expression %s", context, NULL); } ret = (xmlSchematronRulePtr) xmlMalloc(sizeof(xmlSchematronRule)); if (ret == NULL) { xmlSchematronPErrMemory(ctxt, "allocating schema rule", node); return (NULL); } memset(ret, 0, sizeof(xmlSchematronRule)); ret->node = node; ret->context = context; ret->pattern = pattern; ret->report = report; ret->next = NULL; if (schema->rules == NULL) { schema->rules = ret; } else { xmlSchematronRulePtr prev = schema->rules; while (prev->next != NULL) prev = prev->next; prev->next = ret; } ret->patnext = NULL; if (pat->rules == NULL) { pat->rules = ret; } else { xmlSchematronRulePtr prev = pat->rules; while (prev->patnext != NULL) prev = prev->patnext; prev->patnext = ret; } return (ret); } /** * xmlSchematronFreeRules: * @rules: a list of rules * * Free a list of rules. */ static void xmlSchematronFreeRules(xmlSchematronRulePtr rules) { xmlSchematronRulePtr next; while (rules != NULL) { next = rules->next; if (rules->tests) xmlSchematronFreeTests(rules->tests); if (rules->context != NULL) xmlFree(rules->context); if (rules->pattern) xmlFreePattern(rules->pattern); if (rules->report != NULL) xmlFree(rules->report); xmlFree(rules); rules = next; } } /** * xmlSchematronAddPattern: * @ctxt: the schema parsing context * @schema: a schema structure * @node: the node hosting the pattern * @id: the id or name of the pattern * * Add a pattern to a schematron * * Returns the new pointer or NULL in case of error */ static xmlSchematronPatternPtr xmlSchematronAddPattern(xmlSchematronParserCtxtPtr ctxt, xmlSchematronPtr schema, xmlNodePtr node, xmlChar *name) { xmlSchematronPatternPtr ret; if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || (name == NULL)) return(NULL); ret = (xmlSchematronPatternPtr) xmlMalloc(sizeof(xmlSchematronPattern)); if (ret == NULL) { xmlSchematronPErrMemory(ctxt, "allocating schema pattern", node); return (NULL); } memset(ret, 0, sizeof(xmlSchematronPattern)); ret->name = name; ret->next = NULL; if (schema->patterns == NULL) { schema->patterns = ret; } else { xmlSchematronPatternPtr prev = schema->patterns; while (prev->next != NULL) prev = prev->next; prev->next = ret; } return (ret); } /** * xmlSchematronFreePatterns: * @patterns: a list of patterns * * Free a list of patterns. */ static void xmlSchematronFreePatterns(xmlSchematronPatternPtr patterns) { xmlSchematronPatternPtr next; while (patterns != NULL) { next = patterns->next; if (patterns->name != NULL) xmlFree(patterns->name); xmlFree(patterns); patterns = next; } } /** * xmlSchematronNewSchematron: * @ctxt: a schema validation context * * Allocate a new Schematron structure. * * Returns the newly allocated structure or NULL in case or error */ static xmlSchematronPtr xmlSchematronNewSchematron(xmlSchematronParserCtxtPtr ctxt) { xmlSchematronPtr ret; ret = (xmlSchematronPtr) xmlMalloc(sizeof(xmlSchematron)); if (ret == NULL) { xmlSchematronPErrMemory(ctxt, "allocating schema", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchematron)); ret->dict = ctxt->dict; xmlDictReference(ret->dict); return (ret); } /** * xmlSchematronFree: * @schema: a schema structure * * Deallocate a Schematron structure. */ void xmlSchematronFree(xmlSchematronPtr schema) { if (schema == NULL) return; if ((schema->doc != NULL) && (!(schema->preserve))) xmlFreeDoc(schema->doc); if (schema->namespaces != NULL) xmlFree((char **) schema->namespaces); xmlSchematronFreeRules(schema->rules); xmlSchematronFreePatterns(schema->patterns); xmlDictFree(schema->dict); xmlFree(schema); } /** * xmlSchematronNewParserCtxt: * @URL: the location of the schema * * Create an XML Schematrons parse context for that file/resource expected * to contain an XML Schematrons file. * * Returns the parser context or NULL in case of error */ xmlSchematronParserCtxtPtr xmlSchematronNewParserCtxt(const char *URL) { xmlSchematronParserCtxtPtr ret; if (URL == NULL) return (NULL); ret = (xmlSchematronParserCtxtPtr) xmlMalloc(sizeof(xmlSchematronParserCtxt)); if (ret == NULL) { xmlSchematronPErrMemory(NULL, "allocating schema parser context", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchematronParserCtxt)); ret->type = XML_STRON_CTXT_PARSER; ret->dict = xmlDictCreate(); ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1); ret->includes = NULL; ret->xctxt = xmlXPathNewContext(NULL); if (ret->xctxt == NULL) { xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", NULL); xmlSchematronFreeParserCtxt(ret); return (NULL); } ret->xctxt->flags = XML_XPATH_CHECKNS; return (ret); } /** * xmlSchematronNewMemParserCtxt: * @buffer: a pointer to a char array containing the schemas * @size: the size of the array * * Create an XML Schematrons parse context for that memory buffer expected * to contain an XML Schematrons file. * * Returns the parser context or NULL in case of error */ xmlSchematronParserCtxtPtr xmlSchematronNewMemParserCtxt(const char *buffer, int size) { xmlSchematronParserCtxtPtr ret; if ((buffer == NULL) || (size <= 0)) return (NULL); ret = (xmlSchematronParserCtxtPtr) xmlMalloc(sizeof(xmlSchematronParserCtxt)); if (ret == NULL) { xmlSchematronPErrMemory(NULL, "allocating schema parser context", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchematronParserCtxt)); ret->buffer = buffer; ret->size = size; ret->dict = xmlDictCreate(); ret->xctxt = xmlXPathNewContext(NULL); if (ret->xctxt == NULL) { xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", NULL); xmlSchematronFreeParserCtxt(ret); return (NULL); } return (ret); } /** * xmlSchematronNewDocParserCtxt: * @doc: a preparsed document tree * * Create an XML Schematrons parse context for that document. * NB. The document may be modified during the parsing process. * * Returns the parser context or NULL in case of error */ xmlSchematronParserCtxtPtr xmlSchematronNewDocParserCtxt(xmlDocPtr doc) { xmlSchematronParserCtxtPtr ret; if (doc == NULL) return (NULL); ret = (xmlSchematronParserCtxtPtr) xmlMalloc(sizeof(xmlSchematronParserCtxt)); if (ret == NULL) { xmlSchematronPErrMemory(NULL, "allocating schema parser context", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchematronParserCtxt)); ret->doc = doc; ret->dict = xmlDictCreate(); /* The application has responsibility for the document */ ret->preserve = 1; ret->xctxt = xmlXPathNewContext(doc); if (ret->xctxt == NULL) { xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", NULL); xmlSchematronFreeParserCtxt(ret); return (NULL); } return (ret); } /** * xmlSchematronFreeParserCtxt: * @ctxt: the schema parser context * * Free the resources associated to the schema parser context */ void xmlSchematronFreeParserCtxt(xmlSchematronParserCtxtPtr ctxt) { if (ctxt == NULL) return; if (ctxt->doc != NULL && !ctxt->preserve) xmlFreeDoc(ctxt->doc); if (ctxt->xctxt != NULL) { xmlXPathFreeContext(ctxt->xctxt); } if (ctxt->namespaces != NULL) xmlFree((char **) ctxt->namespaces); xmlDictFree(ctxt->dict); xmlFree(ctxt); } #if 0 /** * xmlSchematronPushInclude: * @ctxt: the schema parser context * @doc: the included document * @cur: the current include node * * Add an included document */ static void xmlSchematronPushInclude(xmlSchematronParserCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr cur) { if (ctxt->includes == NULL) { ctxt->maxIncludes = 10; ctxt->includes = (xmlNodePtr *) xmlMalloc(ctxt->maxIncludes * 2 * sizeof(xmlNodePtr)); if (ctxt->includes == NULL) { xmlSchematronPErrMemory(NULL, "allocating parser includes", NULL); return; } ctxt->nbIncludes = 0; } else if (ctxt->nbIncludes + 2 >= ctxt->maxIncludes) { xmlNodePtr *tmp; tmp = (xmlNodePtr *) xmlRealloc(ctxt->includes, ctxt->maxIncludes * 4 * sizeof(xmlNodePtr)); if (tmp == NULL) { xmlSchematronPErrMemory(NULL, "allocating parser includes", NULL); return; } ctxt->includes = tmp; ctxt->maxIncludes *= 2; } ctxt->includes[2 * ctxt->nbIncludes] = cur; ctxt->includes[2 * ctxt->nbIncludes + 1] = (xmlNodePtr) doc; ctxt->nbIncludes++; } /** * xmlSchematronPopInclude: * @ctxt: the schema parser context * * Pop an include level. The included document is being freed * * Returns the node immediately following the include or NULL if the * include list was empty. */ static xmlNodePtr xmlSchematronPopInclude(xmlSchematronParserCtxtPtr ctxt) { xmlDocPtr doc; xmlNodePtr ret; if (ctxt->nbIncludes <= 0) return(NULL); ctxt->nbIncludes--; doc = (xmlDocPtr) ctxt->includes[2 * ctxt->nbIncludes + 1]; ret = ctxt->includes[2 * ctxt->nbIncludes]; xmlFreeDoc(doc); if (ret != NULL) ret = ret->next; if (ret == NULL) return(xmlSchematronPopInclude(ctxt)); return(ret); } #endif /** * xmlSchematronAddNamespace: * @ctxt: the schema parser context * @prefix: the namespace prefix * @ns: the namespace name * * Add a namespace definition in the context */ static void xmlSchematronAddNamespace(xmlSchematronParserCtxtPtr ctxt, const xmlChar *prefix, const xmlChar *ns) { if (ctxt->namespaces == NULL) { ctxt->maxNamespaces = 10; ctxt->namespaces = (const xmlChar **) xmlMalloc(ctxt->maxNamespaces * 2 * sizeof(const xmlChar *)); if (ctxt->namespaces == NULL) { xmlSchematronPErrMemory(NULL, "allocating parser namespaces", NULL); return; } ctxt->nbNamespaces = 0; } else if (ctxt->nbNamespaces + 2 >= ctxt->maxNamespaces) { const xmlChar **tmp; tmp = (const xmlChar **) xmlRealloc((xmlChar **) ctxt->namespaces, ctxt->maxNamespaces * 4 * sizeof(const xmlChar *)); if (tmp == NULL) { xmlSchematronPErrMemory(NULL, "allocating parser namespaces", NULL); return; } ctxt->namespaces = tmp; ctxt->maxNamespaces *= 2; } ctxt->namespaces[2 * ctxt->nbNamespaces] = xmlDictLookup(ctxt->dict, ns, -1); ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = xmlDictLookup(ctxt->dict, prefix, -1); ctxt->nbNamespaces++; ctxt->namespaces[2 * ctxt->nbNamespaces] = NULL; ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = NULL; } /** * xmlSchematronParseRule: * @ctxt: a schema validation context * @rule: the rule node * * parse a rule element */ static void xmlSchematronParseRule(xmlSchematronParserCtxtPtr ctxt, xmlSchematronPatternPtr pattern, xmlNodePtr rule) { xmlNodePtr cur; int nbChecks = 0; xmlChar *test; xmlChar *context; xmlChar *report; xmlSchematronRulePtr ruleptr; xmlSchematronTestPtr testptr; if ((ctxt == NULL) || (rule == NULL)) return; context = xmlGetNoNsProp(rule, BAD_CAST "context"); if (context == NULL) { xmlSchematronPErr(ctxt, rule, XML_SCHEMAP_NOROOT, "rule has no context attribute", NULL, NULL); return; } else if (context[0] == 0) { xmlSchematronPErr(ctxt, rule, XML_SCHEMAP_NOROOT, "rule has an empty context attribute", NULL, NULL); xmlFree(context); return; } else { ruleptr = xmlSchematronAddRule(ctxt, ctxt->schema, pattern, rule, context, NULL); if (ruleptr == NULL) { xmlFree(context); return; } } cur = rule->children; NEXT_SCHEMATRON(cur); while (cur != NULL) { if (IS_SCHEMATRON(cur, "assert")) { nbChecks++; test = xmlGetNoNsProp(cur, BAD_CAST "test"); if (test == NULL) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "assert has no test attribute", NULL, NULL); } else if (test[0] == 0) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "assert has an empty test attribute", NULL, NULL); xmlFree(test); } else { /* TODO will need dynamic processing instead */ report = xmlNodeGetContent(cur); testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_ASSERT, ruleptr, cur, test, report); if (testptr == NULL) xmlFree(test); } } else if (IS_SCHEMATRON(cur, "report")) { nbChecks++; test = xmlGetNoNsProp(cur, BAD_CAST "test"); if (test == NULL) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "assert has no test attribute", NULL, NULL); } else if (test[0] == 0) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "assert has an empty test attribute", NULL, NULL); xmlFree(test); } else { /* TODO will need dynamic processing instead */ report = xmlNodeGetContent(cur); testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_REPORT, ruleptr, cur, test, report); if (testptr == NULL) xmlFree(test); } } else { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "Expecting an assert or a report element instead of %s", cur->name, NULL); } cur = cur->next; NEXT_SCHEMATRON(cur); } if (nbChecks == 0) { xmlSchematronPErr(ctxt, rule, XML_SCHEMAP_NOROOT, "rule has no assert nor report element", NULL, NULL); } } /** * xmlSchematronParsePattern: * @ctxt: a schema validation context * @pat: the pattern node * * parse a pattern element */ static void xmlSchematronParsePattern(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr pat) { xmlNodePtr cur; xmlSchematronPatternPtr pattern; int nbRules = 0; xmlChar *id; if ((ctxt == NULL) || (pat == NULL)) return; id = xmlGetNoNsProp(pat, BAD_CAST "id"); if (id == NULL) { id = xmlGetNoNsProp(pat, BAD_CAST "name"); } pattern = xmlSchematronAddPattern(ctxt, ctxt->schema, pat, id); if (pattern == NULL) { if (id != NULL) xmlFree(id); return; } cur = pat->children; NEXT_SCHEMATRON(cur); while (cur != NULL) { if (IS_SCHEMATRON(cur, "rule")) { xmlSchematronParseRule(ctxt, pattern, cur); nbRules++; } else { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "Expecting a rule element instead of %s", cur->name, NULL); } cur = cur->next; NEXT_SCHEMATRON(cur); } if (nbRules == 0) { xmlSchematronPErr(ctxt, pat, XML_SCHEMAP_NOROOT, "Pattern has no rule element", NULL, NULL); } } #if 0 /** * xmlSchematronLoadInclude: * @ctxt: a schema validation context * @cur: the include element * * Load the include document, Push the current pointer * * Returns the updated node pointer */ static xmlNodePtr xmlSchematronLoadInclude(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr cur) { xmlNodePtr ret = NULL; xmlDocPtr doc = NULL; xmlChar *href = NULL; xmlChar *base = NULL; xmlChar *URI = NULL; if ((ctxt == NULL) || (cur == NULL)) return(NULL); href = xmlGetNoNsProp(cur, BAD_CAST "href"); if (href == NULL) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "Include has no href attribute", NULL, NULL); return(cur->next); } /* do the URI base composition, load and find the root */ base = xmlNodeGetBase(cur->doc, cur); URI = xmlBuildURI(href, base); doc = xmlReadFile((const char *) URI, NULL, SCHEMATRON_PARSE_OPTIONS); if (doc == NULL) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_FAILED_LOAD, "could not load include '%s'.\n", URI, NULL); goto done; } ret = xmlDocGetRootElement(doc); if (ret == NULL) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_FAILED_LOAD, "could not find root from include '%s'.\n", URI, NULL); goto done; } /* Success, push the include for rollback on exit */ xmlSchematronPushInclude(ctxt, doc, cur); done: if (ret == NULL) { if (doc != NULL) xmlFreeDoc(doc); } xmlFree(href); if (base != NULL) xmlFree(base); if (URI != NULL) xmlFree(URI); return(ret); } #endif /** * xmlSchematronParse: * @ctxt: a schema validation context * * parse a schema definition resource and build an internal * XML Shema struture which can be used to validate instances. * * Returns the internal XML Schematron structure built from the resource or * NULL in case of error */ xmlSchematronPtr xmlSchematronParse(xmlSchematronParserCtxtPtr ctxt) { xmlSchematronPtr ret = NULL; xmlDocPtr doc; xmlNodePtr root, cur; int preserve = 0; if (ctxt == NULL) return (NULL); ctxt->nberrors = 0; /* * First step is to parse the input document into an DOM/Infoset */ if (ctxt->URL != NULL) { doc = xmlReadFile((const char *) ctxt->URL, NULL, SCHEMATRON_PARSE_OPTIONS); if (doc == NULL) { xmlSchematronPErr(ctxt, NULL, XML_SCHEMAP_FAILED_LOAD, "xmlSchematronParse: could not load '%s'.\n", ctxt->URL, NULL); return (NULL); } ctxt->preserve = 0; } else if (ctxt->buffer != NULL) { doc = xmlReadMemory(ctxt->buffer, ctxt->size, NULL, NULL, SCHEMATRON_PARSE_OPTIONS); if (doc == NULL) { xmlSchematronPErr(ctxt, NULL, XML_SCHEMAP_FAILED_PARSE, "xmlSchematronParse: could not parse.\n", NULL, NULL); return (NULL); } doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); ctxt->URL = xmlDictLookup(ctxt->dict, BAD_CAST "in_memory_buffer", -1); ctxt->preserve = 0; } else if (ctxt->doc != NULL) { doc = ctxt->doc; preserve = 1; ctxt->preserve = 1; } else { xmlSchematronPErr(ctxt, NULL, XML_SCHEMAP_NOTHING_TO_PARSE, "xmlSchematronParse: could not parse.\n", NULL, NULL); return (NULL); } /* * Then extract the root and Schematron parse it */ root = xmlDocGetRootElement(doc); if (root == NULL) { xmlSchematronPErr(ctxt, (xmlNodePtr) doc, XML_SCHEMAP_NOROOT, "The schema has no document element.\n", NULL, NULL); if (!preserve) { xmlFreeDoc(doc); } return (NULL); } if (!IS_SCHEMATRON(root, "schema")) { xmlSchematronPErr(ctxt, root, XML_SCHEMAP_NOROOT, "The XML document '%s' is not a XML schematron document", ctxt->URL, NULL); goto exit; } ret = xmlSchematronNewSchematron(ctxt); if (ret == NULL) goto exit; ctxt->schema = ret; /* * scan the schema elements */ cur = root->children; NEXT_SCHEMATRON(cur); if (IS_SCHEMATRON(cur, "title")) { xmlChar *title = xmlNodeGetContent(cur); if (title != NULL) { ret->title = xmlDictLookup(ret->dict, title, -1); xmlFree(title); } cur = cur->next; NEXT_SCHEMATRON(cur); } while (IS_SCHEMATRON(cur, "ns")) { xmlChar *prefix = xmlGetNoNsProp(cur, BAD_CAST "prefix"); xmlChar *uri = xmlGetNoNsProp(cur, BAD_CAST "uri"); if ((uri == NULL) || (uri[0] == 0)) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "ns element has no uri", NULL, NULL); } if ((prefix == NULL) || (prefix[0] == 0)) { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "ns element has no prefix", NULL, NULL); } if ((prefix) && (uri)) { xmlXPathRegisterNs(ctxt->xctxt, prefix, uri); xmlSchematronAddNamespace(ctxt, prefix, uri); ret->nbNs++; } if (uri) xmlFree(uri); if (prefix) xmlFree(prefix); cur = cur->next; NEXT_SCHEMATRON(cur); } while (cur != NULL) { if (IS_SCHEMATRON(cur, "pattern")) { xmlSchematronParsePattern(ctxt, cur); ret->nbPattern++; } else { xmlSchematronPErr(ctxt, cur, XML_SCHEMAP_NOROOT, "Expecting a pattern element instead of %s", cur->name, NULL); } cur = cur->next; NEXT_SCHEMATRON(cur); } if (ret->nbPattern == 0) { xmlSchematronPErr(ctxt, root, XML_SCHEMAP_NOROOT, "The schematron document '%s' has no pattern", ctxt->URL, NULL); goto exit; } /* the original document must be kept for reporting */ ret->doc = doc; if (preserve) { ret->preserve = 1; } preserve = 1; exit: if (!preserve) { xmlFreeDoc(doc); } if (ret != NULL) { if (ctxt->nberrors != 0) { xmlSchematronFree(ret); ret = NULL; } else { ret->namespaces = ctxt->namespaces; ret->nbNamespaces = ctxt->nbNamespaces; ctxt->namespaces = NULL; } } return (ret); } /************************************************************************ * * * Schematrontron Reports handler * * * ************************************************************************/ static xmlNodePtr xmlSchematronGetNode(xmlSchematronValidCtxtPtr ctxt, xmlNodePtr cur, const xmlChar *xpath) { xmlNodePtr node = NULL; xmlXPathObjectPtr ret; if ((ctxt == NULL) || (cur == NULL) || (xpath == NULL)) return(NULL); ctxt->xctxt->doc = cur->doc; ctxt->xctxt->node = cur; ret = xmlXPathEval(xpath, ctxt->xctxt); if (ret == NULL) return(NULL); if ((ret->type == XPATH_NODESET) && (ret->nodesetval != NULL) && (ret->nodesetval->nodeNr > 0)) node = ret->nodesetval->nodeTab[0]; xmlXPathFreeObject(ret); return(node); } /** * xmlSchematronReportOutput: * @ctxt: the validation context * @cur: the current node tested * @msg: the message output * * Output part of the report to whatever channel the user selected */ static void xmlSchematronReportOutput(xmlSchematronValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlNodePtr cur ATTRIBUTE_UNUSED, const char *msg) { /* TODO */ fprintf(stderr, "%s", msg); } /** * xmlSchematronFormatReport: * @ctxt: the validation context * @test: the test node * @cur: the current node tested * * Build the string being reported to the user. * * Returns a report string or NULL in case of error. The string needs * to be deallocated by teh caller */ static xmlChar * xmlSchematronFormatReport(xmlSchematronValidCtxtPtr ctxt, xmlNodePtr test, xmlNodePtr cur) { xmlChar *ret = NULL; xmlNodePtr child, node; if ((test == NULL) || (cur == NULL)) return(ret); child = test->children; while (child != NULL) { if ((child->type == XML_TEXT_NODE) || (child->type == XML_CDATA_SECTION_NODE)) ret = xmlStrcat(ret, child->content); else if (IS_SCHEMATRON(child, "name")) { xmlChar *path; path = xmlGetNoNsProp(child, BAD_CAST "path"); node = cur; if (path != NULL) { node = xmlSchematronGetNode(ctxt, cur, path); if (node == NULL) node = cur; xmlFree(path); } if ((node->ns == NULL) || (node->ns->prefix == NULL)) ret = xmlStrcat(ret, node->name); else { ret = xmlStrcat(ret, node->ns->prefix); ret = xmlStrcat(ret, BAD_CAST ":"); ret = xmlStrcat(ret, node->name); } } else { child = child->next; continue; } /* * remove superfluous \n */ if (ret != NULL) { int len = xmlStrlen(ret); xmlChar c; if (len > 0) { c = ret[len - 1]; if ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) { while ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) { len--; if (len == 0) break; c = ret[len - 1]; } ret[len] = ' '; ret[len + 1] = 0; } } } child = child->next; } return(ret); } /** * xmlSchematronReportSuccess: * @ctxt: the validation context * @test: the compiled test * @cur: the current node tested * @success: boolean value for the result * * called from the validation engine when an assert or report test have * been done. */ static void xmlSchematronReportSuccess(xmlSchematronValidCtxtPtr ctxt, xmlSchematronTestPtr test, xmlNodePtr cur, xmlSchematronPatternPtr pattern, int success) { if ((ctxt == NULL) || (cur == NULL) || (test == NULL)) return; /* if quiet and not SVRL report only failures */ if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) && ((ctxt->flags & XML_SCHEMATRON_OUT_XML) == 0) && (test->type == XML_SCHEMATRON_REPORT)) return; if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { TODO } else { xmlChar *path; char msg[1000]; long line; const xmlChar *report = NULL; if (((test->type == XML_SCHEMATRON_REPORT) & (!success)) || ((test->type == XML_SCHEMATRON_ASSERT) & (success))) return; line = xmlGetLineNo(cur); path = xmlGetNodePath(cur); if (path == NULL) path = (xmlChar *) cur->name; #if 0 if ((test->report != NULL) && (test->report[0] != 0)) report = test->report; #endif if (test->node != NULL) report = xmlSchematronFormatReport(ctxt, test->node, cur); if (report == NULL) { if (test->type == XML_SCHEMATRON_ASSERT) { report = xmlStrdup((const xmlChar *) "node failed assert"); } else { report = xmlStrdup((const xmlChar *) "node failed report"); } } snprintf(msg, 999, "%s line %ld: %s\n", (const char *) path, line, (const char *) report); if (ctxt->flags & XML_SCHEMATRON_OUT_ERROR) { xmlStructuredErrorFunc schannel = NULL; xmlGenericErrorFunc channel = NULL; void *data = NULL; if (ctxt != NULL) { if (ctxt->serror != NULL) schannel = ctxt->serror; else channel = ctxt->error; data = ctxt->userData; } __xmlRaiseError(schannel, channel, data, NULL, cur, XML_FROM_SCHEMATRONV, (test->type == XML_SCHEMATRON_ASSERT)?XML_SCHEMATRONV_ASSERT:XML_SCHEMATRONV_REPORT, XML_ERR_ERROR, NULL, line, (pattern == NULL)?NULL:((const char *) pattern->name), (const char *) path, (const char *) report, 0, 0, "%s", msg); } else { xmlSchematronReportOutput(ctxt, cur, &msg[0]); } xmlFree((char *) report); if ((path != NULL) && (path != (xmlChar *) cur->name)) xmlFree(path); } } /** * xmlSchematronReportPattern: * @ctxt: the validation context * @pattern: the current pattern * * called from the validation engine when starting to check a pattern */ static void xmlSchematronReportPattern(xmlSchematronValidCtxtPtr ctxt, xmlSchematronPatternPtr pattern) { if ((ctxt == NULL) || (pattern == NULL)) return; if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) || (ctxt->flags & XML_SCHEMATRON_OUT_ERROR)) /* Error gives pattern name as part of error */ return; if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { TODO } else { char msg[1000]; if (pattern->name == NULL) return; snprintf(msg, 999, "Pattern: %s\n", (const char *) pattern->name); xmlSchematronReportOutput(ctxt, NULL, &msg[0]); } } /************************************************************************ * * * Validation against a Schematrontron * * * ************************************************************************/ /** * xmlSchematronSetValidStructuredErrors: * @ctxt: a Schematron validation context * @serror: the structured error function * @ctx: the functions context * * Set the structured error callback */ void xmlSchematronSetValidStructuredErrors(xmlSchematronValidCtxtPtr ctxt, xmlStructuredErrorFunc serror, void *ctx) { if (ctxt == NULL) return; ctxt->serror = serror; ctxt->error = NULL; ctxt->warning = NULL; ctxt->userData = ctx; } /** * xmlSchematronNewValidCtxt: * @schema: a precompiled XML Schematrons * @options: a set of xmlSchematronValidOptions * * Create an XML Schematrons validation context based on the given schema. * * Returns the validation context or NULL in case of error */ xmlSchematronValidCtxtPtr xmlSchematronNewValidCtxt(xmlSchematronPtr schema, int options) { int i; xmlSchematronValidCtxtPtr ret; ret = (xmlSchematronValidCtxtPtr) xmlMalloc(sizeof(xmlSchematronValidCtxt)); if (ret == NULL) { xmlSchematronVErrMemory(NULL, "allocating validation context", NULL); return (NULL); } memset(ret, 0, sizeof(xmlSchematronValidCtxt)); ret->type = XML_STRON_CTXT_VALIDATOR; ret->schema = schema; ret->xctxt = xmlXPathNewContext(NULL); ret->flags = options; if (ret->xctxt == NULL) { xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", NULL); xmlSchematronFreeValidCtxt(ret); return (NULL); } for (i = 0;i < schema->nbNamespaces;i++) { if ((schema->namespaces[2 * i] == NULL) || (schema->namespaces[2 * i + 1] == NULL)) break; xmlXPathRegisterNs(ret->xctxt, schema->namespaces[2 * i + 1], schema->namespaces[2 * i]); } return (ret); } /** * xmlSchematronFreeValidCtxt: * @ctxt: the schema validation context * * Free the resources associated to the schema validation context */ void xmlSchematronFreeValidCtxt(xmlSchematronValidCtxtPtr ctxt) { if (ctxt == NULL) return; if (ctxt->xctxt != NULL) xmlXPathFreeContext(ctxt->xctxt); if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); xmlFree(ctxt); } static xmlNodePtr xmlSchematronNextNode(xmlNodePtr cur) { if (cur->children != NULL) { /* * Do not descend on entities declarations */ if (cur->children->type != XML_ENTITY_DECL) { cur = cur->children; /* * Skip DTDs */ if (cur->type != XML_DTD_NODE) return(cur); } } while (cur->next != NULL) { cur = cur->next; if ((cur->type != XML_ENTITY_DECL) && (cur->type != XML_DTD_NODE)) return(cur); } do { cur = cur->parent; if (cur == NULL) break; if (cur->type == XML_DOCUMENT_NODE) return(NULL); if (cur->next != NULL) { cur = cur->next; return(cur); } } while (cur != NULL); return(cur); } /** * xmlSchematronRunTest: * @ctxt: the schema validation context * @test: the current test * @instance: the document instace tree * @cur: the current node in the instance * * Validate a rule against a tree instance at a given position * * Returns 1 in case of success, 0 if error and -1 in case of internal error */ static int xmlSchematronRunTest(xmlSchematronValidCtxtPtr ctxt, xmlSchematronTestPtr test, xmlDocPtr instance, xmlNodePtr cur, xmlSchematronPatternPtr pattern) { xmlXPathObjectPtr ret; int failed; failed = 0; ctxt->xctxt->doc = instance; ctxt->xctxt->node = cur; ret = xmlXPathCompiledEval(test->comp, ctxt->xctxt); if (ret == NULL) { failed = 1; } else { switch (ret->type) { case XPATH_XSLT_TREE: case XPATH_NODESET: if ((ret->nodesetval == NULL) || (ret->nodesetval->nodeNr == 0)) failed = 1; break; case XPATH_BOOLEAN: failed = !ret->boolval; break; case XPATH_NUMBER: if ((xmlXPathIsNaN(ret->floatval)) || (ret->floatval == 0.0)) failed = 1; break; case XPATH_STRING: if ((ret->stringval == NULL) || (ret->stringval[0] == 0)) failed = 1; break; case XPATH_UNDEFINED: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: case XPATH_USERS: failed = 1; break; } xmlXPathFreeObject(ret); } if ((failed) && (test->type == XML_SCHEMATRON_ASSERT)) ctxt->nberrors++; else if ((!failed) && (test->type == XML_SCHEMATRON_REPORT)) ctxt->nberrors++; xmlSchematronReportSuccess(ctxt, test, cur, pattern, !failed); return(!failed); } /** * xmlSchematronValidateDoc: * @ctxt: the schema validation context * @instance: the document instace tree * * Validate a tree instance against the schematron * * Returns 0 in case of success, -1 in case of internal error * and an error count otherwise. */ int xmlSchematronValidateDoc(xmlSchematronValidCtxtPtr ctxt, xmlDocPtr instance) { xmlNodePtr cur, root; xmlSchematronPatternPtr pattern; xmlSchematronRulePtr rule; xmlSchematronTestPtr test; if ((ctxt == NULL) || (ctxt->schema == NULL) || (ctxt->schema->rules == NULL) || (instance == NULL)) return(-1); ctxt->nberrors = 0; root = xmlDocGetRootElement(instance); if (root == NULL) { TODO ctxt->nberrors++; return(1); } if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) || (ctxt->flags == 0)) { /* * we are just trying to assert the validity of the document, * speed primes over the output, run in a single pass */ cur = root; while (cur != NULL) { rule = ctxt->schema->rules; while (rule != NULL) { if (xmlPatternMatch(rule->pattern, cur) == 1) { test = rule->tests; while (test != NULL) { xmlSchematronRunTest(ctxt, test, instance, cur, (xmlSchematronPatternPtr)rule->pattern); test = test->next; } } rule = rule->next; } cur = xmlSchematronNextNode(cur); } } else { /* * Process all contexts one at a time */ pattern = ctxt->schema->patterns; while (pattern != NULL) { xmlSchematronReportPattern(ctxt, pattern); /* * TODO convert the pattern rule to a direct XPath and * compute directly instead of using the pattern matching * over the full document... * Check the exact semantic */ cur = root; while (cur != NULL) { rule = pattern->rules; while (rule != NULL) { if (xmlPatternMatch(rule->pattern, cur) == 1) { test = rule->tests; while (test != NULL) { xmlSchematronRunTest(ctxt, test, instance, cur, pattern); test = test->next; } } rule = rule->patnext; } cur = xmlSchematronNextNode(cur); } pattern = pattern->next; } } return(ctxt->nberrors); } #ifdef STANDALONE int main(void) { int ret; xmlDocPtr instance; xmlSchematronParserCtxtPtr pctxt; xmlSchematronValidCtxtPtr vctxt; xmlSchematronPtr schema = NULL; pctxt = xmlSchematronNewParserCtxt("tst.sct"); if (pctxt == NULL) { fprintf(stderr, "failed to build schematron parser\n"); } else { schema = xmlSchematronParse(pctxt); if (schema == NULL) { fprintf(stderr, "failed to compile schematron\n"); } xmlSchematronFreeParserCtxt(pctxt); } instance = xmlReadFile("tst.sct", NULL, XML_PARSE_NOENT | XML_PARSE_NOCDATA); if (instance == NULL) { fprintf(stderr, "failed to parse instance\n"); } if ((schema != NULL) && (instance != NULL)) { vctxt = xmlSchematronNewValidCtxt(schema); if (vctxt == NULL) { fprintf(stderr, "failed to build schematron validator\n"); } else { ret = xmlSchematronValidateDoc(vctxt, instance); xmlSchematronFreeValidCtxt(vctxt); } } xmlSchematronFree(schema); xmlFreeDoc(instance); xmlCleanupParser(); xmlMemoryDump(); return (0); } #endif #define bottom_schematron #include "elfgcchack.h" #endif /* LIBXML_SCHEMATRON_ENABLED */ libxml2-2.9.1+dfsg1/debugXML.c0000644000175000017500000031314212113312340014361 0ustar aronaron/* * debugXML.c : This is a set of routines used for debugging the tree * produced by the XML parser. * * See Copyright for the status of this software. * * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_DEBUG_ENABLED #include #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LIBXML_SCHEMAS_ENABLED #include #endif #define DUMP_TEXT_TYPE 1 typedef struct _xmlDebugCtxt xmlDebugCtxt; typedef xmlDebugCtxt *xmlDebugCtxtPtr; struct _xmlDebugCtxt { FILE *output; /* the output file */ char shift[101]; /* used for indenting */ int depth; /* current depth */ xmlDocPtr doc; /* current document */ xmlNodePtr node; /* current node */ xmlDictPtr dict; /* the doc dictionnary */ int check; /* do just checkings */ int errors; /* number of errors found */ int nodict; /* if the document has no dictionnary */ int options; /* options */ }; static void xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node); static void xmlCtxtDumpInitCtxt(xmlDebugCtxtPtr ctxt) { int i; ctxt->depth = 0; ctxt->check = 0; ctxt->errors = 0; ctxt->output = stdout; ctxt->doc = NULL; ctxt->node = NULL; ctxt->dict = NULL; ctxt->nodict = 0; ctxt->options = 0; for (i = 0; i < 100; i++) ctxt->shift[i] = ' '; ctxt->shift[100] = 0; } static void xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED) { /* remove the ATTRIBUTE_UNUSED when this is added */ } /** * xmlNsCheckScope: * @node: the node * @ns: the namespace node * * Check that a given namespace is in scope on a node. * * Returns 1 if in scope, -1 in case of argument error, * -2 if the namespace is not in scope, and -3 if not on * an ancestor node. */ static int xmlNsCheckScope(xmlNodePtr node, xmlNsPtr ns) { xmlNsPtr cur; if ((node == NULL) || (ns == NULL)) return(-1); if ((node->type != XML_ELEMENT_NODE) && (node->type != XML_ATTRIBUTE_NODE) && (node->type != XML_DOCUMENT_NODE) && (node->type != XML_TEXT_NODE) && (node->type != XML_HTML_DOCUMENT_NODE) && (node->type != XML_XINCLUDE_START)) return(-2); while ((node != NULL) && ((node->type == XML_ELEMENT_NODE) || (node->type == XML_ATTRIBUTE_NODE) || (node->type == XML_TEXT_NODE) || (node->type == XML_XINCLUDE_START))) { if ((node->type == XML_ELEMENT_NODE) || (node->type == XML_XINCLUDE_START)) { cur = node->nsDef; while (cur != NULL) { if (cur == ns) return(1); if (xmlStrEqual(cur->prefix, ns->prefix)) return(-2); cur = cur->next; } } node = node->parent; } /* the xml namespace may be declared on the document node */ if ((node != NULL) && ((node->type == XML_DOCUMENT_NODE) || (node->type == XML_HTML_DOCUMENT_NODE))) { xmlNsPtr oldNs = ((xmlDocPtr) node)->oldNs; if (oldNs == ns) return(1); } return(-3); } static void xmlCtxtDumpSpaces(xmlDebugCtxtPtr ctxt) { if (ctxt->check) return; if ((ctxt->output != NULL) && (ctxt->depth > 0)) { if (ctxt->depth < 50) fprintf(ctxt->output, "%s", &ctxt->shift[100 - 2 * ctxt->depth]); else fprintf(ctxt->output, "%s", ctxt->shift); } } /** * xmlDebugErr: * @ctxt: a debug context * @error: the error code * * Handle a debug error. */ static void xmlDebugErr(xmlDebugCtxtPtr ctxt, int error, const char *msg) { ctxt->errors++; __xmlRaiseError(NULL, NULL, NULL, NULL, ctxt->node, XML_FROM_CHECK, error, XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); } static void xmlDebugErr2(xmlDebugCtxtPtr ctxt, int error, const char *msg, int extra) { ctxt->errors++; __xmlRaiseError(NULL, NULL, NULL, NULL, ctxt->node, XML_FROM_CHECK, error, XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, msg, extra); } static void xmlDebugErr3(xmlDebugCtxtPtr ctxt, int error, const char *msg, const char *extra) { ctxt->errors++; __xmlRaiseError(NULL, NULL, NULL, NULL, ctxt->node, XML_FROM_CHECK, error, XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, msg, extra); } /** * xmlCtxtNsCheckScope: * @ctxt: the debugging context * @node: the node * @ns: the namespace node * * Report if a given namespace is is not in scope. */ static void xmlCtxtNsCheckScope(xmlDebugCtxtPtr ctxt, xmlNodePtr node, xmlNsPtr ns) { int ret; ret = xmlNsCheckScope(node, ns); if (ret == -2) { if (ns->prefix == NULL) xmlDebugErr(ctxt, XML_CHECK_NS_SCOPE, "Reference to default namespace not in scope\n"); else xmlDebugErr3(ctxt, XML_CHECK_NS_SCOPE, "Reference to namespace '%s' not in scope\n", (char *) ns->prefix); } if (ret == -3) { if (ns->prefix == NULL) xmlDebugErr(ctxt, XML_CHECK_NS_ANCESTOR, "Reference to default namespace not on ancestor\n"); else xmlDebugErr3(ctxt, XML_CHECK_NS_ANCESTOR, "Reference to namespace '%s' not on ancestor\n", (char *) ns->prefix); } } /** * xmlCtxtCheckString: * @ctxt: the debug context * @str: the string * * Do debugging on the string, currently it just checks the UTF-8 content */ static void xmlCtxtCheckString(xmlDebugCtxtPtr ctxt, const xmlChar * str) { if (str == NULL) return; if (ctxt->check) { if (!xmlCheckUTF8(str)) { xmlDebugErr3(ctxt, XML_CHECK_NOT_UTF8, "String is not UTF-8 %s", (const char *) str); } } } /** * xmlCtxtCheckName: * @ctxt: the debug context * @name: the name * * Do debugging on the name, for example the dictionnary status and * conformance to the Name production. */ static void xmlCtxtCheckName(xmlDebugCtxtPtr ctxt, const xmlChar * name) { if (ctxt->check) { if (name == NULL) { xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Name is NULL"); return; } if (xmlValidateName(name, 0)) { xmlDebugErr3(ctxt, XML_CHECK_NOT_NCNAME, "Name is not an NCName '%s'", (const char *) name); } if ((ctxt->dict != NULL) && (!xmlDictOwns(ctxt->dict, name)) && ((ctxt->doc == NULL) || ((ctxt->doc->parseFlags & (XML_PARSE_SAX1 | XML_PARSE_NODICT)) == 0))) { xmlDebugErr3(ctxt, XML_CHECK_OUTSIDE_DICT, "Name is not from the document dictionnary '%s'", (const char *) name); } } } static void xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt, xmlNodePtr node) { xmlDocPtr doc; xmlDictPtr dict; doc = node->doc; if (node->parent == NULL) xmlDebugErr(ctxt, XML_CHECK_NO_PARENT, "Node has no parent\n"); if (node->doc == NULL) { xmlDebugErr(ctxt, XML_CHECK_NO_DOC, "Node has no doc\n"); dict = NULL; } else { dict = doc->dict; if ((dict == NULL) && (ctxt->nodict == 0)) { #if 0 /* desactivated right now as it raises too many errors */ if (doc->type == XML_DOCUMENT_NODE) xmlDebugErr(ctxt, XML_CHECK_NO_DICT, "Document has no dictionnary\n"); #endif ctxt->nodict = 1; } if (ctxt->doc == NULL) ctxt->doc = doc; if (ctxt->dict == NULL) { ctxt->dict = dict; } } if ((node->parent != NULL) && (node->doc != node->parent->doc) && (!xmlStrEqual(node->name, BAD_CAST "pseudoroot"))) xmlDebugErr(ctxt, XML_CHECK_WRONG_DOC, "Node doc differs from parent's one\n"); if (node->prev == NULL) { if (node->type == XML_ATTRIBUTE_NODE) { if ((node->parent != NULL) && (node != (xmlNodePtr) node->parent->properties)) xmlDebugErr(ctxt, XML_CHECK_NO_PREV, "Attr has no prev and not first of attr list\n"); } else if ((node->parent != NULL) && (node->parent->children != node)) xmlDebugErr(ctxt, XML_CHECK_NO_PREV, "Node has no prev and not first of parent list\n"); } else { if (node->prev->next != node) xmlDebugErr(ctxt, XML_CHECK_WRONG_PREV, "Node prev->next : back link wrong\n"); } if (node->next == NULL) { if ((node->parent != NULL) && (node->type != XML_ATTRIBUTE_NODE) && (node->parent->last != node) && (node->parent->type == XML_ELEMENT_NODE)) xmlDebugErr(ctxt, XML_CHECK_NO_NEXT, "Node has no next and not last of parent list\n"); } else { if (node->next->prev != node) xmlDebugErr(ctxt, XML_CHECK_WRONG_NEXT, "Node next->prev : forward link wrong\n"); if (node->next->parent != node->parent) xmlDebugErr(ctxt, XML_CHECK_WRONG_PARENT, "Node next->prev : forward link wrong\n"); } if (node->type == XML_ELEMENT_NODE) { xmlNsPtr ns; ns = node->nsDef; while (ns != NULL) { xmlCtxtNsCheckScope(ctxt, node, ns); ns = ns->next; } if (node->ns != NULL) xmlCtxtNsCheckScope(ctxt, node, node->ns); } else if (node->type == XML_ATTRIBUTE_NODE) { if (node->ns != NULL) xmlCtxtNsCheckScope(ctxt, node, node->ns); } if ((node->type != XML_ELEMENT_NODE) && (node->type != XML_ATTRIBUTE_NODE) && (node->type != XML_ELEMENT_DECL) && (node->type != XML_ATTRIBUTE_DECL) && (node->type != XML_DTD_NODE) && (node->type != XML_HTML_DOCUMENT_NODE) && (node->type != XML_DOCUMENT_NODE)) { if (node->content != NULL) xmlCtxtCheckString(ctxt, (const xmlChar *) node->content); } switch (node->type) { case XML_ELEMENT_NODE: case XML_ATTRIBUTE_NODE: xmlCtxtCheckName(ctxt, node->name); break; case XML_TEXT_NODE: if ((node->name == xmlStringText) || (node->name == xmlStringTextNoenc)) break; /* some case of entity substitution can lead to this */ if ((ctxt->dict != NULL) && (node->name == xmlDictLookup(ctxt->dict, BAD_CAST "nbktext", 7))) break; xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME, "Text node has wrong name '%s'", (const char *) node->name); break; case XML_COMMENT_NODE: if (node->name == xmlStringComment) break; xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME, "Comment node has wrong name '%s'", (const char *) node->name); break; case XML_PI_NODE: xmlCtxtCheckName(ctxt, node->name); break; case XML_CDATA_SECTION_NODE: if (node->name == NULL) break; xmlDebugErr3(ctxt, XML_CHECK_NAME_NOT_NULL, "CData section has non NULL name '%s'", (const char *) node->name); break; case XML_ENTITY_REF_NODE: case XML_ENTITY_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: case XML_NAMESPACE_DECL: case XML_XINCLUDE_START: case XML_XINCLUDE_END: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: break; } } static void xmlCtxtDumpString(xmlDebugCtxtPtr ctxt, const xmlChar * str) { int i; if (ctxt->check) { return; } /* TODO: check UTF8 content of the string */ if (str == NULL) { fprintf(ctxt->output, "(NULL)"); return; } for (i = 0; i < 40; i++) if (str[i] == 0) return; else if (IS_BLANK_CH(str[i])) fputc(' ', ctxt->output); else if (str[i] >= 0x80) fprintf(ctxt->output, "#%X", str[i]); else fputc(str[i], ctxt->output); fprintf(ctxt->output, "..."); } static void xmlCtxtDumpDtdNode(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd) { xmlCtxtDumpSpaces(ctxt); if (dtd == NULL) { if (!ctxt->check) fprintf(ctxt->output, "DTD node is NULL\n"); return; } if (dtd->type != XML_DTD_NODE) { xmlDebugErr(ctxt, XML_CHECK_NOT_DTD, "Node is not a DTD"); return; } if (!ctxt->check) { if (dtd->name != NULL) fprintf(ctxt->output, "DTD(%s)", (char *) dtd->name); else fprintf(ctxt->output, "DTD"); if (dtd->ExternalID != NULL) fprintf(ctxt->output, ", PUBLIC %s", (char *) dtd->ExternalID); if (dtd->SystemID != NULL) fprintf(ctxt->output, ", SYSTEM %s", (char *) dtd->SystemID); fprintf(ctxt->output, "\n"); } /* * Do a bit of checking */ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) dtd); } static void xmlCtxtDumpAttrDecl(xmlDebugCtxtPtr ctxt, xmlAttributePtr attr) { xmlCtxtDumpSpaces(ctxt); if (attr == NULL) { if (!ctxt->check) fprintf(ctxt->output, "Attribute declaration is NULL\n"); return; } if (attr->type != XML_ATTRIBUTE_DECL) { xmlDebugErr(ctxt, XML_CHECK_NOT_ATTR_DECL, "Node is not an attribute declaration"); return; } if (attr->name != NULL) { if (!ctxt->check) fprintf(ctxt->output, "ATTRDECL(%s)", (char *) attr->name); } else xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Node attribute declaration has no name"); if (attr->elem != NULL) { if (!ctxt->check) fprintf(ctxt->output, " for %s", (char *) attr->elem); } else xmlDebugErr(ctxt, XML_CHECK_NO_ELEM, "Node attribute declaration has no element name"); if (!ctxt->check) { switch (attr->atype) { case XML_ATTRIBUTE_CDATA: fprintf(ctxt->output, " CDATA"); break; case XML_ATTRIBUTE_ID: fprintf(ctxt->output, " ID"); break; case XML_ATTRIBUTE_IDREF: fprintf(ctxt->output, " IDREF"); break; case XML_ATTRIBUTE_IDREFS: fprintf(ctxt->output, " IDREFS"); break; case XML_ATTRIBUTE_ENTITY: fprintf(ctxt->output, " ENTITY"); break; case XML_ATTRIBUTE_ENTITIES: fprintf(ctxt->output, " ENTITIES"); break; case XML_ATTRIBUTE_NMTOKEN: fprintf(ctxt->output, " NMTOKEN"); break; case XML_ATTRIBUTE_NMTOKENS: fprintf(ctxt->output, " NMTOKENS"); break; case XML_ATTRIBUTE_ENUMERATION: fprintf(ctxt->output, " ENUMERATION"); break; case XML_ATTRIBUTE_NOTATION: fprintf(ctxt->output, " NOTATION "); break; } if (attr->tree != NULL) { int indx; xmlEnumerationPtr cur = attr->tree; for (indx = 0; indx < 5; indx++) { if (indx != 0) fprintf(ctxt->output, "|%s", (char *) cur->name); else fprintf(ctxt->output, " (%s", (char *) cur->name); cur = cur->next; if (cur == NULL) break; } if (cur == NULL) fprintf(ctxt->output, ")"); else fprintf(ctxt->output, "...)"); } switch (attr->def) { case XML_ATTRIBUTE_NONE: break; case XML_ATTRIBUTE_REQUIRED: fprintf(ctxt->output, " REQUIRED"); break; case XML_ATTRIBUTE_IMPLIED: fprintf(ctxt->output, " IMPLIED"); break; case XML_ATTRIBUTE_FIXED: fprintf(ctxt->output, " FIXED"); break; } if (attr->defaultValue != NULL) { fprintf(ctxt->output, "\""); xmlCtxtDumpString(ctxt, attr->defaultValue); fprintf(ctxt->output, "\""); } fprintf(ctxt->output, "\n"); } /* * Do a bit of checking */ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr); } static void xmlCtxtDumpElemDecl(xmlDebugCtxtPtr ctxt, xmlElementPtr elem) { xmlCtxtDumpSpaces(ctxt); if (elem == NULL) { if (!ctxt->check) fprintf(ctxt->output, "Element declaration is NULL\n"); return; } if (elem->type != XML_ELEMENT_DECL) { xmlDebugErr(ctxt, XML_CHECK_NOT_ELEM_DECL, "Node is not an element declaration"); return; } if (elem->name != NULL) { if (!ctxt->check) { fprintf(ctxt->output, "ELEMDECL("); xmlCtxtDumpString(ctxt, elem->name); fprintf(ctxt->output, ")"); } } else xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Element declaration has no name"); if (!ctxt->check) { switch (elem->etype) { case XML_ELEMENT_TYPE_UNDEFINED: fprintf(ctxt->output, ", UNDEFINED"); break; case XML_ELEMENT_TYPE_EMPTY: fprintf(ctxt->output, ", EMPTY"); break; case XML_ELEMENT_TYPE_ANY: fprintf(ctxt->output, ", ANY"); break; case XML_ELEMENT_TYPE_MIXED: fprintf(ctxt->output, ", MIXED "); break; case XML_ELEMENT_TYPE_ELEMENT: fprintf(ctxt->output, ", MIXED "); break; } if ((elem->type != XML_ELEMENT_NODE) && (elem->content != NULL)) { char buf[5001]; buf[0] = 0; xmlSnprintfElementContent(buf, 5000, elem->content, 1); buf[5000] = 0; fprintf(ctxt->output, "%s", buf); } fprintf(ctxt->output, "\n"); } /* * Do a bit of checking */ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) elem); } static void xmlCtxtDumpEntityDecl(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent) { xmlCtxtDumpSpaces(ctxt); if (ent == NULL) { if (!ctxt->check) fprintf(ctxt->output, "Entity declaration is NULL\n"); return; } if (ent->type != XML_ENTITY_DECL) { xmlDebugErr(ctxt, XML_CHECK_NOT_ENTITY_DECL, "Node is not an entity declaration"); return; } if (ent->name != NULL) { if (!ctxt->check) { fprintf(ctxt->output, "ENTITYDECL("); xmlCtxtDumpString(ctxt, ent->name); fprintf(ctxt->output, ")"); } } else xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Entity declaration has no name"); if (!ctxt->check) { switch (ent->etype) { case XML_INTERNAL_GENERAL_ENTITY: fprintf(ctxt->output, ", internal\n"); break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: fprintf(ctxt->output, ", external parsed\n"); break; case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: fprintf(ctxt->output, ", unparsed\n"); break; case XML_INTERNAL_PARAMETER_ENTITY: fprintf(ctxt->output, ", parameter\n"); break; case XML_EXTERNAL_PARAMETER_ENTITY: fprintf(ctxt->output, ", external parameter\n"); break; case XML_INTERNAL_PREDEFINED_ENTITY: fprintf(ctxt->output, ", predefined\n"); break; } if (ent->ExternalID) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, " ExternalID=%s\n", (char *) ent->ExternalID); } if (ent->SystemID) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, " SystemID=%s\n", (char *) ent->SystemID); } if (ent->URI != NULL) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, " URI=%s\n", (char *) ent->URI); } if (ent->content) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, " content="); xmlCtxtDumpString(ctxt, ent->content); fprintf(ctxt->output, "\n"); } } /* * Do a bit of checking */ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) ent); } static void xmlCtxtDumpNamespace(xmlDebugCtxtPtr ctxt, xmlNsPtr ns) { xmlCtxtDumpSpaces(ctxt); if (ns == NULL) { if (!ctxt->check) fprintf(ctxt->output, "namespace node is NULL\n"); return; } if (ns->type != XML_NAMESPACE_DECL) { xmlDebugErr(ctxt, XML_CHECK_NOT_NS_DECL, "Node is not a namespace declaration"); return; } if (ns->href == NULL) { if (ns->prefix != NULL) xmlDebugErr3(ctxt, XML_CHECK_NO_HREF, "Incomplete namespace %s href=NULL\n", (char *) ns->prefix); else xmlDebugErr(ctxt, XML_CHECK_NO_HREF, "Incomplete default namespace href=NULL\n"); } else { if (!ctxt->check) { if (ns->prefix != NULL) fprintf(ctxt->output, "namespace %s href=", (char *) ns->prefix); else fprintf(ctxt->output, "default namespace href="); xmlCtxtDumpString(ctxt, ns->href); fprintf(ctxt->output, "\n"); } } } static void xmlCtxtDumpNamespaceList(xmlDebugCtxtPtr ctxt, xmlNsPtr ns) { while (ns != NULL) { xmlCtxtDumpNamespace(ctxt, ns); ns = ns->next; } } static void xmlCtxtDumpEntity(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent) { xmlCtxtDumpSpaces(ctxt); if (ent == NULL) { if (!ctxt->check) fprintf(ctxt->output, "Entity is NULL\n"); return; } if (!ctxt->check) { switch (ent->etype) { case XML_INTERNAL_GENERAL_ENTITY: fprintf(ctxt->output, "INTERNAL_GENERAL_ENTITY "); break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: fprintf(ctxt->output, "EXTERNAL_GENERAL_PARSED_ENTITY "); break; case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: fprintf(ctxt->output, "EXTERNAL_GENERAL_UNPARSED_ENTITY "); break; case XML_INTERNAL_PARAMETER_ENTITY: fprintf(ctxt->output, "INTERNAL_PARAMETER_ENTITY "); break; case XML_EXTERNAL_PARAMETER_ENTITY: fprintf(ctxt->output, "EXTERNAL_PARAMETER_ENTITY "); break; default: fprintf(ctxt->output, "ENTITY_%d ! ", (int) ent->etype); } fprintf(ctxt->output, "%s\n", ent->name); if (ent->ExternalID) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "ExternalID=%s\n", (char *) ent->ExternalID); } if (ent->SystemID) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "SystemID=%s\n", (char *) ent->SystemID); } if (ent->URI) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "URI=%s\n", (char *) ent->URI); } if (ent->content) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "content="); xmlCtxtDumpString(ctxt, ent->content); fprintf(ctxt->output, "\n"); } } } /** * xmlCtxtDumpAttr: * @output: the FILE * for the output * @attr: the attribute * @depth: the indentation level. * * Dumps debug information for the attribute */ static void xmlCtxtDumpAttr(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr) { xmlCtxtDumpSpaces(ctxt); if (attr == NULL) { if (!ctxt->check) fprintf(ctxt->output, "Attr is NULL"); return; } if (!ctxt->check) { fprintf(ctxt->output, "ATTRIBUTE "); xmlCtxtDumpString(ctxt, attr->name); fprintf(ctxt->output, "\n"); if (attr->children != NULL) { ctxt->depth++; xmlCtxtDumpNodeList(ctxt, attr->children); ctxt->depth--; } } if (attr->name == NULL) xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Attribute has no name"); /* * Do a bit of checking */ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr); } /** * xmlCtxtDumpAttrList: * @output: the FILE * for the output * @attr: the attribute list * @depth: the indentation level. * * Dumps debug information for the attribute list */ static void xmlCtxtDumpAttrList(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr) { while (attr != NULL) { xmlCtxtDumpAttr(ctxt, attr); attr = attr->next; } } /** * xmlCtxtDumpOneNode: * @output: the FILE * for the output * @node: the node * @depth: the indentation level. * * Dumps debug information for the element node, it is not recursive */ static void xmlCtxtDumpOneNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node) { if (node == NULL) { if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "node is NULL\n"); } return; } ctxt->node = node; switch (node->type) { case XML_ELEMENT_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "ELEMENT "); if ((node->ns != NULL) && (node->ns->prefix != NULL)) { xmlCtxtDumpString(ctxt, node->ns->prefix); fprintf(ctxt->output, ":"); } xmlCtxtDumpString(ctxt, node->name); fprintf(ctxt->output, "\n"); } break; case XML_ATTRIBUTE_NODE: if (!ctxt->check) xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "Error, ATTRIBUTE found here\n"); xmlCtxtGenericNodeCheck(ctxt, node); return; case XML_TEXT_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); if (node->name == (const xmlChar *) xmlStringTextNoenc) fprintf(ctxt->output, "TEXT no enc"); else fprintf(ctxt->output, "TEXT"); if (ctxt->options & DUMP_TEXT_TYPE) { if (node->content == (xmlChar *) &(node->properties)) fprintf(ctxt->output, " compact\n"); else if (xmlDictOwns(ctxt->dict, node->content) == 1) fprintf(ctxt->output, " interned\n"); else fprintf(ctxt->output, "\n"); } else fprintf(ctxt->output, "\n"); } break; case XML_CDATA_SECTION_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "CDATA_SECTION\n"); } break; case XML_ENTITY_REF_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "ENTITY_REF(%s)\n", (char *) node->name); } break; case XML_ENTITY_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "ENTITY\n"); } break; case XML_PI_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "PI %s\n", (char *) node->name); } break; case XML_COMMENT_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "COMMENT\n"); } break; case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); } fprintf(ctxt->output, "Error, DOCUMENT found here\n"); xmlCtxtGenericNodeCheck(ctxt, node); return; case XML_DOCUMENT_TYPE_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "DOCUMENT_TYPE\n"); } break; case XML_DOCUMENT_FRAG_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "DOCUMENT_FRAG\n"); } break; case XML_NOTATION_NODE: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "NOTATION\n"); } break; case XML_DTD_NODE: xmlCtxtDumpDtdNode(ctxt, (xmlDtdPtr) node); return; case XML_ELEMENT_DECL: xmlCtxtDumpElemDecl(ctxt, (xmlElementPtr) node); return; case XML_ATTRIBUTE_DECL: xmlCtxtDumpAttrDecl(ctxt, (xmlAttributePtr) node); return; case XML_ENTITY_DECL: xmlCtxtDumpEntityDecl(ctxt, (xmlEntityPtr) node); return; case XML_NAMESPACE_DECL: xmlCtxtDumpNamespace(ctxt, (xmlNsPtr) node); return; case XML_XINCLUDE_START: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "INCLUDE START\n"); } return; case XML_XINCLUDE_END: if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "INCLUDE END\n"); } return; default: if (!ctxt->check) xmlCtxtDumpSpaces(ctxt); xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE, "Unknown node type %d\n", node->type); return; } if (node->doc == NULL) { if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); } fprintf(ctxt->output, "PBM: doc == NULL !!!\n"); } ctxt->depth++; if ((node->type == XML_ELEMENT_NODE) && (node->nsDef != NULL)) xmlCtxtDumpNamespaceList(ctxt, node->nsDef); if ((node->type == XML_ELEMENT_NODE) && (node->properties != NULL)) xmlCtxtDumpAttrList(ctxt, node->properties); if (node->type != XML_ENTITY_REF_NODE) { if ((node->type != XML_ELEMENT_NODE) && (node->content != NULL)) { if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "content="); xmlCtxtDumpString(ctxt, node->content); fprintf(ctxt->output, "\n"); } } } else { xmlEntityPtr ent; ent = xmlGetDocEntity(node->doc, node->name); if (ent != NULL) xmlCtxtDumpEntity(ctxt, ent); } ctxt->depth--; /* * Do a bit of checking */ xmlCtxtGenericNodeCheck(ctxt, node); } /** * xmlCtxtDumpNode: * @output: the FILE * for the output * @node: the node * @depth: the indentation level. * * Dumps debug information for the element node, it is recursive */ static void xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node) { if (node == NULL) { if (!ctxt->check) { xmlCtxtDumpSpaces(ctxt); fprintf(ctxt->output, "node is NULL\n"); } return; } xmlCtxtDumpOneNode(ctxt, node); if ((node->type != XML_NAMESPACE_DECL) && (node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { ctxt->depth++; xmlCtxtDumpNodeList(ctxt, node->children); ctxt->depth--; } } /** * xmlCtxtDumpNodeList: * @output: the FILE * for the output * @node: the node list * @depth: the indentation level. * * Dumps debug information for the list of element node, it is recursive */ static void xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node) { while (node != NULL) { xmlCtxtDumpNode(ctxt, node); node = node->next; } } static void xmlCtxtDumpDocHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) { if (doc == NULL) { if (!ctxt->check) fprintf(ctxt->output, "DOCUMENT == NULL !\n"); return; } ctxt->node = (xmlNodePtr) doc; switch (doc->type) { case XML_ELEMENT_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_ELEMENT, "Misplaced ELEMENT node\n"); break; case XML_ATTRIBUTE_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_ATTRIBUTE, "Misplaced ATTRIBUTE node\n"); break; case XML_TEXT_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_TEXT, "Misplaced TEXT node\n"); break; case XML_CDATA_SECTION_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_CDATA, "Misplaced CDATA node\n"); break; case XML_ENTITY_REF_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITYREF, "Misplaced ENTITYREF node\n"); break; case XML_ENTITY_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITY, "Misplaced ENTITY node\n"); break; case XML_PI_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_PI, "Misplaced PI node\n"); break; case XML_COMMENT_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_COMMENT, "Misplaced COMMENT node\n"); break; case XML_DOCUMENT_NODE: if (!ctxt->check) fprintf(ctxt->output, "DOCUMENT\n"); break; case XML_HTML_DOCUMENT_NODE: if (!ctxt->check) fprintf(ctxt->output, "HTML DOCUMENT\n"); break; case XML_DOCUMENT_TYPE_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_DOCTYPE, "Misplaced DOCTYPE node\n"); break; case XML_DOCUMENT_FRAG_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_FRAGMENT, "Misplaced FRAGMENT node\n"); break; case XML_NOTATION_NODE: xmlDebugErr(ctxt, XML_CHECK_FOUND_NOTATION, "Misplaced NOTATION node\n"); break; default: xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE, "Unknown node type %d\n", doc->type); } } /** * xmlCtxtDumpDocumentHead: * @output: the FILE * for the output * @doc: the document * * Dumps debug information cncerning the document, not recursive */ static void xmlCtxtDumpDocumentHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) { if (doc == NULL) return; xmlCtxtDumpDocHead(ctxt, doc); if (!ctxt->check) { if (doc->name != NULL) { fprintf(ctxt->output, "name="); xmlCtxtDumpString(ctxt, BAD_CAST doc->name); fprintf(ctxt->output, "\n"); } if (doc->version != NULL) { fprintf(ctxt->output, "version="); xmlCtxtDumpString(ctxt, doc->version); fprintf(ctxt->output, "\n"); } if (doc->encoding != NULL) { fprintf(ctxt->output, "encoding="); xmlCtxtDumpString(ctxt, doc->encoding); fprintf(ctxt->output, "\n"); } if (doc->URL != NULL) { fprintf(ctxt->output, "URL="); xmlCtxtDumpString(ctxt, doc->URL); fprintf(ctxt->output, "\n"); } if (doc->standalone) fprintf(ctxt->output, "standalone=true\n"); } if (doc->oldNs != NULL) xmlCtxtDumpNamespaceList(ctxt, doc->oldNs); } /** * xmlCtxtDumpDocument: * @output: the FILE * for the output * @doc: the document * * Dumps debug information for the document, it's recursive */ static void xmlCtxtDumpDocument(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) { if (doc == NULL) { if (!ctxt->check) fprintf(ctxt->output, "DOCUMENT == NULL !\n"); return; } xmlCtxtDumpDocumentHead(ctxt, doc); if (((doc->type == XML_DOCUMENT_NODE) || (doc->type == XML_HTML_DOCUMENT_NODE)) && (doc->children != NULL)) { ctxt->depth++; xmlCtxtDumpNodeList(ctxt, doc->children); ctxt->depth--; } } static void xmlCtxtDumpEntityCallback(xmlEntityPtr cur, xmlDebugCtxtPtr ctxt) { if (cur == NULL) { if (!ctxt->check) fprintf(ctxt->output, "Entity is NULL"); return; } if (!ctxt->check) { fprintf(ctxt->output, "%s : ", (char *) cur->name); switch (cur->etype) { case XML_INTERNAL_GENERAL_ENTITY: fprintf(ctxt->output, "INTERNAL GENERAL, "); break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: fprintf(ctxt->output, "EXTERNAL PARSED, "); break; case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: fprintf(ctxt->output, "EXTERNAL UNPARSED, "); break; case XML_INTERNAL_PARAMETER_ENTITY: fprintf(ctxt->output, "INTERNAL PARAMETER, "); break; case XML_EXTERNAL_PARAMETER_ENTITY: fprintf(ctxt->output, "EXTERNAL PARAMETER, "); break; default: xmlDebugErr2(ctxt, XML_CHECK_ENTITY_TYPE, "Unknown entity type %d\n", cur->etype); } if (cur->ExternalID != NULL) fprintf(ctxt->output, "ID \"%s\"", (char *) cur->ExternalID); if (cur->SystemID != NULL) fprintf(ctxt->output, "SYSTEM \"%s\"", (char *) cur->SystemID); if (cur->orig != NULL) fprintf(ctxt->output, "\n orig \"%s\"", (char *) cur->orig); if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) fprintf(ctxt->output, "\n content \"%s\"", (char *) cur->content); fprintf(ctxt->output, "\n"); } } /** * xmlCtxtDumpEntities: * @output: the FILE * for the output * @doc: the document * * Dumps debug information for all the entities in use by the document */ static void xmlCtxtDumpEntities(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) { if (doc == NULL) return; xmlCtxtDumpDocHead(ctxt, doc); if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) doc->intSubset->entities; if (!ctxt->check) fprintf(ctxt->output, "Entities in internal subset\n"); xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback, ctxt); } else fprintf(ctxt->output, "No entities in internal subset\n"); if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) doc->extSubset->entities; if (!ctxt->check) fprintf(ctxt->output, "Entities in external subset\n"); xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback, ctxt); } else if (!ctxt->check) fprintf(ctxt->output, "No entities in external subset\n"); } /** * xmlCtxtDumpDTD: * @output: the FILE * for the output * @dtd: the DTD * * Dumps debug information for the DTD */ static void xmlCtxtDumpDTD(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd) { if (dtd == NULL) { if (!ctxt->check) fprintf(ctxt->output, "DTD is NULL\n"); return; } xmlCtxtDumpDtdNode(ctxt, dtd); if (dtd->children == NULL) fprintf(ctxt->output, " DTD is empty\n"); else { ctxt->depth++; xmlCtxtDumpNodeList(ctxt, dtd->children); ctxt->depth--; } } /************************************************************************ * * * Public entry points for dump * * * ************************************************************************/ /** * xmlDebugDumpString: * @output: the FILE * for the output * @str: the string * * Dumps informations about the string, shorten it if necessary */ void xmlDebugDumpString(FILE * output, const xmlChar * str) { int i; if (output == NULL) output = stdout; if (str == NULL) { fprintf(output, "(NULL)"); return; } for (i = 0; i < 40; i++) if (str[i] == 0) return; else if (IS_BLANK_CH(str[i])) fputc(' ', output); else if (str[i] >= 0x80) fprintf(output, "#%X", str[i]); else fputc(str[i], output); fprintf(output, "..."); } /** * xmlDebugDumpAttr: * @output: the FILE * for the output * @attr: the attribute * @depth: the indentation level. * * Dumps debug information for the attribute */ void xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) { xmlDebugCtxt ctxt; if (output == NULL) return; xmlCtxtDumpInitCtxt(&ctxt); ctxt.output = output; ctxt.depth = depth; xmlCtxtDumpAttr(&ctxt, attr); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpEntities: * @output: the FILE * for the output * @doc: the document * * Dumps debug information for all the entities in use by the document */ void xmlDebugDumpEntities(FILE * output, xmlDocPtr doc) { xmlDebugCtxt ctxt; if (output == NULL) return; xmlCtxtDumpInitCtxt(&ctxt); ctxt.output = output; xmlCtxtDumpEntities(&ctxt, doc); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpAttrList: * @output: the FILE * for the output * @attr: the attribute list * @depth: the indentation level. * * Dumps debug information for the attribute list */ void xmlDebugDumpAttrList(FILE * output, xmlAttrPtr attr, int depth) { xmlDebugCtxt ctxt; if (output == NULL) return; xmlCtxtDumpInitCtxt(&ctxt); ctxt.output = output; ctxt.depth = depth; xmlCtxtDumpAttrList(&ctxt, attr); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpOneNode: * @output: the FILE * for the output * @node: the node * @depth: the indentation level. * * Dumps debug information for the element node, it is not recursive */ void xmlDebugDumpOneNode(FILE * output, xmlNodePtr node, int depth) { xmlDebugCtxt ctxt; if (output == NULL) return; xmlCtxtDumpInitCtxt(&ctxt); ctxt.output = output; ctxt.depth = depth; xmlCtxtDumpOneNode(&ctxt, node); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpNode: * @output: the FILE * for the output * @node: the node * @depth: the indentation level. * * Dumps debug information for the element node, it is recursive */ void xmlDebugDumpNode(FILE * output, xmlNodePtr node, int depth) { xmlDebugCtxt ctxt; if (output == NULL) output = stdout; xmlCtxtDumpInitCtxt(&ctxt); ctxt.output = output; ctxt.depth = depth; xmlCtxtDumpNode(&ctxt, node); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpNodeList: * @output: the FILE * for the output * @node: the node list * @depth: the indentation level. * * Dumps debug information for the list of element node, it is recursive */ void xmlDebugDumpNodeList(FILE * output, xmlNodePtr node, int depth) { xmlDebugCtxt ctxt; if (output == NULL) output = stdout; xmlCtxtDumpInitCtxt(&ctxt); ctxt.output = output; ctxt.depth = depth; xmlCtxtDumpNodeList(&ctxt, node); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpDocumentHead: * @output: the FILE * for the output * @doc: the document * * Dumps debug information cncerning the document, not recursive */ void xmlDebugDumpDocumentHead(FILE * output, xmlDocPtr doc) { xmlDebugCtxt ctxt; if (output == NULL) output = stdout; xmlCtxtDumpInitCtxt(&ctxt); ctxt.options |= DUMP_TEXT_TYPE; ctxt.output = output; xmlCtxtDumpDocumentHead(&ctxt, doc); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpDocument: * @output: the FILE * for the output * @doc: the document * * Dumps debug information for the document, it's recursive */ void xmlDebugDumpDocument(FILE * output, xmlDocPtr doc) { xmlDebugCtxt ctxt; if (output == NULL) output = stdout; xmlCtxtDumpInitCtxt(&ctxt); ctxt.options |= DUMP_TEXT_TYPE; ctxt.output = output; xmlCtxtDumpDocument(&ctxt, doc); xmlCtxtDumpCleanCtxt(&ctxt); } /** * xmlDebugDumpDTD: * @output: the FILE * for the output * @dtd: the DTD * * Dumps debug information for the DTD */ void xmlDebugDumpDTD(FILE * output, xmlDtdPtr dtd) { xmlDebugCtxt ctxt; if (output == NULL) output = stdout; xmlCtxtDumpInitCtxt(&ctxt); ctxt.options |= DUMP_TEXT_TYPE; ctxt.output = output; xmlCtxtDumpDTD(&ctxt, dtd); xmlCtxtDumpCleanCtxt(&ctxt); } /************************************************************************ * * * Public entry points for checkings * * * ************************************************************************/ /** * xmlDebugCheckDocument: * @output: the FILE * for the output * @doc: the document * * Check the document for potential content problems, and output * the errors to @output * * Returns the number of errors found */ int xmlDebugCheckDocument(FILE * output, xmlDocPtr doc) { xmlDebugCtxt ctxt; if (output == NULL) output = stdout; xmlCtxtDumpInitCtxt(&ctxt); ctxt.output = output; ctxt.check = 1; xmlCtxtDumpDocument(&ctxt, doc); xmlCtxtDumpCleanCtxt(&ctxt); return(ctxt.errors); } /************************************************************************ * * * Helpers for Shell * * * ************************************************************************/ /** * xmlLsCountNode: * @node: the node to count * * Count the children of @node. * * Returns the number of children of @node. */ int xmlLsCountNode(xmlNodePtr node) { int ret = 0; xmlNodePtr list = NULL; if (node == NULL) return(0); switch (node->type) { case XML_ELEMENT_NODE: list = node->children; break; case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_DOCB_ENABLED case XML_DOCB_DOCUMENT_NODE: #endif list = ((xmlDocPtr) node)->children; break; case XML_ATTRIBUTE_NODE: list = ((xmlAttrPtr) node)->children; break; case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: if (node->content != NULL) { ret = xmlStrlen(node->content); } break; case XML_ENTITY_REF_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_ENTITY_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_NOTATION_NODE: case XML_DTD_NODE: case XML_ELEMENT_DECL: case XML_ATTRIBUTE_DECL: case XML_ENTITY_DECL: case XML_NAMESPACE_DECL: case XML_XINCLUDE_START: case XML_XINCLUDE_END: ret = 1; break; } for (;list != NULL;ret++) list = list->next; return(ret); } /** * xmlLsOneNode: * @output: the FILE * for the output * @node: the node to dump * * Dump to @output the type and name of @node. */ void xmlLsOneNode(FILE *output, xmlNodePtr node) { if (output == NULL) return; if (node == NULL) { fprintf(output, "NULL\n"); return; } switch (node->type) { case XML_ELEMENT_NODE: fprintf(output, "-"); break; case XML_ATTRIBUTE_NODE: fprintf(output, "a"); break; case XML_TEXT_NODE: fprintf(output, "t"); break; case XML_CDATA_SECTION_NODE: fprintf(output, "C"); break; case XML_ENTITY_REF_NODE: fprintf(output, "e"); break; case XML_ENTITY_NODE: fprintf(output, "E"); break; case XML_PI_NODE: fprintf(output, "p"); break; case XML_COMMENT_NODE: fprintf(output, "c"); break; case XML_DOCUMENT_NODE: fprintf(output, "d"); break; case XML_HTML_DOCUMENT_NODE: fprintf(output, "h"); break; case XML_DOCUMENT_TYPE_NODE: fprintf(output, "T"); break; case XML_DOCUMENT_FRAG_NODE: fprintf(output, "F"); break; case XML_NOTATION_NODE: fprintf(output, "N"); break; case XML_NAMESPACE_DECL: fprintf(output, "n"); break; default: fprintf(output, "?"); } if (node->type != XML_NAMESPACE_DECL) { if (node->properties != NULL) fprintf(output, "a"); else fprintf(output, "-"); if (node->nsDef != NULL) fprintf(output, "n"); else fprintf(output, "-"); } fprintf(output, " %8d ", xmlLsCountNode(node)); switch (node->type) { case XML_ELEMENT_NODE: if (node->name != NULL) { if ((node->ns != NULL) && (node->ns->prefix != NULL)) fprintf(output, "%s:", node->ns->prefix); fprintf(output, "%s", (const char *) node->name); } break; case XML_ATTRIBUTE_NODE: if (node->name != NULL) fprintf(output, "%s", (const char *) node->name); break; case XML_TEXT_NODE: if (node->content != NULL) { xmlDebugDumpString(output, node->content); } break; case XML_CDATA_SECTION_NODE: break; case XML_ENTITY_REF_NODE: if (node->name != NULL) fprintf(output, "%s", (const char *) node->name); break; case XML_ENTITY_NODE: if (node->name != NULL) fprintf(output, "%s", (const char *) node->name); break; case XML_PI_NODE: if (node->name != NULL) fprintf(output, "%s", (const char *) node->name); break; case XML_COMMENT_NODE: break; case XML_DOCUMENT_NODE: break; case XML_HTML_DOCUMENT_NODE: break; case XML_DOCUMENT_TYPE_NODE: break; case XML_DOCUMENT_FRAG_NODE: break; case XML_NOTATION_NODE: break; case XML_NAMESPACE_DECL: { xmlNsPtr ns = (xmlNsPtr) node; if (ns->prefix == NULL) fprintf(output, "default -> %s", (char *)ns->href); else fprintf(output, "%s -> %s", (char *)ns->prefix, (char *)ns->href); break; } default: if (node->name != NULL) fprintf(output, "%s", (const char *) node->name); } fprintf(output, "\n"); } /** * xmlBoolToText: * @boolval: a bool to turn into text * * Convenient way to turn bool into text * * Returns a pointer to either "True" or "False" */ const char * xmlBoolToText(int boolval) { if (boolval) return("True"); else return("False"); } #ifdef LIBXML_XPATH_ENABLED /**************************************************************** * * * The XML shell related functions * * * ****************************************************************/ /* * TODO: Improvement/cleanups for the XML shell * - allow to shell out an editor on a subpart * - cleanup function registrations (with help) and calling * - provide registration routines */ /** * xmlShellPrintXPathError: * @errorType: valid xpath error id * @arg: the argument that cause xpath to fail * * Print the xpath error to libxml default error channel */ void xmlShellPrintXPathError(int errorType, const char *arg) { const char *default_arg = "Result"; if (!arg) arg = default_arg; switch (errorType) { case XPATH_UNDEFINED: xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); break; case XPATH_BOOLEAN: xmlGenericError(xmlGenericErrorContext, "%s is a Boolean\n", arg); break; case XPATH_NUMBER: xmlGenericError(xmlGenericErrorContext, "%s is a number\n", arg); break; case XPATH_STRING: xmlGenericError(xmlGenericErrorContext, "%s is a string\n", arg); break; case XPATH_POINT: xmlGenericError(xmlGenericErrorContext, "%s is a point\n", arg); break; case XPATH_RANGE: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_LOCATIONSET: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_USERS: xmlGenericError(xmlGenericErrorContext, "%s is user-defined\n", arg); break; case XPATH_XSLT_TREE: xmlGenericError(xmlGenericErrorContext, "%s is an XSLT value tree\n", arg); break; } #if 0 xmlGenericError(xmlGenericErrorContext, "Try casting the result string function (xpath builtin)\n", arg); #endif } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlShellPrintNodeCtxt: * @ctxt : a non-null shell context * @node : a non-null node to print to the output FILE * * Print node to the output FILE */ static void xmlShellPrintNodeCtxt(xmlShellCtxtPtr ctxt,xmlNodePtr node) { FILE *fp; if (!node) return; if (ctxt == NULL) fp = stdout; else fp = ctxt->output; if (node->type == XML_DOCUMENT_NODE) xmlDocDump(fp, (xmlDocPtr) node); else if (node->type == XML_ATTRIBUTE_NODE) xmlDebugDumpAttrList(fp, (xmlAttrPtr) node, 0); else xmlElemDump(fp, node->doc, node); fprintf(fp, "\n"); } /** * xmlShellPrintNode: * @node : a non-null node to print to the output FILE * * Print node to the output FILE */ void xmlShellPrintNode(xmlNodePtr node) { xmlShellPrintNodeCtxt(NULL, node); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlShellPrintXPathResultCtxt: * @ctxt: a valid shell context * @list: a valid result generated by an xpath evaluation * * Prints result to the output FILE */ static void xmlShellPrintXPathResultCtxt(xmlShellCtxtPtr ctxt,xmlXPathObjectPtr list) { if (!ctxt) return; if (list != NULL) { switch (list->type) { case XPATH_NODESET:{ #ifdef LIBXML_OUTPUT_ENABLED int indx; if (list->nodesetval) { for (indx = 0; indx < list->nodesetval->nodeNr; indx++) { xmlShellPrintNodeCtxt(ctxt, list->nodesetval->nodeTab[indx]); } } else { xmlGenericError(xmlGenericErrorContext, "Empty node set\n"); } break; #else xmlGenericError(xmlGenericErrorContext, "Node set\n"); #endif /* LIBXML_OUTPUT_ENABLED */ } case XPATH_BOOLEAN: xmlGenericError(xmlGenericErrorContext, "Is a Boolean:%s\n", xmlBoolToText(list->boolval)); break; case XPATH_NUMBER: xmlGenericError(xmlGenericErrorContext, "Is a number:%0g\n", list->floatval); break; case XPATH_STRING: xmlGenericError(xmlGenericErrorContext, "Is a string:%s\n", list->stringval); break; default: xmlShellPrintXPathError(list->type, NULL); } } } /** * xmlShellPrintXPathResult: * @list: a valid result generated by an xpath evaluation * * Prints result to the output FILE */ void xmlShellPrintXPathResult(xmlXPathObjectPtr list) { xmlShellPrintXPathResultCtxt(NULL, list); } /** * xmlShellList: * @ctxt: the shell context * @arg: unused * @node: a node * @node2: unused * * Implements the XML shell function "ls" * Does an Unix like listing of the given node (like a directory) * * Returns 0 */ int xmlShellList(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlNodePtr cur; if (!ctxt) return (0); if (node == NULL) { fprintf(ctxt->output, "NULL\n"); return (0); } if ((node->type == XML_DOCUMENT_NODE) || (node->type == XML_HTML_DOCUMENT_NODE)) { cur = ((xmlDocPtr) node)->children; } else if (node->type == XML_NAMESPACE_DECL) { xmlLsOneNode(ctxt->output, node); return (0); } else if (node->children != NULL) { cur = node->children; } else { xmlLsOneNode(ctxt->output, node); return (0); } while (cur != NULL) { xmlLsOneNode(ctxt->output, cur); cur = cur->next; } return (0); } /** * xmlShellBase: * @ctxt: the shell context * @arg: unused * @node: a node * @node2: unused * * Implements the XML shell function "base" * dumps the current XML base of the node * * Returns 0 */ int xmlShellBase(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlChar *base; if (!ctxt) return 0; if (node == NULL) { fprintf(ctxt->output, "NULL\n"); return (0); } base = xmlNodeGetBase(node->doc, node); if (base == NULL) { fprintf(ctxt->output, " No base found !!!\n"); } else { fprintf(ctxt->output, "%s\n", base); xmlFree(base); } return (0); } #ifdef LIBXML_TREE_ENABLED /** * xmlShellSetBase: * @ctxt: the shell context * @arg: the new base * @node: a node * @node2: unused * * Implements the XML shell function "setbase" * change the current XML base of the node * * Returns 0 */ static int xmlShellSetBase(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlNodeSetBase(node, (xmlChar*) arg); return (0); } #endif #ifdef LIBXML_XPATH_ENABLED /** * xmlShellRegisterNamespace: * @ctxt: the shell context * @arg: a string in prefix=nsuri format * @node: unused * @node2: unused * * Implements the XML shell function "setns" * register/unregister a prefix=namespace pair * on the XPath context * * Returns 0 on success and a negative value otherwise. */ static int xmlShellRegisterNamespace(xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlChar* nsListDup; xmlChar* prefix; xmlChar* href; xmlChar* next; nsListDup = xmlStrdup((xmlChar *) arg); next = nsListDup; while(next != NULL) { /* skip spaces */ /*while((*next) == ' ') next++;*/ if((*next) == '\0') break; /* find prefix */ prefix = next; next = (xmlChar*)xmlStrchr(next, '='); if(next == NULL) { fprintf(ctxt->output, "setns: prefix=[nsuri] required\n"); xmlFree(nsListDup); return(-1); } *(next++) = '\0'; /* find href */ href = next; next = (xmlChar*)xmlStrchr(next, ' '); if(next != NULL) { *(next++) = '\0'; } /* do register namespace */ if(xmlXPathRegisterNs(ctxt->pctxt, prefix, href) != 0) { fprintf(ctxt->output,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", prefix, href); xmlFree(nsListDup); return(-1); } } xmlFree(nsListDup); return(0); } /** * xmlShellRegisterRootNamespaces: * @ctxt: the shell context * @arg: unused * @node: the root element * @node2: unused * * Implements the XML shell function "setrootns" * which registers all namespaces declarations found on the root element. * * Returns 0 on success and a negative value otherwise. */ static int xmlShellRegisterRootNamespaces(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, xmlNodePtr root, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlNsPtr ns; if ((root == NULL) || (root->type != XML_ELEMENT_NODE) || (root->nsDef == NULL) || (ctxt == NULL) || (ctxt->pctxt == NULL)) return(-1); ns = root->nsDef; while (ns != NULL) { if (ns->prefix == NULL) xmlXPathRegisterNs(ctxt->pctxt, BAD_CAST "defaultns", ns->href); else xmlXPathRegisterNs(ctxt->pctxt, ns->prefix, ns->href); ns = ns->next; } return(0); } #endif /** * xmlShellGrep: * @ctxt: the shell context * @arg: the string or regular expression to find * @node: a node * @node2: unused * * Implements the XML shell function "grep" * dumps informations about the node (namespace, attributes, content). * * Returns 0 */ static int xmlShellGrep(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *arg, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { if (!ctxt) return (0); if (node == NULL) return (0); if (arg == NULL) return (0); #ifdef LIBXML_REGEXP_ENABLED if ((xmlStrchr((xmlChar *) arg, '?')) || (xmlStrchr((xmlChar *) arg, '*')) || (xmlStrchr((xmlChar *) arg, '.')) || (xmlStrchr((xmlChar *) arg, '['))) { } #endif while (node != NULL) { if (node->type == XML_COMMENT_NODE) { if (xmlStrstr(node->content, (xmlChar *) arg)) { fprintf(ctxt->output, "%s : ", xmlGetNodePath(node)); xmlShellList(ctxt, NULL, node, NULL); } } else if (node->type == XML_TEXT_NODE) { if (xmlStrstr(node->content, (xmlChar *) arg)) { fprintf(ctxt->output, "%s : ", xmlGetNodePath(node->parent)); xmlShellList(ctxt, NULL, node->parent, NULL); } } /* * Browse the full subtree, deep first */ if ((node->type == XML_DOCUMENT_NODE) || (node->type == XML_HTML_DOCUMENT_NODE)) { node = ((xmlDocPtr) node)->children; } else if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { /* deep first */ node = node->children; } else if (node->next != NULL) { /* then siblings */ node = node->next; } else { /* go up to parents->next if needed */ while (node != NULL) { if (node->parent != NULL) { node = node->parent; } if (node->next != NULL) { node = node->next; break; } if (node->parent == NULL) { node = NULL; break; } } } } return (0); } /** * xmlShellDir: * @ctxt: the shell context * @arg: unused * @node: a node * @node2: unused * * Implements the XML shell function "dir" * dumps informations about the node (namespace, attributes, content). * * Returns 0 */ int xmlShellDir(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { if (!ctxt) return (0); if (node == NULL) { fprintf(ctxt->output, "NULL\n"); return (0); } if ((node->type == XML_DOCUMENT_NODE) || (node->type == XML_HTML_DOCUMENT_NODE)) { xmlDebugDumpDocumentHead(ctxt->output, (xmlDocPtr) node); } else if (node->type == XML_ATTRIBUTE_NODE) { xmlDebugDumpAttr(ctxt->output, (xmlAttrPtr) node, 0); } else { xmlDebugDumpOneNode(ctxt->output, node, 0); } return (0); } /** * xmlShellSetContent: * @ctxt: the shell context * @value: the content as a string * @node: a node * @node2: unused * * Implements the XML shell function "dir" * dumps informations about the node (namespace, attributes, content). * * Returns 0 */ static int xmlShellSetContent(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *value, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlNodePtr results; xmlParserErrors ret; if (!ctxt) return (0); if (node == NULL) { fprintf(ctxt->output, "NULL\n"); return (0); } if (value == NULL) { fprintf(ctxt->output, "NULL\n"); return (0); } ret = xmlParseInNodeContext(node, value, strlen(value), 0, &results); if (ret == XML_ERR_OK) { if (node->children != NULL) { xmlFreeNodeList(node->children); node->children = NULL; node->last = NULL; } xmlAddChildList(node, results); } else { fprintf(ctxt->output, "failed to parse content\n"); } return (0); } #ifdef LIBXML_SCHEMAS_ENABLED /** * xmlShellRNGValidate: * @ctxt: the shell context * @schemas: the path to the Relax-NG schemas * @node: a node * @node2: unused * * Implements the XML shell function "relaxng" * validating the instance against a Relax-NG schemas * * Returns 0 */ static int xmlShellRNGValidate(xmlShellCtxtPtr sctxt, char *schemas, xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlRelaxNGPtr relaxngschemas; xmlRelaxNGParserCtxtPtr ctxt; xmlRelaxNGValidCtxtPtr vctxt; int ret; ctxt = xmlRelaxNGNewParserCtxt(schemas); xmlRelaxNGSetParserErrors(ctxt, (xmlRelaxNGValidityErrorFunc) fprintf, (xmlRelaxNGValidityWarningFunc) fprintf, stderr); relaxngschemas = xmlRelaxNGParse(ctxt); xmlRelaxNGFreeParserCtxt(ctxt); if (relaxngschemas == NULL) { xmlGenericError(xmlGenericErrorContext, "Relax-NG schema %s failed to compile\n", schemas); return(-1); } vctxt = xmlRelaxNGNewValidCtxt(relaxngschemas); xmlRelaxNGSetValidErrors(vctxt, (xmlRelaxNGValidityErrorFunc) fprintf, (xmlRelaxNGValidityWarningFunc) fprintf, stderr); ret = xmlRelaxNGValidateDoc(vctxt, sctxt->doc); if (ret == 0) { fprintf(stderr, "%s validates\n", sctxt->filename); } else if (ret > 0) { fprintf(stderr, "%s fails to validate\n", sctxt->filename); } else { fprintf(stderr, "%s validation generated an internal error\n", sctxt->filename); } xmlRelaxNGFreeValidCtxt(vctxt); if (relaxngschemas != NULL) xmlRelaxNGFree(relaxngschemas); return(0); } #endif #ifdef LIBXML_OUTPUT_ENABLED /** * xmlShellCat: * @ctxt: the shell context * @arg: unused * @node: a node * @node2: unused * * Implements the XML shell function "cat" * dumps the serialization node content (XML or HTML). * * Returns 0 */ int xmlShellCat(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { if (!ctxt) return (0); if (node == NULL) { fprintf(ctxt->output, "NULL\n"); return (0); } if (ctxt->doc->type == XML_HTML_DOCUMENT_NODE) { #ifdef LIBXML_HTML_ENABLED if (node->type == XML_HTML_DOCUMENT_NODE) htmlDocDump(ctxt->output, (htmlDocPtr) node); else htmlNodeDumpFile(ctxt->output, ctxt->doc, node); #else if (node->type == XML_DOCUMENT_NODE) xmlDocDump(ctxt->output, (xmlDocPtr) node); else xmlElemDump(ctxt->output, ctxt->doc, node); #endif /* LIBXML_HTML_ENABLED */ } else { if (node->type == XML_DOCUMENT_NODE) xmlDocDump(ctxt->output, (xmlDocPtr) node); else xmlElemDump(ctxt->output, ctxt->doc, node); } fprintf(ctxt->output, "\n"); return (0); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * xmlShellLoad: * @ctxt: the shell context * @filename: the file name * @node: unused * @node2: unused * * Implements the XML shell function "load" * loads a new document specified by the filename * * Returns 0 or -1 if loading failed */ int xmlShellLoad(xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlDocPtr doc; int html = 0; if ((ctxt == NULL) || (filename == NULL)) return(-1); if (ctxt->doc != NULL) html = (ctxt->doc->type == XML_HTML_DOCUMENT_NODE); if (html) { #ifdef LIBXML_HTML_ENABLED doc = htmlParseFile(filename, NULL); #else fprintf(ctxt->output, "HTML support not compiled in\n"); doc = NULL; #endif /* LIBXML_HTML_ENABLED */ } else { doc = xmlReadFile(filename,NULL,0); } if (doc != NULL) { if (ctxt->loaded == 1) { xmlFreeDoc(ctxt->doc); } ctxt->loaded = 1; #ifdef LIBXML_XPATH_ENABLED xmlXPathFreeContext(ctxt->pctxt); #endif /* LIBXML_XPATH_ENABLED */ xmlFree(ctxt->filename); ctxt->doc = doc; ctxt->node = (xmlNodePtr) doc; #ifdef LIBXML_XPATH_ENABLED ctxt->pctxt = xmlXPathNewContext(doc); #endif /* LIBXML_XPATH_ENABLED */ ctxt->filename = (char *) xmlCanonicPath((xmlChar *) filename); } else return (-1); return (0); } #ifdef LIBXML_OUTPUT_ENABLED /** * xmlShellWrite: * @ctxt: the shell context * @filename: the file name * @node: a node in the tree * @node2: unused * * Implements the XML shell function "write" * Write the current node to the filename, it saves the serialization * of the subtree under the @node specified * * Returns 0 or -1 in case of error */ int xmlShellWrite(xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { if (node == NULL) return (-1); if ((filename == NULL) || (filename[0] == 0)) { return (-1); } #ifdef W_OK if (access((char *) filename, W_OK)) { xmlGenericError(xmlGenericErrorContext, "Cannot write to %s\n", filename); return (-1); } #endif switch (node->type) { case XML_DOCUMENT_NODE: if (xmlSaveFile((char *) filename, ctxt->doc) < -1) { xmlGenericError(xmlGenericErrorContext, "Failed to write to %s\n", filename); return (-1); } break; case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_HTML_ENABLED if (htmlSaveFile((char *) filename, ctxt->doc) < 0) { xmlGenericError(xmlGenericErrorContext, "Failed to write to %s\n", filename); return (-1); } #else if (xmlSaveFile((char *) filename, ctxt->doc) < -1) { xmlGenericError(xmlGenericErrorContext, "Failed to write to %s\n", filename); return (-1); } #endif /* LIBXML_HTML_ENABLED */ break; default:{ FILE *f; f = fopen((char *) filename, "w"); if (f == NULL) { xmlGenericError(xmlGenericErrorContext, "Failed to write to %s\n", filename); return (-1); } xmlElemDump(f, ctxt->doc, node); fclose(f); } } return (0); } /** * xmlShellSave: * @ctxt: the shell context * @filename: the file name (optional) * @node: unused * @node2: unused * * Implements the XML shell function "save" * Write the current document to the filename, or it's original name * * Returns 0 or -1 in case of error */ int xmlShellSave(xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED) { if ((ctxt == NULL) || (ctxt->doc == NULL)) return (-1); if ((filename == NULL) || (filename[0] == 0)) filename = ctxt->filename; if (filename == NULL) return (-1); #ifdef W_OK if (access((char *) filename, W_OK)) { xmlGenericError(xmlGenericErrorContext, "Cannot save to %s\n", filename); return (-1); } #endif switch (ctxt->doc->type) { case XML_DOCUMENT_NODE: if (xmlSaveFile((char *) filename, ctxt->doc) < 0) { xmlGenericError(xmlGenericErrorContext, "Failed to save to %s\n", filename); } break; case XML_HTML_DOCUMENT_NODE: #ifdef LIBXML_HTML_ENABLED if (htmlSaveFile((char *) filename, ctxt->doc) < 0) { xmlGenericError(xmlGenericErrorContext, "Failed to save to %s\n", filename); } #else if (xmlSaveFile((char *) filename, ctxt->doc) < 0) { xmlGenericError(xmlGenericErrorContext, "Failed to save to %s\n", filename); } #endif /* LIBXML_HTML_ENABLED */ break; default: xmlGenericError(xmlGenericErrorContext, "To save to subparts of a document use the 'write' command\n"); return (-1); } return (0); } #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef LIBXML_VALID_ENABLED /** * xmlShellValidate: * @ctxt: the shell context * @dtd: the DTD URI (optional) * @node: unused * @node2: unused * * Implements the XML shell function "validate" * Validate the document, if a DTD path is provided, then the validation * is done against the given DTD. * * Returns 0 or -1 in case of error */ int xmlShellValidate(xmlShellCtxtPtr ctxt, char *dtd, xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlValidCtxt vctxt; int res = -1; if ((ctxt == NULL) || (ctxt->doc == NULL)) return(-1); vctxt.userData = stderr; vctxt.error = (xmlValidityErrorFunc) fprintf; vctxt.warning = (xmlValidityWarningFunc) fprintf; if ((dtd == NULL) || (dtd[0] == 0)) { res = xmlValidateDocument(&vctxt, ctxt->doc); } else { xmlDtdPtr subset; subset = xmlParseDTD(NULL, (xmlChar *) dtd); if (subset != NULL) { res = xmlValidateDtd(&vctxt, ctxt->doc, subset); xmlFreeDtd(subset); } } return (res); } #endif /* LIBXML_VALID_ENABLED */ /** * xmlShellDu: * @ctxt: the shell context * @arg: unused * @tree: a node defining a subtree * @node2: unused * * Implements the XML shell function "du" * show the structure of the subtree under node @tree * If @tree is null, the command works on the current node. * * Returns 0 or -1 in case of error */ int xmlShellDu(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, xmlNodePtr tree, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlNodePtr node; int indent = 0, i; if (!ctxt) return (-1); if (tree == NULL) return (-1); node = tree; while (node != NULL) { if ((node->type == XML_DOCUMENT_NODE) || (node->type == XML_HTML_DOCUMENT_NODE)) { fprintf(ctxt->output, "/\n"); } else if (node->type == XML_ELEMENT_NODE) { for (i = 0; i < indent; i++) fprintf(ctxt->output, " "); if ((node->ns) && (node->ns->prefix)) fprintf(ctxt->output, "%s:", node->ns->prefix); fprintf(ctxt->output, "%s\n", node->name); } else { } /* * Browse the full subtree, deep first */ if ((node->type == XML_DOCUMENT_NODE) || (node->type == XML_HTML_DOCUMENT_NODE)) { node = ((xmlDocPtr) node)->children; } else if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { /* deep first */ node = node->children; indent++; } else if ((node != tree) && (node->next != NULL)) { /* then siblings */ node = node->next; } else if (node != tree) { /* go up to parents->next if needed */ while (node != tree) { if (node->parent != NULL) { node = node->parent; indent--; } if ((node != tree) && (node->next != NULL)) { node = node->next; break; } if (node->parent == NULL) { node = NULL; break; } if (node == tree) { node = NULL; break; } } /* exit condition */ if (node == tree) node = NULL; } else node = NULL; } return (0); } /** * xmlShellPwd: * @ctxt: the shell context * @buffer: the output buffer * @node: a node * @node2: unused * * Implements the XML shell function "pwd" * Show the full path from the root to the node, if needed building * thumblers when similar elements exists at a given ancestor level. * The output is compatible with XPath commands. * * Returns 0 or -1 in case of error */ int xmlShellPwd(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *buffer, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) { xmlChar *path; if ((node == NULL) || (buffer == NULL)) return (-1); path = xmlGetNodePath(node); if (path == NULL) return (-1); /* * This test prevents buffer overflow, because this routine * is only called by xmlShell, in which the second argument is * 500 chars long. * It is a dirty hack before a cleaner solution is found. * Documentation should mention that the second argument must * be at least 500 chars long, and could be stripped if too long. */ snprintf(buffer, 499, "%s", path); buffer[499] = '0'; xmlFree(path); return (0); } /** * xmlShell: * @doc: the initial document * @filename: the output buffer * @input: the line reading function * @output: the output FILE*, defaults to stdout if NULL * * Implements the XML shell * This allow to load, validate, view, modify and save a document * using a environment similar to a UNIX commandline. */ void xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, FILE * output) { char prompt[500] = "/ > "; char *cmdline = NULL, *cur; char command[100]; char arg[400]; int i; xmlShellCtxtPtr ctxt; xmlXPathObjectPtr list; if (doc == NULL) return; if (filename == NULL) return; if (input == NULL) return; if (output == NULL) output = stdout; ctxt = (xmlShellCtxtPtr) xmlMalloc(sizeof(xmlShellCtxt)); if (ctxt == NULL) return; ctxt->loaded = 0; ctxt->doc = doc; ctxt->input = input; ctxt->output = output; ctxt->filename = (char *) xmlStrdup((xmlChar *) filename); ctxt->node = (xmlNodePtr) ctxt->doc; #ifdef LIBXML_XPATH_ENABLED ctxt->pctxt = xmlXPathNewContext(ctxt->doc); if (ctxt->pctxt == NULL) { xmlFree(ctxt); return; } #endif /* LIBXML_XPATH_ENABLED */ while (1) { if (ctxt->node == (xmlNodePtr) ctxt->doc) snprintf(prompt, sizeof(prompt), "%s > ", "/"); else if ((ctxt->node != NULL) && (ctxt->node->name) && (ctxt->node->ns) && (ctxt->node->ns->prefix)) snprintf(prompt, sizeof(prompt), "%s:%s > ", (ctxt->node->ns->prefix), ctxt->node->name); else if ((ctxt->node != NULL) && (ctxt->node->name)) snprintf(prompt, sizeof(prompt), "%s > ", ctxt->node->name); else snprintf(prompt, sizeof(prompt), "? > "); prompt[sizeof(prompt) - 1] = 0; /* * Get a new command line */ cmdline = ctxt->input(prompt); if (cmdline == NULL) break; /* * Parse the command itself */ cur = cmdline; while ((*cur == ' ') || (*cur == '\t')) cur++; i = 0; while ((*cur != ' ') && (*cur != '\t') && (*cur != '\n') && (*cur != '\r')) { if (*cur == 0) break; command[i++] = *cur++; } command[i] = 0; if (i == 0) continue; /* * Parse the argument */ while ((*cur == ' ') || (*cur == '\t')) cur++; i = 0; while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) { if (*cur == 0) break; arg[i++] = *cur++; } arg[i] = 0; /* * start interpreting the command */ if (!strcmp(command, "exit")) break; if (!strcmp(command, "quit")) break; if (!strcmp(command, "bye")) break; if (!strcmp(command, "help")) { fprintf(ctxt->output, "\tbase display XML base of the node\n"); fprintf(ctxt->output, "\tsetbase URI change the XML base of the node\n"); fprintf(ctxt->output, "\tbye leave shell\n"); fprintf(ctxt->output, "\tcat [node] display node or current node\n"); fprintf(ctxt->output, "\tcd [path] change directory to path or to root\n"); fprintf(ctxt->output, "\tdir [path] dumps informations about the node (namespace, attributes, content)\n"); fprintf(ctxt->output, "\tdu [path] show the structure of the subtree under path or the current node\n"); fprintf(ctxt->output, "\texit leave shell\n"); fprintf(ctxt->output, "\thelp display this help\n"); fprintf(ctxt->output, "\tfree display memory usage\n"); fprintf(ctxt->output, "\tload [name] load a new document with name\n"); fprintf(ctxt->output, "\tls [path] list contents of path or the current directory\n"); fprintf(ctxt->output, "\tset xml_fragment replace the current node content with the fragment parsed in context\n"); #ifdef LIBXML_XPATH_ENABLED fprintf(ctxt->output, "\txpath expr evaluate the XPath expression in that context and print the result\n"); fprintf(ctxt->output, "\tsetns nsreg register a namespace to a prefix in the XPath evaluation context\n"); fprintf(ctxt->output, "\t format for nsreg is: prefix=[nsuri] (i.e. prefix= unsets a prefix)\n"); fprintf(ctxt->output, "\tsetrootns register all namespace found on the root element\n"); fprintf(ctxt->output, "\t the default namespace if any uses 'defaultns' prefix\n"); #endif /* LIBXML_XPATH_ENABLED */ fprintf(ctxt->output, "\tpwd display current working directory\n"); fprintf(ctxt->output, "\twhereis display absolute path of [path] or current working directory\n"); fprintf(ctxt->output, "\tquit leave shell\n"); #ifdef LIBXML_OUTPUT_ENABLED fprintf(ctxt->output, "\tsave [name] save this document to name or the original name\n"); fprintf(ctxt->output, "\twrite [name] write the current node to the filename\n"); #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef LIBXML_VALID_ENABLED fprintf(ctxt->output, "\tvalidate check the document for errors\n"); #endif /* LIBXML_VALID_ENABLED */ #ifdef LIBXML_SCHEMAS_ENABLED fprintf(ctxt->output, "\trelaxng rng validate the document agaisnt the Relax-NG schemas\n"); #endif fprintf(ctxt->output, "\tgrep string search for a string in the subtree\n"); #ifdef LIBXML_VALID_ENABLED } else if (!strcmp(command, "validate")) { xmlShellValidate(ctxt, arg, NULL, NULL); #endif /* LIBXML_VALID_ENABLED */ } else if (!strcmp(command, "load")) { xmlShellLoad(ctxt, arg, NULL, NULL); #ifdef LIBXML_SCHEMAS_ENABLED } else if (!strcmp(command, "relaxng")) { xmlShellRNGValidate(ctxt, arg, NULL, NULL); #endif #ifdef LIBXML_OUTPUT_ENABLED } else if (!strcmp(command, "save")) { xmlShellSave(ctxt, arg, NULL, NULL); } else if (!strcmp(command, "write")) { if ((arg == NULL) || (arg[0] == 0)) xmlGenericError(xmlGenericErrorContext, "Write command requires a filename argument\n"); else xmlShellWrite(ctxt, arg, ctxt->node, NULL); #endif /* LIBXML_OUTPUT_ENABLED */ } else if (!strcmp(command, "grep")) { xmlShellGrep(ctxt, arg, ctxt->node, NULL); } else if (!strcmp(command, "free")) { if (arg[0] == 0) { xmlMemShow(ctxt->output, 0); } else { int len = 0; sscanf(arg, "%d", &len); xmlMemShow(ctxt->output, len); } } else if (!strcmp(command, "pwd")) { char dir[500]; if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL)) fprintf(ctxt->output, "%s\n", dir); } else if (!strcmp(command, "du")) { if (arg[0] == 0) { xmlShellDu(ctxt, NULL, ctxt->node, NULL); } else { ctxt->pctxt->node = ctxt->node; #ifdef LIBXML_XPATH_ENABLED ctxt->pctxt->node = ctxt->node; list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); #else list = NULL; #endif /* LIBXML_XPATH_ENABLED */ if (list != NULL) { switch (list->type) { case XPATH_UNDEFINED: xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); break; case XPATH_NODESET:{ int indx; if (list->nodesetval == NULL) break; for (indx = 0; indx < list->nodesetval->nodeNr; indx++) xmlShellDu(ctxt, NULL, list->nodesetval-> nodeTab[indx], NULL); break; } case XPATH_BOOLEAN: xmlGenericError(xmlGenericErrorContext, "%s is a Boolean\n", arg); break; case XPATH_NUMBER: xmlGenericError(xmlGenericErrorContext, "%s is a number\n", arg); break; case XPATH_STRING: xmlGenericError(xmlGenericErrorContext, "%s is a string\n", arg); break; case XPATH_POINT: xmlGenericError(xmlGenericErrorContext, "%s is a point\n", arg); break; case XPATH_RANGE: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_LOCATIONSET: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_USERS: xmlGenericError(xmlGenericErrorContext, "%s is user-defined\n", arg); break; case XPATH_XSLT_TREE: xmlGenericError(xmlGenericErrorContext, "%s is an XSLT value tree\n", arg); break; } #ifdef LIBXML_XPATH_ENABLED xmlXPathFreeObject(list); #endif } else { xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); } ctxt->pctxt->node = NULL; } } else if (!strcmp(command, "base")) { xmlShellBase(ctxt, NULL, ctxt->node, NULL); } else if (!strcmp(command, "set")) { xmlShellSetContent(ctxt, arg, ctxt->node, NULL); #ifdef LIBXML_XPATH_ENABLED } else if (!strcmp(command, "setns")) { if (arg[0] == 0) { xmlGenericError(xmlGenericErrorContext, "setns: prefix=[nsuri] required\n"); } else { xmlShellRegisterNamespace(ctxt, arg, NULL, NULL); } } else if (!strcmp(command, "setrootns")) { xmlNodePtr root; root = xmlDocGetRootElement(ctxt->doc); xmlShellRegisterRootNamespaces(ctxt, NULL, root, NULL); } else if (!strcmp(command, "xpath")) { if (arg[0] == 0) { xmlGenericError(xmlGenericErrorContext, "xpath: expression required\n"); } else { ctxt->pctxt->node = ctxt->node; list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); xmlXPathDebugDumpObject(ctxt->output, list, 0); xmlXPathFreeObject(list); } #endif /* LIBXML_XPATH_ENABLED */ #ifdef LIBXML_TREE_ENABLED } else if (!strcmp(command, "setbase")) { xmlShellSetBase(ctxt, arg, ctxt->node, NULL); #endif } else if ((!strcmp(command, "ls")) || (!strcmp(command, "dir"))) { int dir = (!strcmp(command, "dir")); if (arg[0] == 0) { if (dir) xmlShellDir(ctxt, NULL, ctxt->node, NULL); else xmlShellList(ctxt, NULL, ctxt->node, NULL); } else { ctxt->pctxt->node = ctxt->node; #ifdef LIBXML_XPATH_ENABLED ctxt->pctxt->node = ctxt->node; list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); #else list = NULL; #endif /* LIBXML_XPATH_ENABLED */ if (list != NULL) { switch (list->type) { case XPATH_UNDEFINED: xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); break; case XPATH_NODESET:{ int indx; if (list->nodesetval == NULL) break; for (indx = 0; indx < list->nodesetval->nodeNr; indx++) { if (dir) xmlShellDir(ctxt, NULL, list->nodesetval-> nodeTab[indx], NULL); else xmlShellList(ctxt, NULL, list->nodesetval-> nodeTab[indx], NULL); } break; } case XPATH_BOOLEAN: xmlGenericError(xmlGenericErrorContext, "%s is a Boolean\n", arg); break; case XPATH_NUMBER: xmlGenericError(xmlGenericErrorContext, "%s is a number\n", arg); break; case XPATH_STRING: xmlGenericError(xmlGenericErrorContext, "%s is a string\n", arg); break; case XPATH_POINT: xmlGenericError(xmlGenericErrorContext, "%s is a point\n", arg); break; case XPATH_RANGE: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_LOCATIONSET: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_USERS: xmlGenericError(xmlGenericErrorContext, "%s is user-defined\n", arg); break; case XPATH_XSLT_TREE: xmlGenericError(xmlGenericErrorContext, "%s is an XSLT value tree\n", arg); break; } #ifdef LIBXML_XPATH_ENABLED xmlXPathFreeObject(list); #endif } else { xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); } ctxt->pctxt->node = NULL; } } else if (!strcmp(command, "whereis")) { char dir[500]; if (arg[0] == 0) { if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL)) fprintf(ctxt->output, "%s\n", dir); } else { ctxt->pctxt->node = ctxt->node; #ifdef LIBXML_XPATH_ENABLED list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); #else list = NULL; #endif /* LIBXML_XPATH_ENABLED */ if (list != NULL) { switch (list->type) { case XPATH_UNDEFINED: xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); break; case XPATH_NODESET:{ int indx; if (list->nodesetval == NULL) break; for (indx = 0; indx < list->nodesetval->nodeNr; indx++) { if (!xmlShellPwd(ctxt, dir, list->nodesetval-> nodeTab[indx], NULL)) fprintf(ctxt->output, "%s\n", dir); } break; } case XPATH_BOOLEAN: xmlGenericError(xmlGenericErrorContext, "%s is a Boolean\n", arg); break; case XPATH_NUMBER: xmlGenericError(xmlGenericErrorContext, "%s is a number\n", arg); break; case XPATH_STRING: xmlGenericError(xmlGenericErrorContext, "%s is a string\n", arg); break; case XPATH_POINT: xmlGenericError(xmlGenericErrorContext, "%s is a point\n", arg); break; case XPATH_RANGE: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_LOCATIONSET: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_USERS: xmlGenericError(xmlGenericErrorContext, "%s is user-defined\n", arg); break; case XPATH_XSLT_TREE: xmlGenericError(xmlGenericErrorContext, "%s is an XSLT value tree\n", arg); break; } #ifdef LIBXML_XPATH_ENABLED xmlXPathFreeObject(list); #endif } else { xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); } ctxt->pctxt->node = NULL; } } else if (!strcmp(command, "cd")) { if (arg[0] == 0) { ctxt->node = (xmlNodePtr) ctxt->doc; } else { #ifdef LIBXML_XPATH_ENABLED ctxt->pctxt->node = ctxt->node; list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); #else list = NULL; #endif /* LIBXML_XPATH_ENABLED */ if (list != NULL) { switch (list->type) { case XPATH_UNDEFINED: xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); break; case XPATH_NODESET: if (list->nodesetval != NULL) { if (list->nodesetval->nodeNr == 1) { ctxt->node = list->nodesetval->nodeTab[0]; if ((ctxt->node != NULL) && (ctxt->node->type == XML_NAMESPACE_DECL)) { xmlGenericError(xmlGenericErrorContext, "cannot cd to namespace\n"); ctxt->node = NULL; } } else xmlGenericError(xmlGenericErrorContext, "%s is a %d Node Set\n", arg, list->nodesetval->nodeNr); } else xmlGenericError(xmlGenericErrorContext, "%s is an empty Node Set\n", arg); break; case XPATH_BOOLEAN: xmlGenericError(xmlGenericErrorContext, "%s is a Boolean\n", arg); break; case XPATH_NUMBER: xmlGenericError(xmlGenericErrorContext, "%s is a number\n", arg); break; case XPATH_STRING: xmlGenericError(xmlGenericErrorContext, "%s is a string\n", arg); break; case XPATH_POINT: xmlGenericError(xmlGenericErrorContext, "%s is a point\n", arg); break; case XPATH_RANGE: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_LOCATIONSET: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_USERS: xmlGenericError(xmlGenericErrorContext, "%s is user-defined\n", arg); break; case XPATH_XSLT_TREE: xmlGenericError(xmlGenericErrorContext, "%s is an XSLT value tree\n", arg); break; } #ifdef LIBXML_XPATH_ENABLED xmlXPathFreeObject(list); #endif } else { xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); } ctxt->pctxt->node = NULL; } #ifdef LIBXML_OUTPUT_ENABLED } else if (!strcmp(command, "cat")) { if (arg[0] == 0) { xmlShellCat(ctxt, NULL, ctxt->node, NULL); } else { ctxt->pctxt->node = ctxt->node; #ifdef LIBXML_XPATH_ENABLED ctxt->pctxt->node = ctxt->node; list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); #else list = NULL; #endif /* LIBXML_XPATH_ENABLED */ if (list != NULL) { switch (list->type) { case XPATH_UNDEFINED: xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); break; case XPATH_NODESET:{ int indx; if (list->nodesetval == NULL) break; for (indx = 0; indx < list->nodesetval->nodeNr; indx++) { if (i > 0) fprintf(ctxt->output, " -------\n"); xmlShellCat(ctxt, NULL, list->nodesetval-> nodeTab[indx], NULL); } break; } case XPATH_BOOLEAN: xmlGenericError(xmlGenericErrorContext, "%s is a Boolean\n", arg); break; case XPATH_NUMBER: xmlGenericError(xmlGenericErrorContext, "%s is a number\n", arg); break; case XPATH_STRING: xmlGenericError(xmlGenericErrorContext, "%s is a string\n", arg); break; case XPATH_POINT: xmlGenericError(xmlGenericErrorContext, "%s is a point\n", arg); break; case XPATH_RANGE: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_LOCATIONSET: xmlGenericError(xmlGenericErrorContext, "%s is a range\n", arg); break; case XPATH_USERS: xmlGenericError(xmlGenericErrorContext, "%s is user-defined\n", arg); break; case XPATH_XSLT_TREE: xmlGenericError(xmlGenericErrorContext, "%s is an XSLT value tree\n", arg); break; } #ifdef LIBXML_XPATH_ENABLED xmlXPathFreeObject(list); #endif } else { xmlGenericError(xmlGenericErrorContext, "%s: no such node\n", arg); } ctxt->pctxt->node = NULL; } #endif /* LIBXML_OUTPUT_ENABLED */ } else { xmlGenericError(xmlGenericErrorContext, "Unknown command %s\n", command); } free(cmdline); /* not xmlFree here ! */ cmdline = NULL; } #ifdef LIBXML_XPATH_ENABLED xmlXPathFreeContext(ctxt->pctxt); #endif /* LIBXML_XPATH_ENABLED */ if (ctxt->loaded) { xmlFreeDoc(ctxt->doc); } if (ctxt->filename != NULL) xmlFree(ctxt->filename); xmlFree(ctxt); if (cmdline != NULL) free(cmdline); /* not xmlFree here ! */ } #endif /* LIBXML_XPATH_ENABLED */ #define bottom_debugXML #include "elfgcchack.h" #endif /* LIBXML_DEBUG_ENABLED */ libxml2-2.9.1+dfsg1/check-relaxng-test-suite.py0000755000175000017500000002352112113312340017741 0ustar aronaron#!/usr/bin/python import sys import time import os import string import StringIO sys.path.insert(0, "python") import libxml2 # Memory debug specific libxml2.debugMemory(1) debug = 0 verbose = 0 quiet = 1 # # the testsuite description # CONF=os.path.join(os.path.dirname(__file__), "test/relaxng/OASIS/spectest.xml") LOG="check-relaxng-test-suite.log" RES="relaxng-test-results.xml" log = open(LOG, "w") nb_schemas_tests = 0 nb_schemas_success = 0 nb_schemas_failed = 0 nb_instances_tests = 0 nb_instances_success = 0 nb_instances_failed = 0 libxml2.lineNumbersDefault(1) # # Error and warnng callbacks # def callback(ctx, str): global log log.write("%s%s" % (ctx, str)) libxml2.registerErrorHandler(callback, "") # # Resolver callback # resources = {} def resolver(URL, ID, ctxt): global resources if string.find(URL, '#') != -1: URL = URL[0:string.find(URL, '#')] if resources.has_key(URL): return(StringIO.StringIO(resources[URL])) log.write("Resolver failure: asked %s\n" % (URL)) log.write("resources: %s\n" % (resources)) return None # # Load the previous results # #results = {} #previous = {} # #try: # res = libxml2.parseFile(RES) #except: # log.write("Could not parse %s" % (RES)) # # handle a valid instance # def handle_valid(node, schema): global log global nb_instances_success global nb_instances_failed instance = "" child = node.children while child != None: if child.type != 'text': instance = instance + child.serialize() child = child.next try: doc = libxml2.parseDoc(instance) except: doc = None if doc == None: log.write("\nFailed to parse correct instance:\n-----\n") log.write(instance) log.write("\n-----\n") nb_instances_failed = nb_instances_failed + 1 return try: ctxt = schema.relaxNGNewValidCtxt() ret = doc.relaxNGValidateDoc(ctxt) except: ret = -1 if ret != 0: log.write("\nFailed to validate correct instance:\n-----\n") log.write(instance) log.write("\n-----\n") nb_instances_failed = nb_instances_failed + 1 else: nb_instances_success = nb_instances_success + 1 doc.freeDoc() # # handle an invalid instance # def handle_invalid(node, schema): global log global nb_instances_success global nb_instances_failed instance = "" child = node.children while child != None: if child.type != 'text': instance = instance + child.serialize() child = child.next try: doc = libxml2.parseDoc(instance) except: doc = None if doc == None: log.write("\nStrange: failed to parse incorrect instance:\n-----\n") log.write(instance) log.write("\n-----\n") return try: ctxt = schema.relaxNGNewValidCtxt() ret = doc.relaxNGValidateDoc(ctxt) except: ret = -1 if ret == 0: log.write("\nFailed to detect validation problem in instance:\n-----\n") log.write(instance) log.write("\n-----\n") nb_instances_failed = nb_instances_failed + 1 else: nb_instances_success = nb_instances_success + 1 doc.freeDoc() # # handle an incorrect test # def handle_correct(node): global log global nb_schemas_success global nb_schemas_failed schema = "" child = node.children while child != None: if child.type != 'text': schema = schema + child.serialize() child = child.next try: rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) rngs = rngp.relaxNGParse() except: rngs = None if rngs == None: log.write("\nFailed to compile correct schema:\n-----\n") log.write(schema) log.write("\n-----\n") nb_schemas_failed = nb_schemas_failed + 1 else: nb_schemas_success = nb_schemas_success + 1 return rngs def handle_incorrect(node): global log global nb_schemas_success global nb_schemas_failed schema = "" child = node.children while child != None: if child.type != 'text': schema = schema + child.serialize() child = child.next try: rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) rngs = rngp.relaxNGParse() except: rngs = None if rngs != None: log.write("\nFailed to detect schema error in:\n-----\n") log.write(schema) log.write("\n-----\n") nb_schemas_failed = nb_schemas_failed + 1 else: # log.write("\nSuccess detecting schema error in:\n-----\n") # log.write(schema) # log.write("\n-----\n") nb_schemas_success = nb_schemas_success + 1 return None # # resource handling: keep a dictionary of URL->string mappings # def handle_resource(node, dir): global resources try: name = node.prop('name') except: name = None if name == None or name == '': log.write("resource has no name") return; if dir != None: # name = libxml2.buildURI(name, dir) name = dir + '/' + name res = "" child = node.children while child != None: if child.type != 'text': res = res + child.serialize() child = child.next resources[name] = res # # dir handling: pseudo directory resources # def handle_dir(node, dir): try: name = node.prop('name') except: name = None if name == None or name == '': log.write("resource has no name") return; if dir != None: # name = libxml2.buildURI(name, dir) name = dir + '/' + name dirs = node.xpathEval('dir') for dir in dirs: handle_dir(dir, name) res = node.xpathEval('resource') for r in res: handle_resource(r, name) # # handle a testCase element # def handle_testCase(node): global nb_schemas_tests global nb_instances_tests global resources sections = node.xpathEval('string(section)') log.write("\n ======== test %d line %d section %s ==========\n" % ( nb_schemas_tests, node.lineNo(), sections)) resources = {} if debug: print "test %d line %d" % (nb_schemas_tests, node.lineNo()) dirs = node.xpathEval('dir') for dir in dirs: handle_dir(dir, None) res = node.xpathEval('resource') for r in res: handle_resource(r, None) tsts = node.xpathEval('incorrect') if tsts != []: if len(tsts) != 1: print "warning test line %d has more than one example" %(node.lineNo()) schema = handle_incorrect(tsts[0]) else: tsts = node.xpathEval('correct') if tsts != []: if len(tsts) != 1: print "warning test line %d has more than one example"% (node.lineNo()) schema = handle_correct(tsts[0]) else: print "warning line %d has no nor child" % (node.lineNo()) nb_schemas_tests = nb_schemas_tests + 1; valids = node.xpathEval('valid') invalids = node.xpathEval('invalid') nb_instances_tests = nb_instances_tests + len(valids) + len(invalids) if schema != None: for valid in valids: handle_valid(valid, schema) for invalid in invalids: handle_invalid(invalid, schema) # # handle a testSuite element # def handle_testSuite(node, level = 0): global nb_schemas_tests, nb_schemas_success, nb_schemas_failed global nb_instances_tests, nb_instances_success, nb_instances_failed global quiet if level >= 1: old_schemas_tests = nb_schemas_tests old_schemas_success = nb_schemas_success old_schemas_failed = nb_schemas_failed old_instances_tests = nb_instances_tests old_instances_success = nb_instances_success old_instances_failed = nb_instances_failed docs = node.xpathEval('documentation') authors = node.xpathEval('author') if docs != []: msg = "" for doc in docs: msg = msg + doc.content + " " if authors != []: msg = msg + "written by " for author in authors: msg = msg + author.content + " " if quiet == 0: print msg sections = node.xpathEval('section') if sections != [] and level <= 0: msg = "" for section in sections: msg = msg + section.content + " " if quiet == 0: print "Tests for section %s" % (msg) for test in node.xpathEval('testCase'): handle_testCase(test) for test in node.xpathEval('testSuite'): handle_testSuite(test, level + 1) if verbose and level >= 1 and sections != []: msg = "" for section in sections: msg = msg + section.content + " " print "Result of tests for section %s" % (msg) if nb_schemas_tests != old_schemas_tests: print "found %d test schemas: %d success %d failures" % ( nb_schemas_tests - old_schemas_tests, nb_schemas_success - old_schemas_success, nb_schemas_failed - old_schemas_failed) if nb_instances_tests != old_instances_tests: print "found %d test instances: %d success %d failures" % ( nb_instances_tests - old_instances_tests, nb_instances_success - old_instances_success, nb_instances_failed - old_instances_failed) # # Parse the conf file # libxml2.substituteEntitiesDefault(1); testsuite = libxml2.parseFile(CONF) libxml2.setEntityLoader(resolver) root = testsuite.getRootElement() if root.name != 'testSuite': print "%s doesn't start with a testSuite element, aborting" % (CONF) sys.exit(1) if quiet == 0: print "Running Relax NG testsuite" handle_testSuite(root) if quiet == 0: print "\nTOTAL:\n" if quiet == 0 or nb_schemas_failed != 0: print "found %d test schemas: %d success %d failures" % ( nb_schemas_tests, nb_schemas_success, nb_schemas_failed) if quiet == 0 or nb_instances_failed != 0: print "found %d test instances: %d success %d failures" % ( nb_instances_tests, nb_instances_success, nb_instances_failed) testsuite.freeDoc() # Memory debug specific libxml2.relaxNGCleanupTypes() libxml2.cleanupParser() if libxml2.debugMemory(1) == 0: if quiet == 0: print "OK" else: print "Memory leak %d bytes" % (libxml2.debugMemory(1)) libxml2.dumpMemory() libxml2-2.9.1+dfsg1/README.tests0000644000175000017500000000271312113312340014566 0ustar aronaron README.tests Instructions for standalone test regressions of libxml2 libxml2-tests-$version.tar.gz contains 3 standalone C programs as well as a large amount of tests and results coming from libxml2 itself and from W3C, NIST, Sun Microsystems, Microsoft and James Clark. Each C program has a different testing purpose: runtest.c : runs libxml2 basic internal regression tests runsuite.c: runs libxml2 against external regression tests testapi.c : exercises the library public entry points testchar.c: exercise the check of character ranges and UTF-8 validation The command: make check or make -f Makefile.tests check should be sufficient on an Unix system to build and exercise the tests for the version of the library installed on the system. Note however that there isn't backward compatibility provided so if the installed version is older than the testsuite one, failing to compile or run the tests is likely. In any event this won't work with an installed libxml2 older than 2.6.20. Building on other platforms should be a matter of compiling the C files like any other program using libxml2, running the test should be done simply by launching the resulting executables. Also note the availability of a "make valgrind" target which will run the above tests under valgrind to check for memory errors (but this relies on the availability of the valgrind command and take far more time to complete). Daniel Veillard Mon May 7 2012 libxml2-2.9.1+dfsg1/genUnicode.py0000755000175000017500000003127111234335462015220 0ustar aronaron#!/usr/bin/python -u # # Original script modified in November 2003 to take advantage of # the character-validation range routines, and updated to the # current Unicode information (Version 4.0.1) # # NOTE: there is an 'alias' facility for blocks which are not present in # the current release, but are needed for ABI compatibility. This # must be accomplished MANUALLY! Please see the comments below under # 'blockAliases' # import sys import string import time webpage = "http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html" sources = "Blocks-4.0.1.txt UnicodeData-4.0.1.txt" # # blockAliases is a small hack - it is used for mapping block names which # were were used in the 3.1 release, but are missing or changed in the current # release. The format is "OldBlockName:NewBlockName1[,NewBlockName2[,...]]" blockAliases = [] blockAliases.append("CombiningMarksforSymbols:CombiningDiacriticalMarksforSymbols") blockAliases.append("Greek:GreekandCoptic") blockAliases.append("PrivateUse:PrivateUseArea,SupplementaryPrivateUseArea-A," + "SupplementaryPrivateUseArea-B") # minTableSize gives the minimum number of ranges which must be present # before a range table is produced. If there are less than this # number, inline comparisons are generated minTableSize = 8 (blockfile, catfile) = string.split(sources) # # Now process the "blocks" file, reducing it to a dictionary # indexed by blockname, containing a tuple with the applicable # block range # BlockNames = {} try: blocks = open(blockfile, "r") except: print "Missing %s, aborting ..." % blockfile sys.exit(1) for line in blocks.readlines(): if line[0] == '#': continue line = string.strip(line) if line == '': continue try: fields = string.split(line, ';') range = string.strip(fields[0]) (start, end) = string.split(range, "..") name = string.strip(fields[1]) name = string.replace(name, ' ', '') except: print "Failed to process line: %s" % (line) continue start = "0x" + start end = "0x" + end try: BlockNames[name].append((start, end)) except: BlockNames[name] = [(start, end)] blocks.close() print "Parsed %d blocks descriptions" % (len(BlockNames.keys())) for block in blockAliases: alias = string.split(block,':') alist = string.split(alias[1],',') for comp in alist: if BlockNames.has_key(comp): if alias[0] not in BlockNames: BlockNames[alias[0]] = [] for r in BlockNames[comp]: BlockNames[alias[0]].append(r) else: print "Alias %s: %s not in Blocks" % (alias[0], comp) continue # # Next process the Categories file. This is more complex, since # the file is in code sequence, and we need to invert it. We use # a dictionary with index category-name, with each entry containing # all the ranges (codepoints) of that category. Note that category # names comprise two parts - the general category, and the "subclass" # within that category. Therefore, both "general category" (which is # the first character of the 2-character category-name) and the full # (2-character) name are entered into this dictionary. # try: data = open(catfile, "r") except: print "Missing %s, aborting ..." % catfile sys.exit(1) nbchar = 0; Categories = {} for line in data.readlines(): if line[0] == '#': continue line = string.strip(line) if line == '': continue try: fields = string.split(line, ';') point = string.strip(fields[0]) value = 0 while point != '': value = value * 16 if point[0] >= '0' and point[0] <= '9': value = value + ord(point[0]) - ord('0') elif point[0] >= 'A' and point[0] <= 'F': value = value + 10 + ord(point[0]) - ord('A') elif point[0] >= 'a' and point[0] <= 'f': value = value + 10 + ord(point[0]) - ord('a') point = point[1:] name = fields[2] except: print "Failed to process line: %s" % (line) continue nbchar = nbchar + 1 # update entry for "full name" try: Categories[name].append(value) except: try: Categories[name] = [value] except: print "Failed to process line: %s" % (line) # update "general category" name try: Categories[name[0]].append(value) except: try: Categories[name[0]] = [value] except: print "Failed to process line: %s" % (line) blocks.close() print "Parsed %d char generating %d categories" % (nbchar, len(Categories.keys())) # # The data is now all read. Time to process it into a more useful form. # # reduce the number list into ranges for cat in Categories.keys(): list = Categories[cat] start = -1 prev = -1 end = -1 ranges = [] for val in list: if start == -1: start = val prev = val continue elif val == prev + 1: prev = val continue elif prev == start: ranges.append((prev, prev)) start = val prev = val continue else: ranges.append((start, prev)) start = val prev = val continue if prev == start: ranges.append((prev, prev)) else: ranges.append((start, prev)) Categories[cat] = ranges # # Assure all data is in alphabetic order, since we will be doing binary # searches on the tables. # bkeys = BlockNames.keys() bkeys.sort() ckeys = Categories.keys() ckeys.sort() # # Generate the resulting files # try: header = open("include/libxml/xmlunicode.h", "w") except: print "Failed to open include/libxml/xmlunicode.h" sys.exit(1) try: output = open("xmlunicode.c", "w") except: print "Failed to open xmlunicode.c" sys.exit(1) date = time.asctime(time.localtime(time.time())) header.write( """/* * Summary: Unicode character APIs * Description: API for the Unicode character APIs * * This file is automatically generated from the * UCS description files of the Unicode Character Database * %s * using the genUnicode.py Python script. * * Generation date: %s * Sources: %s * Author: Daniel Veillard */ #ifndef __XML_UNICODE_H__ #define __XML_UNICODE_H__ #include #ifdef LIBXML_UNICODE_ENABLED #ifdef __cplusplus extern "C" { #endif """ % (webpage, date, sources)); output.write( """/* * xmlunicode.c: this module implements the Unicode character APIs * * This file is automatically generated from the * UCS description files of the Unicode Character Database * %s * using the genUnicode.py Python script. * * Generation date: %s * Sources: %s * Daniel Veillard */ #define IN_LIBXML #include "libxml.h" #ifdef LIBXML_UNICODE_ENABLED #include #include #include #include typedef int (xmlIntFunc)(int); /* just to keep one's mind untwisted */ typedef struct { const char *rangename; xmlIntFunc *func; } xmlUnicodeRange; typedef struct { xmlUnicodeRange *table; int numentries; } xmlUnicodeNameTable; static xmlIntFunc *xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname); static xmlUnicodeRange xmlUnicodeBlocks[] = { """ % (webpage, date, sources)); flag = 0 for block in bkeys: name = string.replace(block, '-', '') if flag: output.write(',\n') else: flag = 1 output.write(' {"%s", xmlUCSIs%s}' % (block, name)) output.write('};\n\n') output.write('static xmlUnicodeRange xmlUnicodeCats[] = {\n') flag = 0; for name in ckeys: if flag: output.write(',\n') else: flag = 1 output.write(' {"%s", xmlUCSIsCat%s}' % (name, name)) output.write('};\n\n') # # For any categories with more than minTableSize ranges we generate # a range table suitable for xmlCharInRange # for name in ckeys: if len(Categories[name]) > minTableSize: numshort = 0 numlong = 0 ranges = Categories[name] sptr = "NULL" lptr = "NULL" for range in ranges: (low, high) = range if high < 0x10000: if numshort == 0: pline = "static const xmlChSRange xml%sS[] = {" % name sptr = "xml%sS" % name else: pline += ", " numshort += 1 else: if numlong == 0: if numshort > 0: output.write(pline + " };\n") pline = "static const xmlChLRange xml%sL[] = {" % name lptr = "xml%sL" % name else: pline += ", " numlong += 1 if len(pline) > 60: output.write(pline + "\n") pline = " " pline += "{%s, %s}" % (hex(low), hex(high)) output.write(pline + " };\nstatic xmlChRangeGroup xml%sG = {%s,%s,%s,%s};\n\n" % (name, numshort, numlong, sptr, lptr)) output.write( """static xmlUnicodeNameTable xmlUnicodeBlockTbl = {xmlUnicodeBlocks, %s}; static xmlUnicodeNameTable xmlUnicodeCatTbl = {xmlUnicodeCats, %s}; /** * xmlUnicodeLookup: * @tptr: pointer to the name table * @name: name to be found * * binary table lookup for user-supplied name * * Returns pointer to range function if found, otherwise NULL */ static xmlIntFunc *xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname) { int low, high, mid, cmp; xmlUnicodeRange *sptr; if ((tptr == NULL) || (tname == NULL)) return(NULL); low = 0; high = tptr->numentries - 1; sptr = tptr->table; while (low <= high) { mid = (low + high) / 2; if ((cmp=strcmp(tname, sptr[mid].rangename)) == 0) return (sptr[mid].func); if (cmp < 0) high = mid - 1; else low = mid + 1; } return (NULL); } """ % (len(BlockNames), len(Categories)) ) for block in bkeys: name = string.replace(block, '-', '') header.write("XMLPUBFUN int XMLCALL xmlUCSIs%s\t(int code);\n" % name) output.write("/**\n * xmlUCSIs%s:\n * @code: UCS code point\n" % (name)) output.write(" *\n * Check whether the character is part of %s UCS Block\n"% (block)) output.write(" *\n * Returns 1 if true 0 otherwise\n */\n"); output.write("int\nxmlUCSIs%s(int code) {\n return(" % name) flag = 0 for (start, end) in BlockNames[block]: if flag: output.write(" ||\n ") else: flag = 1 output.write("((code >= %s) && (code <= %s))" % (start, end)) output.write(");\n}\n\n") header.write("\nXMLPUBFUN int XMLCALL xmlUCSIsBlock\t(int code, const char *block);\n\n") output.write( """/** * xmlUCSIsBlock: * @code: UCS code point * @block: UCS block name * * Check whether the character is part of the UCS Block * * Returns 1 if true, 0 if false and -1 on unknown block */ int xmlUCSIsBlock(int code, const char *block) { xmlIntFunc *func; func = xmlUnicodeLookup(&xmlUnicodeBlockTbl, block); if (func == NULL) return (-1); return (func(code)); } """) for name in ckeys: ranges = Categories[name] header.write("XMLPUBFUN int XMLCALL xmlUCSIsCat%s\t(int code);\n" % name) output.write("/**\n * xmlUCSIsCat%s:\n * @code: UCS code point\n" % (name)) output.write(" *\n * Check whether the character is part of %s UCS Category\n"% (name)) output.write(" *\n * Returns 1 if true 0 otherwise\n */\n"); output.write("int\nxmlUCSIsCat%s(int code) {\n" % name) if len(Categories[name]) > minTableSize: output.write(" return(xmlCharInRange((unsigned int)code, &xml%sG)" % name) else: start = 1 for range in ranges: (begin, end) = range; if start: output.write(" return("); start = 0 else: output.write(" ||\n "); if (begin == end): output.write("(code == %s)" % (hex(begin))) else: output.write("((code >= %s) && (code <= %s))" % ( hex(begin), hex(end))) output.write(");\n}\n\n") header.write("\nXMLPUBFUN int XMLCALL xmlUCSIsCat\t(int code, const char *cat);\n") output.write( """/** * xmlUCSIsCat: * @code: UCS code point * @cat: UCS Category name * * Check whether the character is part of the UCS Category * * Returns 1 if true, 0 if false and -1 on unknown category */ int xmlUCSIsCat(int code, const char *cat) { xmlIntFunc *func; func = xmlUnicodeLookup(&xmlUnicodeCatTbl, cat); if (func == NULL) return (-1); return (func(code)); } #define bottom_xmlunicode #include "elfgcchack.h" #endif /* LIBXML_UNICODE_ENABLED */ """) header.write(""" #ifdef __cplusplus } #endif #endif /* LIBXML_UNICODE_ENABLED */ #endif /* __XML_UNICODE_H__ */ """); header.close() output.close() libxml2-2.9.1+dfsg1/xzlib.h0000644000175000017500000000110512113312344014044 0ustar aronaron/** * xzlib.h: header for the front end for the transparent suport of lzma * compression at the I/O layer * * See Copyright for the status of this software. * * Anders F Bjorklund */ #ifndef LIBXML2_XZLIB_H #define LIBXML2_XZLIB_H typedef void *xzFile; /* opaque lzma file descriptor */ xzFile __libxml2_xzopen(const char *path, const char *mode); xzFile __libxml2_xzdopen(int fd, const char *mode); int __libxml2_xzread(xzFile file, void *buf, unsigned len); int __libxml2_xzclose(xzFile file); #endif /* LIBXML2_XZLIB_H */ libxml2-2.9.1+dfsg1/testSchemas.c0000644000175000017500000001032212113312343015172 0ustar aronaron/* * testSchemas.c : a small tester program for Schema validation * * See Copyright for the status of this software. * * Daniel.Veillard@w3.org */ #include "libxml.h" #ifdef LIBXML_SCHEMAS_ENABLED #include #include #include #include #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_SYS_MMAN_H #include /* seems needed for Solaris */ #ifndef MAP_FAILED #define MAP_FAILED ((void *) -1) #endif #endif #include #include #include #include #ifdef LIBXML_DEBUG_ENABLED static int debug = 0; #endif static int noout = 0; #ifdef HAVE_MMAP static int memory = 0; #endif int main(int argc, char **argv) { int i; int files = 0; xmlSchemaPtr schema = NULL; for (i = 1; i < argc ; i++) { #ifdef LIBXML_DEBUG_ENABLED if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) debug++; else #endif #ifdef HAVE_MMAP if ((!strcmp(argv[i], "-memory")) || (!strcmp(argv[i], "--memory"))) { memory++; } else #endif if ((!strcmp(argv[i], "-noout")) || (!strcmp(argv[i], "--noout"))) { noout++; } } xmlLineNumbersDefault(1); for (i = 1; i < argc ; i++) { if (argv[i][0] != '-') { if (schema == NULL) { xmlSchemaParserCtxtPtr ctxt; #ifdef HAVE_MMAP if (memory) { int fd; struct stat info; const char *base; if (stat(argv[i], &info) < 0) break; if ((fd = open(argv[i], O_RDONLY)) < 0) break; base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; if (base == (void *) MAP_FAILED) break; ctxt = xmlSchemaNewMemParserCtxt((char *)base,info.st_size); xmlSchemaSetParserErrors(ctxt, (xmlSchemaValidityErrorFunc) fprintf, (xmlSchemaValidityWarningFunc) fprintf, stderr); schema = xmlSchemaParse(ctxt); xmlSchemaFreeParserCtxt(ctxt); munmap((char *) base, info.st_size); } else #endif { ctxt = xmlSchemaNewParserCtxt(argv[i]); xmlSchemaSetParserErrors(ctxt, (xmlSchemaValidityErrorFunc) fprintf, (xmlSchemaValidityWarningFunc) fprintf, stderr); schema = xmlSchemaParse(ctxt); xmlSchemaFreeParserCtxt(ctxt); } #ifdef LIBXML_OUTPUT_ENABLED #ifdef LIBXML_DEBUG_ENABLED if (debug) xmlSchemaDump(stdout, schema); #endif #endif /* LIBXML_OUTPUT_ENABLED */ if (schema == NULL) goto failed_schemas; } else { xmlDocPtr doc; doc = xmlReadFile(argv[i],NULL,0); if (doc == NULL) { fprintf(stderr, "Could not parse %s\n", argv[i]); } else { xmlSchemaValidCtxtPtr ctxt; int ret; ctxt = xmlSchemaNewValidCtxt(schema); xmlSchemaSetValidErrors(ctxt, (xmlSchemaValidityErrorFunc) fprintf, (xmlSchemaValidityWarningFunc) fprintf, stderr); ret = xmlSchemaValidateDoc(ctxt, doc); if (ret == 0) { printf("%s validates\n", argv[i]); } else if (ret > 0) { printf("%s fails to validate\n", argv[i]); } else { printf("%s validation generated an internal error\n", argv[i]); } xmlSchemaFreeValidCtxt(ctxt); xmlFreeDoc(doc); } } files ++; } } if (schema != NULL) xmlSchemaFree(schema); if (files == 0) { printf("Usage : %s [--debug] [--noout] schemas XMLfiles ...\n", argv[0]); printf("\tParse the HTML files and output the result of the parsing\n"); #ifdef LIBXML_DEBUG_ENABLED printf("\t--debug : dump a debug tree of the in-memory document\n"); #endif printf("\t--noout : do not print the result\n"); #ifdef HAVE_MMAP printf("\t--memory : test the schemas in memory parsing\n"); #endif } failed_schemas: xmlSchemaCleanupTypes(); xmlCleanupParser(); xmlMemoryDump(); return(0); } #else #include int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { printf("%s : Schemas support not compiled in\n", argv[0]); return(0); } #endif /* LIBXML_SCHEMAS_ENABLED */ libxml2-2.9.1+dfsg1/encoding.c0000644000175000017500000044133012113312342014503 0ustar aronaron/* * encoding.c : implements the encoding conversion functions needed for XML * * Related specs: * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies * rfc2781 UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau * [ISO-10646] UTF-8 and UTF-16 in Annexes * [ISO-8859-1] ISO Latin-1 characters codes. * [UNICODE] The Unicode Consortium, "The Unicode Standard -- * Worldwide Character Encoding -- Version 1.0", Addison- * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is * described in Unicode Technical Report #4. * [US-ASCII] Coded Character Set--7-bit American Standard Code for * Information Interchange, ANSI X3.4-1986. * * See Copyright for the status of this software. * * daniel@veillard.com * * Original code for IsoLatin1 and UTF-16 by "Martin J. Duerst" */ #define IN_LIBXML #include "libxml.h" #include #include #ifdef HAVE_CTYPE_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef LIBXML_ICONV_ENABLED #ifdef HAVE_ERRNO_H #include #endif #endif #include #include #ifdef LIBXML_HTML_ENABLED #include #endif #include #include #include "buf.h" #include "enc.h" static xmlCharEncodingHandlerPtr xmlUTF16LEHandler = NULL; static xmlCharEncodingHandlerPtr xmlUTF16BEHandler = NULL; typedef struct _xmlCharEncodingAlias xmlCharEncodingAlias; typedef xmlCharEncodingAlias *xmlCharEncodingAliasPtr; struct _xmlCharEncodingAlias { const char *name; const char *alias; }; static xmlCharEncodingAliasPtr xmlCharEncodingAliases = NULL; static int xmlCharEncodingAliasesNb = 0; static int xmlCharEncodingAliasesMax = 0; #if defined(LIBXML_ICONV_ENABLED) || defined(LIBXML_ICU_ENABLED) #if 0 #define DEBUG_ENCODING /* Define this to get encoding traces */ #endif #else #ifdef LIBXML_ISO8859X_ENABLED static void xmlRegisterCharEncodingHandlersISO8859x (void); #endif #endif static int xmlLittleEndian = 1; /** * xmlEncodingErrMemory: * @extra: extra informations * * Handle an out of memory condition */ static void xmlEncodingErrMemory(const char *extra) { __xmlSimpleError(XML_FROM_I18N, XML_ERR_NO_MEMORY, NULL, NULL, extra); } /** * xmlErrEncoding: * @error: the error number * @msg: the error message * * n encoding error */ static void xmlEncodingErr(xmlParserErrors error, const char *msg, const char *val) { __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_I18N, error, XML_ERR_FATAL, NULL, 0, val, NULL, NULL, 0, 0, msg, val); } #ifdef LIBXML_ICU_ENABLED static uconv_t* openIcuConverter(const char* name, int toUnicode) { UErrorCode status = U_ZERO_ERROR; uconv_t *conv = (uconv_t *) xmlMalloc(sizeof(uconv_t)); if (conv == NULL) return NULL; conv->uconv = ucnv_open(name, &status); if (U_FAILURE(status)) goto error; status = U_ZERO_ERROR; if (toUnicode) { ucnv_setToUCallBack(conv->uconv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &status); } else { ucnv_setFromUCallBack(conv->uconv, UCNV_FROM_U_CALLBACK_STOP, NULL, NULL, NULL, &status); } if (U_FAILURE(status)) goto error; status = U_ZERO_ERROR; conv->utf8 = ucnv_open("UTF-8", &status); if (U_SUCCESS(status)) return conv; error: if (conv->uconv) ucnv_close(conv->uconv); xmlFree(conv); return NULL; } static void closeIcuConverter(uconv_t *conv) { if (conv != NULL) { ucnv_close(conv->uconv); ucnv_close(conv->utf8); xmlFree(conv); } } #endif /* LIBXML_ICU_ENABLED */ /************************************************************************ * * * Conversions To/From UTF8 encoding * * * ************************************************************************/ /** * asciiToUTF8: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of ASCII chars * @inlen: the length of @in * * Take a block of ASCII chars in and try to convert it to an UTF-8 * block of chars out. * Returns 0 if success, or -1 otherwise * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ static int asciiToUTF8(unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { unsigned char* outstart = out; const unsigned char* base = in; const unsigned char* processed = in; unsigned char* outend = out + *outlen; const unsigned char* inend; unsigned int c; inend = in + (*inlen); while ((in < inend) && (out - outstart + 5 < *outlen)) { c= *in++; if (out >= outend) break; if (c < 0x80) { *out++ = c; } else { *outlen = out - outstart; *inlen = processed - base; return(-1); } processed = (const unsigned char*) in; } *outlen = out - outstart; *inlen = processed - base; return(*outlen); } #ifdef LIBXML_OUTPUT_ENABLED /** * UTF8Toascii: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * * Take a block of UTF-8 chars in and try to convert it to an ASCII * block of chars out. * * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ static int UTF8Toascii(unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { const unsigned char* processed = in; const unsigned char* outend; const unsigned char* outstart = out; const unsigned char* instart = in; const unsigned char* inend; unsigned int c, d; int trailing; if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); if (in == NULL) { /* * initialization nothing to do */ *outlen = 0; *inlen = 0; return(0); } inend = in + (*inlen); outend = out + (*outlen); while (in < inend) { d = *in++; if (d < 0x80) { c= d; trailing= 0; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } else if (d < 0xF8) { c= d & 0x07; trailing= 3; } else { /* no chance for this in Ascii */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } if (inend - in < trailing) { break; } for ( ; trailing; trailing--) { if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break; c <<= 6; c |= d & 0x3F; } /* assertion: c is a single UTF-4 value */ if (c < 0x80) { if (out >= outend) break; *out++ = c; } else { /* no chance for this in Ascii */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } processed = in; } *outlen = out - outstart; *inlen = processed - instart; return(*outlen); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * isolat1ToUTF8: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of ISO Latin 1 chars * @inlen: the length of @in * * Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8 * block of chars out. * Returns the number of bytes written if success, or -1 otherwise * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ int isolat1ToUTF8(unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { unsigned char* outstart = out; const unsigned char* base = in; unsigned char* outend; const unsigned char* inend; const unsigned char* instop; if ((out == NULL) || (in == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); outend = out + *outlen; inend = in + (*inlen); instop = inend; while ((in < inend) && (out < outend - 1)) { if (*in >= 0x80) { *out++ = (((*in) >> 6) & 0x1F) | 0xC0; *out++ = ((*in) & 0x3F) | 0x80; ++in; } if ((instop - in) > (outend - out)) instop = in + (outend - out); while ((in < instop) && (*in < 0x80)) { *out++ = *in++; } } if ((in < inend) && (out < outend) && (*in < 0x80)) { *out++ = *in++; } *outlen = out - outstart; *inlen = in - base; return(*outlen); } /** * UTF8ToUTF8: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @inb: a pointer to an array of UTF-8 chars * @inlenb: the length of @in in UTF-8 chars * * No op copy operation for UTF8 handling. * * Returns the number of bytes written, or -1 if lack of space. * The value of *inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. */ static int UTF8ToUTF8(unsigned char* out, int *outlen, const unsigned char* inb, int *inlenb) { int len; if ((out == NULL) || (inb == NULL) || (outlen == NULL) || (inlenb == NULL)) return(-1); if (*outlen > *inlenb) { len = *inlenb; } else { len = *outlen; } if (len < 0) return(-1); memcpy(out, inb, len); *outlen = len; *inlenb = len; return(*outlen); } #ifdef LIBXML_OUTPUT_ENABLED /** * UTF8Toisolat1: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * * Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1 * block of chars out. * * Returns the number of bytes written if success, -2 if the transcoding fails, or -1 otherwise * The value of @inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. * The value of @outlen after return is the number of octets consumed. */ int UTF8Toisolat1(unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { const unsigned char* processed = in; const unsigned char* outend; const unsigned char* outstart = out; const unsigned char* instart = in; const unsigned char* inend; unsigned int c, d; int trailing; if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); if (in == NULL) { /* * initialization nothing to do */ *outlen = 0; *inlen = 0; return(0); } inend = in + (*inlen); outend = out + (*outlen); while (in < inend) { d = *in++; if (d < 0x80) { c= d; trailing= 0; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } else if (d < 0xF8) { c= d & 0x07; trailing= 3; } else { /* no chance for this in IsoLat1 */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } if (inend - in < trailing) { break; } for ( ; trailing; trailing--) { if (in >= inend) break; if (((d= *in++) & 0xC0) != 0x80) { *outlen = out - outstart; *inlen = processed - instart; return(-2); } c <<= 6; c |= d & 0x3F; } /* assertion: c is a single UTF-4 value */ if (c <= 0xFF) { if (out >= outend) break; *out++ = c; } else { /* no chance for this in IsoLat1 */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } processed = in; } *outlen = out - outstart; *inlen = processed - instart; return(*outlen); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * UTF16LEToUTF8: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @inb: a pointer to an array of UTF-16LE passwd as a byte array * @inlenb: the length of @in in UTF-16LE chars * * Take a block of UTF-16LE ushorts in and try to convert it to an UTF-8 * block of chars out. This function assumes the endian property * is the same between the native type of this machine and the * inputed one. * * Returns the number of bytes written, or -1 if lack of space, or -2 * if the transcoding fails (if *in is not a valid utf16 string) * The value of *inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. */ static int UTF16LEToUTF8(unsigned char* out, int *outlen, const unsigned char* inb, int *inlenb) { unsigned char* outstart = out; const unsigned char* processed = inb; unsigned char* outend = out + *outlen; unsigned short* in = (unsigned short*) inb; unsigned short* inend; unsigned int c, d, inlen; unsigned char *tmp; int bits; if ((*inlenb % 2) == 1) (*inlenb)--; inlen = *inlenb / 2; inend = in + inlen; while ((in < inend) && (out - outstart + 5 < *outlen)) { if (xmlLittleEndian) { c= *in++; } else { tmp = (unsigned char *) in; c = *tmp++; c = c | (((unsigned int)*tmp) << 8); in++; } if ((c & 0xFC00) == 0xD800) { /* surrogates */ if (in >= inend) { /* (in > inend) shouldn't happens */ break; } if (xmlLittleEndian) { d = *in++; } else { tmp = (unsigned char *) in; d = *tmp++; d = d | (((unsigned int)*tmp) << 8); in++; } if ((d & 0xFC00) == 0xDC00) { c &= 0x03FF; c <<= 10; c |= d & 0x03FF; c += 0x10000; } else { *outlen = out - outstart; *inlenb = processed - inb; return(-2); } } /* assertion: c is a single UTF-4 value */ if (out >= outend) break; if (c < 0x80) { *out++= c; bits= -6; } else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } for ( ; bits >= 0; bits-= 6) { if (out >= outend) break; *out++= ((c >> bits) & 0x3F) | 0x80; } processed = (const unsigned char*) in; } *outlen = out - outstart; *inlenb = processed - inb; return(*outlen); } #ifdef LIBXML_OUTPUT_ENABLED /** * UTF8ToUTF16LE: * @outb: a pointer to an array of bytes to store the result * @outlen: the length of @outb * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * * Take a block of UTF-8 chars in and try to convert it to an UTF-16LE * block of chars out. * * Returns the number of bytes written, or -1 if lack of space, or -2 * if the transcoding failed. */ static int UTF8ToUTF16LE(unsigned char* outb, int *outlen, const unsigned char* in, int *inlen) { unsigned short* out = (unsigned short*) outb; const unsigned char* processed = in; const unsigned char *const instart = in; unsigned short* outstart= out; unsigned short* outend; const unsigned char* inend; unsigned int c, d; int trailing; unsigned char *tmp; unsigned short tmp1, tmp2; /* UTF16LE encoding has no BOM */ if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); if (in == NULL) { *outlen = 0; *inlen = 0; return(0); } inend= in + *inlen; outend = out + (*outlen / 2); while (in < inend) { d= *in++; if (d < 0x80) { c= d; trailing= 0; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = (out - outstart) * 2; *inlen = processed - instart; return(-2); } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } else if (d < 0xF8) { c= d & 0x07; trailing= 3; } else { /* no chance for this in UTF-16 */ *outlen = (out - outstart) * 2; *inlen = processed - instart; return(-2); } if (inend - in < trailing) { break; } for ( ; trailing; trailing--) { if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break; c <<= 6; c |= d & 0x3F; } /* assertion: c is a single UTF-4 value */ if (c < 0x10000) { if (out >= outend) break; if (xmlLittleEndian) { *out++ = c; } else { tmp = (unsigned char *) out; *tmp = c ; *(tmp + 1) = c >> 8 ; out++; } } else if (c < 0x110000) { if (out+1 >= outend) break; c -= 0x10000; if (xmlLittleEndian) { *out++ = 0xD800 | (c >> 10); *out++ = 0xDC00 | (c & 0x03FF); } else { tmp1 = 0xD800 | (c >> 10); tmp = (unsigned char *) out; *tmp = (unsigned char) tmp1; *(tmp + 1) = tmp1 >> 8; out++; tmp2 = 0xDC00 | (c & 0x03FF); tmp = (unsigned char *) out; *tmp = (unsigned char) tmp2; *(tmp + 1) = tmp2 >> 8; out++; } } else break; processed = in; } *outlen = (out - outstart) * 2; *inlen = processed - instart; return(*outlen); } /** * UTF8ToUTF16: * @outb: a pointer to an array of bytes to store the result * @outlen: the length of @outb * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * * Take a block of UTF-8 chars in and try to convert it to an UTF-16 * block of chars out. * * Returns the number of bytes written, or -1 if lack of space, or -2 * if the transcoding failed. */ static int UTF8ToUTF16(unsigned char* outb, int *outlen, const unsigned char* in, int *inlen) { if (in == NULL) { /* * initialization, add the Byte Order Mark for UTF-16LE */ if (*outlen >= 2) { outb[0] = 0xFF; outb[1] = 0xFE; *outlen = 2; *inlen = 0; #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Added FFFE Byte Order Mark\n"); #endif return(2); } *outlen = 0; *inlen = 0; return(0); } return (UTF8ToUTF16LE(outb, outlen, in, inlen)); } #endif /* LIBXML_OUTPUT_ENABLED */ /** * UTF16BEToUTF8: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @inb: a pointer to an array of UTF-16 passed as a byte array * @inlenb: the length of @in in UTF-16 chars * * Take a block of UTF-16 ushorts in and try to convert it to an UTF-8 * block of chars out. This function assumes the endian property * is the same between the native type of this machine and the * inputed one. * * Returns the number of bytes written, or -1 if lack of space, or -2 * if the transcoding fails (if *in is not a valid utf16 string) * The value of *inlen after return is the number of octets consumed * if the return value is positive, else unpredictable. */ static int UTF16BEToUTF8(unsigned char* out, int *outlen, const unsigned char* inb, int *inlenb) { unsigned char* outstart = out; const unsigned char* processed = inb; unsigned char* outend = out + *outlen; unsigned short* in = (unsigned short*) inb; unsigned short* inend; unsigned int c, d, inlen; unsigned char *tmp; int bits; if ((*inlenb % 2) == 1) (*inlenb)--; inlen = *inlenb / 2; inend= in + inlen; while (in < inend) { if (xmlLittleEndian) { tmp = (unsigned char *) in; c = *tmp++; c = c << 8; c = c | (unsigned int) *tmp; in++; } else { c= *in++; } if ((c & 0xFC00) == 0xD800) { /* surrogates */ if (in >= inend) { /* (in > inend) shouldn't happens */ *outlen = out - outstart; *inlenb = processed - inb; return(-2); } if (xmlLittleEndian) { tmp = (unsigned char *) in; d = *tmp++; d = d << 8; d = d | (unsigned int) *tmp; in++; } else { d= *in++; } if ((d & 0xFC00) == 0xDC00) { c &= 0x03FF; c <<= 10; c |= d & 0x03FF; c += 0x10000; } else { *outlen = out - outstart; *inlenb = processed - inb; return(-2); } } /* assertion: c is a single UTF-4 value */ if (out >= outend) break; if (c < 0x80) { *out++= c; bits= -6; } else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } for ( ; bits >= 0; bits-= 6) { if (out >= outend) break; *out++= ((c >> bits) & 0x3F) | 0x80; } processed = (const unsigned char*) in; } *outlen = out - outstart; *inlenb = processed - inb; return(*outlen); } #ifdef LIBXML_OUTPUT_ENABLED /** * UTF8ToUTF16BE: * @outb: a pointer to an array of bytes to store the result * @outlen: the length of @outb * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * * Take a block of UTF-8 chars in and try to convert it to an UTF-16BE * block of chars out. * * Returns the number of byte written, or -1 by lack of space, or -2 * if the transcoding failed. */ static int UTF8ToUTF16BE(unsigned char* outb, int *outlen, const unsigned char* in, int *inlen) { unsigned short* out = (unsigned short*) outb; const unsigned char* processed = in; const unsigned char *const instart = in; unsigned short* outstart= out; unsigned short* outend; const unsigned char* inend; unsigned int c, d; int trailing; unsigned char *tmp; unsigned short tmp1, tmp2; /* UTF-16BE has no BOM */ if ((outb == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); if (in == NULL) { *outlen = 0; *inlen = 0; return(0); } inend= in + *inlen; outend = out + (*outlen / 2); while (in < inend) { d= *in++; if (d < 0x80) { c= d; trailing= 0; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } else if (d < 0xF8) { c= d & 0x07; trailing= 3; } else { /* no chance for this in UTF-16 */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } if (inend - in < trailing) { break; } for ( ; trailing; trailing--) { if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break; c <<= 6; c |= d & 0x3F; } /* assertion: c is a single UTF-4 value */ if (c < 0x10000) { if (out >= outend) break; if (xmlLittleEndian) { tmp = (unsigned char *) out; *tmp = c >> 8; *(tmp + 1) = c; out++; } else { *out++ = c; } } else if (c < 0x110000) { if (out+1 >= outend) break; c -= 0x10000; if (xmlLittleEndian) { tmp1 = 0xD800 | (c >> 10); tmp = (unsigned char *) out; *tmp = tmp1 >> 8; *(tmp + 1) = (unsigned char) tmp1; out++; tmp2 = 0xDC00 | (c & 0x03FF); tmp = (unsigned char *) out; *tmp = tmp2 >> 8; *(tmp + 1) = (unsigned char) tmp2; out++; } else { *out++ = 0xD800 | (c >> 10); *out++ = 0xDC00 | (c & 0x03FF); } } else break; processed = in; } *outlen = (out - outstart) * 2; *inlen = processed - instart; return(*outlen); } #endif /* LIBXML_OUTPUT_ENABLED */ /************************************************************************ * * * Generic encoding handling routines * * * ************************************************************************/ /** * xmlDetectCharEncoding: * @in: a pointer to the first bytes of the XML entity, must be at least * 2 bytes long (at least 4 if encoding is UTF4 variant). * @len: pointer to the length of the buffer * * Guess the encoding of the entity using the first bytes of the entity content * according to the non-normative appendix F of the XML-1.0 recommendation. * * Returns one of the XML_CHAR_ENCODING_... values. */ xmlCharEncoding xmlDetectCharEncoding(const unsigned char* in, int len) { if (in == NULL) return(XML_CHAR_ENCODING_NONE); if (len >= 4) { if ((in[0] == 0x00) && (in[1] == 0x00) && (in[2] == 0x00) && (in[3] == 0x3C)) return(XML_CHAR_ENCODING_UCS4BE); if ((in[0] == 0x3C) && (in[1] == 0x00) && (in[2] == 0x00) && (in[3] == 0x00)) return(XML_CHAR_ENCODING_UCS4LE); if ((in[0] == 0x00) && (in[1] == 0x00) && (in[2] == 0x3C) && (in[3] == 0x00)) return(XML_CHAR_ENCODING_UCS4_2143); if ((in[0] == 0x00) && (in[1] == 0x3C) && (in[2] == 0x00) && (in[3] == 0x00)) return(XML_CHAR_ENCODING_UCS4_3412); if ((in[0] == 0x4C) && (in[1] == 0x6F) && (in[2] == 0xA7) && (in[3] == 0x94)) return(XML_CHAR_ENCODING_EBCDIC); if ((in[0] == 0x3C) && (in[1] == 0x3F) && (in[2] == 0x78) && (in[3] == 0x6D)) return(XML_CHAR_ENCODING_UTF8); /* * Although not part of the recommendation, we also * attempt an "auto-recognition" of UTF-16LE and * UTF-16BE encodings. */ if ((in[0] == 0x3C) && (in[1] == 0x00) && (in[2] == 0x3F) && (in[3] == 0x00)) return(XML_CHAR_ENCODING_UTF16LE); if ((in[0] == 0x00) && (in[1] == 0x3C) && (in[2] == 0x00) && (in[3] == 0x3F)) return(XML_CHAR_ENCODING_UTF16BE); } if (len >= 3) { /* * Errata on XML-1.0 June 20 2001 * We now allow an UTF8 encoded BOM */ if ((in[0] == 0xEF) && (in[1] == 0xBB) && (in[2] == 0xBF)) return(XML_CHAR_ENCODING_UTF8); } /* For UTF-16 we can recognize by the BOM */ if (len >= 2) { if ((in[0] == 0xFE) && (in[1] == 0xFF)) return(XML_CHAR_ENCODING_UTF16BE); if ((in[0] == 0xFF) && (in[1] == 0xFE)) return(XML_CHAR_ENCODING_UTF16LE); } return(XML_CHAR_ENCODING_NONE); } /** * xmlCleanupEncodingAliases: * * Unregisters all aliases */ void xmlCleanupEncodingAliases(void) { int i; if (xmlCharEncodingAliases == NULL) return; for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (xmlCharEncodingAliases[i].name != NULL) xmlFree((char *) xmlCharEncodingAliases[i].name); if (xmlCharEncodingAliases[i].alias != NULL) xmlFree((char *) xmlCharEncodingAliases[i].alias); } xmlCharEncodingAliasesNb = 0; xmlCharEncodingAliasesMax = 0; xmlFree(xmlCharEncodingAliases); xmlCharEncodingAliases = NULL; } /** * xmlGetEncodingAlias: * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Lookup an encoding name for the given alias. * * Returns NULL if not found, otherwise the original name */ const char * xmlGetEncodingAlias(const char *alias) { int i; char upper[100]; if (alias == NULL) return(NULL); if (xmlCharEncodingAliases == NULL) return(NULL); for (i = 0;i < 99;i++) { upper[i] = toupper(alias[i]); if (upper[i] == 0) break; } upper[i] = 0; /* * Walk down the list looking for a definition of the alias */ for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { return(xmlCharEncodingAliases[i].name); } } return(NULL); } /** * xmlAddEncodingAlias: * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Registers an alias @alias for an encoding named @name. Existing alias * will be overwritten. * * Returns 0 in case of success, -1 in case of error */ int xmlAddEncodingAlias(const char *name, const char *alias) { int i; char upper[100]; if ((name == NULL) || (alias == NULL)) return(-1); for (i = 0;i < 99;i++) { upper[i] = toupper(alias[i]); if (upper[i] == 0) break; } upper[i] = 0; if (xmlCharEncodingAliases == NULL) { xmlCharEncodingAliasesNb = 0; xmlCharEncodingAliasesMax = 20; xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); if (xmlCharEncodingAliases == NULL) return(-1); } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) { xmlCharEncodingAliasesMax *= 2; xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) xmlRealloc(xmlCharEncodingAliases, xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); } /* * Walk down the list looking for a definition of the alias */ for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { /* * Replace the definition. */ xmlFree((char *) xmlCharEncodingAliases[i].name); xmlCharEncodingAliases[i].name = xmlMemStrdup(name); return(0); } } /* * Add the definition */ xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = xmlMemStrdup(name); xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = xmlMemStrdup(upper); xmlCharEncodingAliasesNb++; return(0); } /** * xmlDelEncodingAlias: * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Unregisters an encoding alias @alias * * Returns 0 in case of success, -1 in case of error */ int xmlDelEncodingAlias(const char *alias) { int i; if (alias == NULL) return(-1); if (xmlCharEncodingAliases == NULL) return(-1); /* * Walk down the list looking for a definition of the alias */ for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (!strcmp(xmlCharEncodingAliases[i].alias, alias)) { xmlFree((char *) xmlCharEncodingAliases[i].name); xmlFree((char *) xmlCharEncodingAliases[i].alias); xmlCharEncodingAliasesNb--; memmove(&xmlCharEncodingAliases[i], &xmlCharEncodingAliases[i + 1], sizeof(xmlCharEncodingAlias) * (xmlCharEncodingAliasesNb - i)); return(0); } } return(-1); } /** * xmlParseCharEncoding: * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) * * Compare the string to the encoding schemes already known. Note * that the comparison is case insensitive accordingly to the section * [XML] 4.3.3 Character Encoding in Entities. * * Returns one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE * if not recognized. */ xmlCharEncoding xmlParseCharEncoding(const char* name) { const char *alias; char upper[500]; int i; if (name == NULL) return(XML_CHAR_ENCODING_NONE); /* * Do the alias resolution */ alias = xmlGetEncodingAlias(name); if (alias != NULL) name = alias; for (i = 0;i < 499;i++) { upper[i] = toupper(name[i]); if (upper[i] == 0) break; } upper[i] = 0; if (!strcmp(upper, "")) return(XML_CHAR_ENCODING_NONE); if (!strcmp(upper, "UTF-8")) return(XML_CHAR_ENCODING_UTF8); if (!strcmp(upper, "UTF8")) return(XML_CHAR_ENCODING_UTF8); /* * NOTE: if we were able to parse this, the endianness of UTF16 is * already found and in use */ if (!strcmp(upper, "UTF-16")) return(XML_CHAR_ENCODING_UTF16LE); if (!strcmp(upper, "UTF16")) return(XML_CHAR_ENCODING_UTF16LE); if (!strcmp(upper, "ISO-10646-UCS-2")) return(XML_CHAR_ENCODING_UCS2); if (!strcmp(upper, "UCS-2")) return(XML_CHAR_ENCODING_UCS2); if (!strcmp(upper, "UCS2")) return(XML_CHAR_ENCODING_UCS2); /* * NOTE: if we were able to parse this, the endianness of UCS4 is * already found and in use */ if (!strcmp(upper, "ISO-10646-UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); if (!strcmp(upper, "UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); if (!strcmp(upper, "UCS4")) return(XML_CHAR_ENCODING_UCS4LE); if (!strcmp(upper, "ISO-8859-1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO-LATIN-1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO LATIN 1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO-8859-2")) return(XML_CHAR_ENCODING_8859_2); if (!strcmp(upper, "ISO-LATIN-2")) return(XML_CHAR_ENCODING_8859_2); if (!strcmp(upper, "ISO LATIN 2")) return(XML_CHAR_ENCODING_8859_2); if (!strcmp(upper, "ISO-8859-3")) return(XML_CHAR_ENCODING_8859_3); if (!strcmp(upper, "ISO-8859-4")) return(XML_CHAR_ENCODING_8859_4); if (!strcmp(upper, "ISO-8859-5")) return(XML_CHAR_ENCODING_8859_5); if (!strcmp(upper, "ISO-8859-6")) return(XML_CHAR_ENCODING_8859_6); if (!strcmp(upper, "ISO-8859-7")) return(XML_CHAR_ENCODING_8859_7); if (!strcmp(upper, "ISO-8859-8")) return(XML_CHAR_ENCODING_8859_8); if (!strcmp(upper, "ISO-8859-9")) return(XML_CHAR_ENCODING_8859_9); if (!strcmp(upper, "ISO-2022-JP")) return(XML_CHAR_ENCODING_2022_JP); if (!strcmp(upper, "SHIFT_JIS")) return(XML_CHAR_ENCODING_SHIFT_JIS); if (!strcmp(upper, "EUC-JP")) return(XML_CHAR_ENCODING_EUC_JP); #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Unknown encoding %s\n", name); #endif return(XML_CHAR_ENCODING_ERROR); } /** * xmlGetCharEncodingName: * @enc: the encoding * * The "canonical" name for XML encoding. * C.f. http://www.w3.org/TR/REC-xml#charencoding * Section 4.3.3 Character Encoding in Entities * * Returns the canonical name for the given encoding */ const char* xmlGetCharEncodingName(xmlCharEncoding enc) { switch (enc) { case XML_CHAR_ENCODING_ERROR: return(NULL); case XML_CHAR_ENCODING_NONE: return(NULL); case XML_CHAR_ENCODING_UTF8: return("UTF-8"); case XML_CHAR_ENCODING_UTF16LE: return("UTF-16"); case XML_CHAR_ENCODING_UTF16BE: return("UTF-16"); case XML_CHAR_ENCODING_EBCDIC: return("EBCDIC"); case XML_CHAR_ENCODING_UCS4LE: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS4BE: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS4_2143: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS4_3412: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS2: return("ISO-10646-UCS-2"); case XML_CHAR_ENCODING_8859_1: return("ISO-8859-1"); case XML_CHAR_ENCODING_8859_2: return("ISO-8859-2"); case XML_CHAR_ENCODING_8859_3: return("ISO-8859-3"); case XML_CHAR_ENCODING_8859_4: return("ISO-8859-4"); case XML_CHAR_ENCODING_8859_5: return("ISO-8859-5"); case XML_CHAR_ENCODING_8859_6: return("ISO-8859-6"); case XML_CHAR_ENCODING_8859_7: return("ISO-8859-7"); case XML_CHAR_ENCODING_8859_8: return("ISO-8859-8"); case XML_CHAR_ENCODING_8859_9: return("ISO-8859-9"); case XML_CHAR_ENCODING_2022_JP: return("ISO-2022-JP"); case XML_CHAR_ENCODING_SHIFT_JIS: return("Shift-JIS"); case XML_CHAR_ENCODING_EUC_JP: return("EUC-JP"); case XML_CHAR_ENCODING_ASCII: return(NULL); } return(NULL); } /************************************************************************ * * * Char encoding handlers * * * ************************************************************************/ /* the size should be growable, but it's not a big deal ... */ #define MAX_ENCODING_HANDLERS 50 static xmlCharEncodingHandlerPtr *handlers = NULL; static int nbCharEncodingHandler = 0; /* * The default is UTF-8 for XML, that's also the default used for the * parser internals, so the default encoding handler is NULL */ static xmlCharEncodingHandlerPtr xmlDefaultCharEncodingHandler = NULL; /** * xmlNewCharEncodingHandler: * @name: the encoding name, in UTF-8 format (ASCII actually) * @input: the xmlCharEncodingInputFunc to read that encoding * @output: the xmlCharEncodingOutputFunc to write that encoding * * Create and registers an xmlCharEncodingHandler. * * Returns the xmlCharEncodingHandlerPtr created (or NULL in case of error). */ xmlCharEncodingHandlerPtr xmlNewCharEncodingHandler(const char *name, xmlCharEncodingInputFunc input, xmlCharEncodingOutputFunc output) { xmlCharEncodingHandlerPtr handler; const char *alias; char upper[500]; int i; char *up = NULL; /* * Do the alias resolution */ alias = xmlGetEncodingAlias(name); if (alias != NULL) name = alias; /* * Keep only the uppercase version of the encoding. */ if (name == NULL) { xmlEncodingErr(XML_I18N_NO_NAME, "xmlNewCharEncodingHandler : no name !\n", NULL); return(NULL); } for (i = 0;i < 499;i++) { upper[i] = toupper(name[i]); if (upper[i] == 0) break; } upper[i] = 0; up = xmlMemStrdup(upper); if (up == NULL) { xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n"); return(NULL); } /* * allocate and fill-up an handler block. */ handler = (xmlCharEncodingHandlerPtr) xmlMalloc(sizeof(xmlCharEncodingHandler)); if (handler == NULL) { xmlFree(up); xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n"); return(NULL); } memset(handler, 0, sizeof(xmlCharEncodingHandler)); handler->input = input; handler->output = output; handler->name = up; #ifdef LIBXML_ICONV_ENABLED handler->iconv_in = NULL; handler->iconv_out = NULL; #endif #ifdef LIBXML_ICU_ENABLED handler->uconv_in = NULL; handler->uconv_out = NULL; #endif /* * registers and returns the handler. */ xmlRegisterCharEncodingHandler(handler); #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Registered encoding handler for %s\n", name); #endif return(handler); } /** * xmlInitCharEncodingHandlers: * * Initialize the char encoding support, it registers the default * encoding supported. * NOTE: while public, this function usually doesn't need to be called * in normal processing. */ void xmlInitCharEncodingHandlers(void) { unsigned short int tst = 0x1234; unsigned char *ptr = (unsigned char *) &tst; if (handlers != NULL) return; handlers = (xmlCharEncodingHandlerPtr *) xmlMalloc(MAX_ENCODING_HANDLERS * sizeof(xmlCharEncodingHandlerPtr)); if (*ptr == 0x12) xmlLittleEndian = 0; else if (*ptr == 0x34) xmlLittleEndian = 1; else { xmlEncodingErr(XML_ERR_INTERNAL_ERROR, "Odd problem at endianness detection\n", NULL); } if (handlers == NULL) { xmlEncodingErrMemory("xmlInitCharEncodingHandlers : out of memory !\n"); return; } xmlNewCharEncodingHandler("UTF-8", UTF8ToUTF8, UTF8ToUTF8); #ifdef LIBXML_OUTPUT_ENABLED xmlUTF16LEHandler = xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, UTF8ToUTF16LE); xmlUTF16BEHandler = xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, UTF8ToUTF16BE); xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, UTF8ToUTF16); xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, UTF8Toisolat1); xmlNewCharEncodingHandler("ASCII", asciiToUTF8, UTF8Toascii); xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, UTF8Toascii); #ifdef LIBXML_HTML_ENABLED xmlNewCharEncodingHandler("HTML", NULL, UTF8ToHtml); #endif #else xmlUTF16LEHandler = xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, NULL); xmlUTF16BEHandler = xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, NULL); xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, NULL); xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, NULL); xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL); xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL); #endif /* LIBXML_OUTPUT_ENABLED */ #if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) #ifdef LIBXML_ISO8859X_ENABLED xmlRegisterCharEncodingHandlersISO8859x (); #endif #endif } /** * xmlCleanupCharEncodingHandlers: * * Cleanup the memory allocated for the char encoding support, it * unregisters all the encoding handlers and the aliases. */ void xmlCleanupCharEncodingHandlers(void) { xmlCleanupEncodingAliases(); if (handlers == NULL) return; for (;nbCharEncodingHandler > 0;) { nbCharEncodingHandler--; if (handlers[nbCharEncodingHandler] != NULL) { if (handlers[nbCharEncodingHandler]->name != NULL) xmlFree(handlers[nbCharEncodingHandler]->name); xmlFree(handlers[nbCharEncodingHandler]); } } xmlFree(handlers); handlers = NULL; nbCharEncodingHandler = 0; xmlDefaultCharEncodingHandler = NULL; } /** * xmlRegisterCharEncodingHandler: * @handler: the xmlCharEncodingHandlerPtr handler block * * Register the char encoding handler, surprising, isn't it ? */ void xmlRegisterCharEncodingHandler(xmlCharEncodingHandlerPtr handler) { if (handlers == NULL) xmlInitCharEncodingHandlers(); if ((handler == NULL) || (handlers == NULL)) { xmlEncodingErr(XML_I18N_NO_HANDLER, "xmlRegisterCharEncodingHandler: NULL handler !\n", NULL); return; } if (nbCharEncodingHandler >= MAX_ENCODING_HANDLERS) { xmlEncodingErr(XML_I18N_EXCESS_HANDLER, "xmlRegisterCharEncodingHandler: Too many handler registered, see %s\n", "MAX_ENCODING_HANDLERS"); return; } handlers[nbCharEncodingHandler++] = handler; } /** * xmlGetCharEncodingHandler: * @enc: an xmlCharEncoding value. * * Search in the registered set the handler able to read/write that encoding. * * Returns the handler or NULL if not found */ xmlCharEncodingHandlerPtr xmlGetCharEncodingHandler(xmlCharEncoding enc) { xmlCharEncodingHandlerPtr handler; if (handlers == NULL) xmlInitCharEncodingHandlers(); switch (enc) { case XML_CHAR_ENCODING_ERROR: return(NULL); case XML_CHAR_ENCODING_NONE: return(NULL); case XML_CHAR_ENCODING_UTF8: return(NULL); case XML_CHAR_ENCODING_UTF16LE: return(xmlUTF16LEHandler); case XML_CHAR_ENCODING_UTF16BE: return(xmlUTF16BEHandler); case XML_CHAR_ENCODING_EBCDIC: handler = xmlFindCharEncodingHandler("EBCDIC"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("ebcdic"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("EBCDIC-US"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("IBM-037"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_UCS4BE: handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("UCS-4"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("UCS4"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_UCS4LE: handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("UCS-4"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("UCS4"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_UCS4_2143: break; case XML_CHAR_ENCODING_UCS4_3412: break; case XML_CHAR_ENCODING_UCS2: handler = xmlFindCharEncodingHandler("ISO-10646-UCS-2"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("UCS-2"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("UCS2"); if (handler != NULL) return(handler); break; /* * We used to keep ISO Latin encodings native in the * generated data. This led to so many problems that * this has been removed. One can still change this * back by registering no-ops encoders for those */ case XML_CHAR_ENCODING_8859_1: handler = xmlFindCharEncodingHandler("ISO-8859-1"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_2: handler = xmlFindCharEncodingHandler("ISO-8859-2"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_3: handler = xmlFindCharEncodingHandler("ISO-8859-3"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_4: handler = xmlFindCharEncodingHandler("ISO-8859-4"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_5: handler = xmlFindCharEncodingHandler("ISO-8859-5"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_6: handler = xmlFindCharEncodingHandler("ISO-8859-6"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_7: handler = xmlFindCharEncodingHandler("ISO-8859-7"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_8: handler = xmlFindCharEncodingHandler("ISO-8859-8"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_8859_9: handler = xmlFindCharEncodingHandler("ISO-8859-9"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_2022_JP: handler = xmlFindCharEncodingHandler("ISO-2022-JP"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_SHIFT_JIS: handler = xmlFindCharEncodingHandler("SHIFT-JIS"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("SHIFT_JIS"); if (handler != NULL) return(handler); handler = xmlFindCharEncodingHandler("Shift_JIS"); if (handler != NULL) return(handler); break; case XML_CHAR_ENCODING_EUC_JP: handler = xmlFindCharEncodingHandler("EUC-JP"); if (handler != NULL) return(handler); break; default: break; } #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "No handler found for encoding %d\n", enc); #endif return(NULL); } /** * xmlFindCharEncodingHandler: * @name: a string describing the char encoding. * * Search in the registered set the handler able to read/write that encoding. * * Returns the handler or NULL if not found */ xmlCharEncodingHandlerPtr xmlFindCharEncodingHandler(const char *name) { const char *nalias; const char *norig; xmlCharEncoding alias; #ifdef LIBXML_ICONV_ENABLED xmlCharEncodingHandlerPtr enc; iconv_t icv_in, icv_out; #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED xmlCharEncodingHandlerPtr encu; uconv_t *ucv_in, *ucv_out; #endif /* LIBXML_ICU_ENABLED */ char upper[100]; int i; if (handlers == NULL) xmlInitCharEncodingHandlers(); if (name == NULL) return(xmlDefaultCharEncodingHandler); if (name[0] == 0) return(xmlDefaultCharEncodingHandler); /* * Do the alias resolution */ norig = name; nalias = xmlGetEncodingAlias(name); if (nalias != NULL) name = nalias; /* * Check first for directly registered encoding names */ for (i = 0;i < 99;i++) { upper[i] = toupper(name[i]); if (upper[i] == 0) break; } upper[i] = 0; if (handlers != NULL) { for (i = 0;i < nbCharEncodingHandler; i++) { if (!strcmp(upper, handlers[i]->name)) { #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Found registered handler for encoding %s\n", name); #endif return(handlers[i]); } } } #ifdef LIBXML_ICONV_ENABLED /* check whether iconv can handle this */ icv_in = iconv_open("UTF-8", name); icv_out = iconv_open(name, "UTF-8"); if (icv_in == (iconv_t) -1) { icv_in = iconv_open("UTF-8", upper); } if (icv_out == (iconv_t) -1) { icv_out = iconv_open(upper, "UTF-8"); } if ((icv_in != (iconv_t) -1) && (icv_out != (iconv_t) -1)) { enc = (xmlCharEncodingHandlerPtr) xmlMalloc(sizeof(xmlCharEncodingHandler)); if (enc == NULL) { iconv_close(icv_in); iconv_close(icv_out); return(NULL); } memset(enc, 0, sizeof(xmlCharEncodingHandler)); enc->name = xmlMemStrdup(name); enc->input = NULL; enc->output = NULL; enc->iconv_in = icv_in; enc->iconv_out = icv_out; #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Found iconv handler for encoding %s\n", name); #endif return enc; } else if ((icv_in != (iconv_t) -1) || icv_out != (iconv_t) -1) { xmlEncodingErr(XML_ERR_INTERNAL_ERROR, "iconv : problems with filters for '%s'\n", name); } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED /* check whether icu can handle this */ ucv_in = openIcuConverter(name, 1); ucv_out = openIcuConverter(name, 0); if (ucv_in != NULL && ucv_out != NULL) { encu = (xmlCharEncodingHandlerPtr) xmlMalloc(sizeof(xmlCharEncodingHandler)); if (encu == NULL) { closeIcuConverter(ucv_in); closeIcuConverter(ucv_out); return(NULL); } memset(encu, 0, sizeof(xmlCharEncodingHandler)); encu->name = xmlMemStrdup(name); encu->input = NULL; encu->output = NULL; encu->uconv_in = ucv_in; encu->uconv_out = ucv_out; #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Found ICU converter handler for encoding %s\n", name); #endif return encu; } else if (ucv_in != NULL || ucv_out != NULL) { closeIcuConverter(ucv_in); closeIcuConverter(ucv_out); xmlEncodingErr(XML_ERR_INTERNAL_ERROR, "ICU converter : problems with filters for '%s'\n", name); } #endif /* LIBXML_ICU_ENABLED */ #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "No handler found for encoding %s\n", name); #endif /* * Fallback using the canonical names */ alias = xmlParseCharEncoding(norig); if (alias != XML_CHAR_ENCODING_ERROR) { const char* canon; canon = xmlGetCharEncodingName(alias); if ((canon != NULL) && (strcmp(name, canon))) { return(xmlFindCharEncodingHandler(canon)); } } /* If "none of the above", give up */ return(NULL); } /************************************************************************ * * * ICONV based generic conversion functions * * * ************************************************************************/ #ifdef LIBXML_ICONV_ENABLED /** * xmlIconvWrapper: * @cd: iconv converter data structure * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of ISO Latin 1 chars * @inlen: the length of @in * * Returns 0 if success, or * -1 by lack of space, or * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or * -3 if there the last byte can't form a single output char. * * The value of @inlen after return is the number of octets consumed * as the return value is positive, else unpredictable. * The value of @outlen after return is the number of ocetes consumed. */ static int xmlIconvWrapper(iconv_t cd, unsigned char *out, int *outlen, const unsigned char *in, int *inlen) { size_t icv_inlen, icv_outlen; const char *icv_in = (const char *) in; char *icv_out = (char *) out; int ret; if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) { if (outlen != NULL) *outlen = 0; return(-1); } icv_inlen = *inlen; icv_outlen = *outlen; ret = iconv(cd, (ICONV_CONST char **) &icv_in, &icv_inlen, &icv_out, &icv_outlen); *inlen -= icv_inlen; *outlen -= icv_outlen; if ((icv_inlen != 0) || (ret == -1)) { #ifdef EILSEQ if (errno == EILSEQ) { return -2; } else #endif #ifdef E2BIG if (errno == E2BIG) { return -1; } else #endif #ifdef EINVAL if (errno == EINVAL) { return -3; } else #endif { return -3; } } return 0; } #endif /* LIBXML_ICONV_ENABLED */ /************************************************************************ * * * ICU based generic conversion functions * * * ************************************************************************/ #ifdef LIBXML_ICU_ENABLED /** * xmlUconvWrapper: * @cd: ICU uconverter data structure * @toUnicode : non-zero if toUnicode. 0 otherwise. * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of ISO Latin 1 chars * @inlen: the length of @in * * Returns 0 if success, or * -1 by lack of space, or * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or * -3 if there the last byte can't form a single output char. * * The value of @inlen after return is the number of octets consumed * as the return value is positive, else unpredictable. * The value of @outlen after return is the number of ocetes consumed. */ static int xmlUconvWrapper(uconv_t *cd, int toUnicode, unsigned char *out, int *outlen, const unsigned char *in, int *inlen) { const char *ucv_in = (const char *) in; char *ucv_out = (char *) out; UErrorCode err = U_ZERO_ERROR; if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) { if (outlen != NULL) *outlen = 0; return(-1); } /* * TODO(jungshik) * 1. is ucnv_convert(To|From)Algorithmic better? * 2. had we better use an explicit pivot buffer? * 3. error returned comes from 'fromUnicode' only even * when toUnicode is true ! */ if (toUnicode) { /* encoding => UTF-16 => UTF-8 */ ucnv_convertEx(cd->utf8, cd->uconv, &ucv_out, ucv_out + *outlen, &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, 0, TRUE, &err); } else { /* UTF-8 => UTF-16 => encoding */ ucnv_convertEx(cd->uconv, cd->utf8, &ucv_out, ucv_out + *outlen, &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, 0, TRUE, &err); } *inlen = ucv_in - (const char*) in; *outlen = ucv_out - (char *) out; if (U_SUCCESS(err)) return 0; if (err == U_BUFFER_OVERFLOW_ERROR) return -1; if (err == U_INVALID_CHAR_FOUND || err == U_ILLEGAL_CHAR_FOUND) return -2; /* if (err == U_TRUNCATED_CHAR_FOUND) */ return -3; } #endif /* LIBXML_ICU_ENABLED */ /************************************************************************ * * * The real API used by libxml for on-the-fly conversion * * * ************************************************************************/ /** * xmlCharEncFirstLineInt: * @handler: char enconding transformation data structure * @out: an xmlBuffer for the output. * @in: an xmlBuffer for the input * @len: number of bytes to convert for the first line, or -1 * * Front-end for the encoding handler input function, but handle only * the very first line, i.e. limit itself to 45 chars. * * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or */ int xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in, int len) { int ret = -2; int written; int toconv; if (handler == NULL) return(-1); if (out == NULL) return(-1); if (in == NULL) return(-1); /* calculate space available */ written = out->size - out->use - 1; /* count '\0' */ toconv = in->use; /* * echo '' | wc -c => 38 * 45 chars should be sufficient to reach the end of the encoding * declaration without going too far inside the document content. * on UTF-16 this means 90bytes, on UCS4 this means 180 * The actual value depending on guessed encoding is passed as @len * if provided */ if (len >= 0) { if (toconv > len) toconv = len; } else { if (toconv > 180) toconv = 180; } if (toconv * 2 >= written) { xmlBufferGrow(out, toconv * 2); written = out->size - out->use - 1; } if (handler->input != NULL) { ret = handler->input(&out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; out->content[out->use] = 0; } #ifdef LIBXML_ICONV_ENABLED else if (handler->iconv_in != NULL) { ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; out->content[out->use] = 0; if (ret == -1) ret = -3; } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (handler->uconv_in != NULL) { ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; out->content[out->use] = 0; if (ret == -1) ret = -3; } #endif /* LIBXML_ICU_ENABLED */ #ifdef DEBUG_ENCODING switch (ret) { case 0: xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input\n", toconv, written); break; case -1: xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n", toconv, written, in->use); break; case -2: xmlGenericError(xmlGenericErrorContext, "input conversion failed due to input error\n"); break; case -3: xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n", toconv, written, in->use); break; default: xmlGenericError(xmlGenericErrorContext,"Unknown input conversion failed %d\n", ret); } #endif /* DEBUG_ENCODING */ /* * Ignore when input buffer is not on a boundary */ if (ret == -3) ret = 0; if (ret == -1) ret = 0; return(ret); } /** * xmlCharEncFirstLine: * @handler: char enconding transformation data structure * @out: an xmlBuffer for the output. * @in: an xmlBuffer for the input * * Front-end for the encoding handler input function, but handle only * the very first line, i.e. limit itself to 45 chars. * * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or */ int xmlCharEncFirstLine(xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in) { return(xmlCharEncFirstLineInt(handler, out, in, -1)); } /** * xmlCharEncFirstLineInput: * @input: a parser input buffer * @len: number of bytes to convert for the first line, or -1 * * Front-end for the encoding handler input function, but handle only * the very first line. Point is that this is based on autodetection * of the encoding and once that first line is converted we may find * out that a different decoder is needed to process the input. * * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or */ int xmlCharEncFirstLineInput(xmlParserInputBufferPtr input, int len) { int ret = -2; size_t written; size_t toconv; int c_in; int c_out; xmlBufPtr in; xmlBufPtr out; if ((input == NULL) || (input->encoder == NULL) || (input->buffer == NULL) || (input->raw == NULL)) return (-1); out = input->buffer; in = input->raw; toconv = xmlBufUse(in); if (toconv == 0) return (0); written = xmlBufAvail(out) - 1; /* count '\0' */ /* * echo '' | wc -c => 38 * 45 chars should be sufficient to reach the end of the encoding * declaration without going too far inside the document content. * on UTF-16 this means 90bytes, on UCS4 this means 180 * The actual value depending on guessed encoding is passed as @len * if provided */ if (len >= 0) { if (toconv > (unsigned int) len) toconv = len; } else { if (toconv > 180) toconv = 180; } if (toconv * 2 >= written) { xmlBufGrow(out, toconv * 2); written = xmlBufAvail(out) - 1; } if (written > 360) written = 360; c_in = toconv; c_out = written; if (input->encoder->input != NULL) { ret = input->encoder->input(xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); } #ifdef LIBXML_ICONV_ENABLED else if (input->encoder->iconv_in != NULL) { ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); if (ret == -1) ret = -3; } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (input->encoder->uconv_in != NULL) { ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); if (ret == -1) ret = -3; } #endif /* LIBXML_ICU_ENABLED */ switch (ret) { case 0: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input\n", c_in, c_out); #endif break; case -1: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input, %d left\n", c_in, c_out, (int)xmlBufUse(in)); #endif break; case -3: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input, %d left\n", c_in, c_out, (int)xmlBufUse(in)); #endif break; case -2: { char buf[50]; const xmlChar *content = xmlBufContent(in); snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", content[0], content[1], content[2], content[3]); buf[49] = 0; xmlEncodingErr(XML_I18N_CONV_FAILED, "input conversion failed due to input error, bytes %s\n", buf); } } /* * Ignore when input buffer is not on a boundary */ if (ret == -3) ret = 0; if (ret == -1) ret = 0; return(ret); } /** * xmlCharEncInput: * @input: a parser input buffer * @flush: try to flush all the raw buffer * * Generic front-end for the encoding handler on parser input * * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or */ int xmlCharEncInput(xmlParserInputBufferPtr input, int flush) { int ret = -2; size_t written; size_t toconv; int c_in; int c_out; xmlBufPtr in; xmlBufPtr out; if ((input == NULL) || (input->encoder == NULL) || (input->buffer == NULL) || (input->raw == NULL)) return (-1); out = input->buffer; in = input->raw; toconv = xmlBufUse(in); if (toconv == 0) return (0); if ((toconv > 64 * 1024) && (flush == 0)) toconv = 64 * 1024; written = xmlBufAvail(out); if (written > 0) written--; /* count '\0' */ if (toconv * 2 >= written) { xmlBufGrow(out, toconv * 2); written = xmlBufAvail(out); if (written > 0) written--; /* count '\0' */ } if ((written > 128 * 1024) && (flush == 0)) written = 128 * 1024; c_in = toconv; c_out = written; if (input->encoder->input != NULL) { ret = input->encoder->input(xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); } #ifdef LIBXML_ICONV_ENABLED else if (input->encoder->iconv_in != NULL) { ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); if (ret == -1) ret = -3; } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (input->encoder->uconv_in != NULL) { ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); if (ret == -1) ret = -3; } #endif /* LIBXML_ICU_ENABLED */ switch (ret) { case 0: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input\n", c_in, c_out); #endif break; case -1: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input, %d left\n", c_in, c_out, (int)xmlBufUse(in)); #endif break; case -3: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input, %d left\n", c_in, c_out, (int)xmlBufUse(in)); #endif break; case -2: { char buf[50]; const xmlChar *content = xmlBufContent(in); snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", content[0], content[1], content[2], content[3]); buf[49] = 0; xmlEncodingErr(XML_I18N_CONV_FAILED, "input conversion failed due to input error, bytes %s\n", buf); } } /* * Ignore when input buffer is not on a boundary */ if (ret == -3) ret = 0; return (c_out? c_out : ret); } /** * xmlCharEncInFunc: * @handler: char encoding transformation data structure * @out: an xmlBuffer for the output. * @in: an xmlBuffer for the input * * Generic front-end for the encoding handler input function * * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or */ int xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, xmlBufferPtr in) { int ret = -2; int written; int toconv; if (handler == NULL) return (-1); if (out == NULL) return (-1); if (in == NULL) return (-1); toconv = in->use; if (toconv == 0) return (0); written = out->size - out->use -1; /* count '\0' */ if (toconv * 2 >= written) { xmlBufferGrow(out, out->size + toconv * 2); written = out->size - out->use - 1; } if (handler->input != NULL) { ret = handler->input(&out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; out->content[out->use] = 0; } #ifdef LIBXML_ICONV_ENABLED else if (handler->iconv_in != NULL) { ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; out->content[out->use] = 0; if (ret == -1) ret = -3; } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (handler->uconv_in != NULL) { ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; out->content[out->use] = 0; if (ret == -1) ret = -3; } #endif /* LIBXML_ICU_ENABLED */ switch (ret) { case 0: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input\n", toconv, written); #endif break; case -1: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input, %d left\n", toconv, written, in->use); #endif break; case -3: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of input, %d left\n", toconv, written, in->use); #endif break; case -2: { char buf[50]; snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", in->content[0], in->content[1], in->content[2], in->content[3]); buf[49] = 0; xmlEncodingErr(XML_I18N_CONV_FAILED, "input conversion failed due to input error, bytes %s\n", buf); } } /* * Ignore when input buffer is not on a boundary */ if (ret == -3) ret = 0; return (written? written : ret); } /** * xmlCharEncOutput: * @output: a parser output buffer * @init: is this an initialization call without data * * Generic front-end for the encoding handler on parser output * a first call with @init == 1 has to be made first to initiate the * output in case of non-stateless encoding needing to initiate their * state or the output (like the BOM in UTF16). * In case of UTF8 sequence conversion errors for the given encoder, * the content will be automatically remapped to a CharRef sequence. * * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or */ int xmlCharEncOutput(xmlOutputBufferPtr output, int init) { int ret = -2; size_t written; size_t writtentot = 0; size_t toconv; int c_in; int c_out; xmlBufPtr in; xmlBufPtr out; int charref_len = 0; if ((output == NULL) || (output->encoder == NULL) || (output->buffer == NULL) || (output->conv == NULL)) return (-1); out = output->conv; in = output->buffer; retry: written = xmlBufAvail(out); if (written > 0) written--; /* count '\0' */ /* * First specific handling of the initialization call */ if (init) { c_in = 0; c_out = written; if (output->encoder->output != NULL) { ret = output->encoder->output(xmlBufEnd(out), &c_out, NULL, &c_in); if (ret > 0) /* Gennady: check return value */ xmlBufAddLen(out, c_out); } #ifdef LIBXML_ICONV_ENABLED else if (output->encoder->iconv_out != NULL) { ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out), &c_out, NULL, &c_in); xmlBufAddLen(out, c_out); } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (output->encoder->uconv_out != NULL) { ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out), &c_out, NULL, &c_in); xmlBufAddLen(out, c_out); } #endif /* LIBXML_ICU_ENABLED */ #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "initialized encoder\n"); #endif return(0); } /* * Conversion itself. */ toconv = xmlBufUse(in); if (toconv == 0) return (0); if (toconv > 64 * 1024) toconv = 64 * 1024; if (toconv * 4 >= written) { xmlBufGrow(out, toconv * 4); written = xmlBufAvail(out) - 1; } if (written > 256 * 1024) written = 256 * 1024; c_in = toconv; c_out = written; if (output->encoder->output != NULL) { ret = output->encoder->output(xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); if (c_out > 0) { xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); writtentot += c_out; } } #ifdef LIBXML_ICONV_ENABLED else if (output->encoder->iconv_out != NULL) { ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); writtentot += c_out; if (ret == -1) { if (c_out > 0) { /* * Can be a limitation of iconv */ charref_len = 0; goto retry; } ret = -3; } } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (output->encoder->uconv_out != NULL) { ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out), &c_out, xmlBufContent(in), &c_in); xmlBufShrink(in, c_in); xmlBufAddLen(out, c_out); writtentot += c_out; if (ret == -1) { if (c_out > 0) { /* * Can be a limitation of uconv */ charref_len = 0; goto retry; } ret = -3; } } #endif /* LIBXML_ICU_ENABLED */ else { xmlEncodingErr(XML_I18N_NO_OUTPUT, "xmlCharEncOutFunc: no output function !\n", NULL); return(-1); } if (ret >= 0) output += ret; /* * Attempt to handle error cases */ switch (ret) { case 0: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of output\n", c_in, c_out); #endif break; case -1: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "output conversion failed by lack of space\n"); #endif break; case -3: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n", c_in, c_out, (int) xmlBufUse(in)); #endif break; case -2: { int len = (int) xmlBufUse(in); xmlChar *content = xmlBufContent(in); int cur; cur = xmlGetUTF8Char(content, &len); if ((charref_len != 0) && (c_out < charref_len)) { /* * We attempted to insert a character reference and failed. * Undo what was written and skip the remaining charref. */ xmlBufErase(out, c_out); writtentot -= c_out; xmlBufShrink(in, charref_len - c_out); charref_len = 0; ret = -1; break; } else if (cur > 0) { xmlChar charref[20]; #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "handling output conversion error\n"); xmlGenericError(xmlGenericErrorContext, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", content[0], content[1], content[2], content[3]); #endif /* * Removes the UTF8 sequence, and replace it by a charref * and continue the transcoding phase, hoping the error * did not mangle the encoder state. */ charref_len = snprintf((char *) &charref[0], sizeof(charref), "&#%d;", cur); xmlBufShrink(in, len); xmlBufAddHead(in, charref, -1); goto retry; } else { char buf[50]; snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", content[0], content[1], content[2], content[3]); buf[49] = 0; xmlEncodingErr(XML_I18N_CONV_FAILED, "output conversion failed due to conv error, bytes %s\n", buf); if (xmlBufGetAllocationScheme(in) != XML_BUFFER_ALLOC_IMMUTABLE) content[0] = ' '; } break; } } return(ret); } /** * xmlCharEncOutFunc: * @handler: char enconding transformation data structure * @out: an xmlBuffer for the output. * @in: an xmlBuffer for the input * * Generic front-end for the encoding handler output function * a first call with @in == NULL has to be made firs to initiate the * output in case of non-stateless encoding needing to initiate their * state or the output (like the BOM in UTF16). * In case of UTF8 sequence conversion errors for the given encoder, * the content will be automatically remapped to a CharRef sequence. * * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or */ int xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in) { int ret = -2; int written; int writtentot = 0; int toconv; int output = 0; int charref_len = 0; if (handler == NULL) return(-1); if (out == NULL) return(-1); retry: written = out->size - out->use; if (written > 0) written--; /* Gennady: count '/0' */ /* * First specific handling of in = NULL, i.e. the initialization call */ if (in == NULL) { toconv = 0; if (handler->output != NULL) { ret = handler->output(&out->content[out->use], &written, NULL, &toconv); if (ret >= 0) { /* Gennady: check return value */ out->use += written; out->content[out->use] = 0; } } #ifdef LIBXML_ICONV_ENABLED else if (handler->iconv_out != NULL) { ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], &written, NULL, &toconv); out->use += written; out->content[out->use] = 0; } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (handler->uconv_out != NULL) { ret = xmlUconvWrapper(handler->uconv_out, 0, &out->content[out->use], &written, NULL, &toconv); out->use += written; out->content[out->use] = 0; } #endif /* LIBXML_ICU_ENABLED */ #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "initialized encoder\n"); #endif return(0); } /* * Conversion itself. */ toconv = in->use; if (toconv == 0) return(0); if (toconv * 4 >= written) { xmlBufferGrow(out, toconv * 4); written = out->size - out->use - 1; } if (handler->output != NULL) { ret = handler->output(&out->content[out->use], &written, in->content, &toconv); if (written > 0) { xmlBufferShrink(in, toconv); out->use += written; writtentot += written; } out->content[out->use] = 0; } #ifdef LIBXML_ICONV_ENABLED else if (handler->iconv_out != NULL) { ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; writtentot += written; out->content[out->use] = 0; if (ret == -1) { if (written > 0) { /* * Can be a limitation of iconv */ charref_len = 0; goto retry; } ret = -3; } } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED else if (handler->uconv_out != NULL) { ret = xmlUconvWrapper(handler->uconv_out, 0, &out->content[out->use], &written, in->content, &toconv); xmlBufferShrink(in, toconv); out->use += written; writtentot += written; out->content[out->use] = 0; if (ret == -1) { if (written > 0) { /* * Can be a limitation of iconv */ charref_len = 0; goto retry; } ret = -3; } } #endif /* LIBXML_ICU_ENABLED */ else { xmlEncodingErr(XML_I18N_NO_OUTPUT, "xmlCharEncOutFunc: no output function !\n", NULL); return(-1); } if (ret >= 0) output += ret; /* * Attempt to handle error cases */ switch (ret) { case 0: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "converted %d bytes to %d bytes of output\n", toconv, written); #endif break; case -1: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "output conversion failed by lack of space\n"); #endif break; case -3: #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n", toconv, written, in->use); #endif break; case -2: { int len = in->use; const xmlChar *utf = (const xmlChar *) in->content; int cur; cur = xmlGetUTF8Char(utf, &len); if ((charref_len != 0) && (written < charref_len)) { /* * We attempted to insert a character reference and failed. * Undo what was written and skip the remaining charref. */ out->use -= written; writtentot -= written; xmlBufferShrink(in, charref_len - written); charref_len = 0; ret = -1; break; } else if (cur > 0) { xmlChar charref[20]; #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "handling output conversion error\n"); xmlGenericError(xmlGenericErrorContext, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", in->content[0], in->content[1], in->content[2], in->content[3]); #endif /* * Removes the UTF8 sequence, and replace it by a charref * and continue the transcoding phase, hoping the error * did not mangle the encoder state. */ charref_len = snprintf((char *) &charref[0], sizeof(charref), "&#%d;", cur); xmlBufferShrink(in, len); xmlBufferAddHead(in, charref, -1); goto retry; } else { char buf[50]; snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", in->content[0], in->content[1], in->content[2], in->content[3]); buf[49] = 0; xmlEncodingErr(XML_I18N_CONV_FAILED, "output conversion failed due to conv error, bytes %s\n", buf); if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE) in->content[0] = ' '; } break; } } return(ret); } /** * xmlCharEncCloseFunc: * @handler: char enconding transformation data structure * * Generic front-end for encoding handler close function * * Returns 0 if success, or -1 in case of error */ int xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { int ret = 0; int tofree = 0; if (handler == NULL) return(-1); if (handler->name == NULL) return(-1); #ifdef LIBXML_ICONV_ENABLED /* * Iconv handlers can be used only once, free the whole block. * and the associated icon resources. */ if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { tofree = 1; if (handler->iconv_out != NULL) { if (iconv_close(handler->iconv_out)) ret = -1; handler->iconv_out = NULL; } if (handler->iconv_in != NULL) { if (iconv_close(handler->iconv_in)) ret = -1; handler->iconv_in = NULL; } } #endif /* LIBXML_ICONV_ENABLED */ #ifdef LIBXML_ICU_ENABLED if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) { tofree = 1; if (handler->uconv_out != NULL) { closeIcuConverter(handler->uconv_out); handler->uconv_out = NULL; } if (handler->uconv_in != NULL) { closeIcuConverter(handler->uconv_in); handler->uconv_in = NULL; } } #endif if (tofree) { /* free up only dynamic handlers iconv/uconv */ if (handler->name != NULL) xmlFree(handler->name); handler->name = NULL; xmlFree(handler); } #ifdef DEBUG_ENCODING if (ret) xmlGenericError(xmlGenericErrorContext, "failed to close the encoding handler\n"); else xmlGenericError(xmlGenericErrorContext, "closed the encoding handler\n"); #endif return(ret); } /** * xmlByteConsumed: * @ctxt: an XML parser context * * This function provides the current index of the parser relative * to the start of the current entity. This function is computed in * bytes from the beginning starting at zero and finishing at the * size in byte of the file if parsing a file. The function is * of constant cost if the input is UTF-8 but can be costly if run * on non-UTF-8 input. * * Returns the index in bytes from the beginning of the entity or -1 * in case the index could not be computed. */ long xmlByteConsumed(xmlParserCtxtPtr ctxt) { xmlParserInputPtr in; if (ctxt == NULL) return(-1); in = ctxt->input; if (in == NULL) return(-1); if ((in->buf != NULL) && (in->buf->encoder != NULL)) { unsigned int unused = 0; xmlCharEncodingHandler * handler = in->buf->encoder; /* * Encoding conversion, compute the number of unused original * bytes from the input not consumed and substract that from * the raw consumed value, this is not a cheap operation */ if (in->end - in->cur > 0) { unsigned char convbuf[32000]; const unsigned char *cur = (const unsigned char *)in->cur; int toconv = in->end - in->cur, written = 32000; int ret; if (handler->output != NULL) { do { toconv = in->end - cur; written = 32000; ret = handler->output(&convbuf[0], &written, cur, &toconv); if (ret == -1) return(-1); unused += written; cur += toconv; } while (ret == -2); #ifdef LIBXML_ICONV_ENABLED } else if (handler->iconv_out != NULL) { do { toconv = in->end - cur; written = 32000; ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0], &written, cur, &toconv); if (ret < 0) { if (written > 0) ret = -2; else return(-1); } unused += written; cur += toconv; } while (ret == -2); #endif #ifdef LIBXML_ICU_ENABLED } else if (handler->uconv_out != NULL) { do { toconv = in->end - cur; written = 32000; ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0], &written, cur, &toconv); if (ret < 0) { if (written > 0) ret = -2; else return(-1); } unused += written; cur += toconv; } while (ret == -2); #endif } else { /* could not find a converter */ return(-1); } } if (in->buf->rawconsumed < unused) return(-1); return(in->buf->rawconsumed - unused); } return(in->consumed + (in->cur - in->base)); } #if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) #ifdef LIBXML_ISO8859X_ENABLED /** * UTF8ToISO8859x: * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of UTF-8 chars * @inlen: the length of @in * @xlattable: the 2-level transcoding table * * Take a block of UTF-8 chars in and try to convert it to an ISO 8859-* * block of chars out. * * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise * The value of @inlen after return is the number of octets consumed * as the return value is positive, else unpredictable. * The value of @outlen after return is the number of ocetes consumed. */ static int UTF8ToISO8859x(unsigned char* out, int *outlen, const unsigned char* in, int *inlen, unsigned char const *xlattable) { const unsigned char* outstart = out; const unsigned char* inend; const unsigned char* instart = in; const unsigned char* processed = in; if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (xlattable == NULL)) return(-1); if (in == NULL) { /* * initialization nothing to do */ *outlen = 0; *inlen = 0; return(0); } inend = in + (*inlen); while (in < inend) { unsigned char d = *in++; if (d < 0x80) { *out++ = d; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } else if (d < 0xE0) { unsigned char c; if (!(in < inend)) { /* trailing byte not in input buffer */ *outlen = out - outstart; *inlen = processed - instart; return(-3); } c = *in++; if ((c & 0xC0) != 0x80) { /* not a trailing byte */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } c = c & 0x3F; d = d & 0x1F; d = xlattable [48 + c + xlattable [d] * 64]; if (d == 0) { /* not in character set */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } *out++ = d; } else if (d < 0xF0) { unsigned char c1; unsigned char c2; if (!(in < inend - 1)) { /* trailing bytes not in input buffer */ *outlen = out - outstart; *inlen = processed - instart; return(-3); } c1 = *in++; if ((c1 & 0xC0) != 0x80) { /* not a trailing byte (c1) */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } c2 = *in++; if ((c2 & 0xC0) != 0x80) { /* not a trailing byte (c2) */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } c1 = c1 & 0x3F; c2 = c2 & 0x3F; d = d & 0x0F; d = xlattable [48 + c2 + xlattable [48 + c1 + xlattable [32 + d] * 64] * 64]; if (d == 0) { /* not in character set */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } *out++ = d; } else { /* cannot transcode >= U+010000 */ *outlen = out - outstart; *inlen = processed - instart; return(-2); } processed = in; } *outlen = out - outstart; *inlen = processed - instart; return(*outlen); } /** * ISO8859xToUTF8 * @out: a pointer to an array of bytes to store the result * @outlen: the length of @out * @in: a pointer to an array of ISO Latin 1 chars * @inlen: the length of @in * * Take a block of ISO 8859-* chars in and try to convert it to an UTF-8 * block of chars out. * Returns 0 if success, or -1 otherwise * The value of @inlen after return is the number of octets consumed * The value of @outlen after return is the number of ocetes produced. */ static int ISO8859xToUTF8(unsigned char* out, int *outlen, const unsigned char* in, int *inlen, unsigned short const *unicodetable) { unsigned char* outstart = out; unsigned char* outend; const unsigned char* instart = in; const unsigned char* inend; const unsigned char* instop; unsigned int c; if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL) || (unicodetable == NULL)) return(-1); outend = out + *outlen; inend = in + *inlen; instop = inend; while ((in < inend) && (out < outend - 2)) { if (*in >= 0x80) { c = unicodetable [*in - 0x80]; if (c == 0) { /* undefined code point */ *outlen = out - outstart; *inlen = in - instart; return (-1); } if (c < 0x800) { *out++ = ((c >> 6) & 0x1F) | 0xC0; *out++ = (c & 0x3F) | 0x80; } else { *out++ = ((c >> 12) & 0x0F) | 0xE0; *out++ = ((c >> 6) & 0x3F) | 0x80; *out++ = (c & 0x3F) | 0x80; } ++in; } if (instop - in > outend - out) instop = in + (outend - out); while ((*in < 0x80) && (in < instop)) { *out++ = *in++; } } if ((in < inend) && (out < outend) && (*in < 0x80)) { *out++ = *in++; } if ((in < inend) && (out < outend) && (*in < 0x80)) { *out++ = *in++; } *outlen = out - outstart; *inlen = in - instart; return (*outlen); } /************************************************************************ * Lookup tables for ISO-8859-2..ISO-8859-16 transcoding * ************************************************************************/ static unsigned short const xmlunicodetable_ISO8859_2 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = { "\x00\x00\x01\x05\x02\x04\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00" "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\xc3\xe3\xa1\xb1\xc6\xe6\x00\x00\x00\x00\xc8\xe8\xcf\xef" "\xd0\xf0\x00\x00\x00\x00\x00\x00\xca\xea\xcc\xec\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xe5\x00\x00\xa5\xb5\x00" "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\xb2\x00\xbd\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\xa3\xb3\xd1\xf1\x00\x00\xd2\xf2\x00\x00\x00\x00\x00\x00\x00" "\xd5\xf5\x00\x00\xc0\xe0\x00\x00\xd8\xf8\xa6\xb6\x00\x00\xaa\xba" "\xa9\xb9\xde\xfe\xab\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xf9" "\xdb\xfb\x00\x00\x00\x00\x00\x00\x00\xac\xbc\xaf\xbf\xae\xbe\x00" "\x00\xc1\xc2\x00\xc4\x00\x00\xc7\x00\xc9\x00\xcb\x00\xcd\xce\x00" "\x00\x00\x00\xd3\xd4\x00\xd6\xd7\x00\x00\xda\x00\xdc\xdd\x00\xdf" "\x00\xe1\xe2\x00\xe4\x00\x00\xe7\x00\xe9\x00\xeb\x00\xed\xee\x00" "\x00\x00\x00\xf3\xf4\x00\xf6\xf7\x00\x00\xfa\x00\xfc\xfd\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_3 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, }; static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = { "\x04\x00\x01\x06\x02\x05\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\xa3\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00" "\xb0\x00\xb2\xb3\xb4\xb5\x00\xb7\xb8\x00\x00\x00\x00\xbd\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xe6\xc5\xe5\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xf8\xab\xbb" "\xd5\xf5\x00\x00\xa6\xb6\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00" "\xa9\xb9\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe\xaa\xba" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xbf\x00\x00\x00" "\xc0\xc1\xc2\x00\xc4\x00\x00\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\x00\xd1\xd2\xd3\xd4\x00\xd6\xd7\x00\xd9\xda\xdb\xdc\x00\x00\xdf" "\xe0\xe1\xe2\x00\xe4\x00\x00\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\x00\xf1\xf2\xf3\xf4\x00\xf6\xf7\x00\xf9\xfa\xfb\xfc\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_4 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, }; static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = { "\x00\x00\x01\x05\x02\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\xaf" "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00" "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00" "\xd0\xf0\xaa\xba\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00" "\x00\x00\xab\xbb\x00\x00\x00\x00\xa5\xb5\xcf\xef\x00\x00\xc7\xe7" "\x00\x00\x00\x00\x00\x00\xd3\xf3\xa2\x00\x00\xa6\xb6\x00\x00\x00" "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xbd\xbf\xd2\xf2\x00\x00" "\x00\x00\x00\x00\x00\x00\xa3\xb3\x00\x00\x00\x00\x00\x00\x00\x00" "\xa9\xb9\x00\x00\x00\x00\xac\xbc\xdd\xfd\xde\xfe\x00\x00\x00\x00" "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xbe\x00" "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xb2\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\x00" "\x00\x00\x00\x00\xd4\xd5\xd6\xd7\xd8\x00\xda\xdb\xdc\x00\x00\xdf" "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\x00" "\x00\x00\x00\x00\xf4\xf5\xf6\xf7\xf8\x00\xfa\xfb\xfc\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_5 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, }; static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = { "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xad\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\x00\xae\xaf" "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\xfe\xff" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_6 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = { "\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xbf" "\x00\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\x00" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\xf0\xf1\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_7 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = { "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x06" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\xa3\x00\x00\xa6\xa7\xa8\xa9\x00\xab\xac\xad\x00\x00" "\xb0\xb1\xb2\xb3\x00\x00\x00\xb7\x00\x00\x00\xbb\x00\xbd\x00\x00" "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\xaf\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\xb4\xb5\xb6\x00\xb8\xb9\xba\x00\xbc\x00\xbe\xbf" "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\xd0\xd1\x00\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_8 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = { "\x02\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\x00\xab\xac\xad\xae\xaf" "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\x00\xbb\xbc\xbd\xbe\x00" "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00" "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe" "\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_9 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = { "\x00\x00\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\x00\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\x00\x00\xdf" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\x00\xff" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xf0" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xdd\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_10 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, }; static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = { "\x00\x00\x01\x06\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\xad\x00\x00" "\xb0\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00" "\xa9\xb9\xa2\xb2\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00" "\x00\x00\xa3\xb3\x00\x00\x00\x00\xa5\xb5\xa4\xb4\x00\x00\xc7\xe7" "\x00\x00\x00\x00\x00\x00\xa6\xb6\xff\x00\x00\xa8\xb8\x00\x00\x00" "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xaf\xbf\xd2\xf2\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xaa\xba\x00\x00\x00\x00\xab\xbb\xd7\xf7\xae\xbe\x00\x00\x00\x00" "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xbc\x00" "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\xcf" "\xd0\x00\x00\xd3\xd4\xd5\xd6\x00\xd8\x00\xda\xdb\xdc\xdd\xde\xdf" "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\xef" "\xf0\x00\x00\xf3\xf4\xf5\xf6\x00\xf8\x00\xfa\xfb\xfc\xfd\xfe\x00" }; static unsigned short const xmlunicodetable_ISO8859_11 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = { "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00" "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\xdf" "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_13 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, }; static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = { "\x00\x00\x01\x04\x06\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\xa2\xa3\xa4\x00\xa6\xa7\x00\xa9\x00\xab\xac\xad\xae\x00" "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\x00\xbb\xbc\xbd\xbe\x00" "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\xb4\xa1\xa5\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\xc4\xc5\xaf\x00\x00\xc9\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\xd3\x00\xd5\xd6\xd7\xa8\x00\x00\x00\xdc\x00\x00\xdf" "\x00\x00\x00\x00\xe4\xe5\xbf\x00\x00\xe9\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\xf3\x00\xf5\xf6\xf7\xb8\x00\x00\x00\xfc\x00\x00\x00" "\x00\xd9\xf9\xd1\xf1\xd2\xf2\x00\x00\x00\x00\x00\xd4\xf4\x00\x00" "\x00\x00\x00\x00\x00\x00\xaa\xba\x00\x00\xda\xfa\x00\x00\x00\x00" "\xd0\xf0\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xfb\x00\x00\x00\x00" "\x00\x00\xd8\xf8\x00\x00\x00\x00\x00\xca\xea\xdd\xfd\xde\xfe\x00" "\xc2\xe2\x00\x00\xc0\xe0\xc3\xe3\x00\x00\x00\x00\xc8\xe8\x00\x00" "\x00\x00\xc7\xe7\x00\x00\xcb\xeb\xc6\xe6\x00\x00\x00\x00\x00\x00" "\x00\x00\xcc\xec\x00\x00\x00\x00\x00\x00\xce\xee\x00\x00\xc1\xe1" "\x00\x00\x00\x00\x00\x00\xcd\xed\x00\x00\x00\xcf\xef\x00\x00\x00" }; static unsigned short const xmlunicodetable_ISO8859_14 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = { "\x00\x00\x01\x09\x04\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\xa3\x00\x00\x00\xa7\x00\xa9\x00\x00\x00\xad\xae\x00" "\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x08\x05\x06\x00\x00\x00\x00" "\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00\xa6\xab\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xb1" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\xa5\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xb2\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xa8\xb8\xaa\xba\xbd\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\xd0\xf0\xde\xfe\xaf\x00\x00\x00\x00\x00\x00\x00" "\xb4\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\xb7\xb9\x00\x00\x00\x00\x00\x00\x00\x00" "\xbb\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\x00\xd1\xd2\xd3\xd4\xd5\xd6\x00\xd8\xd9\xda\xdb\xdc\xdd\x00\xdf" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\x00\xf1\xf2\xf3\xf4\xf5\xf6\x00\xf8\xf9\xfa\xfb\xfc\xfd\x00\xff" }; static unsigned short const xmlunicodetable_ISO8859_15 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = { "\x00\x00\x01\x05\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\xa1\xa2\xa3\x00\xa5\x00\xa7\x00\xa9\xaa\xab\xac\xad\xae\xaf" "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\xba\xbb\x00\x00\x00\xbf" "\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\xbc\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\xb4\xb8\x00" "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" }; static unsigned short const xmlunicodetable_ISO8859_16 [128] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_16 [48 + 9 * 64] = { "\x00\x00\x01\x08\x02\x03\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\xa9\x00\xab\x00\xad\x00\x00" "\xb0\xb1\x00\x00\x00\x00\xb6\xb7\x00\x00\x00\xbb\x00\x00\x00\x00" "\x00\x00\xc3\xe3\xa1\xa2\xc5\xe5\x00\x00\x00\x00\xb2\xb9\x00\x00" "\xd0\xf0\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\xa3\xb3\xd1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xd5\xf5\xbc\xbd\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00" "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xd8\xf8\x00\x00\x00\x00\x00\x00\xbe\xac\xae\xaf\xbf\xb4\xb8\x00" "\x06\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xa5\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xba\xde\xfe\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xc0\xc1\xc2\x00\xc4\x00\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\x00\x00\xd2\xd3\xd4\x00\xd6\x00\x00\xd9\xda\xdb\xdc\x00\x00\xdf" "\xe0\xe1\xe2\x00\xe4\x00\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\x00\x00\xf2\xf3\xf4\x00\xf6\x00\x00\xf9\xfa\xfb\xfc\x00\x00\xff" }; /* * auto-generated functions for ISO-8859-2 .. ISO-8859-16 */ static int ISO8859_2ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_2); } static int UTF8ToISO8859_2 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_2); } static int ISO8859_3ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_3); } static int UTF8ToISO8859_3 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_3); } static int ISO8859_4ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_4); } static int UTF8ToISO8859_4 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_4); } static int ISO8859_5ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_5); } static int UTF8ToISO8859_5 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_5); } static int ISO8859_6ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_6); } static int UTF8ToISO8859_6 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_6); } static int ISO8859_7ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_7); } static int UTF8ToISO8859_7 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_7); } static int ISO8859_8ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_8); } static int UTF8ToISO8859_8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_8); } static int ISO8859_9ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_9); } static int UTF8ToISO8859_9 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_9); } static int ISO8859_10ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_10); } static int UTF8ToISO8859_10 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_10); } static int ISO8859_11ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_11); } static int UTF8ToISO8859_11 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_11); } static int ISO8859_13ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_13); } static int UTF8ToISO8859_13 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_13); } static int ISO8859_14ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_14); } static int UTF8ToISO8859_14 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_14); } static int ISO8859_15ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_15); } static int UTF8ToISO8859_15 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_15); } static int ISO8859_16ToUTF8 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_16); } static int UTF8ToISO8859_16 (unsigned char* out, int *outlen, const unsigned char* in, int *inlen) { return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_16); } static void xmlRegisterCharEncodingHandlersISO8859x (void) { xmlNewCharEncodingHandler ("ISO-8859-2", ISO8859_2ToUTF8, UTF8ToISO8859_2); xmlNewCharEncodingHandler ("ISO-8859-3", ISO8859_3ToUTF8, UTF8ToISO8859_3); xmlNewCharEncodingHandler ("ISO-8859-4", ISO8859_4ToUTF8, UTF8ToISO8859_4); xmlNewCharEncodingHandler ("ISO-8859-5", ISO8859_5ToUTF8, UTF8ToISO8859_5); xmlNewCharEncodingHandler ("ISO-8859-6", ISO8859_6ToUTF8, UTF8ToISO8859_6); xmlNewCharEncodingHandler ("ISO-8859-7", ISO8859_7ToUTF8, UTF8ToISO8859_7); xmlNewCharEncodingHandler ("ISO-8859-8", ISO8859_8ToUTF8, UTF8ToISO8859_8); xmlNewCharEncodingHandler ("ISO-8859-9", ISO8859_9ToUTF8, UTF8ToISO8859_9); xmlNewCharEncodingHandler ("ISO-8859-10", ISO8859_10ToUTF8, UTF8ToISO8859_10); xmlNewCharEncodingHandler ("ISO-8859-11", ISO8859_11ToUTF8, UTF8ToISO8859_11); xmlNewCharEncodingHandler ("ISO-8859-13", ISO8859_13ToUTF8, UTF8ToISO8859_13); xmlNewCharEncodingHandler ("ISO-8859-14", ISO8859_14ToUTF8, UTF8ToISO8859_14); xmlNewCharEncodingHandler ("ISO-8859-15", ISO8859_15ToUTF8, UTF8ToISO8859_15); xmlNewCharEncodingHandler ("ISO-8859-16", ISO8859_16ToUTF8, UTF8ToISO8859_16); } #endif #endif #define bottom_encoding #include "elfgcchack.h" libxml2-2.9.1+dfsg1/libxml.m40000644000175000017500000001731011234335462014312 0ustar aronaron# Configure paths for LIBXML2 # Mike Hommey 2004-06-19 # use CPPFLAGS instead of CFLAGS # Toshio Kuratomi 2001-04-21 # Adapted from: # Configure paths for GLIB # Owen Taylor 97-11-3 dnl AM_PATH_XML2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for XML, and define XML_CPPFLAGS and XML_LIBS dnl AC_DEFUN([AM_PATH_XML2],[ AC_ARG_WITH(xml-prefix, [ --with-xml-prefix=PFX Prefix where libxml is installed (optional)], xml_config_prefix="$withval", xml_config_prefix="") AC_ARG_WITH(xml-exec-prefix, [ --with-xml-exec-prefix=PFX Exec prefix where libxml is installed (optional)], xml_config_exec_prefix="$withval", xml_config_exec_prefix="") AC_ARG_ENABLE(xmltest, [ --disable-xmltest Do not try to compile and run a test LIBXML program],, enable_xmltest=yes) if test x$xml_config_exec_prefix != x ; then xml_config_args="$xml_config_args" if test x${XML2_CONFIG+set} != xset ; then XML2_CONFIG=$xml_config_exec_prefix/bin/xml2-config fi fi if test x$xml_config_prefix != x ; then xml_config_args="$xml_config_args --prefix=$xml_config_prefix" if test x${XML2_CONFIG+set} != xset ; then XML2_CONFIG=$xml_config_prefix/bin/xml2-config fi fi AC_PATH_PROG(XML2_CONFIG, xml2-config, no) min_xml_version=ifelse([$1], ,2.0.0,[$1]) AC_MSG_CHECKING(for libxml - version >= $min_xml_version) no_xml="" if test "$XML2_CONFIG" = "no" ; then no_xml=yes else XML_CPPFLAGS=`$XML2_CONFIG $xml_config_args --cflags` XML_LIBS=`$XML2_CONFIG $xml_config_args --libs` xml_config_major_version=`$XML2_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` xml_config_minor_version=`$XML2_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` xml_config_micro_version=`$XML2_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_xmltest" = "xyes" ; then ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $XML_CPPFLAGS" LIBS="$XML_LIBS $LIBS" dnl dnl Now check if the installed libxml is sufficiently new. dnl (Also sanity checks the results of xml2-config to some extent) dnl rm -f conf.xmltest AC_TRY_RUN([ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); /* Capture xml2-config output via autoconf/configure variables */ /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = (char *)strdup("$min_xml_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string from xml2-config\n", "$min_xml_version"); exit(1); } free(tmp_version); /* Capture the version information from the header files */ tmp_version = (char *)strdup(LIBXML_DOTTED_VERSION); if (sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string from libxml includes\n", "LIBXML_DOTTED_VERSION"); exit(1); } free(tmp_version); /* Compare xml2-config output to the libxml headers */ if ((xml_major_version != $xml_config_major_version) || (xml_minor_version != $xml_config_minor_version) || (xml_micro_version != $xml_config_micro_version)) { printf("*** libxml header files (version %d.%d.%d) do not match\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** xml2-config (version %d.%d.%d)\n", $xml_config_major_version, $xml_config_minor_version, $xml_config_micro_version); return 1; } /* Compare the headers to the library to make sure we match */ /* Less than ideal -- doesn't provide us with return value feedback, * only exits if there's a serious mismatch between header and library. */ LIBXML_TEST_VERSION; /* Test that the library is greater than our minimum version */ if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.xmlsoft.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml2-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of LIBXML, but you can also set the XML2_CONFIG environment to point to the\n"); printf("*** correct copy of xml2-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } return 1; } ],, no_xml=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CPPFLAGS="$ac_save_CPPFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_xml" = x ; then AC_MSG_RESULT(yes (version $xml_config_major_version.$xml_config_minor_version.$xml_config_micro_version)) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$XML2_CONFIG" = "no" ; then echo "*** The xml2-config script installed by LIBXML could not be found" echo "*** If libxml was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the XML2_CONFIG environment variable to the" echo "*** full path to xml2-config." else if test -f conf.xmltest ; then : else echo "*** Could not run libxml test program, checking why..." CPPFLAGS="$CPPFLAGS $XML_CPPFLAGS" LIBS="$LIBS $XML_LIBS" AC_TRY_LINK([ #include #include ], [ LIBXML_TEST_VERSION; return 0;], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding LIBXML or finding the wrong" echo "*** version of LIBXML. If it is not finding LIBXML, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means LIBXML was incorrectly installed" echo "*** or that you have moved LIBXML since it was installed. In the latter case, you" echo "*** may want to edit the xml2-config script: $XML2_CONFIG" ]) CPPFLAGS="$ac_save_CPPFLAGS" LIBS="$ac_save_LIBS" fi fi XML_CPPFLAGS="" XML_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(XML_CPPFLAGS) AC_SUBST(XML_LIBS) rm -f conf.xmltest ]) libxml2-2.9.1+dfsg1/TODO0000644000175000017500000002614611234335462013260 0ustar aronaron124907 HTML parse buffer problem when parsing larse in-memory docs 124110 DTD validation && wrong namespace 123564 xmllint --html --format TODO for the XML parser and stuff: ================================== $Id$ this tend to be outdated :-\ ... DOCS: ===== - use case of using XInclude to load for example a description. order document + product base -(XSLT)-> quote with XIncludes | HTML output with description of parts <---(XSLT)-- TODO: ===== - XInclude at the SAX level (libSRVG) - fix the C code prototype to bring back doc/libxml-undocumented.txt to a reasonable level - Computation of base when HTTP redirect occurs, might affect HTTP interfaces. - Computation of base in XInclude. Relativization of URIs. - listing all attributes in a node. - Better checking of external parsed entities TAG 1234 - Go through erratas and do the cleanup. http://www.w3.org/XML/xml-19980210-errata ... started ... - jamesh suggestion: SAX like functions to save a document ie. call a function to open a new element with given attributes, write character data, close last element, etc + inversted SAX, initial patch in April 2002 archives. - htmlParseDoc has parameter encoding which is not used. Function htmlCreateDocParserCtxt ignore it. - fix realloc() usage. - Stricten the UTF8 conformance (Martin Duerst): http://www.w3.org/2001/06/utf-8-test/. The bad files are in http://www.w3.org/2001/06/utf-8-wrong/. - xml:id normalized value TODO: ===== - move all string manipulation functions (xmlStrdup, xmlStrlen, etc.) to global.c. Bjorn noted that the following files depends on parser.o solely because of these string functions: entities.o, global.o, hash.o, tree.o, xmlIO.o, and xpath.o. - Optimization of tag strings allocation ? - maintain coherency of namespace when doing cut'n paste operations => the functions are coded, but need testing - function to rebuild the ID table - functions to rebuild the DTD hash tables (after DTD changes). EXTENSIONS: =========== - Tools to produce man pages from the SGML docs. - Add Xpointer recognition/API - Add Xlink recognition/API => started adding an xlink.[ch] with a unified API for XML and HTML. it's crap :-( - Implement XSchemas => Really need to be done - datatype are complete, but structure support is very limited. - extend the shell with: - edit - load/save - mv (yum, yum, but it's harder because directories are ordered in our case, mvup and mvdown would be required) Done: ===== - Add HTML validation using the XHTML DTD - problem: do we want to keep and maintain the code for handling DTD/System ID cache directly in libxml ? => not really done that way, but there are new APIs to check elements or attributes. Otherwise XHTML validation directly ... - XML Schemas datatypes except Base64 and BinHex - Relax NG validation - XmlTextReader streaming API + validation - Add a DTD cache prefilled with xhtml DTDs and entities and a program to manage them -> like the /usr/bin/install-catalog from SGML right place seems $datadir/xmldtds Maybe this is better left to user apps => use a catalog instead , and xhtml1-dtd package - Add output to XHTML => XML serializer automatically recognize the DTd and apply the specific rules. - Fix output of - compliance to XML-Namespace checking, see section 6 of http://www.w3.org/TR/REC-xml-names/ - Correct standalone checking/emitting (hard) 2.9 Standalone Document Declaration - Implement OASIS XML Catalog support http://www.oasis-open.org/committees/entity/ - Get OASIS testsuite to a more friendly result, check all the results once stable. the check-xml-test-suite.py script does this - Implement XSLT => libxslt - Finish XPath => attributes addressing troubles => defaulted attributes handling => namespace axis ? done as XSLT got debugged - bug reported by Michael Meallin on validation problems => Actually means I need to add support (and warn) for non-deterministic content model. - Handle undefined namespaces in entity contents better ... at least issue a warning - DOM needs int xmlPruneProp(xmlNodePtr node, xmlAtttrPtr attr); => done it's actually xmlRemoveProp xmlUnsetProp xmlUnsetNsProp - HTML: handling of Script and style data elements, need special code in the parser and saving functions (handling of < > " ' ...): http://www.w3.org/TR/html4/types.html#type-script Attributes are no problems since entities are accepted. - DOM needs xmlAttrPtr xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value) - problem when parsing hrefs with & with the HTML parser (IRC ac) - If the internal encoding is not UTF8 saving to a given encoding doesn't work => fix to force UTF8 encoding ... done, added documentation too - Add an ASCII I/O encoder (asciiToUTF8 and UTF8Toascii) - Issue warning when using non-absolute namespaces URI. - the html parser should add and if they don't exist started, not finished. Done, the automatic closing is added and 3 testcases were inserted - Command to force the parser to stop parsing and ignore the rest of the file. xmlStopParser() should allow this, mostly untested - support for HTML empty attributes like


    - plugged iconv() in for support of a large set of encodings. - xmlSwitchToEncoding() rewrite done - URI checkings (no fragments) rfc2396.txt - Added a clean mechanism for overload or added input methods: xmlRegisterInputCallbacks() - dynamically adapt the alloc entry point to use g_alloc()/g_free() if the programmer wants it: - use xmlMemSetup() to reset the routines used. - Check attribute normalization especially xmlGetProp() - Validity checking problems for NOTATIONS attributes - Validity checking problems for ENTITY ENTITIES attributes - Parsing of a well balanced chunk xmlParseBalancedChunkMemory() - URI module: validation, base, etc ... see uri.[ch] - turn tester into a generic program xmllint installed with libxml - extend validity checks to go through entities content instead of just labelling them PCDATA - Save Dtds using the children list instead of dumping the tables, order is preserved as well as comments and PIs - Wrote a notice of changes requires to go from 1.x to 2.x - make sure that all SAX callbacks are disabled if a WF error is detected - checking/handling of newline normalization http://localhost/www.xml.com/axml/target.html#sec-line-ends - correct checking of '&' '%' on entities content. - checking of PE/Nesting on entities declaration - checking/handling of xml:space - checking done. - handling done, not well tested - Language identification code, productions [33] to [38] => done, the check has been added and report WFness errors - Conditional sections in DTDs [61] to [65] => should this crap be really implemented ??? => Yep OASIS testsuite uses them - Allow parsed entities defined in the internal subset to override the ones defined in the external subset (DtD customization). => This mean that the entity content should be computed only at use time, i.e. keep the orig string only at parse time and expand only when referenced from the external subset :-( Needed for complete use of most DTD from Eve Maler - Add regression tests for all WFC errors => did some in test/WFC => added OASIS testsuite routines http://xmlsoft.org/conf/result.html - I18N: http://wap.trondheim.com/vaer/index.phtml is not XML and accepted by the XML parser, UTF-8 should be checked when there is no "encoding" declared ! - Support for UTF-8 and UTF-16 encoding => added some convertion routines provided by Martin Durst patched them, got fixes from @@@ I plan to keep everything internally as UTF-8 (or ISO-Latin-X) this is slightly more costly but more compact, and recent processors efficiency is cache related. The key for good performances is keeping the data set small, so will I. => the new progressive reading routines call the detection code is enabled, tested the ISO->UTF-8 stuff - External entities loading: - allow override by client code - make sure it is alled for all external entities referenced Done, client code should use xmlSetExternalEntityLoader() to set the default loading routine. It will be called each time an external entity entity resolution is triggered. - maintain ID coherency when removing/changing attributes The function used to deallocate attributes now check for it being an ID and removes it from the table. - push mode parsing i.e. non-blocking state based parser done, both for XML and HTML parsers. Use xmlCreatePushParserCtxt() and xmlParseChunk() and html counterparts. The tester program now has a --push option to select that parser front-end. Douplicated tests to use both and check results are similar. - Most of XPath, still see some troubles and occasionnal memleaks. - an XML shell, allowing to traverse/manipulate an XML document with a shell like interface, and using XPath for the anming syntax - use of readline and history added when available - the shell interface has been cleanly separated and moved to debugXML.c - HTML parser, should be fairly stable now - API to search the lang of an attribute - Collect IDs at parsing and maintain a table. PBM: maintain the table coherency PBM: how to detect ID types in absence of DtD ! - Use it for XPath ID support - Add validity checking Should be finished now ! - Add regression tests with entity substitutions - External Parsed entities, either XML or external Subset [78] and [79] parsing the xmllang DtD now works, so it should be sufficient for most cases ! - progressive reading. The entity support is a first step toward asbtraction of an input stream. A large part of the context is still located on the stack, moving to a state machine and putting everyting in the parsing context should provide an adequate solution. => Rather than progressive parsing, give more power to the SAX-like interface. Currently the DOM-like representation is built but => it should be possible to define that only as a set of SAX callbacks and remove the tree creation from the parser code. DONE - DOM support, instead of using a proprietary in memory format for the document representation, the parser should call a DOM API to actually build the resulting document. Then the parser becomes independent of the in-memory representation of the document. Even better using RPC's the parser can actually build the document in another program. => Work started, now the internal representation is by default very near a direct DOM implementation. The DOM glue is implemented as a separate module. See the GNOME gdome module. - C++ support : John Ehresman - Updated code to follow more recent specs, added compatibility flag - Better error handling, use a dedicated, overridable error handling function. - Support for CDATA. - Keep track of line numbers for better error reporting. - Support for PI (SAX one). - Support for Comments (bad, should be in ASAP, they are parsed but not stored), should be configurable. - Improve the support of entities on save (+SAX). libxml2-2.9.1+dfsg1/ChangeLog0000644000175000017500000266633312113312340014337 0ustar aronaronFri Jul 10 16:11:34 CEST 2009 Daniel Veillard * parser.c: fix a regression in entity parsing when using the reader introduced because we were not reusing _private on entities parsing context Thu Jul 9 10:21:00 CEST 2009 Daniel Veillard Aleksey Sanin support for c14n 1.1 * c14n.c include/libxml/c14n.h: adds support for C14N 1.1, new flags at the API level * runtest.c Makefile.am testC14N.c xmllint.c: add support in CLI tools and test binaries * result/c14n/1-1-without-comments/* test/c14n/1-1-without-comments/*: add a new batch of tests Thu Jul 9 08:52:35 CEST 2009 Daniel Veillard * config.h.in: update of libtool seems to have modified it * python/libxml2class.txt: python update modified the order of classes apparently Thu Jul 9 08:43:06 CEST 2009 Daniel Veillard * tree.c: avoid calling xmlAddID with NULL values * parser.c: add a few xmlInitParser in some entry points Fri Jun 19 19:51:08 CEST 2009 Rob Richards * parser.c: use options from current parser context when creating a parser context within xmlParseCtxtExternalEntity * xmlwriter.c: fix error message when unable to create output file Thu Jun 4 11:17:23 CEST 2009 Daniel Veillard * c14n.c debugXML.c doc/examples/io2.c parser.c schematron.c valid.c xmlschemas.c xmlwriter.c xpath.c: use %s to printf string patch by Christian Persch, fixes #581612 Thu Jun 4 11:06:07 CEST 2009 Daniel Veillard * parser.c threads.c: change the threading initialization sequence as suggested by Igor Novoseltsev to avoid crash if xmlInitParser() is called from a thread which is not the main one, should fix #584605 Fri May 15 17:54:48 CEST 2009 Daniel Veillard * HTMLparser.c: make sure we keep line numbers fixes #580705 based Aaron Patterson patch Tue May 12 09:13:58 CEST 2009 Daniel Veillard * HTMLparser.c: a broken HTML table attributes initialization, fixes #581803, by Roland Steiner Tue May 12 08:54:20 CEST 2009 Daniel Veillard * libxml2.doap: adding RDF dope file. Tue May 12 08:42:52 CEST 2009 Daniel Veillard * configure.in: adapt the extra version detection code to git Wed Apr 29 16:09:38 CEST 2009 Rob Richards * parser.c: do not set error code in xmlNsWarn Wed Apr 15 11:18:24 CEST 2009 Daniel Veillard * include/libxml/parser.h include/libxml/xmlwriter.h include/libxml/relaxng.h include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in include/libxml/valid.h include/libxml/xmlschemas.h include/libxml/xmlerror.h: change ATTRIBUTE_PRINTF into LIBXML_ATTR_FORMAT to avoid macro name collisions with other packages and headers as reported by Belgabor and Mike Hommey Thu Apr 2 13:57:15 CEST 2009 Daniel Veillard * error.c: fix structured error handling problems #564217 Thu Mar 26 19:08:08 CET 2009 Rob Richards * parser.c: use options from current parser context when creating an entity parser context Wed Mar 25 11:40:34 CET 2009 Daniel Veillard * doc/*: updated SVN URL for GNOME as pointed by Vincent Lefevre and regenerated docs Wed Mar 25 11:21:26 CET 2009 Daniel Veillard * parser.c: hide the nbParse* variables used for debugging as pointed by Mike Hommey Wed Mar 25 10:50:05 CET 2009 Daniel Veillard * include/wsockcompat.h win32/Makefile.bcb xpath.c: fixes for Borland/CodeGear/Embarcadero compilers by Eric Zurcher Wed Mar 25 10:43:07 CET 2009 Daniel Veillard * xpath.c: xmlXPathRegisterNs should not allow enpty prefixes Mon Mar 23 20:27:15 CET 2009 Daniel Veillard * tree.c: add a missing check in xmlAddSibling, patch by Kris Breuker * xmlIO.c: avoid xmlAllocOutputBuffer using XML_BUFFER_EXACT which leads to performances problems especially on Windows. Tue Mar 3 14:30.28 HKT 2009 William Brack * trio.h: changed include of config.h to be surrounded by quotation marks #570806 Sat Feb 21 10:20:34 CET 2009 Daniel Veillard * threads.c parser.c: more warnings about xmlCleanupThreads and xmlCleanupParser to avoid troubles like #571409 Fri Feb 20 09:40:04 CET 2009 Daniel Veillard * xmlwriter.c: cleanups and error reports when xmlTextWriterVSprintf fails, by Jinmei Tatuya Fri Feb 20 09:18:56 CET 2009 Daniel Veillard * xmlwriter.c: remove a couple of leaks on errors reported by Jinmei Tatuya Sun Jan 18 22:37:59 CET 2009 Daniel Veillard * configure.in doc/xml.html doc/*: preparing 0.7.3 release * include/libxml/parserInternals.h SAX2.c: fix a typo in a name Sun Jan 18 21:48:28 CET 2009 Daniel Veillard * include/libxml/parser.h include/libxml/xmlwriter.h include/libxml/relaxng.h include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in include/libxml/valid.h include/libxml/xmlschemas.h include/libxml/xmlerror.h: port patch from Marcus Meissner to add gcc checking for printf like functions parameters, should fix #65068 * doc/apibuild.py doc/*: modified the script accordingly and regenerated * xpath.c xmlmemory.c threads.c: fix a few warnings Sun Jan 18 20:40:42 CET 2009 Daniel Veillard * include/libxml/xmlwin32version.h.in: windows header should get the same define Sun Jan 18 18:22:33 CET 2009 Daniel Veillard * include/libxml/xmlversion.h.in include/libxml/xmlmemory.h: apply patch from Marcus Meissner to add gcc attribute alloc_size should fix #552505 * doc/apibuild.py doc/* testapi.c: regenerate the API * include/libxml/parserInternals.h: fix a comment problem raised by apibuild.py Sun Jan 18 16:39:01 CET 2009 Daniel Veillard * threads.c: also remove pthread key when stopping thread support, patch based on Alex Ott one should fix #564723 Sun Jan 18 15:55:18 CET 2009 Daniel Veillard * threads.c: patch from Daniel Zimmermann fixing a memory leak in an edge case, solves #562230 Sun Jan 18 15:06:05 CET 2009 Daniel Veillard * include/libxml/parserInternals.h SAX2.c: add a new define XML_MAX_TEXT_LENGTH limiting the maximum size of a single text node, the defaultis 10MB and can be removed with the HUGE parsing option Mon Jan 05 18:28:41 CET 2009 Rob Richards * include/libxml/parser.h parser.c: add XML_PARSE_OLDSAX parser option to enable pre 2.7 SAX behavior. Wed Dec 31 23:11:37 CET 2008 Rob Richards * tree.c: set doc on last child tree in xmlAddChildList for bug #546772. Fix problem adding an attribute via with xmlAddChild reported by Kris Breuker. Sun Dec 27 14:16:13 CET 2008 Rob Richards * xmlwriter.c: fix indenting in xmlTextWriterFullEndElement for bug# 554353. Thu Nov 27 16:24:52 CET 2008 Daniel Veillard * include/libxml/tree.h tree.c python/generator.py: adds element traversal support * valid.c: avoid a warning * doc/*: regenerated Mon Nov 17 16:56:18 CET 2008 Daniel Veillard * SAX2.c parser.c: fix for CVE-2008-4226, a memory overflow when building gigantic text nodes, and a bit of cleanup to better handled out of memory problem in that code. * tree.c: fix for CVE-2008-4225, lack of testing leads to a busy loop test assuming one have enough core memory. Thu Nov 6 14:34:35 CET 2008 Daniel Veillard * xmllint.c: Matthias Kaehlcke reported a build problem when not compiling HTML support in. Fri Oct 17 15:24:08 CEST 2008 Daniel Veillard * configure.in doc/Makefile.am: patch from Adrian Bunk which adds --disable-rebuild-docs to avoid rebuilding them Fri Oct 3 09:43:45 CEST 2008 Daniel Veillard * configure.in doc/* NEWS: preparing the release of 2.7.2 * dict.c: fix the Solaris portability issue * parser.c: additional cleanup on #554660 fix * test/ent13 result/ent13* result/noent/ent13*: added the example in the regression test suite. * HTMLparser.c: handle leading BOM in htmlParseElement() Thu Oct 2 22:53:39 CEST 2008 Daniel Veillard * parser.c: fix a nasty bug introduced when cleaning up entities processing in 2.7.x , fixes #554660 Thu Sep 25 18:04:20 CEST 2008 Daniel Veillard * HTMLparser.c: fix an HTML parsing error on large data sections reported by Mike Day * test/HTML/utf8bug.html result/HTML/utf8bug.html.err result/HTML/utf8bug.html.sax result/HTML/utf8bug.html: add the reproducer to the test suite Thu Sep 25 17:35:57 CEST 2008 Daniel Veillard * runxmlconf.c: fix compilation if XPath is not included Thu Sep 25 16:54:04 CEST 2008 Daniel Veillard * xmlreader.c: patch from Riccardo Scussat fixing custom error handlers problems. Thu Sep 25 16:30:11 CEST 2008 Daniel Veillard * include/libxml/xmlsave.h xmlsave.c: new options to serialize as XML/HTML/XHTML and restore old entry point behaviours Mon Sep 1 16:49:05 CEST 2008 Daniel Veillard * doc/xml.html doc/news.html configure.in python/setup.py NEWS: prepare release of 2.7.1 Mon Sep 1 15:35:13 CEST 2008 Daniel Veillard * schematron.c xpath.c: applied a couple of patches from Martin avoiding some leaks, fixinq QName checks in XPath, XPath debugging and schematron code cleanups. * python/tests/Makefile.am python/tests/xpathleak.py: add the specific regression tests, just tweak it to avoid output by default Mon Sep 1 15:02:05 CEST 2008 Daniel Veillard * trionan.c: Borland C fix from Moritz Both * testapi.c: regenerate, workaround a problem for buffer testing * xmlIO.c HTMLtree.c: new internal entry point to hide even better xmlAllocOutputBufferInternal * tree.c: harden the code around buffer allocation schemes * parser.c: restore the warning when namespace names are not absolute URIs * runxmlconf.c: continue regression tests if we get the expected number of errors * Makefile.am: run the python tests on make check * xmlsave.c: handle the HTML documents and trees * python/libxml.c: convert python serialization to the xmlSave APIs and avoid some horrible hacks Sat Aug 30 16:58:40 CEST 2008 Daniel Veillard * configure.in, doc/*: preparing 2.7.0 release * tree.c: remove some testing traces * parser.c xmlIO.c xmlschemas.c: remove some warnings Sat Aug 30 14:50:16 CEST 2008 Daniel Veillard * include/libxml/tree.h tree.c: make a new kind of buffer where shrinking and adding in head can avoid reallocation or full buffer memmoves * encoding.c xmlIO.c: use the new kind of buffers for output buffers Sat Aug 30 10:18:13 CEST 2008 Daniel Veillard * doc/* testapi.c: regenerated Fri Aug 29 21:53:12 CEST 2008 Daniel Veillard * doc/examples/reader3.c: patch from Robert Schwebel , allows to compile the example if configured without output support fixes #545582 * Makefile.am: add testrecurse to the make check tests * HTMLparser.c: if the parser got a encoding argument it should be used over what the meta specifies, patch fixing #536346 Fri Aug 29 14:41:38 CEST 2008 Daniel Veillard * parser.c: a couple more fixes * nanohttp.c nanoftp.c: patch from Andreas Färber to compile on Haiku fixes #527880 * doc/examples/*: regenerated Thu Aug 28 17:31:46 CEST 2008 Daniel Veillard * parser.c include/libxml/parser.h: completely different fix for the recursion detection based on entity density, big cleanups in the entity parsing code too * result/*.sax*: the parser should not ask for used defined versions of the predefined entities * testrecurse.c: automatic test for entity recursion checks * Makefile.am: added testrecurse * test/recurse/lol* test/recurse/good*: a first set of tests for the recursion Wed Aug 27 21:55:34 CEST 2008 Daniel Veillard * include/libxml/xmlerror.h parser.c: a bit of cleanup and added checks based on the regression tests of the xmlconf suite Wed Aug 27 19:22:35 CEST 2008 Daniel Veillard * uri.c: bug in parsing RFC 3986 uris with port numbers Wed Aug 27 17:30:48 CEST 2008 Daniel Veillard * configure.in Makefile.am: add an --with-coverage configure option and a 'make cov' target based on gcc profiling and the lcov tool. Currently at 68.9% coverage out of 'make check' and runsuite executions. * xmlreader.c: remove warnings due to C++ comments Wed Aug 27 15:00:54 CEST 2008 Daniel Veillard * include/libxml/parserInternals.h parser.c: cleanup entity pushing error handling based on a patch from Ashwin Wed Aug 27 13:41:26 CEST 2008 Daniel Veillard * threads.c: fix a small initialization problem raised by Ashwin * testapi.c gentest.py: increase testing especially for document with an internal subset, and entities * tree.c: fix a deallocation issue when unlinking entities from a document. * valid.c: fix a missing entry point test not found previously. * doc/*: regenerated the APIs, docs etc. Tue Aug 26 15:02:58 CEST 2008 Daniel Veillard * include/libxml/parser.h parser.c xmllint.c: strengthen some of the internal parser limits, add an XML_PARSE_HUGE option to bypass them all. More internal parser limits will still need to be added. Tue Aug 26 09:42:08 CEST 2008 Daniel Veillard * Makefile.am: add the testchar to 'make check' * xmlschemas.c: Volker Grabsch pointed out a typo * xmlregexp.c: production [19] from XML Schemas regexps were a mistake removed in version REC-xmlschema-2-20041028, Volker Grabsch provided a patch to remove it * test/schemas/regexp-char-ref_0.xml test/schemas/regexp-char-ref_0.xsd test/schemas/regexp-char-ref_1.xsd result/schemas/regexp-char-ref_0_0 result/schemas/regexp-char-ref_1_0: Volker Grabsch also provided regession tests for this Tue Aug 26 09:25:39 CEST 2008 Daniel Veillard * include/libxml/parser.h xinclude.c xmllint.c: patch based on Wieant Nielander contribution to add the option of not doing URI base fixup in XInclude Mon Aug 25 16:52:53 CEST 2008 Daniel Veillard * xmlreader.c: applied patch from Aswin to fix tree skipping * include/libxml/entities.h entities.c: fixed a comment and added a new xmlNewEntity() entry point * runtest.c: be less verbose * tree.c: space and tabs cleanups Mon Aug 25 10:56:30 CEST 2008 Daniel Veillard * include/libxml/entities.h entities.c SAX2.c parser.c: rework the patch to avoid some ABI issue with people allocating entities structure directly Wed Aug 20 19:02:01 CEST 2008 Daniel Veillard * include/libxml/parser.h include/libxml/entities.h entities.c parserInternals.c parser.c: fix for CVE-2008-3281 Sun Aug 10 17:06:13 CEST 2008 Rob Richards * dict.c: fix non GNUC builds. Fri Aug 8 14:13:06 CEST 2008 Daniel Veillard * makefile.am: adding a check-valgrind target Fri Aug 8 14:01:59 CEST 2008 Daniel Veillard * Makefile.am testdict.c: add the new test in 'make check' and update it to check subdictionaries processing. Fri Aug 8 12:07:20 CEST 2008 Daniel Veillard * testdict.c: added a program to regression test the dictionary code * dict.c: improve the lookup efficiency by caching the key. Thu Aug 7 18:30:55 CEST 2008 Daniel Veillard * dict.c: chased and found a couple of nasty issues Thu Aug 7 15:51:31 CEST 2008 Sven Herzberg Bug 546629 – runtests doesn't pass on my mac Reviewed by William M. Brack. * runtest.c: use libpthread on Mac OS X as well Wed Aug 6 12:24:33 CEST 2008 Daniel Veillard * uri.c: allow [ and ] in fragment identifiers, 3986 disallow them but it's widely used for XPointer, and would break DocBook processing among others Wed Aug 6 11:32:21 CEST 2008 Daniel Veillard * dict.c: change the big key algorithm to work properly with QName too, fix a bug with dict size and sub dictionaries Mon Aug 4 17:27:27 CEST 2008 Daniel Veillard * uri.c include/libxml/uri.h: rewrite the URI parser to update to rfc3986 (from 2396) * test/errors/webdav.xml result/errors/webdav.xml*: removed the error test, 'DAV:' is a correct URI under 3986 * Makefile.am: small cleanup in make check Thu Jul 31 21:49:45 CEST 2008 Daniel Veillard * runxmlconf.c: more progresses against the official regression tests * runsuite.c: small cleanup for non-leak reports * include/libxml/tree.h: parsing flags and other properties are now added to the document node, this is generally useful and allow to make Name and NmToken validations based on the parser flags, more specifically the 5th edition of XML or not * HTMLparser.c tree.c: small side effects for the previous changes * parser.c SAX2.c valid.c: the bulk of teh changes are here, the parser and validation behaviour can be affected, parsing flags need to be copied, lot of changes. Also fixing various validation problems in the regression tests. Thu Jul 31 10:15:53 CEST 2008 Daniel Veillard * runxmlconf.c: added a skipped list, insert rmt-ns10-035 * Makefile.am: improve 'make check' * include/libxml/xmlerror.h parser.c: clean up namespace errors checking and reporting, errors when a document is labelled as UTF-16 while it is parsed as UTF-8 and no encoding was given explicitely. * result/errors/webdav.xml.*: some warnings are no recategorized as Namespace errors Wed Jul 30 14:55:54 CEST 2008 Daniel Veillard * include/libxml/xmlmemory.h xmlmemory.c: add xmlMemDisplayLast to help debug incremental memory leaks, and some cleanups * runxmlconf.c: use that new call and avoid ever touching the system catalog in the regression tests Wed Jul 30 14:33:33 CEST 2008 Daniel Veillard * parser.c include/libxml/xmlerror.h: an XML-1.0 document can't load an 1.1 entity * runxmlconf.c: when using entities make sure we load them Tue Jul 29 18:43:07 CEST 2008 Daniel Veillard * parser.c: fix a bug not detecting cross entity comments probably when comment parsing got optimized. * Makefile.am: add make check * runxmlconf.c: fix the log file name Tue Jul 29 18:09:26 CEST 2008 Daniel Veillard * runxmlconf.c Makefile.am: add a C program to run the W3C test suite, work in progress * xmllint.c: add a new option --oldxml10 to use the old parser * parser.c: fix the XML_PARSE_OLD10 processing of the new option and a bug in version parsing Tue Jul 29 11:12:40 CEST 2008 Daniel Veillard * xpath.c: space and tabs cleanup Tue Jul 29 10:59:36 CEST 2008 Daniel Veillard * include/libxml/parser.h include/libxml/xmlerror.h parser.c: implement XML-1.0 5th edition, add parser option XML_PARSE_OLD10 to stick to old behaviour * testapi.c gentest.py: modified slightly and regenerated * Makefile.am: add testchar Thu Jul 24 16:57:20 CEST 2008 Daniel Veillard * Makefile.am testchar.c Makefile.tests README.tests: add a new regression test program for testing character ranges and UTF8 encoding/decoding Wed Jul 23 15:32:39 CEST 2008 Daniel Veillard * libxml.spec.in: fix the build root Wed Jul 16 22:28:48 PDT 2008 William Brack * pattern.c: fix problem with xmlStreamPop when pattern includes a "." element (see discussion on libxslt list) Mon Jul 7 15:49:59 CEST 2008 Daniel Veillard * SAX2.c: fix line number on text nodes, problem raised by Ralf Junker Sun Jun 29 17:04:28 CEST 2008 Rob Richards * xmlschemas.c: fix crash with invalid whitespace facet Wed Jun 11 10:13:02 CEST 2008 Daniel Veillard * doc/xml.html doc/FAQ.html: add a section in the FAQ about multithread and xmlCleanupParser Tue Jun 10 16:52:17 CEST 2008 Daniel Veillard * catalog.c: apply a couple of fixes based on a Coverity report forwarded by Derrick Price. * VxWorks/README VxWorks/Makefile VxWorks/build.sh: instructions Makefile, and shell script to build on VxWorks 6.4+ provided by Jim Wert. Tue Jun 3 18:07:13 CEST 2008 Daniel Veillard * python/generator.py python/setup.py: apply patch from Martin fixing python whitespaces * NEWS: following previous commit rebuilt now in UTF-8 Mon Jun 2 17:39:42 CEST 2008 Daniel Veillard * ChangeLog: patch from Hans de Goede to switch the file to UTF-8 * doc/news.xsl: switch to generate the NEWS file in UTF-8 instead of ISO-8859-1 Mon May 12 15:12:44 CEST 2008 Daniel Veillard * xmlregexp.c: avoid a regexp crash, should fix #523738 Mon May 12 14:56:06 CEST 2008 Daniel Veillard * xmlschemas.c runtest.c testapi.c include/libxml/xmlreader.h python/types.c python/libxml_wrap.h python/libxml.c: fx compilation when configured without the reader should fix #513110 * doc/*: regenerated Sat May 3 14:33:29 CEST 2008 Rob Richards * dict.c: check for stdint.h and define types when using MSVC Mon Apr 28 20:06:12 CEST 2008 Daniel Veillard * parserInternals.c: applied patch from Ashwin to avoid a potential double-free Thu Apr 24 13:56:53 CEST 2008 Daniel Veillard * uri.c: applied patch from Ashwin fixing a number of realloc problems * HTMLparser.c: improve handling for misplaced html/head/body Tue Apr 22 10:27:17 CEST 2008 Daniel Veillard * dict.c: improvement on the hashing of the dictionnary, with visible speed up as the number of strings in the hash increases, work from Stefan Behnel Fri Apr 11 14:44:00 CEST 2008 Daniel Veillard * include/libxml/xmlschemas.h xmlschemas.c: added new function xmlSchemaValidCtxtGetParserCtxt based on Holger Kaelberer patch * doc/apibuild.py doc/*: regenerated the doc, chased why the new function didn't got any documentation, added more checking in the generator * include/libxml/relaxng.h include/libxml/schematron.h include/libxml/xmlschemas.h include/libxml/c14n.h include/libxml/xmlregexp.h include/libxml/globals.h include/libxml/xmlreader.h threads.c xmlschemas.c: various changes and cleanups following the new reports Thu Apr 10 10:07:00 CEST 2008 Daniel Veillard * Makefile.am: extend the cleanup rule * xmlschemas.c: space cleanup Wed Apr 9 19:43:25 CEST 2008 Rob Richards * include/wsockcompat.h: support older win32 platforms when building with newer versions of VS Tue Apr 8 16:56:07 CEST 2008 Daniel Veillard * configure.in NEWS doc/*: preparing release of 2.6.32 Tue Apr 8 10:19:01 CEST 2008 Daniel Veillard * tree.c: fix a bug introduced when fixing #438208 and reported by Ashwin * python/generator.py: fix an infinite loop bug Mon Apr 7 14:44:51 CEST 2008 Daniel Veillard * xmlreader.c: fix a link to XmlNodeType doc reported by Martijn Arts * docs/*: rebuilt Fri Apr 4 18:09:50 CEST 2008 Daniel Veillard * parser.c: improve the *Recover* functions documentation Thu Apr 3 14:57:15 CEST 2008 Daniel Veillard * parser.c: patch from Mark Rowe fixing BOM or encoding detection in external parsed entities, should fix #440415 Thu Apr 3 13:16:01 CEST 2008 Daniel Veillard * tree.c: fix some problems with the *EatName functions when running out of memory raised by Eric Schrock , should fix #438208 Thu Apr 3 12:41:29 CEST 2008 Daniel Veillard * xmlschemastypes.c: horror around the definition of the lexical values for decimal and derived types, fixing to reject empty values, should fix #503268 Thu Apr 3 11:44:57 CEST 2008 Daniel Veillard * encoding.c: buffer may not be large enough to convert to UCS4, patch from Christian Fruth , fixes #504015 Thu Apr 3 11:02:02 CEST 2008 Daniel Veillard * HTMLparser.c: apparently it's okay to forget the semicolumn after entity refs in HTML, fixing char refs parsing accordingly based on T. Manske patch, this should fix #517653 Thu Apr 3 09:30:29 CEST 2008 Daniel Veillard * error.c: avoid a scary realloc() loop should fix #520383 Thu Apr 3 08:22:52 CEST 2008 Daniel Veillard * parser.c: more realloc problems pointed out by Ashwin Thu Apr 3 07:40:13 CEST 2008 Daniel Veillard * xstc/Makefile.am: applied patch from Mike Hommey fixing distclean, fixes #520387 Thu Apr 3 06:52:32 CEST 2008 Daniel Veillard * include/libxml/xpath.h: small doc improvement for xmlXPathContext from Jack Jansen, fixes #524759 * doc/newapi.xsl doc/*: fixed a problem and regenerated the docs Tue Apr 1 09:59:22 CEST 2008 Daniel Veillard * xpath.c: two patches from Alvaro Herrera to avoid problem when running out of memory in XPath evaluations. Mon Mar 31 11:23:19 CEST 2008 Daniel Veillard * parser.c: lot of out of memory handling fixes from Ashwin * elfgcchack.h doc/elfgcchack.xsl: work around a problem with xmlDllMain * include/libxml/threads.h: indenting cleanups Mon Mar 31 10:25:37 CEST 2008 Daniel Veillard * parser.c docs/*: trying to clarify even more the xmlCleanupParser() use and the memory documentation Wed Mar 26 18:39:58 CET 2008 Daniel Veillard * parser.c: changes based on Alex Khesin patch where xmlParseCharRef seems to not be checked correctly, fixes #520198 Wed Mar 26 15:03:49 CET 2008 Daniel Veillard * parser.c: patch from Ashwin to avoid a problem of attribute redefinition in the DTD. Remove a warning too. Wed Mar 26 14:38:31 CET 2008 Daniel Veillard * xmlschemas.c: fix a problem in externalSubsetSplit with a patch from Ashwin Tue Mar 25 17:48:02 CET 2008 Daniel Veillard * parser.c: fix various attribute normalisation problems reported by Ashwin * result/c14n/without-comments/example-4 result/c14n/with-comments/example-4: this impacted the result of two c14n tests :-\ * test/att9 test/att10 test/att11 result//att9* result//att10* result//att11*: added 3 specific regression tests coming from the XML spec revision and from Ashwin Tue Mar 25 14:20:49 CET 2008 Daniel Veillard * uri.c: fix saving for file:///X:/ URI embedding Windows file paths should fix #524253 Mon Mar 24 21:42:33 CET 2008 Daniel Veillard * parser.c: fix a problem reported by Ashwin for system parameter entities referenced from entities in external subset, add a specific loading routine. * test/valid/dtds/external.ent test/valid/dtds/external2.ent test/valid/t11.xml result/valid/t11.xml*: added the test to the regression suite Mon Mar 24 15:04:54 CET 2008 Daniel Veillard * xmlschemas.c: fix an XML Schemas crash raised by Stefan Behnel when testing with W3C test suite Mon Mar 24 12:12:00 CET 2008 Daniel Veillard * threads.c: check some allocation with Ashwin patch Wed Mar 19 16:41:52 CET 2008 Daniel Veillard * vms/build_libxml.com: update from Tycho Hilhorst, should fix #523378 Tue Mar 18 09:23:05 CET 2008 Daniel Veillard * threads.c: check some malloc returns with Ashwin patch, add error messages and reindent the module. Fri Mar 14 15:28:43 CET 2008 Daniel Veillard * xmlreader.c: patch from Ashwin removing duplicate tests Fri Mar 14 13:44:29 CET 2008 Daniel Veillard * include/libxml/schematron.h include/libxml/xmlerror.h schematron.c: applied patch from Tobias Minich to allow plugin schematron error reporting in the normal error system, should fix #513998 Fri Mar 14 11:52:09 CET 2008 Daniel Veillard * parser.c xinclude.c: patch from Vasily Chekalkin fixes memory leaks, should fix 512647 Thu Mar 13 08:17:58 CET 2008 Daniel Veillard * xmlregexp.c: found a nasty bug in regexp automata build, reported by Ashwin and Bjorn Reese Wed Mar 12 18:56:22 CET 2008 Daniel Veillard * HTMLparser.c: patch from Arnold Hendriks improving parsing of html within html bogus data, still not a complete fix though Wed Mar 12 10:22:01 CET 2008 Daniel Veillard * python/types.c: fix a memory errro when using namespace nodes returned from XPath queries, should fix #521699 * python/tests/Makefile.am python/tests/xpathns.py: add a specific regression test for it Mon Mar 10 16:25:32 CET 2008 Rob Richards * include/win32config.h: add ICONV_CONST define for win32 build to satisfy encoding.c change in rev 3693 Fri Mar 7 17:45:27 CET 2008 Daniel Veillard * xmlsave.c parser.c: fix handling of empty CDATA nodes as reported and discussed around #514181 and associated patches * test/emptycdata.xml result/emptycdata.xml* result/noent/emptycdata.xml: added a specific test in the regression suite. Thu Mar 6 15:23:10 CET 2008 Daniel Veillard * encoding.c: poblem with encoding detection for UTF-16 reported by Ashwin and found by Bill * test/valid/dtds/utf16b.ent test/valid/dtds/utf16l.ent test/valid/UTF16Entity.xml result/valid/UTF16Entity.xml*: added the example to the regression tests Tue Mar 4 14:16:38 CET 2008 Daniel Veillard * xmlwriter.c: patch from Alex Khesin fixing CDATA output after a text node. * parser.c: fixed the comment for xmlParserCleanup * globals.c: fixed indentation Mon Feb 25 16:42:19 CET 2008 Daniel Veillard * testModule.c: patch from Florent Guiliani to fix build on SCO OpenServer Thu Feb 21 22:46:08 CET 2008 Daniel Veillard * debugXML.c: made one of the changes suggested by Brian Krahmer * testRegexp.c: allow to pass '--' on the command line to allow regexps starting with the character '-' Tue Feb 19 08:49:32 CET 2008 Daniel Veillard * python/Makefile.am python/tests/Makefile.am: applied cleanup patches for cross compilation and MinGW from Roumen Petrov Sat Feb 16 11:06:54 CET 2008 Daniel Veillard * xmlIO.c: fix output bug reported by Petr Pajas and analyzed by Bill Fri Feb 15 09:32:11 CET 2008 Daniel Veillard * include/libxml/xmlerror.h tree.c: patch from Julien Charbon to simplify the processing of xmlSetProp() Fri Feb 15 08:45:32 CET 2008 Daniel Veillard * config.h.in configure.in encoding.c: patch from Roumen Petrov to detect if iconv() needs a const for the second parameter Fri Feb 15 08:41:31 CET 2008 Daniel Veillard * macos/src/XMLTestPrefix2.h win32/Makefile.msvc: EOL cleanups from Florent Guiliani Wed Feb 13 10:56:38 CET 2008 Daniel Veillard * xmlwriter.c: applied patch from Alfred Mickautsch to flush the output at the end of document. Fri Feb 8 11:57:03 CET 2008 Daniel Veillard * doc/examples/examples.xml: regenerated, it was truncated. Fri Feb 8 11:47:18 CET 2008 Daniel Veillard * xmlmodule.c: apply simple patch from Carlo Bramini to avoid compilation problems with Mingw32 Fri Feb 8 11:33:15 CET 2008 Daniel Veillard * xmlregexp.c: apply patch from Andrew Tosh to fix behaviour when '.' is used in a posCharGroup * test/schemas/poschargrp0_0.* result/schemas/poschargrp0_0_0*: added the test to the regression suite Fri Feb 8 10:54:09 CET 2008 Daniel Veillard * dict.c: applied patch from Florent Guilian to remove an useless mutex in the xmlDict structure. Wed Feb 6 17:00:20 CET 2008 Daniel Veillard * SAX2.c: another leak reported by Ashwin * xinclude.c: fixed the behaviour when XIncluding a fragment of the current document, patch from Chris Ryan Wed Feb 6 12:10:08 HKT 2008 William Brack * nanohttp.c: added space for port number (when not 80) in xmlNanoHTTPMethodRedir, plus a few more comments. Should fix #514521. Tue Feb 5 09:41:46 CET 2008 Daniel Veillard * schemas.c: apply fix suggested by Ashwin correcting a cut-n-paste error about the SAX callback in cdataBlockSplit when streaming XSD validation Tue Feb 5 09:36:46 CET 2008 Daniel Veillard * uri.c: applied a patch based on Petr Sumbera one to avoid a problem with paths starting with // Mon Feb 4 17:48:30 CET 2008 Daniel Veillard * doc/xml.html doc/xmlmem.html: added a small section on returning memory to the kernel by compacting the heap provided by Wolfram Sang Fri Jan 25 20:01:42 CET 2007 Rob Richards * include/win32config.h win32/Makefile.msvc: fix build under VS 2008. patch by David Wimsey Thu Jan 24 15:37:04 CET 2008 Daniel Veillard * parser.c: fix a memeory leak in internal subset parsing with a fix from Ashwin * test/errors/content1.xml result/errors/content1.xml*: add test to regressions Fri Jan 11 09:00:09 CET 2008 Daniel Veillard * configure.in doc/*: preparing release of 2.6.31 Fri Jan 11 08:58:49 CET 2008 Daniel Veillard * parser.c: avoid a warning on 64bits introduced earlier * parserInternals.c: make more checking on the UTF-8 input Fri Jan 11 15:37:05 CST 2008 Daniel Veillard * HTMLparser.c: avoid stopping parsing when encountering out of range characters in an HTML file, report and continue processing instead, should fix #472696 Fri Jan 11 15:13:35 CST 2008 Daniel Veillard * check-relaxng-test-suite2.py check-relaxng-test-suite.py Makefile.am python/tests/Makefile.am python/Makefile.am check-xsddata-test-suite.py: patches from John Carr to start cleaning up 'make diskcheck' problems c.f. #506228 Fri Jan 11 14:48:40 CST 2008 Daniel Veillard * xmllint.c: apply fix from Stefan Kost to avoid a crash in xmllint, fixes 504284 Fri Jan 11 14:39:03 CST 2008 Daniel Veillard * xml2-config.in: apply patch from Fred Crozat to avoid outputting -L/usr/lib from xml2-config, fixes #497012 Fri Jan 11 14:18:09 CST 2008 Daniel Veillard * HTMLparser.c: fix definition for to avoid error when saving back, patch from Stefan Behnel fixing 495213 Fri Jan 11 14:06:09 CST 2008 Daniel Veillard * parser.c: applied patch from Christian Schmidt fixing a column counter update problem, fixes #472696 Fri Jan 11 13:22:14 CST 2008 Daniel Veillard * parser.c: handle a erroneous parsing of attributes in case said attribute has been redeclared in the DTD with a different type * hash.c: fix the hash scanner to not crash if a first element from the hash list is been removed in the callback Wed Jan 9 10:15:50 CST 2008 Daniel Veillard * xmlwriter.c: fix indentation in xmlTextWriterFullEndElement, as raised by Felipe Pena, should fix #508156 Tue Dec 6 11:07:42 CET 2007 Rob Richards * pattern.c: fix crash from double free of name for bug #501760 Fri Nov 23 11:47:48 CET 2007 Daniel Veillard * threads.c: remove unused variable in __xmlGlobalInitMutexLock reported by Hannes Eder Mon Nov 19 18:39:26 CET 2007 Daniel Veillard * xmlregexp.c: remove a cut-and-paste copy error Fri Nov 16 11:55:36 CET 2007 Rob Richards * globals.c threads.c include/libxml/threads.h: __xmlGlobalInitMutexDestroy() will free global_init_lock on Win32. Patch from Marc-Antoine Ruel. Tue Nov 13 21:26:27 CET 2007 Rob Richards * schematron.c: fix crash/leaks from xmlSchematronParse due to improper schema document ownership for bug #495215 Tue Oct 30 21:24:55 CET 2007 Daniel Veillard * xmlmemory.c: xmlFree(NULL) should not crash in debug mode should fix #491651 Tue Oct 16 13:58:41 CEST 2007 Daniel Veillard * testURI.c: add a debug option printing all the fields within the parsed URI structure Wed Oct 10 10:25:52 CEST 2007 Daniel Veillard * xmlsave.c: fix to avoid a crash when dumping an attribute from an XHTML document, patch contributed to fix #485298 Tue Aug 28 19:32:28 CEST 2007 Daniel Veillard * xmlregexp.c: another nasty regexp case fixed. * test/regexp/ranges2 result/regexp/ranges2: added to regression suite Fri Aug 24 10:58:58 HKT 2007 William Brack * nanohttp.c: Enhanced to include port number (if not == 80) on the "Header:" URL (bug #469681). * xmlregexp.c: Fixed a typo causing a warning message. Thu Aug 23 22:48:20 CEST 2007 Daniel Veillard * nanohttp.c: fix an open() call with creation without 3rd argument hopefully that interface is never used. Thu Aug 23 17:00:49 CEST 2007 Daniel Veillard * configure.in doc/*: preparing release of 2.6.30 Thu Aug 23 20:58:28 HKT 2007 William Brack * xpath.c: fixed xmlXPathCompOpEvalPositionalPredicate problem with object caching (bug #469410) Thu Aug 23 11:28:38 CEST 2007 Daniel Veillard * xmlschemas.c test/schemas/*455953* result/schemas/bug455953*: applied patch from Frank Gross fixing Schemas IDC import bug #455953 and also add the test to the regression suite Wed Aug 22 18:29:42 CEST 2007 Daniel Veillard * xmlregexp.c: try to fix for the nth time the automata generation in case of complex ranges. I suppose that time it is actually okay Tue Aug 14 15:51:05 CEST 2007 Daniel Veillard * parser.c: aligned xmlSAXUserParseMemory() to match xmlSAXUserParseFile() logic based on Ashwin post, and ifdef cleanup Tue Aug 14 11:42:27 CEST 2007 Rob Richards * xmlIO.c: fixed windows path determination (patch from Roland Schwarz, bug #462877) * win32/Makefile.mingw win32/configure.js: fixed mingw build (patch from Roland Schwarz, bug #462877) Wed Aug 1 09:50:12 CEST 2007 Daniel Veillard * parser.c: fixed a parser bug where invalid char in comment may not be detected, reported by Ashwin Sinha * test/errors/comment1.xml result/errors/comment1.xml*: added the example to the regression suite Thu Jul 26 13:42:26 CEST 2007 Daniel Veillard * xmlsave.c: fixed problem reported on bug #460415 Thu Jul 19 18:10:58 PDT 2007 William Brack * uri.c: applied patch from from Patrik Fimml. Fixes bug #458268. Wed Jul 18 11:05:08 PDT 2007 William Brack * xinclude.c: applied patch from bug #454608 from Patrik Fimml. Fixes bug #454608. Wed Jul 11 19:57:59 CEST 2007 Daniel Veillard * xmlschemas.c: applied patch for xsi:nil from Frank Gross, this should fix bug #358125 Wed Jul 4 17:44:20 CEST 2007 Daniel Veillard * xmlwriter.c: patch from Dodji Seketeli to avoid a leak on repeated uses of xmlTextWriterStartDocument() Tue Jun 26 13:30:50 CEST 2007 Daniel Veillard * xmlschemas.c: fix a crash on solaris when a printf %s with a NULL argument occurs, should fix #450936 Wed Jun 13 13:33:38 PDT 2007 William Brack * xpath.c: fixed problem in previous fix to xmlXPathNodeSetSort Tue Jun 12 18:17:28 CEST 2007 Daniel Veillard * doc/* configure.in NEWS: release of libxml2 2.6.29 * valid.c: patch from Dagfinn I. Mannsåker for idness of name in HTML, c.f. bug #305885. Tue Jun 12 17:14:08 CEST 2007 Daniel Veillard * SAX2.c: fixing bug #319964, parsing of HTML attribute really should not have namespace processing. Tue Jun 12 16:42:14 CEST 2007 Daniel Veillard * parser.c: fixed the push mode when a big comment occurs before an internal subset, should close bug #438835 * test/comment6.xml result//comment6.xml*: added a special test in the regression suite Tue Jun 12 15:41:09 CEST 2007 Daniel Veillard * parser.c: fix bug #414846 where invalid characters in attributes would sometimes not be detected. * test/errors/attr4.xml result/errors/attr4.xml*: added a specific test case to the regression tests Tue Jun 12 14:23:24 CEST 2007 Daniel Veillard * xstc/Makefile.am: apply patch from Ryan Hill to cope with changes in GNU tar, should fix #396751 Tue Jun 12 12:03:36 CEST 2007 Daniel Veillard * python/types.c: try to allow compilation on old python version should fix #398125 Tue Jun 12 11:48:15 CEST 2007 Daniel Veillard * HTMLtree.c: htmlNodeDumpFormatOutput didn't handle XML_ATTRIBUTE_NODe fixes bug #438390 Tue Jun 12 11:37:55 CEST 2007 Daniel Veillard * xmlIO.c: workaround misgenerated file: URIs c.f. #437385 Tue Jun 12 11:22:47 CEST 2007 Daniel Veillard * relaxng.c: fixed bug #407436 a crash in a specific case of Relax-NG validation Tue Jun 12 11:12:50 CEST 2007 Daniel Veillard * catalog.c: fixed bug #383687, some case of recursion on next were not caught in the catalog code. Tue Jun 12 10:37:42 CEST 2007 Daniel Veillard * HTMLparser.c: fixed bug #381877, avoid reading over the end of stream when generating an UTF-8 encoding error. Tue Jun 12 10:16:48 CEST 2007 Daniel Veillard * parser.c: fixed bug #366161, trivially added the check in xmlCtxtReset() Fri Jun 8 21:48:21 CEST 2007 Rob Richards * win32/configure.js win32/Makefile.msvc: add --vcmanifest flag (yes/no) for VC8 build support to embed manifest within files. Under MS VC, build libxml2_a_dll.lib by default (LIBXML_STATIC_FOR_DLL flag). Fri Jun 8 21:37:46 CEST 2007 Rob Richards * threads.c include/libxml/threads.h: use specified calling convention for xmlDllMain. Old SDKs (VC6) only support InterlockedCompareExchange. add xmlDllMain to header for win32 when building for static dll Fri Jun 8 10:51:28 CEST 2007 Rob Richards * xmlwriter.c: fixed problem with namespace declaration being written more than once per element start tag Wed Jun 6 10:18:28 PDT 2007 William Brack * xpath.c: fixed problem with xmlXPathNodeSetSort; fixed problem with xmlXPathNodeTrailingSorted (both bug#413451) Wed May 30 22:05:08 PDT 2007 William Brack * xpath.c: fixed problem with string value for PI node (bug #442275) Mon May 28 16:14:50 CEST 2007 Daniel Veillard * uri.c: fix bug reported by François Delyon Tue May 22 08:59:48 PDT 2007 William Brack * encoding.c: Fixed typo in xmlCharEncFirstLine pointed out by Mark Rowe (bug #440159) * include/libxml/xmlversion.h.in: Added check for definition of _POSIX_C_SOURCE to avoid warnings on Apple OS/X (patch from Wendy Doyle and Mark Rowe, bug #346675) * schematron.c, testapi.c, tree.c, xmlIO.c, xmlsave.c: minor changes to fix compilation warnings - no change to logic. Tue May 15 22:18:08 PDT 2007 William Brack * nanohttp.c: small enhancement to last fix, pointed out by Alex Cornejo Tue May 15 12:38:38 PDT 2007 William Brack * nanohttp.c: fixed problem on gzip streams (bug #438045) * xpath.c: fixed minor spot of redundant code - no logic change. Fri May 11 22:45:18 HKT 2007 William Brack * xpath.c: enhanced the coding for xmlXPathCastNumberToString in order to produce the required number of significant digits (bug #437179) Thu May 10 01:52:42 CEST 2007 Daniel Veillard * list.c: applied patch to fix xmlListAppend() from Georges-André SILBER * valid.c: also fix the place wher it was called. Wed May 2 18:47:33 CEST 2007 Daniel Veillard * parser.c: tried to fix an error problem on entity content failure reported by Michael Day Wed May 2 18:23:35 CEST 2007 Daniel Veillard * configure.in: typo patch from Bjorn Reese Wed May 2 18:12:58 CEST 2007 Daniel Veillard * HTMLparser.c: applied patch from Michael Day to add support for Thu Apr 26 10:58:50 CEST 2007 Daniel Veillard * HTMLparser.c: Jean-Daniel Dupas pointed a couple of problems in htmlCreateDocParserCtxt. Thu Apr 26 10:36:26 CEST 2007 Daniel Veillard * uri.c include/libxml/uri.h: patch from Richard Jones to save the query part in raw form. * libxml2-python-api.xml: also added accessor for the python bindings Wed Apr 25 15:57:32 CEST 2007 Daniel Veillard * xstc/Makefile.am doc/examples/Makefile.am Makefile.am: applied patch from Richard Jones to for the silent flag on valgrind when doing "make valgrind" * xmlregexp.c: raise a regexp error when '\' is misused to escape a standard character. Tue Apr 24 20:15:14 CEST 2007 Daniel Veillard * tree.c: Richard Jones reported xmlBufferAdd (buf, "", -1), fixing it Tue Apr 24 10:59:28 CEST 2007 Daniel Veillard * uri.c: fix xmlURIUnescapeString comments which was confusing Wed Apr 18 09:52:25 CEST 2007 Daniel Veillard * include/win32config.h libxml.h: new patch from Andreas Stricke to better integrate support for Windows CE Tue Apr 17 16:50:12 CEST 2007 Daniel Veillard * doc/* configure.in NEWS: release of libxml2 2.6.28 Tue Apr 17 14:47:42 CEST 2007 Daniel Veillard * catalog.c libxml.h win32/wince/wincecompat.h win32/wince/wincecompat.c xmlIO.c nanohttp.c nanoftp.c trio.c triostr.c triostr.h: applied patch from Andreas Stricke to ease the compilation on Windows CE Tue Apr 17 14:34:45 CEST 2007 Daniel Veillard * xmllint.c catalog.c: "xmllint unusable on win32" so applied a libxml2 patch from Christian Ehrlicher Mon Apr 16 09:05:01 CEST 2007 Daniel Veillard * HTMLparser.c: change the way script/style are parsed to not try to detect comments, reported by Mike Day * result/HTML/doc3.*: affects the result of that test Wed Apr 11 22:38:18 HKT 2007 William Brack * xmlregexp.c: small enhancement for quantifier range with min occurs of 0; fixes bug 425542. Fri Mar 30 14:41:57 CEST 2007 Daniel Veillard * xmlIO.c: applied change from Michael Day to avoid a problem when compiled without zlib support. Wed Mar 21 17:58:13 CET 2007 Daniel Veillard * include/libxml/xpath.h: applied documentation patch from James Dennett Wed Mar 21 21:20:48 HKT 2007 William Brack * xmlregexp.c: fixed problem with 0x2d in Char Range (bug #420596) * test/regexp/bug420596, result/regexp/bug420596: added regression test for this Wed Mar 21 14:23:08 HKT 2007 William Brack * HTMLparser.c: fixed memory access error on parsing of meta data which had errors (bug #382206). Also cleaned up a few warnings by adding some additional DECL macros. Tue Mar 20 09:58:13 CET 2007 Daniel Veillard * nanoftp.c: applied patch from Björn Wiberg to try to fix again the silly __ss_familly problem on various AIXes, should fix #420184 Wed Mar 14 20:30:38 HKT 2007 William Brack * configure.in: corrected small error in last commit * xmlreader.c: corrected small typo in last commit Wed Mar 14 19:35:28 HKT 2007 William Brack * xmlschemas.c: fixed problem with referenced attribute groups (bug #417621) * configure.in: re-ordered some includes for types.h / socket.h (bug #416001) Fri Mar 9 17:54:40 CET 2007 Daniel Veillard * xmlreader.c: applied patch from Julien Reichel cleaning up mode and state internal flags mixups Wed Mar 7 16:18:18 HKT 2007 William Brack * xpath.c: fixed xmlXPathCmpNodes for incorrect result on certain cases when comparing identical nodes (bug #415567) with patch from Oleg Paraschenko Fri Feb 16 09:13:38 PST 2007 William Brack * python/libxml.py: fixed tab problem with patch from Andreas Hanke (bug #408626) Thu Feb 15 12:43:28 PST 2007 William Brack * doc/xml.html: Changed all references to libxml2 CVS over to the corresponding SVN. A few other spelling/grammar/links also changed. * doc/libxml2-api.xml, doc/*.html: Regenerated all docs. Tue Feb 13 18:15:58 PST 2007 William Brack * xpath.c: Fixed memory bug with invalid function reported by Francois Delyon on mailing list Mon Feb 12 16:40:48 PST 2007 William Brack * xinclude.c: fixed problem with invalid char encountered during text include (reported on xslt mailing list) Mon Feb 12 18:30:01 CET 2007 Daniel Veillard * Makefile.am: small cleanup to avoid packaging .svn * libxml.h threads.c parser.c: applied patch to avoid a problem in concurrent threaded initialization fix from Ted Phelps Thu Feb 08 15:35:18 PST 2007 William Brack * parser.c: added a GROW when parsing complex comments (bug #405666) * gentest.py, testapi.c: added a hack to prevent destruction of any param with 'destroy' in it's description (i.e. param destroyed by the routine under test, so shouldn't be destroyed by testapi) * xmlreader.c: added freeing of 'input' param even on error (fixes leak detected by testapi) Wed Jan 31 10:25:38 PST 2007 William Brack * testAutomata.c, testRegexp.c, testThreads.c, testThreadsWin32.c, xmlwriter.c: repositioned #include for libxml.h to avoid compilation error on some architectures (bug #398277) * fixed screwed-up ChangeLog (deleted some duplicate entries) Fri Jan 26 00:05:18 PST 2007 William Brack * implemented patch from Stéphane Bidoul for uri.c (bug #389767) Thu Jan 25 11:15:08 PST 2007 William Brack * xpath.c: added checks for alloc fail on calls to xmlXPathNewContext (libxslt bug #400242) Thu Jan 11 15:38:08 PST 2007 William Brack * Re-generated the documentation (API chunks 27-29 were missing) (also causes changes to testapi.c, elfgcchack.h and win32/libxml2.def.src) Tue Jan 9 22:24:26 CET 2007 Daniel Veillard * python/libxml.c: fix a memory leak in the python string handling when SAX event are passed back to the python handlers Thu Jan 4 18:27:49 CET 2007 Daniel Veillard * xmlreader.c: fix xmlTextReaderSetup() description * test/relaxng/empty1.rng test/relaxng/comps_0.xml test/relaxng/empty1_0.xml test/relaxng/comps.rng test/relaxng/empty0.rng test/relaxng/empty0_0.xml test/relaxng/empty1_1.xml: tests which were apparently never commited to CVS Wed Jan 3 16:05:21 PST 2007 Aleksey Sanin * xmlreader.c include/libxml/xmlreader.h win32/libxml2.def.src: expose xmlTextReaderSetup() function Wed Jan 3 16:14:13 CET 2007 Daniel Veillard * configure.in: adapt the extra versioning code to SVN Thu Dec 14 16:52:34 CET 2006 Daniel Veillard * python/generator.py python/libxml.py: apparently id() sometimes generate negative values and %X outputs -XXXX :-( Mon Dec 4 10:30:25 CET 2006 Daniel Veillard * parser.c include/libxml/tree.h: patch from Michael Day on standalone and XML declaration detection, and associated documentation change Mon Dec 4 10:27:01 CET 2006 Daniel Veillard * xinclude.c: another XInclude user data propagation patch from Michael Day Thu Nov 23 17:22:03 CET 2006 Daniel Veillard * HTMLparser.c: applied patch from Steven Rainwater to fix UTF8ToHtml behaviour on code points which are not mappable to predefined HTML entities, fixes #377544 Thu Nov 23 17:11:23 CET 2006 Daniel Veillard * xpath.c: fixed a bug where the principal node type of an axis wasn't tested on name check, fixes bug #377432 Wed Nov 8 10:19:27 CET 2006 Daniel Veillard * HTMLparser.c: change htmlCtxtReset() following Michael Day bug report and suggestion. Mon Nov 6 09:56:41 CET 2006 Daniel Veillard * uri.c: applied patch from Igor for path conversion on Windows Thu Nov 2 11:29:17 CET 2006 Daniel Veillard * xmlregexp.c: another small change on the algorithm for the elimination of epsilon transitions, should help on #362989 too Wed Nov 1 16:33:10 CET 2006 Daniel Veillard * tree.c: applied documentation patches from Markus Keim * xmlregexp.c: fixed one bug and added a couple of optimisations while working on bug #362989 Fri Oct 27 14:54:07 CEST 2006 Daniel Veillard * HTMLparser.c: applied a reworked version of Usamah Malik patch to avoid growing the parser stack in some autoclose cases, should fix #361221 Thu Oct 26 10:54:40 CEST 2006 Daniel Veillard * xpath.c: William spotted an obvious bug Wed Oct 25 18:04:50 CEST 2006 Daniel Veillard * NEWS configure.in testapi.c doc//*: preparing release of libxml2-2.6.27 * include/libxml/tree.h: fix a small problem with preproc flags Fri Oct 20 14:55:47 CEST 2006 Daniel Veillard * tree.c: fix comment for xmlDocSetRootElement c.f. #351981 * xmllint.c: order XPath elements when using --shell Tue Oct 17 23:23:26 CEST 2006 Daniel Veillard * xmlregexp.c: applied fix from Christopher Boumenot for bug #362714 on regexps missing ']' Tue Oct 17 22:32:42 CEST 2006 Daniel Veillard * parserInternals.c: applied patch from Marius Konitzer to avoid leaking in xmlNewInputFromFile() in case of HTTP redirection Tue Oct 17 22:19:02 CEST 2006 Daniel Veillard * HTMLparser.c: fix one problem found in htmlCtxtUseOptions() and pointed in #340591 Tue Oct 17 22:04:31 CEST 2006 Daniel Veillard * HTMLparser.c: fixed teh 2 stupid bugs affecting htmlReadDoc() and htmlReadIO() this should fix #340322 Tue Oct 17 21:39:23 CEST 2006 Daniel Veillard * xpath.c: applied patch from Olaf Walkowiak which should fix #334104 Tue Oct 17 18:12:34 CEST 2006 Daniel Veillard * HTMLparser.c: fixing HTML minimized attribute values to be generated internally if not present, fixes bug #332124 * result/HTML/doc2.htm.sax result/HTML/doc3.htm.sax result/HTML/wired.html.sax: this affects the SAX event strem for a few test cases Tue Oct 17 17:56:31 CEST 2006 Daniel Veillard * HTMLparser.c: fixing HTML entities in attributes parsing bug #362552 * result/HTML/entities2.html* test/HTML/entities2.html: added to the regression suite Tue Oct 17 01:21:37 CEST 2006 Daniel Veillard * xmllint.c: started to switch xmllint to use xmlSaveDoc to test #342556 * xmlsave.c: fixed #342556 easy and a whole set of problems with encodings, BOM and xmlSaveDoc() Mon Oct 16 15:14:53 CEST 2006 Daniel Veillard * HTMLparser.c: fix #348252 if the document clains to be in a different encoding in the meta tag and it's obviously wrong, don't screw up the end of the content. Mon Oct 16 11:32:09 CEST 2006 Daniel Veillard * HTMLparser.c: fix a chunking and script bug #347708 Mon Oct 16 09:51:05 CEST 2006 Daniel Veillard * HTMLparser.c: remove a warning * encoding.c: check with uppercase for AIX iconv() should fix #352644 * doc/examples/Makefile.am: partially handle one bug report Sun Oct 15 22:31:42 CEST 2006 Daniel Veillard * parser.c: fix the patch for unreproductable #343000 but also fix a line/column keeping error * result/errors/attr1.xml.err result/errors/attr2.xml.err result/errors/name.xml.err result/errors/name2.xml.err result/schemas/anyAttr-processContents-err1_0_0.err result/schemas/bug312957_1_0.err: affected lines in error output of the regression tests Sat Oct 14 10:46:46 CEST 2006 Daniel Veillard * tree.c: fixing bug #344390 with xmlReconciliateNs Sat Oct 14 00:31:49 CEST 2006 Daniel Veillard * xmllint.c: added --html --memory to test htmlReadMemory to test #321632 * HTMLparser.c: added various initialization calls which may help #321632 but not conclusive * testapi.c tree.c include/libxml/tree.h: fixed compilation with --with-minimum --with-sax1 and --with-minimum --with-schemas fixing #326442 Fri Oct 13 18:30:55 CEST 2006 Daniel Veillard * relaxng.c: fix a Relax-NG bug related to element content processing, fixes bug #302836 * test/relaxng/302836.rng test/relaxng/302836_0.xml result/relaxng/302836*: added to regression tests Fri Oct 13 14:42:44 CEST 2006 Daniel Veillard * parser.c: fix a problem in xmlSplitQName resulting in bug #334669 Fri Oct 13 12:27:22 CEST 2006 Daniel Veillard * parser.c: fixed xmlIOParseDTD handling of @input in error case, Should fix #335085 * testapi.c: reset the http_proxy env variable to not waste time on regression tests Thu Oct 12 23:07:43 CEST 2006 Rob Richards * xmlIO.c: fix Windows compile - missing xmlWrapOpen. Thu Oct 12 18:21:18 CEST 2006 Daniel Veillard * parser.c: fixed the heuristic used when trying to detect mixed-content elememts if the parser wants to treat ignorable whitespaces in a non-standard way, should fix bug #300263 Thu Oct 12 14:52:38 CEST 2006 Daniel Veillard * parser.c: fix a first arg error in SAX callback pointed out by Mike Hommey, and another one still hanging around. Should fix #342737 Wed Oct 11 23:11:58 CEST 2006 Daniel Veillard * include/libxml/xmlversion.h.in: fix comment on versions * xmlmemory.c: do not spend too much time digging in dumped memory Wed Oct 11 18:40:00 CEST 2006 Daniel Veillard * valid.c: fixed a weird error where validity context whould not show up if warnings were disabled pointed out by Bob Stayton * xmlIO.c doc/generator.py: cleanup and fix to regenerate the docs * doc//* testapi.c: rebuilt the docs Wed Oct 11 14:32:00 CEST 2006 Daniel Veillard * libxml-2.0.pc.in: applied patch from Mikhail Zabaluev to separate library flags for shared and static builds, fixes #344594. If this bites you, use xml2-config. Wed Oct 11 11:27:37 CEST 2006 Daniel Veillard * python/Makefile.am: remove the build path recorded in the python shared module as Peter Breitenlohner pointed out, should fix #346022 Wed Oct 11 11:14:51 CEST 2006 Daniel Veillard * xmlIO.c: applied patch from Mikhail Zabaluev fixing the conditions of unescaping from URL to filepath, should fix #344588. Wed Oct 11 10:24:58 CEST 2006 Daniel Veillard * configure.in xstc/Makefile.am: applied patch from Peter Breitenlohner for wget detection and fix of a Python path problem, should fix #340993 Tue Oct 10 22:02:29 CEST 2006 Daniel Veillard * include/libxml/entities.h entities.c SAX2.c parser.c: trying to fix entities behaviour when using SAX, had to extend entities content and hack on the entities processing code, but that should fix the long standing bug #159219 Tue Oct 10 14:36:18 CEST 2006 Daniel Veillard * uri.c include/libxml/uri.h: add a new function xmlPathToUri() to provide a clean conversion when setting up a base * SAX2.c tree.c: use said function when setting up doc->URL or using the xmlSetBase function. Should fix #346261 Tue Oct 10 11:05:59 CEST 2006 Daniel Veillard * xmlIO.c: applied a portability patch from Emelyanov Alexey Tue Oct 10 10:52:01 CEST 2006 Daniel Veillard * parser.c: applied and slightly modified a patch from Michael Day to keep _private in the parser context when parsing external entities Tue Oct 10 10:33:43 CEST 2006 Daniel Veillard * python/libxml.py python/types.c: applied patch from Ross Reedstrom, Brian West and Stefan Anca to add XPointer suport to the Python bindings Fri Sep 29 11:13:59 CEST 2006 Daniel Veillard * xmlsave.c: fixed a comment * xinclude.c include/libxml/xinclude.h: applied a patch from Michael Day to add a new function providing the _private field for the generated parser contexts xmlXIncludeProcessFlagsData() Thu Sep 21 10:36:11 CEST 2006 Daniel Veillard * xmlIO.c: applied patch from Michael Day doing some refactoring for the catalog entity loaders. Thu Sep 21 08:53:06 CEST 2006 Daniel Veillard * HTMLparser.c include/libxml/HTMLparser.h: exports htmlNewParserCtxt() as Michael Day pointed out this is needed to use htmlCtxtRead*() Tue Sep 19 14:42:59 CEST 2006 Daniel Veillard * parser.c: applied patch from Ben Darnell on #321545, I could not reproduce the problem but 1/ this is safe 2/ it's better to be safe. Sat Sep 16 16:02:23 CEST 2006 Rob Richards * tree.c: xmlTextConcat works with comments and PI nodes (bug #355962). * parser.c: fix resulting tree corruption when using XML namespace with existing doc in xmlParseBalancedChunkMemoryRecover. Fri Sep 1 11:52:55 CEST 2006 Daniel Veillard * xmlIO.c: another patch from Emelyanov Alexey to clean up a few things in the previous patch. Wed Aug 30 15:10:09 CEST 2006 Daniel Veillard * xmlIO.c: applied patch from Roland Schwingel to fix the problem with file names in UTF-8 on Windows, and compat on older win9x versions. Tue Aug 22 16:51:22 CEST 2006 Daniel Veillard * valid.c: fixed a bug #203125 in Red hat bugzilla, crashing PHP4 on validation errors, the heuristic to guess is a vctxt user pointer is the parsing context was insufficient. Mon Aug 21 10:40:10 CEST 2006 Daniel Veillard * doc/xmlcatalog.1 doc/xmlcatalog_man.xml doc/xmllint.1 doc/xmllint.xml: applied patch to man pages from Daniel Leidert and regenerated Thu Aug 17 00:48:31 CEST 2006 Rob Richards * xmlwriter.c: Add a document to the xmlwriter structure and pass document when writing attribute content for encoding support. Wed Aug 16 01:15:12 CEST 2006 Rob Richards * HTMLtree.c xmlsave.c: Add linefeeds to error messages allowing for consistant handling. Tue Aug 15 15:02:18 CEST 2006 Kasimier Buchcik * xpath.c: Applied the proposed fix for the documentation of xmlXPathCastToString(); see bug #346202. Tue Aug 15 14:49:18 CEST 2006 Kasimier Buchcik * xmlschemas.c: While investigating bug #350247, I noticed that xmlSchemaIDCMatcher structs are massively recreated although only a maximum of 3 structs is used at the same time; added a cache for those structures to the validation context. Sat Aug 12 16:12:53 CEST 2006 Daniel Veillard * xmlschemas.c: applied patch from Marton Illes to fix an allocation bug in xmlSchemaXPathEvaluate should close #351032 Mon Aug 7 13:08:46 CEST 2006 Daniel Veillard * xmlschemas.c: applied patch from Bertrand Fritsch to fix a bug in xmlSchemaClearValidCtxt Fri Aug 4 14:50:41 CEST 2006 Daniel Veillard * python/generator.py: fixed the conversion of long parameters Thu Jul 13 15:03:11 CEST 2006 Kasimier Buchcik * xmlsave.c: Removed the automatic generation of CDATA sections for the content of the "script" and "style" elements when serializing XHTML. The issue was reported by Vincent Lefevre, bug #345147. * result/xhtml1 result/noent/xhtml1: Adjusted regression test results due to the serialization change described above. Thu Jul 13 08:32:21 CEST 2006 Daniel Veillard * configure.in parser.c xmllint.c include/libxml/parser.h include/libxml/xmlversion.h.in: applied patch from Andrew W. Nosenko to expose if zlib support was compiled in, in the header, in the feature API and in the xmllint --version output. Thu Jul 13 08:24:14 CEST 2006 Daniel Veillard * SAX2.c: refactor to use normal warnings for entities problem and not straight SAX callbacks. Wed Jul 12 17:13:03 CEST 2006 Kasimier Buchcik * xmlschemas.c: Fixed bug #347316, reported by David Belius: The simple type, which was the content type definition of a complex type, which in turn was the base type of a extending complex type, was missed to be set on this extending complex type in the derivation machinery. Mon Jul 3 13:36:43 CEST 2006 Kasimier Buchcik * xpath.c: Changed xmlXPathCollectAndTest() to use xmlXPathNodeSetAddNs() when adding a ns-node in case of NODE_TEST_TYPE (the ns-node was previously added plainly to the list). Since for NODE_TEST_ALL and NODE_TEST_NAME this specialized ns-addition function was already used, I assume it was missed to be used with NODE_TEST_TYPE. Mon Jul 3 10:57:33 CEST 2006 Daniel Veillard * HTMLparser.c: applied const'ification of strings patch from Matthias Clasen Thu Jun 29 13:51:12 CEST 2006 Daniel Veillard * threads.c: patch from Andrew W. Nosenko, xmlFreeRMutex forgot to destroy the condition associated to the mutex. Thu Jun 29 12:48:00 CEST 2006 Kasimier Buchcik * xpath.c: Fixed a double-free in xmlXPathCompOpEvalToBoolean(), revealed by a Libxslt regression test. Thu Jun 29 12:28:07 CEST 2006 Kasimier Buchcik * xpath.c: Enhanced xmlXPathCompOpEvalToBoolean() to be also usable outside predicate evaluation; the intention is to use it via xmlXPathCompiledEvalToBoolean() for XSLT tests, like in . Wed Jun 28 19:11:16 CEST 2006 Kasimier Buchcik * xpath.c: Fix a memory leak which occurred when using xmlXPathCompiledEvalToBoolean(). Mon Jun 26 17:24:28 UTC 2006 William Brack * python/libxml.c, python/libxml.py, python/tests/compareNodes.py, python/tests/Makefile.am: Added code submitted by Andreas Pakulat to provide node equality, inequality and hash functions, plus a single test program to check the functions (bugs 345779 + 345961). Mon Jun 26 18:38:51 CEST 2006 Kasimier Buchcik * xpath.c: Added xmlXPathCompiledEvalToBoolean() to the API and adjusted/added xmlXPathRunEval(), xmlXPathRunStreamEval(), xmlXPathCompOpEvalToBoolean(), xmlXPathNodeCollectAndTest() to be aware of a boolean result request. The new function is now used to evaluate predicates. Mon Jun 26 16:22:50 CEST 2006 Kasimier Buchcik * xpath.c: Fixed an bug in xmlXPathCompExprAdd(): the newly introduced field @rewriteType on xmlXPathStepOp was not initialized to zero here; this could lead to the activation of the axis rewrite code in xmlXPathNodeCollectAndTest() when @rewriteType is randomly set to the value 1. A test (hardcoding the intial value to 1) revealed that the resulting incorrect behaviour is similar to the behaviour as described by Arnold Hendriks on the mailing list; so I hope that will fix the issue. Fri Jun 23 18:26:08 CEST 2006 Kasimier Buchcik * xpath.c: Fixed an error in xmlXPathEvalExpr(), which was introduced with the addition of the d-o-s rewrite and made xpath.c unable to compile if XPATH_STREAMING was not defined (reported by Kupriyanov Anatolij - #345752). Fixed the check for d-o-s rewrite to work on the correct XPath string, which is ctxt->base and not comp->expr in this case. Mon Jun 19 12:23:41 CEST 2006 Kasimier Buchcik * xpath.c: Added optimization for positional predicates (only short-hand form "[n]"), which have a preceding predicate: "/foo[descendant::bar][3]". Sun Jun 18 20:59:02 EDT 2006 Daniel Veillard * parser.c: try to fix the crash raised by the parser in recover mode as pointed by Ryan Phillips Sun Jun 18 18:44:56 EDT 2006 Daniel Veillard * python/types.c: patch from Nic Ferrier to provide a better type mapping from XPath to python Sun Jun 18 18:35:50 EDT 2006 Daniel Veillard * runtest.c: applied patch from Boz for VMS and reporting Schemas errors. Sun Jun 18 18:22:25 EDT 2006 Daniel Veillard * testapi.c: applied patch from Felipe Contreras when compiling with --with-minimum Fri Jun 16 21:37:44 CEST 2006 Kasimier Buchcik * tree.c include/libxml/tree.h: Fixed a bug in xmlDOMWrapAdoptNode(); the tree traversal stopped if the very first given node had an attribute node :-( This was due to a missed check in the traversal mechanism. Expanded the xmlDOMWrapCtxt: it now holds the namespace map used in xmlDOMWrapAdoptNode() and xmlDOMWrapCloneNode() for reusal; so the map-items don't need to be created for every cloning/adoption. Added a callback function to it for retrieval of xmlNsPtr to be set on node->ns; this is needed for my custom handling of ns-references in my DOM wrapper. Substituted code which created the XML namespace decl on the doc for a call to xmlTreeEnsureXMLDecl(). Removed those nastly "warnigns" from the docs of the clone/adopt functions; they work fine on my side. Mon Jun 12 13:23:11 CEST 2006 Kasimier Buchcik * result/pattern/namespaces: Adjusted the result of a regression test, since the fix of xmlGetNodePath() revealed a bug in this test result. Mon Jun 12 13:06:03 CEST 2006 Kasimier Buchcik * tree.c: Got rid of a compiler warning in xmlGetNodePath(). Mon Jun 12 12:54:25 CEST 2006 Kasimier Buchcik * tree.c: Fixed xmlGetNodePath() to generate the node test "*" for elements in the default namespace, rather than generating an unprefixed named node test and loosing the namespace information. Fri Jun 9 21:45:02 CEST 2006 Kasimier Buchcik * include/libxml/parser.h: Clarified in the docs that the tree must not be tried to be modified if using the parser flag XML_PARSE_COMPACT as suggested by Stefan Behnel (#344390). Tue Jun 6 17:50:43 CEST 2006 Daniel Veillard * configure.ini NEWS doc//* libxml.spec.in : preparing release of 2.6.26 Tue Jun 6 17:25:23 CEST 2006 Kasimier Buchcik * xpath.c: Fixed self-invented a segfault in xmlXPathCtxtCompile(), when the expression was not valid and @comp was NULL and I tried to do the d-o-s rewrite. Tue Jun 6 15:19:57 CEST 2006 Daniel Veillard * configure.ini NEWS doc//* libxml.spec.in : preparing release of 2.6.25 Tue Jun 6 11:28:15 CEST 2006 Kasimier Buchcik * xpath.c: Enabled the compound traversal again; I added a check to use this only if the have an expression starting with the document node; so in the case of "//foo", we already know at compilation-time, that there will be only 1 initial context node. Added the rewrite also to xmlXPathEvalExpr(). Tue Jun 6 10:23:10 CEST 2006 Daniel Veillard * xinclude.c: fix bug #343968, include='text' can't lead to a recursion. Fri Jun 2 22:47:08 CEST 2006 Kasimier Buchcik * xpath.c: Disabled the compound traversal for the release; I need first to assure that this is done only if we have 1 initial node. Wed May 31 13:53:41 PST 2006 Aleksey Sanin * xpath.c: fixed memory leak in xpath error reporting Wed May 31 15:30:16 CEST 2006 Daniel Veillard * libxml.h triodef.h: applied patch from Olli Savia for LynxOS Wed May 31 14:33:00 CEST 2006 Kasimier Buchcik * xpath.c include/libxml/xpath.h runsuite.c: Changed the name of the recently added public function xmlXPathContextSetObjectCache() to xmlXPathContextSetCache(); so a more generic one, in case we decide to cache more things than only XPath objects. Tue May 30 21:36:16 CEST 2006 Kasimier Buchcik * xpath.c: Optimized xmlXPathNodeCollectAndTest() and xmlXPathNodeCollectAndTestNth() to evaluate a compound traversal of 2 axes when we have a "//foo" expression. This is done with a rewrite of the XPath AST in xmlXPathRewriteDOSExpression(); I added an additional field to xmlXPathStepOp for this (but the field's name should be changed). The mechanism: the embracing descendant-or-self axis traversal (also optimized to return only nodes which can hold elements), will produce context nodes for the inner traversal of the child axis. This way we avoid a full node-collecting traversal of the descendant-or-self axis. Some tests indicate that this can reduce execution time of "//foo" to 50%. Together with the XPath object cache this all significantly speeds up libxslt. Tue May 30 11:38:47 CEST 2006 Kasimier Buchcik * xmlschemas.c: A warning will now be reported in the value of the XSD attribute 'schemaLocation' does not consist of tuples (namespace-name, document-URI). A warning will be reported if a schema document could not be found at the specified location (via 'schemaLocation' or 'noNamespaceSchemaLocation'). * include/libxml/xmlerror.h: Added XML_SCHEMAV_MISC to xmlParserErrors. Tue May 30 11:21:34 CEST 2006 Kasimier Buchcik * xpath.c: Enhanced xmlXPathNodeCollectAndTest() to avoid recreation (if possible) of the node-set which is used to collect the nodes in the current axis for the currect context node. Especially for "//foo" this will decrease dramatically the number of created node-sets, since for each node in the result node-set of the evaluation of descendant-or-self::node() a new temporary node-set was created. Added node iterator xmlXPathNextChildElement() as a tiny optimization for child::foo. Mon May 29 18:06:17 CEST 2006 Kasimier Buchcik * xpath.c include/libxml/xpath.h: Added an XPath object cache. It sits on an xmlXPathContext and need to be explicitely activated (or deactivated again) with xmlXPathContextSetObjectCache(). The cache consists of 5 lists for node-set, string, number, boolean and misc XPath objects. Internally the xpath.c module will use object- deposition and -acquisition functions which will try to reuse as many XPath objects as possible, and fallback to normal free/create behaviour if no cache is available or if the cache is full. * runsuite.c: Adjusted to deactivate the cache for XML Schema tests if a cache-creation is turned on by default for the whole library, e.g. for testing purposes of the cache. It is deactivated here in order to avoid confusion of the memory leak detection in runsuite.c. Wed May 24 10:54:25 CEST 2006 Kasimier Buchcik * xpath.c: Removed a memcpy if xmlXPathNodeSetMerge(); it seems we really need to walk the whole list, since those nastly namespace nodes need to be added with xmlXPathNodeSetDupNs(); thus a pure memcpy is not possible. A flag on the node-set indicating if namespace nodes are in the set would help here; this is the 3rd flag which would be usefull with node-sets. The current flags I have in mind: 1) Is a node-set already sorted? This would allow for rebust and optimizable sorting behaviour. 2) Of what type are the nodes in the set (or of mixed type)? This would allow for faster merging of node-sets. 3) Are namespace nodes in the set? This would allow to skipp all the namespace node specific special handling. Faster node-set merging if the first set is empty; just memcpy the set. Mon May 22 17:14:00 CEST 2006 Kasimier Buchcik * xpath.c: Optimization of count(): eliminated sorting (see bug #165547). Optimization of XPATH_OP_FILTER if the predicate is a [1] (disable with XP_OPTIMIZED_FILTER_FIRST if it produces trouble). Tiny opt in xmlXPathNodeSetMerge(). Mon May 22 13:33:12 CEST 2006 Rob Richards * tree.c: Revert behavior change in xmlSetProp to handle attributes with colons in name and no namespace. Fri May 19 21:56:43 CEST 2006 Kasimier Buchcik * xpath.c: Substituted all remaining calls to xmlXPathCmpNodes() for xmlXPathCmpNodesExt(). Tiny further enhancement of xmlXPathCmpNodesExt(). Added additional checks in various code parts to avoid calling sorting or merging functions if the node-set(s) don't need them; i.e., if they are empty or contain just one node. Fri May 19 13:16:58 CEST 2006 Kasimier Buchcik * xpath.c: Optimized the comparison for non-element nodes in xmlXPathCmpNodesExt(); the comparison is used for sorting of node-sets. This enhancement is related to bug #165547. There are other places where the old comparison function xmlXPathCmpNodes() is still called, but I currently don't know exactly what those calls are for; thus if they can be substituted (if it makes sense) for the new function. Tue May 16 16:55:13 CEST 2006 Kasimier Buchcik * xpath.c: Applied patch from Rob Richards, fixing a potential memory leak in xmlXPathTryStreamCompile(), when a list of namespaces was assigned to the XPath compilation context; here a new namespace list was created and passed to xmlPatterncompile(); but this list was not freed afterwards. Additionally we avoid now in xmlXPathTryStreamCompile() to compile the expression, if it has a colon - indicating prefixed name tests - and no namespace list was given. The streaming XPath mechanism needs a namespace list at compilation time (unlike normal XPath, where we can bind namespace names to prefixes at execution time). * pattern.c: Enhanced to use a string dict for local-names, ns-prefixes and and namespace-names. Fixed xmlStreamPushInternal() not to use string-pointer comparison if a dict is available; this won't work, since one does not know it the given strings originate from the same dict - and they normally don't do, since e.g. namespaces are hold on xmlNs->href. I think this would be worth an investigation: if we can add a @doc field to xmlNs and put the @href in to a additionan namespace dict hold in xmlDoc. Daniel will surely not like this idea :-) But evaluation of tons of elements/attributes in namespaces with xmlStrEqual() isn't the way we should go forever. Thu May 11 18:03:49 CEST 2006 Kasimier Buchcik * xmlschemas.c: Fixed bug #341337, reported by David Grohmann. The code expected a node (xmlNodePtr) on the info for a non-existent default attribute, which clearly cannot be expected, since the attribute does not exist. I can only guess that this sneaked trying to eliminate the query for the owner-element, which is unavoidable actually. Note that creation of default attributes won't have an effect if validating via SAX/XMLReader; i.e., the processor won't fire additional start-attribute events (I'm not even sure if Libxml2 has such a SAX-event; I think it hands them all over in the start-element event). Tue May 9 21:47:58 CEST 2006 Kasimier Buchcik * xmlschemas.c: Fixed bug #341150, reported by Michael Romer. In xmlSchemaBuildContentModelForSubstGroup(), xmlAutomataNewOnceTrans2() was incorrectly used instead of xmlAutomataNewTransition2() to mimic a xs:choice for substitution-groups. * test/schemas/subst-group-1_1.xsd test/schemas/subst-group-1_0.xml result/schemas/subst-group-1_0_1 result/schemas/subst-group-1_0_1.err: Added regression test supplied by Michael Romer for bug #341150. Sat May 6 11:05:24 HKT 2006 William M. Brack * relaxng.c: Fixed compilation error with patch supplied by Graham Bennett. Thu May 4 19:14:03 CEST 2006 Kasimier Buchcik * xmlschemas.c: We'll raise an internal error and stop validation now when an entity is found in the instance document, since we don't support automatic entity substitution by the schema processor (yet?) - see bug #340316, reported by Nick Wellnhofer. Wed May 3 15:16:00 CEST 2006 Daniel Veillard * configure.in: applied another Python detection patch from Joseph Sacco * libxml.spec.in: cleanup the changelog section, asciifies the spec file too Tue May 2 22:34:54 CEST 2006 Daniel Veillard * xmlIO.c: fix a mix of code and declarations showing up on Windows patch from Kjartan Maraas, fixing #340404 Tue May 2 14:24:40 CEST 2006 Daniel Veillard * encoding.c: fixing bug #340398 xmlCharEncOutFunc writing to input buffer Fri Apr 28 18:29:22 CEST 2006 Daniel Veillard * NEWS configure.in doc//*: preparing 2.6.24 release, fixed Python paths at the last moment * relaxng.c testapi.c tree.c: fix some comments Thu Apr 27 10:15:45 CEST 2006 Daniel Veillard * xmlIO.c: applied patch from Roland Schwingel to allow UTF-8 file paths on Windows Thu Apr 27 10:10:58 CEST 2006 Daniel Veillard * xmlwriter.c: patch from Jason Viers for line breaks after EndPI Tue Apr 25 22:22:58 CEST 2006 Daniel Veillard * tree.c: fix compilation without tree Tue Apr 25 18:17:37 CEST 2006 Daniel Veillard * xmllint.c: applied patch from Gary Coady to really make sure xmllint --nonet would not reach the network, should fix #337483. Tue Apr 25 14:52:15 CEST 2006 Daniel Veillard * configure.in: applied patch from Joseph Sacco changing slightly the python detection scheme should fix bug #338526 Mon Apr 24 10:50:19 CEST 2006 Daniel Veillard * parser.c: fix the error message for invalid code point in content c.f. bug #339311 Wed Apr 19 13:16:23 CEST 2006 Kasimier Buchcik * xmlschemas.c test/schemas/restriction-enum-1* result/schemas/restriction-enum-1*: Fixed incorrect validation of restricted enumerations. Added related regression tests. Thu Apr 13 09:47:25 CEST 2006 Daniel Veillard * xmlschemas.c: fixing a deallocation problem in xmlSchemaAddSchemaDoc() in case of errors, should fix bug #338303 Thu Apr 13 09:31:45 CEST 2006 Daniel Veillard * relaxng.c: fixing a deallocation problem in xmlRelaxNGParse() in case of errors, should fix bug #338306 Thu Apr 6 10:22:17 CEST 2006 Daniel Veillard * doc/xmlcatalog.1 doc/xmlcatalog_man.xml doc/xmllint.1 doc/xmllint.xml: applied man page improvements from Daniel Leidert Mon Mar 27 11:44:07 CEST 2006 Daniel Veillard * xmlschemas.c: removed unused code or variables, from Stefan Kost fixing #336163 and #336164 Mon Mar 27 11:38:21 CEST 2006 Daniel Veillard * xmlschemas.c: applied patch from Stefan Kost fixing #336160 Mon Mar 27 11:23:39 CEST 2006 Daniel Veillard * chvalid.c genChRanges.py genUnicode.py xmlunicode.c include/libxml/chvalid.h include/libxml/xmlunicode.h: applied patches from Aivars Kalvans to make unicode tables const, fixes bug #336096, this also updates to Unicode 4.01 final with a couple of character ranges fixes. Mon Mar 27 00:51:40 CEST 2006 Daniel Veillard * chvalid.c genChRanges.py include/libxml/chvalid.h: fixed bug #335603 and resync'ed genChRanges.py to the expected output. Wed Mar 22 00:14:34 CET 2006 Daniel Veillard * xmlregexp.c: applied patch from Youri Golovanov fixing bug #316338 and adding a couple of optimizations in the regexp compilation engine. * test/regexp/bug316338 result/regexp/bug316338: added regression tests based on the examples provided in the bug report. Fri Mar 10 08:40:55 EST 2006 Daniel Veillard * c14n.c encoding.c xmlschemas.c xpath.c xpointer.c: fix a few warning raised by gcc-4.1 and latests changes Fri Mar 10 01:34:42 CET 2006 Daniel Veillard * runtest.c schematron.c testAutomata.c tree.c valid.c xinclude.c xmlcatalog.c xmlreader.c xmlregexp.c xpath.c: end of first pass on coverity reports. Thu Mar 9 19:36:14 CET 2006 Daniel Veillard * relaxng.c xmlschemas.c xmlschemastypes.c: more cleanups based on coverity reports. Thu Mar 9 17:47:40 CET 2006 Daniel Veillard * SAX2.c catalog.c encoding.c entities.c example/gjobread.c python/libxml.c: more cleanups based on coverity reports. Thu Mar 9 15:12:19 CET 2006 Daniel Veillard * HTMLparser.c parser.c parserInternals.c pattern.c uri.c: a bunch of small cleanups based on coverity reports. Thu Mar 9 09:42:10 CET 2006 Daniel Veillard * win32/Makefile.bcb: added schematron as pointed out by Eric Zurcher Tue Mar 7 09:50:09 CET 2006 Daniel Veillard * xml2-config.in: fix Red Hat bug #184170 Mon Mar 6 14:21:08 CET 2006 Kasimier Buchcik * tree.c: Simplified usage of the internal xmlNsMap. Added a "strict" lookup for namespaces based on a prefix. Fixed a namespace processing issue in the clone-node function, which occured if a @ctxt argument was given. Fri Mar 3 17:44:10 CET 2006 Rob Richards * valid.c: fix HTML attribute ID checking for input element. Maintain current attribute "name" behavior for now. Thu Mar 2 18:59:50 CET 2006 Kasimier Buchcik * tree.c: Bundled lookup of attr-nodes and retrieving their values into the functions xmlGetPropNodeInternal() and xmlGetPropNodeValueInternal(). Changed relevant code to use those functions. Mon Feb 27 20:42:04 CET 2006 Daniel Veillard * xpath.c: workaround HP-UX compiler bug by Rick Jones Mon Feb 27 10:57:05 CET 2006 Daniel Veillard * python/libxml2.py: remove a tab, as pointed out on IRC Sat Feb 25 18:12:10 CET 2006 Rob Richards * tree.c: Fix the add sibling functions when passing attributes. Modify testing for ID in xmlSetProp. No longer remove IDness when unlinking or replacing an attribute. Fri Feb 24 21:20:33 CET 2006 Daniel Veillard * catalog.c: Martin Cole pointed out a bug in xmlCatalogAdd() if /etc/xml/catalog doesn't exist. Thu Feb 23 23:06:18 CET 2006 Daniel Veillard * doc//*: updated the Ruby bindings links, and regenerated the docs. Thu Feb 23 09:12:27 CET 2006 Daniel Veillard * catalog.c: improve catalog debugging message patch from Rick Jones Wed Feb 22 16:09:10 CET 2006 Daniel Veillard * python/types.c: Nic Ferrier found debug statement left in the XPath conversion code Tue Feb 21 20:23:14 CET 2006 Daniel Veillard * doc/xmllint.1 doc/xmllint.xml: small man page improvements from Daniel Leidert Mon Feb 20 15:45:19 CET 2006 Kasimier Buchcik * xmlschemas.c: Fixed a side-effect of the previous XSI bugfix: The constructor needs a bucket to be assigned during component fixup. Mon Feb 20 14:32:36 CET 2006 Kasimier Buchcik * xmlschemas.c xmlschemastypes.c: Fixed xs:boolean to reject the empty string (reported by Bas Driessen on the mailing-list). Fixed schema XSI-acquisition and construction: the schemata (xmlSchema) didn't get the targetNamespace in some cases, thus the component resolution mechanism failed to work. The XSI stuff needs to be tested more intensively; think about how to test this for regression. Mon Feb 20 09:57:41 CET 2006 Daniel Veillard * doc/xmllint.1 doc/xmllint.xml: more man page improvements from Daniel Leidert Sun Feb 19 22:31:33 CET 2006 Daniel Veillard * doc/xmllint.1 doc/xmllint.xml: man page improvements from Daniel Leidert, c.f. #331290 Sun Feb 19 17:54:04 CET 2006 Daniel Veillard * xmllint.c: fix an error report when using --path and --valid closes bug #331290 Sun Feb 19 16:20:43 CET 2006 Daniel Veillard * relaxng.c: trying to fix #331062, this is again a problem around interleave, there is no good fix unless reimplementing but this works around some cases and allow to validate in that case. Wed Feb 15 11:55:22 CET 2006 Kasimier Buchcik * tree.c: Fixed bug #328896 reported by Liron. The path for text- and CDATA-section-nodes was computed incorrectly in xmlGetNodePath(). Sun Feb 12 20:12:22 CET 2006 Daniel Veillard * xmlregexp.c: bug fixes for #327167 as well as some cleanups and more thorough tests on atoms comparisons. Thu Feb 9 10:07:20 CET 2006 Daniel Veillard * include/wsockcompat.h: patch from Eric Zurcher to compile with Borland C++ 6 Sun Feb 5 04:03:59 CET 2006 Daniel Veillard * parser.c: bill pointed out a missing block in xmlParseComment trying to fill with a normal processing of the given character. Sun Feb 5 03:41:39 CET 2006 Daniel Veillard * parser.c: fixed the comment streaming bug raised by Graham Bennett * test/badcomment.xml result//badcomment.xml*: added to the regression suite. Fri Feb 3 17:36:41 CET 2006 Kasimier Buchcik * include/libxml/tree.h: Added the xmlDOMWrapCloneNode() to the header file. Fri Feb 3 17:29:22 CET 2006 Kasimier Buchcik * tree.c: Added an initial version of xmlDOMWrapCloneNode() to the API. It will be used to reflect DOM's Node.cloneNode and Document.importNode methods. The pros: 1) non-recursive, 2) optimized ns-lookup (mostly pointer comparison), 3) user defined ns-lookup, 4) save ns-processing. The function is in an unfinished and experimental state and should be only used to test it. Fri Feb 3 10:42:48 CET 2006 Daniel Veillard * uri.c: applied patch from Rob Richards fixing the URI regressions tests on Windows which seems to indicate bad escaping. Thu Feb 2 13:11:26 CET 2006 Kasimier Buchcik * tree.c: Fixed some bugs xmlDOMWrapReconcileNamespaces() wrt the previous addition of the removal of redundant ns-decls. Wed Feb 1 17:32:25 CET 2006 Kasimier Buchcik * tree.c: Enhanced xmlDOMWrapReconcileNamespaces() to remove redundant ns-decls if the option XML_DOM_RECONNS_REMOVEREDUND was given. Note that I haven't moved this option to the header file yet; so just call this function with an @option of 1 to test the behaviour. Wed Feb 1 12:21:08 CET 2006 Kasimier Buchcik * tapi.c win32/Makefile.*: Added changed as proposed on the mailing list by venkat naidu in order to compile testapi.c on windows. Thu Jan 19 09:57:28 CET 2006 Daniel Veillard * configure.in xml2-config.in: trying to fix windows/configure issues reported by Tim Van Holder Wed Jan 18 18:21:15 CET 2006 Daniel Veillard * HTMLparser.c libxml.h parser.c: try to fix xmlParseInNodeContext when operating on an HTML document. Mon Jan 9 17:27:15 CET 2006 Kasimier Buchcik * relaxng.c include/libxml/relaxng.h: Added xmlRelaxNGSetParserStructuredErrors() to the API. Mon Jan 9 15:33:16 CET 2006 Daniel Veillard * parser.c: reverted first patches for #319279 which led to #326295 and fixed the problem in xmlParseChunk() instead * test/ent11 result//ent11*: added test for #326295 to the regression suite Thu Jan 5 16:25:06 CET 2006 Daniel Veillard * NEWS configure.in libxml.spec.in testapi.c doc/*: upated the news regenerated the docs, preparing for release of 2.6.23 * pattern.c xmlschemas.c: fixed some comments Thu Jan 5 15:48:27 CET 2006 Kasimier Buchcik * test/XPath/docs/nodes test/XPath/tests/nodespat result/XPath/tests/nodespat: Added regression tests for the latest XPath/pattern fixes. Thu Jan 5 15:43:38 CET 2006 Kasimier Buchcik * pattern.c: Another fix to handle "foo//.": "foo" was not included in the resulting node-set. Thu Jan 5 13:22:29 CET 2006 Kasimier Buchcik * pattern.c xpath.c include/libxml/pattern.h: Fixed bug #322928, reported by Erich Schubert: The bug was in pattern.c, which is used for a tiny subset of xpath expression which can be evaluated in an optimized way. The doc-node was never considered when evaluating "//" expressions. Additionally, we fixed resolution to nodes of any type in pattern.c; i.e. a "//." didn't work yet, as it did select only element-nodes. Due to this issue the pushing of nodes in xpath.c needed to be adjusted as well. Wed Jan 4 18:07:47 CET 2006 Daniel Veillard * parser.c: tiny refactoring patch from Bjorn Reese Wed Jan 4 15:00:51 CET 2006 Daniel Veillard * SAX2.c: fix bug #324432 with * test/ns7 resul//ns7*: added to the regression tests Wed Jan 4 10:53:56 CET 2006 Daniel Veillard * include/wsockcompat.h: applied patch from Mark Junker, fixing a MinGW compilation problem, should close bug #324943 Tue Jan 3 11:49:54 CET 2006 Kasimier Buchcik * xmlschemas.c: Removed last dependency on the obsolete enum xmlSchemaValidError. Mon Jan 2 11:20:00 CET 2006 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h xmlschemas.c: compilation and doc build fixes from Michael Day Wed Dec 28 22:12:34 CET 2005 Daniel Veillard * xmlregexp.c: bug in xmlRegExecPushString2() pointed out by Sreeni Nair. Tue Dec 20 16:55:31 CET 2005 Rob Richards * tree.c: fix bug #322136 in xmlNodeBufGetContent when entity ref is a child of an element (fix by Oleksandr Kononenko). * HTMLtree.c include/libxml/HTMLtree.h: Add htmlDocDumpMemoryFormat. Tue Dec 20 11:43:06 CET 2005 Kasimier Buchcik * xmlschemas.c xmlstring.c: Fixed a segfault during text concatenation when validating a node tree: xmlStrncat was called with a @len of -1; but unlike xmlStrncatNew, it does not calculate the length automatically in such a case (reported by Judy Hay on the mailing list). Updated the descriptions of the involved string functions to note this. Thu Dec 15 12:11:07 CET 2005 Daniel Veillard * nanohttp.c: applied patch from Gary Coady to accept gzipped http resources. Wed Dec 14 18:41:26 CET 2005 Kasimier Buchcik * win32/configure.js: Added enable/disable of runtime debugging (LIBXML_DEBUG_RUNTIME). Wed Dec 14 18:11:50 CET 2005 Kasimier Buchcik * include/libxml/xmlversion.h.in: Fixed to define LIBXML_DEBUG_RUNTIME on the basis of @WITH_RUN_DEBUG@. Tue Dec 13 12:49:23 CET 2005 Kasimier Buchcik * test/schemas/bug321475* result/schemas/bug321475*: Added regression test for bug #321475 (reported by Gabor Nagy). Fixing of bug #323510 seemed to have fixed this bug as well. Mon Dec 12 16:19:16 CET 2005 Kasimier Buchcik * test/schemas/bug323510* result/schemas/bug323510*: Added regression test for bug #323510. Mon Dec 12 16:11:13 CET 2005 Kasimier Buchcik * xmlschemas.c: Workaround for bug #323510 (reported by Jonathan Filiatrault): substituted the epsilon transition for a labelled transition, in order to avoid a bug in xmlregexp.c which eliminated the epsilon transition and marked the initial state as final. Mon Dec 12 14:25:46 CET 2005 Daniel Veillard * xmlreader.c: Gary Coady pointed a memory leak in xmlTextReaderReadInnerXml() applied patch fixing #323864 Sat Dec 10 12:08:28 CET 2005 Daniel Veillard * HTMLparser.c configure.in parserInternals.c runsuite.c runtest.c testapi.c xmlschemas.c xmlschemastypes.c xmlstring.c: fixed a number of warnings shown by HP-UX compiler and reported by Rick Jones Fri Dec 9 18:57:31 CET 2005 Rob Richards * xmlwriter.c: Insert space between pubid and sysid when both passed to xmlTextWriterStartDTD and indenting not being used. Remove no longer used Mem callbacks. Fri Dec 9 11:01:16 CET 2005 Kasimier Buchcik * runsuite.c: Changed to instantly mark instance-tests as failed if the corresponding schema was invalid. This reflects the side of the Python code for the XML Schema test suite. We now get the same number of failed tests on both sides. Wed Dec 7 14:59:01 CET 2005 Kasimier Buchcik * xmlreader.c include/libxml/xmlreader.h: Added xmlTextReaderSchemaValidateCtxt() to the API. Wed Dec 7 12:59:56 CET 2005 Kasimier Buchcik * xmlschemas.c: Fixed a segfault: the instance document was still tried to be validated, if the schema, dynamically acquired using XSI was invalid, thus mangled. The validation will stop (or rather won't validate) now in such a case. The schema parser error code will be set on the validion context now; this is somehow not nice, but it assures that the validation context indicates an error in there was a parser error. Tue Dec 6 18:57:23 CET 2005 Daniel Veillard * xmlreader.c: small doc patch from Aron Stansvik * legacy.c: another doc patch for a deprecated API Mon Dec 5 16:23:49 CET 2005 Kasimier Buchcik * Makefile.am: Tiny change for 'make tests': raised the number of expected failures for James Clark's XML Schema datatype tests from 10 to 11. The additional reported error was agreed to be correct long time ago, but we missed to adjust the message reported by the testing script. Fri Dec 2 13:51:14 CET 2005 Kasimier Buchcik * result/schemas/decimal* result/schemas/bug322411*: Added missing regression test results for the latest IDC and xs:decimal bugs. Wed Nov 30 12:22:23 CET 2005 Kasimier Buchcik * test/schemas/decimal* test/schemas/bug322411*: Added regression tests for the latest IDC and xs:decimal bugs. Wed Nov 30 11:57:35 CET 2005 Kasimier Buchcik * xmlschemas.c: Fixed bubbling of duplicate IDC nodes: the parent's list of duplicates was filled with NULLs instead of the nodes under certain conditions. This lead to a segfault when the list's entries were accessed. Mon Nov 28 17:28:53 CET 2005 Kasimier Buchcik * xmlschemastypes.c: Fixed parsing of xs:decimal to allow/deny special lexical forms. Fixed the totalDigits for values in the range (x < 1) && (x > -1) && (x != 0); E.g "0.123" has now a totalDigits of 3 (was 4 previously). Adjusted the comparison function for decimals due to this change. As a side effect comparison against zeroes was optimized. Mon Nov 28 13:25:11 CET 2005 Kasimier Buchcik * xmlschemas.c: An assignment to a local variable, which was used to access the IDC node list, was missing after the reallocation of the list (reported by Fabrice GUY bug #322411). Renamed the define ENABLE_IDC_NODE_TABLES to ENABLE_IDC_NODE_TABLES_TEST and *disabled* it, since it is used to force bubbling of IDC node tables even if not necessary; this was intended to be used for test purposes, but I obviously missed to disable it (although it apparently helped finding the bug). Wed Nov 23 17:34:52 CET 2005 Kasimier Buchcik * xmlschemas.c: In xmlSchemaAssembleByXSI() the return value of xmlSchemaGetMetaAttrInfo() was not assigned to anything; this caused XSI-driven-dynamic schema acquisition to fail with @noNamespaceSchemaLocation (reported by Julien Lamy on the mailing list). Tue Nov 22 18:31:34 CET 2005 Kasimier Buchcik * xmlschemas.c: Fixed a bug in xmlSchemaFindRedefCompInGraph() which caused the search for components to stop at the first encountered attribute group component. Fixed error report in xmlSchemaCheckSRCRedefineFirst(): the designation of a not-found component was not reported. Mon Nov 21 12:23:28 CET 2005 Daniel Veillard * xmlschemastypes.c: Albert Chin found another signed/unsigned problem in the date and time code raised on IRIX 6.5 Fri Nov 18 18:13:38 CET 2005 Kasimier Buchcik * xmlschemas.c include/libxml/xmlschemas.h: Added xmlSchemaSetParserStructuredErrors() to the API. Fixed channeling of error relevant information to subsequent parser/validation contexts. Thu Nov 17 14:11:43 CET 2005 Daniel Veillard * parserInternals.c: removed unreachable code pointed out by Oleksandr Kononenko, fixes bug #321695 Thu Nov 17 08:24:31 CET 2005 Daniel Veillard * parser.c: use ctxt->standalone = -2 to indicate that the XMLDecl was parsed but no standalone attribute was found, suggested by Michael Day to detect if an XMLDecl was found. Tue Nov 15 09:49:24 CET 2005 Daniel Veillard * runtest.c: Hisashi Fujinaka pointed that errors in Schemas tests were not properly reported. Sun Nov 13 13:42:41 CET 2005 Daniel Veillard * xmlIO.c: applied patch from Geert Jansen to remove xmlBufferClose() which is not needed. Fri Nov 11 13:48:52 CET 2005 Kasimier Buchcik * xmlschemas.c: Changed xmlSchemaFormatIDCKeySequence() to use xmlSchemaGetCanonValueWhtspExt() in order to correctly report values for xs:anySimpleType. * test/schemas/idc-keyref-err1* result/schemas/idc-keyref-err1*: Added a test for this change. Wed Nov 9 13:07:24 EST 2005 Rob Richards * xmlIO.c xmlwriter.c: function consolidation when writing to xmlBuffer. Return error condition not len if xmlwriter fails writing to buffer. Wed Nov 9 09:54:54 CET 2005 Daniel Veillard * xmlsave.c xmlIO.c include/libxml/xmlIO.h include/libxml/xmlsave.h: applied patch from Geert Jansen to implement the save function to a xmlBuffer, and a bit of cleanup. Mon Nov 7 14:58:39 CET 2005 Kasimier Buchcik * xmlschemas.c xmlschemastypes.c: Fixed the type of the totalDigits value to be positiveInteger. Fixed crash in an error report function when we gave it the document node; only element and attribute nodes are processed now (reported by Rob Richards). Tue Nov 1 16:22:29 CET 2005 Daniel Veillard * xmlregexp.c: fix bug #319897, problem with counted atoms when the transition itself is counted too * result/regexp/hard test/regexp/hard: augmented the regression tests with the problem exposed. Tue Nov 1 11:54:39 CET 2005 Daniel Veillard * win32/Makefile.mingw include/win32config.h: applied patch from Mark Junker to fix compilation with MinGW Fri Oct 28 18:36:08 CEST 2005 Daniel Veillard * libxml.3: tiny fix from Albert Chin * runsuite.c runtest.c testapi.c: portability cleanup for arch needing trio for *printf Fri Oct 28 12:21:39 EDT 2005 Rob Richards * tree.c: add additional checks to prevent tree corruption. fix problem copying attribute using xmlDocCopyNode from one document to another. Fri Oct 28 17:58:13 CEST 2005 Daniel Veillard * config.h.in configure.in vms/config.vms macos/src/config-mac.h: cleanup from Albert Chin * doc/Makefile.am: html/index.sgml doesn't exist anymore Fri Oct 28 16:53:51 CEST 2005 Daniel Veillard * xmlIO.c xmlmodule.c: more portability patches from Albert Chin for HP-UX and AIX Fri Oct 28 10:36:10 CEST 2005 Daniel Veillard * xmlmodule.c configure.in: applied 2 patches from Albert Chin for module portability Fri Oct 28 10:24:39 CEST 2005 Daniel Veillard * error.c: fixing a portability problem on some old Unices with patch from Albert Chin 2005-10-27 Aleksey Sanin * c14n.c result/c14n/exc-without-comments/test-2 test/c14n/exc-without-comments/test-2.xml test/c14n/exc-without-comments/test-2.xpath: fixing bug in exc-c14n namespace visibility + test case (bug #319367) Thu Oct 27 16:10:31 CEST 2005 Daniel Veillard * python/libxml.py: remove warnings to stdout patch from Nic Ferrier Thu Oct 27 13:54:52 CEST 2005 Daniel Veillard * valid.c xmlregexp.c include/libxml/valid.h include/libxml/xmlregexp.h: avoid function parameters names 'list' as this seems to give troubles with VC6 and stl as reported by Samuel Diaz Garcia. Wed Oct 26 10:59:21 CEST 2005 Daniel Veillard * parserInternals.c: fix a problem in some error case on Solaris when passed a NULL filename, pointed by Albert Chin. Tue Oct 25 14:34:58 CEST 2005 Daniel Veillard * HTMLparser.c: script HTML parser error fix, corrects bug #319715 * result/HTML/53867* test/HTML/53867.html: added test from Michael Day to the regression suite Tue Oct 25 14:21:11 CEST 2005 Daniel Veillard * HTMLparser.c: typo fix from Michael Day Mon Oct 24 20:16:23 EDT 2005 Rob Richards * tree.c: fix issue adding non-namespaced attributes in xmlAddChild(), xmlAddNextSibling() and xmlAddPrevSibling() (bug #319108) - part 1. Sat Oct 22 10:00:41 HKT 2005 William Brack * parser.c: fixed second spot where CRLF split between chunks could cause trouble (bug #319279) * gentest.py, testapi.c: fixed two problems involved with --with-minimum compilation (compilation errors with schematron and formal expressions tests) Fri Oct 21 10:50:14 EDT 2005 Rob Richards * xmlsave.c: prevent output of fragment tags when serializing XHTML. Wed Oct 19 16:53:47 BST 2005 Daniel Veillard * xmlregexp.c: commiting a some fixes and debug done yesterday in the London airport. Thu Oct 20 12:54:23 CEST 2005 Kasimier Buchcik * xmlschemas.c: Removed creation of a temporary parser context during validation when processing xsi:type; this previously added a string to the dict of the schema - to assure thread safety, we don't want to modify a given schema during validation. Thu Oct 20 17:05:29 HKT 2005 William Brack * xmlwriter.c: fixed problem in xmlTextWriterVSprintf caused by misuse of vsnprintf * configure.in, config.h.in: added a configuration check for va_copy and added a define for VA_COPY for xmlwriter.c fix * parser.c: fixed problem with CRLF split between chunks (bug #319279) (fix provided by Brion Vibber) Wed Oct 19 18:49:52 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed a potential memory leak in xmlSchemaCheckCSelectorXPath() when an internal error occurs. Fixed setting of ctxt->err to the given error code in the parsing error functions. * pattern.c: Added internal xmlCompileIDCXPathPath() as a starting point for IDC XPath compilation; this and some other tiny changes fixes issues regarding whitespace in the expressions and IDC selector/field relevant restrictions of the subset of XPath. Fixed a missing blocking of attributes in xmlStreamPushInternal(). Mon Oct 17 15:06:05 EDT 2005 Daniel Veillard * runtest.c: removed the error message * relaxng.c xmlschemas.c: removed 2 instability warnings from function documentation * include/libxml/schemasInternals.h: changed warning about API stability * xmlregexp.c: trying to improve runtime execution of non-deterministic regexps and automata. Not fully finished but should be way better. Mon Oct 17 16:12:02 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed a memory leak in xmlSchemaContentModelDump(). Added output of local types in xmlSchemaElementDump(). Tiny cosmetical changes to the dump output. Mon Oct 17 14:29:08 CEST 2005 Kasimier Buchcik * tree.c pattern.c: Silenced intel compiler warnings (reported by Kjartan Maraas, bug #318517). * xmlschemas.c: The above changes in pattern.c revealed an inconsistency wrt IDCs: we now _only_ pop XPath states, if we really pushed them beforehand; this was previously not checked for the case when we discover an element node to be invalid wrt the content model. Fixed segfault in xmlSchemaGetEffectiveValueConstraint(). Fri Oct 14 16:40:18 CEST 2005 Kasimier Buchcik * result/schemas/*.err: Adapted regression test results. Fri Oct 14 16:21:22 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed some identity-constraint issues: Restructured IDC node-tables Allowed IDCs to resolve also to nodes of complex type with simple content. Added check for keyrefs with references to keyrefs. IDC target-nodes were interferring with IDC node-tables, since they used one list of entries only. I separated this one big list into 3 lists: 1 for IDC node-table entries, 1 for _duplicates_ of IDC node-table entries and 1 for IDC target-nodes. More code, but cleaner and it works at last. Keyrefs will fail to resolve to duplicate key/unique entries. I thought this was already working this way, but it didn't. The wording of the definition for [node table] in the spec can lead to a scenario, where keyrefs resolve perfectly, even if the relevant key-sequences of the referenced key/unique have duplicates in the subtree. Currently only Saxon 8.5.1 is dissallowing resolution to duplicate entries correctly - we will follow Saxon here. Removed some intel compiler warnings (reported by Kjartan Maraas, bug #318517). * pattern.c: Fixed an IDC-XPath problem when resolving to attributes. Mon Oct 14 01:15:14 CEST 2005 Rob Richards * nanohttp.c include/wsockcompat.h: applied patch from Kolja Nowak to use getaddrinfo() if supported in Windows build (bug# 317431). Mon Oct 10 15:33:48 CEST 2005 Kasimier Buchcik * result/schemas/*: Adapted regression test results. Mon Oct 10 15:12:43 CEST 2005 Kasimier Buchcik * xmlschemas.c include/libxml/schemasInternals.h include/libxml/xmlerror.h: Initial implementation for redefinitions; this still misses checks for restrictions of the content model of complex types. Fixed default/fixed values for attributes (looks like they did not work in the last releases). Completed constraints for attribute uses. Seperated attribute derivation from attribute constraints. Completed constraints for attribute group definitions. Disallowing s of schemas in no target namespace if the importing schema is a chameleon schema. This contradicts the way Saxon, Xerces-J, XSV and IBM's SQC works, but the W3C XML Schema WG, thinks it is correct to dissalow such imports. Added cos-all-limited constraints. Restructured reference resolution to model groups and element declarations. Misc cleanup. Fri Oct 7 04:34:12 CEST 2005 Rob Richards * schematron.c xmlregexp.c: remove warnings under Windows. Wed Sep 28 23:42:14 CEST 2005 Daniel Veillard * parser.c: applied patch from Massimo Morara fixing bug #317447 about risk of invalid write in xmlStringLenDecodeEntities Tue Sep 27 11:20:57 CEST 2005 Daniel Veillard * error.c: Adrian Mouat pointed out redundancies in xmlReportError() Mon Sep 26 19:18:24 CEST 2005 Daniel Veillard * xmlregexp.c: seems a test to avoid duplicate transition is really needed at all times. Luka Por gave an example hitting this. Changed back the internal API. Thu Sep 22 13:14:07 CEST 2005 Daniel Veillard * xmlreader.c: fixing leak in xmlTextReaderReadString() #316924 Thu Sep 15 16:12:44 CEST 2005 Daniel Veillard * uri.c: more fixes to the behaviour of xmlBuildRelativeURI Thu Sep 15 15:08:21 CEST 2005 Daniel Veillard * xmlregexp.c: detect combinatory explosion and return with a runtime error in those case, c.f. #316338 though maybe we should not see such an explosion with that specific regexp, more checking needs to be done. Wed Sep 14 19:52:18 CEST 2005 Kasimier Buchcik * include/libxml/schemasInternals.h: Added some comments for the struct fields. Wed Sep 14 13:24:27 HKT 2005 William Brack * uri.c: fixed problem when xmlBuildRelativeURI was given a blank path (bug 316224) Mon Sep 12 23:41:40 CEST 2005 Daniel Veillard * NEWS configure.in doc//*: release of 2.6.22 updated doc and rebuild. * xmlsave.c include/libxml/xmlsave.h: added XML_SAVE_NO_XHTML xmlSaveOption * xmlschemas.c: minor cleanups Mon Sep 12 21:42:47 CEST 2005 Kasimier Buchcik * test/schemas/import1_0.xsd: And adapting another one. Mon Sep 12 21:29:35 CEST 2005 Kasimier Buchcik * result/schemas/derivation-ok-extension_0_0: Adapted result. Mon Sep 12 21:20:41 CEST 2005 Kasimier Buchcik * result/schemas/allsg_0_3.err result/schemas/allsg_0_4.err result/schemas/changelog093_1_0.err result/schemas/derivation-ok-extension_0_0.err result/schemas/import1_0_0.err result/schemas/derivation-ok-restriction-2-1-1_0_0.err: Adapted regression results. Mon Sep 12 21:00:53 CEST 2005 Kasimier Buchcik * xmlschemas.c include/libxml/schemasInternals.h include/libxml/xmlerror.h: Completion of the schema graph. Centralisation, more robustness of the schema document aquisition story. Centralised and restructured component fixup. Fixed attribute derivation when 'prohibiting' attribute uses. Added warnings: when schema documents cannot be localized during imports; when we get duplicate and pointless attribute prohibitions. Changed error reports for IDCs to report the relevant IDC designation as well (requested by GUY Fabrice). Misc code-cleanup. Mon Sep 12 16:02:12 CEST 2005 Daniel Veillard * xmlsave.c: applied second patch from David Madore to be less intrusive when handling scripts and style elements in XHTML1 should fix #316041 * test/xhtml1 result//xhtml1\*: updated the test accordingly Mon Sep 12 15:09:09 CEST 2005 Daniel Veillard * libxml.spec.in doc/devhelp/*: finished the integration with devhelp, completing the index and inserted into the gtk-doc database at "make install" stage Mon Sep 12 14:14:12 CEST 2005 Rob Richards * include/libxml/xmlsave.h xmlsave.c: add XML_SAVE_NO_EMPTY save option and use option from xmlSaveCtxtPtr rather than global during output. * xmlsave.c: fix some output formatting for meta element under XHTML. Mon Sep 12 11:12:03 CEST 2005 Daniel Veillard * include/libxml/parser.h parser.c xmllint.c: damn XML_FEATURE_UNICODE clashes with Expat headers rename to XML_WITH_ to fix bug #316053. * doc/Makefile.am: build devhelp before the examples. * doc/*: regenerated the API Mon Sep 12 02:03:12 CEST 2005 Daniel Veillard * xmlsave.c: fix bug #316034, where xmlElemDump() can crash if given a document pointer instead of an element Mon Sep 12 01:26:16 CEST 2005 Daniel Veillard * doc/devhelp/devhelp.xsl: improvements on the html generation, should be complete with navigation, what is left done is glueing Mon Sep 12 00:03:27 CEST 2005 Daniel Veillard * configure.in doc/Makefile.am doc/apibuild.py doc/libxml2-api.xml doc/devhelp/*: started work needed to generate devhelp content, not too hard based on the existing format and extractor. Fri Sep 9 12:56:19 CEST 2005 Daniel Veillard * parser.c: fixes bug #315617 when using push CDATA in some cases. Thu Sep 8 23:39:41 CEST 2005 Daniel Veillard * xmllint.c: patch from Stéphane Bidoul to compile without schematron Wed Sep 7 00:16:27 CEST 2005 Daniel Veillard * debugXML.c: patch from Oleg Paraschenko to fix xmlDebugDumpNode() when handled a namespace node. Sun Sep 4 23:36:45 CEST 2005 Daniel Veillard * NEWS elfgcchack.h testapi.c doc/*: updated the docs and rebuild releasing 2.6.21 * include/libxml/threads.h threads.c: removed xmlIsThreadsEnabled() * threads.c include/libxml/threads.h xmllint.c: added the more generic xmlHasFeature() as suggested by Bjorn Reese, xmllint uses it. Sun Sep 4 22:45:49 CEST 2005 Daniel Veillard * configure.in doc/* configure.in: prepare for release * xpath.c: work for #303289, fix a formatting bug for MIN_INT Sun Sep 4 15:48:57 CEST 2005 Daniel Veillard * relaxng.c: real fix for #314881 and #314759 is was a bit more complex than initially expected as ctxt->error == NULL had behaviour side effects at the compilation level itself. Sun Sep 4 14:01:00 CEST 2005 Daniel Veillard * pattern.c xpath.c include/libxml/pattern.h: fixing yet another pattern induced XPath bug #314282 * relaxng.c: reverted back last change it was seriously broken Sat Sep 3 16:51:55 CEST 2005 Rob Richards * xmlsave.c: check for NULL to prevent crash with meta elements Sat Sep 3 16:26:55 CEST 2005 Daniel Veillard * relaxng.c: structured error reporting problem with Relax-NG should fix #314881 and #314759 Sat Sep 3 15:42:29 CEST 2005 Daniel Veillard * pattern.c: fixes a portability problem raised by C370 on Z/OS Sat Sep 3 15:26:31 CEST 2005 Daniel Veillard * SAX2.c tree.c valid.c: fixing a number of issues raised by xml:id but more generally related to attributes and ID handling, fixes #314358 among other things Fri Sep 2 14:26:43 CEST 2005 Daniel Veillard * encoding.c parserInternals.c: avoid passing a char[] as snprintf first argument. * threads.c include/libxml/threads.h: implemented xmlIsThreadsEnabled() based on Andrew W. Nosenko idea. * doc/* elfgcchack.h: regenerated the API Thu Sep 1 14:44:42 CEST 2005 Daniel Veillard * configure.in: the use of AM_PATH_PYTHON is not portable enough reverting back to AM_PATH_PROG Thu Sep 1 11:42:39 CEST 2005 Daniel Veillard * HTMLparser.c: Applied the last patch from Gary Coady for #304637 changing the behaviour when text nodes are found in body * result/HTML/*: this changes the output of some tests Thu Sep 1 11:22:37 CEST 2005 Daniel Veillard * doc/downloads.html doc/xml.html: adding reference to Bull AIX rpms c.f. #160598 Wed Aug 31 11:39:02 CEST 2005 Daniel Veillard * xml2-config.in: removed the obsolete --libtool-libs option, c.f. bug #314853 Fri Aug 26 17:33:26 CEST 2005 Rob Richards * xmlsave.c: move handling of meta element for http-equiv in XHTML docs to serialization and no longer modify internal tree. Fri Aug 26 00:51:58 CEST 2005 Daniel Veillard * libxml.spec.in: the profiling usually don't work, disabled * doc/*: rebuilt Thu Aug 25 23:47:55 CEST 2005 Daniel Veillard * configure.in: trying to fix the first part of #310033 by detecting gcc <= 3.2 Thu Aug 25 22:13:37 CEST 2005 Daniel Veillard * error.c: fixed bug #310033, the URI extraction code given a node is a bit twisted and broke in the last months. Thu Aug 25 16:18:15 CEST 2005 Daniel Veillard * debugXML.c result/XPath/xptr/strrange2: uninitialized field and fix on test. Thu Aug 25 16:03:05 CEST 2005 Daniel Veillard * debugXML.c: change verbosity depending on API * result/XPath/tests/* result/XPath/xptr/* result/xmlid/*: get back to previous outputs Thu Aug 25 15:14:56 CEST 2005 Daniel Veillard * HTMLparser.c parser.c SAX2.c debugXML.c tree.c valid.c xmlreader.c xmllint.c include/libxml/HTMLparser.h include/libxml/parser.h: added a parser XML_PARSE_COMPACT option to allocate small text nodes (less than 8 bytes on 32bits, less than 16bytes on 64bits) directly within the node, various changes to cope with this. * result/XPath/tests/* result/XPath/xptr/* result/xmlid/*: this slightly change the output Thu Aug 25 12:16:26 CEST 2005 Daniel Veillard * configure.in: patch from Andrew W. Nosenko, use se $GCC = 'yes' instead of $CC = 'gcc' because GCC may have a different name Thu Aug 25 00:18:20 CEST 2005 Daniel Veillard * configure.in: changes the way the python binary is found, should also fix bug #308004 Wed Aug 24 16:44:41 CEST 2005 Daniel Veillard * parser.c: found another bug while looking at #309616 on missing entities. * result/ent2.sax* result/ent7.sax* result/xml2.sax*: this changed the SAX stream in missing conditions for a few tests Wed Aug 24 16:19:00 CEST 2005 Daniel Veillard * encoding.c: applied the patch suggested #309565 which can avoid looping in error conditions. Wed Aug 24 16:04:17 CEST 2005 Daniel Veillard * SAX2.c tree.c: line numbers are now carried by most nodes, fixing xmlGetLineNo() c.f. bug #309205 Wed Aug 24 14:43:34 CEST 2005 Daniel Veillard * encoding.c error.c include/libxml/xmlerror.h: finally converted the encoding module to the common error reporting mechanism * doc/* doc/html/libxml-xmlerror.html: rebuilt Wed Aug 24 11:35:26 CEST 2005 Daniel Veillard * xpath.c: removed a potentially uninitialized variable error * python/generator.py: fixed a deprecation warning * python/tests/tstLastError.py: silent the damn test when Okay ! Wed Aug 24 00:11:16 CEST 2005 Daniel Veillard * SAX2.c globals.c runtest.c testC14N.c testapi.c tree.c include/libxml/SAX2.h include/libxml/xmlregexp.h: fixed compilation when configured --without-sax1 and other cleanups fixes bug #172683 * doc/* elfgcchack.h: regenerated Tue Aug 23 20:05:05 CEST 2005 Daniel Veillard * parser.c: fixed bug #170489 reported by Jirka Kosek * test/valid/objednavka.xml test/valid/dtds/objednavka.dtd result/valid/objednavka*: added the test to the regression suite. Tue Aug 23 18:04:08 CEST 2005 Daniel Veillard * HTMLparser.c include/libxml/HTMLparser.h: added a recovery mode for the HTML parser based on the suggestions of bug #169834 by Paul Loberg Tue Aug 23 15:38:46 CEST 2005 Daniel Veillard * elfgcchack.h testapi.c doc/*: regenerated * schematron.c: fixed a compilation problem * xmlregexp.c include/libxml/xmlregexp.h: some cleanups and one bug fix * result/expr/base: slightly changes the number of Cons. Mon Aug 22 23:19:50 CEST 2005 Daniel Veillard * elfgcchack.h testapi.c doc/*: rescanned code and rebuilt * xmlregexp.c: small cleanup * include/libxml/schematron.h include/libxml/xmlexports.h include/libxml/xmlversion.h.in: cleanup problems from code scanner Mon Aug 22 18:00:18 CEST 2005 Daniel Veillard * xmlschemastypes.c: applied patch from Kuba Nowakowski fixing bug #313982 * result/schemas/bug313982* test/schemas/bug313982*: also added the test case to the regression suite. Mon Aug 22 17:50:20 CEST 2005 Daniel Veillard * testRegexp.c: printed the wrong string Mon Aug 22 16:42:07 CEST 2005 Daniel Veillard * testRegexp.c xmlregexp.c include/libxml/xmlregexp.h: exported xmlExpExpDerive(), added it to the testRegexp command line tool when providing multiple expressions. Mon Aug 22 14:57:13 CEST 2005 Daniel Veillard * Makefile.am result/expr/base test/expr/base: added the first regression test suite set for the new expression support Mon Aug 22 13:49:18 CEST 2005 Daniel Veillard * valid.c: fixed an uninitialized variable * xmlregexp.c include/libxml/xmlregexp.h: extended the API to add the parser, serializer and some debugging * include/libxml/xmlversion.h.in: made the new support compiled by default if Schemas is included * testRegexp.c: cleanup and integration of the first part of the new code with a special switch * xmllint.c: show up Expr in --version if compiled in * include/libxml/tree.h: moved the xmlBuffer definition up Mon Aug 22 12:11:10 CEST 2005 Kasimier Buchcik * xmlschemas.c: Some preparation for the creation of a graph of imported/included/redefined schemas; this is needed for at least the redefinitions. Centralized the creation of the parser context in one function. Mon Aug 22 02:19:33 CEST 2005 Daniel Veillard * xmlregexp.c include/libxml/xmlregexp.h: pushing the formal expression handling code to have it in CVs from now. Not plugged, and misses APIs it's not compiled in yet. Sat Aug 20 23:13:27 CEST 2005 Daniel Veillard * xmlreader.c: applied another patch from Rob Richards to fix xmlTextReaderGetAttributeNs and xmlTextReaderMoveToAttributeNs Wed Aug 17 09:06:33 CEST 2005 Daniel Veillard * xmlreader.c: applied patch from Rob Richards to fix xmlTextReaderGetAttribute behaviour with namespace declarations Fri Aug 12 14:12:56 CEST 2005 Kasimier Buchcik * xmlschemas.c include/libxml/xmlerror.h: Changed output for keyref-match errors; the target-node will be now reported rather than the scope-node of the keyref definition - allowing easier chasing of instance errors. This was reported by Guy Fabrice to the mailing list. Some initial parsing code for schema redefinitions. * result/schemas/bug303566_1_1.err result/schemas/bug312957_1_0.err: Adapted test results due to the keyref changes. Fri Aug 12 12:17:52 CEST 2005 Daniel Veillard * valid.c: applied patch from Derek Poon fixing bug #310692 Wed Aug 10 23:39:02 CEST 2005 Daniel Veillard * xmlschemas.c: fix for bug #312945 as pointed by Dean Hill, the context type was not always properly initialized. Wed Aug 10 18:21:41 CEST 2005 Daniel Veillard * relaxng.c: fixed bug #307377 about validation of choices in list values. * test/relaxng/307377* result/relaxng/307377* Makefile.am runtest.c: added examples to the regression tests, problem is that streaming version gives slightly more informations. Wed Aug 10 15:25:53 CEST 2005 Daniel Veillard * xinclude.c: fixed bug #302302, nasty but the fix is rather simple. Wed Aug 10 11:59:46 CEST 2005 Kasimier Buchcik * result/schemas/any6_1_0*: Added missing test results. Tue Aug 9 23:37:22 CEST 2005 Daniel Veillard * xmlregexp.c: fixed a determinism detection problem exposed by ##other tests commited by Kasimier, also added a small speedup of determinism detection. * test/results/any6_2_0* any8_1_0* any7_1_2* any7_2_2*: added the results to the regression tests now Tue Aug 9 15:54:09 CEST 2005 Kasimier Buchcik * test/schemas/any7_2.xml test/schemas/any6_2.xsd test/schemas/any8_1.xsd test/schemas/any8_0.xml: Added some more tests for element wildcards. Tue Aug 9 14:22:47 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed #312957 reported by Carol Hunter: streaming XPath states were not popped in every case, thus failed to resolve correctly for subsequent input. * test/schemas/bug312957* result/schemas/bug312957*: Added the test submitted by Carol Hunter. Tue Aug 9 13:07:27 CEST 2005 Daniel Veillard * xmlregexp.c xmlschemas.c: trying to nail down the remaining ##other issues * result/schemas/any7* test/schemas/any7: completed the tests and added the results * result/schemas/any3_0_0.err result/schemas/any5_0_0.err result/schemas/any5_1_0.err: this slightly chnages the output from 3 existing tests Mon Aug 8 22:33:08 CEST 2005 Daniel Veillard * nanoftp.c nanohttp.c xmlschemastypes.c: applied patch from Marcus Boerger to remove warnings on Windows. Mon Aug 8 16:43:04 CEST 2005 Daniel Veillard * xmlsave.c include/libxml/xmlsave.h: fixed #145092 by adding an xmlSaveOption to omit XML declaration Mon Aug 8 15:44:54 CEST 2005 Daniel Veillard * HTMLtree.c: fixed bug #310333 with a patch close to the provided patch for HTML UTF-8 serialization * result/HTML/script2.html: this changed the output of that test Mon Aug 8 15:01:51 CEST 2005 Daniel Veillard * xmlregexp.c: fixed bug #310264, basically it's about reentrancy of count based transition, when going though the counter must be reset to 0 * test/schemas/bug310264* result/schemas/bug310264*: added the regression test. Mon Aug 8 14:40:52 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed a memory leak: xmlSchemaFreeAnnot() was only freeing the first annotation in the list. Mon Aug 8 09:44:34 CEST 2005 Daniel Veillard * xmlreader.c: applied patch from Rob Richards fixing xmlTextReaderGetAttribute Mon Aug 8 01:41:53 CEST 2005 Daniel Veillard * HTMLparser.c: fixed an uninitialized memory access spotted by valgrind Sun Aug 7 12:39:35 CEST 2005 Daniel Veillard * test/relaxng/docbook_0.xml: get rid of the dependancy on a locally installed DTD * uri.c include/libxml/uri.h xmlIO.c nanoftp.c nanohttp.c: try to cleanup the Path/URI conversion mess, needed fixing in various layers and a new API to the uri module which also fixes #306861 * runtest.c: integrated a regression test specific to check the URI conversions done before calling the I/O handlers. Sat Aug 6 11:06:24 CEST 2005 Daniel Veillard * doc/XSLT.html doc/xml.html: small doc fix for #312647 Tue Aug 2 13:26:42 CEST 2005 Daniel Veillard * win32/configure.js: applied patch from Rob Richards to allow disabling modules in win32, fixes #304071 Mon Aug 1 07:18:53 CEST 2005 Daniel Veillard * python/libxml.c: applied fix from Jakub Piotr Clapa for xmlAttr.parent(), closing #312181 Sun Jul 31 18:48:55 CEST 2005 Daniel Veillard * schematron.c: report improvement * test/schematron/zvon* result/schematron/zvon*: more tests Sun Jul 31 16:02:59 CEST 2005 Daniel Veillard * win32/Makefile.msvc win32/configure.js: applied patch from Rob Richards to add schematron to the build on Windows * test/schematron/zvon3* result/schematron/zvon3*: second test * test/schematron/zvon10* result/schematron/zvon10*: this is the real second test 10 and 2 are swapped. Sun Jul 31 15:42:31 CEST 2005 Daniel Veillard * schematron.c: more bug fixes, improve the error reporting. * test/schematron/zvon2* result/schematron/zvon2*: second test Sun Jul 31 14:15:31 CEST 2005 Daniel Veillard * schematron.c xmllint.c: fixing the loop bug, fixing schematron text error rendering * Makefile.am result/schematron/* test/schematron/zvon1*.sct: started integrating within "make tests" Sat Jul 30 17:26:58 EDT 2005 Daniel Veillard * test/schematron/*: a few first tests from Zvon unfortunately with the old syntax Sat Jul 30 17:08:07 EDT 2005 Daniel Veillard * schematron.c xmllint.c include/libxml/schematron.h: commiting work done on the plane last week-end Sat Jul 30 15:16:29 CEST 2005 Daniel Veillard * runtest.c: allows an extra argument to subset the tests * xmlregexp.c: big speedup for validation, basically avoided transition creation explosion when removing epsilon transition Sat Jul 30 00:00:46 CEST 2005 Daniel Veillard * Makefile.am globals.c parserInternals.c xmlreader.c xmlunicode.c xmlwriter.c: more cleanups based on sparse reports, added "make sparse" Fri Jul 29 12:11:25 CEST 2005 Daniel Veillard * python/libxml.c: don't output any message on failed resolver lookups, better done by the python user provided resolver layer. Fri Jul 29 01:48:02 CEST 2005 Daniel Veillard * HTMLparser.c SAX2.c encoding.c globals.c parser.c relaxng.c runsuite.c runtest.c schematron.c testHTML.c testReader.c testRegexp.c testSAX.c testThreads.c valid.c xinclude.c xmlIO.c xmllint.c xmlmodule.c xmlschemas.c xpath.c xpointer.c: a lot of small cleanups based on Linus' sparse check output. Thu Jul 28 21:28:33 CEST 2005 Daniel Veillard * include/libxml/Makefile.am: added schematron.h, oops ... Thu Jul 28 02:38:21 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Added creation of the content type of xs:anyType. This is needed when trying to extend xs:anyType (although it makes no sense to extend it; IMHO the schema people should have ruled this out). This was reported by Yong Chen to the mailing list. * xmlschemas.c: Fixed handling of xs:anyType in xmlSchemaCheckCOSCTExtends() (reported by Young Chen). Tiny adjustment to an error report output. * test/schemas/extension2* result/schemas/extension2*: Added a test case provided by Young Chen. Mon Jul 25 11:41:18 PDT 2005 William Brack * uri.c: enhanced xmlBuildRelativeURI to allow the URI and the base to be in "relative" form Sun Jul 24 10:25:41 EDT 2005 Daniel Veillard * schematron.c xmllint.c: started adding schematron to the xmllint tool, the report infrastructure is gonna be fun. Sat Jul 23 23:23:51 CEST 2005 Kasimier Buchcik * test/schemas/any6* test/schemas/any7*: Added regression tests (they fail currently), but did not added results yet. Sat Jul 23 23:07:05 CEST 2005 Kasimier Buchcik * xmlschemas.c: Removed the workaround code in xmlSchemaValidateElemWildcard() for the wildcard with namespace == ##other. Support for such wildcards was implemented by Daniel at the automaton level recently, and the workaround code iterfered with it. Sat Jul 23 10:55:50 EDT 2005 Daniel Veillard * pattern.c include/libxml/pattern.h: changed xmlPatterncompile signature to pass an int and not an enum since it can generate ABI compat troubles. * include/libxml/schematron.h schematron.c: adding the new schematron code, work in progress lots to be left and needing testing * include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in Makefile.am configure.in: integration of schematron into the build * xpath.c include/libxml/xpath.h: adding flags to control compilation options right now just XML_XPATH_CHECKNS. Sat Jul 23 16:39:35 CEST 2005 Kasimier Buchcik * xmlschemas.c: Removed an "internal error" message from xmlSchemaBuildAContentModel() when an empty model group definition is hit. Sat Jul 23 00:34:07 CEST 2005 Kasimier Buchcik * pattern.c: Changed xmlCompileStepPattern() and xmlCompileAttributeTest() to handle the "xml" prefix without caring if the XML namespace was supplied by the user. Fri Jul 22 00:08:43 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed xmlSchemaPSimpleTypeErr(), which did not output the given string arguments correctly. Thu Jul 21 09:21:00 EDT 2005 Daniel Veillard * error.c globals.c parser.c runtest.c testHTML.c testSAX.c threads.c valid.c xmllint.c xmlreader.c xmlschemas.c xmlstring.c xmlwriter.c include/libxml/parser.h include/libxml/relaxng.h include/libxml/valid.h include/libxml/xmlIO.h include/libxml/xmlerror.h include/libxml/xmlexports.h include/libxml/xmlschemas.h: applied a patch from Marcus Boerger to fix problems with calling conventions on Windows this should fix #309757 Wed Jul 20 14:45:39 CEST 2005 Daniel Veillard * parser.c: an optimization of the char data inner loop, can gain up to 10% in pure SAX2 parsing speed * xmlschemas.c: applied patch from Kupriyanov Anatolij fixing a bug in XML Schemas facet comparison #310893 Tue Jul 19 17:27:26 CEST 2005 Daniel Veillard * xmlregexp.c xmlschemas.c: fixed the error reporting for not transitions * result/schemas/any5_0_0* result/schemas/any5_0_2* result/schemas/any5_1_0*: fixed output Tue Jul 19 15:34:12 CEST 2005 Daniel Veillard * xmlregexp.c xmlschemas.c include/libxml/xmlautomata.h: fixing bug #172215 about foreign namespaces by adding support for negated string transitions. Error messages still need to be improved. * test/schemas/any5* result/schemas/any5*: adding regression tests for this. Tue Jul 19 12:33:31 CEST 2005 Daniel Veillard * tree.c: applied patch from Alexander Pohoyda fixing xmlGetNodePath on namespaced attributes #310417. Mon Jul 18 23:01:15 CEST 2005 Daniel Veillard * doc/xmllint.1 doc/xmllint.html doc/xmllint.xml: --nonet was ducplicated Mon Jul 18 20:49:28 CEST 2005 Daniel Veillard * xmlschemas.c: fixed xsd:all when used in conjunction with substitution groups * test/schemas/allsg_* result/schemas/allsg_*: adding specific regression tests, strangely missing from NIST/Sun/Microsoft testsuites Sun Jul 17 07:11:27 CEST 2005 Daniel Veillard * xmlschemas.c: fixed bug #307508, a bad automata was built but this showed as an indeterminist result Thu Jul 14 17:53:02 CEST 2005 Daniel Veillard * xmlschemastypes.c: found the last bug raised by NIST tests in comparing base64 strings, result from runsuite: ## NIST test suite for Schemas version NIST2004-01-14 Ran 23170 tests (3953 schemata), no errors Thu Jul 14 14:57:36 CEST 2005 Daniel Veillard * testRegexp.c: fixed where xmlMemoryDump() should be called. * xmlregexp.c: fixed handling of {0}, \n, \r and \t, two bugs affecting NIST regression tests Thu Jul 14 11:30:24 CEST 2005 Daniel Veillard * configure.in: applied a patch from Gerrit P. Haase to add module support on cygwin Thu Jul 14 10:56:42 CEST 2005 Daniel Veillard * HTMLparser.c: fixed a potential buffer overrun error introduced on last commit to htmlParseScript() c.f. #310229 Thu Jul 14 23:48:17 PDT 2005 William Brack * xpath.c: Changed the behaviour of xmlXPathEqualNodeSetFloat to return TRUE if a nodeset with a numeric value of NaN is compared for inequality with any numeric value (bug 309914). Thu Jul 14 01:03:03 CEST 2005 Daniel Veillard * error.c relaxng.c xmlreader.c xmlschemas.c include/libxml/relaxng.h include/libxml/xmlschemas.h: applied patch from Marcus Boerger to route relaxng and schemas error messages when using the reader through the structured interface if activated. * elfgcchack.h doc/* testapi.c: rebuilt since this add new APIs to test. Wed Jul 13 18:35:47 CEST 2005 Daniel Veillard * HTMLparser.c: applied UTF-8 script parsing bug #310229 fix from Jiri Netolicky * result/HTML/script2.html* test/HTML/script2.html: added the test case from the regression suite Tue Jul 12 17:08:11 CEST 2005 Daniel Veillard * nanohttp.c: fixed bug #310105 with http_proxy environments with patch provided by Peter Breitenlohner Mon Jul 11 00:28:10 CEST 2005 Daniel Veillard * Makefile.am NEWS configure.in doc/*: preparing release 2.6.20 * xmllint.c: removed a compilation problem Sun Jul 10 23:33:41 CEST 2005 Daniel Veillard * xstc/Makefile.am README README.tests Makefile.tests Makefile.am: preparing to make testsuite releases along with code source releases * gentest.py testapi.c: fixed a couple of problem introduced by the new Schemas support for Readers * xpath.c: fixed the XPath attribute:: bug #309580, #309864 in a crude but simple way. * xmlschemas.c include/libxml/tree.h: fixed a couple of problems raised by the doc builder. * doc/*: made rebuild Sun Jul 10 21:51:16 CEST 2005 Daniel Veillard * xmlschemas.c: fixed a bug introduced on last commit Sun Jul 10 21:00:54 CEST 2005 Daniel Veillard * doc/xmllint.1 doc/xmllint.html doc/xmllint.xml: fixed a typo pointed by Jeroen Ruigrok * include/libxml/xmlreader.h include/libxml/xmlschemas.h: increased the APIs for xmlReader schemas validation support * xmllint.c xmlreader.c xmlschemas.c: xmlReader schemas validation implementation and testing as xmllint --stream --schema ... Sun Jul 10 16:11:26 CEST 2005 Daniel Veillard * include/libxml/xmlwin32version.h.in: try to avoid conflicts. Sat Jul 9 19:29:10 CEST 2005 Daniel Veillard * parser.c: fix for #309761 from Dylan Shell * xmlschemas.c include/libxml/xmlschemas.h: added xmlSchemaSAXPlug and xmlSchemaSAXUnplug generic APIs for SAX Schemas validation. * xmllint.c: couple of fixes plus added descriptions for --sax and --sax1 Fri Jul 8 23:35:00 CEST 2005 Kasimier Buchcik * xmlschemas.c: Added c-props-correct constraint to check for equal cardinality of keyref/key. * include/libxml/xmlerror.h: Added an error code. Fri Jul 8 21:56:04 CEST 2005 Kasimier Buchcik * pattern.c: Fixed evaluation of attributes. Actually only attribute at the first level were evaluated (e.g. "@attr"); expression like "foo/@attr" always failed. Fri Jul 8 20:04:29 CEST 2005 Kasimier Buchcik * xmlschemas.c: tiny fix in xmlSchemaValidateStream() if a user-provided SAX handler is given. Fri Jul 8 19:25:26 CEST 2005 Daniel Veillard * parser.c: fix some potential leaks in error cases. * xmllint.c: added --sax, to allow testing of --schemas --sax and various other combinations. * xmlschemas.c: fix a couple of tiny problems in xmlSchemaValidateStream() Fri Jul 8 18:34:22 CEST 2005 Kasimier Buchcik * xmlschemas.c: Changed xmlSchemaValidateFile() to use xmlSchemaValidateStream() internally. Fri Jul 8 17:02:14 CEST 2005 Daniel Veillard * test/relaxng/docbook_0.xml: added the missing entity to the document internal subset to avoid errors if the DocBook catalogs are not there * xmlschemas.c: first cut at implementing xmlSchemaValidateStream() untested yet Wed Jul 6 15:45:48 PDT 2005 William Brack * parser.c: fixed problem with free on dupl attribute in dtd (bug309637). * test/errors/attr3.xml, result/errors/attr3.*: added regression test for this Wed Jul 6 13:11:35 PDT 2005 William Brack * win32/Makefile.msvc: try again to fix file format for Windows Wed Jul 6 12:20:13 PDT 2005 William Brack * win32/Makefile.msvc: removed spurious ^M * runtest.c: added check for option O_BINARY * test/schemas/bug309338*, result/schemas/bug309338*: changed sticky tag to 'binary' Wed Jul 6 10:38:02 PDT 2005 William Brack * debugXML.c: excluded content string check for XML_ELEMENT_DECL in xmlCtxtGenericNodeCheck * runtest.c: changed "open" calls to include O_BINARY for Windows Wed Jul 6 17:14:03 CEST 2005 Daniel Veillard * parser.c: fixing bug #166777 (and #169838), it was an heuristic in areBlanks which failed. * result/winblanks.xml* result/noent/winblanks.xml test/winblanks.xml: added the input file to the regression tests Wed Jul 6 13:40:22 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Fixed bug #309338, reported by Kupriyanov Anotolij. * test/schemas/bug309338* result/schemas/bug309338*: Added a regression test for the above bug. Tue Jul 5 16:03:05 CEST 2005 Daniel Veillard * Makefile.am: first steps toward a testsuite dist * SAX2.c include/libxml/xmlerror.h: fixed bug #307870 Tue Jul 5 12:38:36 CEST 2005 Kasimier Buchcik * runsuite.c runtest.c: Tiny portability adjustment for win. * win32/Makefile.*: Added runtest.exe and runsuite.exe to be created. Mon Jul 4 17:44:26 CEST 2005 Daniel Veillard * runsuite.c: first stb at unimplemnted detection * runtest.c: fixing Windows code Mon Jul 4 17:19:31 CEST 2005 Daniel Veillard * runsuite.c: fix on schemas error * runtest.c: portability glob() on Windows Mon Jul 4 16:23:54 CEST 2005 Daniel Veillard * runsuite.c runtest.c: cleanups, logfile and portability * xmllint.c: fixed a memory leak Mon Jul 4 13:11:12 CEST 2005 Daniel Veillard * parser.c: fixed a bug failing to detect UTF-8 violations in CData in push mode. * result/errors/cdata.xml* test/errors/cdata.xml: added the test to the regressions Mon Jul 4 11:26:57 CEST 2005 Daniel Veillard * debugXML.c: added enhancement for #309057 in xmllint shell Mon Jul 4 00:58:44 CEST 2005 Daniel Veillard * HTMLparser.c: applied patch from James Bursa fixing an html parsing bug in push mode * result/HTML/repeat.html* test/HTML/repeat.html: added the test to the regression suite Sun Jul 3 23:42:31 CEST 2005 Daniel Veillard * testapi.c tree.c: fixing a leak detected by testapi in xmlDOMWrapAdoptNode, and fixing another side effect in testapi seems to pass tests fine now. * include/libxml/parser.h parser.c: xmlStopParser() is no more limited to push mode * error.c: remove a warning * runtest.c xmllint.c: avoid compilation errors if only some parts of the library are compiled in. Mon Jul 4 00:39:35 CEST 2005 Daniel Veillard * gentest.py testapi.c: fix a problem with previous patch to testapi.c Sun Jul 3 22:59:28 CEST 2005 Daniel Veillard * runsuite.c runtest.c tree.c: fixing compilations when disabling parts of the library at configure time. Sun Jul 3 18:17:58 CEST 2005 Daniel Veillard * parserInternals.c: fix bug raised by zamez on IRC * testapi.c: regenerated, seems to pop-up leaks in new tree functions * tree.c: added comments missing. * doc/*: regenerated Sun Jul 3 18:06:55 CEST 2005 Daniel Veillard * testapi.c runsuite.c runtest.c: fixing #307823 and a couple of assorted bugs * python/generator.py python/libxml2-python-api.xml: fixed conditionals in generator too * doc/apibuild.py doc/libxml2-api.xml doc/* elfgcchack.h: some cleanups too and rebuilt Sun Jul 3 16:42:00 CEST 2005 Daniel Veillard * xmlIO.c: fixed bug #307503 misplaced #ifdef Sun Jul 3 16:34:47 CEST 2005 Daniel Veillard * runsuite.c: expanded test * xmlregexp.c: found and fixed the leak exposed by Microsoft regtests Sat Jul 2 23:38:24 CEST 2005 Daniel Veillard * runsuite.c: a bit of progresses on xstc Sat Jul 2 09:30:13 CEST 2005 Daniel Veillard * runsuite.c: completed the simple checks for Relax-NG suites back to the same 11 errors as in the Python runs. Thu Jun 30 15:01:52 CEST 2005 Daniel Veillard * runtest.c: complete, checking on other platforms is needed * README: updated * debugXML.c: fix a bug raised by bill on IRC * relaxng.c: fix a leak in weird circumstances * runsuite.c Makefile.am: standalone test tool agaisnt the regression suites, work in progress Tue Jun 28 08:30:26 CEST 2005 Daniel Veillard * runtest.c: adding URI tests Mon Jun 27 23:55:56 CEST 2005 Daniel Veillard * runtest.c: adding xml:id Mon Jun 27 23:29:36 CEST 2005 Daniel Veillard * runtest.c: finishing XPath, adding XPointer Mon Jun 27 17:39:27 CEST 2005 Daniel Veillard * runtest.c: adding more coverage, XInclude and starting XPath Mon Jun 27 17:02:14 CEST 2005 Kasimier Buchcik * tree.c include/libxml/tree.h: Added allocation/deallocation functions for the DOM-wrapper context. Mon Jun 27 15:41:30 CEST 2005 Kasimier Buchcik * tree.c: Commented the new functions to be experimental. Mon Jun 27 14:41:14 CEST 2005 Daniel Veillard * error.c valid.c: working some weird error reporting problem for DTD validation. * runtest.c: augmented with DTD validation tests * result/VC/OneID*: slight change in validation output. Mon Jun 27 13:44:41 CEST 2005 Daniel Veillard * runtest.c: added most HTML tests Mon Jun 27 14:06:10 CEST 2005 Kasimier Buchcik * test/namespaces/reconcile/tests.xml test/namespaces/reconcile/tests-to-c.xsl: Added initial tests for some new DOM-wrapper helping functions. Mon Jun 27 14:01:06 CEST 2005 Kasimier Buchcik * xstc/xstc-to-python.xsl: Cleanup. * xstc/sun-test-def.xml xstc/nist-test-def.xml xstc/ms-test-def.xml: Removed, those are not needed anymore due to the new test suite. Mon Jun 27 11:39:50 CEST 2005 Daniel Veillard * result/*.sax2 MAkefile.am: added SAXv2 regression tests apparently missing. * runtest.c: added SAX1/SAX2 checks. Mon Jun 27 12:24:54 CEST 2005 Kasimier Buchcik * tree.c include/libxml/tree.h: Added xmlDOMWrapReconcileNamespaces(), xmlDOMWrapAdoptNode() and xmlDOMWrapRemoveNode() to the API. These are functions intended to be used with DOM-wrappers. Mon Jun 27 10:14:57 CEST 2005 Daniel Veillard * runtest.c: continue to increase the tests Mon Jun 27 09:21:49 CEST 2005 Daniel Veillard * runtest.c: continue to increase the tests Mon Jun 27 01:01:32 CEST 2005 Daniel Veillard * runtest.c: continue to increase the tests Sun Jun 26 20:08:24 CEST 2005 Daniel Veillard * include/libxml/valid.h valid.c: avoid name glob in agruments as it matches the glob() routine. * runtest.c Makefile.am: first steps toward a C regression test framework. Sat Jun 25 01:37:22 PDT 2005 William Brack * configure.in: fixed a problem with the detection of ss_family for ipV6, as reported on the mailing list by Doug Orleans. Tue Jun 21 10:44:34 CEST 2005 Kasimier Buchcik * test/schemas/empty-value* result/schemas/empty-value*: Added regression tests (from Dhyanesh). Tue Jun 21 10:35:43 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed NULL values to be validated as empty string values (reported by Dhyanesh to the mailing list). Adjusted text concatenation of mixed content. Mon Jun 20 18:11:32 CEST 2005 Daniel Veillard * tree.c valid.c: applied patch from Rob Richards for removal of ID (and xml:id) * xmlreader.c: applied patch from James Wert implementing xmlTextReaderReadInnerXml and xmlTextReaderReadOuterXml Thu Jun 16 14:38:22 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed SAX2 validation: grow of internal namespace list, appending of element character content. * xstc/xstc.py: Added "--sax" option for SAX2 validation. Wed Jun 15 15:34:52 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Added missing function descriptions. Wed Jun 15 15:26:14 CEST 2005 Daniel Veillard * xmllint.c: if sax1 is used and input is a file use the old API xmlParseFile() * xmlschemas.c: cleanups * doc/* testapi.c elfgcchack.h: rebuilt to add python bindings for the new functions in Schemas. Wed Jun 15 14:50:48 CEST 2005 Kasimier Buchcik * xmlschemas.c include/libxml/xmlschemas.h: Added xmlSchemaValidateFile() to the public API. This will use SAX2-driven validation. Wed Jun 15 11:11:38 CEST 2005 Kasimier Buchcik * result/schemas/bug306806_1_0 result/schemas/bug306806_1_0.err: Added schema test results (Tom Browder, bug #306806). Wed Jun 15 11:08:34 CEST 2005 Kasimier Buchcik * test/schemas/bug306806_1.xsd test/schemas/bug306806_0.xml: Added schema tests submitted by Tom Browder (bug #306806). Tue Jun 14 15:03:22 PDT 2005 William Brack * pattern.c: adjusted last change to xmlCompilePathPattern, fixed one compilation warning Tue Jun 14 21:19:16 CEST 2005 Kasimier Buchcik * pattern.c: Some changes/fixes to the streaming evaluation. * xmlschemas.c: A bit of support for parsing the schema for schema. Fixed attribute derivation when the use is "prohibited" and was "optional". Fixed an attribute construction bug, a left-over from the time, where , , etc. where created as structs. Tue Jun 14 12:35:12 CEST 2005 Daniel Veillard * libxml-2.0.pc.in: removed a redundant include path Mon Jun 13 14:58:33 CEST 2005 Kasimier Buchcik * xstc/Makefile.am: Some more adjustments. Mon Jun 13 14:35:59 CEST 2005 Kasimier Buchcik * xstc/Makefile.am: Changed test extraction process, since some boxes don't know about "tar --strip-path". Mon Jun 13 13:39:43 CEST 2005 Daniel Veillard * relaxng.c: fixed a bug exposed by Rob Richards in the mailing-list * result//compare0* test//compare0*: added the regression test in the suite as this went unnoticed ! Wed Jun 9 11:07:42 PDT 2005 William Brack * pattern.c, xpath.c, include/libxml/pattern.h: Further enhancement for XPath streaming, consolidated with schemas usage of pattern.c. Added a new enum xmlPatternFlags. * doc/*, testapi.c, elfgcchack.h: updated to reflect new enum. * test/XPath/tests/mixedpat, test/XPath/docs/mixed, result/XPath/mixedpat: added regression test for problems reported in bug306348 Thu Jun 9 16:51:31 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Changed non-prefixed QNames to be bound to a default namespace if existent. Thu Jun 9 15:11:38 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Fixed a bug which I invented: hexBinary's string values were not duplicated corrently when creating a computed value in xmlSchemaValAtomicType. Thu Jun 9 13:20:57 CEST 2005 Kasimier Buchcik * xmlschemas.c result/schemas/include1_0_0.err: Fixed an attribute fixed/default value constraint error. Thu Jun 9 12:51:23 CEST 2005 Kasimier Buchcik * result/schemas/*: Adapted regression test results. Thu Jun 9 12:22:45 CEST 2005 Kasimier Buchcik * xmlschemas.c xmlschemastypes.c include/libxml/schemasInternals.h include/libxml/xmlschemastypes.h: Changed the validation process to be able to work in streaming mode. Some datatype fixes, especially for list and union types. Due to the changes the error report output has changed in most cases. Initial migration to functions usable by both, the parser and the validator. This should ease a yet-to-come XS construction API in the long term as well. Thu Jun 9 10:16:11 CEST 2005 Daniel Veillard * parser.c: applied patch from Malcolm Rowe to avoid namespace troubles on rollback parsing of elements start #304761 * test/nsclean.xml result/noent/nsclean.xml result/nsclean.xml*: added it to the regression tests. Thu Jun 9 00:33:50 CEST 2005 Daniel Veillard * parser.c include/libxml/xmlerror.h: applied patch from Rob Richards for xml:space and xml:lang handling with SAX2 api. Wed Jun 8 19:41:38 CEST 2005 Daniel Veillard * globals.c: applied patch from Morten Welinder, closing bug #306901 on compiling subsets of the library Wed Jun 8 19:11:42 CEST 2005 Kasimier Buchcik * xstc/Makefile.am xstc.py xstc-to-python.xsl: Adapted the XS tests to use the new release of tests and test-definitions. 2005-06-07 Aleksey Sanin * c14n.c: fix rendering of attributes when parent node is not in the node set 2005-06-06 Aleksey Sanin * c14n.c: fixed xml attributes processing bug in exc c14n * xmllint.c: added --exc-c14n command line option Mon Jun 6 06:43:33 PDT 2005 William Brack * xpath.c, pattern.c: Enhanced xmlXPathRunStreamEval, fixed handling of depth/level for cases like union operator (bug #306348 reported by Bob Stayton). Also enhanced several comments throughout pattern.c. * doc/apibuild.py: fixed problem in handling of 'signed' declaration. Rebuilt the docs. Tue May 31 20:35:27 PDT 2005 William Brack * xinclude.c: Enhanced handling of xml:base for included elements, fixing bugs 169209 and 302353. Wed May 25 18:59:53 CEST 2005 Kasimier Buchcik * xmlschemas.c: Fixed facet errors to be channelled back for union type members; facet-validation will stop now on the first error. Reported by GUY Fabrice to the mailing-list. * xmlschemastypes.c: Changed to ignore lengh-related facet validation for QNames and NOTATIONs as proposed by the schema people. * test/schemas/union2* result/schemas/union2*: Added regression tests for union types (by GUY Fabrice). Fri May 20 20:48:08 CEST 2005 Daniel Veillard * xmlsave.c: applied patch from Mark Vakoc fixing saving of CDATA with NULL content. Thu May 12 15:14:26 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Changed the VALID_TZO macro to restrict the timezone to -840 to 840. Thu May 12 15:05:11 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Applied patch from Steve Nairn (bug #303670) for "signed int" of the date-time timezone field. Silenced a warning. Wed May 11 20:04:09 CEST 2005 Daniel Veillard * tree.c: applied patch for replaceNode from Brent Hendricks Tue May 10 17:27:52 CEST 2005 Daniel Veillard * tree.c: fixed bug #303682 of a leak reported by Malcolm Rowe Tue May 10 11:50:16 CEST 2005 Daniel Veillard * testapi.c: applied patch from Steve Nairn tof fix the compilation problem exposed in bug #303640 Tue May 10 11:11:26 CEST 2005 Kasimier Buchcik * test/schemas/bug303566_1* result/schemas/bug303566_1_1*: Added regression a test provided by Heiko Oberdiek (bug #303566). Mon May 9 17:56:58 CEST 2005 Kasimier Buchcik * pattern.c: Changed the XPath "." to resolve only on the first level for XML Schema IDCs (bug #303566 reported by Heiko Oberdiek). This should not affect pattern-like resolution on every level. Sun May 8 13:35:39 CEST 2005 Daniel Veillard * xmlmemory.c: fixed #169630 segfault in xmlMemDisplay Fri May 6 13:40:03 CEST 2005 Daniel Veillard * nanoftp.c: fixing bug #303068 increasing the nanoftp buffer. * doc/apibuild.py: fixed __attribute() parsing problem * doc/* testapi.c: regenerated the descriptions and docs. Wed May 4 11:16:00 CEST 2005 Daniel Veillard * Makefile.am configure.in threads.c: on linux/gcc use weak definitions to avoid linking with pthread library on non-threaded environments. * xpath.c: applied patch from Mark Vakoc w.r.t. a buggy namespace list allocation. Fri Apr 29 11:27:37 CEST 2005 Kasimier Buchcik * parser.c: Fixed a test for duplicate attributes: Non-prefixed attributes were treated as being bound to the default namespace. Tue Apr 19 17:51:32 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Fixed date-time related validation (reported by David Crossley, bug #300576). Tue Apr 19 16:55:40 CEST 2005 Kasimier Buchcik * xmlschemas.c xmlregexp.c: Removed 5 unnecessary dereferences (reported by Andriy, bug #301074). Tue Apr 19 22:33:18 HKT 2005 William Brack * xpath.c: Added some code to avoid integer overflow for ceil, floor and round functions (bug 301162) Tue Apr 19 13:21:54 CEST 2005 Kasimier Buchcik * xmlschemas.c: Removed workaround for bug #172215, since it does more harm in some scenarios. Added some of the "Particle Restriction OK" constraints - not yet enabled. Mon Apr 18 13:02:55 CEST 2005 Kasimier Buchcik * result/schemas/changelog093*: Added test results. Mon Apr 18 12:42:14 CEST 2005 Kasimier Buchcik * xmlschemas.c: Added output of canonical values in identity-constraint error messages. * xmlschemastypes.c include/libxml/xmlschemastypes.h: Added xmlSchemaGetCanonValueWhtsp() to the API. Further enhancement of the canonical value conversion. * test/schemas/changelog093_0.*: Added test with an XSD submitted by Randy J. Ray. Fri Apr 15 09:33:21 HKT 2005 William Brack * valid.c: Applied Daniel's fix for memory leak in dtd prefix (bug 300550). * xpath.c: minor change to comment only Thu Apr 14 20:52:41 CEST 2005 Daniel Veillard * xmlmemory.c: added the call to the breakpoint routine when a monitored block is reallocated or freed Wed Apr 13 05:55:51 CEST 2005 Daniel Veillard * nanohttp.c: applied patch from Aron Stansvik for bug #172525 about HTTP query string parameter being lost Tue Apr 12 04:03:32 CEST 2005 Daniel Veillard * python/libxml.c python/libxml.py: applied patch from Brent Hendricks adding namespace removal at the python level #300209 * python/tests/Makefile.am python/tests/nsdel.py: added the regression test Sun Apr 10 09:03:22 HKT 2005 William Brack * xpath.c: fixed several places where memory cleanup was not properly done after an error was detected (problem was reported on the mailing list by Pawel Palucha) Fri Apr 8 21:58:04 CEST 2005 Kasimier Buchcik * xmlschemas.c: Added substitution group constraints; changed the build of the pre-computed substitution groups. Channeled errors during xsi assembling of schemas to the validation context. Fixed a big memory leak, which occured when using IDCs: the precomputed value of attributes was not freed if the attribute did not resolve to an IDC field (discovered with the help of Randy J. Ray's schema, posted to the xmlschema-dev maling list). Fri Apr 8 13:22:01 CEST 2005 Kasimier Buchcik * xmlschemas.c: Added "Particle correct 2" to parsing of model groups. Added handling substitution groups inside and ; for this is not supported yet. Changed circular checks for model groups definitions. "memberTypes" are processed at different levels now: component resolution first, construction later; this goes hand in hand with a global change to handle component resolution in a distinct phase. Fixed invalid default values for elements to mark the schema as invalid; this just resulted in an error report previously, but the schema was handled as valid. Separated the assignment of the model groups to referencing model group definition references (i.e. particles); this was needed to perform the circularity check for model group definitions. Added "Element Declaration Properties Correct (e-props-correct)" constraints. Separated component resolution for simple/complex types. * include/libxml/schemasInternals.h: Added a flag for substitution group heads. Wed Apr 6 23:14:03 CEST 2005 Igor Zlatkovic * win32/Makefile.*: make install cleanup Wed Apr 6 22:42:23 CEST 2005 Igor Zlatkovic * win32/Makefile.mingw: fixed mingw compilation * testModule.c: removed mingw warnings Wed Apr 6 21:59:11 CEST 2005 Igor Zlatkovic * .cvsignore: added Eclipse project files to ignore list Wed Apr 6 16:08:10 CEST 2005 Daniel Veillard * xpath.c: fixed the bug in lang() as raised by Elliotte Rusty Harold * result/XPath/tests/langsimple test/XPath/tests/langsimple test/XPath/docs/lang: added a regression test Tue Apr 5 23:48:35 CEST 2005 Daniel Veillard * nanoftp.c: applied fix from Rob Richards to compile on Windows. Tue Apr 5 17:02:58 CEST 2005 Kasimier Buchcik * xmlschemas.c: Added "Type Derivation OK (Complex)" constraints and anchored them in the "Element Locally Valid (Element)" constraints. This restricts the type substitution via "xsi:type". Tue Apr 5 13:10:06 CEST 2005 Daniel Veillard * xmlschemas.c: patch from Matthew Burgess to improve some schemas facets validation messages. Sat Apr 2 12:48:41 CEST 2005 Daniel Veillard * doc/* configure.in NEWS: preparing release 2.6.19, updated docs and rebuilding. Sat Apr 2 13:27:32 CEST 2005 Daniel Veillard * xstc/Makefile.am: integrated fixup-tests.py Fri Apr 1 19:14:18 CEST 2005 Daniel Veillard * xmlschemastypes.c: fixed a lack of comment and missing test for a pointer in the API. Fri Apr 1 17:54:22 CEST 2005 Kasimier Buchcik * xstc/fixup-tests.py: A tiny script to fixup some of the schema files used for the tests. Fri Apr 1 17:33:50 CEST 2005 Kasimier Buchcik * xmlschemas.c include/libxml/schemasInternals.h result/schemas/src-element2-*.err result/schemas/element-*.err: Committing again, since the CVS server aborted. Fri Apr 1 15:29:27 CEST 2005 Kasimier Buchcik * xmlschemastypes.c: Corrected 'length' facet validation for QNames and notations. Corrected xmlSchemaGetCanonValue: some data types did not return a value if already in normalized form. * xmlschemas.c include/libxml/schemasInternals.h: Eliminated creation of structs for , , , , and : the information is now set directly on the corresponding simple/ complex type. Added some more complex type constraints. Added facet derivation constraints. Introduced "particle" components, which seem to be really needed if applying constraints. Corrected/change some of the parsing functions. This is all a bit scary, since a significant change to the code. * result/schemas/src-element2-*.err result/schemas/element-*.err: Adapted regression test results. Fri Apr 1 16:07:59 CEST 2005 Daniel Veillard * doc/apibuild.py doc/elfgcchack.xsl: revamped the elfgcchack.h format to cope with gcc4 change of aliasing allowed scopes, had to add extra informations to doc/libxml2-api.xml to separate the header from the c module source. * *.c: updated all c library files to add a #define bottom_xxx and reimport elfgcchack.h thereafter, and a bit of cleanups. * doc//* testapi.c: regenerated when rebuilding the API Thu Mar 31 17:20:32 CEST 2005 Daniel Veillard * xmlsave.c: fixed bug reported by Petr Pajas, in the absence of encoding UTF-8 should really be assumed. This may break if the HTTP headers indicates for example ISO-8859-1 since this then becomes a well formedness error. Thu Mar 31 16:57:18 CEST 2005 Daniel Veillard * SAX.c: fixed #172260 redundant assignment. * parser.c include/libxml/parser.h: fixed xmlSAXParseDoc() and xmlParseDoc() signatures #172257. Thu Mar 31 16:11:10 CEST 2005 Daniel Veillard * parser.c: fix potential crash if ctxt->sax->ignorableWhitespace is NULL as reported by bug #172255 Thu Mar 31 15:36:52 CEST 2005 Daniel Veillard * relaxng.c: fixed a problem in Relax-NG validation #159968 * test/relaxng/list.* result/relaxng/list_*: added the test to the regression suite Thu Mar 31 13:06:02 CEST 2005 Daniel Veillard * python/libxml.c: fixed bug #168504 Thu Mar 31 12:22:54 CEST 2005 Daniel Veillard * config.h.in configure.in nanoftp.c nanohttp.c xmllint.c macos/src/config-mac.h: use XML_SOCKLEN_T instead of SOCKLEN_T since apparently IBM can't avoid breaking common defines #166922 Thu Mar 31 10:41:45 CEST 2005 Daniel Veillard * encoding.c: fix unitinialized variable in not frequently used code bug #172182 Thu Mar 31 00:45:18 CEST 2005 Daniel Veillard * python/generator.py python/libxml.py: another patch from Brent Hendricks to add new handlers with the various validity contexts * python/tests/Makefile.am python/tests/validDTD.py python/tests/validRNG.py python/tests/validSchemas.py: also added the regression tests he provided Wed Mar 30 09:39:27 CEST 2005 Daniel Veillard * python/generator.py python/libxml.c: applied patch from Brent Hendricks to avoid leak in python bindings when using schemas error handlers. Tue Mar 29 22:29:28 CEST 2005 Daniel Veillard * HTMLtree.c: fixing bug 168196, must be URI escaped too Sun Mar 27 13:24:24 CEST 2005 Daniel Veillard * tree.c: cleanup of the Prop related functions and xmlNewNodeEatName by Rob Richards Thu Mar 24 19:01:22 PST 2005 William Brack * gentest.py, testapi.c: fixed problem with 'minimal library' compilation (LIBXML_PATTERN_ENABLED not properly checked) reported by Greg Morgan Thu Mar 24 12:01:30 CET 2005 Kasimier Buchcik * xmlschemas.c: Fixed call to a facet error report: the type of the error was wrong, resulting in a segfault (bug #171220, reported by GUY Fabrice). Mon Mar 21 22:58:37 CET 2005 Kasimier Buchcik * xmlschemas.c: Removed a stupid bug in xmlSchemaValidateAttributes, failing to build a linked list correctly (bug #169898, reported by bing song, hmm...). Mon Mar 21 21:09:07 CET 2005 Kasimier Buchcik * xmlschemas.c: Fixed a segfault, which occured during bubbling of IDC nodes (bug #170779 and #170778, reported by GUY Fabrice): a variable was missed to be reset in a loop. Deactivated bubbling, if not referenced by a keyref. Sun Mar 20 11:13:02 PST 2005 Aleksey Sanin * c14n.c include/libxml/xmlerror.h: special case "DAV:" namespace in c14n relative namespaces check and add structured error messages to c14n code Thu Mar 17 12:55:23 CET 2005 Kasimier Buchcik * xmlschemas.c: Removed inheritance of "mixed" content type for short-hand restrictions of "anyType" (reported by Guy Fabrice to the mailing list). Added the namespace conversion (chameleon includes) for the base type reference of and . * test/schemas/bug152470_1.xsd: Adapted due to the above change of "mixed" inheritance. Thu Mar 17 11:03:59 CET 2005 Daniel Veillard * xmlschemas.c: fixed a = -> == error pointed by GUY Fabrice Wed Mar 16 22:53:53 CET 2005 Daniel Veillard * xmlschemas.c: more debug messages from Matthew Burgess * xmlschemastypes.c: xmlSchemaValidateLengthFacet API missing check. Wed Mar 16 17:37:04 CET 2005 Kasimier Buchcik * xmlschemastypes.c: Aaaannnd putting back the previous changes done by Daniel, which I overwrote with the previous commit. Wed Mar 16 17:20:25 CET 2005 Kasimier Buchcik * xmlschemas.c xmlschemastypes.c include/libxml/xmlschemastypes.h: Hopefully finished validation against facets to use the normalized value of both, the facets and instance values. Added xmlSchemaValidateLengthFacetWhtsp(), xmlSchemaValidateFacetWhtsp() and xmlSchemaGetValType() to the schema API. Wed Mar 16 13:55:31 CET 2005 Daniel Veillard * libxml.spec.in: do not package .la files * xmllint.c: applied patch from Gerry Murphy for xmllint return code * xmlschemastypes.c: fixed a couple of missing tests of parameters at public API entry points. Tue Mar 15 23:31:14 HKT 2005 William Brack * xmlschemastypes.c: a couple of more changes to various decimal-handling routines. Fixes python some problems turned up by the python tests. * Makefile.am: change SchemasPythonTests message to warn that there are 10 'expected' errors (rather than 6) since we now reject a '+' sign on an unsigned. Tue Mar 15 15:43:27 CET 2005 Kasimier Buchcik * xmlschemastypes.c xmlschemastypes.h: In preparation to use normalized values of facets during validation: changed the arguments of some string comparison functions; added a static xmlSchemaValidateFacetInternal() with more arguments to be more flexible. Prepared XML_SCHEMA_FACET_ENUMERATION validation to use the comparison functions. Fixed some assignments in xmlSchemaValAtomicType(): total digit count, lo, mi, hi. Sun Mar 13 19:32:03 CET 2005 Daniel Veillard * NEWS configure.in testapi.c doc/*: preparing release of 2.6.18 updated docs and rebuilt * libxml.spec.in: reactivated gcc profiling for gcc >= 4.0.0 Sat Mar 12 19:50:22 CET 2005 Daniel Veillard * encoding.c: removed a static buffer in xmlByteConsumed(), as pointed by Ben Maurer, fixes #170086 * xmlschemas.c: remove a potentially uninitialized pointer warning Fri Mar 11 23:53:13 HKT 2005 William Brack * xmlschemastypes.c: enhanced the parsing of XML_SCHEMAS_DECIMAL and much of the routine xmlSchemaCompareDecimals. The changes were necessary to fix a problem reported on the mailing list by John Hockaday. Fri Mar 11 13:22:52 CET 2005 Kasimier Buchcik * xmlschemas.c: The schema parser will stop if components could not be resolved. This is not conforming to the spec but for now will avoid internal errors during type fixup and content model creation. Restructured inclusion/import of schemata: this avoids duplicate, self and circular inclusion. Chameleon includes are still workarounded. Added restriction to disallow references to non-imported namespaces. Corrected parsing of . * result/schemas/bug167754_0_0*: Added a missing test result. Thu Mar 10 16:02:17 CET 2005 Daniel Veillard * doc/xml.html doc/encoding.html: Enriched encoding.html with more link and foreword warning to avoid problem with ignorant programmers, c.f #169721 Thu Mar 10 15:01:34 CET 2005 Daniel Veillard * python/tests/Makefile.am python/tests/readernext.py: added a regression test from Rob Richards for the previous bug Thu Mar 10 13:22:36 CET 2005 Daniel Veillard * xmlreader.c: applied fix for xmlTextReaderNext() bug from Rob Richards Thu Mar 10 11:35:57 CET 2005 Daniel Veillard * xmlmodule.c: second patch from Rick Jones, portability fix for HP-UX * doc/examples/xpath1.c doc/examples/xpath2.c: first fix from Rick Jones to avoid warnings. Thu Mar 10 10:20:23 CET 2005 Daniel Veillard * include/libxml/hash.h libxml.h libxml.spec.in: some gcc4 portability patches, including a serious aliasing bug exposed in s390 when trying to convert data pointer to code pointer. Mon Mar 7 18:34:00 CET 2005 Kasimier Buchcik * xmlschemas.c: Tiny restructuring of the validation start-up functions. Added cleanup of the validation context at the end of validation. This takes care of the validation context being reused. Mon Mar 7 12:12:01 CET 2005 Kasimier Buchcik * xmlschemastypes.c: Tiny changes in the comparison functions I forgot to commit last time. Fri Mar 4 22:51:42 CET 2005 Kasimier Buchcik * xmlschemas.c: Added IDC validation of anySimpleType attribute values; anyway the IDC key comparison is restricted to anySimpleType <--> string based types. For other types we would possibly need the canonical lexical representation of them; this sounds not performant, since we would need to build such a representation each time we want to compare against anySimpleType. TODO: think about buffering the canonical values somewhere. Fixed error reports for default attributes to work without a node being specified. This all and the enabling of IDC validation fixes bug #165346 (reported by Benoit Gr?goire - could not read his last name correctly from bugzilla). Fri Mar 4 18:57:44 CET 2005 Kasimier Buchcik * xmlschemas.c: Enabled IDC parsing and validation. * xmlschemastypes.c include/libxml/xmlschemastypes.h: Added xmlSchemaCopyValue to the API; this was done due to validation of default attributes against IDCs: since IDC keys consume the precomputed value, one needs a copy. * pattern.c: Enabled IDC support; this is currently done via calling xmlPatterncompile with a flag arg of 1. Wed Mar 2 11:45:18 CET 2005 Daniel Veillard * Makefile.am doc/examples/Makefile.am python/tests/Makefile.am xstc/Makefile.am: try to fix a problem with valgrind. * python/generator.py python/libxml.c python/tests/Makefile.am python/tests/tstmem.py: applied memory leak fix from Brent Hendricks c.f. bug #165349 Mon Feb 28 11:18:24 CET 2005 Kasimier Buchcik * tree.c: Changed xmlSearchNsByHref to call xmlNsInScope with the prefix instead of the namespace name. * test/schemas/annot-err_0.xsd test/schemas/element-err_0.xsd: Adapted invalid values of the "id" attribute, since they are validated now. Fri Feb 25 08:31:16 CET 2005 Daniel Veillard * threads.c: new version with fixes from Rob Richards Thu Feb 24 16:37:51 CET 2005 Daniel Veillard * threads.c: applied patch from Rich Salz for multithreading on Windows. Wed Feb 23 15:04:46 CET 2005 Daniel Veillard * xmlwriter.c: applied a patch from Rob Richards fixing a couple of bugs in the writer Mon Feb 21 21:51:03 HKT 2005 William Brack * xmlsave.c: fixed problem when XMLLINT_INDENT was empty (bug 168033). * xpath.c: fixed compilation warning, no change to logic. * xmlschemastypes.c: fixed compilation warning, no change to logic. Mon Feb 21 14:48:27 CET 2005 Daniel Veillard * xmlwriter.c: applied patch from Rob Richards to fix a problem with xmlTextWriterStartAttributeNS Mon Feb 21 11:41:41 CET 2005 Daniel Veillard * pattern.c xpath.c: fixed remaining known bugs in the XPath streaming, and switched XPath to use it by default when possible Sat Feb 19 19:25:14 CET 2005 Daniel Veillard * xmlschemastypes.c: a bit of cleanup * elfgcchack.h testapi.c doc/*: rebuilt the API the tests and the documentation as a result. Fri Feb 18 20:34:03 CET 2005 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h: applied patch from Aron Stansvik to add xmlTextReaderByteConsumed() * testReader.c: added a test option * xmlschemastypes.c: fix a lack of pointer checking in APIs Fri Feb 18 12:41:10 CET 2005 Kasimier Buchcik * test/schemas/bug167754_0*: Added the regression test of Frans Englich for bug #167754. Fri Feb 18 12:31:49 CET 2005 Kasimier Buchcik * xmlschemas.c: Started support for IDC resolution to default attributes. If building the content model for : ensured to put element declarations and not the particles into the content model automaton (this was bug #167754, reported by Frans Englich). Thu Feb 17 22:31:58 CET 2005 Kasimier Buchcik * pattern.c pattern.h: Some experimental addition for parsing of expressions and streamable validation. Added xmlStreamPushAttr to the API. Thu Feb 17 19:57:35 CET 2005 Kasimier Buchcik * xmlschemas.c: Added validation for the attribute "id" in the schemata; doing this needed error report fixes for notations, facets and group. Changed NOTATION validation to work with the declared NOTATIONs in the schema; this does have no impact on the validation via the relaxng module. * xmlschemastypes.c include/libxml/xmlschemastypes.h: Added xmlSchemaNewNOTATIONValue to the API to be able to do the NOTATION validation described above. * test/schemas/element-err_0.xsd test/schemas/annot-err_0.xsd: Fixed the values of the "id" attributes, which were not validated previously. Thu Feb 17 12:03:46 CET 2005 Kasimier Buchcik * xmlschemas.c: Fixed comparison for default/fixed attribute values, if the type was 'xsd:string'. Changed the comparison for IDCs to use the whitespace aware comparison function. * xmlschemastypes.c include/libxml/xmlschemastypes.h: Added xmlSchemaGetCanonValue, xmlSchemaNewStringValue and xmlSchemaCompareValuesWhtsp to the API. Added functions to compare strings with whitespace combinations of "preserve", "replace" and "collapse". Wed Feb 16 13:24:35 CET 2005 Kasimier Buchcik * xmlschemas.c: Further work on IDCs, especially evaluation for attribute nodes. Wed Feb 16 01:19:27 CET 2005 Daniel Veillard * encoding.c: fix the comment to describe the real return values * pattern.c xpath.c include/libxml/pattern.h: lot of work on the patterns, pluggin in the XPath default evaluation, but disabled right now because it's not yet good enough for XSLT. pattern.h streaming API are likely to be changed to handle relative and absolute paths in the same expression. Tue Feb 15 15:33:32 CET 2005 Kasimier Buchcik * xmlschemas.c: Added IDC evaluation for attribute nodes. Made 'nil'ed elements work. Added a specific error message for 'strict' attribute wildcards. * include/libxml/xmlerror.h: Added an error code for wildcards. * result/schemas/anyAttr-processContents-err1_0_0.err: Adapted. Sun Feb 13 16:15:03 HKT 2005 William Brack This change started out as a simple desire to speed up the execution time of testapi.c, which was being delayed by nameserver requests for non-existent URL's. From there it just sort of grew, and grew.... * nanohttp.c, nanoftp.c: changed the processing of URL's to use the uri.c routines instead of custom code. * include/libxml/xmlerror.h: added code XML_FTP_URL_SYNTAX * uri.c: added accepting ipV6 addresses, in accordance with RFC's 2732 and 2373 (TODO: allow ipV4 within ipV6) * gentest.py, testapi.c: fixed a few problems with the testing of the nanoftp and nanohttp routines. * include/libxml/xmlversion.h: minor change to fix a warning on the docs generation * regenerated the docs Sat Feb 12 09:07:11 HKT 2005 William Brack * xinclude.c: fixed xmlXIncludeParseFile to prevent overwriting XML_COMPLETE_ATTRS when setting pctxt->loadsubset (bug 166199) * Makefile.am, python/tests/Makefile.am, xstc/Makefile.am: added code to add $(top_builddir)/.libs to LD_LIBRARY_PATH whenever PYTHONPATH is set, to assure new libxml2 routines are used. Fri Feb 11 22:20:41 HKT 2005 William Brack * parser.c: fixed problem when no initial "chunk" was given to xmlCreatePushParser (bug 162613) Fri Feb 11 18:37:22 HKT 2005 William Brack * dict.c: fixed compilation warning * parser.c: changed xmlWarningMsg so ctxt->errNo is not set * xmllint.c: changed to return non-zero status if error on xinclude processing * xmlsave.c: minor deletion of a redundant condition statement Wed Feb 9 17:47:40 CET 2005 Daniel Veillard * tree.c: applied patch to xmlSetNsProp from Mike Hommey Sun Feb 6 00:17:57 CET 2005 Daniel Veillard * pattern.c xmllint.c: fixed implementation for | * test/pattern/conj.* result/pattern/conj: added a specific regression test Sat Feb 5 18:36:56 CET 2005 Daniel Veillard * pattern.c: first implementation for | support Sat Feb 5 14:58:46 CET 2005 Daniel Veillard * pattern.c: fixed the namespaces support * tree.c: fixed xmlGetNodePath when namespaces are used * result/pattern/multiple result/pattern/namespaces test/pattern/multiple.* test/pattern/namespaces.*: added more regression tests Fri Feb 4 18:26:43 CET 2005 Daniel Veillard * xmlschemas.c: fixed one internal function * doc/Makefile.am doc/wiki.xsl: applied patch from Joel Reed * testapi.c doc/libxml2-api.xml doc/libxml2-refs.xml: regenerated Fri Feb 4 00:25:43 CET 2005 Daniel Veillard * Makefile.am: use the walker to test the patterns instead of the normal reader * pattern.c xmllint.c: bug fixes in the train including fixing the stupid build break. Tue Feb 1 18:15:52 CET 2005 Daniel Veillard * pattern.c: more bug fixes for the XPath streaming code. Mon Jan 31 17:59:24 CET 2005 Kasimier Buchcik * xmlschemas.c: Integrated the streaming pattern from the pattern module. Fixed some IDC code bugs. Changed fallback for attribute declaration addition to work like for element declarations. Mon Jan 31 01:27:22 CET 2005 Daniel Veillard * pattern.c xmllint.c: bugfixes around the streaming patterns Sun Jan 30 23:35:19 CET 2005 Daniel Veillard * Makefile.am configure.in result/pattern/simple test/pattern/simple.*: added first test for the patterns * pattern.c xmllint.c: a few fixes Sun Jan 30 19:27:23 CET 2005 Daniel Veillard * pattern.c include/libxml/pattern.h xmllint.c: added a streaming pattern detector for a subset of XPath, should help Kasimier for identity constraints * python/generator.py: applied Stéphane Bidoul patch to find paths without breaking. Fri Jan 28 18:53:40 CET 2005 Daniel Veillard * xmlschemas.c: fixed an untested pointer dereference and a & vs && Fri Jan 28 18:37:18 CET 2005 Daniel Veillard * xmlreader.c: implementation of xmlTextReaderReadString by Bjorn Reese Fri Jan 28 16:51:47 CET 2005 Kasimier Buchcik * xmlschemas.c: Corrected an ambigious symbol-space for local attribute declarations. IFDEFed more IDC code to surpress compiler warnings. Fri Jan 28 00:57:04 CET 2005 Daniel Veillard * bakefile/Readme.txt bakefile/Bakefiles.bkgen bakefile/libxml2.bkl: files for the Bakefile generator for Makefiles from Francesco Montorsi * win32/configure.js: fixes for Windows compilation with non-default flags by Joel Reed Thu Jan 27 18:23:50 CET 2005 Daniel Veillard * tree.c: fixed xmlCopyDoc to also copy the doc->URL as pointed by Martijn Faassen Thu Jan 27 13:39:04 CET 2005 Kasimier Buchcik * xmlschemas.c include/libxml/schemasInternals.h: Added an initial skeleton for indentity-constraints. This is all defined out, since not complete, plus it needs support from other modules. Added machanism to store element information for the ancestor-or-self axis; this is needed for identity-constraints and should be helpfull for a future streamable validation. * include/libxml/xmlerror.h: Added an error code for identity-constraints. Wed Jan 26 01:03:37 CET 2005 Daniel Veillard * gentest.py testapi.c: had to fix generation and rebuild. * valid.c: the testapi found a bug in the last code of course ! Wed Jan 26 00:43:05 CET 2005 Daniel Veillard * Makefile.am testapi.c doc/Makefile.am: fixing the way testapi.c is generated, fixes bug #161386 * dict.c: fix a comment typo * elfgcchack.h doc/*: regenerated Tue Jan 25 22:39:33 CET 2005 Daniel Veillard * parser.c: found and fixed 2 problems in the internal subset scanning code affecting the push parser (and the reader), fixes #165126 * test/intsubset2.xml result//intsubset2.xml*: added the test case to the regression tests. Tue Jan 25 01:20:11 CET 2005 Daniel Veillard * testdso.c xmlregexp.c: warning patches from Peter Breitenlohner * include/libxml/valid.h valid.c parser.c: serious DTD parsing speedups, start to deprecate 3 ElementDef related entry point and replace them with better ones. Mon Jan 24 00:47:41 CET 2005 Daniel Veillard * xmlschemas.c: more hash dictionary interning changes Sun Jan 23 23:54:39 CET 2005 Daniel Veillard * hash.c include/libxml/hash.h: added xmlHashCreateDict where the hash reuses the dictionnary for internal strings * entities.c valid.c parser.c: reuse that new API, leads to a decent speedup when parsing for example DocBook documents. Sun Jan 23 21:14:20 CET 2005 Daniel Veillard * parser.c: small speedup in skipping blanks characters * entities.c: interning the entities strings Sun Jan 23 18:35:00 CET 2005 Daniel Veillard * parser.c: boosting common commnent parsing code, it was really slow. * test/comment[3-5].xml result//comment[3-5].xml*: added sprecific regression tests Sun Jan 23 01:00:09 CET 2005 Daniel Veillard * parser.c: small optimization back. Sat Jan 22 00:40:31 CET 2005 Daniel Veillard * dict.c parser.c include/libxml/dict.h: a single lock version mostly avoid the cost penalty of the lock in case of low parallelism, so applying that version instead. Fri Jan 21 17:54:06 CET 2005 Daniel Veillard * dict.c: patch from Gary Coady to fix a race in dict reference counting in multithreaded apps. Fri Jan 21 16:08:21 CET 2005 Daniel Veillard * parser.c: fixed bug #164556 where non-fatal errors stopped push parsing and xmlreader. * Makefile.am: fixup * test/errors/webdav.xml result/errors/webdav*: adding regression test for this problem. Wed Jan 19 17:24:34 CET 2005 Kasimier Buchcik * xmlschemas.c: Corrected targetNamespace in xmlSchemaElementDump. Cosmetic changes to the dump output. Sun Jan 16 21:00:53 CET 2005 Daniel Veillard * configure.in NEWS doc/*: preparing release of 2.6.17, updated and rebuilt the docs Sun Jan 16 19:58:36 CET 2005 Daniel Veillard * parser.c: better fix for #151694 not killing c14n regression tests * xmlschemastypes.c: fixing bug #157653 Sun Jan 16 19:01:06 CET 2005 Daniel Veillard * parser.c: fixing bug #151694, line should always be set in the elements. Sun Jan 16 01:04:18 CET 2005 Daniel Veillard * xmlschemastypes.c: trying to fix at least the message from bug #158628 * include/libxml/xmlsave.h xmlsave.c: added first xmlsave option for format, c.f. bug #159997 Sat Jan 15 18:44:30 CET 2005 Daniel Veillard * python/libxml.py: make __str__ call serialize() on nodes, c.f. bug #157872 Sat Jan 15 18:18:07 CET 2005 Daniel Veillard * nanoftp.c: applied patch from Dan McNichol for compilation on AIX Sat Jan 15 13:35:19 CET 2005 Daniel Veillard * relaxng.c: fixed bug #157633 in relaxng choice optimization * result/relaxng/choice0* test/relaxng/choice0*: added regression tests about it. * doc/*: rebuilt * testdso.c: removed a warning due to a missing void in signature. Thu Jan 13 17:42:55 CET 2005 Kasimier Buchcik * include/libxml/schemasInternals.h xmlschemas.c: Exposed targetNamespace for simple/complex types, model groups, attribute groups and notations (reported by Michael Hewarth to the mailing list). Added targetNamespace to xmlSchemaType, xmlSchemaAttributeGroup and xmlSchemaNotation. Tiny cosmetic change to the content model error report output. * result//all_*.err result//any3_0_0.err result//choice_*.err result//list0_0_1.err result//list0_1_1.err: Adapted output of regression tests. Thu Jan 13 13:20:51 CET 2005 Kasimier Buchcik * xmlschemas.c: Put the fix of Daniel (from Tue Jan 11 14:41:47 CET) back in, since I missed to update xmlschemas.c before doing the previous commit. Thu Jan 13 12:59:25 CET 2005 Kasimier Buchcik * xmlschemas.c: Integrated xmlRegExecErrInfo and xmlRegExecNextValues from xmlregexp.c to report expected elements on content model errors. * all_*.err any3_0_0.err choice_*.err list0_0_1.err list0_1_1.err: Adapted output of regression tests. Thu Jan 13 12:24:09 CET 2005 Daniel Veillard * config.h.in configure.in xmlmodule.c: trying to work around the compilation problem on HP-UX Wed Jan 12 22:03:33 CET 2005 Daniel Veillard * pattern.c: fixed the fixed size array structure problem reported by Patrick Streule Wed Jan 12 15:15:02 CET 2005 Daniel Veillard * elfgcchack.h testapi.c doc/libxml2-api.xml doc/*: regenerated the API description, rebuilt, improved navigation in documentation a bit. Wed Jan 12 14:17:14 CET 2005 Daniel Veillard * include/libxml/xmlregexp.h xmlregexp.c: extended xmlRegExecErrInfo() and xmlRegExecNextValues() to return error transition strings too, and sink state detection and handling. Tue Jan 11 14:41:47 CET 2005 Daniel Veillard * xmlschemas.c: fixed bug #163641 when the value passed for an atomic list type is NULL. Tue Jan 11 10:14:33 HKT 2005 William Brack * Makefile.am configure.in: fixed dependency on python 2.3, also small improvement for cygwin (bug 163273) Sun Jan 9 18:46:32 CET 2005 Daniel Veillard * gentest.py testapi.c: William noticed I forgot to add special support for xmlmodules.c define * xmlregexp.c include/libxml/xmlregexp.h: added terminal to xmlRegExecErrInfo() API, adding new xmlRegExecNextValues() entry point and refactored to use both code. Mon Jan 10 01:02:41 HKT 2006 William Brack * doc/xml.html, doc/FAQ.html: added an FAQ under Developer for setting up a "private" library (after some list posts about people having trouble doing it) Sat Jan 8 23:04:10 CET 2005 Daniel Veillard * xmlregexp.c: fixing behaviour for xmlRegExecErrInfo in case of rollback Fri Jan 7 14:54:51 CET 2005 Daniel Veillard * TODO: small update * xmlregexp.c: trying to add an API to get useful error informations back from a failing regexp context. Thu Jan 6 17:35:41 HKT 2005 William Brack * xpath.c: fixed problem with xmlXPathErr when error number subscript was out of range (bug 163055) Thu Jan 6 09:57:03 HKT 2005 William Brack * uri.c: fixed problem with xmlURIEscape when query part was empty (actually fixed xmlURIEscapeStr to return an empty string rather than NULL for empty string input) (bug 163079) Tue Jan 4 17:08:45 PST 2005 Aleksey Sanin * parser.c, parserInternal.c: fixed "col" calculation for struct _xmlParserInput (based on patch from Rob Richards) * include/libxml/xmlerror.h, error.c: propagated error column number in the xmlError structure Tue Jan 4 22:47:22 CET 2005 Daniel Veillard * parser.c: fixed namespace bug in push mode reported by Rob Richards * test/ns6 result//ns6*: added it to the regression tests * xmlmodule.c testModule.c include/libxml/xmlmodule.h: added an extra option argument to module opening and defined a couple of flags to the API. Tue Jan 4 21:16:05 CET 2005 Daniel Veillard * xmlmodule.c include/libxml/xmlmodule.h: applied patch from Bjorn Reese, plus some cleanups * elfgcchack.h doc/elfgcchack.xsl: fixed the stylesheet to add the new header * doc/* testapi.c: regenerated the API Tue Jan 4 18:47:19 CET 2005 Daniel Veillard * configure.in: making DSO support an option * xmlmodule.c xmlreader.c include/libxml/xmlmodule.h: code and documentation cleanups * elfgcchack.h testapi.c doc/*: regenerated the docs and checks for new module * test/valid/REC-xml-19980210.xml: fix a small change introduced previously Tue Jan 4 16:07:52 CET 2005 Daniel Veillard * Makefile.am config.h.in configure.in error.c libxml-2.0.pc.in testModule.c testdso.c xml2-config.in xmllint.c xmlmodule.c include/libxml/Makefile.am include/libxml/xmlerror.h include/libxml/xmlmodule.h include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in: applied DSO support patch 2 from Joel Reed Tue Jan 4 15:30:15 CET 2005 Daniel Veillard * configure.in: applied patch from Marcin Konicki for BeOS Mon Jan 3 13:57:21 PST 2005 Aleksey Sanin * parser.c: added GetLineNumber and GetColumnNumber functions for xmlReader Sun Jan 2 17:51:18 HKT 2005 William Brack Re-examined the problems of configuring a "minimal" library. Synchronized the header files with the library code in order to assure that all the various conditionals (LIBXML_xxxx_ENABLED) were the same in both. Modified the API database content to more accurately reflect the conditionals. Enhanced the generation of that database. Although there was no substantial change to any of the library code's logic, a large number of files were modified to achieve the above, and the configuration script was enhanced to do some automatic enabling of features (e.g. --with-xinclude forces --with-xpath). Additionally, all the format errors discovered by apibuild.py were corrected. * configure.in: enhanced cross-checking of options * doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml, doc/libxml2-api.xml, gentest.py: changed the usage of the element in module descriptions * elfgcchack.h, testapi.c: regenerated with proper conditionals * HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c, testSAX.c: cleaned up conditionals * include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h, hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h, valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]: synchronized the conditionals with the corresponding module code * doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c: added additional conditions required for compilation * doc/*.html, doc/html/*.html: rebuilt the docs Sat Dec 25 18:10:02 HKT 2004 William Brack * parserInternals.c: fixed to skip (if necessary) the BOM for encoding 'utf-16'. Completes the fix for bug #152286. * tree.c, parser.c: minor warning cleanup, no change to logic Fri Dec 24 16:31:22 HKT 2004 William Brack * python/generator.py: added most required entires to foreign encoding table, plus some additional logic to assure only the 1st param uses the 't#' format. Fixes bug #152286, but may still have some other UTF-16 problems. Thu Dec 23 23:44:08 HKT 2004 William Brack * Makefile.am, gentest.py: enhanced for enabling build in a different directory. Added (optional) param to gentest.py to specify the source directory (bug #155468) * doc/Makefile.am: changed destination of NEWS from (top_srcdir) to (top_builddir) (bug #155468) * python/Makefile.am, python/generator.py: enhanced for enabling build in a different directory(bug #155468). Added (optional) param to generator.py to specify the source directory. Added a new table of functions which have possible "foreign" encodings (e.g. UTF16), and code to use python 't' format instead of 'z' format (mostly solving bug #152286, but still need to populate the table). Tue Dec 21 08:10:44 MST 2004 John Fleck * doc/site.xsl, doc/xml.html, plus rebuilt all the html pages Change reference to new site for Solaris binaries, fixing bug 160598 Mon Dec 20 08:02:57 PST 2004 William Brack * parser.c: reset input->base within xmlStopParser * xmlstring.c: removed call to xmlUTF8Strlen from within xmlUTF8Strpos (Bill Moseley pointed out it was not useful) Fri Dec 17 16:03:41 PST 2004 William Brack * valid.c: changed xmlErrValidWarning to use ctxt->warning instead of ctxt->error for its reports (bug #160662) Fri Dec 17 14:52:17 PST 2004 William Brack * python/generator.py: modified to allow the ns and nsDefs accessors to return None instead of error when no namespace is present (bug #) Fri Dec 17 11:40:21 PST 2004 William Brack * doc/Makefile.am: changed maintainer-clean dependency with suggestion from Crispin Flowerday (bug #157634) * debugXML.c: fixed crash when ATTRIBUTE or DOCUMENT nodes were specified with debugDumpNode (bug #160621) Fri Dec 10 11:24:41 CET 2004 Daniel Veillard * valid.c: fixed ID deallocation problem based on patch from Steve Shepard fixes bug #160893 * xmlmemory.c: improving comment. * testapi.c: new test for xmlDictExists() is generated. Wed Dec 1 22:35:37 HKT 2004 William Brack * dict.c, xpath.c, include/libxml/hash.h: fixed up some gcc warnings, no change to logic. New macro XML_CAST_FPTR to circumvent gcc warnings on function pointer <-> object pointer (a hack). Mon Nov 29 14:07:18 CET 2004 Daniel Veillard * xpath.c: fixed a memory leak on errors in some circumstances #159812 Fri Nov 26 23:20:48 HKT 2004 William Brack * xmlIO.c: added a check within xmlOutputBufferWriteEscape to prevent a dead loop on bad data (bug 159550) Fri Nov 26 13:09:04 CET 2004 Kasimier Buchcik * xmlschemas.c: Fixed strict/lax element wildcards: the children of elements for which a declaration existed were still processed by the wildcard mechanism (reported by philippe ventrillon to the mailing list). Changed the import and include machanism to share dictionaries. Fri Nov 26 11:44:36 CET 2004 Daniel Veillard * HTMLparser.c parser.c: make sure xmlCtxtReadFile and htmlCtxtReadFile go through the catalog resolution. * gentest.py testapi.c: fix a side effect wrning of the change Wed Nov 24 13:41:52 CET 2004 Daniel Veillard * dict.c include/libxml/dict.h: added xmlDictExists() to the dictionnary interface. * xmlreader.c: applying xmlTextReaderHasAttributes fix for namespaces from Rob Richards Wed Nov 17 13:54:37 CET 2004 Kasimier Buchcik * xmlschemas.c: tiny enhancement for content model error reports (#157190, #143948). Removed abbreviations: CT, ST and WC (#157190, reported by Frans Englich). Initial: no report of local components. * result/schemas/all* result/schemas/any3_0_0.err result/schemas/choice* result/schemas/cos-st-restricts-1-2-err_0_0.err result/schemas/derivation-ok-extension-err_0_0.err result/schemas/derivation-ok-extension_0_0.err result/schemas/derivation-ok-restriction-2-1-1_0_0.err result/schemas/derivation-ok-restriction-4-1-err_0_0.err result/schemas/deter0_0_0.err result/schemas/extension1_0_2.err result/schemas/facet-unionST-err1_0_0.err result/schemas/hexbinary_0_1.err result/schemas/list* result/schemas/restriction-attr1_0_0.err result/schemas/vdv-first4_0_1.err result/schemas/vdv-first4_0_2.err: Adapted output. Mon Nov 15 13:04:28 CET 2004 Kasimier Buchcik * xmlschemas.c: Moved execution of xmlSchemaCheckDefaults to xmlSchemaTypeFixup; this ensures facets of inherited types to be checked prior to facets of derived types - which caused a seg fault otherwise (bug #158216, reported by Frans Englich). Sun Nov 14 22:23:18 HKT 2004 William Brack * gentest.py, testapi.c: further enhancement, now all compilation warnings have been fixed. * xmlschemastypes.c: added NULL check for one function Fri Nov 12 23:58:14 HKT 2004 William Brack * xpath.c: trivial change (changed CHECK_CONTEXT to CHECK_CTXT on a couple of lines) * gentest.py, testapi.c: enhanced to reduce compilation warnings Fri Nov 12 16:12:48 CET 2004 Kasimier Buchcik * xmlschemas.c: Un-commented a TODO in xmlSchemaParseElement. Fri Nov 12 14:55:36 CET 2004 Kasimier Buchcik * xmlschemas.c: Correct symbol space for 'all' and 'choice'. * xmlschemastypes.c include/xmlschemastypes.h: Added 'replace' normalization for 'normalizedString'. Added xmlSchemaWhiteSpaceReplace to the API. Thu Nov 11 21:43:02 CET 2004 Daniel Veillard * Makefile.am: forgot a $(srcdir) * encoding.c: stupid error wrong name #157976 Wed Nov 10 15:35:25 CET 2004 Daniel Veillard * NEWS configure.in doc/*: preparing release of libxml2-2.6.16 Wed Nov 10 12:55:18 CET 2004 Daniel Veillard * python/generator.py python/libxml.c python/libxml2class.txt python/libxml_wrap.h python/types.c: Applied patch from Brent Hendricks adding support for late DTD validation. * python/tests/Makefile.am python/tests/dtdvalid.py python/tests/test.dtd: integrated the provided regression test Tue nov 9 19:24:31 CET 2004 Dodji Seketeli * configure.in: detect when struct sockaddr_storage has the __ss_family member instead of ss_family and behave accordingly. We now can use ipv6 on aix. Tue Nov 9 17:15:46 CET 2004 Daniel Veillard * Makefile.am gentest.py testapi.c: integrated in "make tests" added -q option, and more conditional features fixes * catalog.c debugXML.c parser.c testThreads.c xmllint.c xmlschemastypes.c xmlwriter.cinclude/libxml/catalog.h include/libxml/debugXML.h: various compilation and conditional cleanups. * doc/*: regenerated Tue Nov 9 15:59:50 CET 2004 Daniel Veillard * gentest.py testapi.c: better handling of conditional features * HTMLparser.c SAX2.c parserInternals.c xmlwriter.c: more testing on parser contexts closed leaks, error messages Tue Nov 9 10:21:37 GMT 2004 William Brack * xpath.c: fixed problem concerning XPath context corruption during function argument evaluation (bug 157652) Mon Nov 8 18:54:52 CET 2004 Daniel Veillard * testapi.c: more types. * parserInternals.c xpath.c: more fixes Mon Nov 8 18:16:43 CET 2004 Daniel Veillard * gentest.py testapi.c: better parser options coverage * SAX2.c xpath.c: more cleanups. Tue Nov 9 01:50:08 CET 2004 Daniel Veillard * testapi.c: trying to fix some optional support brokenness Mon Nov 8 17:25:27 CET 2004 Daniel Veillard * gentest.py testapi.c: more coverage * debugXML.c parser.c xmlregexp.c xpath.c: more fixes Mon Nov 8 15:02:39 CET 2004 Daniel Veillard * gentest.py testapi.c: more coverage * SAX2.c parser.c parserInternals.c: more fixes Mon Nov 8 12:55:16 CET 2004 Daniel Veillard * parser.c testapi.c xmlIO.c xmlstring.c: more fixes. Mon Nov 8 11:24:57 CET 2004 Daniel Veillard * gentest.py testapi.c: more types, more coverage * parser.c parserInternals.c relaxng.c valid.c xmlIO.c xmlschemastypes.c: more problems fixed Mon Nov 8 10:24:28 HKT 2004 William Brack * gentest.py: fixed test file corruption problem Sun Nov 7 13:18:05 CET 2004 Daniel Veillard * gentest.py testapi.c: fixed typos and avoid Catalogs verbosity Sat Nov 6 23:25:16 CET 2004 Daniel Veillard * testapi.c: augmented the number of types Sat Nov 6 20:24:07 CET 2004 Daniel Veillard * HTMLtree.c tree.c xmlreader.c xmlwriter.c: a number of new bug fixes and documentation updates. Sat Nov 6 15:50:11 CET 2004 Daniel Veillard * gentest.py testapi.c: augmented type autogeneration for enums * xpath.c include/libxml/xpath.h: removed direct error reporting. Sat Nov 6 14:27:18 CET 2004 Daniel Veillard * encoding.c: fixed a regression in iconv support. Fri Nov 5 18:19:23 CET 2004 Daniel Veillard * gentest.py testapi.c: autogenerate a minimal NULL value sequence for unknown pointer types * HTMLparser.c SAX2.c chvalid.c encoding.c entities.c parser.c parserInternals.c relaxng.c valid.c xmlIO.c xmlreader.c xmlsave.c xmlschemas.c xmlschemastypes.c xmlstring.c xpath.c xpointer.c: This uncovered an impressive amount of entry points not checking for NULL pointers when they ought to, closing all the open gaps. Fri Nov 5 16:26:28 UTC 2004 William Brack * catalog.c: fixed problem with NULL entry (bug 157407) * xpath.c: fixed a couple of warnings (no change to logic) Fri Nov 5 15:30:43 CET 2004 Daniel Veillard * gentest.py testapi.c: more coverage * xmlunicode.c: one fix Fri Nov 5 23:15:51 CET 2004 Daniel Veillard * entities.c: fixed a compilation problem on a recent change Fri Nov 5 12:50:09 CET 2004 Daniel Veillard * gentest.py testapi.c: more coverage * nanoftp.c tree.c: more fixes Fri Nov 5 11:02:28 CET 2004 Daniel Veillard * gentest.py testapi.c: fixed the way the generator works, extended the testing, especially with more real trees and nodes. * HTMLtree.c tree.c valid.c xinclude.c xmlIO.c xmlsave.c: a bunch of real problems found and fixed. * entities.c: fix error reporting to go through the new handlers Thu Nov 4 18:44:56 CET 2004 Daniel Veillard * parser.c: dohh ... stupid change killing xmlParseDoc() Thu Nov 4 18:32:22 CET 2004 Daniel Veillard * gentest.py testapi.c: changing the way the .c is generated, extending the tests coverage * include/libxml/nanoftp.h nanoftp.c elfgcchack.h doc/*: fixing some function signatures, regenerating stuff * SAX2.c parser.c xmlIO.c: another set of bug fixes and API hardening Thu Nov 4 13:32:19 CET 2004 Daniel Veillard * gentest.py testapi.c: extending the tests coverage Thu Nov 4 11:52:28 CET 2004 Daniel Veillard * Makefile.am: gentest.py was missing from the EXTRA_DIST Thu Nov 4 11:48:47 CET 2004 Daniel Veillard * gentest.py testapi.c: extending the tests coverage * HTMLtree.c tree.c xmlsave.c xpointer.c: more fixes and cleanups Thu Nov 4 00:25:36 CET 2004 Daniel Veillard * gentest.py testapi.c: more fixes and extending the tests coverage * nanoftp.c xmlIO.c: more fixes and hardening Wed Nov 3 20:16:24 CET 2004 Daniel Veillard * gentest.py testapi.c: more fixes and extending the tests coverage * valid.c: bunch of cleanups and 2 leaks removed Wed Nov 3 18:06:44 CET 2004 Daniel Veillard * gentest.py testapi.c: more fixes and extending the tests coverage * list.c tree.c: more fixes and hardening Wed Nov 3 15:19:22 CET 2004 Daniel Veillard * gentest.py testapi.c: more fixes and extending the tests coverage * relaxng.c include/libxml/relaxng.h: adding a type init interface * include/libxml/xmlerror.h parser.c xmlreader.c xmlwriter.c: more cleanups and bug fixes raised by the regression tests Wed Nov 3 12:49:30 CET 2004 Daniel Veillard * gentest.py testapi.c: more fixes and extending the tests coverage * xmlwriter.c list.c: more hardeing of APIs * doc/apibuild.py: skip testapi.c when scanning the C files. Tue Nov 2 23:09:06 CET 2004 Daniel Veillard * gentest.py testapi.c: more testing and coverage * elfgcchack.h xmlstring.c include/libxml/xmlstring.h: more cleanups * doc/*: rebuilt Tue Nov 2 19:44:32 CET 2004 Daniel Veillard * gentest.py testapi.c: more developments on the API testing * HTMLparser.c tree.c: more cleanups * doc/*: rebuilt Tue Nov 2 15:49:34 CET 2004 Daniel Veillard * xmlmemory.c include/libxml/xmlmemory.h: adding xmlMemBlocks() * Makefile.am gentest.py testapi.c: work on generator of an automatic API regression test tool. * SAX2.c nanoftp.c parser.c parserInternals.c tree.c xmlIO.c xmlstring.c: various API hardeing changes as a result of running teh first set of automatic API regression tests. * test/slashdot16.xml: apparently missing from CVS, commited it Mon Nov 1 15:54:18 CET 2004 Daniel Veillard * xpath.c: fixed an UTF-8 parsing bug reported by Markus Bertheau on #fedora-devel Sun Oct 31 22:03:38 CET 2004 Daniel Veillard * parser.c: fixed a bug reported by Petr Pajas on the list and affecting XML::Libxml Sun Oct 31 16:33:54 CET 2004 Daniel Veillard * encoding.c doc/examples/testWriter.c: Fixed bug #153937, making sure the conversion functions return the number of byte written. Had to fix one of the examples. Fri Oct 29 14:16:56 CEST 2004 Daniel Veillard * doc/xmllint.1 doc/xmllint.xml: indicate - means stdin closing #156626 Fri Oct 29 14:03:36 CEST 2004 Daniel Veillard * python/libxml.c: register xmlSchemaSetValidErrors, patch from Brent Hendricks in the mailing-list * include/libxml/valid.h HTMLparser.c SAX2.c valid.c parserInternals.c: fix #156626 and more generally how to find out if a validation contect is part of a parsing context or not. This can probably be improved to make 100% sure that vctxt->userData is the parser context too. It's a bit hairy because we can't change the xmlValidCtxt structure without breaking the ABI since this change xmlParserCtxt information indexes. Wed Oct 27 19:26:20 CEST 2004 Daniel Veillard * ChangeLog NEWS configure.in doc/*: preparing release 2.6.15 * debugXML.c nanoftp.c xmlschemas.c xmlschemastypes.c: cleanups Wed Oct 27 09:31:24 PDT 2004 William Brack * uri.c: fixed a stupid mistake in xmlBuildRelativeURI (bug 156527) Wed Oct 27 11:44:35 CEST 2004 Daniel Veillard * nanoftp.c nanohttp.c: second part of the security fix for xmlNanoFTPConnect() and xmlNanoHTTPConnectHost(). Tue Oct 26 23:57:02 CEST 2004 Daniel Veillard * nanoftp.c: applied fixes for a couple of potential security problems * tree.c valid.c xmllint.c: more fixes on the string interning checks Tue Oct 26 18:09:59 CEST 2004 Daniel Veillard * debugXML.c include/libxml/xmlerror.h: added checking for names values and dictionnaries generates a tons of errors * SAX2.ccatalog.c parser.c relaxng.c tree.c xinclude.c xmlwriter.c include/libxml/tree.h: fixing the errors in the regression tests Mon Oct 25 16:04:22 PDT 2004 William Brack * parser.c: modified the handling of _private for entity expansion (bug 155816) Mon Oct 25 17:11:37 CEST 2004 Daniel Veillard * parser.c: fixed the leak reported by Volker Roth on the list * test/ent10 result//ent10*: added a specific test for the problem Sat Oct 23 11:07:41 PDT 2004 William Brack * valid.c: unlinked the internal subset within xmlValidateDtd (bug 141827) * configure.in: added -Wall to developer's flags * doc/examples/reader4.res: added to CVS Fri Oct 22 16:36:50 CEST 2004 Daniel Veillard * HTMLparser.c: added support for HTML PIs #156087 * test/HTML/python.html result/HTML/python.html*: added specific tests Fri Oct 22 15:20:23 CEST 2004 Daniel Veillard * threads.c: fixed nasty bug #156087 Fri Oct 22 21:04:20 CEST 2004 Daniel Veillard * python/libxml.c: fixed a problem occuring only in x86_64 when very large error messages are raised to the Python handlers. Thu Oct 21 18:03:21 CEST 2004 Daniel Veillard * xmlschemas.c: fixed a memory bug * doc/examples/reader4.c doc/examples/*: added test from Graham Bennett and regenerated the directory Tue Oct 19 11:06:39 CEST 2004 Daniel Veillard * include/libxml/xmlreader.h xmlreader.c: applied patch from Graham Bennett adding 4 convenience functions to the reader API. Fri Oct 15 11:22:48 PDT 2004 William Brack * debugXML.c: excluded a few nodes (with no content) from the string check routine. Fri Oct 15 10:48:30 EDT 2004 Daniel Veillard * debugXML.c include/libxml/xmlerror.h: added UTF-8 string checking, raise a problem, need debug Wed Oct 13 02:17:36 CEST 2004 Daniel Veillard * python/Makefile.am: applied patch from Thomas Fitzsimmons fixing #155240 building outside the source tree. but make tests fails. Mon Oct 11 16:26:51 CEST 2004 Daniel Veillard * debugXML.c include/libxml/xmlerror.h: added namespace checking Sat Oct 9 22:36:21 CEST 2004 Daniel Veillard * debugXML.c: some framework preparation to add namespace checkings Thu Oct 7 15:12:58 CEST 2004 Daniel Veillard * debugXML.c include/libxml/debugXML.h include/libxml/xmlerror.h: adding the tree debug mode * parser.c relaxng.c tree.c xpath.c: fixing various problems reported by the debug mode. * SAX2.c: another tree fix from Rob Richards Wed Oct 6 10:50:03 PDT 2004 William Brack * catalog.c: small change to last fix, to get xml:base right Wed Oct 6 09:33:51 PDT 2004 William Brack * catalog.c: added code to handle , including dumping to output (bug 151924). * xmlcatalog.c, xmlstring.c, parser.c: minor compiler warning cleanup (no change to logic) Mon Oct 4 16:09:07 CEST 2004 Daniel Veillard * configure.in debugXML.c include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in: revamped the XML debugging module and prepare for a new checking mode Mon Oct 4 13:53:24 CEST 2004 Daniel Veillard * parser.c: applied patch from Malcolm Tredinnick fixing bug #152426 Mon Oct 4 12:26:28 CEST 2004 Daniel Veillard * python/generator.py python/libxml.c python/tests/outbuf.py: applied patch from Malcolm Tredinnick fixing bug #154294 related to saving to python file objects. Sat Oct 2 21:08:51 PDT 2004 William Brack * tree.c: changed xmlHasNsProp to properly handle a request for the default namespace (bug 153557) Sat Oct 2 18:18:27 PDT 2004 William Brack * parser.c: fixed problem with dictionary handling within xmlParseInNodeContext (bug 153175) Sat Oct 2 15:46:37 PDT 2004 William Brack * check-relaxng-test-suite.py, check-relaxng-test-suite2.py, check-xinclude-test-suite.py, check-xml-test-suite.py, check-xsddata-test-suite.py, doc/examples/index.py: changed changed sys.path setting from 'append' to 'insert' (patch supplied by Malcolm Tredinnick) (bug 153716) Sat Oct 2 15:03:14 PDT 2004 William Brack * include/libxml/parserInternals.h: added two new macros IS_ASCII_LETTER and IS_ASCII_DIGIT used with (html) parsing and xpath for testing data not necessarily unicode. * HTMLparser.c, xpath.c: changed use of IS_LETTER_CH and IS_DIGIT_CH macros to ascii versions (bug 153936). Fri Oct 1 20:37:25 PDT 2004 William Brack * error.c: added some coding to attempt to display which file contains an error when using XInclude (bug 152623) Thu Sep 30 11:19:17 CEST 2004 Daniel Veillard * configure.in: stupid cut'n paste bug in xmllint detection Wed Sep 29 17:47:56 CEST 2004 Daniel Veillard * configure.in doc/*: releasing 2.6.14, rebuilding the docs Wed Sep 29 15:00:11 CEST 2004 Kasimier Buchcik * xmlschemas.c include/libxml/xmlerror.h include/libxml/xmlschemas.h include/libxml/schemasInternals.h: Parsing of - handle attribute 'mixed', catch illegal attributes. Parsing of - handle attributes 'abstract', 'final' and 'block', catch illegal attributes. Validation of complex types - handle abstract types. Added handling of default/fixed attributes and element values. Per validation option attribute nodes/text nodes are created on the instance. Added the corresponding constraints for fixed/default. Added xmlSchemaSetValidOptions, xmlSchemaGetValidOptions to the external API. Extended element declaration constraints. Got rid of perseverative creation of temporery validation/parser contexts. Added handling of xsi:schemaLocation and xsi:noNamespaceSchemaLocation. Fixed xsi:type component resolution if using non-prefixed QNames. * xmlregexp.c xmlschemas.c include/libxml/xmlautomata.h: Enabled namespace awareness of the content model if using the model group "all". * test/schemas/bug152470_1.xsd: Removed an "abstract" attribute, which broke the test. * xstc/xstc.py: Workaround to accomodate case insensitive test definitions in ms-test.def.xml (was missing in a previous commit). Wed Sep 29 11:03:10 CEST 2004 Daniel Veillard * python/drv_libxml2.py: another patch from Malcolm Tredinnick adding option not to load dtd from the drv_libxml2.py module #134633 Tue Sep 28 14:30:22 CEST 2004 Daniel Veillard * acconfig.h config.h.in configure.in xmlIO.c xmlregexp.c xmlschemas.c xmlschemastypes.c: another patch from Malcolm Tredinnick fixing warning generated by the Nonstop Kernel Open System Services compiler #151710 Tue Sep 28 13:07:37 CEST 2004 Daniel Veillard * python/libxml.py: applied patch from Malcolm Tredinnick fixing python exception hierarchy #139824 Sun Sep 26 16:40:24 CEST 2004 Daniel Veillard * valid.c TODO: applied patch from Malcolm Tredinnick fixing errata E20 concerning NMTOKENS and co. validation #153722 * result/VC/AttributeNmtokens test/VC/AttributeNmtokens test/VCM/AttributeNmtokens.xml: also added tests from Malcolm Sun Sep 26 16:24:44 CEST 2004 Daniel Veillard * xstc/xstc.py: applied patch from Malcolm Tredinnick fixing space/tabs #153713 * xpath.c: fixed a realloc potential problem Fri Sep 24 16:14:12 CEST 2004 Daniel Veillard * Makefile.am: fixed make valgrind xstc Thu Sep 23 18:23:46 CEST 2004 Daniel Veillard * xmlschemastypes.c: fixing an out of bound adressing issue Thu Sep 23 15:14:12 CEST 2004 Daniel Veillard * HTMLparser.c parser.c relaxng.c xmlschemas.c: more memory related code cleanups. Thu Sep 23 01:04:30 CEST 2004 Daniel Veillard * parser.c: fixed a bunch of errors when realloc failed. Wed Sep 22 23:56:05 CEST 2004 Daniel Veillard * threads.c uri.c: couple of memory fixes from Mark Vakoc reported by Purify on Windows. Mon Sep 20 22:01:47 CEST 2004 Daniel Veillard * xmllint.c: added --timing --copy timing for the copy * vms/build_libxml.com: applied patch from Craig Berry to build with recent releases Fri Sep 17 21:25:33 PDT 2004 William Brack * nanohttp.c, include/libxml/nanohttp.h: added the routine xmlNanoHTTPContentLength to the external API (bug151968). * parser.c: fixed unnecessary internal error message (bug152060); also changed call to strncmp over to xmlStrncmp. * encoding.c: fixed compilation warning (bug152307). * tree.c: fixed segfault in xmlCopyPropList (bug152368); fixed a couple of compilation warnings. * HTMLtree.c, debugXML.c, xmlmemory.c: fixed a few compilation warnings; no change to logic. Fri Sep 17 10:40:23 CEST 2004 Daniel Veillard * parser.c: removed some extern before function code reported by Kjartan Maraas on IRC * legacy.c: fixed compiling when configuring out the HTML parser * Makefile.am: added a declaration for CVS_EXTRA_DIST * HTMLparser.c: beginning of an attempt at cleaning up the construction of the HTML parser data structures, current data generate a huge amount of ELF relocations at loading time. Fri Sep 17 10:36:23 CEST 2004 Daniel Veillard * ChangeLog: applied fix from Stepan Kasal to fix duplication in the change log and cleanup of space/tabs issues. Thu Sep 16 13:24:27 CEST 2004 Kasimier Buchcik * xmlschemas.c include/libxml/schemasInternals.h test/schemas/bug152470_1.* result/schemas/bug152470_1_1*: Simpified attribute wildcard creation and assignment to get rid of memory leaks. Restructured the validation process. Restructured and expanded parsing of . Added initial handing of xsi:type. Advanced handling of xsi:nil (should work now for simple types). Added construction of schemata using xsi:schemaLocation and xsi:noNamespaceSchemaLocation; this is not enabled, since no corresponding API exists yet. Moved the content model to complex type components. Resolution of types for attributes will look for simple types only (incl. all the built-in simple types). Extended parsing of 'anyAttribute'. Fixed content-type type for complex types if derived from 'anyType' using the short-hand form (see bug # 152470, submitted by Thilo Jeremias). * include/libxml/xmlschematypes.h: Cleaned up some comments. * xstc/xstc.py: Workaround to accomodate case insensitive test definitions in ms-test.def.xml. * result/schemas/deter0_0_0.err result/schemas/ns0_0_2.err result/schemas/ns0_1_2.err: Adapted. Sat Sep 11 09:04:22 PDT 2004 William Brack * xmlwriter.c: changed char array initialisation to avoid a complaint from some compiler(s) (bug 152308) Thu Sep 9 07:22:11 PDT 2004 William Brack * encoding.c: applied fixes for the UTF8ToISO8859x transcoding routine suggested by Mark Itzcovitz Wed Sep 8 22:50:27 CEST 2004 Daniel Veillard * valid.c xmlsave.c: fixed 2 problems raised by #152140, one which is that notation not in the internal subset should not be saved, and the second more nasty on an error saving NOTATIONs, if there is a proof that nobody uses notations ! Wed Sep 8 11:04:27 CEST 2004 Kasimier Buchcik * xmlschemas.c include/libxml/xmlschemas.h: Added the function xmlSchemaValidateOneElement to the XML Schema validation API, as proposed by Jeffrey Fink - see bug # 152073. Tue Sep 7 11:10:36 CEST 2004 Daniel Veillard * configure.in doc/Makefile.am xstc/Makefile.am: some cleanup checking for xmllint and xsltproc in configure.in, fixed make dist w.r.t. the new xstc subdir. * doc/*: rebuilt Mon Sep 6 16:42:59 CEST 2004 Kasimier Buchcik * xstc/xstc.py: Changed to finally validate instance documents. Mon Sep 6 16:04:01 CEST 2004 Daniel Veillard * xstc/Makefile.am Makefile.am: integrated to "make valgrind", heavy ... weight 250MB of VM ! Mon Sep 6 14:54:39 CEST 2004 Daniel Veillard * xstc/Makefile.am xstc/xstc-to-python.xsl xstc/xstc.py Makefile.am: more cleanup in integrating the xstc testsuite Mon Sep 6 13:56:28 CEST 2004 Daniel Veillard * Makefile.am configure.in xstc/.cvsignore xstc/Makefile.am: starting to integrate the xstc suite in the normal regression tests Mon Sep 6 13:14:11 CEST 2004 Kasimier Buchcik * xstc/sun-test-def.xml: The "tsDir" attribute was not set correctly. Mon Sep 6 11:52:50 CEST 2004 Daniel Veillard * check-xinclude-test-suite.py: when output and expected do not match exactly run diff to put the differences in the log c.f. #148691 Mon Sep 6 11:17:35 CEST 2004 Kasimier Buchcik * xstc/xstc-to-python.xslt xstc/ms-test-def.xml xstc/nist-test-def.xml xstc/sun-test-def.xml: Initial release of generation files to create python test scripts, which will run the W3C XML Schema Test Collection. The ms-test-def.xml and sun-test-def.xml files were extracted from the online HTML XSTC results [1], since they did not exist for the SUN tests, and only partially did exist for the MS tests. The NIST definition file was created by concatenation of the existing definition files for each single datatype. The stylesheet "xstc-to-python.xslt" should be run against the definition files to produce the python scripts. [1] "http://www.w3.org/XML/2001/05/xmlschema-test-collection/ results-master.html" Fri Sep 3 20:29:59 CEST 2004 Kasimier Buchcik * xmlschemas.c include/libxml/schemasInternals.h include/libxml/xmlerror.h: Fixed a seg fault in xmlGetQNameProp: a format argument was missing. Fixed wrong assignment of the owner of a wildcard in xmlSchemaBuildAttributeValidation (in the shorthandform of ; this caused a seg fault, due to a double-free of the wildcard. Added a check for circular attribute group references. Added a check for circular model group definition references. Fixed a dublicate xmlParserErrors enum value - see bug #151738. Fri Sep 3 10:08:13 PDT 2004 William Brack * xmlstring.c: modified comments on xmlGetUTF8Char in response to bug 151760 (no change to logic) Tue Aug 31 09:46:18 PDT 2004 William Brack * xmlstring.c: fixed error reported on the list caused by my last change Tue Aug 31 15:41:52 CEST 2004 Daniel Veillard * NEWS configure.in doc/*: release of libxml2-2.6.13 Tue Aug 31 14:14:30 CEST 2004 Daniel Veillard * xmlIO.c: fixing #151456, an encoding error could generate a serialization loop. Tue Aug 31 11:34:04 CEST 2004 Daniel Veillard * Makefile.am: also produce a tar ball with just the sources * xmllint.c: added --path option and --load-trace options to xmllint, RFE #147740 based on xsltproc versions * doc/xmllint.* doc/*: updated the man page and rebuilt Tue Aug 31 10:37:23 CEST 2004 Daniel Veillard * xmlschemastypes.c: "" is a valid hexbinary string dixit xmlschema-dev * result/schemas/hexbinary_0_1.err test/schemas/hexbinary_1.xml: update the test. * test/ns5 result//ns5*: added a test for the namespace bug fixed in previous commit. * Makefile.am: added a message in the regression tests Mon Aug 30 23:36:21 PDT 2004 William Brack * SAX2.c: fixed bug introduced during OOM fixup causing problems with default namespace when a named prefix with the same href was present (reported on the mailing list by Karl Eichwalder. * xmlstring.c: modified xmlCheckUTF8 with suggested code from Julius Mittenzwei. * dict.c: added a typecast to try to avoid problem reported by Pascal Rodes. Mon Aug 30 12:45:46 CEST 2004 Kasimier Buchcik * xmlschemas.c: Fixed a bug in xmlSchemasCheckFacet, which did not create a computed value on a facet and thus crashed during validation of instances. Expanded validity checks for min/maxOccurs attributes. Expanded validity checks for the value of the attribute "form". Fri Aug 27 18:32:24 PST 2004 William Brack * xmlstring.c: fixed a problem with xmlCheckUTF8 reported on the mailing list by Julius Mittenzwei Fri Aug 27 00:13:39 CEST 2004 Daniel Veillard * libxml.spec.in: added BuildRequires: zlib-devel, fixes Red Hat bug #124942 Thu Aug 26 12:27:23 CEST 2004 Daniel Veillard * parser.c: remove a warning on Solaris * xmlschemastype.c: fix a crashing bug #151111 Wed Aug 25 22:20:18 CEST 2004 Kasimier Buchcik * test/schemas/import-bad-1_0.imp: Added missing test file. * xmlschemas.c include/libxml/xmlerror.h include/libxml/xmlschemas.h: Substituted the obsolete xmlSchemaValidError(s) for xmlParserErrors - see #150840. Changed the import of schemas to allow failure of location of a resource to be imported. * result/schemas/all_* result/schemas/any3_0_0.err result/schemas/choice_* result/schemas/import1_0_0.err result/schemas/list0_0_1.err result/schemas/list0_1_0.err result/schemas/list0_1_1.err result/schemas/ns0_0_2.err result/schemas/ns0_1_2.err: Adapted regression test results. Tue Aug 24 20:49:15 MDT 2004 John Fleck * doc/tutorial/xmltutorial.xml, xmltutorial.pdf, *.html fix Xpath memory leak (thanks to sKaBoy and William Brack) Tue Aug 24 21:10:59 CEST 2004 Igor Zlatkovic * parser.c: fixed path problem in DTD loading reported by Sameer Abhinkar Tue Aug 24 16:40:51 CEST 2004 Igor Zlatkovic * win32/configure.js: added support for version extra * win32/Makefile.*: upgraded to zlib 1.2.1 Mon Aug 23 14:33:54 CEST 2004 Daniel Veillard * configure.in: removing -O -g from default gcc flags #150828 Sun Aug 22 16:26:46 CEST 2004 Daniel Veillard * configure.in doc/* NEWS: preparing 2.6.12 release, updated and and rebuilt the docs. Sun Aug 22 16:07:20 CEST 2004 Daniel Veillard * python/libxml.c: fix a problem on last commit Sun Aug 22 15:16:53 CEST 2004 Daniel Veillard * xmllint.c xpath.c include/libxml/xpath.h include/libxml/xpathInternals.h python/libxml.c python/libxml_wrap.h: trying to remove some warning when compiling on Fedora Core 3 and 64bits Sat Aug 21 0:035:10 CET 2004 Kasimier Buchcik * xmlschemas.c: modified parsing of , , , , , , . Fixed schema defaults (elementFormDefault, etc.) for included schemas. Fixed a bug which reported attributes as invalid on elements declarations with the built-in type 'anyType'. Added "lax" validation of the content of elements of type 'anyType'. Fixed: element declarations with the same name were treated as duplicate if located in the subtree of -> . (This was bug 150623, submitted by Roland Lezuo) Fixed cleanup of error codes in xmlSchemaValidateDoc as proposed by Igor Kapitanker. (This was bug 150647, submitted by Igor Kapitanker) * xmlschemastypes.c: Changed the type of anyType to XML_SCHEMAS_ANYTYPE. * include/libxml/xmlerror.h: Added schema parser errors. * result/schemas/bug145246_0_0* result/schemas/extension1_0_2.err: Changed test results. * result/schemas/ct-sc-nobase_0_0* result/schemas/facet-whiteSpace_0_0* result/schemas/import1_0_0* result/schemas/import2_0_0* result/schemas/include2_0_0* result/schemas/include3_0_0* result/schemas/restriction-attr1_0_0* result/schemas/seq-dubl-elem1_0_0* result/schemas/xsd-list-itemType_0_0*: Added new rest results. test/schemas/bug145246.xsd.imp test/schemas/ct-sc-nobase_0* test/schemas/facet-whiteSpace_0* test/schemas/import1_0* test/schemas/import2_0* test/schemas/include2_0* test/schemas/include3_0* test/schemas/restriction-attr1_0* test/schemas/seq-dubl-elem1_0* test/schemas/xml.xsd test/schemas/xsd-list-itemType_0*: Added new tests and missing files. Fri Aug 20 18:51:36 CEST 2004 Daniel Veillard * Makefile.am configure.in: a bit of cleanup and a extra variable for CVS dist Thu Aug 19 07:44:07 MDT 2004 John Fleck * doc/xmllint.xml, xmllint.1, xmllint.html: Edit and rebuild the man pages with Daniel's C14 update Wed Aug 18 19:15:27 PDT 2004 William Brack * parser.c: fixed missing line numbers on entity as reported on the list by Steve Cheng Wed Aug 18 14:04:31 PDT 2004 William Brack * configure.in globals.c include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in: added some code to include the CVS ChangeLog version in the xmlParserVersion string (printed by xmllint with --version) Wed Aug 18 11:14:06 CEST 2004 Daniel Veillard * xmlschemas.c include/libxml/xmlschemas.h python/generator.py python/libxml.c python/libxml_wrap.h python/types.c python/tests/schema.py python/tests/Makefile.am: Applied patch from Torkel Lyng to add Schemas support to the Python bindings and extend the schemas error API, registered a new test. * doc/* elfgcchack.h: rebuilt to regenerate the bindings Mon Aug 16 14:36:25 CEST 2004 Daniel Veillard * debugXML.c: added help for new set shell command * xinclude.c xmllint.c xmlreader.c include/libxml/parser.h: added parser option to not generate XInclude start/end nodes, added a specific option to xmllint to test it fixes #130769 * Makefile.am: regression test the new feature * doc/xmllint.1 doc/xmllint.xml: updated man page to document option. Mon Aug 16 02:42:30 CEST 2004 Daniel Veillard * xmlIO.c: small typo pointed out by Mike Hommey * doc/xmllint.xml, xmllint.html, xmllint.1: slightly improved the --c14n description, c.f. #144675 . * nanohttp.c nanoftp.c: applied a first simple patch from Mike Hommey for $no_proxy, c.f. #133470 * parserInternals.c include/libxml/parserInternals.h include/libxml/xmlerror.h: cleanup to avoid 'error' identifier in includes #137414 * parser.c SAX2.c debugXML.c include/libxml/parser.h: first version of the inplementation of parsing within the context of a node in the tree #142359, new function xmlParseInNodeContext(), added support at the xmllint --shell level as the "set" function * test/scripts/set* result/scripts/* Makefile.am: extended the script based regression tests to instrument the new function. Sat Aug 14 18:53:08 MDT 2004 John Fleck * doc/xmllint.xml, xmllint.html, xmllint.1: add c14n to man page (man, it's hard to keep up with Daniel!) Sat Aug 14 18:45:38 MDT 2004 John Fleck * doc/xmllint.xml, xmllint.html, xmllint.1: add pattern, walker, maxmem, output and xmlout to man page fixes #144675 Sun Aug 15 00:41:12 CEST 2004 Daniel Veillard * xmllint.c: added a --c14n option to canonicalize the output should close the RFE #143226 Sat Aug 14 23:50:10 CEST 2004 Daniel Veillard * tree.c: Dodji pointed out a bug in xmlGetNodePath() * xmlcatalog.c: applied patch from Albert Chin to add a --no-super-update option to xmlcatalog see #145461 and another patch also from Albert Chin to not crash on -sgml --del without args see #145462 * Makefile.am: applied another patch from Albert Chin to fix a problem with diff on Solaris #145511 * xmlstring.c: fix xmlCheckUTF8() according to the suggestion in bug #148115 * python/libxml.py: apply fix from Marc-Antoine Parent about the errors in libxml(2).py on the node wrapper #135547 Sat Aug 14 13:18:57 CEST 2004 Daniel Veillard * Makefile.am: added a dumb rule to able to compile tst.c when people submit a sample test program * xmlschemas.c: applied small patch from Eric Haszlakiewicz to document xmlSchemasSetValidErrors() limitations, #141827 * error.c: Add information in generic and structured error setter functions that this need to be done per thread #144308 * xmlsave.c: fixed bug whith missing NOTATION(s) serialization bug #144162 * doc/xmllint.xml: typo fix #144840 Tue Aug 10 07:19:31 PDT 2004 Daniel Veillard * configure.in xmlregexp.c xmlschemas.c xmlschemastypes.c include/libxml/schemasInternals.h include/libxml/xmlerror.h include/libxml/xmlschemastypes.h: applied Schemas patches from Kasimier Buchcik * test/ result/ bug141333* annot-err* any[1-4]* bug145246* element-err* element-minmax-err* include1* restrict-CT-attr-ref*: lot of new tests for things fixed by the patch Fri Aug 6 09:22:34 PDT 2004 William Brack * valid.c: fixed my mis-handling of External ID on last change. Wed Aug 4 23:40:21 PDT 2004 William Brack * valid.c: changed the parsing of a document's DTD to use the proper base path (bug 144366) Wed Aug 4 16:58:08 CEST 2004 Daniel Veillard * Makefile.am config.h.in configure.in python/Makefile.am: applied a patch from Gerrit P. Haase to get python bindings on Cygwin Tue Aug 3 15:08:22 PDT 2004 William Brack * include/libxml/valid.h: elaborated on description of xmlValidityWarningFunc and xmlValidityErrorFunc (bug 144760) * xmlIO.c, xmlschemastypes.c, include/libxml/schemasinternals.h: minor fixes to comments for doc rebuilding errors. * doc/*.html: rebuilt the docs Tue Aug 3 23:59:23 CEST 2004 Daniel Veillard * doc/ChangeLog.xsl doc/downloads.html doc/xml.html doc/*: fixes documentation glitches raised by Oliver Stoeneberg Tue Aug 3 09:42:31 PDT 2004 William Brack * tree.c: fixed problem with memory leak on text nodes in DTD (bug 148965) with patch provided by Darrell Kindred Tue Aug 3 08:14:44 PDT 2004 William Brack * HTMLparser.c: fixed initialisation problem for htmlReadMemory (bug 149041) Sat Jul 31 11:01:33 PDT 2004 William Brack * doc/buildDocBookCatalog: enhanced per bug 119876. Further info posted to the mailing list. Sat Jul 31 09:12:44 PDT 2004 William Brack * SAX2.c, encoding.c, error.c, parser.c, tree.c, uri.c, xmlIO.c, xmlreader.c, include/libxml/tree.h: many further little changes for OOM problems. Now seems to be getting closer to "ok". * testOOM.c: added code to intercept more errors, found more problems with library. Changed method of flagging / counting errors intercepted. Fri Jul 30 13:57:55 CEST 2004 Daniel Veillard * tree.c: applied a couple of patch one from Oliver Stoeneberg and another one from Rob Richards fixing #148448 Thu Jul 29 13:20:28 CEST 2004 Daniel Veillard * HTMLparser.c: 1 line patch, apparently htmlNewDoc() was not setting doc->charset. Thu Jul 29 00:05:58 PDT 2004 William Brack * SAX2.c, tree.c, uri.c, xmlIO.c, xmlreader.c: further fixes for out of memory condition, mostly from Olivier Andrieu. * testOOM.c: some further improvement by Olivier, with a further small enhancement for easier debugging. Tue Jul 27 00:34:07 PDT 2004 William Brack * SAX2.c, error.c, parser.c, tree.c, xmlreader.c: implemented patches supplied by Olivier Andrieu (bug 148588), plus made some further enhancements, to correct some problems with out of memory conditions. * testOOM.c: improved with patches from Olivier Andrieu Mon Jul 26 11:03:18 PDT 2004 William Brack * tree.c: put in patch for Windows buffer re-allocation submitted by Steve Hay (bug 146697) Sun Jul 25 17:18:39 PDT 2004 William Brack * xinclude.c: added some code to check, when an include is done, whether the requested URL gets mapped to some other location (e.g. with a catalog entry) and, if so, take care of the xml:base properly (bug 146988) Sun Jul 25 14:02:24 PDT 2004 William Brack * error.c: fixed to assure user data param is set correctly when user structured error handler is called (bug 144823) Thu Jul 22 10:14:48 PDT 2004 William Brack * xmlreader.c: fixed problem with reader state after processing attributes (bug 147993) Wed Jul 21 17:04:27 HKT 2004 William Brack * configure.in, Makefile.am: put in an auto* check for the path to perl (if it exists), and modified make Timingtests to use that path instead of just executing the dbgenattr.pl script (bug 148056) Fri Jul 16 18:36:33 HKT 2004 William Brack * python/generator.py: added a check on the argument for some classes (e.g. xmlDoc and xmlNode) to prevent a segfault (as reported on the list). Further enhancement should be done to auto-create the appropriate object. * python/libxml.c: minor fix for a warning message; added a routine, currently not used, to report the description of a PyCObject. * python/libxml2class.txt: regenerated Fri Jul 16 11:01:40 CEST 2004 Daniel Veillard * catalog.c test/catalogs/white* result/catalogs/white*: applied patches from Peter Breitenlohner to fix handling of white space normalization in public ids and add tests Tue Jul 13 17:24:13 CEST 2004 Daniel Veillard * xmlmemory.c: applied a small fix from Steve Hay Tue Jul 13 23:02:19 HKT 2004 William Brack * xpath.c: Added code to in PREDICATE/FILTER handling to reset the xpath context document pointer (part of fix to libxslt bug 147445) Tue Jul 13 00:14:08 HKT 2004 William Brack * python/libxml.py: ran 'expand' on the file to get rid of mixture of tabs and spaces (bug 147424) Sun Jul 11 22:38:29 HKT 2004 William Brack * python/drv_libxml.py: added an encoding "special comment" to avoid warning message in python2.3 (bug 146889) * Makefile.am, python/Makefile.am, python/tests/Makefile.am: small change to make "make tests" a little quieter (MAKEFLAGS+=--silent) * xpath.c: enhanced to take advantage of current libxslt handling of tmpRVT. Fixes bug 145547. Fri Jul 9 14:02:54 CEST 2004 Daniel Veillard * libxml.h uri.c: fixed a couple of problems in the new elfgcchack.h trick pointed by Peter Breitenlohner Wed Jul 7 00:45:48 CEST 2004 Daniel Veillard * elfgcchack.h doc/apibuild.py doc/libxml2-api.xml: fixed a bug which prevented building with --with-minimum Mon Jul 5 19:43:51 CEST 2004 Daniel Veillard * configure.in doc/*: releasing 2.6.11, updated and regenerated the docs Mon Jul 5 18:43:47 CEST 2004 Daniel Veillard * parser.c: make the push interfaces synchronous * python/tests/sync.py: added a specific test * python/tests/Makefile.am doc/examples/Makefile.am doc/examples/index.py: added the new test, cleaning up "make tests" output Mon Jul 5 15:09:17 CEST 2004 Daniel Veillard * xmlschemas.c: applied patch from Kasimier to fix some Relax-NG datatype facet problem with recent changes. Sat Jul 3 11:31:02 HKT 2004 William Brack * python/libxml.c: Changed the number of XPath extension functions allowed to be variable-length (patch supplied by Marc-Antoine Parent, bug 143805). Added code to "unregister" the functions when the parser cleanup takes place. Fri Jul 2 14:22:14 CEST 2004 Daniel Veillard * xmlmemory.c python/libxml.c python/libxml2-python-api.xml: some updates with memory debugging facilities while messing with libxslt python bindings Thu Jul 1 14:53:36 CEST 2004 Daniel Veillard * python/libxml.c python/generator.py python/libxml.py python/libxml2-python-api.xml python/libxml2class.txt: applied patch from Stéphane Bidoul to fix some Python bindings initialization, then had to change the parserCleanup() to handle memory released there. * xmlmemory.c: added more debugging comments. Thu Jul 1 13:18:02 CEST 2004 Daniel Veillard * xmlreader.c: seems the reader buffer could be used while not allocated, fixes bug #145218 Thu Jul 1 11:34:10 CEST 2004 Daniel Veillard * python/generator.py: do not provide functions used as destructor of classes as public methods to avoid double-free problem like in bug #145185 Wed Jun 30 19:45:23 HKT 2004 William Brack * xmlschemas.c, xmlschemastypes.c: warning message cleanup. Now compiles warning-free, all tests passed. * SAX2.c: small change to comments for documentation. No change to logic. Tue Jun 29 15:00:13 PDT 2004 Daniel Veillard * xmlschemas.c: more fixes with Kasimier, looks far cleaner :-) Tue Jun 29 23:00:05 CEST 2004 Daniel Veillard * xmlschemas.c: Kasimier Buchcik fixed the memory access and allocation problem Tue Jun 29 19:00:32 CEST 2004 Daniel Veillard * xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h include/libxml/schemasInternals.h include/libxml/xmlschemastypes.h: applied Schemas patches from Kasimier Buchcik, there is still one open issue about referencing freed memory. * test/schemas/* result/schemas/*: updated with new tests from Kasimier Tue Jun 29 14:52:18 CEST 2004 Daniel Veillard * include/libxml/globals.h include/libxml/xmlIO.h doc/libxml2-api.xml doc/libxml2-refs.xml: moved some definitions to globals.h to avoid some troubles pointed out by Rob Richards Mon Jun 28 11:25:31 CEST 2004 Daniel Veillard * libxml.m4: applied changes suggested by Mike Hommey, remove libxml1 support and use CPPFLAGS instead of CFLAGS Sun Jun 27 14:17:15 CEST 2004 Daniel Veillard * libxml.spec.in: another, more 'experimental' feature to get compiler optimization based on gcc runtime profiling Sun Jun 27 14:02:36 CEST 2004 Daniel Veillard * elfgcchack.h doc/elfgcchack.xsl libxml.h: hack based on Arjan van de Ven suggestion to reduce ELF footprint and generated code. Based on aliasing of libraries function to generate direct call instead of indirect ones * doc/libxml2-api.xml doc/Makefile.am doc/apibuild.py: added automatic generation of elfgcchack.h based on the API description, extended the API description to show the conditionals configuration flags required for symbols. * nanohttp.c parser.c xmlsave.c include/libxml/*.h: lot of cleanup * doc/*: regenerated the docs. Sun Jun 27 10:02:28 HKT 2004 William Brack * regressions.py, regressions.xml: new files for running regression tests under Python. Not yet complete, but should provide good testing under both Linux and Windows. * testHTML.c, testSAX.c, xmllint.c: changed the 'fopen' used for --push testing to include the 'rb' param when compiled under Windows. Fri Jun 25 13:38:57 HKT 2004 William Brack * uri.c: fixed a problem when base path was "./xxx" * result/XInclude/*: 5 test results changed by above. * Makefile.am: fixed a couple of spots where a new result file used different flags that the testing one. Thu Jun 24 16:27:44 HKT 2004 William Brack * valid.c: suppressed warnings from within xmlValidGetValidElements (bug 144644) * doc/examples/testWriter.c: corrected typo in comment for ISO-8859-1 (bug 144245) Thu Jun 24 10:17:31 HKT 2004 William Brack * valid.c: implemented bugfix from Massimo Morara for DTD dumping problem. * test/valid/t10.xml, result/valid/t10.*: added regression for above * configure.in: small change for my profile settings Wed Jun 23 20:18:19 MDT 2004 John Fleck * doc/xmlcatalog_man.xml, xmlcatalog.1 Docs patch from Ville Skytta, bugzilla #144841 Sat Jun 19 18:34:11 MDT 2004 John Fleck * doc/xmllint.xml, xmllint.html, xmllint.1 update man page to reflect William's newly disciplined return code mojo Thu Jun 17 00:51:55 CEST 2004 Daniel Veillard * doc/examples/io2.c doc/examples/parse4.c: fixing a couple of compilation errors when configured with --with-minimum Wed Jun 16 16:07:10 CEST 2004 Daniel Veillard * debugXML.c: applied patch from Stefano Debenedetti to register namespaces in the debug shell Mon Jun 14 21:56:31 CEST 2004 Daniel Veillard * xmlreader.c: fix from Steve Ball and update of the comment. * Makefile.am result/errors/*.str: William pointed out that the streaming error checking part wasn't streaming, fixing Mon Jun 14 14:11:52 CEST 2004 Daniel Veillard * catalog.c: patch from Igor for the default catalog path on Windows Sat Jun 12 09:03:57 HKT 2004 William Brack * configure.in: apparently wasn't updated last time Thu Jun 10 20:57:48 HKT 2004 William Brack * configure.in, xmlmemory.c, globals.c: fixed problem when configuring using --with-thread-alloc Wed Jun 9 16:31:24 CEST 2004 Igor Zlatkovic * win32/configure.js win32/Makefile.* minor changes for the new layout of the Windows binary package Tue Jun 8 19:50:25 CEST 2004 Daniel Veillard * xmlschemas.c include/libxml/xmlerror.h: applied another patch from Kasimier Buchcik for Schema Component Constraints * test/schemas/* result/schemas/*: added the regression tests Tue Jun 8 21:27:03 HKT 2004 William Brack * xmllint.c: fixed missing error return code for schema validation (bug 143880), also changed over to an enum for defining the error return codes for all conditions. Tue Jun 8 14:01:14 CEST 2004 Daniel Veillard * parser.c xmlreader.c include/libxml/parser.h: fixed a serious problem when substituing entities using the Reader, the entities content might be freed and if rereferenced would crash * Makefile.am test/* result/*: added a new test case and a new test operation for the reader with substitution of entities. Tue Jun 8 12:14:16 CEST 2004 Daniel Veillard * globals.c xmlIO.c include/libxml/globals.h include/libxml/xmlIO.h: applied patch from Rob Richards for the per thread I/O mappings Tue Jun 8 09:58:31 HKT 2004 William Brack * xinclude.c: some further enhancement to take care of xml:base for XPointer elements (bug 143886). Also fixed a problem when xml:base was already specified on an XInclude'd element. Mon Jun 7 22:14:58 HKT 2004 William Brack * relaxng.c: fixed a problem with internal cleanup of
    element (bug 143738). Mon Jun 7 16:57:43 HKT 2004 William Brack * uri.c, include/libxml/uri.h: added a new routine xmlBuildRelativeURI needed for enhancement of xinclude.c * xinclude.c: changed handling of xml:base (bug 135864) * result/XInclude/*: results of 5 tests changed as a result of the above change Fri Jun 4 11:27:37 CEST 2004 Daniel Veillard * test/schemas/* result/schemas/*: added a bunch of tests from Kasimier Buchcik posted on May 11 Thu Jun 3 17:58:25 CEST 2004 Daniel Veillard * xmlschemas.c: new patch from Kasimier Buchcik for processContents of wildcards attribute handling * test/schemas/anyAttr-* result/schemas/anyAttr-*: added specific regression tests Thu Jun 3 13:20:36 CEST 2004 Daniel Veillard * parser.c: fixed a bug where invalid charrefs may not be detected sometimes as pointed by Morus Walter. * test/errors/charref1.xm result/errors/charref1.xml*: added the test in the regression suite. Thu Jun 3 18:38:27 HKT 2004 William Brack * xmlschemas.c: small change to xmlSchemaValidateAttributes, also corrected typo on error code enum. * include/libxml/xmlerror.h: corrected typo on schema error code enum Thu Jun 3 10:12:38 HKT 2004 William Brack * xmlschemas.c: minor cosmetic changes, no change to logic. * result/schemas/attruse_0_[12].err: regenerated * globals.c: added a newline at end to make gcc happy Wed Jun 2 21:16:26 CEST 2004 Daniel Veillard * xmlschemas.c include/libxml/schemasInternals.h include/libxml/xmlerror.h: applied a patch from Kasimier Buchcik implementing attribute uses and wildcards. * test/schemas/* result/schemas/*: added/fixed a bunch of tests Wed Jun 2 18:15:51 CEST 2004 Daniel Veillard * globals.c xmlIO.c include/libxml/globals.h: applied patch from Rob Richards for custom I/O BufferCreateFilenane fixes bug #143366 Wed Jun 02 16:25:32 HKT 2004 William Brack * xpath.c: fixed problem with predicate evaluation on an empty nodeset (bug 143409) Wed Jun 02 11:26:41 HKT 2004 William Brack * testSAX.c: fixed problem with attribute listing (bug 142674) and added macro LIBXML_TEST_VERSION to assure xmlInitParser gets called (bug 142686) Sat May 29 21:35:52 CEST 2004 Daniel Veillard * test/schemas/date_0.xml xmlschemastypes.c: applied a patch from Charles Bozeman fixing a side effect in date handling Thu May 27 19:47:48 MDT 2004 John Fleck * doc/tutorial/xmltutorial.xml fix lack of cast in Xpath example * doc/tutorial/*.html, xmltutorial.pdf rebuild html, pdf 2004-05-25 Aleksey Sanin * c14n.c: fixed c14n bug with serializing attribute namespaces Mon May 24 08:22:48 HKT 2004 William Brack * xpath.c: fixed to allow '+' in exponent of number (bug 143005) * SAX2.c: fixed typo in last commit Sat May 22 09:08:24 HKT 2004 William Brack * SAX2.c: skipped call to xmlValidateNCName when compiling --with-minimum (bug 142917) Tue May 18 06:48:00 CEST 2004 Daniel Veillard * catalog.c: reverted the broken change. Mon May 17 23:07:15 CEST 2004 Daniel Veillard * NEWS doc/*: updated the docs for 2.6.10 Mon May 17 05:52:03 CEST 2004 Daniel Veillard * configure.in : releasing 2.6.10 Sun May 16 23:12:35 CEST 2004 Daniel Veillard * tree.c: avoid returning default namespace when searching from an attribute * entities.c xmlwriter.c: reverse xmlEncodeSpecialChars() behaviour back to escaping " since the normal serialization routines do not use it anymore, should close bug #134477 . Tried to make the writer avoid it too but it didn't work. Sun May 16 01:07:16 CEST 2004 Daniel Veillard * doc/ChangeLog.awk doc/ChangeLog.xsl: fixed escaping handling and added direct links to bugzilla report for bug numbers. Sun May 16 11:11:13 HKT 2004 William Brack * error.c: modified to assure proper user data is sent to structured error routine (bug 142598) Sun May 16 03:18:52 CEST 2004 Daniel Veillard * catalog.c: a couple of large static variable which should really not be declared as such cluttered the .bss section. Sun May 16 03:06:31 CEST 2004 Daniel Veillard * doc/ChangeLog.awk: fixed a couple of problems when parsing libxslt ChangeLog Sat May 15 20:14:21 CEST 2004 Daniel Veillard * doc/ChangeLog.awk doc/ChangeLog.xsl: first steps of a good ChangeLog page generation. The awk shoudl escape characters not okay in XML and the xslt should make links to functions or variables or bug reported in the entries. Sat May 15 14:57:40 CEST 2004 Daniel Veillard * xmlsave.c include/libxml/xmlsave.h: start adding API for escaping customization. Sat May 15 12:38:17 CEST 2004 Daniel Veillard * xmlsave.c: more xmlSave cleanup, optimization and refactoring Fri May 14 17:51:48 CEST 2004 Daniel Veillard * xmlIO.c xmlsave.c: third pass at the escaping refactoring. Fri May 14 12:37:24 HKT 2004 William Brack * parser.c: enhanced the enhancement, fixed another couple of special cases. Fri May 14 11:48:33 HKT 2004 William Brack * parser.c: small enhancement to dtd handling of (a?)+ (bug 142487) Thu May 13 23:19:00 CEST 2004 Daniel Veillard * xmlIO.c xmlsave.c include/libxml/xmlIO.h: second pass on escaping handling, start to looks better, need to be completed and added directly at the saving context level. Thu May 13 10:31:28 CEST 2004 Daniel Veillard * xmlIO.c xmlsave.c include/libxml/xmlIO.h: first pass at refactoring the escape on save routines for better performances (less malloc) and more flexibility using the new saving context. Preliminary work, interface will change. Wed May 12 22:34:03 HKT 2004 William Brack * xmlschemas.c: added code in xmlSchemaBuildAContentModel to handle element reference within the xs:all construct (bug 139897) Wed May 12 17:27:18 HKT 2004 William Brack * xinclude.c: a little further fixing of fallback processing, this time for fallback with children (bug 139520). Wed May 12 08:21:33 HKT 2004 William Brack * xmlschemas.c: added code in xmlSchemaBuildContentModel to allow ref in group definition (bug 134411). Also fixed misc compilation warning messages. * result/schema/group0_0_0, result/schema/group0_0_0.err: regenerated (now no error reported). Tue May 11 11:55:59 CEST 2004 Daniel Veillard * xmlIO.c: fix to the fix for #141864 from Paul Elseth * HTMLparser.c result/HTML/doc3.htm: apply fix from David Gatwood for #141195 about text between comments. Tue May 11 23:04:47 HKT 2004 William Brack * xmlschemas.c, include/libxml/schemasInternals.h, include/libxml/xmlerror.h: Applied patches supplied by Kasimier Buchcik. * test/schemas/po1_0.xml, test/schemas/po1_0.xsd: changed test to account for above patch. Tue May 11 09:06:53 CEST 2004 Daniel Veillard * python/tests/tstLastError.py: better portability fix for f(*args), use apply(f, args) as Stéphane Bidoul suggested Mon May 10 15:49:22 HKT 2004 William Brack * xmlregexp.c: enhanced xmlRegStateAddTrans to check if transition is already present and, if so, to ignore the request to add it. This has a very dramatic effect on memory requirements as well as efficiency. It also fixes bug 141762. Sun May 9 20:40:59 CEST 2004 Daniel Veillard * Makefile.am python/tests/Makefile.am python/tests/tstLastError.py: applied patch from Ed Davis to allow "make tests" to work with Python 1.5 Sun May 9 19:46:13 CEST 2004 Daniel Veillard * xmlsave.c: apply fix for XHTML1 formating from Nick Wellnhofer fixes bug #141266 * test/xhtmlcomp result//xhtmlcomp*: added the specific regression test Sun May 9 14:07:21 CEST 2004 Daniel Veillard * Makefile.am: fix for a pedantic make check without make all request Sat May 8 22:56:22 CEST 2004 Daniel Veillard * uri.c xmlIO.c: fixing some problems in URI unescaping and output buffer opening, this should fix #141864 Fri May 7 22:31:54 CEST 2004 Daniel Veillard * valid.c include/libxml/valid.h: fixes the use of 'list' as a parameter * xmlIO.c include/libxml/xmlIO.h: added xmlPopInputCallback for Matt Sergeant Thu May 6 21:14:38 PDT 2004 William Brack * xmlregexp.c: enhanced the handling of subexpression ranges which have a minOccurs of 0 (bug 140478 again); cleaned up comments throughout the module. Tue May 4 00:52:16 CEST 2004 Daniel Veillard * xmllint.c: adding a --maxmem option to check memory used. Sat May 1 01:08:44 CEST 2004 Daniel Veillard * xmllint.c xmlsave.c python/generator.py python/libxml.c: Fixed bug #141529 i.e. various problems when building with --without-html Fri Apr 30 18:12:31 CEST 2004 Daniel Veillard * xmllint.c xmlreader.c: fixing bug #141384 where the reader didn't call the deregistering functions. Also added the check to xmllint --stream --chkregister . Fri Apr 30 08:57:47 CEST 2004 Daniel Veillard * win32/Makefile.msvc: applied a second patch from Mark Vakoc for regression tests on Windows Thu Apr 29 21:47:23 CEST 2004 Daniel Veillard * xmlreader.c: never commit without running make tests first ! Thu Apr 29 20:15:20 CEST 2004 Daniel Veillard * xmlreader.c: fix a nasty problem with reading over the end * xmlsave.c: fix a reported memory leak apparently Thu Apr 29 17:05:00 CEST 2004 Daniel Veillard * win32/Makefile.msvc: patch from Mark Vakoc for regression tests on Windows. * xpath.c: the NaN problem also shows up on Borland Mon Apr 26 23:37:12 HKT 2004 William Brack * xmlregexp.c: enhanced xmlFARegExec range evaluation for min occurs 0 problems - fixes bug 140478. Thu Apr 22 09:12:47 CEST 2004 Daniel Veillard * rngparser.c: tiny path fixes the "xmlConvertCRNGFile" function name from Kasimier Buchcik * xmlschemas.c: recursive xs:extension fix from taihei goi Wed Apr 21 00:19:29 CEST 2004 Daniel Veillard * tree.c: small buffer resizing improvement from Morten Welinder closes #140629 Tue Apr 20 23:40:14 CEST 2004 Daniel Veillard * xpath.c: last version of the fix for MSC version 1200 Tue Apr 20 19:40:37 CEST 2004 Daniel Veillard * parser.c: killing the strncmp vs. memcmp controversy and #140593 Tue Apr 20 13:27:06 CEST 2004 Daniel Veillard * include/libxml/SAX2.h: Kasimier Buchcik pointed out some inexistent functions, cleaned them out. Tue Apr 20 11:42:50 CEST 2004 Daniel Veillard * error.c: Johnson Cameron pointed out that initGenericErrorDefaultFunc() was really wrong. * xmlreader.c include/libxml/xmlreader.h: xmlTextReaderMode enum must be made public, added some missing comments on the XMLReader header. * c14n.c: Alexsey fixed C14N bug with processing namespaces from attributes Mon Apr 19 23:27:46 CEST 2004 Daniel Veillard * xpath.c: fixed a stupid () error + Mark name. Sun Apr 18 23:45:46 CEST 2004 Daniel Veillard * configure.in: preparing 2.6.9 release * doc/* News: updated and rebuilt the docs Sun Apr 18 22:51:43 CEST 2004 Daniel Veillard * xpath.c: relaxed id() to not check taht the name(s) passed are actually NCName, decided this in agreement with Aleksey Sanin since existing specs like Visa3D broke that conformance checking and other tools seems to not implement it sigh... * SAX2.c: check attribute decls for xml:id and the value is an NCName. * test/xmlid/id_err* result/xmlid/id_err*: added error testing Sun Apr 18 21:46:17 CEST 2004 Daniel Veillard * xpath.c: work around Microsoft compiler NaN bug raise reported by Mark Vakoc * xmlschemas.c include/libxml/schemasInternals.h include/libxml/xmlerror.h: fixed a recusive extention schemas compilation error raised by taihei goi Sun Apr 18 16:57:02 CEST 2004 Daniel Veillard * libxml.spec.in: keep the ChangeLog compressed * xmlreader.c: fix a segfault when using Close() * python/tests/Makefile.am python/tests/reader8.py: test for the Close() reader API. Sat Apr 17 22:42:13 HKT 2004 William Brack * xmlschemas.c, xmlwriter.c, doc/examples/parse4.c, doc/examples/io2.c: minor warning cleanup (no change to logic) * xinclude: fixed return value for internal function xmlXIncludeLoadFallback (now always 0 or -1) Sat Apr 17 21:32:32 HKT 2004 William Brack * valid.c: small enhancement to fix bug 139791 Fri Apr 16 18:44:47 CEST 2004 Daniel Veillard * xmlschemas.c include/libxml/schemasInternals.h include/libxml/xmlerror.h: applied patches from Kasimier Buchcik for the attribute use support * test/schemas/attruse* result/schemas/attruse*: added the tests to the regression suite. Fri Apr 16 18:22:25 CEST 2004 Daniel Veillard * xmlsave.c: move the TODO as comments as the function while not finished are usable as-is * xmlschemas.c include/libxml/xmlerror.h: patch from Kasimier Buchcik implementing union * test/schemas/union_0_0.x* result/schemas/union_0_0*: added example * python/Makefile.am: applied fix from Mike Hommey Fri Apr 16 23:58:42 HKT 2004 William Brack * parser.c: fixed problem with detecting external dtd encoding (bug 135229). * Makefile.am: minor change to test label Fri Apr 16 16:09:31 HKT 2004 William Brack * xinclude.c: fixed problem causing duplicate fallback execution (bug 139520) * test/XInclude/docs/fallback2.xml result/XInclude/fallback2.*: added testcase Fri Apr 9 23:49:37 CEST 2004 Daniel Veillard * SAX2.c include/libxml/tree.h: adding xml:id draft support * Makefile.am test/xmlid/id_tst* result/xmlid/id_tst*: adding 4 first regression tests Fri Apr 9 11:56:08 CEST 2004 Daniel Veillard * libxml.spec.in: fixing Red Hat bug #120482 , libxml2-python should depend on the version of python used to compile it. Mon Apr 5 09:07:24 CEST 2004 Daniel Veillard * HTMLparser.c: applied patch from James Bursa, frameset should close head. Fri Apr 2 22:02:24 HKT 2004 William Brack * relaxng.c: fixed problem in xmlRelaxNGCompareNameClasses which was causing check-relaxng-test-suite.py test 351 to fail. Fri Apr 2 17:03:48 HKT 2004 William Brack * nanohttp.c: implemented fix for M$ IIS redirect provided by Ian Hummel * relaxng.c: fixed problem with notAllowed compilation (bug 138793) Thu Apr 1 22:07:52 CEST 2004 Daniel Veillard * uri.c: fix for xmlUriEscape on "http://user@somewhere.com" from Mark Vakoc. 2004-04-01 Johan Dahlin * python/.cvsignore: Add generated files, to make cvs silent. Thu Apr 1 12:41:36 CEST 2004 Daniel Veillard * xmlschemas.c: small signed-ness patch from Steve Little Wed Mar 31 17:47:28 CEST 2004 Daniel Veillard * xmlregexp.c: patched a bug in parsing production 1 and 2 of xmlschemas regexp that William pointed out while working on #134120 * test/regexp/branch result/regexp/branch: added a specific regression test Wed Mar 31 09:50:32 HKT 2004 William Brack * Makefile.am: added PYTHONPATH to python tests for Schemas and RelaxNG * test/xsdtest/xsdtestsuite.xml: added testfile for SchemasPythonTests Mon Mar 29 16:56:49 CEST 2004 Daniel Veillard * doc/examples/examples.xsl doc/examples/index.html: added information about compiling on Unix Mon Mar 29 14:18:12 CEST 2004 Daniel Veillard * catalog.c: fixes the comments for xmlCatalogDump and xmlDumpACatalog * doc/*: rebuilt to update Sun Mar 28 18:11:41 CEST 2004 Daniel Veillard * xmlsave.c: optimize indentation based on the new context Sun Mar 28 14:17:10 CEST 2004 Daniel Veillard * doc/examples/xpath2.c doc/examples/xpath2.res: handle and explain a very tricky problem when modifying the tree based on an XPath result query. Sat Mar 27 09:56:14 PST 2004 William Brack * relaxng.c: fixed problem with IS_COMPILABLE flag (bug 130216) Fri Mar 26 18:28:32 CET 2004 Daniel Veillard * parser.c: applied patch from Dave Beckett to correct line number errors when using push with CDATA Fri Mar 26 14:53:58 CET 2004 Daniel Veillard * doc/examples/xpath1.c: added a test template * doc/examples/xpath2.c doc/examples/xpath2.res doc/examples/*: added a new example, and make valgrind target Fri Mar 26 11:47:29 CET 2004 Daniel Veillard * parser.c: apply fix for #136693 Thu Mar 25 20:21:01 MST 2004 John Fleck * doc/examples/io2.c * doc/examples/io2.res add xmlDocDumpMemory example in response to mailing list FAQ (rebuilt xml and html also) Thu Mar 25 10:33:05 CET 2004 Daniel Veillard * debugXML.c testXPath.c xmllint.c xmlschemastypes.c: applied patch from Mark Vakoc avoiding using xmlParse* option and use xmlRead* instead * win32/Makefile.bcb: patch to Borland C++ builder from Eric Zurcher to avoid problems with some pathnames. Tue Mar 23 12:35:08 CET 2004 Daniel Veillard * configure.in doc/* News: preparing 2.6.8 release, updated and rebuilt the docs. * Makefile.am: use valgring fro the new Python based regression tests Mon Mar 22 20:07:27 CET 2004 Daniel Veillard * relaxng.c: remove a memory leak on schemas type facets. * check-relaxng-test-suite.py check-relaxng-test-suite2.py check-xsddata-test-suite.py: reduce verbosity * configure.in Makefile.am: incorporated the Python regressions tests for Relax-NG and Schemas Datatype to "make tests" Mon Mar 22 16:16:18 CET 2004 Daniel Veillard * xmlwriter.c include/libxml/xmlwriter.h doc/* : applied patch from Alfred Mickautsch for better DTD support. * SAX2.c HTMLparser.c parser.c xinclude.c xmllint.c xmlreader.c xmlschemas.c: fixed bug #137867 i.e. fixed properly the way reference counting is handled in the XML parser which had the side effect of removing a lot of hazardous cruft added to try to fix the problems associated as they popped up. * xmlIO.c: FILE * close fixup for stderr/stdout Sun Mar 21 19:19:41 HKT 2004 William Brack * relaxng.c: added an error message when an element is not found within a (bug 126093) Sat Mar 20 22:25:18 HKT 2004 William Brack * xmlregexp.c: enhanced the logic of parsing char groups to better handle initial or ending '-' (bug 135972) Sat Mar 20 19:26:03 HKT 2004 William Brack * relaxng.c: added check for external reference in xmlRelaxNGGetElements (bug 137718) * test/relaxng/rngbug-001.*, result/relaxng/rngbug-001*: added regression test for above Wed Mar 17 16:37:22 HKT 2004 William Brack * nanohttp.c: added a close for the local file descriptor (bug 137474) Mon Mar 15 15:46:59 CET 2004 Daniel Veillard * xmlsave.c: switched the output routines to use the new context. Mon Mar 15 10:37:18 HKT 2004 William Brack * relaxng.c: enhanced to ignore XML_XINCLUDE_START and XML_XINCLUDE_END nodes (bug 137153) Sun Mar 14 13:19:20 CET 2004 Daniel Veillard * xmlschemastypes.c: applied patch from John Belmonte for anyURI. Wed Mar 10 17:22:48 CET 2004 Daniel Veillard * parser.c: fix bug reported by Holger Rauch * test/att8 result/noent/att8 result/att8 result/att8.rdr result/att8.sax: added the test to th regression suite Wed Mar 10 19:42:22 HKT 2004 William Brack * doc/search.php: Minor change for later verson of php requiring $HTTP_GET_VARS. Wed Mar 10 00:12:31 HKT 2004 William Brack * tree.c: Changed the flag to xmlDocCopyNode (and similar routines), previously used only for recursion, to use a value of '2' to indicate copy properties & namespaces, but not children. * xinclude.c: changed the handling of ranges to use the above new facility. Fixes Bug 134268. Tue Mar 9 18:48:51 HKT 2004 William Brack * win32/Makefile.bcb, win32/Makefile.mingw, win32/Makefile.msvc: added new module xmlsave with patch supplied by Eric Zurcher (second attempt - don't know what happened to the first one!) Tue Mar 9 09:59:25 CET 2004 Daniel Veillard * python/libxml.c python/libxml.py: applied patch from Anthony Carrico providing Python bindings for the Canonicalization C14N support. Mon Mar 8 11:12:23 CET 2004 Hagen Moebius * .cvsignore and python/.cvsignore patched Mon Mar 8 22:33:14 HKT 2004 William Brack * xinclude.c: enhanced to assure that if xpointer is called for a document, the XML_PARSE_NOENT flag is set before parsing the included document so that entities will automatically get taken care of. * xpointer.c: corrected code so that, if an XML_ENTITY_REF node is encountered, it will log it and not crash (bug 135713) Sun Mar 7 19:03:48 HKT 2004 William Brack * xinclude.c: modified to make sub-includes inherit the parse flags from the parent document (bug 132597) Fri Mar 5 01:13:22 CET 2004 Daniel Veillard * xmlschemas.c: QName handling fixes for the XML Schemas support from Adam Dickmeiss * test/schemas/po1_0.xsd: also fix the schemas * test/schemas/ns[12]* result/schemas/ns[12]*: added the specific regression tests Thu Mar 4 23:03:02 CET 2004 Daniel Veillard * configure.in doc/Makefile.am include/libxml/Makefile.am: paalied patch from Julio M. Merino Vidal fixing bug #134751 to fix --with-html-dir option. * doc/*: rebuilt fully the docs * doc/html/libxml-xmlsave.html: new file from new header. Thu Mar 4 16:57:50 CET 2004 Daniel Veillard * debugXML.c testHTML.c tree.c doc/examples/*.c include/libxml/xmlsave.h: fixing compilation bug with some options disabled as well as --with-minimum should fix #134695 Thu Mar 4 15:00:45 CET 2004 Daniel Veillard * xmlcatalog.c: allow fallback to URI lookup when SYSTEM fails, should close #134092 Thu Mar 4 14:39:38 CET 2004 Daniel Veillard * Makefile.am tree.c xmlsave.c include/libxml/xmlsave.h: commiting the new xmlsave module before the actuall big code change. Thu Mar 4 12:38:53 CET 2004 Daniel Veillard * xmlschemas.c: applied patch from Adam Dickmeiss for mixed content * test/schemas/mixed* result/schemas/mixed*: added his regression tests too. Mon Mar 1 15:22:06 CET 2004 Daniel Veillard * testSAX.c: fix a compilation problem about a missing timb include Sat Feb 28 22:35:32 HKT 2004 William Brack * testSAX.c: small enhancement to prevent trying to print strings with null pointers (caused "make tests" errors on HP-UX) Thu Feb 26 20:19:40 MST 2004 John Fleck * doc/xmllint.xml * doc/xmllint.1 * doc/xmllint.html * doc/xmlcatalog_man.xml * doc/xmlcatalog.1 * doc/xmlcatalog_man.html applying patch from Mike Hommey to clarify XML_CATALOG_FILES use Thu Feb 26 23:47:43 CET 2004 Daniel Veillard * Makefile.am: patch for cross-compilation to Windows from Christophe de VIENNE. Thu Feb 26 18:52:11 HKT 2004 William Brack * doc/*.html, doc/html/*.html: regenerated docs using older version of xsltproc pending resolution of AVT problem Thu Feb 26 10:56:29 CET 2004 Daniel Veillard * Makefile.am: applied patch from Charles Bozeman to not use the system xmllint. Wed Feb 25 18:07:05 CET 2004 Daniel Veillard * include/libxml/xmlexports.h: applied patch from Roland Schwingel for MingW Wed Feb 25 13:57:25 CET 2004 Daniel Veillard * Makefile.am catalog.c configure.in: applied a cleanup patch from Peter Breitenlohner * tree.c: removed a doc build warning by fixing a param comment * doc/* : rebuilt the docs Wed Feb 25 13:33:07 CET 2004 Daniel Veillard * valid.c HTMLparser.c: avoid ID error message if using HTML_PARSE_NOERROR should fix #130762 Wed Feb 25 12:50:53 CET 2004 Daniel Veillard * debugXML.c relaxng.c valid.c xinclude.c xmllint.c xmlreader.c: fixing compilation and link option when configuring with --without-valid should fix #135309 Wed Feb 25 11:36:06 CET 2004 Daniel Veillard * catalog.c: fixed the main issues reported by Peter Breitenlohner * parser.c: cleanup * valid.c: speedup patch from Petr Pajas Wed Feb 25 16:07:14 HKT 2004 William Brack * xpath.c: fixed a memory leak (xmlXPathLangFunction) reported on the list by Mike Hommey Mon Feb 23 17:28:34 CET 2004 Daniel Veillard * doc/* NEWS configure.in: preparing 2.6.7 release, updated and rebuilt the documentation. Mon Feb 23 11:52:12 CET 2004 Daniel Veillard * python/tests/*.py: applied patch from Malcolm Tredinnick to avoid tabs in python sources, should fix #135095 Sun Feb 22 23:16:23 CET 2004 Daniel Veillard * testSAX.c: add --timing option * relaxng.c: use the psvi field of the nodes instead of _private which may be used for other purposes. Sat Feb 21 16:57:48 CET 2004 Daniel Veillard * encoding.c: small patch to try to fix a warning with Sun One compiler Sat Feb 21 16:22:35 CET 2004 Daniel Veillard * encoding.c: small patch removing a warning with MS compiler. Sat Feb 21 13:52:30 CET 2004 Daniel Veillard * debugXML.c: added "relaxng" option to the debugging shell * Makefile.am test/errors/* result/errors/*: some regression tests for some error tests cases. Fri Feb 20 09:56:47 CET 2004 Daniel Veillard * tree.c: xmlAttrSerializeTxtContent don't segfault if NULL is passed. * test/att7 result//att7*: adding an old regression test laying around on my laptop Thu Feb 19 17:33:36 CET 2004 Daniel Veillard * xmlreader.c: fixed xmllint --memory --stream memory consumption on large file by using xmlParserInputBufferCreateStatic() with the mmap'ed file Thu Feb 19 13:56:53 CET 2004 Daniel Veillard * tree.c: some clarification in xmlDocDumpMemory() documentation * xmllint.c: fixed xmllint --stream --timing to get timings back Wed Feb 18 15:20:42 CET 2004 Daniel Veillard * parser.c: fixed a problem in push mode when attribute contains unescaped '>' characters, fixes bug #134566 * test/att6 result//att6*: added the test to the regression suite Tue Feb 17 17:26:31 CET 2004 Daniel Veillard * valid.c: removing a non-linear behaviour from ID/IDREF raised by Petr Pajas. Call xmlListAppend instead of xmlListInsert in xmlAddRef Tue Feb 17 13:27:27 CET 2004 Daniel Veillard * python/tests/indexes.py python/tests/reader.py: indicated encoding of the test file, needed for python 2.3 Tue Feb 17 21:08:11 HKT 2004 William Brack * xpath.c: fixed problem with numbers having > 19 fractional places (bug 133921) Tue Feb 17 12:47:20 CET 2004 Daniel Veillard * xpath.c: applied optimization patch from Petr Pajas Tue Feb 17 12:39:08 CET 2004 Daniel Veillard * xmlwriter.c include/libxml/xmlwriter.h: applied update from Alfred Mickautsch and the added patch from Lucas Brasilino Sun Feb 15 12:01:30 CET 2004 Daniel Veillard * benchmark.png index.html xml.html: updating the benchmark graph and using a PNG instead of a GIF * xmlreader.c: updated the TODO Sat Feb 14 18:55:40 MST 2004 John Fleck * doc/tutorial/xmltutorial.xml * doc/tutorial/xmltutorial.pdf * doc/tutorial/*.html Fix bug in XPath example in the tutorial, thanks to Carlos, whose last name I don't know, for pointing this out Thu Feb 12 16:28:12 CET 2004 Daniel Veillard * NEWS configure.in: preparing release of 2.6.6 * doc/*: updated the docs and rebuilt them Thu Feb 12 13:41:16 CET 2004 Daniel Veillard * xmlregexp.c: fixing bug #132930 with the provided patch, a bit suspicious about it but this is fairly contained and regression tests still passes. * test/schemas/all1* result/schemas/all1*: added the test to the regression suite. Thu Feb 12 12:54:26 CET 2004 Daniel Veillard * parser.c: fixed bug #132575 about finding the end of the internal subset in push mode. * test/intsubset.xml result/intsubset.xml* result/noent/intsubset.xml: added the test to the regression suite Wed Feb 11 14:19:31 CET 2004 Daniel Veillard * parserInternals.c xmlIO.c encoding.c include/libxml/parser.h include/libxml/xmlIO.h: added xmlByteConsumed() interface * doc/*: updated the benchmark rebuilt the docs * python/tests/Makefile.am python/tests/indexes.py: added a specific regression test for xmlByteConsumed() * include/libxml/encoding.h rngparser.c tree.c: small cleanups Wed Feb 11 08:13:58 HKT 2004 William Brack * encoding.c: applied patch supplied by Christophe Dubach to fix problem with --with-minimum configuration (bug 133773) * nanoftp.c: fixed potential buffer overflow problem, similar to fix just applied to nanohttp.c. Mon Feb 9 18:40:21 CET 2004 Igor Zlatkovic * nanohttp.c: fixed the fix for the buffer overflow, thanx William :-) Mon Feb 9 22:37:14 HKT 2004 William Brack * acinclude.m4, configure.in: fixed problem concerning determining SOCKLEN_T as pointed out by Daniel Richard G. on the mailing list Mon Feb 9 15:31:24 CET 2004 Igor Zlatkovic * nanohttp.c: fixed buffer overflow reported by Yuuichi Teranishi Mon Feb 9 13:45:59 CET 2004 Daniel Veillard * xpath.c: small patch from Philip Ludlam to avoid warnings. Mon Feb 9 13:41:47 CET 2004 Daniel Veillard * encoding.c: applied a small patch from Alfred Mickautsch to avoid an out of bound error in isolat1ToUTF8() Mon Feb 9 13:35:50 CET 2004 Daniel Veillard * xinclude.c: remove the warning on the 2001 namespace * parser.c parserInternals.c xpath.c: remove some warnings when compiling with MSVC6 * nanohttp.c: applied a patch when using _WINSOCKAPI_ Sun Feb 8 12:09:55 HKT 2004 William Brack * xinclude.c: added a small hack to fix interference between my fixes for bugs 132585 and 132588. * python/libxml.c: fixed problem with serialization of namespace reported on the mailing list by Anthony Carrico Sat Feb 7 16:53:11 HKT 2004 William Brack * xinclude.c: fixed problem with function xmlXIncludeCopyRange (bug 133686). Fri Feb 6 21:03:41 HKT 2004 William Brack * xmlwriter.c: fixed problem with return value of xmlTextWriterWriteIndent() (bug 133297) Fri Feb 6 19:07:04 HKT 2004 William Brack * xinclude.c: changed coding to output good XIncludes when one or more bad ones are present (bug 132588) Fri Feb 6 17:34:21 HKT 2004 William Brack * xinclude.c: corrected handling of empty fallback condition (bug 132585) Fri Feb 6 15:28:36 HKT 2004 William Brack * HTMLparser.c: added initialisation for ctxt->vctxt in HTMLInitParser (bug 133127) * valid.c: minor cosmetic change (removed ATTRIBUTE_UNUSED from several function params) Tue Feb 3 16:48:57 PST 2004 William Brack * xinclude.c: fixed problem regarding freeing of dictionary when there are errors within an XInclude file (bug 133106). Thanks to Oleg Paraschenko for the assistance. Tue Feb 3 09:53:18 PST 2004 William Brack * xmlschemastypes.c: fixed validation of maxLength with no content using patch submitted by Eric Haszlakiewicz (bug 133259) Tue Feb 3 09:21:09 CET 2004 Igor Zlatkovic * include/libxml/xmlreader.h include/libxml/xmlmemory.h: added calling convention to the public function prototypes (rep by Cameron Johnson) * include/libxml/xmlexports.h: fixed mingw+msys compilation (rep by Mikhail Grushinskiy) Mon Feb 2 20:22:18 PST 2004 William Brack * xmlwriter.c: enhanced output indenting (bug 133264) Mon Feb 2 16:13:33 PST 2004 William Brack * xmlreader.c, include/libxml/xmlreader.h: applied patch from Steve Ball to provide structured error reports. Sun Feb 1 01:48:14 PST 2004 William Brack * tree.c, include/libxml/tree.h: moved serialization of attribute text data (xmlSerializeContent) into a separate routine (xmlSerializeTxtContent) so it can be used by xmlwriter.c * xmlwriter.c: changed handling of attribute string to use the routine above (fixed bug 131548) Sat Jan 31 08:22:02 MST 2004 John Fleck 2.6, rebuild html - this time doing it correctly :-) Fri Jan 30 20:45:36 MST 2004 John Fleck * doc/examples/examples.xml * doc/examples/*.html add note that reader examples need libmxl2 > 2.6, rebuild html Thu Jan 29 23:51:48 PST 2004 William Brack * xpath.c: added (void *) type override to prevent warning on Solaris (Bug 132671) Wed Jan 28 07:20:37 MST 2004 John Fleck * doc/examples/Makefile.am per Jan. 15 email to the list from oliverst, the index.html file from this directory wasn't making it into the tarball Mon Jan 26 18:01:00 CET 2004 Daniel Veillard * acinclude.m4: applied fix from Alexander Winston for a problem related to automake-1.8 , c.f. #132513 and #129861 Mon Jan 26 12:53:11 CET 2004 Daniel Veillard * doc/examples/index.py: don't rely on . being on the path for make tests, should keep Mr. Crozat quiet until next time... Sun Jan 25 21:45:03 CET 2004 Daniel Veillard * configure.in NEWS doc/*: preparing release 2.6.5, rebuilt the docs, checked rngparser stuff does not end up in the tarball Sun Jan 25 20:59:20 CET 2004 Daniel Veillard * python/libxml.c: applied patch from Frederic Peters fixing the wrong arg order in xpath callback in bug #130980 Sun Jan 25 20:52:09 CET 2004 Daniel Veillard * xinclude.c: fixing #130453 XInclude element with no href attribute * relaxng.c rngparser.c include/libxml2/relaxng.h: fully integrating the compact syntax will require more work, postponed for the 2.6.5 release. Sat Jan 24 09:30:22 CET 2004 Daniel Veillard * include/libxml/schemasInternals.h xmlschemas.c: applied patch from Steve Ball to avoid a double-free. Fri Jan 23 14:03:21 CET 2004 Daniel Veillard * doc/examples/*: added io1.c an example ox xmlIO usage and io1.res test result, fixed a awful lot of memory leaks showing up in testWriter.c, changed the examples and the Makefiles to test memory leaks. * xmlwriter.c: fixed a memory leak * Makefile.am: run the doc/examples regression tests as part of make tests * xpath.c include/libxml/xpath.h: added xmlXPathCtxtCompile() to compile an XPath expression within a context, currently the goal is to be able to reuse the XSLT stylesheet dictionnary, but this opens the door to others possible optimizations. * dict.c include/libxml/dict.h: added xmlDictCreateSub() which allows to build a new dictionnary based on another read-only dictionnary. This is needed for XSLT to keep the stylesheet dictionnary read-only while being able to reuse the strings for the transformation dictionnary. * xinclude.c: fixed a dictionnar reference counting problem occuring when document parsing failed. * testSAX.c: adding option --repeat for timing 100times the parsing * doc/* : rebuilt all the docs Thu Jan 22 14:17:05 2004 Aleksey Sanin * xmlmemory.c: make xmlReallocLoc() accept NULL pointer Thu Jan 22 08:26:20 CET 2004 Daniel Veillard * xmlschemastypes.c: applied patch from John Belmonte for normalizedString datatype support. Thu Jan 22 10:43:22 HKT 2004 William Brack * xpath.c: fixed problem with union when last() is used in predicate (bug #131971) * xpointer.c: minor change to comment for doc generation Wed Jan 21 17:03:17 CET 2004 Daniel Veillard * parser.c: fixed bug #131745 raised by Shaun McCance with the suggested patch Wed Jan 21 10:59:55 CET 2004 Daniel Veillard * xmlwriter.c: applied patch from Alfred Mickautsch fixing a memory leak reported on the list. Thu Jan 15 00:48:46 CET 2004 Daniel Veillard * python/generator.py python/tests/tstLastError.py: applied patch from Stéphane Bidoul to add enums to the Python bindings. Tue Jan 13 21:50:05 CET 2004 Daniel Veillard * testHTML.c: another small patch from Mark Vakoc Tue Jan 13 21:39:58 CET 2004 Daniel Veillard * HTMLparser.c relaxng.c testRelax.c testSchemas.c: applied patch from Mark Vakoc to not use SAX1 unless necessary. Mon Jan 12 17:22:57 CET 2004 Daniel Veillard * dict.c parser.c xmlstring.c: some parser optimizations, xmllint --memory --timing --repeat --stream ./db10000.xml went down from 16.5 secs to 15.5 secs. Thu Jan 8 17:57:50 CET 2004 Daniel Veillard * xmlschemas.c: removed a memory leak remaining from the switch to a dictionnary for string allocations c.f. #130891 Thu Jan 8 17:48:46 CET 2004 Daniel Veillard * xmlreader.c: fixing some problem if configured --without-xinclude c.f. #130902 Thu Jan 8 17:42:48 CET 2004 Daniel Veillard * configure.in: changed AC_OUTPUT() macro to avoid a cygwin problem c.f. #130896 Thu Jan 8 00:36:00 CET 2004 Daniel Veillard * win32/Makefile.bcb win32/Makefile.mingw win32/Makefile.msvc: applying patch from Mark Vakoc for Windows * doc/catalog.html doc/encoding.html doc/xml.html: applied doc fixes from Sven Zimmerman Tue Jan 6 23:51:46 CET 2004 Daniel Veillard * python/libxml2-python-api.xml python/libxml_wrap.h python/types.c python/tests/Makefile.am python/tests/tstLastError.py: applied patch from Stéphane Bidoul for structured error handling from python, and the associated test Tue Jan 6 23:18:11 HKT 2004 William Brack * configure.in: fixed Bug130593 * xmlwriter.c: fixed compilation warning Tue Jan 6 15:15:23 CET 2004 Daniel Veillard * include/libxml/xmlstring.h: fixed the comment in the header * doc/*: rebuilt the docs Tue Jan 6 19:40:04 HKT 2004 William Brack * encoding.c, parser.c, xmlstring.c, Makefile.am, include/libxml/Makefile.am, include/libxml/catalog.c, include/libxml/chvalid.h, include/libxml/encoding.h, include/libxml/parser.h, include/libxml/relaxng.h, include/libxml/tree.h, include/libxml/xmlwriter.h, include/libxml/xmlstring.h: moved string and UTF8 routines out of parser.c and encoding.c into a new module xmlstring.c with include file include/libxml/xmlstring.h mostly using patches from Reid Spencer. Since xmlChar now defined in xmlstring.h, several include files needed to have a #include added for safety. * doc/apibuild.py: added some additional sorting for various references displayed in the APIxxx.html files. Rebuilt the docs, and also added new file for xmlstring module. * configure.in: small addition to help my testing; no effect on normal usage. * doc/search.php: added $_GET[query] so that persistent globals can be disabled (for recent versions of PHP) Mon Jan 5 20:47:07 MST 2004 John Fleck * doc/tutorial/customfo.xsl * doc/tutorial/customhtml.xsl update custom tutorial-building stylesheets in preparation for tutorial update Tue Jan 6 00:10:33 CET 2004 Daniel Veillard * rngparser.c: commiting the compact relax ng parser. It's not completely finished, it's not integrated but I want to save the current state Mon Jan 5 22:22:48 HKT 2004 William Brack * doc/apibuild.py, doc/APIconstructors.html, doc/libxml2-refs.xml, win32/libxml2.def.src: fixed apibuild.py's generation of "constructors" to be in alphabetical order (instead of previous random sequence); regenerated resulting files. Mon Jan 5 14:03:59 CET 2004 Daniel Veillard * xmlwriter.c: applied patch from Lucas Brasilino fixing an indent problem. Sun Jan 4 18:54:29 MST 2004 John Fleck * doc/newapi.xsl: change background color of function declaration to improve readability * doc/*: rebuild docs with new stylesheet Sun Jan 4 22:45:14 HKT 2004 William Brack * parser.c, include/libxml/parser.h: added a routine xmlStrncatNew to create a new string from 2 frags. * tree.c: added code to check if node content is from dictionary before trying to change or concatenate. Sun Jan 4 08:57:51 HKT 2004 William Brack * xmlmemory.c: applied suggestion from Miloslav Trmac (see Bug 130419) and eliminated xmlInitMemoryDone. More improvement needed. * xml2-config.in: added an additional flag (--exec-prefix) to allow library directory to be different from include directory (Bug 129558). Fri Jan 2 21:22:18 CET 2004 Daniel Veillard * error.c: applied patch from Stéphane Bidoul for structured error reporting. Fri Jan 2 21:03:17 CET 2004 Daniel Veillard * include/libxml/xmlwriter.h xmlwriter.c: applied the patch from Lucas Brasilino to add indentation support to xmlWriter Fri Jan 2 22:58:29 HKT 2004 William Brack * xinclude.c: fixed problem with "recursive" include (fallback contains another include - Bug 129969) Fri Jan 2 11:40:06 CET 2004 Daniel Veillard * SAX2.c: found and fixed a bug misallocating some non blank text node strings from the dictionnary. * xmlmemory.c: fixed a problem with the memory debug mutex release. Wed Dec 31 22:02:37 HKT 2003 William Brack * xinclude.c: fixed problem caused by wrong dictionary reference count, reported on the list by Christopher Grayce. Wed Dec 31 15:55:55 HKT 2003 William Brack * python/generator.py, python/libxml2class.txt: fixed problem pointed out by Stéphane Bidoul on the list. * xinclude.c, xpointer.c, xpath.c, include/libxml/xpointer.h: completed modifications required to fix Bug 129967 (at last!). Now wait to see how long before further trouble... Tue Dec 30 16:26:13 HKT 2003 William Brack * parser.c, xmlmemory.c, include/libxml/xmlmemory.h: Fixed memory leak reported by Dave Beckett * xmlschemas.c: Removed spurious comment reported on the mailing list * xinclude.c, xpath.c, xpointer.c, libxml/include/xpointer.h: Further work on Bug 129967 concerning xpointer range handling and range-to function; much better, but still not complete Mon Dec 29 18:08:05 CET 2003 Daniel Veillard * valid.c: xmlValidateElement could crash for element holding a namespace declaration but not in a namespace. Oliver Fischer provided the example. Mon Dec 29 11:29:31 CET 2003 Daniel Veillard * xmllint.c: issue validation status on stderr, not stdout as suggested by Pawel Palucha * result/relaxng/*: this change slightly all the output from RNG regressions. Mon Dec 28 10:47:32 HKT 2003 William Brack * xmlschemas.c: edited a couple of comments in accordance with posting on the mailing list (no logic change) * xpointer.c: working on Bug 129967, added check for NULL nodeset to prevent crash. Further work required. * xpath.c: working on Bug 129967, added code to handle XPATH_LOCATIONSET in RANGETO code, also added code to handle it in xmlXPathEvaluatePredicateResult. Further work required. Sat Dec 27 12:32:58 HKT 2003 William Brack * xmlschemas.c: added tests for xs:all to assure minOccurs and maxOccurs <= 1 (Bug 130020) Sat Dec 27 09:53:06 HKT 2003 William Brack * xmlregexp.c: fixed xmlFAParseCharRange for Unicode ranges with patch from Charles Bozeman. Fri Dec 26 14:03:41 HKT 2003 William Brack * xmlregexp.c: fixed problem causing segfault on validation error condition (reported on mailing list) Thu Dec 25 21:16:22 HKT 2003 William Brack * xmlschemas.c: fixed missing dictionaries for Memory and Doc parser contexts (problem reported on mailing list) * doc/apibuild.py: small change to prevent duplicate lines on API functions list. It will take effect the next time the docs are rebuilt. Wed Dec 24 12:54:25 CET 2003 Daniel Veillard * configure.in NEWS doc/*: updated the docs and prepared a new release 2.6.4 Wed Dec 24 12:07:52 CET 2003 Daniel Veillard * legacy.c: remove deprecated warning on startElement() Wed Dec 24 12:04:35 CET 2003 Daniel Veillard * xinclude.c result/XInclude/nodes2.*: XInclude xpointer support was broken with the new namespace. Fixes #129932 Wed Dec 24 00:29:30 CET 2003 Daniel Veillard * xmlschemas.c include/libxml/schemasInternals.h: types might be redefined in includes, quick fix to allow this but lacks the equality of the redefinition test. Tue Dec 23 15:14:37 HKT 2003 William Brack * valid.c: fixed bug concerning validation using external dtd of element with mutiple namespace declarations (Bug 129821) Tue Dec 23 11:41:42 HKT 2003 William Brack * tree.c: inhibited production of "(null):" in xmlGetNodePath when node has default namespace (Bug 129710) Tue Dec 23 09:29:14 HKT 2003 William Brack * xpath.c: small enhancement to xmlXPathCmpNodes to assure document order for attributes is retained (Bug 129331) Mon Dec 22 19:06:16 CET 2003 Daniel Veillard * parser.c xmlreader.c: change xmlReadFd() xmlCtxtReadFd() xmlReaderNewFd() xmlReaderForFd(), change those to not close the file descriptor. Updated the comment, should close #129683 Mon Dec 22 00:34:09 CET 2003 Daniel Veillard * xinclude.c: fixed a serious problem in XInclude #129021 Sun Dec 21 13:59:54 CET 2003 Daniel Veillard * parser.c: fixed bug #129489, propagation of parsing flags in entities. * parser.c xmlreader.c: improved the comments of parsing options Sun Dec 21 18:14:04 HKT 2003 William Brack * python/Makefile.am, python/tests/Makefile.am, doc/Makefile.am: applied fixes to allow build from 'outside' directory (Bug 129172) Sat Dec 20 16:42:07 MST 2003 John Fleck * tree.c - add explanation of namespace inheritance when ns is NULL to xmlNewChild and xmlNewTextChild API doc Sat Dec 20 18:17:28 HKT 2003 William Brack * include/libxml/xpathInternals.h: undid last change (my bad). Put necessary fix in libxslt/libexslt instead. * include/libxml/DOCBparser.h: put test for __GCC__ on warning directive (Bug 129105) Sat Dec 20 10:48:37 HKT 2003 William Brack * include/libxml/xpathInternals.h: fixed xmlXPathReturnString to cater for NULL pointer (bug 129561) * globals.c: added comment to suppress documentation warning * doc/apibuild.py: fixed problem which caused last APIchunkxx.html to be lost. Rebuilt doc/* (including adding APIchunk26.html) Fri Dec 19 18:24:02 CET 2003 Daniel Veillard * xmlreader.c: trying to fix #129692 xmlTextReaderExpand() when using an xmlReaderWalker() Thu Dec 18 20:10:34 MST 2003 John Fleck * tree.c: fix misc. typos in doc comments * include/libxml/tree.h: elaborate on macro define doc comments * doc/*: rebuild docs Wed Dec 17 16:07:33 CET 2003 Daniel Veillard * doc/examples/*: don't call the result files .out but .res as the Makefiles tend to try generating binaries for .out targets... Tue Dec 16 20:53:54 MST 2003 John Fleck * doc/html/libxml-pattern.html: - cvs add API docs for new pattern stuff Tue Dec 16 20:40:40 MST 2003 John Fleck * tree.c * doc/*: Elaborate in documentation discussion of xmlNewChild and xmlNewTextChild. Thanks to Steve Lenti for pointing out the usefulness of a more explicit explanation of the reserved character escaping issue. Fri Dec 12 15:55:15 CET 2003 Daniel Veillard * xmlcatalog.c: applied patch from Stefan Kost Thu Dec 11 15:15:31 CET 2003 Daniel Veillard * doc/examples/testWriter.c: applied small fix from Lucas Brasilino Thu Dec 11 14:55:22 CET 2003 Igor Zlatkovic * win32/Makefile.* win32/configure.js: Added pattern support Wed Dec 10 14:11:20 CET 2003 Daniel Veillard * configure.in doc/* libxml.spec.in: preparing release of libxml2-2.6.3, updated and regenerated the docs. Wed Dec 10 11:43:33 CET 2003 Daniel Veillard * SAX2.c pattern.c: removed some compilation warnings Wed Dec 10 11:16:29 CET 2003 Daniel Veillard * xmllint.c: fixing bug #119264 xmllint failing to report serialization errors in some cases. Tue Dec 9 23:50:23 CET 2003 Daniel Veillard * entities.c: fixed an XML entites content serialization potentially triggered by XInclude, see #126817 Tue Dec 9 16:12:50 CET 2003 Daniel Veillard * xmlwriter.c: applied the patch to xmlTextWriterStartPI() suggested by Daniel Schulman in #128313 Tue Dec 9 15:18:32 CET 2003 Daniel Veillard * configure.in Makefile.am: another patch from Kenneth Haley for Mingw, c.f. #128787 Tue Dec 9 15:07:09 CET 2003 Daniel Veillard * include/libxml/xmlexports.h: applied patch from Kenneth Haley for compiling on Mingw see #128786 Tue Dec 9 14:52:59 CET 2003 Daniel Veillard * xmllint.c: some flags were not passed down correctly as parsing options. Fixes #126806 Tue Dec 9 12:29:26 CET 2003 Daniel Veillard * xinclude.c xmllint.c xmlreader.c include/libxml/xinclude.h include/libxml/xmlerror.h: augmented the XInclude API to be able to pass XML parser flags down to the Inclusion process. Also resynchronized with the Last Call W3C Working Draft 10 November 2003 for the xpointer attribute. * Makefile.am test/XInclude/docs/nodes[23].xml result/XInclude/*: augmented the tests for the new namespace and testing the xpointer attribute, changed the way error messages are tested * doc/*: regenerated the documentation Mon Dec 8 18:38:26 CET 2003 Daniel Veillard * error.c: filter warning messages if the global setting blocks them * xinclude.c xmlreader.c include/libxml/xinclude.h include/libxml/xmlerror.h: updated the change of namespace at the XInclude level, raise a warning if the old one is found, and some cleanup Mon Dec 8 13:09:39 CET 2003 Daniel Veillard * tree.c: tentative fix for #126117 character reference in attributes output problem in some cornercase. Mon Dec 8 11:08:45 CET 2003 Daniel Veillard * python/libxml.py: tried to fix the problems reported in bug #126735 * xpath.c SAX2.c error.c parser.c valid.c include/libxml/xmlerror.h: fixed again some problem trying to use the structured error handlers, c.f. bug #126735 * result/VC/ElementValid: tiny change due to the fix Sun Dec 7 22:27:31 CET 2003 Daniel Veillard * error.c: fixed __xmlRaiseError to use structured error handlers defined by xmlSetStructuredErrorFunc(), fixes bug #126211 Sun Dec 7 20:30:53 CET 2003 Daniel Veillard * parser.c: attempt to fix #126211 ... Fri Dec 5 17:07:29 CET 2003 Daniel Veillard * pattern.c xmlreader.c xmllint.c include/libxml/pattern.h include/libxml/xmlreader.h: fixed the pattern interfaces but not yet the parser to handle the namespaces. * doc/examples/reader3.c doc/*: fixed the example, rebuilt the docs. Fri Dec 5 15:49:44 CET 2003 Daniel Veillard * globals.c xmlwriter.c doc/apibuild.py include/libxml/globals.h include/libxml/pattern.h include/libxml/schemasInternals.h include/libxml/xmlexports.h include/libxml/xmlwriter.h: cleanup the make rebuild in doc, this include new directive to stop documentation warnings * doc/* doc/html/*: rebuilt the docs * pattern.c xmlreader.c include/libxml/pattern.h include/libxml/xmlreader.h: adding xmlTextReaderPreservePattern() to save nodes while scanning the tree with the reader, cleanup the way element were freed, and xmlTextReaderPreserve() implementation, the API might change for namespace binding support when compiling patterns. * doc/examples/*: added reader3.c exposing the xmlTextReaderPreserve() Thu Dec 4 15:10:57 CET 2003 Daniel Veillard * python/libxml.py: oops forgot to modify/commit the new code. Thu Dec 4 13:29:19 CET 2003 Daniel Veillard * python/generator.py python/libxml.c python/libxml_wrap.h: cleanup the output buffer support to at least get the basic to work * python/tests/outbuf.py python/tests/serialize.py: fixes and cleanup. * include/libxml/xmlwriter.h: cleanup Wed Dec 3 21:38:56 MST 2003 John Fleck * include/libxml/xmlversion.h.in * doc/*: add WITH_TRIO comment so it shows up in the docs, rebuild docs Wed Dec 3 13:10:08 CET 2003 Daniel Veillard * config.h.in configure.in xmlregexp.c: fix bug #128401 affecting regexp quantifiers Tue Dec 2 23:29:56 CET 2003 Daniel Veillard * pattern.c include/libxml/pattern.h: adding the pattern node selection code. Inheried in part from libxslt but smaller. * Makefile.am configure.in include/libxml/xmlversion.h.in: integrated the pattern module, made it a configure time option * xmllint.c: added --pattern to test when doing --stream Tue Dec 2 11:25:25 CET 2003 Daniel Veillard * xmlreader.c: fixed a problem in xmlreader validation when streaming exposed by reader2 example. Mon Dec 1 20:40:51 MST 2003 John Fleck * doc/xml.html * doc/docs.html: add reference to the Code Examples page to docs.html list of resources Mon Dec 1 12:30:28 CET 2003 Igor Zlatkovic * win32/Makefile.bcb win32/configure.js: Applied the BCB patch from Eric Sun Nov 30 21:33:37 MST 2003 John Fleck * include/libxml/xinclude.h * doc/*: Add comments for macro definitions in xinclude.h and rebuild the docs Sun Nov 30 21:06:29 MST 2003 John Fleck * doc/docdescr.doc Updating William's explanation of how to build docs, reflecting Daniel's new docs build system Sat Nov 29 18:38:22 HKT 2003 William Brack * xmlmemory.c: enhanced by adding mutex to protect global structures in a multi-threading environment. This fixed some random errors on the Threads regression tests. Fri Nov 28 21:39:49 MST 2003 John Fleck * doc/xml.html doc/python.html: fix tst.py text, which didn't import sys Fri Nov 28 17:28:47 HKT 2003 William Brack * encoding.c, include/libxml/encoding.h: Enhanced the handling of UTF-16, UTF-16LE and UTF-16BE encodings. Now UTF-16 output is handled internally by default, with proper BOM and UTF-16LE encoding. Native UTF-16LE and UTF-16BE encoding will not generate BOM on output, and will be automatically recognized on input. * test/utf16lebom.xml, test/utf16bebom.xml, result/utf16?ebom*: added regression tests for above. Thu Nov 27 19:25:10 CET 2003 Igor Zlatkovic * win32/Makefile.* win32/configure.js: Modified to allow coexistent build with all compilers. Added C-Runtime option for MSVC. Included xmlWriter. * xmlwriter.c: Added IN_LIBXML macro Wed Nov 26 21:54:01 CET 2003 Igor Zlatkovic * win32/Makefile.bcb: applied patch from Eric Wed Nov 26 21:33:14 CET 2003 Daniel Veillard * include/libxml/tree.h: stefan on IRC pointed out that XML_GET_LINE is broken on 2.6.x Tue Nov 25 18:39:44 CET 2003 Daniel Veillard * entities.c: fixed #127877, never output " in element content * result/isolat3 result/slashdot16.xml result/noent/isolat3 result/noent/slashdot16.xml result/valid/REC-xml-19980210.xml result/valid/index.xml result/valid/xlink.xml: this changes the output of a few tests Tue Nov 25 16:36:21 CET 2003 Daniel Veillard * include/libxml/schemasInternals.h include/libxml/xmlerror.h testSchemas.c xmlschemas.c: added xsd:include support, fixed testSchemas behaviour when a schemas failed to parse. * test/schemas/vdv-* result/schemas/vdv-first5_0_0*: added one test for xsd:include from Eric Van der Vlist Tue Nov 25 08:18:12 CET 2003 Daniel Veillard * parser.c: swapped the attribute defaulting and attribute checking parts of parsing a new element start, fixes bug #127772 * result/valid/127772.* test/valid/127772.xml test/valid/dtds/127772.dtd: added the example in the regression tests Tue Nov 25 08:00:15 CET 2003 Daniel Veillard * parser.c: moved xmlCleanupThreads() to the end of xmlCleanupParser() to avoid bug #127851 Mon Nov 24 15:26:21 CET 2003 Daniel Veillard * xmlregexp.c: fixing some Negative Character Group and Character Class Subtraction handling. Mon Nov 24 14:01:57 CET 2003 Daniel Veillard * xmlregexp.c xmlschemas.c: more XML Schemas fixes based on Eric van der Vlist examples * result/schemas/vdv-first4* test/schemas/vdv-first4*: added regression tests * doc/examples/Makefile.am doc/examples/index.py: do not regenerate the index on make all target, but only on make rebuild to avoid troubles. Sat Nov 22 21:35:42 CET 2003 Daniel Veillard * xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h include/libxml/schemasInternals.h: lot of bug fixes, cleanup, starting to add proper namespace support too. * test/schemas/* result/schemas/*: added a number of tests fixed the result from some regression tests too. Fri Nov 21 20:50:59 MST 2003 John Fleck * doc/xml.html, docs.html: remove reference to gtk-doc now that Daniel has removed it, fix link to George's IBM article, other minor edits Fri Nov 21 01:26:00 CET 2003 Daniel Veillard * xmlschemas.c: applied patch from Robert Stepanek to start import os schemas support, cleaned up stuff and the patch. * test/schemas/import0_0.* result/schemas/import0_0_0*: added test to regression, fixed a few regressions too. Thu Nov 20 22:58:00 CET 2003 Daniel Veillard * HTMLparser.c: applied two parsing fixes from James Bursa Thu Nov 20 19:20:46 CET 2003 Daniel Veillard * doc/examples/*: added two xmlReader examples * xmlreader.c: cleaned up some bugs in the process Thu Nov 20 12:54:30 CET 2003 Daniel Veillard * xmlwriter.c include/libxml/xmlwriter.h: applied patch from Alfred Mickautsch, bugfixes and comments * doc/examples/*: added his test as the xmlWriter example * doc/html/ doc/*.html: this resulted in some improvements * include/libxml/hash.h: fixed an inclusion problem when wasn't preceeded by Wed Nov 19 17:19:35 CET 2003 Daniel Veillard * xinclude.c: fix an error message * doc/examples/*: added tree2 example from Lucas Brasilino Wed Nov 19 17:50:47 HKT 2003 William Brack * doc/newapi.xsl: improve the sort sequence for page content * doc/html/*.html: regenerate the web pages Wed Nov 19 00:48:56 CET 2003 Daniel Veillard * Makefile.am: do not package cvs versioning temp files. * doc/apibuild.py doc/libxml2-api.xml doc/newapi.xsl: more cleanup, slightly improved the API xml format, fixed a lot of small rendering problems * doc/html/libxml*.html: rebuilt Tue Nov 18 21:51:15 CET 2003 Daniel Veillard * include/libxml/*.h include/libxml/*.h.in: modified the file header to add more informations, painful... * genChRanges.py genUnicode.py: updated to generate said changes in headers * doc/apibuild.py: extract headers, add them to libxml2-api.xml * *.html *.xsl *.xml: updated the stylesheets to flag geprecated APIs modules. Updated the stylesheets, some cleanups, regenerated * doc/html/*.html: regenerated added back book1 and libxml-lib.html Tue Nov 18 14:43:16 CET 2003 Daniel Veillard * doc/Makefile.am doc/*.xsl doc/*.html doc/apibuild.py: cleaned up the build process to remove all remains from the old gtk-doc inherited, libxml2-refs.xml is now generated by apibuild.py, the stylesheets have been improved, and the API*html now generated are XHTML1 valid too Tue Nov 18 14:28:32 HKT 2003 William Brack * genChRanges.py, chvalid.c, include/libxml/chvalid.h: minor enhancement to prevent comment with unreferenced variable. * threads.c xmlreader.c xmlwriter.c: edited some comments to improve auto-generation of documentation * apibuild.py: minor change to an error message Mon Nov 17 17:55:51 CET 2003 Daniel Veillard * doc/apibuild.py doc/libxml2-api.xml doc/newapi.xsl: more cleanup, improving navigation * doc/html/*.html: updated the result Mon Nov 17 14:54:38 CET 2003 Daniel Veillard * doc/Makefile.am doc/apibuild.py doc/libxml2-api.xml doc/newapi.xsl: improvement of the stylesheets, fixed a API generation problem, switched the stylesheet and Makefile to build the HTML output. * doc/html/*.html: complete update, ditched some old files, might introduce some breakage... Mon Nov 17 12:50:28 CET 2003 Daniel Veillard * doc/newapi.xsl: lot of improvements, this starts looking good enough to be usable. Mon Nov 17 00:58:09 CET 2003 Daniel Veillard * doc/newapi.xsl: stylesheet to build HTML pages from the API XML description, Work in Progress Sun Nov 16 16:03:24 HKT 2003 William Brack * xpath.c: fixed bug 126976 (string != empty nodeset should be false) Sun Nov 16 14:00:08 HKT 2003 William Brack * doc/html/*.html: Finally - found the problem with the page generation (XMLPUBFUN not recognized by gtkdoc). Re-created the pages using a temporary version of include/libxml/*.h. * testOOMlib.c,include/libxml/encoding.h, include/libxml/schemasInternals.h,include/libxml/valid.h, include/libxml/xlink.h,include/libxml/xmlwin32version.h, include/libxml/xmlwin32version.h.in, include/libxml/xpathInternals.h: minor edit of comments to help automatic documentation generation * doc/docdescr.doc: small elaboration * doc/examples/test1.c,doc/examples/Makefile.am: re-commit (messed up on last try) * xmlreader.c: minor change to clear warning. Sat Nov 15 19:20:32 CET 2003 Daniel Veillard * Copyright: fixed some wording * libxml.spec.in: make sure doc/examples is packaged * include/libxml/tree.h valid.c xmlreader.c: fixed the really annoying problem about xmlRemoveID and xmlReader streaming. Thing looks fixed now, had to add a doc reference to the xmlID structure though... Sat Nov 15 09:53:36 MST 2003 John Fleck * doc/docdescr.doc: added description of man page building Sat Nov 15 19:08:22 HKT 2003 William Brack * doc/html/libxml-chvalid.html, doc/html/libxml-dict.html, doc/html/libxml-list.html, doc/html/libxml-testOOMlib.html, doc/html/libxml-wincecompat, doc/html/winsockcompat.html, doc/html/libxml-xmlexports.html, doc/html/libxml-xmlversion.html, doc/html/libxml-xmlwin32version.html, doc/html/libxml-xmlwriter.html: added missing pages for the website. Sat Nov 15 18:23:48 HKT 2003 William Brack * doc/Makefile.am doc/*.html doc/html/*.html: rebuilt the generated pages (again), manually restored doc/html/index.html and manually edited generated file doc/gnome-xml.xml to put in appropriate headings. * doc/docdescr.doc: new file to describe details of the document generation (helps my memory for the next time) * genChRanges.py,chvalid.c,include/libxml/chvalid.h: minor enhancement to please the automatic documentation generation. Fri Nov 14 23:47:31 HKT 2003 William Brack * catalog.c,relaxng.c,testAutomata.c,xpointer.c,genChRanges.py, chvalid.c,include/libxml/chvalid.h,doc/examples/test1.c: minor error cleanup for gcc-3.3.[12] compilation warnings. Fri Nov 14 15:08:13 HKT 2003 William Brack * tree.c: minor changes to some comments * doc/*.html: rebuilt the generated HTML pages for changes from jfleck (bug 126945) Thu Nov 13 12:44:14 CET 2003 Daniel Veillard * doc/examples/*: added Dodji's example, added output handling Thu Nov 13 11:35:35 CET 2003 Daniel Veillard * doc/examples/*: added Aleksey XPath example, fixed bugs in the indexer Wed Nov 12 23:48:26 CET 2003 Daniel Veillard * doc/*: integrating the examples in the navigation menus * doc/examples/*: added make tests, updated the navigation, added a new test, cleanups, updates. Wed Nov 12 17:50:36 CET 2003 Daniel Veillard * doc/*.html: rebuilt the generated HTML pages * doc/examples/*: updated the stylesheets, added a synopsis, Makefile.am is now generated by index.py Wed Nov 12 01:38:16 CET 2003 Daniel Veillard * doc/site.xsl doc/examples/Makefile.am doc/examples/index.html: added autogeneration of a web page for the examples * doc/examples/example1.c doc/examples/.cvsignore doc/examples/examples.xml doc/examples/index.py: updated the informations extracted, improved the format and indexing. Tue Nov 11 22:08:59 CET 2003 Daniel Veillard * check-xinclude-test-suite.py: less verbose on difference * libxml.spec.in: cleanup * parser.c: fixed xmlCleanupParser() doc * doc/Makefile.am doc/apibuild.py doc/libxml2-api.xml doc/examples/Makefile.am doc/examples/example1.c doc/examples/examples.xml doc/examples/index.py doc/examples/test1.xml: work on adding C examples and generating automated information about those. examples.xml is autogenerated describing the examples. * example/Makefile.am: cleanup Mon Nov 10 23:47:03 HKT 2003 William Brack * genUnicode.py, xmlunicode.c, include/libxml/xmlunicode.h: fixed missing '-' in block names, enhanced the hack for ABI aliasing. Sun Nov 9 20:28:21 HKT 2003 William Brack * genUnicode.py, xmlunicode.c, include/libxml/xmlunicode.h, python/libxml2class.txt: enhanced for range checking, updated to Unicode version 4.0.1 (API docs also updated) * python/generator.py: minor change to fix a warning Wed Nov 5 23:46:36 CET 2003 Daniel Veillard * Makefile.am: apply fix from Karl Eichwalder for script path Wed Nov 5 10:49:20 CET 2003 Daniel Veillard * win32/configure.js: applied patch from Mark Vakoc to simplify his work from CVS checkouts. Tue Nov 4 21:16:47 MST 2003 John Fleck * doc/xmlreader.html: minor cleanups Tue Nov 4 15:52:28 PST 2003 William Brack * include/libxml/xmlversion.h.in: changed macro ATTRIBUTE_UNUSED for gcc so that, if undefined, it's defined as __attribute__((unused)) Tue Nov 4 15:28:07 PST 2003 William Brack * python/generator.py: small enhancement to assure ATTRIBUTE_UNUSED appears after the variable declaration. * valid.c: trivial change to eliminate a warning message Tue Nov 4 11:24:04 CET 2003 Daniel Veillard * configure.in NEWS doc/*: preparing release 2.6.2, updated and rebuilt the docs Tue Nov 4 09:38:46 CET 2003 Daniel Veillard * xmllint.c: change --html to make sure we use the HTML serialization rule by default when HTML parser is used, add --xmlout to allow to force the XML serializer on HTML. * HTMLtree.c: ugly tweak to fix the output on

    element and solve #125093 * result/HTML/*: this changes the output of some tests Mon Nov 3 17:51:28 CET 2003 Daniel Veillard * xinclude.c: fixed bug #125812, about XPointer in XInclude failing but not returning an error. Mon Nov 3 17:18:22 CET 2003 Daniel Veillard * valid.c: fixed bug #125811 related to DTD post validation where the DTD doesn't pertain to a document. Mon Nov 3 15:25:58 CET 2003 Daniel Veillard * parser.c xmlIO.c include/libxml/parserInternals.h: implemented the XML_PARSE_NONET parser option. * xmllint.c: converted xmllint.c to use the option instead of relying on the global resolver variable. Mon Nov 3 13:26:32 CET 2003 Daniel Veillard * xinclude.c xmlreader.c include/libxml/xinclude.h: adding XInclude support to the reader interface. Lot of testing of the walker, various bug fixes. * xmllint.c: added --walker and made sure --xinclude --stream --debug works as expected * Makefile.am result/dtd11.rdr result/ent6.rdr test/dtd11 test/ent6 result/XInclude/*.rdr: added regression tests for the walker and XInclude xmlReader support, had to slightly change a couple of tests because the walker can't distinguish from Sat Nov 1 17:42:27 CET 2003 Daniel Veillard * tree.c nanohttp.c threads.c: second BeOS patch from Marcin 'Shard' Konicki Fri Oct 31 15:35:20 CET 2003 Daniel Veillard * parser.c: always generate line numbers Fri Oct 31 11:53:46 CET 2003 Daniel Veillard * parser.c: fixed another regression introduced in fixing #125823 Fri Oct 31 11:33:18 CET 2003 Daniel Veillard * python/libxml.c: previous fix for #124044 was broken, correct fix provided. * HTMLparser.c parser.c parserInternals.c xmlIO.c: fix xmlStopParser() and the error handlers to address #125877 Thu Oct 30 23:10:46 CET 2003 Daniel Veillard * parser.c: side effect of #123105 patch, namespace resolution would fail when defined in internal entities, fixes #125823 Thu Oct 30 14:10:42 CET 2003 Daniel Veillard * python/libxml.c: be more defensive in the xmlReader python bindings fixing bug #124044 Thu Oct 30 11:14:31 CET 2003 Daniel Veillard * valid.c: the a-posteriori DTD validation code was not validating the namespace declarations, this fixes #124110 Wed Oct 29 14:13:03 PDT 2003 William Brack * xmlIO.c: enhanced to bypass compression detection code when input file is stdin (bug 125801) Wed Oct 29 18:21:00 CET 2003 Daniel Veillard * xmlIO.c: fix needed when HTTP is not compiled in by Mark Vakoc Wed Oct 29 18:05:53 CET 2003 Daniel Veillard * xpath.c: more fixes about unregistering objects * include/libxml/relaxng.h: applied patch from Mark Vakoc missing _cplusplus processing clause Wed Oct 29 07:49:52 2003 Aleksey Sanin * include/libxml/parser.h parser.c: added xmlStrVPrintf function Wed Oct 29 14:37:40 CET 2003 Daniel Veillard * nanoftp.c nanohttp.c testThreads.c threads.c: applied patch from Marcin 'Shard' Konicki to provide BeOS thread support. Wed Oct 29 14:20:14 CET 2003 Daniel Veillard * xmlschemas.c include/libxml/xmlschemas.h: applied patch from Steve Ball to make a schema parser from a preparsed document. Wed Oct 29 13:52:25 CET 2003 Daniel Veillard * tree.c: applied a couple of patches from Mark Lilback about text nodes coalescing Wed Oct 29 12:16:52 CET 2003 Daniel Veillard * xpath.c: change suggested by Anthony Carrico when unregistering a namespace prefix to a context * hash.c: be more careful about calling callbacks with NULL payloads. Wed Oct 29 00:04:26 CET 2003 Daniel Veillard * configure.in NEWS doc/*: preparing release 2.6.1, updated and regenerated docs and APIs * parser.c: cleanup and last change to fix #123105 Tue Oct 28 23:02:29 CET 2003 Daniel Veillard * HTMLparser.c: Fix #124907 by simply backporting the same fix as for the XML parser * result/HTML/doc3.htm.err: change to ID detecting modified one test result. Tue Oct 28 22:28:50 CET 2003 Daniel Veillard * parser.c include/libxml/parser.h: included a new function to reuse a Push parser context, based on Graham Bennett original code * valid.c: in HTML, a name in an input is not an ID * TODO: bug list update Tue Oct 28 19:54:37 CET 2003 Daniel Veillard * xpath.c: applied patch from nico@xtradyne.com for #125030 Tue Oct 28 16:42:16 CET 2003 Daniel Veillard * Makefile.am: cleanup * error.c valid.c include/libxml/xmlerror.h: fixing bug #125653 sometimes the error handlers can get a parser context on DTD errors, and sometime they don't. So be very careful when trying to grab those informations. Tue Oct 28 15:26:18 CET 2003 Daniel Veillard * tree.c: applied patch from Kasimier Buchcik which fixes a problem in xmlSearchNs introduced in 2.6.0 Tue Oct 28 14:57:03 CET 2003 Daniel Veillard * parser.c: fixed #123263, the encoding is mandatory in a textdecl. Tue Oct 28 13:48:52 CET 2003 Daniel Veillard * tree.c: fix bug #125047 about serializing when finding a document fragment node. Mon Oct 27 11:11:29 EST 2003 Daniel Veillard * testSAX.c: fix bug #125592 need a NULL check * include/libxml/chvalid.h: rename a parameter Mon Oct 27 09:43:48 EST 2003 Daniel Veillard * parser.c: applied patch from #123105 about defaulted attributes from element coming from an entity Mon Oct 27 21:12:27 HKT 2003 William Brack * xmllint.c: fixed warning message from IRIX (bug 125182) * python/libxml.py: removed tabs, replaced with spaces (bug 125572) Mon Oct 27 06:17:30 EST 2003 Daniel Veillard * libxml.h parserInternals.c xmlIO.c: make sure we report errors if xmlNewInputFromFile() fails. * xmlreader.c: avoid using _private for the node or document elements. Sat Oct 25 17:33:59 CEST 2003 Igor Zlatkovic * win32/configure.js: added declaration for verMicroSuffix Fri Oct 24 23:08:17 CEST 2003 Daniel Veillard * libxml.m4: applied patch from Patrick Welche provided in bug #125432 , future proofing the .m4 file. * parser.c: resetting the context should also reset the error * TODO: problem of conformance w.r.t. E20 was raised in the XML Core telconf and libxml2 isn't conformant there. Wed Oct 22 14:33:05 CEST 2003 Daniel Veillard * xmlwriter.c: applied patch from Alfred Mickautsch fixing #125180 Wed Oct 22 10:50:31 CEST 2003 Daniel Veillard * chvalid.c genChRanges.py: Stéphane Bidoul pointed out another small glitch missing a const Wed Oct 22 10:43:21 CEST 2003 Daniel Veillard * chvalid.c genChRanges.py: Stéphane Bidoul pointed out that it doesn't define IN_LIBXML Tue Oct 21 21:14:55 CEST 2003 Daniel Veillard * win32/Makefile.mingw: typo pointed out by Stéphane Bidoul Tue Oct 21 11:26:36 CEST 2003 Daniel Veillard * win32/Makefile.bcb win32/Makefile.mingw win32/Makefile.msvc win32/configure.js: set of Win32 patches for 2.6.0 by Joachim Bauch Tue Oct 21 02:07:22 CEST 2003 Daniel Veillard * tree.c: last minute patch from Eric Zurcher making it into 2.6.0 Tue Oct 21 02:03:03 CEST 2003 Daniel Veillard * configure.in NEWS doc/libxml2.xsa: preparing libxml2-2.6.0 * doc/*: updated and regenerated the docs and API Tue Oct 21 01:01:55 CEST 2003 Daniel Veillard * SAX2.c error.c tree.c: moved the line number to their proper field in elements now. Tue Oct 21 00:28:20 CEST 2003 Daniel Veillard * configure.in xmlwriter.c Makefile.am include/libxml/xmlwriter.h include/libxml/Makefile.am include/libxml/xmlversion.h.in: added the xmlWriter module contributed by Alfred Mickautsch * include/libxml/tree.h: added room for line and extra information * xmlreader.c python/tests/reader6.py: bugfixing some problem some of them introduced in September * win32/libxml2.def.src doc/libxml2-api.xml: regenerated the API Mon Oct 20 19:02:53 CEST 2003 Daniel Veillard * Makefile.am configure.in xmldwalk.c xmlreader.c include/libxml/Makefile.am include/libxml/xmldwalk.h include/libxml/xmlversion.h.in: removing xmldwalk module since it got merged with the xmlreader. * parser.c: cleanup * win32/libxml2.def.src python/libxml2class.txt doc/libxml2-api.xml: rebuilt the API * python/tests/Makefile.am python/tests/reader7.py python/tests/walker.py: adding regression testing for the new xmlreader APIs, new APIs for reader creation, including makeing reader "walker" operating on preparsed document trees. Sun Oct 20 22:37:03 HKT 2003 William Brack * entities.c, valid.c: fixed problem reported on the mailing list by Melvyn Sopacua - wrong argument order on functions called through xmlHashScan. Sun Oct 19 23:57:45 CEST 2003 Daniel Veillard * valid.c xmlIO.c: fixes for compiling using --with-minimum Sun Oct 19 23:46:04 CEST 2003 Daniel Veillard * tree.c: cleanup xmlNodeGetContent() reusing xmlNodeBufGetContent(), tested it through the xslt regression suite. Sun Oct 19 22:42:16 CEST 2003 Daniel Veillard * tree.c include/libxml/tree.h: adding xmlNodeBufGetContent() allowing to grab the content without forcing allocations. * python/libxml2class.txt doc/libxml2-api.xml: rebuilt the API * xpath.c xmldwalk.c: removed a couple of comment errors. Sun Oct 19 16:39:36 CEST 2003 Daniel Veillard * parser.c: applied patch from Chris Anderson to change back memcmp with CMPx() Sun Oct 19 16:24:19 CEST 2003 Daniel Veillard * HTMLparser.c: fixed to not send NULL to %s printing * python/tests/error.py result/HTML/doc3.htm.err result/HTML/test3.html.err result/HTML/wired.html.err result/valid/t8.xml.err result/valid/t8a.xml.err: cleaning up some of the regression tests error Sun Oct 19 15:31:43 CEST 2003 Daniel Veillard * include/libxml/nanohttp.h include/libxml/parserInternals.h include/libxml/xmlIO.h nanohttp.c parserInternals.c xmlIO.c: Fixed the HTTP<->parser interraction, which should fix 2 long standing bugs #104790 and #124054 , this also fix the fact that HTTP error code (> 400) should not generate data, we usually don't want to parse the HTML error information instead of the resource looked at. Sun Oct 19 19:20:48 HKT 2003 William Brack * doc/Makefile.am: enhanced the installation of tutorial files to avoid installing CVS subdirectories (bug 122943) Sun Oct 19 17:33:27 HKT 2003 William Brack * xmlIO.c: fixed segfault when input file not present * tree.c: changed output formatting of XML_CDATA_SECTION (bug 120917) Sun Oct 19 00:15:38 HKT 2003 William Brack * include/libxml/parserInternals.h HTMLparser.c HTMLtree.c SAX2.c catalog.c debugXML.c entities.c parser.c relaxng.c testSAX.c tree.c valid.c xmlschemas.c xmlschemastypes.c xpath.c: Changed all (?) occurences where validation macros (IS_xxx) had single-byte arguments to use IS_xxx_CH instead (e.g. IS_BLANK changed to IS_BLANK_CH). This gets rid of many warning messages on certain platforms, and also high- lights places in the library which may need to be enhanced for proper UTF8 handling. Sat Oct 18 20:34:18 HKT 2003 William Brack * genChRanges.py, chvalid.c, include/libxml/chvalid.h, doc/apibuild.py: enhanced to include enough comments to make the api doc generation happy. Sat Oct 18 07:28:25 EDT 2003 Daniel Veillard * nanohttp.c xmlIO.c include/libxml/nanohttp.h: starting work to fix the HTTP/XML parser integration. Sat Oct 18 11:04:32 CEST 2003 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h: added new APIs for creating reader from sources or reusing a reader with a new source, like the xmlReadxx and xmlCtxtReadxxx * win32/libxml2.def.src doc/libxml2-api.xml doc/apibuild.py doc/Makefile.am: regenerated the APIs * doc/xml.html: applied a patch from Stefan Kost for namesapce docs Sat Oct 18 12:46:02 HKT 2003 William Brack * genChRanges.py, chvalid.c, include/libxml/chvalid.h, include/libxml/parserInternals.h: enhanced macros to avoid breaking ABI from previous versions. * catalog.c, parser.c, tree.c: modified to use IS_* macros defined in parserInternals.h. Makes maintenance much easier. * testHTML.c, testSAX.c, python/libxml.c: minor fixes to avoid compilation warnings * configuration.in: fixed pushHTML test error; enhanced for better devel (me) testing Fri Oct 17 14:38:54 CEST 2003 Daniel Veillard * legacy.c: remove the warning for startDocument(), as it is used by glade (or glade-python) * parser.c relaxng.c xmlschemastypes.c: fixed an assorted set of invalid accesses found by running some Python based regression tests under valgrind. There is still a few leaks reported by the relaxng regressions which need some attention. * doc/Makefile.am: fixed a make install problem c.f. #124539 * include/libxml/parserInternals.h: addition of xmlParserMaxDepth patch from crutcher Wed Oct 15 12:47:33 CEST 2003 Daniel Veillard * parser.c: Marc Liyanage pointed out that xmlCleanupParser() was missing xmlCleanupInputCallbacks and xmlCleanupOutputCallbacks calls. Wed Oct 15 10:16:47 CEST 2003 Daniel Veillard * vms/build_libxml.com trionan.c: VMS patch from Craig A. Berry Mon Oct 13 21:46:25 CEST 2003 Daniel Veillard * Makefile.am: small fix from Bjorn Reese Mon Oct 13 15:59:25 CEST 2003 Daniel Veillard * valid.c: fix a call missing arguments Sun Oct 12 18:42:18 HKT 2003 William Brack * genChRanges.py, chvalid.c, include/libxml/chvalid.h: fixed a bug in the range search; enhanced range generation (inline code if a small number of intervals); enhanced the readability of the output files. Sun Oct 12 00:52:14 CEST 2003 Daniel Veillard * chvalid.def chvalid.c include/libxml/chvalid.h: rebuilt chvalid.def from scratch based on XML 2nd edition REC and regenerated the code. Sat Oct 11 22:54:13 CEST 2003 Daniel Veillard * check-xml-test-suite.py: removed some annoying warnings * chvalid.def chvalid.c include/libxml/chvalid.h: fixed a bug in the PubidChars definition, regenerated, there is still a bug left somewhere * genChRanges.py: save the header directly in include/libxml/ * configure.in: I generated a 2.6.0beta6 earlier today Sat Oct 11 23:32:47 HKT 2003 William Brack * fixed small error on previous commit (chvalid.h in base dir instead of include directory) Sat Oct 11 23:11:22 HKT 2003 William Brack * genChRange.py, chvalid.def, chvalid.c, include/libxml/chvalid.h: new files for a different method for doing range validation of character data. * Makefile.am, parserInternals.c, include/libxml/Makefile.am, include/libxml/parserInternals.h: modified for new range method. * catalog.c: small enhance for warning message (using one of the new range routines) Sat Oct 11 13:24:57 CEST 2003 Daniel Veillard * valid.c include/libxml/valid.h: adding an serror field to the validation context breaks the ABI for the xmlParserCtxt structure since it's embedded by content and not by reference Sat Oct 11 12:46:49 CEST 2003 Daniel Veillard * configure.in: patch from Mike Hommey * threads.c: applied Windows patch from Jesse Pelton and Stephane Bidoul * parser.c: fix the potentially nasty access to ctxt->serror without checking first that the SAX block is version 2 Fri Oct 10 21:34:01 CEST 2003 Daniel Veillard * SAX2.c: fixed a nasty bug with interning some text strings * configure.in: prepare for beta5 of 2.6.0 * libxml.h nanoftp.c nanohttp.c xmlIO.c include/libxml/xmlerror.h: better error handling for I/O and converted FTP and HTTP * parser.c: fixed another bug Fri Oct 10 16:45:20 CEST 2003 Daniel Veillard * SAX2.c: fixed uninitialized new field. * result/VC/OneID2 result/relaxng/*.err: fixed a typo updating all messages Fri Oct 10 16:19:17 CEST 2003 Daniel Veillard * include/libxml/tree.h: make room in Doc, Element, Attributes for PSVI type informations. Fri Oct 10 16:08:02 CEST 2003 Daniel Veillard * HTMLparser.c c14n.c catalog.c error.c globals.c parser.c parserInternals.c relaxng.c valid.c xinclude.c xmlIO.c xmlregexp.c xmlschemas.c xpath.c xpointer.c include/libxml/globals.h include/libxml/parser.h include/libxml/valid.h include/libxml/xmlerror.h: Setting up the framework for structured error reporting, touches a lot of modules, but little code now the error handling trail has been cleaned up. Fri Oct 10 14:29:42 CEST 2003 Daniel Veillard * c14n.c include/libxml/xmlerror.h: converted the C14N module too Fri Oct 10 13:40:51 CEST 2003 Daniel Veillard * xpath.c: cleanup * xpointer.c include/libxml/xmlerror.h: migrated XPointer module to the new error mechanism Fri Oct 10 12:49:53 CEST 2003 Daniel Veillard * error.c xmlschemas.c: a bit of cleanup * result/schemas/*.err: updated with the new result strings Fri Oct 10 03:58:39 PDT 2003 William Brack * xpath.c: fixed bug 124061 Fri Oct 10 02:47:22 CEST 2003 Daniel Veillard * Makefile.am: cleanup * encoding.c: fix a funny typo * error.c xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h: converted the Schemas code to the new error handling. PITA, still need to check output from regression tests. Thu Oct 9 15:13:53 CEST 2003 Daniel Veillard * HTMLtree.c include/libxml/xmlerror.h: converted too * tree.c: small cleanup Thu Oct 9 13:44:57 CEST 2003 Daniel Veillard * xinclude.c: comment fix * catalog.c include/libxml/xmlerror.h: migrating the catalog code to the new infrastructure Thu Oct 9 00:36:03 CEST 2003 Daniel Veillard * xmlIO.c: final error handling cleanup * xinclude.c error.c: converted XInclude to the new error handling * include/libxml/xmlerror.h: added XInclude errors Wed Oct 8 23:31:23 CEST 2003 Daniel Veillard * parser.c: bug in compression saving was crashing galeon reported by teuf Wed Oct 8 21:18:12 CEST 2003 Daniel Veillard * error.c tree.c xmlIO.c xmllint.c: more cleanup through the I/O error path Wed Oct 8 20:57:27 CEST 2003 Daniel Veillard * xmlIO.c: better handling of error cases Wed Oct 8 13:51:14 CEST 2003 Daniel Veillard * xmlIO.c xmllint.c include/libxml/xmlerror.h: first pass at cleaning up error handling in the I/O module. Wed Oct 8 10:52:05 CEST 2003 Daniel Veillard * xmlregexp.c include/libxml/xmlerror.h: error handling cleanup of the Regexp module. Wed Oct 8 01:09:05 CEST 2003 Daniel Veillard * tree.c: converting the tree module too * error.c include/libxml/xmlerror.h: created a simpler internal error reporting function. Tue Oct 7 23:19:39 CEST 2003 Daniel Veillard * error.c include/libxml/xmlerror.h include/libxml/xpath.h include/libxml/xpathInternals.h xpath.c: cleaning up XPath error reporting that time. * threads.c: applied the two patches for TLS threads on Windows from Jesse Pelton * parser.c: tiny safety patch for xmlStrPrintf() make sure the return is always zero terminated. Should also help detecting passing wrong buffer size easilly. * result/VC/* result/valid/rss.xml.err result/valid/xlink.xml.err: updated the results to follow the errors string generated by last commit. Tue Oct 7 14:16:45 CEST 2003 Daniel Veillard * relaxng.c include/libxml/xmlerror.h: last cleanup of error handling in the Relax-NG module. Tue Oct 7 13:30:39 CEST 2003 Daniel Veillard * error.c relaxng.c include/libxml/xmlerror.h: switched Relax-NG module to teh new error reporting. Better default report, adds the element associated if found, context and node are included in the xmlError * python/tests/reader2.py: the error messages changed. * result/relaxng/*: error message changed too. Mon Oct 6 10:46:35 CEST 2003 Daniel Veillard * win32/Makefile.bcb win32/Makefile.mingw win32/Makefile.msvc win32/configure.js: applied patch from Stéphane Bidoul to fix the compilation of 2.6.0 code on Win32 Mon Oct 6 10:16:30 CEST 2003 Daniel Veillard * check-xml-test-suite.py: fixing the script * parser.c: replace sequences of RAW && NXT(.) == '.' with memcmp calls, seems to not break conformance, slightly inflate the size of the gcc generated code though. Sun Oct 5 23:30:48 CEST 2003 Daniel Veillard * parserInternals.c parser.c valid.c include/libxml/parserInternals.h: more cleanup of error handling in parserInternals, sharing the routine for memory errors. Sun Oct 5 15:49:14 CEST 2003 Daniel Veillard * HTMLparser.c Makefile.am legacy.c parser.c parserInternals.c include/libxml/xmlerror.h: more code cleanup, especially around error messages, the HTML parser has now been upgraded to the new handling. * result/HTML/*: a few changes in the resulting error messages Sat Oct 4 23:06:41 CEST 2003 Daniel Veillard * parser.c include/libxml/xmlerror.h: more error/warning handling cleanups, the XML parser module should be okay now. Sat Oct 4 01:58:27 CEST 2003 Daniel Veillard * Makefile.am configure.in xmldwalk.c include/libxml/Makefile.am include/libxml/xmldwalk.h include/libxml/xmlversion.h.in: integrated the xmlDocWalker API given by Alfred Mickautsch, and providing an xmlReader like API but working on a xmlDocPtr. Sat Oct 4 00:18:29 CEST 2003 Daniel Veillard * Makefile.am: more cleanup in make tests * error.c valid.c parser.c include/libxml/xmlerror.h: more work in the transition to the new error reporting strategy. * python/tests/reader2.py result/VC/* result/valid/*: few changes in the strings generated by the validation output Fri Oct 3 00:19:02 CEST 2003 Daniel Veillard * Makefile.am: changed 'make tests' to use a concise output, scrolling to see where thing broke wasn't pleasant * configure.in: some beta4 preparation, but not ready yet * error.c globals.c include/libxml/globals.h include/libxml/xmlerror.h: new error handling code, last error informations are stored in the parsing context or a global variable, new APIs to handle the xmlErrorPtr type. * parser.c parserInternals.c valid.c : started migrating to the new error handling code, it's a royal pain. * include/libxml/parser.h include/libxml/parserInternals.h: moved the definition of xmlNewParserCtxt() * parser.c: small potential buffer access problem in push code provided by Justin Fletcher * result/*.sax result/VC/PENesting* result/namespaces/* result/valid/*.err: some error messages were sligthly changed. Thu Oct 2 13:01:13 2003 Aleksey Sanin * include/libxml/parser.h parser.c: introduced xmlStrPrintf function (wrapper around snprintf) Wed Oct 1 21:12:06 CEST 2003 Daniel Veillard * entities.c: Fix error on output of high codepoint charref like 􏿿 , reported by Eric Hanchrow Wed Oct 1 14:20:10 CEST 2003 Daniel Veillard * DOCBparser.c include/libxml/DOCBparser.h: let's see how much of a pain murrayc is really gonna be. Wed Oct 1 11:03:40 CEST 2003 Daniel Veillard * xmlreader.c: Applied fix for bug #123481 reported by Peter Derr Tue Sep 30 15:34:31 CEST 2003 Daniel Veillard * entities.c legacy.c parser.c: made the predefined entities static predefined structures to avoid the work, memory and hazards associated to initialization/cleanup. Tue Sep 30 14:30:47 CEST 2003 Daniel Veillard * HTMLparser.c Makefile.am configure.in legacy.c parser.c parserInternals.c testHTML.c xmllint.c include/libxml/HTMLparser.h include/libxml/parser.h include/libxml/parserInternals.h include/libxml/xmlversion.h.in: added a new configure option --with-push, some cleanups, chased code size anomalies. Now a library configured --with-minimum is around 150KB, sounds good enough. Tue Sep 30 12:31:00 AEST 2003 Malcolm Tredinnick * libxml-2.0-uninstalled.pc.in: New file for building against uninstalled libxml2 builds. * configure.in, Makefile.am: Support the *-uninstalled.pc file. * .cvsignore: Ignore the new generated *.pc file. Tue Sep 30 02:38:16 CEST 2003 Daniel Veillard * Makefile.am SAX.c SAX2.c configure.in globals.c parser.c parserInternals.c testReader.c testSAX.c xmlIO.c xmllint.c xmlreader.c example/gjobread.c include/libxml/xmlversion.h.in: added 2 new configure option: --with-reader --with-sax1 to allow removing the reader or non-xmlReadxxx() interfaces. Mon Sep 29 19:58:26 CEST 2003 Daniel Veillard * configure.in entities.c tree.c valid.c xmllint.c include/libxml/tree.h include/libxml/xmlversion.h.in: Adding a configure option to remove tree manipulation code which is not strictly needed by the parser. Mon Sep 29 15:23:41 CEST 2003 Daniel Veillard * nanoftp.c nanohttp.c: last finishing touch to the BeOS patch from Marcin 'Shard' Konicki Mon Sep 29 15:15:08 CEST 2003 Daniel Veillard * HTMLtree.c SAX2.c c14n.c catalog.c configure.in debugXML.c encoding.c entities.c nanoftp.c nanohttp.c parser.c relaxng.c testAutomata.c testC14N.c testHTML.c testRegexp.c testRelax.c testSchemas.c testXPath.c threads.c tree.c valid.c xmlIO.c xmlcatalog.c xmllint.c xmlmemory.c xmlreader.c xmlschemas.c example/gjobread.c include/libxml/HTMLtree.h include/libxml/c14n.h include/libxml/catalog.h include/libxml/debugXML.h include/libxml/entities.h include/libxml/nanohttp.h include/libxml/relaxng.h include/libxml/tree.h include/libxml/valid.h include/libxml/xmlIO.h include/libxml/xmlschemas.h include/libxml/xmlversion.h.in include/libxml/xpathInternals.h python/libxml.c: Okay this is scary but it is just adding a configure option to disable output, this touches most of the files. Mon Sep 29 12:53:56 CEST 2003 Daniel Veillard * xmlmemory.c: better fix, avoids breaking the python bindings Mon Sep 29 11:21:33 CEST 2003 Daniel Veillard * xmlmemory.c: fix a compilation problem when configuring with debug but without mem-debug Sun Sep 28 20:53:17 CEST 2003 Daniel Veillard * Makefile.am: cleanup, creating a new legacy.c module, made sure make tests ran in reduced conditions * SAX.c SAX2.c configure.in entities.c globals.c parser.c parserInternals.c tree.c valid.c xlink.c xmlIO.c xmlcatalog.c xmlmemory.c xpath.c xmlmemory.c include/libxml/xmlversion.h.in: increased the modularization, allow to configure out validation code and legacy code, added a configuration option --with-minimum compiling only the mandatory code which then shrink to 200KB. Sun Sep 28 02:15:07 CEST 2003 Daniel Veillard * parser.c: fix a bug raised by the Mips compiler. * include/libxml/SAX.h include/libxml/parser.h: move the SAXv1 block definitions to parser.h fixes bug #123380 * xmlreader.c include/libxml/xmlreader.h: reinstanciate the attribute and element pool borken 2 commits ago. Start playing with an entry point to preserve a subtree. * entities.c: remove a warning. Sat Sep 27 12:19:38 PDT 2003 William Brack * encoding.c, parser.c, relaxng.c: further (final?) minor changes for compilation warnings. No change to logic. Fri Sep 26 18:03:42 PDT 2003 William Brack * parser.c: fixed small problem with missing entities (test/ent2) Sat Sep 27 01:25:39 CEST 2003 Daniel Veillard * parser.c: William's change allowed to spot a nasty bug in xmlDoRead if the result is not well formed that ctxt->myDoc is not NULL and uses the context dictionnary. Fri Sep 26 21:09:34 CEST 2003 Daniel Veillard * parser.c: other patches from William Brack to avoid compilation warnings on AIX. Fri Sep 26 11:03:08 PDT 2003 William Brack * HTMLparser.c, entities.c, xmlreader.c: minor change to avoid compilation warnings on some (e.g. AIX) systems Fri Sep 26 16:49:25 CEST 2003 Daniel Veillard * parserInternals.c: fixed a backward compatibility problem when formatting "deprecated SAXv1 function ignorableWhitespace" could be reproduced by xmllint --format Fri Sep 26 15:50:44 CEST 2003 Daniel Veillard * doc/libxml2-api.xml: rebuilt the API * xmllint.c doc/xmllint.1 doc/xmllint.xml: added the new options --nocdata and --nsclean to remove CDATA section and surperfluous namespace declarations * parser.c SAX2.c: implementation of the 2 new options Fri Sep 26 14:41:53 CEST 2003 Daniel Veillard * HTMLparser.c testHTML.c xmllint.c include/libxml/HTMLparser.h: added the same htmlRead APIs than their XML counterparts * include/libxml/parser.h: new parser options, not yet implemented, added an options field to the context. * tree.c: patch from Shaun McCance to fix bug #123238 when ]]> is found within a cdata section. * result/noent/cdata2 result/cdata2 result/cdata2.rdr result/cdata2.sax test/cdata2: add one more cdata test Thu Sep 25 23:03:23 CEST 2003 Daniel Veillard * parser.c xmllint.c doc/libxml2-api.xml include/libxml/parser.h: Changed the new xmlRead/xmlCtxtRead APIs to have an extra base URL parameter when not loading from a file or URL. Thu Sep 25 16:23:58 CEST 2003 Daniel Veillard * configure.in: preparing a beta3 solving the ABI problems * globals.c parser.c parserInternals.c testHTML.c HTMLparser.c SAX.c include/libxml/globals.h include/libxml/SAX.h: make sure the global variables for the default SAX handler are V1 ones to avoid ABI compat problems. * xmlreader.c: cleanup of uneeded code * hash.c: fix a comment Thu Sep 25 14:16:51 CEST 2003 Daniel Veillard * SAX2.c hash.c parser.c include/libxml/xmlexports.h include/libxml/xmlmemory.h include/libxml/xmlversion.h.in: fixing some comments to avoid warnings from apibuild.py Wed Sep 24 23:42:08 CEST 2003 Daniel Veillard * win32/configure.js: patch from Stéphane Bidoul for configuring the beta2 version #123104 Wed Sep 24 23:17:59 CEST 2003 Daniel Veillard * Makefile.am: adding repeated parsing and validating tests * SAX2.c parser.c tree.c include/libxml/parser.h: make the new DOM tree building interfaces use the dictionary from the parsing context to build the element and attributes names as well as formatting spaces and short text nodes * include/libxml/dict.h dict.c: added some reference counting for xmlDictPtr because they can be shared by documents and a parser context. * xmlreader.c: a bit of cleanup, remove the specific tree freeing functions and use the standard ones now. * xmllint.c: add --nodict * python/libxml.c: fix a stupid bug so that ns() works on attribute nodes. Tue Sep 23 23:07:45 CEST 2003 Daniel Veillard * parser.c include/libxml/parser.h: adding a new set of API for parsing xmlReadDoc() xmlReadFile() ... xmlReadIO() and xmlCtxtReadDoc() ... xmlCtxtReadIO(). That with a clear define of xmlParserOption, xmlCtxtUseOptions() should simplify custom parsing without being tempted to use global variables, and xmlCtxtReset() should allow reuse of a context for multiple parsing. * xmllint.c: switched to use xmlReadXXX, allow options to be used simultaneously with less troubles. * tree.c: simple warning removal * doc/apibuild.py: small fix * doc/libxml2-api.xml win32/libxml2.def.src: updated Tue Sep 23 11:15:23 CEST 2003 Daniel Veillard * parser.c: revert xmlCreateDocParserCtxt() since this break the parseDoc() python bindings Tue Sep 23 11:00:18 CEST 2003 Daniel Veillard * parser.c: make sure xmlDetectSAX2() is called only at parsing time to avoid breaking apps changing the SAX callbacks after context allocation, change xmlCreateDocParserCtxt() to use an immutable buffer instead of a copy Tue Sep 23 09:40:33 CEST 2003 Daniel Veillard * xmlIO.c: applied patch from Markus Keim fixing a problem with I/O callback registration. * include/libxml/xmlerror.h: fixed #122994 comment numbering for xmlParserErrors Mon Sep 22 12:21:11 CEST 2003 Daniel Veillard * tree.c include/libxml/tree.h: the uri arg to xmlNodeSetBase is really a const xmlChar* * xmlreader.c include/libxml/xmlreader.h: addin the xmlTextReaderConstString() to get an interned string from the reader Sun Sep 20 17:22:20 PDT 2003 William Brack * error.c: fixed a warning message (trivial) * doc/search.php: removed incorrect warning message when word search not found in last of multiple tables (bug 119535) Fri Sep 19 14:26:28 CEST 2003 Daniel Veillard * configure.in: preparing a 2.6.0-beta2 release * xmlIO.c: avoid a warning * tree.c: avoid duplicate code in xmlReplaceNode as pointed out by Chris Ryland * include/libxml/dict.h: add a QName access lookup to the dictionary. * xmlreader.c include/libxml/xmlreader.h: adding const access based on the dictionary interface for string read from the reader, the node content access is still TODO, it's too different Fri Sep 19 00:01:08 CEST 2003 Daniel Veillard * SAX2.c: fixing namespace DTD validations * result/valid/ns2.xml result/valid/ns.xml: the output of defaulted namespaces is slightly different now. * Makefile.am: report the memory used in Timingtests (as well as time) Thu Sep 18 15:29:46 CEST 2003 Daniel Veillard * Makefile.am: add streaming on memory regression tests, found bad bugs in the reader interface * xmlreader.c: fixing bugs w.r.t. very large names, and special condition in end of file. * xmlIO.c tree.c include/libxml/tree.h include/libxml/xmlIO.h: adding immutable buffers, and parser input based on those, but this should not be used (yet) for general parsing * parser.c: added a comment about using immutable buffers for general parsing. * result/bigname.xml.rdr result/bigname2.xml.rdr: fixing the output of the regression tests * xmllint.c: using the immutable buffers when streaming on mmaped file (--stream --memory) Thu Sep 18 12:04:50 CEST 2003 Daniel Veillard * dict.c: the last patch broke unicity of returned strings, removed Thu Sep 18 00:31:02 CEST 2003 Daniel Veillard * Makefile.am: add a Timingtests target to check bad behaviour from the streaming engine * dbgen.pl dbgenattr.pl: perl script to generate big instances * xmlreader.c: fix a bad behaviour on large buffer inputs Wed Sep 17 23:25:47 CEST 2003 Daniel Veillard * dict.c xmlreader.c: two small improvements Wed Sep 17 22:53:32 CEST 2003 Daniel Veillard * parserInternals.c: avoid a leak with previous patch Wed Sep 17 22:06:11 CEST 2003 Daniel Veillard * python/libxml.c: use stderr and not stdout for default errors in python environment bug #122552 Wed Sep 17 21:33:57 CEST 2003 Daniel Veillard * parserInternals.c: small fix from Rob Richards for input filename * xmllint.c: fixes for --repeat and --memory/--stream for speed tests * xmlIO: adding a guard in one function Wed Sep 17 15:57:44 CEST 2003 Daniel Veillard * SAX2.c xmlreader.c include/libxml/parser.h: more performance hunting reducing memory allocation and free and avoiding expensive routines Wed Sep 17 12:23:41 CEST 2003 Daniel Veillard * SAX2.c parser.c parserInternals.c xmlreader.c: started messing seriously with per-document dict and element and attribute nodes reuse in the xmlReader. This seems to lead to an interesting speedup of the xmlReader already. Wed Sep 17 01:07:56 CEST 2003 Daniel Veillard * dict.c include/libxml/dict.h: do string allocations in large pools, allowing to find if a string pertain to a dict quickly * xmllint.c: fix --stream --repeat --timing * Makefile.am: the testThreads run output should be seen. Mon Sep 15 16:46:28 CEST 2003 Daniel Veillard * SAX2.c include/libxml/parser.h: starting work on reusing the parser dictionary for the element and attribute tag names. Add pools for Element and Attributes in the parser context, which should help speeding up the reader. * Makefile.am result/*.rdr : adding non-python reader regression tests. Mon Sep 15 14:54:42 CEST 2003 Daniel Veillard * SAX2.c parser.c valid.c: starting to cleanup some of the problems exposed by the W3C/NIST regression suite. * result/ent7.sax result/xml2.sax: small fixes. Mon Sep 15 11:46:47 CEST 2003 Daniel Veillard * parser.c: more parser error factoring Sun Sep 14 21:53:39 PDT 2003 William Brack * HTMLtree.c: Fixed bug 121394 - missing ns on attributes Sun Sep 14 21:43:32 CEST 2003 Daniel Veillard * parser.c include/libxml/xmlerror.h: factoring of more error handling code, serious size reduction and more lisibility of the resulting code. * parserInternals.c parser.c include/libxml/parserInternals.h include/libxml/parser.h: changing the way VC:Proper Group/PE Nesting checks are done, use a counter for entities. Entities where freed and reallocated at the same address failing the check. * tree.c: avoid a warning * result/valid/* result/VC/*: this slightly changes some validation error messages. Sun Sep 14 11:03:27 PDT 2003 William Brack * valid.c: fixed bug 121759 - early declaration of attribute-list in external DTD Sat Sep 13 14:42:11 CEST 2003 Daniel Veillard * parser.c include/libxml/xmlerror.h: starting cleaning up error handling, factorize error processing * doc/xmllint.html: update of the page, remove --sgml Sat Sep 13 02:13:50 CEST 2003 Daniel Veillard * Makefile.am DOCBparser.c parserInternals.c testDocbook.c xmllint.c doc/xmllint.xml doc/xmllint.1: removing the broken pseudo SGML DocBook parser code. Fri Sep 12 17:24:11 CEST 2003 Daniel Veillard * xpath.c: fix a problem with strcpy() in xmlXPathFormatNumber() valgrind pointed out the strings overlapped. cleanup . Fri Sep 12 11:43:12 CEST 2003 Daniel Veillard * tree.c: applied speedup to xmlSearchNs() as suggested by Luca Padovani. Cleaned up xmlSearchNsByHref() in the process applying the same trick. Fri Sep 12 01:36:20 CEST 2003 Daniel Veillard * parser.c parserInternals.c tree.c include/libxml/parser.h include/libxml/xmlerror.h: adding namespace checkings while making sure they still parse as wellformed documents. Add an nsWellFormed status report to the context, and provide new appropriate error codes. * Makefile.am result/namespaces/* test/namespaces/*: add specific regression testing for the new namespace support * test/att5 result/noent/att5 result/att5 result/att5.sax: add more coverage for the attribute parsing and normalization code. Fri Sep 12 01:34:19 CEST 2003 Daniel Veillard * threads.c: backport of a thread bugfix from 2_5_X branch Thu Sep 11 18:29:18 CEST 2003 Daniel Veillard * parser.c: fixed a bug in one corner case of attribute parsing. Thu Sep 11 16:21:53 CEST 2003 Daniel Veillard * configure.in doc/* : 2.6.0beta1 changes * SAX2.c hash.c parser.c parserInternals.c: Fixing attribute normalization, might not be totally fixed but this should make sure SAX event provide the right strings for attributes except entities for which libxml2 is different by default This should fix #109564 * result/attrib.xml.sax result/ent3.sax result/p3p.sax: minor changes in attribute callback values * result/c14n/with-comments/example-4 result/c14n/without-comments/example-4: this also fixes a subtle bug in the canonicalization tests. Wed Sep 10 12:38:44 CEST 2003 Daniel Veillard Time to commit 3 days of work rewriting the parser internal, fixing bugs and migrating to SAX2 interface by default. There is some work letf TODO, like namespace validation and attributes normalization (this break C14N right now) * Makefile.am: fixed the test rules * include/libxml/SAX2.h include/libxml/parser.h include/libxml/parserInternals.h SAX2.c parser.c parserInternals.c: changing the parser, migrating to SAX2, adding new interface to switch back to SAX1 or initialize a SAX block for v1 or v2. Most of the namespace work is done below SAX, as well as attribute defaulting * globals.c: changed initialization of the default SAX handlers * hash.c tree.c include/libxml/hash.h: added QName specific handling * xmlIO.c: small fix * xmllint.c testSAX.c: provide a --sax1 switch to test the old version code path * result/p3p result/p3p.sax result/noent/p3p test/p3p: the new code pointed out a typo in a very old test namespace Sun Sep 7 19:58:33 PTD 2003 William Brack * xmlIO.c include/libxml/xmlIO.h parser.c: Implemented detection of compressed files, setting doc->compressed appropriately (bug #120503). Sun Sep 7 22:53:06 CEST 2003 Daniel Veillard * parser.c: try to cope with the fact that apps may still have allocated smaller SAX callbak block Sun Sep 7 11:11:45 CEST 2003 Daniel Veillard * dict.c: allow to give -1 for undefined length in lookups * include/libxml/parser.h parser.c parserInternals.c testSAX.c: first round of work on the new SAX2 interfaces, the API will change but commiting before changing for historical reference. Sat Sep 6 10:55:01 PTD 2003 William Brack * SAX2.c, xmlIO.c: fixed bug #121210 (callback to sax->error, sax->warning with wrong params). Fri Sep 5 10:33:42 CEST 2003 Daniel Veillard * include/libxml/globals.h: patch from Stéphane Bidoul to export globals entry points to the python bindings Wed Sep 3 15:24:41 CEST 2003 Daniel Veillard * HTMLparser.c: when creating a DOCTYPE use "html" lowercase by default instead of "HTML" * parser.c xmlreader.c: optimization, gain a few % parsing speed by avoiding calls to "areBlanks" when not needed. * include/libxml/parser.h include/libxml/tree.h: some structure extensions for future work on using per-document dictionaries. Wed Sep 3 15:08:06 CEST 2003 Daniel Veillard * Makefile.am results/*.sax SAXResult/*: removing the SAXresults tree, keeping result in the same tree, added SAXtests to the default "make tests" Tue Sep 2 15:59:04 CEST 2003 Igor Zlatkovic * include/libxml/xmlexports.h: defined additional macros which affect exports and added mingw section Mon Sep 1 15:15:18 PDT 2003 William Brack * doc/index.py: fixed problem parsing xhtml docs * doc/xmlreader.html,doc/guidelines.html: small modification to avoid problem in python parsing. * doc/search.php: fixed upper case filename problem for XSLT docs Mon Sep 1 22:55:09 CEST 2003 Daniel Veillard * xinclude.c: patch from Mark Vakoc that allows compiling with XInclude but without XPointer support. Mon Sep 1 22:31:38 CEST 2003 Daniel Veillard * configure.in xml2-config.in: Applied a patch from Kevin P. Fleming to add --libtool-libs option to xml2-config script. Sun Aug 31 21:52:12 PDT 2003 William Brack * doc/README.docs, doc/Makefile.am: new file added, giving some description of the documentation generation process * doc/search.php: fixed problem with upper case on filenames Fri Aug 29 12:25:01 CEST 2003 Igor Zlatkovic * win32/Makefile.bcb: updates by Eric Zurcher Thu Aug 28 22:58:38 PDT 2003 William Brack * doc/apibuild.py, doc/libxml2-api.xml: enhanced code to compensate for pollution from Igor's header taint (quick before Daniel notices) Thu Aug 28 23:01:36 CEST 2003 Daniel Veillard * SAX2.c: fixed a namespace error on attribute reporting bug pointed out by Tobias Reif * test/p3p result/p3p result/noent/p3p: this test case was wrong using xmlsn instead of xmlns... Thu Aug 28 18:25:07 CEST 2003 Igor Zlatkovic * include/libxml/globals.h include/libxml/xmlexports.h: fixed typos reported by Mark Vakoc Thu Aug 28 08:59:51 MDT 2003 John Fleck add: * doc/tutorial/api.html * doc/tutorial/ar01s09.html * doc/tutorial/includexpath.c updated * doc/tutorial/*.html fix my bad - forgot to check in new files when I last updated Thu Aug 28 14:31:13 CEST 2003 Igor Zlatkovic * win32/Makefile.bcb: new file, support for Borland C++ * xmllint.c: fixed time inclusion for various compilers Thu Aug 28 12:32:59 CEST 2003 Igor Zlatkovic * parser.c parserInternals.c DOCBparser.c HTMLparser.c: added few casts to shut the compiler warnings Thu Aug 28 12:23:51 CEST 2003 Igor Zlatkovic * win32/Makefile.* win32/configure.js: fixed for mingw Thu Aug 28 10:01:44 CEST 2003 Daniel Veillard * globals.c threads.c: fixing bug #120870 try to avoid problem with uninitialized mutexes Wed Aug 27 16:12:41 CEST 2003 Daniel Veillard * relaxng.c: fixed an error reporting bug in Relax-NG when we end up with multiple states, select the "best" one. Fix #120682 * result/relaxng/tutor11_2_3.err: small change resulting Wed Aug 27 11:25:25 CEST 2003 Daniel Veillard * xmlschemastypes.c: applied base64 support patch from Anthony Carrico Wed Aug 27 10:58:51 CEST 2003 Igor Zlatkovic * include/libxml/[threads-xpointer].h: realigned parameters after taint Wed Aug 27 09:59:54 CEST 2003 Igor Zlatkovic * include/libxml/xmlexports.h: fixed defs for Borland compiler, as reported by Eric Zurcher Tue Aug 26 15:54:04 CEST 2003 Daniel Veillard * relaxng.c: fixed bug #120386 again a problem introduced when trying to reuse automata for content validation. Fix a bug report problem on zeroOrMore * result/relaxng/tutor3_7_err: change slightly error reporting. Mon Aug 25 13:24:57 CEST 2003 Daniel Veillard * include/libxml/Makefile.am: make sure the new header will be included when generating a new distribution. Mon Aug 25 12:37:05 CEST 2003 Daniel Veillard * relaxng.c: fixed a couple of stupid bugs in the state allocation routines which led to bug #120040 and the ones reported by Martijn Faassen Mon Aug 25 12:37:23 CEST 2003 Igor Zlatkovic * include/libxml/parserInternals.h include/libxml/relaxng.h include/libxml/SAX.h include/libxml/SAX2.h: realigned the parameters after taint. Mon Aug 25 11:16:01 CEST 2003 Igor Zlatkovic * include/libxml/xmlversion.h.in: moved export defs to a separate file for consistency. * include/libxml/xmlexports.h: new file, contains export defs. Mon Aug 25 11:01:49 CEST 2003 Igor Zlatkovic * include/libxml/*.h genUnicode.py: exportability taint of the headers. Thu Aug 21 12:37:46 CEST 2003 Daniel Veillard * SAX.c: make the deprecated interfaces log an error message to be sure it won't get used. Thu Aug 21 00:50:32 CEST 2003 Daniel Veillard * Makefile.am SAX2.c include/libxml/Makefile.am include/libxml/SAX2.h: Adding new version of the SAX interface, it's not there yet, currently just preparing the work * globals.c parser.c SAX.c include/libxml/SAX.h include/libxml/globals.h include/libxml/parser.h: doing some refactoring of the SAXv1 interfaces, obsoleting a bunch of them while keeping functionalities, preparing SAX2 integration. * dict.c: small cleanup. Wed Aug 20 00:20:01 CEST 2003 Daniel Veillard * tree.c: fixes a small bug introduced in last commit and detected by valgrind. Tue Aug 19 16:54:18 CEST 2003 Daniel Veillard * dict.c hash.c: optimization when freeing hash tables. * parser.c xmlIO.c include/libxml/tree.h: some tuning of buffer allocations * parser.c parserInternals.c include/libxml/parser.h: keep a single allocated block for all the attributes callbacks, avoid useless malloc()/free() * tree.c: do not realloc() when growing a buffer if the buffer ain't full, malloc/memcpy/free avoid copying memory. Mon Aug 18 18:37:01 CEST 2003 Daniel Veillard * xmllint.c doc/xmllint.xml doc/xmllint.1: added option --dtdvalidfpi for Tobias Reif Mon Aug 18 14:03:03 CEST 2003 Daniel Veillard * dict.c include/libxml/dict.h Makefile.am include/libxml/Makefile.am: new dictionary module to keep a single instance of the names used by the parser * DOCBparser.c HTMLparser.c parser.c parserInternals.c valid.c: switched all parsers to use the dictionary internally * include/libxml/HTMLparser.h include/libxml/parser.h include/libxml/parserInternals.h include/libxml/valid.h: Some of the interfaces changed as a result to receive or return "const xmlChar *" instead of "xmlChar *", this is either insignificant from an user point of view or when the returning value changed, those function are really parser internal methods that no user code should really change * doc/libxml2-api.xml doc/html/*: the API interface changed and the docs were regenerated Sun Aug 17 23:05:38 CEST 2003 Daniel Veillard * parser.c: applied patch to xmlCleanupParser from Dave Beckett Sat Aug 16 22:53:42 HKT 2003 William Brack * doc/parsedecl.py, doc/libxml2-refs.xml, doc/API*.html: fixed part (2) of bug 119535 (wrong alpha case on filenames) Sat Aug 16 20:35:28 HKT 2003 William Brack * doc/API*.html, doc/html/*: regenerated API documentation for xmlsoft.org (part of Bug 119535) Fri Aug 15 14:58:37 HKT 2003 William Brack * encoding.c, threads.c, include/libxml/HTMLparser.h, doc/libxml2-api.xml: Minor changes to comments, etc. for improving documentation generation * doc/Makefile.am: further adjustment to auto-generation of win32/libxml2.def.src Fri Aug 15 02:24:20 CEST 2003 Daniel Veillard * News configure.in: preparing libxml2-2.5.10 release * doc/* : updated the doc and rebuilt Fri Aug 15 01:55:53 CEST 2003 Daniel Veillard * parser.c: fixing the xmlSAXParseDTD bug #119536 raised by Malcolm Tredinnick with the patch he suggested. Fri Aug 15 01:37:10 CEST 2003 Daniel Veillard * HTMLparser.c: allocation error #119784 raised by Oliver Stoeneberg Fri Aug 15 00:41:58 CEST 2003 Daniel Veillard * uri.c: fixing an use of strcpy() where both strings overlap pointed out by valgrind. Thu Aug 14 17:10:39 CEST 2003 Daniel Veillard * DOCBparser.c globals.c include/libxml/xmlmemory.h: get rid of some compilation warnings. * xinclude.c: fix the performance problem reported by Kevin Ruscoe plus some cleanup and better error reporting. Thu Aug 14 14:13:43 CEST 2003 Daniel Veillard * encoding.c: applied UTF-16 encoding handling patch provided by Mark Itzcovitz * encoding.c parser.c: more cleanup and fixes for UTF-16 when not having iconv support. Thu Aug 14 03:19:08 CEST 2003 Daniel Veillard * Makefile.am configure.in example/Makefile.am libxml.h nanoftp.c nanohttp.c xmllint.c: Applied patch from Mikhail Grushinskiy for mingw compiler on Windows. Thu Aug 14 02:28:36 CEST 2003 Daniel Veillard * parser.c: fixed the serious CPU usage problem reported by Grant Goodale * HTMLparser.c: applied patch from Oliver Stoeneberg about a free missing in htmlSAXParseDoc Tue Aug 12 22:48:10 HKT 2003 William Brack * doc/Makefile.am: Removed dependency from libxml2.def.src Tue Aug 12 18:55:08 HKT 2003 William Brack * autogen.sh: took away the requirement for automake-1.4, changed the messages for getting auto* tools to current gnu pages. * configure.in: added check for Linux Dec alpha requiring -ieee flag, fixed test for ipv6 * trionan.c: fixed problem for compiling on Linux Dec alpha using native compiler * doc/Makefile.am: implemented regeneration of win32/libxml2.def.src whenever libxml2-api.xml is changed. Mon Aug 11 17:02:23 CEST 2003 Daniel Veillard * parser.c: cleaning up a problem when parsing UTF-16 and libiconv is not used. Sun Aug 10 08:13:22 HKT 2003 William Brack * win32/libxml2.def.src: renerated with fixed libxml2-api.xml Sun Aug 10 00:22:55 CEST 2003 Daniel Veillard * News configure.in: preparing libxml2-2.5.9 release * doc/* : updated the doc and rebuilt Sat Aug 9 20:00:13 CEST 2003 Daniel Veillard * include/libxml/xmlreader.h doc/libxml2-api.xml: changing an enum definition to get a correct API XML description. This was apparently breaking Windows build. Sat Aug 9 13:41:21 CEST 2003 Daniel Veillard * HTMLparser.c: fixed a nasty bug #119387, bad heuristic from the progressive HTML parser front-end on large character data island leading to an erroneous end of data detection by the parser. Some cleanup too to get closer from the XML progressive parser. Sat Aug 9 00:42:47 HKT 2003 William Brack * win32/configure.js: Added in support for the ISO8859X module (patch provided by Jesse Pelton) Fri Aug 8 15:56:32 CEST 2003 Daniel Veillard * HTMLtree.c tree.c threads.c: hum try to avoid some troubles when the library is not initialized and one try to save, the locks in threaded env might not been initialized, playing safe * xmlschemastypes.c: apply patch for hexBinary from Charles Bozeman * test/schemas/hexbinary_* result/schemas/hexbinary_*: also added his tests to the regression suite. Fri Aug 8 18:47:38 HKT 2003 William Brack * win32/defgen.xsl, win32/libxml2.def.src: Bug 119343 (with apologies to Igor) - Enhanced handling of docb and nanohttp. Thu Aug 7 21:13:22 HKT 2003 William Brack * encoding.c: further small changes for warnings when configured with --with-iconv=no Wed Aug 6 12:32:11 HKT 2003 William Brack * error.c trionan.[ch] testThreads.c python/generator.py: further small changes to elminate most of the remaining warnings. Tue Aug 5 23:51:21 HKT 2003 William Brack * error.c HTMLparser.c testC14N.c testHTML.c testURI.c xmlcatalog.c xmlmemory.c xmlreader.c xmlschemastypes.c python/libxml.c include/libxml/xmlmemory.h: small changes to syntax to get rid of compiler warnings. No changes to logic. Mon Aug 4 22:40:54 CEST 2003 Daniel Veillard * doc/libxml2-api.xml doc/html/*: rebuilt the API and docs. Mon Aug 4 21:40:34 CEST 2003 Daniel Veillard * tree.c: fixed a small problem in the patch for #118763 * result/HTML/doc3.htm*: this reverts back to the previous result Sun Aug 3 21:41:49 EDT 2003 Daniel Veillard * doc/FAQ.html doc/xml.html: applied doc patch to xml.html and rebuilt, apparently some C++ wrappers are not available, c.f. bug #118943 Sun Aug 3 21:30:31 EDT 2003 Daniel Veillard * tree.c: fixing HTML attribute serialization bug #118763 applying a modified version of the patch from Bacek * result/HTML/doc3.htm*: this modifies the output from one test Sun Aug 3 21:02:30 EDT 2003 Daniel Veillard * tree.c include/libxml/tree.h: added a new API to split a QName without generating any memory allocation * valid.c: fixed another problem with namespaces on element in mixed content case * python/tests/reader2.py: updated the testcase with Bjorn Reese fix to reader for unsignificant white space * parser.c HTMLparser.c: cleanup. Sun Aug 3 20:55:40 EDT 2003 Daniel Veillard * catalog.c: trying to fix #118754 of possible recursion in the catalogs. Not fantastically happy about the current fix since it's likely to break under very thread intensive concurrent access to the catalog. Better solution might to keep the depth an extra argument to the resolution functions. Sun Aug 3 18:56:54 EDT 2003 Daniel Veillard * valid.c: fixed bug #118712 about mixed content, and namespaced element names. * test/valid/mixed_ns.xml result/valid/mixed_ns*: added a check in the regression tests Fri Aug 1 23:55:23 HKT 2003 William Brack Coninuing work on bug 118559 * DOCBparser.c: removed 2 unsed vars * xmlregexp.c: changed some numeric const to their enum symbols * xmlreader.c: changed one var define from int to enum (a little more to be done, awaiting co-ordination) * relaxng.c: deleted one unused var * xmllint.c: deleted some unused vars, changed one arg val from int to enum * testHTML.c, testDocbook.c: changed some arg vals to enum const * xmlIO.c: fixed typo from last night (small warning msg) Thu Jul 31 22:44:33 HKT 2003 William Brack Working on bug 118559 * error.c: deleted unused variable * parserInternals.c: deleted unneeded 'const' qualifier * parser.c: changed variable type for enum temp storage * xmlIO.c: changed debugging var to be inside #ifdef * valid.c: removed unused variable * HTMLparser.c: removed some unneeded 'const' qualifiers * xpath.c: added some type casts, removed some unused vars * xinclude.c: added one type cast * nanohttp.c: repositioned some #ifdef to avoid unused var * nanoftp.c: removed unused var Wed Jul 30 14:57:55 EDT 2003 Daniel Veillard * HTMLparser.c: applied a patch from William Brack about the problem of parsing very large HTML instance with comments as raised by Nick Kew Wed Jul 30 12:29:38 EDT 2003 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h: applying cleanup patch from Bjorn Reese for xmlTextReaderNodeType() and significant whitespace. There is an enum for node type values now. Wed Jul 30 11:08:21 EDT 2003 Daniel Veillard * encoding.c: applying patch from Peter Jacobi to added ISO-8859-x encoding support when iconv is not available * configure.in include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in: added the glue needed at the configure level and made it the default for Windows Tue Jul 29 16:43:48 EDT 2003 Daniel Veillard * python/generator.py python/libxml.c python/libxml2class.txt: patch from Joachim Bauch + cleanup for Relax NG error callbacks in python Tue Jul 29 12:46:08 EDT 2003 Daniel Veillard * parser.c parserInternals.c tree.c: applied Peter Jacobi encoding cleanup patch, and also avoided a possible memory leak Tue Jul 29 09:28:09 EDT 2003 Daniel Veillard * encoding.c: fix the previous commit Tue Jul 29 12:28:17 HKT 2003 William Brack * HTMLparser.c: fixed problem with comments reported by Nick Kew * encoding.c: added routines xmlUTF8Size and xmlUTF8Charcmp for some future cleanup of UTF8 handling Mon Jul 28 16:39:14 EDT 2003 Daniel Veillard * xpath.c: applied a change suggested by Sean Griffin in bug #118494 about a memory leak in EXSLT Sun Jul 27 14:30:56 EDT 2003 Daniel Veillard * relaxng.c: fixed a Relax-NG compilation/streaming bug introduced when fixing the previous Relax-NG bugs * result/relaxng/*: This slightly changes the output messages of some regression tests. * configure.in: added support of -with-fexceptions for nested C++ support. Thu Jul 24 15:46:02 MDT 2003 John Fleck * doc/tutorial/apa.html * doc/tutorial/apb.html * doc/tutorial/apc.html * doc/tutorial/apd.html * doc/tutorial/ape.html * doc/tutorial/apf.html * doc/tutorial/apg.html * doc/tutorial/aph.html * doc/tutorial/ar01s02.html * doc/tutorial/ar01s03.html * doc/tutorial/ar01s04.html * doc/tutorial/ar01s05.html * doc/tutorial/ar01s06.html * doc/tutorial/ar01s07.html * doc/tutorial/ar01s08.html * doc/tutorial/index.html * doc/tutorial/ix01.html * doc/tutorial/xmltutorial.pdf * doc/tutorial/xmltutorial.xml update tutorial with XPath example Thu Jul 24 17:07:06 IST 2003 Daniel Veillard * SAX.c parser.c: fixing a bug about a special case of namespace handling, this closes bug #116841 Wed Jul 23 20:52:36 IST 2003 Daniel Veillard * relaxng.c result/relaxng/*: checked and fixed the compilation of RNG schemas, fixes a couple of bugs #117097 and #117001 . This slightly changes the output messages of some regression tests. Wed Jul 23 15:15:08 IST 2003 Daniel Veillard * xmlreader.c: fixed an out of bound error #118052 , the good part if that base64 code was not in use yet ... Tue Jul 22 19:42:15 MDT 2003 John Fleck * doc/xmllint.html include html version of the xmllint man page, so an up-to-date version is visible on the Web Mon Jul 21 21:53:43 IST 2003 Daniel Veillard * xinclude.c include/libxml/xinclude.h: added a new API xmlXIncludeProcessTree() to process XInclude only on a subtree this should fix bug #115385 Fri Jul 18 17:11:42 CEST 2003 Daniel Veillard * relaxng.c include/libxml/relaxng.h: adding Get interface for the error callback and parameters of parsing and validation contexts * xmlreader.c: patch to fix bug #117702 about incomplete Read() on text nodes. Wed Jul 16 23:15:53 CEST 2003 Daniel Veillard * parserInternals.c: patch from Dodji Seketeli about UTF16 BOM when using the push XML parser. * result/utf16bom.xml result/noent/utf16bom.xml test/utf16bom.xml: added the test to the regression suite. Tue Jul 15 22:03:13 CEST 2003 Daniel Veillard * globals.c: add xmlThrDefMutex = NULL in xmlCleanupGlobals() as suggested by Rob Richards Tue Jul 15 15:30:55 CEST 2003 Daniel Veillard * DOCBparser.c HTMLparser.c entities.c parser.c relaxng.c xmlschemas.c xpath.c: removed some warnings by casting xmlChar to unsigned int and a couple of others. Fri Jul 11 16:44:22 CEST 2003 Daniel Veillard * xmlschemastypes.c: fixes a segfault on empty hexBinary strings Thu Jul 10 16:02:47 CEST 2003 Daniel Veillard * nanoftp.c nanohttp.c: cleanup patches from Peter Breitenlohner Tue Jul 8 16:02:19 CEST 2003 Daniel Veillard * globals.c threads.c: fixes some problem when freeing unititialized mutexes Tue Jul 8 14:15:07 CEST 2003 Daniel Veillard * nanoftp.c nanohttp.c: the modules should not import directly, some cleanups * xmlschemas.c: Peter Sobisch found a nasty bug in the Schemas validation code. Mon Jul 7 18:00:51 CEST 2003 Daniel Veillard * win32/configure.js: Jesse Pelton pointed out a problem in the javascript code. Mon Jul 7 16:39:31 CEST 2003 Daniel Veillard * NEWS doc/*: regenerated * nanoftp.c nanohttp.c: might fix includes problems with the Ipv6 support on solaris * tree.c: patch from Markus Keim about xmlHasNsProp() on attributes defined as #IMPLIED Sun Jul 6 23:09:13 CEST 2003 Daniel Veillard * configure.in doc/*: preparing release 2.5.8 * nanohttp.c: changed some preprocessor block * xmlschemastypes.c: applied patch from Charles Bozeman adding hexBinary schema datatype and adding support for totalDigits and fractionDigits facets. Sun Jul 6 19:56:18 CEST 2003 Daniel Veillard * debugXML.c xpath.c: fixed 2 bugs pointed in #116448 Sun Jul 6 19:34:17 CEST 2003 Daniel Veillard * xinclude.c: fixed bug #116095 removing the error message when reapplying XInclude to a document. Sat Jul 5 22:40:23 CEST 2003 Daniel Veillard * xmlIO.c: applied small changes to portability layer for compilation on DJGPP Ms-DOS compiler. Sat Jul 5 22:30:25 CEST 2003 Daniel Veillard * parser.c HTMLparser.c: use the character() SAX callback if the cdataBlock ain't defined. * xpath.c: fix bug #115349 allowing compilation when configured with --without-xpath since the Schemas code needs NAN and co. Sat Jul 5 00:51:30 HKT 2003 William Brack Fixed problem with multi-threading, shown by the test program testThreads. After fix, ran mutiple tests on various speed machines (single and dual processor X86), which all seem okay. * catalog.c: added missing xmlRMutexUnlock in xmlLoadCatalog * threads.c: added missing initialisation for condition variable in xmlNewRMutex. Sat Jun 21 16:10:24 CEST 2003 Daniel Veillard Applying IPv6 patch from Archana Shah closing bug #114837 * configure.in: Added checks for IPv6 support and getaddrinfo(). * acconfig.h: Defined HAVE_GETADDRINFO and SUPPORT_IP6. * config.h.in: Defined HAVE_GETADDRINFO and SUPPORT_IP6. * nanoftp.c: Structure xmlNanoFTPCtxt contains either sockaddr_storage field or sockaddr_in field, depending upon the availability of IPv6 support. have_ipv6(): Added to check for run-time IPv6 support. (xmlNanoFTPScanURL), (xmlNanoFTPUpdateURL), (xmlNanoFTPScanProxy): Modified to parse a URI with IPv6 address given in []. (xmlNanoFTPConnect): Changed to use getaddrinfo for address resolution, if it is available on the system, as gethostbyname does not return IPv6 addresses on some platforms. (xmlNanoFTPGetConnection): Modified type of dataAddr variable to sockaddr_storage or sockaddr_in depending upon the IPv6 support. Sending EPSV, EPRT or PASV, PORT depending upon the type of address we are dealing with. * nanohttp.c: (have_ipv6): Added to check for run-time IPv6 support. (xmlNanoHTTPScanURL), (xmlNanoHTTPScanProxy): Modified to parse a URI with IPv6 address given in []. (xmlNanoHTTPConnectHost): Modified to use getaddrinfo if it is available on the system. Also IPv6 addresses will be resolved by gethostbyname only if IPv6 run-time support is available. (xmlNanoHTTPConnectAttempt): Modified to deal with IPv6 address. Sat Jun 14 18:46:51 CEST 2003 Igor Zlatkovic * win32/configure.js include/win32config.h include/libxml/xmlversion.h.in: Applied the patch for BCB by Eric Zurcher. Fri Jun 13 14:27:19 CEST 2003 Daniel Veillard * doc/Makefile.am doc/html/*: reverted back patch for #113521, due to #115104 and while fixing #115101 . HTML URLs must not be version dependant. Fri Jun 13 12:03:30 CEST 2003 Daniel Veillard * entities.c: do not generate " for " outside of attributes * result//*: this changes the output of some tests Mon Jun 9 12:28:58 CEST 2003 Daniel Veillard * parser.c xmlIO.c: trying to fix #114277 about when file remapping and escaping should really be attempted. Mon Jun 9 11:06:09 CEST 2003 Daniel Veillard * doc/*: applied a patch from Gman for building docs * valid.c xmllint.c include/libxml/valid.h: applied a patch from Gary Pennington to provide an allocator for xmlValidCtxt * xmlreader.c: applied patch from Jacek Konieczny fixing bug #113580 about data not being passed immediately. Thu Jun 5 11:31:02 CEST 2003 Daniel Veillard * tree.c: applied a couple of patches from Mark Itzcovitz to handle saving back "UTF-16" documents. Mon Jun 2 21:56:15 MVT 2003 Daniel Veillard * relaxng.c xmlschemas.c include/libxml/schemasInternals.h: commiting some work done while in the Maldives (hence the timezone on the laptop !) * result/schemas/length3* test/schemas/deter0_* test/schemas/group0_*: some tests added too Mon Jun 2 15:34:17 CEST 2003 Daniel Veillard * encoding.c: small fix * xmlIO.c: fixed an error message Tue May 20 14:21:23 CEST 2003 Daniel Veillard * parserInternals.c: fixing Red Hat bug #91013 where xmllint was accepting an improper UTF8 sequence Sat May 17 12:53:11 CEST 2003 Igor Zlatkovic * threads.c: applied the patch from Stéphane Bidoul for getting rid of extra threads in a dynamic library. * win32/configure.js: threads default to 'native' now. Fri May 16 13:17:52 EDT 2003 Daniel Veillard * HTMLtree.c: fixing bug #112904: html output method escaped plus sign character in URI attribute. Thu May 15 18:06:18 EDT 2003 Daniel Veillard * build_glob.py global.data globals.c parser.c include/libxml/globals.h: patch from Stéphane Bidoul for setting up threads global defaults. * doc/libxml2-api.xml: this extends the API with new functions * python/tests/Makefile.am python/tests/reader2.py python/tests/thread2.py: integrated the associated testcase and fixed the error string used in reader2 Wed May 14 14:56:46 EDT 2003 Daniel Veillard * configure.in libxml.spec.in python/Makefile.am: trying to conciliate --with-python= requirements and RPM builds, a PITA really... Tue May 13 18:30:34 EDT 2003 Daniel Veillard * HTMLparser.c: oops last commit introduced a memory leak. Tue May 13 18:10:38 EDT 2003 Daniel Veillard * xmllint.c doc/xmllint.xml: added --nonet option * doc/Makefile.am: fixing #112803 by adding --nonet when calling xsltproc or xmllint * doc/xmllint.xml doc/xmllint.1: also added --schema doc and rebuilt * HTMLparser.c: cleaned up the HTML parser context build when using an URL Tue May 13 16:35:04 EDT 2003 Daniel Veillard * libxml.spec.in: added a comment about bug #112902 Mon May 12 21:58:00 EDT 2003 William Brack * minor cleanup of configure '--help' display * error.c: enhanced xmlParserPrintFileContext to fix bug #109942 Mon May 12 17:53:30 EDT 2003 Daniel Veillard * tree.c: PI nodes in external subset were not freed :-\ fixes bug #112842 Mon May 12 11:23:27 EDT 2003 Daniel Veillard * xmllint.c: added --schema option to run WXS schema validation * xmlschemas.c xmlschemastypes.c include/libxml/schemasInternals.h: tried to improve error reporting in the Schema code, some cleanup too. Sun May 11 16:13:20 EDT 2003 Daniel Veillard * xmlschemas.c: fixed some problems in the handling of errors, and attributes addressed by references. * test/schemas/* result/schemas/*: dropped the verbosity level and added a couple of new tests Sat May 10 16:01:21 EDT 2003 Daniel Veillard * relaxng.c: Stéphane Bidoul found an off by one addressing error on the error handling. Fri May 9 19:08:20 EDT 2003 Daniel Veillard * xmlschemastypes.c: trying to fix #112673 Fri May 9 18:14:16 EDT 2003 Daniel Veillard * DOCBparser.c catalog.c parser.c relaxng.c: removed multiple warning, this fixed a bug and should close #111574 Fri May 9 15:34:32 EDT 2003 Daniel Veillard * xmlschemas.c: fixing bug #104081 with xs:all with an element holding minOccurs="0" * test/schemas/all_* result/schemas/all_*: added some regression tests for that bug * xmllint.c xmlreader.c: patches from Joerg Schmitz-Linneweber and Garry Pennington to compile without schemas support. Thu May 1 10:02:35 CEST 2003 Daniel Veillard * tree.c: fixed a problem with xmlUnlinkNode() for DTDs. Wed Apr 30 14:16:08 CEST 2003 Daniel Veillard * xml2-config.in: try to fix Red hat bug #89957, do not output -L/usr/lib64 * xmlreader.c: fixed a typo in a comment Tue Apr 29 07:32:02 MDT 2003 John Fleck * doc/tutorial/aph.html, ix01.html forgot to cvs add the new files. Thanks to Roland van Laar for pointing this out Tue Apr 29 14:36:49 CEST 2003 Daniel Veillard * xmlschemas.c doc/libxml2-api.xml: fixing a function comment * doc/Makefile.am doc/apibuild.py doc/gnome-xml.sgml: switching to the XML/XSLT doc generation closing #111799 * doc/html/*: complete update of the HTML results Mon Apr 28 14:51:41 CEST 2003 Igor Zlatkovic * win32/defgen.xsl: fixed the conditional for unicode map, removed hardcoded schema entries Mon Apr 28 02:19:00 CEST 2003 Igor Zlatkovic * win32/defgen.xsl: new file, stylesheet for generating win32/libxml2.def.src from doc/libxml2-api.xml * win32/libxml2.def.src: is autogenerated from now on, changes to this file will not appear here anymore Mon Apr 28 00:12:11 CEST 2003 Daniel Veillard * win32/configure.js python/setup.py.in: applied patch from Stéphane Bidoul for the Python bindings on the new release. Sun Apr 27 17:56:21 CEST 2003 Igor Zlatkovic * debugXML.c: included libxml/uri.h for xmlCanonicPath declaration * win32/configure.js: thread-enabled build is now default * win32/libxml2.def.src: added more exports Sun Apr 27 00:23:05 CEST 2003 Daniel Veillard * NEWS doc/*.xsl doc/*.html: updated the web site separated developers from common pages, made the transition to XHTML1, added validity checking to the makefile rules. Sat Apr 26 23:17:51 CEST 2003 Daniel Veillard * parser.c: fix for xmlIOParseDTD same as previous and reported by Petr Pajas Sat Apr 26 15:26:04 CEST 2003 Daniel Veillard * parser.c: applied fix to xmlSAXParseDTD from Malcolm Tredinnick closing #111638 Sat Apr 26 14:00:58 CEST 2003 Daniel Veillard * python/generator.py: fixed a problem in the generator where the way functions are remapped as methods on classes was not symetric and dependant on python internal hash order, as reported by Stéphane Bidoul Fri Apr 25 21:52:33 MDT 2003 John Fleck * doc/tutorial: xmltutorial.xml xmltutorial.pdf *.html add appendix on generating compiler flags, more indexing Sat Apr 26 01:10:48 CEST 2003 Daniel Veillard * triodef.h vms/build_libxml.com: applied patch from Craig A. Berry to get libxml-2.5.7 to compile on OpenVMS Fri Apr 25 18:42:35 CEST 2003 Daniel Veillard * parser.c: fixing an xmlParseDTD bug raised by Petr Pajas Fri Apr 25 15:20:29 CEST 2003 Daniel Veillard * doc/Makefile.am doc/xmlcatalog.1 doc/xmlcatalog_man.xml doc/xmllint.1 doc/xmllint.xml: automated the generation of the man page based on xsltproc and a stylesheet PI in the XML. Fri Apr 25 12:37:33 CEST 2003 Daniel Veillard * doc/xmllint.*: trying to fix #110541 where   generated character preventing rendering by the man command. Fri Apr 25 01:09:23 CEST 2003 Daniel Veillard * NEWS configure.in: preparing release 2.5.7 * doc/*: updated and rebuilt the docs * doc/apibuild.py: fixed the script Thu Apr 24 19:11:12 CEST 2003 Daniel Veillard * Makefile.am doc/apibuild.py: make sure the OOM code don't get in the way of the builds * doc/libxml2-api.xml python/libxml2class.txt: automatic update Thu Apr 24 18:01:46 CEST 2003 Daniel Veillard * Makefile.am testOOM.c testOOMlib.[ch] : integrated the Out Of Memory test from Havoc Pennington #109368 * SAX.c parser.c parserInternals.c tree.c uri.c valid.c xmlmemory.c xmlreader.c xmlregexp.c include/libxml/tree.h include/libxml/parser.h: a lot of memory allocation cleanups based on the results of the OOM testing * check-relaxng-test-suite2.py: seems I forgot to commit the script. Wed Apr 23 17:16:41 CEST 2003 Daniel Veillard * xmlschemastypes.c: trivial fix for 109774 removing a warning Wed Apr 23 15:49:32 CEST 2003 Daniel Veillard * DOCBparser.c SAX.c catalog.c debugXML.c parser.c: try to find more places where xmlCanonicPath() must be used to convert filenames to URLs, trying to fix #111088 Wed Apr 23 09:35:12 CEST 2003 Daniel Veillard * python/libxml.c python/libxml.py: applied patch from Brent M Hendricks adding binding for xmlCatalogAddLocal Tue Apr 22 15:18:01 CEST 2003 Daniel Veillard * HTMLparser.c: tried to fix #98879 again in a more solid way. Tue Apr 22 13:58:43 CEST 2003 Igor Zlatkovic * win32/libxml2.def.src: added more exports from the relaxng and xmlreader clan Tue Apr 22 10:35:13 CEST 2003 Daniel Veillard * SAX.c test/valid/ns* test/result/ns*: applied the patch provided by Brent Hendricks fixing #105992 and integrated the examples in the testsuite. Tue Apr 22 01:06:09 CEST 2003 Daniel Veillard * TODO: updated a bit * configure.in: fixed the comment, threads now default to on * parserInternals.c: fixed an erroneous xmlMallocAtomic() call Mon Apr 21 23:33:38 CEST 2003 Daniel Veillard * globals.c libxml.h parser.c parserInternals.c tree.c xmllint.c xmlreader.c include/libxml/parser.h: a lot of performance work especially the speed of streaming through the reader and push interface. Some thread related optimizations. Nearly doubled the speed of parsing through the reader. Sun Apr 20 10:36:05 MDT 2003 John Fleck * doc/xmllint.xml * doc/xmllint.1 update man page to explain use of --stream Sat Apr 19 02:03:24 CEST 2003 Daniel Veillard * DOCBparser.c HTMLparser.c c14n.c catalog.c encoding.c globals.c nanohttp.c parser.c parserInternals.c relaxng.c tree.c uri.c xmlmemory.c xmlreader.c xmlregexp.c xpath.c xpointer.c include/libxml/globals.h include/libxml/xmlmemory.h: added xmlMallocAtomic() to be used when allocating blocks which do not contains pointers, add xmlGcMemSetup() and xmlGcMemGet() to allow registering the full set of functions needed by a garbage collecting allocator like libgc, ref #109944 Fri Apr 18 16:37:41 CEST 2003 Daniel Veillard * configure.in: switched to have thread support enabled by default, didn't got troubles with ABI compatibility on Linux, hope it won't break on strange OSes, if yes, report the system ID * doc/libxml2-api.xml: just rebuilt the API Fri Apr 18 14:31:15 CEST 2003 Daniel Veillard * libxml.h include/libxml/parser.h parser.c xmlIO.c DOCBparser.c: added support for large file, tested with a 3+GB instance, and some cleanup. * catalog.c: added a TODO * Makefile.am: added some "make tests" comments Thu Apr 17 14:51:57 CEST 2003 Daniel Veillard * relaxng.c: some cleanups * doc/xmlreader.html: extended the document to cover RelaxNG and tree operations * python/tests/Makefile.am python/tests/reader[46].py: added some xmlReader example/regression tests * result/relaxng/tutor*.err: updated the output of a number of tests Thu Apr 17 11:35:37 CEST 2003 Daniel Veillard * relaxng.c: valgrind pointed out an uninitialized variable error. Thu Apr 17 11:06:28 CEST 2003 Daniel Veillard * include/libxml/relaxng.h relaxng.c include/libxml/xmlreader.h xmlreader.c: augnemting the APIs, cleanups. * parser.c: cleanup bug #111005 * xmlIO.c: added some missing comments Wed Apr 16 17:46:50 CEST 2003 Daniel Veillard * relaxng.c xmllint.c: more work on RelaxNG streaming validation trying to improve the subset compiled, and more testing. * doc/downloads.html doc/xml.html doc/xmlmem.html: some updates on the documentation * test/relaxng/tutor11_1_3.xml: fixes the DTD path * result/relaxng/*.err: fix some of the outputs Wed Apr 16 01:28:15 CEST 2003 Daniel Veillard * relaxng.c xmlreader.c xmllint.c include/libxml/relaxng.h include/libxml/xmlreader.h: implemented streaming of RelaxNG (when possible) on top of the xmlReader interface, provided it as xmllint --stream --relaxng .rng .xml This seems to mostly work. * Makefile.am: updated to test RelaxNG streaming Mon Apr 14 18:08:33 CEST 2003 Daniel Veillard * relaxng.c include/libxml/relaxng.h: integrated the regexp based validity checking of fragments of the document for which the RNG can be compiled to regexps. Works on all regression tests, only fix needed is related to error messages. Sun Apr 13 21:51:00 CEST 2003 Daniel Veillard * relaxng.c xmlregexp.c include/libxml/xmlautomata.h include/libxml/xmlregexp.h: Starting work precompiling parts of RelaxNG schemas. Not plugged onto validity checking yet, just the regexp building part. Needed to extend some of the automata and regexp APIs. Fri Apr 11 21:36:21 CEST 2003 Daniel Veillard * xmllint.c xmlreader.c include/libxml/xmlreader.h: make sure xmllint --stream and xmllint --stream --valid returns errors code appropriately Fri Apr 11 10:59:24 CEST 2003 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h: Added the Expand() and Next() operation to work on subtrees within the reader framework. * doc/libxml2-api.xml python/libxml2class.txt: resulting updates * python/tests/reader5.py: added an example for those new functions of the reader. Thu Apr 10 23:38:13 CEST 2003 Daniel Veillard * HTMLtree.c: patch from Vasily Tchekalkin to fix #109865 Thu Apr 10 15:32:44 CEST 2003 Daniel Veillard * xmlreader.c: fixing HasValue for namespace as raised by Denys Duchier Wed Apr 9 14:07:18 CEST 2003 Daniel Veillard * HTMLparser.c include/libxml/HTMLparser.h: exported htmlCreateMemoryParserCtxt() it was static Wed Apr 9 13:21:48 CEST 2003 Daniel Veillard * xmlschemas.c xmlschemastypes.c include/libxml/xmlschemas.h: update from Charles Bozeman for date and duration types * test/schemas/date_0.* test/schemas/dur_0.* result/schemas/date_0.* result/schemas/dur_0.*: updated too Mon Apr 7 12:19:26 CEST 2003 Daniel Veillard * tree.c valid.c xpath.c include/libxml/tree.h include/libxml/valid.h: fixing bug #107129, removing excessive allocation and calls to *printf in the code to build QName strings. Sat Apr 5 11:41:36 CEST 2003 Igoe Zlatkovic * win32/libxml2.def.src: fixed conditional exports, reported by Luke Murray. Fri Apr 4 18:08:00 CEST 2003 Daniel Veillard * parser.c: fixed a possible problem with xmlRecoverMemory() Thu Apr 3 17:24:44 CEST 2003 Daniel Veillard * trio.c trio.h triodef.h trionan.c trionan.h triop.h triostr.c triostr.h: Bjorn sent an update for the TRIO portability layer. Tue Apr 1 21:57:26 CEST 2003 Igor Zlatkovic * win32/libxml2.def.src: exported new functions Tue Apr 1 13:09:46 CEST 2003 Daniel Veillard * configure.in NEWS: preparing release 2.5.6 * doc/*: updated and rebuilt the docs Tue Apr 1 11:52:15 CEST 2003 Daniel Veillard * SAX.c: fixed an uninitialized memory access pointed by valgrind on C14Ntests Tue Apr 1 00:12:28 CEST 2003 Daniel Veillard * relaxng.c: one more fixup of error message reporting Mon Mar 31 18:36:32 CEST 2003 Daniel Veillard * relaxng.c: more work on bug #109225, and fixed an uninitialized variable pointed out by valgrind Mon Mar 31 18:05:22 CEST 2003 Daniel Veillard * relaxng.c: try to work on bug #109225 and provide better error reports. * result/relaxng/* : this change the output of a number of tests * xinclude.c: fixing the parsed entity redefinition problem raised on the list. * test/schemas/date_0.xsd: updated the date test c.f. E2-12 Mon Mar 31 13:19:04 CEST 2003 Daniel Veillard * xmlschemastypes.c: fixed date comparison to handle the tzo The only failures left are disagreements on Notations and '+1' not being allowed for ulong, uint, ushort and ubyte. Mon Mar 31 12:11:47 CEST 2003 Daniel Veillard * xmlschemastypes.c: fixed gMonth parsing routine accordingly to the XML Schemas errata http://www.w3.org/2001/05/xmlschema-errata#e2-12 Sun Mar 30 23:04:18 CEST 2003 Daniel Veillard * relaxng.c xmlschemastypes.c: more work on XML Schemas datatypes and facets support. Currently only schemas with binHex or base64 don't compile. A few error left in the test suite: found 1035 test instances: 919 success 23 failures most are gdate or gdateyear failing check, and a few cases where James clark tests results are strange. * valid.c: allow to reuse the Notation checking routine without having a validation context. * SAX.c: removed a #if 0 Sat Mar 29 17:35:05 CET 2003 Daniel Veillard * xinclude.c: forgot to apply one check from #106931 patch * xmlschemastypes.c: more work on XML Schemas datatypes Sat Mar 29 11:49:25 CET 2003 Daniel Veillard * relaxng.c include/libxml/relaxng.h xmlschemastypes.c: more work on cleaning up XML Schemas datatypes based on James Clark tests test/xsdtest/xsdtest.xml Fri Mar 28 14:24:08 CET 2003 Daniel Veillard * relaxng.c: implemented comparisons for Schemas values. * xmlschemastypes.c include/libxml/xmlschemastypes.h: fixed some bugs in duration handling, comparisons for durations and decimals, removed all memory leaks pointed out by James testsuite. Current status is now found 238 test schemas: 197 success 41 failures found 1035 test instances: 803 success 130 failures Fri Mar 28 00:41:55 CET 2003 Daniel Veillard * xmlschemas.c include/libxml/xmlschemas.h: fixed bugs and memory leaks in the W3C XML Schemas code * xmlschemastypes.c: implemented nonPositiveInteger * test/schemas/length2_0.xsd result/schemas/length2_0_0.err: fixed the test and result. Thu Mar 27 22:23:07 CET 2003 Daniel Veillard * HTMLparser.c tree.c: two patches from James Bursa on the HTML parser and a typo * xmlschemastypes.c: reindenting, fixing a memory access problem with dates. Thu Mar 27 15:53:35 CET 2003 Daniel Veillard * parser.c: fixing #109227 providing more context in case of start/end tag mismatch * python/tests/ctxterror.py python/tests/readererr.py: update the tests accordingly Thu Mar 27 15:22:41 CET 2003 Daniel Veillard * xinclude.c: should fix #109327 errors on memory accesses Thu Mar 27 15:06:13 CET 2003 Daniel Veillard * HTMLtree.c: Fixed reopening of #78662

    is an URI reference Wed Mar 26 22:38:39 CET 2003 Daniel Veillard * xpath.c: fixed bug #109160 on non-ASCII IDs Wed Mar 26 17:30:37 CET 2003 Daniel Veillard * parser.c: Norm suggested a nicer error message for xml:space values errors Wed Mar 26 01:34:19 CET 2003 Daniel Veillard * xpath.c include/libxml/xpath.h: first part of the fix to performance bug #108905, adds xmlXPathOrderDocElems() providing document order for nodes. * python/libxml.c: Python may require TRIO as Albert Chin pointed out Tue Mar 25 16:07:00 CET 2003 Daniel Veillard * xmlschemastypes.c: removing a warning with Sun compiler bug #109154 Tue Mar 25 07:02:56 MST 2003 John Fleck * doc/xmllint.xml * doc/xmllint.1 update xmllint man page with --relaxng option Tue Mar 25 12:07:03 CET 2003 Daniel Veillard * python/setup.py.in : was missing "drv_libxml2.py" Mon Mar 24 19:38:05 CET 2003 Daniel Veillard * tree.c xpath.c: some changes related to the new way of handling Result Value Tree, before 2.5.5 Mon Mar 24 16:36:23 CET 2003 Daniel Veillard * configure.in NEWS: preparing release 2.5.5 * doc/* : updated the documentation and regenerated it. Mon Mar 24 14:56:01 CET 2003 Daniel Veillard * xpath.c: fixed some problems related to #75813 about handling of Result Value Trees Sun Mar 23 22:57:20 CET 2003 Daniel Veillard * uri.c: applied a set of patches from Lorenzo Viali correcting URI parsing errors. Sun Mar 23 22:00:14 CET 2003 Daniel Veillard * parser.c: validity status was not passed back when validating in entities, but raised by Oliver Fischer Sun Mar 23 21:30:50 CET 2003 Daniel Veillard * HTMLtree.c: avoid escaping ',' in URIs Sun Mar 23 12:57:00 CET 2003 Daniel Veillard * parser.c: fixing bug #108976 get the ID/REFs to reference the ID in the document content and not in the entity copy * SAX.c include/libxml/parser.h: more checking of the ID/REF stuff, better solution for #107208 * xmlregexp.c: removed a direct printf, dohhh * xmlreader.c: fixed a bug on streaming validation of empty elements in entities * result/VC/ElementValid8 test/VCM/v20.xml result/valid/xhtml1.xhtml: cleanup of the validation tests * test/valid/id* test/valid/dtds/destfoo.ent result/valid/id*: added more ID/IDREF tests to the suite Sat Mar 22 23:38:08 CET 2003 Daniel Veillard * xmlreader.c: fixed #107043 removing 2 warnings with Sun One compiler. Sat Mar 22 18:50:45 CET 2003 Daniel Veillard * relaxng.c: valgrind'ed and cleaned up a couple of memory issues. Sat Mar 22 16:15:50 CET 2003 Daniel Veillard * SAX.c: fix bug #107208 avoid false duplicates when ID/REFs are defined in entities content Sat Mar 22 15:53:27 CET 2003 Daniel Veillard * SAX.c: Fixed validation bug #108858 on namespace names using entities and reported by Brent Hendricks * xmllint.c: report xmlTextReaderHasValue() result in --stream --debug output. Sat Mar 22 13:32:39 CET 2003 Daniel Veillard * xmlreader.c: fixed bug #108801 reported by Malcolm Tredinnick about the DocType node not being reported sometimes. * python/tests/reader.py: added to test to the regression checks Sat Mar 22 01:57:40 CET 2003 Daniel Veillard * xmlreader.c: fixed bug #108546 on long CDATA (or text nodes) reported by Edd Dumbill Sat Mar 23 01:00:24 CET 2003 Daniel Veillard * HTMLparser.c parser.c parserInternals.c: patch from johan@evenhuis.nl for #107937 fixing some line counting problems, and some other cleanups. * result/HTML/: this result in some line number changes Fri Mar 21 22:19:14 CET 2003 Daniel Veillard * configure.in Makefile.am: fixed Red Hat bug #86118 use libxml2.spec instead of libxml.spec * relaxng.c: fixed some of the error reporting excessive verbosity * catalog.c debugXML.c valid.c xmlreader.c xmlschemas.c xpath.c xmlschemastypes.c: removed some warnings from gcc * doc/libxml2-api.xml: rebuilt Fri Mar 21 17:25:23 CET 2003 Daniel Veillard * relaxng.c: another optimization, for choice this time * result/relaxng/spec1* result/relaxng/tutor12_1* result/relaxng/tutor3_7: cleanups. Fri Mar 21 13:41:23 CET 2003 Daniel Veillard * relaxng.c: fixed xmlRelaxNGNodeMatchesList * test/relaxng/testsuite.xml: augmented the test suite * result/relaxng/spec1* result/relaxng/tutor12_1*: this fixes some schemas validation tests in the presence of foreign namespaces. Fri Mar 21 02:23:34 CET 2003 Daniel Veillard * relaxng.c: added another interleave speedup. Thu Mar 20 17:22:00 CET 2003 Daniel Veillard * xmlschemastypes.c: added integer and fixed one of the IDREFS regression tests pbm * result/relaxng/docbook_0.err: updated Wed Mar 19 21:58:47 CET 2003 Daniel Veillard * valid.c xmlschemastypes.c: attempt to cope with ID/IDREF(S) declared both in the DTD and in the Schemas * relaxng.c: more debug, added a big optimization for * test/relaxng/testsuite.xml: augmented the testsuite * test/relaxng/ result/relaxng: added the RelaxNG spec and a DocBook example to the regression tests Wed Mar 19 11:34:10 CET 2003 Daniel Veillard * check-xsddata-test-suite.py: cosmetic change for output * relaxng.c: try to minimize calls to malloc/free for states. Tue Mar 18 17:50:31 CET 2003 Daniel Veillard * tree.c: removed a warning * xmlschemastypes.c: more cleanup, added ENTITY and ENTITIES support * check-relaxng-test-suite.py check-xsddata-test-suite.py: cleanup/improvements of the regression tests batch * test/relaxng/testsuite.xml: augmented libxml2 own testsuite Tue Mar 18 12:36:22 CET 2003 Daniel Veillard * relaxng.c: fixed error msg cleanup deallocation * xmlschemastypes.c: added a function to handle lists of atomic types, added support for IDREFS Tue Mar 18 01:28:15 CET 2003 Daniel Veillard * relaxng.c valid.c xmlschemastypes.c: added Datatype ID and IDREF, usable from RelaxNG now * include/libxml/xmlschemastypes.h: need to add a new interface because the validation modifies the infoset * test/relaxng/testsuite.xml: extended the testsuite Mon Mar 17 16:34:07 CET 2003 Daniel Veillard * relaxng.c: fixed the last core RelaxNG bug known #107083, shemas datatype ID/IDREF support still missing though. * xmlreader.c: fix a crashing bug with prefix raised by Merijn Broeren * test/relaxng/testsuite.xml: augmented the testsuite with complex inheritance tests Sun Mar 16 18:45:50 CET 2003 Daniel Veillard * relaxng.c: switched back to the previous Relax-NG code base, the derivation algorithm need severe constraining code to avoid combinatorial explosion. Fixed the problem with Sebastian Rahtz TEI based example and other bugs * result/relaxng/*err: updated the results * test/relaxng/testsuite.xml: started a new test suite Sat Mar 15 22:26:46 CET 2003 Daniel Veillard * relaxng.c include/libxml/relaxng.h: After coming to the conclusion that the original RelaxNG validation code was un-fixeable, it got rewritten to use the derivation algorithm from James Clark and redebugged it (nearly) from scratch: found 373 test schemas: 372 success 1 failures found 529 test instances: 529 success 0 failures Tue Mar 11 12:08:23 CET 2003 Daniel Veillard * SAX.c parser.c: fix some recursion problems introduced in the last release. * relaxng.c: more debugging of the RNG validation engine, still problems though. Mon Mar 10 14:10:47 CET 2003 Daniel Veillard * Makefile.am: stop generating wrong result file with * in name * relaxng.c: fixing the include bug raised by Sebastian Rahtz * result/relaxng/demo* test/relaxng/demo: added the tests from Sebastian reproducing the problem. Sun Mar 9 18:02:31 MST 2003 John Fleck * doc/xmllint.1: regenerating man page from xmllint.xml to pick up Aleksey's change Sun Mar 9 13:53:16 2003 Aleksey Sanin * xmllint.c doc/xmllint.xml: use $XMLLINT_INDENT environment variable to control the indentation for the xmllint "--format" option Sat Mar 8 14:27:43 CET 2003 Igor Zlatkovic * encoding.c: applied Gennady's patch against buffer overrun Fri Mar 7 19:29:40 CET 2003 Daniel Veillard * test/xsdtest/xsdtest.xml uri.c: after and exchange with James Clark it appeared I had bug in URI parsing code ... * relaxng.c include/libxml/relaxng.h: completely revamped error reporting to not loose message from optional parts. * xmllint.c: added timing for RNG validation steps * result/relaxng/*: updated the result, all error messages changed Fri Mar 7 15:18:32 CET 2003 Daniel Veillard * xpath.c: fix bug #107804, the algorithm used for document order computation was failing on attributes. Thu Mar 6 22:35:50 CET 2003 Daniel Veillard * valid.c: fix bug #107764 , possibility of buffer overflow in xmlValidDebug() Wed Mar 5 17:41:37 CET 2003 Daniel Veillard * nanoftp.c include/libxml/nanoftp.h: adding xmlNanoFTPDele() from Philipp Dunkel Wed Mar 5 10:57:09 CET 2003 Daniel Veillard * xmlschemastype.c: made powten array static it should not be exported * HTMLparser.c: fix bug #107361 by reusing the code from the XML parser function. * testHTML.c: get rid of valgrind messages on the HTML SAX tests Fri Feb 28 00:23:00 CET 2003 Daniel Veillard * tree.c: fixed a node dump crash on attributes * test/xsdtest/xsdtest.xml test/xsdtest/xsdtest.xsl: fixed an URI test bug and get better output. Thu Feb 27 22:28:40 CET 2003 Daniel Veillard * check-xsddata-test-suite.py: give more infos * relaxng.c: fix a bug reported by Sebastian Rahtz and REF->DEF in attribute values. Thu Feb 27 21:09:32 CET 2003 Daniel Veillard * check-xsddata-test-suite.py test/xsdtest/xsdtest.xml test/xsdtest/xsdtest.xsl: import of the XSD Datatype regression tests from James Clark. Thu Feb 27 18:40:04 CET 2003 Daniel Veillard * relaxng.c xmlschemas.c xmlschemastypes.c include/libxml/xmlschemastypes.h: added param support for relaxng type checking, started to increment the pool of simple types registered, still much work to be done on simple types and facets checkings. Wed Feb 26 16:45:39 CET 2003 Daniel Veillard * entities.c: fixes again one of the problem raised by James Clark in #106788 Wed Feb 26 15:46:48 CET 2003 Daniel Veillard * relaxng.c: Fixed a couple of problem raised by James Clark in bug #107083, the support for ID/IDREF/IDREFS at the WXS datatype level still not fixed though. Mon Feb 24 21:09:19 CET 2003 Daniel Veillard * configure.in: preparing release 2.5.4 * doc/*: updated and rebuilt the docs * relaxng.c: removed warnings * result/relaxng/*: updated the results Mon Feb 24 20:53:17 CET 2003 Daniel Veillard * valid.c: fixes a DTD regexp generation problem. Mon Feb 24 20:12:57 CET 2003 Daniel Veillard * parser.c: fixes bug #105998 about false detection of attribute consumption loop. Mon Feb 24 19:14:57 CET 2003 Daniel Veillard * xinclude.c: Fixes bug #106931 in XInclude entities merging. Mon Feb 24 18:50:35 CET 2003 Daniel Veillard * SAX.c: fixed bug #105992 Mon Feb 24 18:14:16 CET 2003 Daniel Veillard * tree.c: fixed xmlSetProp and al. when the node passed is not an element. * relaxng.c: fixed bugs 7.3 (though not complete) and memory leaks found 373 test schemas: 369 success 4 failures found 529 test instances: 525 success 4 failures * check-relaxng-test-suite.py: added memory debug reporting Mon Feb 24 12:41:54 CET 2003 Daniel Veillard * uri.c parser.c: some warning removal on Igor's patch * tree.c: seems I messed up with #106788 fix * python/libxml.c: fixed some base problems when Python provides the resolver. * relaxng.c: fixed the interleave algorithm found 373 test schemas: 364 success 9 failures found 529 test instances: 525 success 4 failures the resulting failures are bug in the algorithm from 7.3 and lack of support for params Sun Feb 23 14:49:39 CET 2003 Daniel Veillard * parser.c: another fix for nodeinfo in entities problem * tree.c entities.c: fixed bug #106788 from James Clark some spaces need to be serialized as character references. Sat Feb 22 18:28:16 CET 2003 Igor Zlatkovic * parser.c uri.c: fixed the bug I introduced in the path handling, reported by Sebastian Bergmann Sat Feb 22 00:19:48 CET 2003 Daniel Veillard * parser.c: fixing some nodeinfo in entities problem raised by Glenn W. Bach * relaxng.c: implemented the first section 7.3 check * result/relaxng/*: updated the results Fri Feb 21 18:12:19 CET 2003 Daniel Veillard * relaxng.c: fixed some problems in the previous commit and finished implementing 4.16 rules checking found 373 test schemas: 353 success 20 failures found 529 test instances: 519 success 6 failures * result/relaxng/*: updated the results Fri Feb 21 16:37:39 CET 2003 Daniel Veillard * relaxng.c: implemented checks from section 7.2 Thu Feb 20 16:00:31 CET 2003 Daniel Veillard * relaxng.c: implemented the checks from section 7.1, fixed some of the 4.20 and 4.21 problems. found 373 test schemas: 338 success 35 failures found 529 test instances: 519 success 6 failures * result/relaxng/*: updated the results Thu Feb 20 01:09:24 CET 2003 Daniel Veillard * relaxng.c: implemented the 4.20 and 4.21 simplification rules. * result/relaxng/*: updated the results Wed Feb 19 18:30:30 CET 2003 Daniel Veillard * relaxng.c: more bugfixes * result/relaxng/*: updated the results Wed Feb 19 15:39:56 CET 2003 Igor Zlatkovic * DOCBparser.c: obsoleted xmlNormalizeWindowsPath * HTMLparser.c: obsoleted xmlNormalizeWindowsPath * SAX.c: ensured xmlDoc.URL is always canonic * parser.c: obsoleted xmlNormalizeWindowsPath * uri.c include/libxml/uri.h: introduced xmlCanonicPath * xmlIO.c include/libxml/xmlIO.h: obsoleted xmlNormalizeWindowsPath * win32/libxml2.def.src: added few exports Wed Feb 19 14:26:51 CET 2003 Daniel Veillard * Makefile.am configure.in: patched to have shared libraries for Python regression tests and static binaries for gdb debug in my development environment * relaxng.c: more bugfixes found 373 test schemas: 296 success 77 failures found 529 test instances: 516 success 8 failures * result/relaxng/*: updated the results Wed Feb 19 01:17:48 CET 2003 Daniel Veillard * relaxng.c: guess what ! Relax-NG bugfixing, what a surprize... Tue Feb 18 22:09:50 CET 2003 Daniel Veillard * xmlschemastypes.c: float/double check bugfix * tree.c include/libxml/tree.h: exported a function for NMTOKEN validation * xmlreader.c: add a TODO for Jody * relaxng.c: bugfix bugfix bugfix found 373 test schemas: 300 success 73 failures found 529 test instances: 507 success 10 failures * result/relaxng/*: updated the results Tue Feb 18 00:33:17 CET 2003 Daniel Veillard * relaxng.c check-relaxng-test-suite.py: more RelaxNG bug hunting Mon Feb 17 18:23:32 CET 2003 Daniel Veillard * relaxng.c check-relaxng-test-suite.py: more work on the RelaxNG implementation conformance testing. found 373 test schemas: 284 success 89 failures found 529 test instances: 448 success 47 failures * result/relaxng/*: updated the results Sun Feb 16 16:48:38 CET 2003 Daniel Veillard * ChangeLog tree.c doc/libxml-doc.el doc/libxml2-api.xml: applied a patch from Kjartan Maraas to fix some typos Sun Feb 16 16:40:52 CET 2003 Daniel Veillard * relaxng.c: more bug-hunting * testRelax.c include/libxml/relaxng.h: added --tree to dump the intermediate rng tree * python/generator.py: patch from Stéphane Bidoul to fix the generator on python < 2.2 Fri Feb 14 17:49:26 CET 2003 Daniel Veillard * check-relaxng-test-suite.py relaxng.c: more testing on the Relax-NG front, cleaning up the regression tests failures current state and I forgot support for "mixed": found 373 test schemas: 280 success 93 failures found 529 test instances: 401 success 68 failures * tree.c include/libxml/tree.h xmlschemastypes.c: finished and moved the Name, NCName and QName validation routine in tree.c * uri.c: fixed handling of URI ending up with #, i.e. having an empty fragment ID. * result/relaxng/*: updated the results Thu Feb 13 16:49:24 CET 2003 Daniel Veillard * check-xinclude-test-suite.py: improved the script accordingly to the XInclude regression tests updates * xpointer.c: Implemented XPointer element() Scheme W3C PR of 13 November 2002 * result/XPath/xptr/chapterschildseq result/XPath/xptr/vidchildseq test/XPath/xptr/chapterschildseq test/XPath/xptr/vidchildseq: augmented the Xpointer testsuite for the element() scheme Thu Feb 13 12:00:30 CET 2003 Daniel Veillard * relaxng.c: added TODO for the DTD compatibility spec * xinclude.c: more bug fixes driven by the testsuite Tue Feb 11 19:01:02 CET 2003 Daniel Veillard * check-xinclude-test-suite.py xinclude.c: Work on the W3C/NIST regression tests for XInclude, improved the script, improving XInclude error reporting mechanism Mon Feb 10 17:19:14 CET 2003 Daniel Veillard * NEWS doc/* configure.in: preparing release 2.5.3 Mon Feb 10 17:11:22 CET 2003 Daniel Veillard * tree.c: trying to fix #104934 about some XHTML1 serialization issues. Mon Feb 10 16:41:13 CET 2003 Daniel Veillard * encoding.c xmlIO.c: fixing bug #104646 about iconv based encoding conversion when the input buffer stops in the middle of a multibyte char Mon Feb 10 15:24:47 CET 2003 Daniel Veillard * test/relaxng/OASIS/spectest.xml: OASIS RelaxNG testsuite * check-relaxng-test-suite.py: python script to run regression against OASIS RelaxNG testsuite * relaxng.c: some cleanup tweaks * HTMLparser.c globals.c: cleanups in comments * doc/libxml2-api.xml: updated the API * result/relaxng/*: errors moved files, so large diffs but no changes at the semantic level. Mon Feb 10 01:00:31 CET 2003 Daniel Veillard * tree.c: fixing #105678 problem when dumping a namespace node. Mon Feb 10 00:30:01 CET 2003 Daniel Veillard * xpath.c: fixed doc comment problems * python/generator.py python/libxml_wrap.h python/types.c: adding RelaxNG wrappers * python/tests/Makefile.am python/tests/relaxng.py: added a specific test of those early Python RelaxNG bindings Sun Feb 9 15:18:43 CET 2003 Daniel Veillard * libxml.spec.in: fixes a libtool problem on AMD 64bits builds * relaxng.c: found the validation problem I had with interleave when not covering all remaining siblings * Makefile.am test.relaxng/* result/relaxng/*: augmented the testsuite and check the RNG schemas against the RNG schemas given in appendix A Sat Feb 8 18:55:43 CET 2003 Igor Zlatkovic * win32/Makefile.msvc: updates for RelaxNG * win32/Makefile.mingw: updates for RelaxNG * win32/libxml2.def.src: added RelaxNG exports Fri Feb 7 14:00:53 CET 2003 Daniel Veillard * xinclude.c: applied another bug fix from Sean Chittenden Fri Feb 7 13:34:08 CET 2003 Daniel Veillard * configure.in xmllint.c: I f...ed up the default configuration of schemas and --relaxng option display in xmllint, pointed by Morus Walter. * xlink.c: Sean Chittenden pointed a couple of errors in the XLink detection module, fixes bug #105374. Fri Feb 7 01:43:38 CET 2003 Daniel Veillard * xmlschemastypes.c: added the boolean base type. Thu Feb 6 10:23:52 CET 2003 Daniel Veillard * xmlschemastypes.c: started implementing some of the missing default simple types * result/relaxng/*: updated the results Wed Feb 5 15:28:04 CET 2003 Daniel Veillard * NEWS doc/*: updated the docs, ready for 2.5.2 release Wed Feb 5 14:15:59 CET 2003 Daniel Veillard * HTMLparser.c tree.c xmlIO.c: comments cleanups * Makefile.am: use xmllint for doing the RelaxNG tests * configure.in: preparing 2.5.2 made schemas support default to on instead of off * relaxng.c: removed the verbosity * xmllint.c: added --relaxng option * python/generator.py python/libxml_wrap.h: prepared the integration of the new RelaxNG module and schemas * result/relaxng/*: less verbose output Wed Feb 5 12:00:36 CET 2003 Daniel Veillard * valid.c: do not run content model validation if the content is not determinist Wed Feb 5 11:43:58 CET 2003 Daniel Veillard * SAX.c: added the redefinition of namespaced attribute check that was missing as Fabrice Desré pointed out. Wed Feb 5 11:09:29 CET 2003 Daniel Veillard * HTMLparser.c include/libxml/HTMLparser.h: applied HTML improvements from Nick Kew, allowing to do more checking to HTML elements and attributes. Tue Feb 4 23:47:06 CET 2003 Daniel Veillard * xinclude.c: fixing bug #105137 about entities declaration needing to be copied to the including document. Tue Feb 4 20:26:22 CET 2003 Daniel Veillard * catalog.c: fixed bug #104817 with delegateURI * xpath.c: fixing bugs #104123 and #104125 Tue Feb 4 17:12:56 CET 2003 Daniel Veillard * configure.in valid.c xmlreader.c python/libxml_wrap.h python/types.c: fixing #104096 to compile without regexps Tue Feb 4 16:31:55 CET 2003 Daniel Veillard * valid.c: fixing bug #103969 forgot to add an epsilon transition when building the automata for elem* Tue Feb 4 16:21:07 CET 2003 Daniel Veillard * HTMLparser.c: applied patch from Arne de Bruijn fixing bug #103827 Tue Feb 4 16:17:09 CET 2003 Daniel Veillard * HTMLparser.c: updating a comment, fixing #103776 Tue Feb 4 16:05:53 CET 2003 Daniel Veillard * parser.c: fixing bug 105049 for validity checking of content within recursive entities. Tue Feb 4 15:40:54 CET 2003 Daniel Veillard * HTMLparser.c: try to fix # 105049 * relaxng.c xmlschemastypes.c: a couple of changes and extensions * tree.c: updated a function comment Tue Feb 4 00:20:58 CET 2003 Daniel Veillard * relaxng: more work on grammars and refs/defs * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Mon Feb 3 14:16:59 CET 2003 Daniel Veillard * relaxng: more work on name classes, except support * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Mon Feb 3 11:56:05 CET 2003 Daniel Veillard * relaxng: more work on name classes, the "validate all" schemas seems to work now. * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Mon Feb 3 09:50:26 CET 2003 Daniel Veillard * python/libxml.c: removed an unprotedted debug message Aleksi Suhonen * parser.c: put a guard against infinite document depth, basically trying to avoid another kind of DoS attack. * relaxng.c: some code w.r.t. nameClasses Sun Feb 2 17:01:43 CET 2003 Daniel Veillard * test/relaxng/* result/relaxng/*: check all the namespace support was actually correct based on tutorial section 10. Sun Feb 2 15:33:38 CET 2003 Daniel Veillard * relaxng: include seems to work okay now * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Sat Feb 1 19:44:58 CET 2003 Daniel Veillard * relaxng.c: a bit of work done in the train back. * test/relaxng/*: added one of the include tests Thu Jan 30 14:06:55 CET 2003 Daniel Veillard * relaxng: more work done in the train * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Wed Jan 29 23:44:58 CET 2003 Daniel Veillard * relaxng.c: debugging of externalRef * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Wed Jan 29 22:06:04 CET 2003 Daniel Veillard * relaxng.c: more work on Relax-NG, implementing externalRef * test/relaxng/* result/relaxng/*: augmented/updated the regression tests * Makefile.am: cleanup to Relaxtests target Wed Jan 29 00:08:38 CET 2003 Daniel Veillard * relaxng.c: more work on Relax-NG, implementing interleave * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Tue Jan 28 21:56:49 CET 2003 Daniel Veillard * relaxng.c: more work on Relax-NG, implementing interleave * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Mon Jan 27 07:35:29 MST 2003 John Fleck * doc/tutorial/customfo.xsl * doc/tutorial/customhtml.xsl adding stylesheet customizations used to generate fo for pdf and html Mon Jan 27 13:29:43 CET 2003 Daniel Veillard * relaxng.c: more work on Relax-NG * test/relaxng/* result/relaxng/*: augmented/updated the regression tests * xmlschemastypes.c: added a number of base type definition but not the associated checks, those are still TODOs Sun Jan 26 17:37:06 MST 2003 John Fleck in docs/tutorial: * apa.html * apb.html * apc.html * apd.html * ape.html * apf.html * apg.html * ar01s02.html * ar01s03.html * ar01s04.html * ar01s05.html * ar01s06.html * ar01s07.html * ar01s08.html * index.html * xmltutorial.pdf * xmltutorial.xml add index to tutorial Sun Jan 26 17:02:29 MST 2003 John Fleck * doc/xmlcatalog.1 * doc/xmlcatalog_man.html * doc/xmlcatalog_man.xml belatedly fixing bug #93622 (adds rewriteURI type to "--add" option in xmlcatalog man page Sun Jan 26 20:47:26 CET 2003 Daniel Veillard * xmlcatalog.c xmllint.c: applied patch for NetBSD by Julio Merino, closing #104475 Sun Jan 26 20:38:43 CET 2003 Daniel Veillard * relaxng.c: more work on Relax-NG * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Sun Jan 26 01:49:58 CET 2003 Daniel Veillard * relaxng.c: more work on Relax-NG * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Sat Jan 25 18:59:54 CET 2003 Daniel Veillard * README: updated the policy on private mail answers * relaxng.c: more work on Relax-NG * test/relaxng/* result/relaxng/*: augmented/updated the regression tests Fri Jan 24 15:12:44 CET 2003 Daniel Veillard * error.c parser.c tree.c: applied a documentation patch from Stefan Kost Fri Jan 24 02:00:50 CET 2003 Daniel Veillard * relaxng.c: more work on Relax-NG * doc/*: regenerated the docs * test/relaxng/* result/relaxng/*: updated and augmented the Relax-NG regression tests and results Thu Jan 23 19:26:20 CET 2003 Daniel Veillard * Makefile.am configure.in relaxng.c include/libxml/relaxng.h: First commit of the new Relax-NG validation code, not generally useful yet. * test/relaxng/* result/relaxng/*: current state of the regression tests Thu Jan 23 19:22:54 CET 2003 Daniel Veillard * tree.c: minimized the memory allocated for GetContent and a bit of cleanup. Thu Jan 23 17:41:37 CET 2003 Daniel Veillard * python/generator.py: seems there is no good reasons to not generate bindings for XPointer Tue Jan 21 13:19:35 CET 2003 Daniel Veillard * xmlreader.c doc/apibuild.py: applied a new patch from Stéphane Bidoul for cleanups * doc/libxml2-api.xml: rebuilt the API description with new entry points Mon Jan 20 23:25:00 CET 2003 Daniel Veillard * xmlreader.c python/drv_libxml2.py python/generator.py python/libxml.c python/libxml.py python/libxml_wrap.h python/types.c: patch from Stéphane Bidoul for better per context error message APIs * python/tests/ctxterror.py python/tests/readererr.py: update of the tests Sun Jan 19 17:09:28 MST 2003 John Fleck * doc/guidelines.html grammar and spelling cleanup Fri Jan 17 00:31:30 CET 2003 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h python/generator.py python/libxml.c python/libxml.py win32/libxml2.def.src: applied a patch from Stéphane Bidoul to allow per XMLtextReader error and warning handling * python/tests/Makefile.am python/tests/readererr.py: adding the specific regression test Tue Jan 14 17:00:08 CET 2003 Daniel Veillard * xpath.c: Alexey Efimov pointed out that concat('a', 'b', ) should raise a syntax error Tue Jan 14 15:39:14 CET 2003 Daniel Veillard * python/libxml.c: cleanup patch from Stéphane Bidoul Tue Jan 14 14:41:18 CET 2003 Daniel Veillard * encoding.c: fixing bug #103100 with a dummy UTF8ToUTF8 copy Tue Jan 14 12:40:29 CET 2003 Daniel Veillard * python/generator.py python/libxml.c python/libxml.py python/libxml_wrap.h python/types.c: applied and fixed a patch from Stéphane Bidoul to provide per parser error handlers at the Python level. * python/tests/Makefile.am python/tests/ctxterror.py: added a regression test for it. Tue Jan 14 01:15:04 CET 2003 Daniel Veillard * xmlreader.c: fixed the streaming property of the reader, it was generating tree faster than consuming it. Pointed out by Nate Myers * tree.c: fixed a bug in xmlSaveFormatFileEnc if passed a NULL doc Sun Jan 12 22:18:02 CET 2003 Igor Zlatkovic * win32/libxml2.def.src: added more xmlreader and other exports Fri Jan 10 18:04:32 CET 2003 Daniel Veillard * xpath.c: fix to the XPath implementation for parent and ancestors axis when operating on a Result Value Tree. Fixes bug #100271 Fri Jan 10 17:07:01 CET 2003 Daniel Veillard * nanoftp.c nanohttp.c xmlIO.c: patch from Stefano Zacchiroli to fix some URI/file escaping problems Fri Jan 10 16:20:34 CET 2003 Daniel Veillard * python/generator.py: fixed a bug raised by Raymond Wiker, docSetRootElement() should not raise an exception if the return is None Fri Jan 10 14:13:03 CET 2003 Daniel Veillard * python/libxml.py python/libxml.c python/libxml2-python-api.xml: fixed bug #102181 by applying the suggested change and fixing the generation/registration problem. Fri Jan 10 13:47:55 CET 2003 Daniel Veillard * HTMLparser.c: fixed bug #102960 by reusing the XML name parsing routines. Fri Jan 10 00:16:49 CET 2003 Daniel Veillard * parser.c: one more IsEmptyElement crazyness, that time in external parsed entities if substitution is asked. * python/tests/reader3.py: added a specific test. Thu Jan 9 22:35:31 CET 2003 Daniel Veillard * python/drv_libxml2.py: update from Stéphane Bidoul: python 2.1 support and improved error handler registration Thu Jan 9 14:16:38 CET 2003 Daniel Veillard * HTMLtree.c tree.c: fixes #102920 about namespace handling in HTML output and section 16.2 "HTML Output Method" of XSLT-1.0 * README: fixed a link Wed Jan 8 18:32:25 CET 2003 Daniel Veillard * configure.in doc/* NEWS: preparing 2.5.1 release * SAX.c parser.c: fixing XmlTextReader bug Wed Jan 8 00:13:01 CET 2003 Daniel Veillard * SAX.c: fuck, I introduced a memory leak on external parsed entities in 2.5.0 :-( Tue Jan 7 12:12:45 CET 2003 Daniel Veillard * xmllint.c: another fix needed as pointed by Christophe Merlet for --stream --debug if compiled without debug support. Mon Jan 6 20:53:08 MST 2003 John Fleck * doc/xmllint.xml * doc/xmllint.1: update man page with --stream and --chkregister Tue Jan 7 01:17:26 CET 2003 Daniel Veillard * globals.c: fixed --with-threads compile * xmllint.c: fixed --without-debug compile * include/libxml/globals.h: cleanup * include/libxml/schemasInternals.h: add a missing include Mon Jan 6 14:06:07 CET 2003 Daniel Veillard * configure.in NEWS: preparing 2.5.0 release * SAX.c: only warn in pedantic mode about namespace name brokeness * globals.c: fix a doc generation problem * uri.c: fix #101520 * doc/*: updated and rebuilt the doc for the release, includuding stylesheet update * python/Makefile.am: fix a filename bug Mon Jan 6 12:05:12 CET 2003 Daniel Veillard * doc/tutorial/* : fixed #101894 if doc == NULL xmlFreeDoc should not be called. Mon Jan 6 11:59:09 CET 2003 Daniel Veillard * libxml-2.0.pc.in: applied the patch to fix #101894 Sun Jan 5 23:35:47 CET 2003 Daniel Veillard * tree.c : applied patch from Lukas Schroeder for register callbacks * valid.c: modified patch from Lukas Schroeder to test register callbacks with --chkregister Sun Jan 5 02:23:20 CET 2003 Daniel Veillard * xmlreader.c: seriously changed the way data are pushed to the underlying parser, go by block of 512 bytes instead of tryng to detect tag boundaries at that level. Changed the way empty element are detected and tagged. * python/tests/reader.py python/tests/reader2.py python/tests/reader3.py: small changes mostly due to context reporting being different and DTD node being reported. Some errors previously undetected are now caught and fixed. * doc/xmlreader.html: flagged last section as TODO Sat Jan 4 20:40:28 CET 2003 Daniel Veillard * python/libxml.py: integrated the Python 2.2 optimizations from Hannu Krosing, while maintaining compatibility with 1.5 and 2.1 Sat Jan 4 17:33:17 CET 2003 Daniel Veillard * xmllint.c: a bit of cleanup * xmlreader.c: small fix * doc/xmlreader.html: more work on the XmlTextReader tutorial * python/libxml.py: a few fixes pointed out by Hannu Krosing Sat Jan 4 13:46:14 CET 2003 Daniel Veillard * python/setup.py.in: patch from Stéphane Bidoul to include drv_libxml2.py in setup.py Sat Jan 4 01:43:06 CET 2003 Daniel Veillard * doc/xmlreader.html: starting documenting the new XmlTextReader interface. Fri Jan 3 17:18:32 CET 2003 Daniel Veillard * xmllint.c: added the --stream flag to use the TextReader API * xmlreader.c: small performance tweak Fri Jan 3 13:50:55 CET 2003 Daniel Veillard * xmlreader.c python/tests/reader2py: okay the DTD validation code on top of the XMLTextParser API should be solid now. Fri Jan 3 02:17:18 CET 2003 Daniel Veillard * xmlreader.c python/tests/reader2py: Fixing some more mess with validation and recursive entities while using the reader interface, it's getting a bit messy... Thu Jan 2 15:15:26 CET 2003 Daniel Veillard * xmlreader.c python/tests/reader.py: another couple of problem related to IsEmptyElement reported by Stéphane Bidoul needed some fixes. Thu Jan 2 13:57:07 CET 2003 Daniel Veillard * libxml.spec.in python/Makefile.am python/drv_libxml2.py: integrated drv_libxml2.py Python xml.sax driver from Stéphane Bidoul based on the python XmlTextReader interface. Wed Jan 1 22:05:40 CET 2003 Daniel Veillard * tree.c: backing out one change in the last patch which broke the regression tests Wed Jan 1 21:57:28 CET 2003 Daniel Veillard * global.data globals.c tree.c include/libxml/globals.h: applied an old patch from Lukas Schroeder to track node creation and destruction. Probably missing a lot of references at the moment and not usable reliably. Wed Jan 1 20:12:07 CET 2003 Daniel Veillard * NEWS doc/Makefile.am doc/news.xsl: generate the NEWS file from doc/news.html and a stylesheet Wed Jan 1 16:09:57 CET 2003 Daniel Veillard * xmlreader.c python/tests/reader.py: fixed another couple of xmlreader bugs reported by Stéphane Bidoul and added tests. Wed Jan 1 15:42:54 CET 2003 Daniel Veillard * xmlreader.c python/tests/reader2.py: fixed another validity checking in external parsed entities raised by Stéphane Bidoul and added a specific regression test. * python/tests/reader3.py: cleanup Tue Dec 31 15:44:02 CET 2002 Daniel Veillard * xmlreader.c python/tests/reader2.py: fixed a problem with validation within entities pointed by Stéphane Bidoul, augmented the tests to catch those. Tue Dec 31 12:15:37 CET 2002 Daniel Veillard * python/generator.py: modified the generator to allow keeping class references when creating new classes, needed to fix a bug pointed by Stéphane Bidoul where the input buffer of the xmlTextReader instance gets destroyed if the python wrapper for the input is not referenced anymore. Mon Dec 30 19:39:36 CET 2002 Daniel Veillard * xmlreader.c python/tests/reader.py: fixed another pair of problem pointed by Stéphane Bidoul: depth start at 0 and a parse problem. Mon Dec 30 13:36:50 CET 2002 Daniel Veillard * xmlreader.c python/tests/reader.py: fixed another problem pointed by Stéphane Bidoul Mon Dec 30 12:39:55 CET 2002 Daniel Veillard * xmlreader.c python/tests/reader.py: fixed a limit case problem with "" Mon Dec 30 11:53:44 CET 2002 Daniel Veillard * SAX.c: warn on xmlns:prefix="foo" * xmlreader.c python/tests/reader.py: fixed a couple of problem for namespace attributes handling. Mon Dec 30 00:59:07 CET 2002 Daniel Veillard * entities.c parser.c tree.c include/libxml/entities.h: Fixed a really nasty problem raised by a DocBook XSLT transform provided by Sebastian Bergmann Sun Dec 29 12:13:18 CET 2002 Daniel Veillard * xmlreader.c python/tests/reader.py: fixed a bug pointed out by Stéphane Bidoul and integrated it into the tests Sat Dec 28 23:49:12 CET 2002 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: extended the XmlTextReader API a bit, addding accessors for the current doc and node, and an entity substitution mode for the parser. * python/libxml.py python/libxml2class.txt: related updates * python/tests/Makefile.am python/tests/reader.py python/tests/reader2.py python/tests/reader3.py: updated a bit the old tests and added a new one to test the entities handling Sat Dec 28 22:11:57 CET 2002 Daniel Veillard * python/generator.py python/libxml2class.txt python/tests/reader.py python/tests/reader2.py: changed the generator to provide casing for the XmlTextReader similar to C# so that examples and documentation are more directly transposable. Fixed the couple of tests in the suite. Sat Dec 28 15:55:32 CET 2002 Daniel Veillard * doc/guidelines.html: added a document on guildeline for publishing and deploying XML Fri Dec 27 20:35:15 CET 2002 Daniel Veillard * valid.c xmlreader.c: final touch running DTD validation on the XmlTextReader * python/tests/Makefile.am python/tests/reader2.py: added a specific run based on the examples from test/valid/*.xml Fri Dec 27 15:17:20 CET 2002 Daniel Veillard * python/libxml.py: added a few predefined xmlTextReader parser configuration values. Fri Dec 27 12:57:22 CET 2002 Daniel Veillard * python/libxml_wrap.h: trying to fix #102037 Fri Dec 27 12:18:14 CET 2002 Daniel Veillard * SAX.c: fixing bug #95296, when the predefined entities are redefined in the DTD the default one must be used instead anyway. Wed Dec 25 19:22:06 MST 2002 John Fleck * doc/xmllint.xml * doc/xmllint.1 Add discussion of XML_DEBUG_CATALOG to xmllint man page - bug #100907 Mon Dec 23 16:54:22 CET 2002 Daniel Veillard * xmlreader.c: Fixed the empty node detection to avoid reporting an inexistant close tag. Mon Dec 23 15:42:24 CET 2002 Daniel Veillard * python/libxml.c python/setup.py.in: patch from Stéphane Bidoul for Python 2.1 Sun Dec 22 11:24:06 CET 2002 Daniel Veillard * testC14N.c vms/config.vms: applied Craig A. Berry patches for VMS Fri Dec 20 11:27:49 CET 2002 Daniel Veillard * doc/libxml2-api.xml python/tests/reader.py: one really need to provide the base URI information when creating a reader parser from an input stream. Updated the API and the example using it. Fri Dec 20 01:11:30 CET 2002 Daniel Veillard * testReader.c xmlreader.c valid.c include/libxml/tree.h include/libxml/valid.h include/libxml/xmlreader.h: working on DTD validation on top of xml reader interfaces. Allows to validate arbitrary large instances. This required some extensions to the valid module interface and augmenting the size of xmlID and xmlRef structs a bit. * uri.c xmlregexp.c: simple cleanup. Wed Dec 18 15:51:22 CET 2002 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: more work on the xml reader interfaces. * AUTHORS MAINTAINERS doc/* win32/*: updated Igor's mail and the Web page for the Windows binaries. Tue Dec 17 19:31:07 CET 2002 Daniel Veillard * xmlIO.c: applied a patch for VMS following the report by Nigel Hall Tue Dec 17 11:29:41 CET 2002 Daniel Veillard * parser.c: the parseStartTag bug fix wasn't complete. Mon Dec 16 23:00:05 CET 2002 Daniel Veillard * parser.c: Vyacheslav Pindyura managed to trigger a bug in parseStartTag, fixing it. * test/att4 result/att4 result/noent/att4: adding the test * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: added more methods to XmlTextReader. Mon Dec 16 19:31:16 CET 2002 Igor Zlatkovic * win32/libxml2.def.src: added more xml reader exports * win32/Makefile.msvc win32/Makefile.mingw: added xml reader interface to the build Mon Dec 16 06:36:54 MST 2002 John Fleck * doc/tutorial/xmltutorial.xml plus generated html and pdf Updating tutorial again based on further comments from Niraj Tolia on the last iteration Sun Dec 15 21:27:30 MST 2002 John Fleck * doc/tutorial/xmltutorial.xml * doc/tutorial/includekeyword.c * doc/tutorial/includegetattribute.c plus generated html and pdf Adding fix from Niraj Tolia to tutorial to properly free memory. Mon Dec 16 00:34:25 CET 2002 Daniel Veillard * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: added more methods of XmlTextReader. * python/libxml2class.txt python/tests/reader.py: this increased the methods in the bndings, augmented the test to check those new functions. Sat Dec 14 23:57:39 CET 2002 Daniel Veillard * xmlreader.c doc/libxml2-api.xml: added the close and getattribute methods of XmlTextReader. * python/generator.py python/libxml_wrap.h python/types.c python/libxml2class.txt: added the reader to the Python bindings * python/tests/Makefile.am python/tests/reader.py: added a specific test for the Python bindings of the Reader APIs * parser.c: small cleanup. Fri Dec 13 11:39:44 CET 2002 Daniel Veillard * xinclude.c: fallback was only copying the first child not the full child list of the fallback element, closes #89684 as reopened by Bernd Kuemmerlen Thu Dec 12 13:34:59 CET 2002 Igor Zlatkovic * win32/libxml2.def.src: exported htmlNodeDumpOutput Thu Dec 12 10:59:11 CET 2002 Daniel Veillard * configure.in: preparing release of 2.4.30 * doc/apibuild.py doc/libxml2-api.xml: fixups to the api builder, gives enum values, fix functype return type, put back fields in structs * doc/*: updated the docs rebuilt Thu Dec 12 01:09:34 CET 2002 Daniel Veillard * HTMLtree.c include/libxml/HTMLtree.h: patch from Mark Vakoc about htmlNodeDumpOutput location. * xpath.c: removed an undefined function signature * doc/apibuild.py doc/libxml2-api.xml: the script was exporting too many symbols in the API breaking the python bindings. Updated with the libxslt/libexslt changes. Wed Dec 11 20:26:15 CET 2002 Daniel Veillard * configure.in: preparing release of 2.4.29 * doc/*: rebuilt the docs and API * xmlreader.c: a few more fixes for the XmlTextReader API Wed Dec 11 18:01:15 CET 2002 Igor Zlatkovic * include/win32config.h: applied mingw patch from Magnus Henoch Wed Dec 11 16:58:48 CET 2002 Daniel Veillard * catalog.c doc/libxml2-api.xml: a bit more cleanup Wed Dec 11 14:54:47 CET 2002 Daniel Veillard * doc/apibuild.py doc/libxml2-api.xml doc/Makefile.am: new API building Python script, does the C parsing directly, generates a better API description including structure fieds defs and enums. Still a couple of bugs, but good enough for the python wrappers now. * DOCBparser.c SAX.c nanohttp.c parser.c parserInternals.c tree.c valid.c xmlIO.c xmlmemory.c xmlreader.c xmlregexp.c xmlschemas.c include/libxml/schemasInternals.h include/libxml/tree.h: more cleanup based on the python analysis script reports. * libxml.spec.in: make sure the API XML description is part of the devel package. Tue Dec 10 16:16:34 CET 2002 Daniel Veillard * DOCBparser.c HTMLparser.c c14n.c debugXML.c encoding.c hash.c nanoftp.c nanohttp.c parser.c parserInternals.c testC14N.c testDocbook.c threads.c tree.c valid.c xmlIO.c xmllint.c xmlmemory.c xmlreader.c xmlregexp.c xmlschemas.c xmlschemastypes.c xpath.c: code cleanup, especially the function comments. * tree.c: fixed a small bug when freeing nodes which are XInclude ones. Mon Dec 9 15:08:17 CET 2002 Daniel Veillard * Makefile.am xmlreader.c include/libxml/Makefile.am include/libxml/xmlreader.h: Adding a new set of APIs based on the C# TextXmlReader API but converted to C. Allow to parse in constant memory usage, far simpler to program and explain than the SAX like APIs, unfinished but working. * testReader.c: test program Sun Dec 8 18:36:01 CET 2002 Igor Zlatkovic * win32/libxml2.def.src: applied YALDSP from Mark Vakoc Wed Dec 4 16:08:49 CET 2002 Daniel Veillard * tree.c: Chip turner indicated that XHTML1 serialization rule for style actually break on both IE and Mozilla, try to avoid the rule if escaping ain't necessary Wed Dec 4 12:43:28 CET 2002 Daniel Veillard * nanhttp.c: handle HTTP URL escaping, problem reported by Glen Nakamura and Stefano Zacchiroli Sat Nov 30 12:19:17 CET 2002 Daniel Veillard * DOCBparser.c HTMLparser.c parser.c valid.c xpath.c: code cleanup Thu Nov 28 12:53:22 CET 2002 Daniel Veillard * uri.c: Johann Richard pointed out some XPointer problems for URN based URI references in XInclude. Modified the URI parsing and saving routines to allow correct parsing and saving of XPointers, especially when attached to "opaque" scheme accordingly to RFC 2396 Wed Nov 27 20:36:08 CET 2002 Daniel Veillard * HTMLtree.c include/libxml/HTMLtree.h: applied the same kind of refactoring to the HTML saving code. * doc/libxml2-*.xml doc/API*.html: slight API changes got reflected in the doc. Wed Nov 27 12:40:16 CET 2002 Daniel Veillard * tree.c include/libxml/tree.h: refactored the XML dump of a node to a buffer API to reuse the generic dump to an OutputIO layer, this reduces code, fixes xmlNodeDump() for XHTML, also made xmlNodeDump() now return the number of byte written. Wed Nov 27 09:00:00 CET 2002 Daniel Veillard * python/setup.py.in: another patch from Stéphane Bidoul for Python bindings on Windows * doc/parsedecl.py: small cleanup Mon Nov 25 17:28:53 CET 2002 Daniel Veillard * libxml.spec.in configure.in: add a line in %changelog for releases Mon Nov 25 14:18:27 CET 2002 Daniel Veillard * parser.c: patch from Marcus Clarke fixing a problem in entities parsing that was detected in KDe documentations environment. Mon Nov 24 14:13:21 CET 2002 ERDI Gergo * python/libxml.c (libxml_prev): Return the previous as opposed to the next node (I guess this is the result of some cut & paste programming:) Sat Nov 23 17:22:22 CET 2002 Daniel Veillard * doc/Makefile.am: Jan Rafaj pointed a bug in the Makefile. Sat Nov 23 12:21:24 CET 2002 Daniel Veillard * python/generator.py python/libxml.c python/setup.py.in: trying to fix the Python bindings build on Windows (Stéphane Bidoul) Fri Nov 22 22:41:34 CEST 2002 Igor Zlatkovic * win32/configure.js: added option for python bindings * win32/libxml2.def.src: added more exports Fri Nov 22 18:50:34 CET 2002 Igor Zlatkovic * win32/Makefile.mingw: fixed unresolved symbols when linking with pthreads * win32/wince/*: applied updates to Windows CE port from Javier Fri Nov 22 15:51:22 CET 2002 Daniel Veillard * configure.in: preparing 2.4.28 * libxml.spec.in doc/Makefile.am: some cleanup * doc/*: updated the news and regenerated. Fri Nov 22 14:15:14 CET 2002 Daniel Veillard * HTMLparser.c: final touch at closing #87235

    end tags need to be generated. * result/HTML/cf_128.html result/HTML/test2.html result/HTML/test3.html: this change slightly the output of a few tests * doc/*: regenerated Fri Nov 22 13:26:19 CET 2002 Daniel Veillard * parserInternals.c: fixing bug #99190 when UTF8 document are parsed using the progressive parser and the end of the chunk is in the middle of an UTF8 multibyte character. Fri Nov 22 13:13:00 HKT 2002 William Brack * threads.c: fixed initialization problem in xmlNewGlobalState which was causing crash. * globals.c: removed duplicate call to initxmlDefaultSAXHandler in xmlInitializeGlobalState. * parserInternals.c: cleaned up ctxt->sax initialisation. Thu Nov 21 15:05:45 CET 2002 Daniel Veillard * tree.c include/libxml/tree.h: modified the existing APIs to handle XHTML1 serialization rules automatically, also add xmlIsXHTML() to libxml2 API. Some tweaking to make sure libxslt serialization uses it when needed without changing the library API. * test/xhtml1 result/noent/xhtml1 result/valid/xhtml1.xhtml result/xhtml1: added a new test specifically for xhtml1 output and updated the result of one XHTML1 test Wed Nov 20 14:24:56 CET 2002 Daniel Veillard * xinclude.c parserInternals.c encoding.c: fixed #99082 for xi:include encoding="..." support on text includes. * result/XInclude/tstencoding.xml test/XInclude/docs/tstencoding.xml test/XInclude/ents/isolatin.txt : added a specific regression test * python/generator.py python/libxml2class.txt: fixed the generator the new set of comments generated for doc/libxml2-api.xml were breaking the python generation. Tue Nov 19 23:25:47 CET 2002 Daniel Veillard * doc/Makefile.am: repair some problem if gtk-doc fail or such * configure.in: patch for Solaris on new autoconf closes #98880 * doc/parsedecl.py: repair the frigging API building script, did I say that python xmllib sucks ? * doc/libxml2-api.xml doc/libxml2-refs.xml: regenerated, reordering and some comment are no more truncated. Tue Nov 19 09:09:04 CET 2002 Daniel Veillard * parser.c: Martin Stoilov pointed out a potential leak in xmlCreateMemoryParserCtxt Mon Nov 18 16:05:51 CET 2002 Daniel Veillard * HTMLparser.c: fixed bug #98879 a corner case when 0 is included in HTML documents and using the push parser. Mon Nov 18 00:11:24 CET 2002 ERDI Gergo * configure.in (PYTHON_SITE_PACKAGES): If --with-python is specified, look for the Python interpreter not just in the specified root but also in the specified location. Fixes #98825 Sun Nov 17 23:36:06 CET 2002 Daniel Veillard * python/libxml.c: fixing bug #98792 , node may have no doc and dereferencing without checking ain't good ... Sun Nov 17 10:25:43 CET 2002 Daniel Veillard * configure.in: preparing release 2.4.27 * doc/* : updated and rebuilt the docs * doc/Makefile.am libxml.spec.in: try to make sure the tutorial and all the docs are actually packaged and in the final RPMs * parser.c parserInternals.c include/libxml/parser.h: restore xmllint --recover feature. Sat Nov 16 16:30:25 CET 2002 Daniel Veillard * parser.c xpath.c: fixing #96925 wich was also dependent on the processing of parsed entities, and XPath computation on sustitued entities. * testXPath.c: make sure entities are substitued. Fri Nov 15 16:22:54 CET 2002 Daniel Veillard * parser.c: fixed #96594, which was totally dependent on the processing of internal parsed entities, which had to be changed. Fri Nov 15 12:16:07 CET 2002 Daniel Veillard * Makefile.am python/Makefile.am python/tests/Makefile.am: trying to fix bug #98517 about building outside the source tree * doc/xml.html doc/FAQ.html: fixed the link to libiconv #94585 Thu Nov 14 18:41:55 CEST 2002 Igor Zlatkovic * include/win32config.h: cleanup * win32/Makefile.mingw: integrated mingw in JScript configure * win32/Makefile.msvc: modified to allow mingw coexistence * win32/configure.js: integrated mingw * win32/Readme.txt: cleanup Tue Nov 12 22:06:45 CET 2002 Daniel Veillard * HTMLparser.c: strengthen the guard in the Pop macros, like in the XML parser, closes bug #97315 Tue Nov 12 21:56:39 CET 2002 Daniel Veillard * include/libxml/parser.h: fixed bug #98338 , fatalError SAX callback is never used. Tue Nov 12 13:32:50 CET 2002 Daniel Veillard * parserInternals.c: fixed the initialization of the SAX structure which was breaking xsltproc * xpath.c: patch from Petr Pajas for CDATA nodes * tree.c: patch from Petr Pajas improving xmlGetNodePath() * parser.c include/libxml/parser.h: patch from Peter Jones removing a leak in xmlSAXParseMemory() and adding the function xmlSAXParseMemoryWithData() Mon Nov 11 20:47:03 MST 2002 John Fleck adding pdf of tutorial, changing web page to link to it * doc/tutorial/xmltutorial.pdf * doc/xml.html * doc/docs.html Sun Nov 10 20:48:57 MST 2002 John Fleck * doc/tutorial/ar01s08.html adding file what I forgot for tutorial Sun Nov 10 20:33:13 MST 2002 John Fleck Adding encoding discussion to tutorial Added: * doc/tutorial/images/*.png: DocBook admonition image files * doc/tutorial/apf.html, apg.html: new generated html * doc/tutorial/includeconvert.c: conversion code entity file changed: * doc/tutorial/xmltutorial.xml: DocBook original * doc/tutorial/*.html: generated html Fri Nov 8 17:59:32 CEST 2002 Igor Zlatkovic * include/libxml/*.h: retired xmlwin32version.h * doc/Makefile.am: retired xmlwin32version.h * win32/configure.js: retired xmlwin32version.h Fri Nov 8 16:55:47 CEST 2002 Igor Zlatkovic * win32/libxml2.def.src: exported additional symbols * include/libxml/xmlmemory.h: exported the rest of the xmlMem* sisterhood Fri Nov 8 16:08:13 CET 2002 Daniel Veillard * globals.c: fixed a typo pointed out by Igor * xpath.c: try to speed up node compare using line numbers if available. Thu Nov 7 15:16:02 CET 2002 Daniel Veillard * tree.c: make xmlFreeNode() handle attributes correctly. Wed Nov 6 23:51:11 CET 2002 Igor Zlatkovic * catalog.c: completed the #96963 fix, as reported by Karl Eichwalder Wed Nov 6 16:48:44 CET 2002 Daniel Veillard * xpointer.c: tried to fix bug #97852 reported by Nicolas Noffke Sun Nov 3 10:43:44 CET 2002 Daniel Veillard * Makefile.am: switched the order of a couple of includes to fix bugs #97100 Thu Oct 31 17:11:46 CEST 2002 Igor Zlatkovic * catalog.c: fixed bug #96963, reverted to the old behaviour of xmlLoadCatalogs that used to separate directories with a ':'. Thu Oct 31 16:55:21 CEST 2002 Igor Zlatkovic * threads.c: improvements to the Windows-side of thread handling * testThreads.c: conditionally excluded unistd.h * testThradsWin32.c: broke overlong lines * include/win32config.h: adapted thread-related macros to the new scheme and for pthreads on Windows * win32/Makefile.msvc: introduced a more flexible thread build, added testThreads[Win32].c to the build * win32/configure.js: introduced a more flexible thread config 2002-10-31 John Fleck * doc/xml.html (and, by implication, FAQ.html) added UTF-8 conversaion FAQ from Marcus Labib Iskander Tue Oct 29 18:32:33 CET 2002 Igor Zlatkovic * configure.in: removed xmlwin32version.h * include/libxml/Makefile.am: removed xmlwin32version.h Mon Oct 28 14:01:29 CET 2002 Daniel Veillard * tree.c: applied patch from Brian Stafford to fix a bug in xmlReconciliateNs() Mon Oct 28 13:51:55 CET 2002 Daniel Veillard * tree.c: applied patch from Christian Glahn to allow xmlNewChild() on document fragment nodes Sat Oct 26 15:27:00 CEST 2002 Daniel Veillard * parser.c: Christian Glahn found a problem with a recent patch to xmlParseBalancedChunkMemoryRecover() * xmlschemas.c: Charles Bozeman fixed some Schemas validation problems * result/schemas/elem* result/schemas/seq* test/schemas.elem* test/schemas/seq*: added the test cases from Charles Wed Oct 23 16:42:29 CEST 2002 Daniel Veillard * Makefile.am config.h.in libxml.spec.in doc/Makefile.am: serious cleanup of the spec file and associated changes in the Makefiles. * valid.c: try to remove some warnings on x86_64 Wed Oct 23 10:53:42 CEST 2002 Daniel Veillard * include/Makefile.am: added winsockcompat.h to EXTRA_DIST to fix bug #96586 Tue Oct 22 21:13:06 CEST 2002 Daniel Veillard * HTMLparser.c: Mikhail Sogrine pointed out a bug in HTML parsing, applied his patch * result/HTML/attrents.html result/HTML/attrents.html.err result/HTML/attrents.html.sax test/HTML/attrents.html: added the test and result case provided by Mikhail Sogrine Tue Oct 22 19:33:20 CEST 2002 Daniel Veillard * vms/build_libxml.com vms/config.vms vms/readme.vms include/libxml/parser.h include/libxml/parserInternals.h include/libxml/tree.h include/libxml/xmlIO.h HTMLparser.c catalog.c debugXML.c parser.c parserInternals.c tree.c triodef.h trionan.c uri.c xmlIO.c xpath.c: Applied the VMS update patch from Craig A. Berry * doc/*.html: update Tue Oct 22 16:27:31 CEST 2002 Daniel Veillard * include/libxml/encoding.h encoding.c: made xmlGetUTF8Char public Tue Oct 22 16:25:18 CEST 2002 Daniel Veillard * debugXML.c: adding a grep command to --shell in xmllint for T.V. Raman Tue Oct 22 16:23:57 CEST 2002 Daniel Veillard * xmlcatalog.c: tried to fix some of the problem with --sgml Mon Oct 21 09:57:10 CEST 2002 Daniel Veillard * parser.c: tried to fix bug #91500 where doc->children may be overriden by a call to xmlParseBalancedChunkMemory() Mon Oct 21 09:04:32 CEST 2002 Daniel Veillard * catalog.c: tried to fix bug #90945 w.r.t. parsing of system identifiers in SGML catalogs containing '&' Sun Oct 20 23:31:47 CEST 2002 Daniel Veillard * python/types.c: fixed bugs when passing result value tree to Python functions. Fri Oct 18 13:18:53 CEST 2002 Daniel Veillard * configure.in: preparing the release of 2.4.26 * doc/*: updated and rebuilt the documentation Wed Oct 16 20:01:46 CEST 2002 Daniel Veillard * parser.c: fixed a XML Namespace compliance bug reported by Alexander Grimalovsky Wed Oct 16 17:18:42 CEST 2002 Daniel Veillard * HTMLtree.c: fixed serialization of script and style when they are not lowercase (i.e. added using the API to the tree). Wed Oct 16 16:31:05 CEST 2002 Daniel Veillard * valid.c: make xmlValidateDocument emit a warning msg if there is no DTD, pointed by Christian Glahn Wed Oct 16 16:05:38 CEST 2002 Daniel Veillard * xmlregexp.c xmlschemas.c: fixed the validation of sequences content model when some of the blocks have min or max, and a couple of bugs found in the process. * result/schemas/list0* test/schemas/list0*: added some specific regression tests Tue Oct 15 12:41:01 CEST 2002 Daniel Veillard * README: updated the contact informations Tue Oct 15 10:35:57 CEST 2002 Daniel Veillard * Makefile.am: use test -f instead of test -e since Solaris /bin/sh misses it, reported by Peter Bray. Mon Oct 14 17:37:32 CEST 2002 Daniel Veillard * tree.c: investigating xmlNodeGetContent() on namespace nodes and removed a few warnings Mon Oct 14 13:12:55 CEST 2002 Daniel Veillard * parser.c: Christian Glahn found a small bug in the push parser. * xmlIO.c include/libxml/xmlIO.h: cleaned up and made xmlCheckFilename public Wed Oct 9 23:11:02 CEST 2002 Daniel Veillard * xmlschemas.c include/libxml/xmlschemas.h: added xmlSchemaNewMemParserCtxt to parse a schemas from a memory area * testSchemas.c: added --memory to test the new interface Wed Oct 9 16:22:54 CEST 2002 Daniel Veillard * doc/index.py doc/search.php: integrated the XSLT indexing, a few fixed in the indexer, added a scope selection at the search level. Wed Oct 9 12:18:37 CEST 2002 Daniel Veillard * valid.c: Joe Marcus Clarke reported a segfault on FBsd this was due to uninitialized parts of the validation context Tue Oct 8 23:24:20 CEST 2002 Daniel Veillard * debugXML.c: applied patch from Mark Vakoc except the API change, preserved it. * doc/*: updated the docs to point to the search engine for information lookup or before bug/help reports. Tue Oct 8 18:53:31 CEST 2002 Daniel Veillard * doc/index.py doc/search.php: added mailing-list archives indexing and lookup Tue Oct 8 10:25:07 CEST 2002 Daniel Veillard * tree.c: patch from Mark Vakoc to fix xmlNodeGetPath() Mon Oct 7 13:12:03 CEST 2002 Daniel Veillard * doc/index.py: improved HTML indexing * doc/search.php: make the queries also lookup the HTML based indexes Sun Oct 6 23:50:29 CEST 2002 Daniel Veillard * doc/index.py: added HTML page indexing Fri Oct 4 15:33:55 CEST 2002 Igor Zlatkovic * xmlIO.c: extended Windows path normalisation to fix the base problem in libxslt. * catalog.c: fixed list handling in XML_CATALOG_FILES Fri Oct 4 13:43:02 CEST 2002 Daniel Veillard * valid.c: typo/bug found by Christian Glahn Sun Sep 29 19:44:10 CEST 2002 Igor Zlatkovic * xmlIO.c: applied Windows CE patch from Javier. * win32/wince: new directory, contains support for the PocketPC with Windows CE from Javier. * include/win32config.h: reorganised, removed duplicate definitions and applied WinCE patch from Javier. * include/wsockcompat.h: new file, now contains WinSock compatibility macros. * win32/Makefile.msvc: introduced double-run compilation. Thu Sep 26 19:48:06 CEST 2002 Daniel Veillard * configure.in include/libxml/xmlwin32version.h: preparing release of 2.4.25 * doc/*: updated and regenerated teh docs and web pages. Thu Sep 26 17:33:46 CEST 2002 Daniel Veillard * SAX.c valid.c include/libxml/valid.h: fixed bug #92518 validation error were not covering namespace declarations. * result/valid/dia.xml test/valid/dia.xml: the test wasn't valid, it was missing the attribute declaration for the namespace * result/VC/NS3: the fix now report breakages in that test Thu Sep 26 14:39:07 CEST 2002 Daniel Veillard * HTMLtree.c: fixing bug #94241 on HTML boolean attributes Thu Sep 26 14:25:33 CEST 2002 Daniel Veillard * doc/*: added the 3 new modules xmlregexp xmlautomata and xmlunicode and regenerated the docs and web site Thu Sep 26 11:45:42 CEST 2002 Daniel Veillard * xinclude.c xmlschemas.c xmlschemastypes.c xpath.c: make sure ATTRIBUTE_UNUSED is always put after the attribute declaration, not before Thu Sep 26 11:33:28 CEST 2002 Daniel Veillard * python/generator.py python/libxml2class.txt: fixed a stupid error breaking the python API Thu Sep 26 00:31:46 CEST 2002 Daniel Veillard * trio.c trio.h triodef.h trionan.c trionan.h triop.h triostr.c triostr.h: applied a trio update patch from Bjorn Reese which should work with MinGW Thu Sep 26 00:21:18 CEST 2002 Daniel Veillard * tree.c: improving some documentation comments * xmlregexp.c: found and fixed a mem leak with python regression tests * doc/*: rebuilt the doc and the API XML file including the xmlregexp.h xmlautomata.h and xmlunicode.h headers * python/generator.py python/libxml2class.txt python/libxml_wrap.h python/types.c: added access to the XML Schemas regexps from python * python/tests/Makefile.am python/tests/regexp.py: added a simple regexp bindings test Tue Sep 24 08:10:48 MDT 2002 John Fleck * doc/xml.html: fixing ftp links - thanks to Vitaly Ostanin Tue Sep 24 16:08:17 CEST 2002 Daniel Veillard * xmlregexp.c: fixed the data callback on transition functionality which was broken when using the compact form * result/schemas/*: updated the results, less verbose, all tests pass like before * DOCBparser.c testAutomata.c testC14N.c testSchemas.c testThreads.c testXPath.c valid.c xinclude.c xmllint.c xmlregexp.c xmlschemas.c xmlschemastypes.c xpath.c python/libxml.c: removed a bunch of annoying warnings * xpath.c: try to provide better error report when possible Sat Sep 21 14:56:37 CEST 2002 Daniel Veillard * Makefile.am: fixed a breakage raised by Jacob Fri Sep 20 20:08:18 CEST 2002 Igor Zlatkovic * include/win32config.h: added HAVE_ERRNO_H definition for parts which don't use sockets Fri Sep 20 18:40:50 CEST 2002 Igor Zlatkovic * win32/Makefile.msvc: applied zlib patch from Daniel Gehriger * win32/configure.js: applied zlib patch from Daniel Gehriger Fri Sep 20 15:40:14 CEST 2002 Igor Zlatkovic * win32/configure.js: applied the patch from Mark Vakoc for regexp support * win32/libxml2.def.src: applied the patch from Mark Vakoc for regexp support Fri Sep 20 15:35:33 CEST 2002 Daniel Veillard * xmlschemastypes.c: as pointed by Igor Float and Double parsing ain't finished yet Fri Sep 20 14:00:16 CEST 2002 Daniel Veillard * Makefile.am configure.in: trying to fix #88412 by bypassing all the python subdir if python ain't detected Thu Sep 19 21:46:53 CEST 2002 Daniel Veillard * Makefile.am configure.in include/libxml/xmlversion.h.in: made configuring with regexps/automata/unicode the default but without schemas ATM * testRegexp.c valid.c xmlregexp.c include/libxml/xmlregexp.h: fixed the regexp based DTD validation performance and memory problem by switching to a compact form for determinist regexps and detecting the determinism property in the process. Seems as fast as the old DTD validation specific engine :-) despite the regexp built and compaction process. Wed Sep 18 18:27:26 CEST 2002 Daniel Veillard * valid.c: determinism is debugged, new DTD checking code now works but xmlFAComputesDeterminism takes far too much CPU and the whole set usues too much memory to be really usable as-is Wed Sep 18 00:54:30 CEST 2002 Daniel Veillard * tree.c: fixed another stupid bug in xmlGetNodePath() * xmllint.c: --version now report the options compiled in Tue Sep 17 23:48:07 CEST 2002 Daniel Veillard * HTMLparser.c: small cleanup * valid.c xmlregexp.c: switched DTD validation to use only regexp when configured with them. A bit of debugging around the determinism checks is still needed Tue Sep 17 21:22:25 CEST 2002 Daniel Veillard * python/libxml_wrap.h: stupid bug found by mattam@netcourrier.com Tue Sep 17 19:58:26 CEST 2002 Daniel Veillard * xmlIO.c: small portability glitch fixed. Mon Sep 17 12:38:08 CEST 2002 Daniel Veillard * xmlschemastypes.c: incomplete steps for real/double support * testAutomata.c include/libxml/xmlautomata.h include/libxml/xmlregexp.h: avoiding a compilation problem * valid.c include/libxml/valid.h: starting the work toward using the regexps for actual DTD validation Fri Sep 13 16:46:14 CEST 2002 Daniel Veillard * hash.c: cosmetic cleanup * valid.c include/libxml/tree.h include/libxml/valid.h: started integrating a DTD validation layer based on the regexps Thu Sep 12 18:01:29 CEST 2002 Daniel Veillard * xmlregexp.c xmlschemas.c: fixed a bug reported by Jeff Goff, the determinism was tested before eliminating the epsilon transitions :-( Thu Sep 12 16:57:45 CEST 2002 Daniel Veillard * python/generator.py python/libxml.c python/libxml.py python/libxml2-python-api.xml python/libxml2class.txt python/libxml_wrap.h python/types.c: updated the python bindings, added code for easier File I/O, and the ability to define a resolver from Python fixing bug #91635 * python/tests/Makefile.am python/tests/inbuf.py python/tests/outbuf.py python/tests/pushSAXhtml.py python/tests/resolver.py python/tests/serialize.py: updated and augmented the set of Python tests. Tue Sep 10 21:05:28 CEST 2002 Igor Zlatkovic * win32/configure.js: added more readme info for the binary package. Tue Sep 10 14:15:18 CEST 2002 Daniel Veillard * xmlIO.c: fixed a stupid out of bound array error Tue Sep 10 13:09:14 CEST 2002 Daniel Veillard * include/libxml/xmlIO.h xmlIO.c parser.c HTMLparser.c DOCBparser.c: messing around with support for Windows path, cleanups, trying to identify and fix the various code path to the filename access. Added xmlNormalizeWindowsPath() Thu Sep 5 16:19:18 CEST 2002 Daniel Veillard * error.c valid.c: working on better error reporting of validity errors, especially providing an accurate context. * result/valid/xlink.xml.err result/valid/rss.xml.err: better error reports in those cases. Thu Sep 5 13:29:47 CEST 2002 Daniel Veillard * DOCBparser.c HTMLparser.c c14n.c entities.c list.c parser.c parserInternals.c xmlIO.c: get rid of all the perror() calls made in the library execution paths. This should fix both #92059 and #92385 Thu Sep 5 13:13:17 CEST 2002 Daniel Veillard * xmllint.c: memory leak reporting was broken after a change of the preprocessor symbol used to activate it. Thu Sep 5 13:10:57 CEST 2002 Daniel Veillard * tree.c: try to make the copy function work for node of type XML_DOCUMENT_FRAG_NODE, they are only created by the DOM layers though, not libxml2 itself. Thu Sep 5 12:57:38 CEST 2002 Daniel Veillard * valid.c: try to provide file and line informations, not all messages are covered, but it's a (good) start Thu Sep 5 12:49:35 CEST 2002 Daniel Veillard * xinclude.c: reimplemented a large part of the XInclude processor, trying to minimize resources used, James Henstridge provided a huge test case which was exhibiting severe memory consumption problems. Thu Sep 5 10:07:13 CEST 2002 Daniel Veillard * python/Makefile.am: applied patch from Christophe Merlet to reestablish DESTDIR Wed Sep 4 14:13:34 CEST 2002 Daniel Veillard * libxml.spec.in: fixes libary path for x86_64 AMD Tue Sep 3 21:14:19 MDT 2002 John Fleck * doc/tutorial/includekeyword.c * doc/tutorial/xmltutorial.xml: (plus resulting generated html files) fixing one spot I missed in the tutorial where I hadn't freed memory properly Sat Aug 31 19:31:17 MDT 2002 John Fleck * doc/tutorial/includeaddattribute.c * doc/tutorial/includeaddkeyword.c * doc/tutorial/includegetattribute.c * doc/tutorial/includekeyword.c * doc/tutorial/xmltutorial.xml * doc/tutorial/*.html: update tutorial to properly free memory (thanks to Christopher R. Harris for pointing out that this needs to be done) * doc/tutorial/images/callouts/*.png: added image files so the callouts are graphical, making it easier to read ( use "--param callout.graphics 1" to generate html with graphical callouts) Wed Aug 28 13:44:54 CEST 2002 Daniel Veillard * doc/Libxml2-Logo-180x168.gif doc/Libxml2-Logo-90x34.gif: nice logos generated by Marc Liyanage * doc/site.xsl *.html: changed the stylesheet to show the new logo and regenerated the pages Sun Aug 25 16:38:05 CEST 2002 Daniel Veillard * xmlIO.c: handle Windows sepecific file://localhost/ semantic ... Thu Aug 22 22:03:19 CEST 2002 Daniel Veillard * xpath.c: possible mem leak patch from Jason Adams Thu Aug 22 17:27:30 CEST 2002 Daniel Veillard * xpath.c: integrated xf:escape-uri() from Wesley Terpstra in the XQuery namespace * configure.in: preparing 2.4.24 * doc/*.html: updated the web pages Thu Aug 22 16:19:42 CEST 2002 Daniel Veillard * python/generator.py: closing bug #85258 by generating conditional compile check to avoid linking to routines not configured in. 2002-08-22 Havoc Pennington * autogen.sh: update error message for missing automake Thu Aug 22 11:45:50 CEST 2002 Daniel Veillard * python/Makefile.am: typo in target name resulted in libxml2.py to not be rebuilt. fixed DESTDIR similary to the libxslt one. Thu Aug 22 09:15:00 CEST 2002 Daniel Veillard * win32/win32/Makefile.mingw: updated with version from Elizabeth Barham at http://soggytrousers.net/repository/ Tue Aug 20 16:40:48 CEST 2002 Igor Zlatkovic * win32/Makefile.msvc: added the prefix location to the include and lib search path. 2002-08-18 Havoc Pennington * autogen.sh: hardcode aclocal-1.4/automake-1.4 so that users with both automake 1.6 and 1.4 installed get the right automake. Means compilation from CVS will now require the latest automake 1.4 release, or manually creating symlinks called "automake-1.4" and "aclocal-1.4" Wed Aug 14 18:54:19 CEST 2002 Daniel Veillard * configure.in python/Makefile.am: more AMD 64 induced changes from Frederic Crozat Wed Aug 14 16:43:53 CEST 2002 Daniel Veillard * xinclude.c: oops I was missing the xml:base fixup too * result/XInclude/*.xml: this adds xml:base attributes to most results of the tests Wed Aug 14 16:05:37 CEST 2002 Daniel Veillard * xinclude.c: quick but apparently working implementation of xi:fallback, should close bug #89684 * Makefile.am test/XInclude/docs/fallback.xml result/XInclude/fallback.xml: added a basic test for fallback, and run with --nowarning to avoid a spurious warning * configure.in: applied patch from Frederic Crozat for python bindings on AMD 64bits machines. Wed Aug 14 10:47:46 CEST 2002 Daniel Veillard * parser.c: xmlSAXUserParseMemory() really ought to fail if the caller don't pass a SAX callback block. Wed Aug 14 10:29:02 CEST 2002 Daniel Veillard * tree.c: applied the same fix for the XML-1.0 namespace to xmlSearchNsByHref() as was done for xmlSearchNs() Mon Aug 12 16:52:08 CEST 2002 Daniel Veillard * libxml.3: small cleanup of the man page * HTMLtree.c: fixed a potential problem raised by Petr Vandrovec when serializing HREF attributes generated by XSLT. Mon Aug 12 15:24:05 CEST 2002 Daniel Veillard * HTMLtree.c include/libxml/HTMLtree.h: integrated a cleaned up version of Marc Liyanage' patch for boolean attributes in HTML output Mon Aug 12 14:11:59 CEST 2002 Daniel Veillard * python/tests/serialize.py: fixed the test results, indenting behaviour changed slightly Thu Aug 8 11:00:26 2002 Aleksey Sanin * win32/dsp/libxml2.def.src win32/libxml2.def.src: added new c14n function to Windows def files Fri Aug 2 16:46:46 2002 Aleksey Sanin * c14n.c: fixed a memory leak in c14n code Sat Aug 3 00:15:06 CEST 2002 Daniel Veillard * parser.c include/libxml/parser.h: adding a new API for Christian Glahn: xmlParseBalancedChunkMemoryRecover * valid.c: patch from Rick Jones for some grammar cleanup in validation messages * result/VC/* result/valid/*: this slightly change some of the regression tests outputs Thu Aug 1 14:50:28 CEST 2002 Daniel Veillard * tree.c: trying to fix a problem in namespaced attribute handling raised by Christian Glahn Thu Aug 1 12:17:30 CEST 2002 Daniel Veillard * encoding.c include/libxml/encoding.h: Opening the interface xmlNewCharEncodingHandler as requested in #89415 * python/generator.py python/setup.py.in: applied cleanup patches from Marc-Andre Lemburg * tree.c: fixing bug #89332 on a specific case of loosing the XML-1.0 namespace on xml:xxx attributes Wed Jul 31 23:27:42 2002 Aleksey Sanin * c14n.c include/libxml/c14n.h: fixed one more c14n + namespaces corner case from new Merlin's test suite and added a callback that will be used to improve xmlsec performance Mon Jul 29 18:22:00 CEST 2002 Daniel Veillard * HTMLtree.c: trying to fix the